aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNikhil Devshatwar2014-03-10 06:32:27 -0500
committerArthur Philpott2014-03-11 18:25:08 -0500
commit008642ffb67665d62afa76993e87fb859224aacb (patch)
treed786871826dcb5f0f25700188a23d01b2a07f231
parent19eece649533a1b4de52ca6aebb087dc6c847444 (diff)
downloadkernel-video-008642ffb67665d62afa76993e87fb859224aacb.tar.gz
kernel-video-008642ffb67665d62afa76993e87fb859224aacb.tar.xz
kernel-video-008642ffb67665d62afa76993e87fb859224aacb.zip
v4l: ti-vps: vip: Add support for RGB capture
Add ARGB capture format (32 bits including alpha) Corrected channel number to be used for RGB capture Allow setting RGB_LO mux select from the slice Currently, CSC is not enabled, so input and output formats are same For now, RGB capture is only passthrough mode. Change-Id: Ic8b2256607b0df21b7e34e58634b1de367d1d74a Signed-off-by: Nikhil Devshatwar <nikhil.nd@ti.com>
-rw-r--r--drivers/media/platform/ti-vps/vip.c59
-rw-r--r--drivers/media/platform/ti-vps/vpdma_priv.h1
2 files changed, 59 insertions, 1 deletions
diff --git a/drivers/media/platform/ti-vps/vip.c b/drivers/media/platform/ti-vps/vip.c
index 1af428ae86d..76eb997674a 100644
--- a/drivers/media/platform/ti-vps/vip.c
+++ b/drivers/media/platform/ti-vps/vip.c
@@ -98,7 +98,7 @@ static struct vip_srce_info srce_info[5] = {
98 .vb_part = VIP_CHROMA, 98 .vb_part = VIP_CHROMA,
99 }, 99 },
100 [VIP_SRCE_RGB] = { 100 [VIP_SRCE_RGB] = {
101 .base_channel = VIP1_CHAN_NUM_PORT_A_RGB, 101 .base_channel = VIP1_CHAN_NUM_PORT_B_RGB,
102 .vb_part = VIP_LUMA, 102 .vb_part = VIP_LUMA,
103 }, 103 },
104}; 104};
@@ -171,6 +171,14 @@ static struct vip_fmt vip_formats[] = {
171 .vpdma_fmt = { &vpdma_rgb_fmts[VPDMA_DATA_FMT_RGB24], 171 .vpdma_fmt = { &vpdma_rgb_fmts[VPDMA_DATA_FMT_RGB24],
172 }, 172 },
173 }, 173 },
174 {
175 .name = "ARGB888 packed",
176 .fourcc = V4L2_PIX_FMT_RGB32,
177 .colorspace = V4L2_COLORSPACE_SRGB,
178 .coplanar = 0,
179 .vpdma_fmt = { &vpdma_rgb_fmts[VPDMA_DATA_FMT_ARGB32],
180 },
181 },
174}; 182};
175 183
176/* 184/*
@@ -337,6 +345,33 @@ static void vip_top_vpdma_reset(struct vip_shared *shared)
337 write_sreg(shared, VIP_CLK_RESET, val); 345 write_sreg(shared, VIP_CLK_RESET, val);
338} 346}
339 347
348static void vip_xtra_set_repack_sel(struct vip_port *port, int repack_mode)
349{
350 u32 val;
351
352 if (port->port_id == 0 && port->dev->slice_id == VIP_SLICE1) {
353 val = read_vreg(port->dev, VIP1_PARSER_REG_OFFSET + VIP_PARSER_PORTA_1);
354 insert_field(&val, repack_mode, VIP_REPACK_SEL_MASK, VIP_REPACK_SEL_SHFT);
355
356 write_vreg(port->dev, VIP1_PARSER_REG_OFFSET + VIP_PARSER_PORTA_1, val);
357 } else if (port->port_id == 0 && port->dev->slice_id == VIP_SLICE2) {
358 val = read_vreg(port->dev, VIP2_PARSER_REG_OFFSET + VIP_PARSER_PORTA_1);
359 insert_field(&val, repack_mode, VIP_REPACK_SEL_MASK, VIP_REPACK_SEL_SHFT);
360
361 write_vreg(port->dev, VIP2_PARSER_REG_OFFSET + VIP_PARSER_PORTA_1, val);
362 } else if (port->port_id == 1 && port->dev->slice_id == VIP_SLICE1) {
363 val = read_vreg(port->dev, VIP1_PARSER_REG_OFFSET + VIP_PARSER_PORTB_1);
364 insert_field(&val, repack_mode, VIP_REPACK_SEL_MASK, VIP_REPACK_SEL_SHFT);
365
366 write_vreg(port->dev, VIP1_PARSER_REG_OFFSET + VIP_PARSER_PORTB_1, val);
367 } else if (port->port_id == 1 && port->dev->slice_id == VIP_SLICE2) {
368 val = read_vreg(port->dev, VIP2_PARSER_REG_OFFSET + VIP_PARSER_PORTB_1);
369 insert_field(&val, repack_mode, VIP_REPACK_SEL_MASK, VIP_REPACK_SEL_SHFT);
370
371 write_vreg(port->dev, VIP2_PARSER_REG_OFFSET + VIP_PARSER_PORTB_1, val);
372 }
373}
374
340static void vip_set_discrete_basic_mode(struct vip_port *port) 375static void vip_set_discrete_basic_mode(struct vip_port *port)
341{ 376{
342 u32 val; 377 u32 val;
@@ -678,6 +713,19 @@ static void vip_set_slice_path(struct vip_dev *dev, enum data_path_select data_p
678 write_vreg(dev, VIP_VIP2_DATA_PATH_SELECT, val); 713 write_vreg(dev, VIP_VIP2_DATA_PATH_SELECT, val);
679 } 714 }
680 break; 715 break;
716 case VIP_RGB_OUT_LO_DATA_SELECT:
717 if (dev->slice_id == VIP_SLICE1) {
718 val |= VIP_RGB_OUT_LO_SRC_SELECT;
719 insert_field(&val, data_path, VIP_DATAPATH_SELECT_MASK, VIP_DATAPATH_SELECT_SHFT);
720
721 write_vreg(dev, VIP_VIP1_DATA_PATH_SELECT, val);
722 } else if (dev->slice_id == VIP_SLICE2) {
723 val |= VIP_RGB_OUT_LO_SRC_SELECT;
724 insert_field(&val, data_path, VIP_DATAPATH_SELECT_MASK, VIP_DATAPATH_SELECT_SHFT);
725
726 write_vreg(dev, VIP_VIP2_DATA_PATH_SELECT, val);
727 }
728 break;
681 default: 729 default:
682 BUG(); 730 BUG();
683 } 731 }
@@ -1110,8 +1158,17 @@ static int vip_try_fmt_vid_cap(struct file *file, void *priv,
1110 */ 1158 */
1111static void set_fmt_params(struct vip_stream *stream) 1159static void set_fmt_params(struct vip_stream *stream)
1112{ 1160{
1161 struct vip_dev *dev = stream->port->dev;
1162
1113 stream->sequence = 0; 1163 stream->sequence = 0;
1114 stream->field = V4L2_FIELD_TOP; 1164 stream->field = V4L2_FIELD_TOP;
1165
1166 if (stream->port->fmt->colorspace == V4L2_COLORSPACE_SRGB) {
1167 vip_set_slice_path(dev, VIP_RGB_OUT_LO_DATA_SELECT);
1168 /* Set alpha component in background color */
1169 vpdma_set_bg_color(dev->shared->vpdma,
1170 stream->port->fmt->vpdma_fmt[0], 0xff);
1171 }
1115} 1172}
1116 1173
1117static int vip_s_fmt_vid_cap(struct file *file, void *priv, 1174static int vip_s_fmt_vid_cap(struct file *file, void *priv,
diff --git a/drivers/media/platform/ti-vps/vpdma_priv.h b/drivers/media/platform/ti-vps/vpdma_priv.h
index 49c304ad92f..b3595795c3e 100644
--- a/drivers/media/platform/ti-vps/vpdma_priv.h
+++ b/drivers/media/platform/ti-vps/vpdma_priv.h
@@ -128,6 +128,7 @@
128#define VIP1_CHAN_NUM_PORT_B_LUMA 104 128#define VIP1_CHAN_NUM_PORT_B_LUMA 104
129#define VIP1_CHAN_NUM_PORT_B_CHROMA 105 129#define VIP1_CHAN_NUM_PORT_B_CHROMA 105
130#define VIP1_CHAN_NUM_PORT_A_RGB 106 130#define VIP1_CHAN_NUM_PORT_A_RGB 106
131#define VIP1_CHAN_NUM_PORT_B_RGB 107
131 132
132/* 133/*
133 * a VPDMA address data block payload for a configuration descriptor needs to 134 * a VPDMA address data block payload for a configuration descriptor needs to