diff options
author | Marin Mitov <mitov@issp.bas.bg> | 2010-05-14 04:15:38 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-05-14 17:00:55 -0400 |
commit | fdd2d9341d50f3a67fc35394e41146f30a383a6b (patch) | |
tree | c77d76cba5f658a4e862227f3024631ca4d345cc | |
parent | 3f56c109d0ef8437d89cdb84af02728ec9cc1150 (diff) |
Staging: dt3155v4l: introduce state machine
This patch introduces a v4l2 state machine, so now
CONFIG_DT3155_STREAMING is no more needed.
Signed-off-by: Marin Mitov <mitov@issp.bas.bg>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/staging/dt3155v4l/Kconfig | 8 | ||||
-rw-r--r-- | drivers/staging/dt3155v4l/dt3155v4l.c | 80 | ||||
-rw-r--r-- | drivers/staging/dt3155v4l/dt3155v4l.h | 4 |
3 files changed, 69 insertions, 23 deletions
diff --git a/drivers/staging/dt3155v4l/Kconfig b/drivers/staging/dt3155v4l/Kconfig index 5cef5420d288..f49f4ac035b0 100644 --- a/drivers/staging/dt3155v4l/Kconfig +++ b/drivers/staging/dt3155v4l/Kconfig | |||
@@ -18,11 +18,3 @@ config DT3155_CCIR | |||
18 | ---help--- | 18 | ---help--- |
19 | Select it for CCIR/50Hz (European region), | 19 | Select it for CCIR/50Hz (European region), |
20 | or leave it unselected for RS-170/60Hz (North America). | 20 | or leave it unselected for RS-170/60Hz (North America). |
21 | |||
22 | config DT3155_STREAMING | ||
23 | bool "Selects mmap streaming instead of read method" | ||
24 | depends on VIDEO_DT3155 | ||
25 | default y | ||
26 | ---help--- | ||
27 | Select it if you wish to try mmap streaming, or | ||
28 | or leave it unselected for using read method. | ||
diff --git a/drivers/staging/dt3155v4l/dt3155v4l.c b/drivers/staging/dt3155v4l/dt3155v4l.c index 49463611f4f3..308fb45965b3 100644 --- a/drivers/staging/dt3155v4l/dt3155v4l.c +++ b/drivers/staging/dt3155v4l/dt3155v4l.c | |||
@@ -930,6 +930,7 @@ dt3155_release(struct file *filp) | |||
930 | dt3155_stop_acq(pd); | 930 | dt3155_stop_acq(pd); |
931 | videobuf_stop(pd->vidq); | 931 | videobuf_stop(pd->vidq); |
932 | pd->acq_fp = NULL; | 932 | pd->acq_fp = NULL; |
933 | pd->streaming = 0; | ||
933 | } | 934 | } |
934 | if (!pd->users) { | 935 | if (!pd->users) { |
935 | kthread_stop(pd->thread); | 936 | kthread_stop(pd->thread); |
@@ -949,11 +950,15 @@ dt3155_read(struct file *filp, char __user *user, size_t size, loff_t *loff) | |||
949 | 950 | ||
950 | if (mutex_lock_interruptible(&pd->mux) == -EINTR) | 951 | if (mutex_lock_interruptible(&pd->mux) == -EINTR) |
951 | return -ERESTARTSYS; | 952 | return -ERESTARTSYS; |
952 | if (!pd->acq_fp) | 953 | if (!pd->acq_fp) { |
953 | pd->acq_fp = filp; | 954 | pd->acq_fp = filp; |
954 | else if (pd->acq_fp != filp) { | 955 | pd->streaming = 0; |
956 | } else if (pd->acq_fp != filp) { | ||
955 | ret = -EBUSY; | 957 | ret = -EBUSY; |
956 | goto done; | 958 | goto done; |
959 | } else if (pd->streaming == 1) { | ||
960 | ret = -EINVAL; | ||
961 | goto done; | ||
957 | } | 962 | } |
958 | ret = videobuf_read_stream(pd->vidq, user, size, loff, 0, | 963 | ret = videobuf_read_stream(pd->vidq, user, size, loff, 0, |
959 | filp->f_flags & O_NONBLOCK); | 964 | filp->f_flags & O_NONBLOCK); |
@@ -1001,8 +1006,10 @@ dt3155_ioc_streamon(struct file *filp, void *p, enum v4l2_buf_type type) | |||
1001 | if (ret) | 1006 | if (ret) |
1002 | goto unlock; | 1007 | goto unlock; |
1003 | pd->acq_fp = filp; | 1008 | pd->acq_fp = filp; |
1009 | pd->streaming = 1; | ||
1004 | wake_up_interruptible_sync(&pd->do_dma); | 1010 | wake_up_interruptible_sync(&pd->do_dma); |
1005 | } else if (pd->acq_fp == filp) { | 1011 | } else if (pd->acq_fp == filp) { |
1012 | pd->streaming = 1; | ||
1006 | ret = videobuf_streamon(pd->vidq); | 1013 | ret = videobuf_streamon(pd->vidq); |
1007 | if (!ret) | 1014 | if (!ret) |
1008 | wake_up_interruptible_sync(&pd->do_dma); | 1015 | wake_up_interruptible_sync(&pd->do_dma); |
@@ -1043,11 +1050,8 @@ dt3155_ioc_querycap(struct file *filp, void *p, struct v4l2_capability *cap) | |||
1043 | cap->version = | 1050 | cap->version = |
1044 | KERNEL_VERSION(DT3155_VER_MAJ, DT3155_VER_MIN, DT3155_VER_EXT); | 1051 | KERNEL_VERSION(DT3155_VER_MAJ, DT3155_VER_MIN, DT3155_VER_EXT); |
1045 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | | 1052 | cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | |
1046 | #ifdef CONFIG_DT3155_STREAMING | 1053 | V4L2_CAP_STREAMING | |
1047 | V4L2_CAP_STREAMING; | ||
1048 | #else | ||
1049 | V4L2_CAP_READWRITE; | 1054 | V4L2_CAP_READWRITE; |
1050 | #endif | ||
1051 | return 0; | 1055 | return 0; |
1052 | } | 1056 | } |
1053 | 1057 | ||
@@ -1095,7 +1099,28 @@ dt3155_ioc_try_fmt_vid_cap(struct file *filp, void *p, struct v4l2_format *f) | |||
1095 | static int | 1099 | static int |
1096 | dt3155_ioc_s_fmt_vid_cap(struct file *filp, void *p, struct v4l2_format *f) | 1100 | dt3155_ioc_s_fmt_vid_cap(struct file *filp, void *p, struct v4l2_format *f) |
1097 | { | 1101 | { |
1098 | return dt3155_ioc_g_fmt_vid_cap(filp, p, f); | 1102 | struct dt3155_priv *pd = video_drvdata(filp); |
1103 | int ret = -ERESTARTSYS; | ||
1104 | |||
1105 | if (mutex_lock_interruptible(&pd->mux) == -EINTR) | ||
1106 | return ret; | ||
1107 | if (!pd->acq_fp) { | ||
1108 | pd->acq_fp = filp; | ||
1109 | pd->streaming = 0; | ||
1110 | } else if (pd->acq_fp != filp) { | ||
1111 | ret = -EBUSY; | ||
1112 | goto done; | ||
1113 | } | ||
1114 | /* FIXME: we don't change the format for now | ||
1115 | if (pd->vidq->streaming || pd->vidq->reading || pd->curr_buff) { | ||
1116 | ret = -EBUSY; | ||
1117 | goto done; | ||
1118 | } | ||
1119 | */ | ||
1120 | ret = dt3155_ioc_g_fmt_vid_cap(filp, p, f); | ||
1121 | done: | ||
1122 | mutex_unlock(&pd->mux); | ||
1123 | return ret; | ||
1099 | } | 1124 | } |
1100 | 1125 | ||
1101 | static int | 1126 | static int |
@@ -1103,15 +1128,33 @@ dt3155_ioc_reqbufs(struct file *filp, void *p, struct v4l2_requestbuffers *b) | |||
1103 | { | 1128 | { |
1104 | struct dt3155_priv *pd = video_drvdata(filp); | 1129 | struct dt3155_priv *pd = video_drvdata(filp); |
1105 | struct videobuf_queue *q = pd->vidq; | 1130 | struct videobuf_queue *q = pd->vidq; |
1131 | int ret = -ERESTARTSYS; | ||
1106 | 1132 | ||
1107 | if (b->memory != V4L2_MEMORY_MMAP) | 1133 | if (b->memory != V4L2_MEMORY_MMAP) |
1108 | return -EINVAL; | 1134 | return -EINVAL; |
1135 | if (mutex_lock_interruptible(&pd->mux) == -EINTR) | ||
1136 | return ret; | ||
1137 | if (!pd->acq_fp) | ||
1138 | pd->acq_fp = filp; | ||
1139 | else if (pd->acq_fp != filp) { | ||
1140 | ret = -EBUSY; | ||
1141 | goto done; | ||
1142 | } | ||
1143 | pd->streaming = 1; | ||
1144 | ret = 0; | ||
1145 | done: | ||
1146 | mutex_unlock(&pd->mux); | ||
1147 | if (ret) | ||
1148 | return ret; | ||
1109 | if (b->count) | 1149 | if (b->count) |
1110 | return videobuf_reqbufs(q, b); | 1150 | ret = videobuf_reqbufs(q, b); |
1111 | else { /* FIXME: is it necessary? */ | 1151 | else { /* FIXME: is it necessary? */ |
1112 | printk(KERN_DEBUG "dt3155: request to free buffers\n"); | 1152 | printk(KERN_DEBUG "dt3155: request to free buffers\n"); |
1113 | return videobuf_mmap_free(q); | 1153 | /* ret = videobuf_mmap_free(q); */ |
1154 | ret = dt3155_ioc_streamoff(filp, p, | ||
1155 | V4L2_BUF_TYPE_VIDEO_CAPTURE); | ||
1114 | } | 1156 | } |
1157 | return ret; | ||
1115 | } | 1158 | } |
1116 | 1159 | ||
1117 | static int | 1160 | static int |
@@ -1128,8 +1171,12 @@ dt3155_ioc_qbuf(struct file *filp, void *p, struct v4l2_buffer *b) | |||
1128 | { | 1171 | { |
1129 | struct dt3155_priv *pd = video_drvdata(filp); | 1172 | struct dt3155_priv *pd = video_drvdata(filp); |
1130 | struct videobuf_queue *q = pd->vidq; | 1173 | struct videobuf_queue *q = pd->vidq; |
1174 | int ret; | ||
1131 | 1175 | ||
1132 | return videobuf_qbuf(q, b); | 1176 | ret = videobuf_qbuf(q, b); |
1177 | if (ret) | ||
1178 | return ret; | ||
1179 | return videobuf_querybuf(q, b); | ||
1133 | } | 1180 | } |
1134 | 1181 | ||
1135 | static int | 1182 | static int |
@@ -1170,7 +1217,12 @@ dt3155_ioc_enum_input(struct file *filp, void *p, struct v4l2_input *input) | |||
1170 | return -EINVAL; | 1217 | return -EINVAL; |
1171 | strcpy(input->name, "Coax in"); | 1218 | strcpy(input->name, "Coax in"); |
1172 | input->type = V4L2_INPUT_TYPE_CAMERA; | 1219 | input->type = V4L2_INPUT_TYPE_CAMERA; |
1173 | input->std = V4L2_STD_ALL; | 1220 | /* |
1221 | * FIXME: input->std = 0 according to v4l2 API | ||
1222 | * VIDIOC_G_STD, VIDIOC_S_STD, VIDIOC_QUERYSTD and VIDIOC_ENUMSTD | ||
1223 | * should return -EINVAL | ||
1224 | */ | ||
1225 | input->std = DT3155_CURRENT_NORM; | ||
1174 | input->status = 0;/* FIXME: add sync detection & V4L2_IN_ST_NO_H_LOCK */ | 1226 | input->status = 0;/* FIXME: add sync detection & V4L2_IN_ST_NO_H_LOCK */ |
1175 | return 0; | 1227 | return 0; |
1176 | } | 1228 | } |
@@ -1200,7 +1252,7 @@ dt3155_ioc_g_parm(struct file *filp, void *p, struct v4l2_streamparm *parms) | |||
1200 | parms->parm.capture.timeperframe.numerator = 1001; | 1252 | parms->parm.capture.timeperframe.numerator = 1001; |
1201 | parms->parm.capture.timeperframe.denominator = frames_per_sec * 1000; | 1253 | parms->parm.capture.timeperframe.denominator = frames_per_sec * 1000; |
1202 | parms->parm.capture.extendedmode = 0; | 1254 | parms->parm.capture.extendedmode = 0; |
1203 | parms->parm.capture.readbuffers = 1; | 1255 | parms->parm.capture.readbuffers = 1; /* FIXME: 2 buffers? */ |
1204 | return 0; | 1256 | return 0; |
1205 | } | 1257 | } |
1206 | 1258 | ||
@@ -1214,7 +1266,7 @@ dt3155_ioc_s_parm(struct file *filp, void *p, struct v4l2_streamparm *parms) | |||
1214 | parms->parm.capture.timeperframe.numerator = 1001; | 1266 | parms->parm.capture.timeperframe.numerator = 1001; |
1215 | parms->parm.capture.timeperframe.denominator = frames_per_sec * 1000; | 1267 | parms->parm.capture.timeperframe.denominator = frames_per_sec * 1000; |
1216 | parms->parm.capture.extendedmode = 0; | 1268 | parms->parm.capture.extendedmode = 0; |
1217 | parms->parm.capture.readbuffers = 1; | 1269 | parms->parm.capture.readbuffers = 1; /* FIXME: 2 buffers? */ |
1218 | return 0; | 1270 | return 0; |
1219 | } | 1271 | } |
1220 | 1272 | ||
@@ -1377,7 +1429,7 @@ static struct video_device dt3155_vdev = { | |||
1377 | .ioctl_ops = &dt3155_ioctl_ops, | 1429 | .ioctl_ops = &dt3155_ioctl_ops, |
1378 | .minor = -1, | 1430 | .minor = -1, |
1379 | .release = video_device_release, | 1431 | .release = video_device_release, |
1380 | .tvnorms = V4L2_STD_ALL, | 1432 | .tvnorms = DT3155_CURRENT_NORM, |
1381 | .current_norm = DT3155_CURRENT_NORM, | 1433 | .current_norm = DT3155_CURRENT_NORM, |
1382 | }; | 1434 | }; |
1383 | 1435 | ||
diff --git a/drivers/staging/dt3155v4l/dt3155v4l.h b/drivers/staging/dt3155v4l/dt3155v4l.h index 4c6a0ee08c0e..e65a81e198b9 100644 --- a/drivers/staging/dt3155v4l/dt3155v4l.h +++ b/drivers/staging/dt3155v4l/dt3155v4l.h | |||
@@ -30,7 +30,7 @@ | |||
30 | #define DT3155_NAME "dt3155" | 30 | #define DT3155_NAME "dt3155" |
31 | #define DT3155_VER_MAJ 1 | 31 | #define DT3155_VER_MAJ 1 |
32 | #define DT3155_VER_MIN 0 | 32 | #define DT3155_VER_MIN 0 |
33 | #define DT3155_VER_EXT 2 | 33 | #define DT3155_VER_EXT 3 |
34 | #define DT3155_VERSION __stringify(DT3155_VER_MAJ) "." \ | 34 | #define DT3155_VERSION __stringify(DT3155_VER_MAJ) "." \ |
35 | __stringify(DT3155_VER_MIN) "." \ | 35 | __stringify(DT3155_VER_MIN) "." \ |
36 | __stringify(DT3155_VER_EXT) | 36 | __stringify(DT3155_VER_EXT) |
@@ -180,6 +180,7 @@ struct dt3155_stats { | |||
180 | * | 180 | * |
181 | * @vdev: pointer to video_device structure | 181 | * @vdev: pointer to video_device structure |
182 | * @acq_fp pointer to filp that starts acquisition | 182 | * @acq_fp pointer to filp that starts acquisition |
183 | * @streaming streaming is negotiated | ||
183 | * @pdev: pointer to pci_dev structure | 184 | * @pdev: pointer to pci_dev structure |
184 | * @vidq pointer to videobuf_queue structure | 185 | * @vidq pointer to videobuf_queue structure |
185 | * @curr_buf: pointer to curren buffer | 186 | * @curr_buf: pointer to curren buffer |
@@ -200,6 +201,7 @@ struct dt3155_stats { | |||
200 | struct dt3155_priv { | 201 | struct dt3155_priv { |
201 | struct video_device *vdev; | 202 | struct video_device *vdev; |
202 | struct file *acq_fp; | 203 | struct file *acq_fp; |
204 | int streaming; | ||
203 | struct pci_dev *pdev; | 205 | struct pci_dev *pdev; |
204 | struct videobuf_queue *vidq; | 206 | struct videobuf_queue *vidq; |
205 | struct videobuf_buffer *curr_buf; | 207 | struct videobuf_buffer *curr_buf; |