aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/platform/marvell-ccic
diff options
context:
space:
mode:
authorLibin Yang <lbyang@marvell.com>2013-07-03 00:56:03 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2013-07-26 12:26:13 -0400
commit0a0b3fb42f78eded6a8d1249c545224242d8999e (patch)
tree0a52ba176a5c94af1257b530b5e967c5cd7aa3d8 /drivers/media/platform/marvell-ccic
parentad6ac452227b7cb93ac79beec092850d178740b1 (diff)
[media] marvell-ccic: add SOF / EOF pair check for marvell-ccic driver
This patch adds the SOFx/EOFx pair check for marvell-ccic. When switching format, the last EOF may not arrive when stop streamning. And the EOF will be detected in the next start streaming. Must ensure clear the left over frame flags before every really start streaming. Signed-off-by: Albert Wang <twang13@marvell.com> Signed-off-by: Libin Yang <lbyang@marvell.com> Acked-by: Jonathan Corbet <corbet@lwn.net> Acked-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media/platform/marvell-ccic')
-rw-r--r--drivers/media/platform/marvell-ccic/mcam-core.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/drivers/media/platform/marvell-ccic/mcam-core.c b/drivers/media/platform/marvell-ccic/mcam-core.c
index e2ad68afbf8a..5184887b155c 100644
--- a/drivers/media/platform/marvell-ccic/mcam-core.c
+++ b/drivers/media/platform/marvell-ccic/mcam-core.c
@@ -94,6 +94,9 @@ MODULE_PARM_DESC(buffer_mode,
94#define CF_CONFIG_NEEDED 4 /* Must configure hardware */ 94#define CF_CONFIG_NEEDED 4 /* Must configure hardware */
95#define CF_SINGLE_BUFFER 5 /* Running with a single buffer */ 95#define CF_SINGLE_BUFFER 5 /* Running with a single buffer */
96#define CF_SG_RESTART 6 /* SG restart needed */ 96#define CF_SG_RESTART 6 /* SG restart needed */
97#define CF_FRAME_SOF0 7 /* Frame 0 started */
98#define CF_FRAME_SOF1 8
99#define CF_FRAME_SOF2 9
97 100
98#define sensor_call(cam, o, f, args...) \ 101#define sensor_call(cam, o, f, args...) \
99 v4l2_subdev_call(cam->sensor, o, f, ##args) 102 v4l2_subdev_call(cam->sensor, o, f, ##args)
@@ -260,8 +263,10 @@ static void mcam_reset_buffers(struct mcam_camera *cam)
260 int i; 263 int i;
261 264
262 cam->next_buf = -1; 265 cam->next_buf = -1;
263 for (i = 0; i < cam->nbufs; i++) 266 for (i = 0; i < cam->nbufs; i++) {
264 clear_bit(i, &cam->flags); 267 clear_bit(i, &cam->flags);
268 clear_bit(CF_FRAME_SOF0 + i, &cam->flags);
269 }
265} 270}
266 271
267static inline int mcam_needs_config(struct mcam_camera *cam) 272static inline int mcam_needs_config(struct mcam_camera *cam)
@@ -1122,6 +1127,7 @@ static void mcam_vb_wait_finish(struct vb2_queue *vq)
1122static int mcam_vb_start_streaming(struct vb2_queue *vq, unsigned int count) 1127static int mcam_vb_start_streaming(struct vb2_queue *vq, unsigned int count)
1123{ 1128{
1124 struct mcam_camera *cam = vb2_get_drv_priv(vq); 1129 struct mcam_camera *cam = vb2_get_drv_priv(vq);
1130 unsigned int frame;
1125 1131
1126 if (cam->state != S_IDLE) { 1132 if (cam->state != S_IDLE) {
1127 INIT_LIST_HEAD(&cam->buffers); 1133 INIT_LIST_HEAD(&cam->buffers);
@@ -1139,6 +1145,14 @@ static int mcam_vb_start_streaming(struct vb2_queue *vq, unsigned int count)
1139 cam->state = S_BUFWAIT; 1145 cam->state = S_BUFWAIT;
1140 return 0; 1146 return 0;
1141 } 1147 }
1148
1149 /*
1150 * Ensure clear the left over frame flags
1151 * before every really start streaming
1152 */
1153 for (frame = 0; frame < cam->nbufs; frame++)
1154 clear_bit(CF_FRAME_SOF0 + frame, &cam->flags);
1155
1142 return mcam_read_setup(cam); 1156 return mcam_read_setup(cam);
1143} 1157}
1144 1158
@@ -1816,9 +1830,11 @@ int mccic_irq(struct mcam_camera *cam, unsigned int irqs)
1816 * each time. 1830 * each time.
1817 */ 1831 */
1818 for (frame = 0; frame < cam->nbufs; frame++) 1832 for (frame = 0; frame < cam->nbufs; frame++)
1819 if (irqs & (IRQ_EOF0 << frame)) { 1833 if (irqs & (IRQ_EOF0 << frame) &&
1834 test_bit(CF_FRAME_SOF0 + frame, &cam->flags)) {
1820 mcam_frame_complete(cam, frame); 1835 mcam_frame_complete(cam, frame);
1821 handled = 1; 1836 handled = 1;
1837 clear_bit(CF_FRAME_SOF0 + frame, &cam->flags);
1822 if (cam->buffer_mode == B_DMA_sg) 1838 if (cam->buffer_mode == B_DMA_sg)
1823 break; 1839 break;
1824 } 1840 }
@@ -1827,9 +1843,15 @@ int mccic_irq(struct mcam_camera *cam, unsigned int irqs)
1827 * code assumes that we won't get multiple frame interrupts 1843 * code assumes that we won't get multiple frame interrupts
1828 * at once; may want to rethink that. 1844 * at once; may want to rethink that.
1829 */ 1845 */
1830 if (irqs & (IRQ_SOF0 | IRQ_SOF1 | IRQ_SOF2)) { 1846 for (frame = 0; frame < cam->nbufs; frame++) {
1847 if (irqs & (IRQ_SOF0 << frame)) {
1848 set_bit(CF_FRAME_SOF0 + frame, &cam->flags);
1849 handled = IRQ_HANDLED;
1850 }
1851 }
1852
1853 if (handled == IRQ_HANDLED) {
1831 set_bit(CF_DMA_ACTIVE, &cam->flags); 1854 set_bit(CF_DMA_ACTIVE, &cam->flags);
1832 handled = 1;
1833 if (cam->buffer_mode == B_DMA_sg) 1855 if (cam->buffer_mode == B_DMA_sg)
1834 mcam_ctlr_stop(cam); 1856 mcam_ctlr_stop(cam);
1835 } 1857 }