diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2013-03-15 11:53:17 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-03-25 07:48:10 -0400 |
commit | 4c211ed7e56bac729eab6552a2b8e85756f1cffd (patch) | |
tree | a284bc4a8e0f717664142c5653d48bbe490c4c52 | |
parent | f43afb1e21ff31243e120401ff34f017d0818998 (diff) |
[media] solo6x10: drop video_type and add proper s_std support
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r-- | drivers/staging/media/solo6x10/core.c | 19 | ||||
-rw-r--r-- | drivers/staging/media/solo6x10/disp.c | 8 | ||||
-rw-r--r-- | drivers/staging/media/solo6x10/solo6x10.h | 6 | ||||
-rw-r--r-- | drivers/staging/media/solo6x10/tw28.c | 2 | ||||
-rw-r--r-- | drivers/staging/media/solo6x10/v4l2-enc.c | 37 | ||||
-rw-r--r-- | drivers/staging/media/solo6x10/v4l2.c | 47 |
6 files changed, 67 insertions, 52 deletions
diff --git a/drivers/staging/media/solo6x10/core.c b/drivers/staging/media/solo6x10/core.c index 3cea08d2658d..779d4b43aaa5 100644 --- a/drivers/staging/media/solo6x10/core.c +++ b/drivers/staging/media/solo6x10/core.c | |||
@@ -232,24 +232,6 @@ static ssize_t eeprom_show(struct device *dev, struct device_attribute *attr, | |||
232 | return count; | 232 | return count; |
233 | } | 233 | } |
234 | 234 | ||
235 | static ssize_t video_type_store(struct device *dev, | ||
236 | struct device_attribute *attr, | ||
237 | const char *buf, size_t count) | ||
238 | { | ||
239 | return -EPERM; | ||
240 | } | ||
241 | |||
242 | static ssize_t video_type_show(struct device *dev, | ||
243 | struct device_attribute *attr, | ||
244 | char *buf) | ||
245 | { | ||
246 | struct solo_dev *solo_dev = | ||
247 | container_of(dev, struct solo_dev, dev); | ||
248 | |||
249 | return sprintf(buf, "%s", solo_dev->video_type == | ||
250 | SOLO_VO_FMT_TYPE_NTSC ? "NTSC" : "PAL"); | ||
251 | } | ||
252 | |||
253 | static ssize_t p2m_timeouts_show(struct device *dev, | 235 | static ssize_t p2m_timeouts_show(struct device *dev, |
254 | struct device_attribute *attr, | 236 | struct device_attribute *attr, |
255 | char *buf) | 237 | char *buf) |
@@ -436,7 +418,6 @@ static ssize_t sdram_show(struct file *file, struct kobject *kobj, | |||
436 | 418 | ||
437 | static const struct device_attribute solo_dev_attrs[] = { | 419 | static const struct device_attribute solo_dev_attrs[] = { |
438 | __ATTR(eeprom, 0640, eeprom_show, eeprom_store), | 420 | __ATTR(eeprom, 0640, eeprom_show, eeprom_store), |
439 | __ATTR(video_type, 0644, video_type_show, video_type_store), | ||
440 | __ATTR(p2m_timeout, 0644, p2m_timeout_show, p2m_timeout_store), | 421 | __ATTR(p2m_timeout, 0644, p2m_timeout_show, p2m_timeout_store), |
441 | __ATTR_RO(p2m_timeouts), | 422 | __ATTR_RO(p2m_timeouts), |
442 | __ATTR_RO(sdram_size), | 423 | __ATTR_RO(sdram_size), |
diff --git a/drivers/staging/media/solo6x10/disp.c b/drivers/staging/media/solo6x10/disp.c index ddd85e72dd70..3dcaad98c70f 100644 --- a/drivers/staging/media/solo6x10/disp.c +++ b/drivers/staging/media/solo6x10/disp.c | |||
@@ -39,10 +39,6 @@ | |||
39 | #define SOLO_MOT_FLAG_SIZE 1024 | 39 | #define SOLO_MOT_FLAG_SIZE 1024 |
40 | #define SOLO_MOT_FLAG_AREA (SOLO_MOT_FLAG_SIZE * 16) | 40 | #define SOLO_MOT_FLAG_AREA (SOLO_MOT_FLAG_SIZE * 16) |
41 | 41 | ||
42 | static unsigned video_type; | ||
43 | module_param(video_type, uint, 0644); | ||
44 | MODULE_PARM_DESC(video_type, "video_type (0 = NTSC/Default, 1 = PAL)"); | ||
45 | |||
46 | static void solo_vin_config(struct solo_dev *solo_dev) | 42 | static void solo_vin_config(struct solo_dev *solo_dev) |
47 | { | 43 | { |
48 | solo_dev->vin_hstart = 8; | 44 | solo_dev->vin_hstart = 8; |
@@ -273,12 +269,10 @@ int solo_disp_init(struct solo_dev *solo_dev) | |||
273 | int i; | 269 | int i; |
274 | 270 | ||
275 | solo_dev->video_hsize = 704; | 271 | solo_dev->video_hsize = 704; |
276 | if (video_type == 0) { | 272 | if (solo_dev->video_type == SOLO_VO_FMT_TYPE_NTSC) { |
277 | solo_dev->video_type = SOLO_VO_FMT_TYPE_NTSC; | ||
278 | solo_dev->video_vsize = 240; | 273 | solo_dev->video_vsize = 240; |
279 | solo_dev->fps = 30; | 274 | solo_dev->fps = 30; |
280 | } else { | 275 | } else { |
281 | solo_dev->video_type = SOLO_VO_FMT_TYPE_PAL; | ||
282 | solo_dev->video_vsize = 288; | 276 | solo_dev->video_vsize = 288; |
283 | solo_dev->fps = 25; | 277 | solo_dev->fps = 25; |
284 | } | 278 | } |
diff --git a/drivers/staging/media/solo6x10/solo6x10.h b/drivers/staging/media/solo6x10/solo6x10.h index 518166271acf..6c00f07cd2dd 100644 --- a/drivers/staging/media/solo6x10/solo6x10.h +++ b/drivers/staging/media/solo6x10/solo6x10.h | |||
@@ -320,7 +320,7 @@ static inline void solo_irq_off(struct solo_dev *dev, u32 mask) | |||
320 | solo_reg_write(dev, SOLO_IRQ_MASK, dev->irq_mask); | 320 | solo_reg_write(dev, SOLO_IRQ_MASK, dev->irq_mask); |
321 | } | 321 | } |
322 | 322 | ||
323 | /* Init/exit routeines for subsystems */ | 323 | /* Init/exit routines for subsystems */ |
324 | int solo_disp_init(struct solo_dev *solo_dev); | 324 | int solo_disp_init(struct solo_dev *solo_dev); |
325 | void solo_disp_exit(struct solo_dev *solo_dev); | 325 | void solo_disp_exit(struct solo_dev *solo_dev); |
326 | 326 | ||
@@ -373,6 +373,10 @@ int solo_p2m_dma_desc(struct solo_dev *solo_dev, | |||
373 | struct solo_p2m_desc *desc, dma_addr_t desc_dma, | 373 | struct solo_p2m_desc *desc, dma_addr_t desc_dma, |
374 | int desc_cnt); | 374 | int desc_cnt); |
375 | 375 | ||
376 | /* Global s_std ioctl */ | ||
377 | int solo_set_video_type(struct solo_dev *solo_dev, bool type); | ||
378 | void solo_update_mode(struct solo_enc_dev *solo_enc); | ||
379 | |||
376 | /* Set the threshold for motion detection */ | 380 | /* Set the threshold for motion detection */ |
377 | int solo_set_motion_threshold(struct solo_dev *solo_dev, u8 ch, u16 val); | 381 | int solo_set_motion_threshold(struct solo_dev *solo_dev, u8 ch, u16 val); |
378 | int solo_set_motion_block(struct solo_dev *solo_dev, u8 ch, u16 val, | 382 | int solo_set_motion_block(struct solo_dev *solo_dev, u8 ch, u16 val, |
diff --git a/drivers/staging/media/solo6x10/tw28.c b/drivers/staging/media/solo6x10/tw28.c index 69baf82a3ac4..6c77af8259b3 100644 --- a/drivers/staging/media/solo6x10/tw28.c +++ b/drivers/staging/media/solo6x10/tw28.c | |||
@@ -576,6 +576,8 @@ int solo_tw28_init(struct solo_dev *solo_dev) | |||
576 | int i; | 576 | int i; |
577 | u8 value; | 577 | u8 value; |
578 | 578 | ||
579 | solo_dev->tw28_cnt = 0; | ||
580 | |||
579 | /* Detect techwell chip type(s) */ | 581 | /* Detect techwell chip type(s) */ |
580 | for (i = 0; i < solo_dev->nr_chans / 4; i++) { | 582 | for (i = 0; i < solo_dev->nr_chans / 4; i++) { |
581 | value = solo_i2c_readbyte(solo_dev, SOLO_I2C_TW, | 583 | value = solo_i2c_readbyte(solo_dev, SOLO_I2C_TW, |
diff --git a/drivers/staging/media/solo6x10/v4l2-enc.c b/drivers/staging/media/solo6x10/v4l2-enc.c index 4dda6ecfea60..225b634d241b 100644 --- a/drivers/staging/media/solo6x10/v4l2-enc.c +++ b/drivers/staging/media/solo6x10/v4l2-enc.c | |||
@@ -176,7 +176,7 @@ static void solo_motion_toggle(struct solo_enc_dev *solo_enc, int on) | |||
176 | spin_unlock_irqrestore(&solo_enc->motion_lock, flags); | 176 | spin_unlock_irqrestore(&solo_enc->motion_lock, flags); |
177 | } | 177 | } |
178 | 178 | ||
179 | static void solo_update_mode(struct solo_enc_dev *solo_enc) | 179 | void solo_update_mode(struct solo_enc_dev *solo_enc) |
180 | { | 180 | { |
181 | struct solo_dev *solo_dev = solo_enc->solo_dev; | 181 | struct solo_dev *solo_dev = solo_enc->solo_dev; |
182 | int vop_len; | 182 | int vop_len; |
@@ -749,11 +749,7 @@ static int solo_enc_enum_input(struct file *file, void *priv, | |||
749 | snprintf(input->name, sizeof(input->name), "Encoder %d", | 749 | snprintf(input->name, sizeof(input->name), "Encoder %d", |
750 | solo_enc->ch + 1); | 750 | solo_enc->ch + 1); |
751 | input->type = V4L2_INPUT_TYPE_CAMERA; | 751 | input->type = V4L2_INPUT_TYPE_CAMERA; |
752 | 752 | input->std = solo_enc->vfd->tvnorms; | |
753 | if (solo_dev->video_type == SOLO_VO_FMT_TYPE_NTSC) | ||
754 | input->std = V4L2_STD_NTSC_M; | ||
755 | else | ||
756 | input->std = V4L2_STD_PAL_B; | ||
757 | 753 | ||
758 | if (!tw28_get_video_status(solo_dev, solo_enc->ch)) | 754 | if (!tw28_get_video_status(solo_dev, solo_enc->ch)) |
759 | input->status = V4L2_IN_ST_NO_SIGNAL; | 755 | input->status = V4L2_IN_ST_NO_SIGNAL; |
@@ -886,11 +882,25 @@ static int solo_enc_get_fmt_cap(struct file *file, void *priv, | |||
886 | return 0; | 882 | return 0; |
887 | } | 883 | } |
888 | 884 | ||
889 | static int solo_enc_s_std(struct file *file, void *priv, v4l2_std_id i) | 885 | static int solo_enc_g_std(struct file *file, void *priv, v4l2_std_id *i) |
890 | { | 886 | { |
887 | struct solo_enc_dev *solo_enc = video_drvdata(file); | ||
888 | struct solo_dev *solo_dev = solo_enc->solo_dev; | ||
889 | |||
890 | if (solo_dev->video_type == SOLO_VO_FMT_TYPE_NTSC) | ||
891 | *i = V4L2_STD_NTSC_M; | ||
892 | else | ||
893 | *i = V4L2_STD_PAL; | ||
891 | return 0; | 894 | return 0; |
892 | } | 895 | } |
893 | 896 | ||
897 | static int solo_enc_s_std(struct file *file, void *priv, v4l2_std_id std) | ||
898 | { | ||
899 | struct solo_enc_dev *solo_enc = video_drvdata(file); | ||
900 | |||
901 | return solo_set_video_type(solo_enc->solo_dev, std & V4L2_STD_PAL); | ||
902 | } | ||
903 | |||
894 | static int solo_enum_framesizes(struct file *file, void *priv, | 904 | static int solo_enum_framesizes(struct file *file, void *priv, |
895 | struct v4l2_frmsizeenum *fsize) | 905 | struct v4l2_frmsizeenum *fsize) |
896 | { | 906 | { |
@@ -938,14 +948,14 @@ static int solo_enum_frameintervals(struct file *file, void *priv, | |||
938 | 948 | ||
939 | fintv->type = V4L2_FRMIVAL_TYPE_STEPWISE; | 949 | fintv->type = V4L2_FRMIVAL_TYPE_STEPWISE; |
940 | 950 | ||
951 | fintv->stepwise.min.numerator = 1; | ||
941 | fintv->stepwise.min.denominator = solo_dev->fps; | 952 | fintv->stepwise.min.denominator = solo_dev->fps; |
942 | fintv->stepwise.min.numerator = 15; | ||
943 | 953 | ||
954 | fintv->stepwise.max.numerator = 15; | ||
944 | fintv->stepwise.max.denominator = solo_dev->fps; | 955 | fintv->stepwise.max.denominator = solo_dev->fps; |
945 | fintv->stepwise.max.numerator = 1; | ||
946 | 956 | ||
947 | fintv->stepwise.step.numerator = 1; | 957 | fintv->stepwise.step.numerator = 1; |
948 | fintv->stepwise.step.denominator = 1; | 958 | fintv->stepwise.step.denominator = solo_dev->fps; |
949 | 959 | ||
950 | return 0; | 960 | return 0; |
951 | } | 961 | } |
@@ -1067,6 +1077,7 @@ static const struct v4l2_file_operations solo_enc_fops = { | |||
1067 | static const struct v4l2_ioctl_ops solo_enc_ioctl_ops = { | 1077 | static const struct v4l2_ioctl_ops solo_enc_ioctl_ops = { |
1068 | .vidioc_querycap = solo_enc_querycap, | 1078 | .vidioc_querycap = solo_enc_querycap, |
1069 | .vidioc_s_std = solo_enc_s_std, | 1079 | .vidioc_s_std = solo_enc_s_std, |
1080 | .vidioc_g_std = solo_enc_g_std, | ||
1070 | /* Input callbacks */ | 1081 | /* Input callbacks */ |
1071 | .vidioc_enum_input = solo_enc_enum_input, | 1082 | .vidioc_enum_input = solo_enc_enum_input, |
1072 | .vidioc_s_input = solo_enc_set_input, | 1083 | .vidioc_s_input = solo_enc_set_input, |
@@ -1101,9 +1112,7 @@ static const struct video_device solo_enc_template = { | |||
1101 | .ioctl_ops = &solo_enc_ioctl_ops, | 1112 | .ioctl_ops = &solo_enc_ioctl_ops, |
1102 | .minor = -1, | 1113 | .minor = -1, |
1103 | .release = video_device_release, | 1114 | .release = video_device_release, |
1104 | 1115 | .tvnorms = V4L2_STD_NTSC_M | V4L2_STD_PAL, | |
1105 | .tvnorms = V4L2_STD_NTSC_M | V4L2_STD_PAL_B, | ||
1106 | .current_norm = V4L2_STD_NTSC_M, | ||
1107 | }; | 1116 | }; |
1108 | 1117 | ||
1109 | static const struct v4l2_ctrl_ops solo_ctrl_ops = { | 1118 | static const struct v4l2_ctrl_ops solo_ctrl_ops = { |
@@ -1203,9 +1212,7 @@ static struct solo_enc_dev *solo_enc_alloc(struct solo_dev *solo_dev, | |||
1203 | ret = vb2_queue_init(&solo_enc->vidq); | 1212 | ret = vb2_queue_init(&solo_enc->vidq); |
1204 | if (ret) | 1213 | if (ret) |
1205 | goto hdl_free; | 1214 | goto hdl_free; |
1206 | spin_lock(&solo_enc->av_lock); | ||
1207 | solo_update_mode(solo_enc); | 1215 | solo_update_mode(solo_enc); |
1208 | spin_unlock(&solo_enc->av_lock); | ||
1209 | 1216 | ||
1210 | spin_lock_init(&solo_enc->motion_lock); | 1217 | spin_lock_init(&solo_enc->motion_lock); |
1211 | 1218 | ||
diff --git a/drivers/staging/media/solo6x10/v4l2.c b/drivers/staging/media/solo6x10/v4l2.c index d38a8fe8962d..b5643ab3b9a1 100644 --- a/drivers/staging/media/solo6x10/v4l2.c +++ b/drivers/staging/media/solo6x10/v4l2.c | |||
@@ -426,12 +426,7 @@ static int solo_enum_input(struct file *file, void *priv, | |||
426 | } | 426 | } |
427 | 427 | ||
428 | input->type = V4L2_INPUT_TYPE_CAMERA; | 428 | input->type = V4L2_INPUT_TYPE_CAMERA; |
429 | 429 | input->std = solo_dev->vfd->tvnorms; | |
430 | if (solo_dev->video_type == SOLO_VO_FMT_TYPE_NTSC) | ||
431 | input->std = V4L2_STD_NTSC_M; | ||
432 | else | ||
433 | input->std = V4L2_STD_PAL_B; | ||
434 | |||
435 | return 0; | 430 | return 0; |
436 | } | 431 | } |
437 | 432 | ||
@@ -520,11 +515,44 @@ static int solo_get_fmt_cap(struct file *file, void *priv, | |||
520 | return 0; | 515 | return 0; |
521 | } | 516 | } |
522 | 517 | ||
523 | static int solo_s_std(struct file *file, void *priv, v4l2_std_id i) | 518 | static int solo_g_std(struct file *file, void *priv, v4l2_std_id *i) |
524 | { | 519 | { |
520 | struct solo_dev *solo_dev = video_drvdata(file); | ||
521 | |||
522 | if (solo_dev->video_type == SOLO_VO_FMT_TYPE_NTSC) | ||
523 | *i = V4L2_STD_NTSC_M; | ||
524 | else | ||
525 | *i = V4L2_STD_PAL; | ||
525 | return 0; | 526 | return 0; |
526 | } | 527 | } |
527 | 528 | ||
529 | int solo_set_video_type(struct solo_dev *solo_dev, bool type) | ||
530 | { | ||
531 | int i; | ||
532 | |||
533 | /* Make sure all video nodes are idle */ | ||
534 | if (vb2_is_busy(&solo_dev->vidq)) | ||
535 | return -EBUSY; | ||
536 | for (i = 0; i < solo_dev->nr_chans; i++) | ||
537 | if (vb2_is_busy(&solo_dev->v4l2_enc[i]->vidq)) | ||
538 | return -EBUSY; | ||
539 | solo_dev->video_type = type; | ||
540 | /* Reconfigure for the new standard */ | ||
541 | solo_disp_init(solo_dev); | ||
542 | solo_enc_init(solo_dev); | ||
543 | solo_tw28_init(solo_dev); | ||
544 | for (i = 0; i < solo_dev->nr_chans; i++) | ||
545 | solo_update_mode(solo_dev->v4l2_enc[i]); | ||
546 | return solo_v4l2_set_ch(solo_dev, solo_dev->cur_disp_ch); | ||
547 | } | ||
548 | |||
549 | static int solo_s_std(struct file *file, void *priv, v4l2_std_id std) | ||
550 | { | ||
551 | struct solo_dev *solo_dev = video_drvdata(file); | ||
552 | |||
553 | return solo_set_video_type(solo_dev, std & V4L2_STD_PAL); | ||
554 | } | ||
555 | |||
528 | static int solo_s_ctrl(struct v4l2_ctrl *ctrl) | 556 | static int solo_s_ctrl(struct v4l2_ctrl *ctrl) |
529 | { | 557 | { |
530 | struct solo_dev *solo_dev = | 558 | struct solo_dev *solo_dev = |
@@ -567,6 +595,7 @@ static const struct v4l2_file_operations solo_v4l2_fops = { | |||
567 | static const struct v4l2_ioctl_ops solo_v4l2_ioctl_ops = { | 595 | static const struct v4l2_ioctl_ops solo_v4l2_ioctl_ops = { |
568 | .vidioc_querycap = solo_querycap, | 596 | .vidioc_querycap = solo_querycap, |
569 | .vidioc_s_std = solo_s_std, | 597 | .vidioc_s_std = solo_s_std, |
598 | .vidioc_g_std = solo_g_std, | ||
570 | /* Input callbacks */ | 599 | /* Input callbacks */ |
571 | .vidioc_enum_input = solo_enum_input, | 600 | .vidioc_enum_input = solo_enum_input, |
572 | .vidioc_s_input = solo_set_input, | 601 | .vidioc_s_input = solo_set_input, |
@@ -595,9 +624,7 @@ static struct video_device solo_v4l2_template = { | |||
595 | .ioctl_ops = &solo_v4l2_ioctl_ops, | 624 | .ioctl_ops = &solo_v4l2_ioctl_ops, |
596 | .minor = -1, | 625 | .minor = -1, |
597 | .release = video_device_release, | 626 | .release = video_device_release, |
598 | 627 | .tvnorms = V4L2_STD_NTSC_M | V4L2_STD_PAL, | |
599 | .tvnorms = V4L2_STD_NTSC_M | V4L2_STD_PAL_B, | ||
600 | .current_norm = V4L2_STD_NTSC_M, | ||
601 | }; | 628 | }; |
602 | 629 | ||
603 | static const struct v4l2_ctrl_ops solo_ctrl_ops = { | 630 | static const struct v4l2_ctrl_ops solo_ctrl_ops = { |