aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2013-03-15 11:53:17 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2013-03-25 07:48:10 -0400
commit4c211ed7e56bac729eab6552a2b8e85756f1cffd (patch)
treea284bc4a8e0f717664142c5653d48bbe490c4c52
parentf43afb1e21ff31243e120401ff34f017d0818998 (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.c19
-rw-r--r--drivers/staging/media/solo6x10/disp.c8
-rw-r--r--drivers/staging/media/solo6x10/solo6x10.h6
-rw-r--r--drivers/staging/media/solo6x10/tw28.c2
-rw-r--r--drivers/staging/media/solo6x10/v4l2-enc.c37
-rw-r--r--drivers/staging/media/solo6x10/v4l2.c47
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
235static 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
242static 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
253static ssize_t p2m_timeouts_show(struct device *dev, 235static 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
437static const struct device_attribute solo_dev_attrs[] = { 419static 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
42static unsigned video_type;
43module_param(video_type, uint, 0644);
44MODULE_PARM_DESC(video_type, "video_type (0 = NTSC/Default, 1 = PAL)");
45
46static void solo_vin_config(struct solo_dev *solo_dev) 42static 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 */
324int solo_disp_init(struct solo_dev *solo_dev); 324int solo_disp_init(struct solo_dev *solo_dev);
325void solo_disp_exit(struct solo_dev *solo_dev); 325void 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 */
377int solo_set_video_type(struct solo_dev *solo_dev, bool type);
378void solo_update_mode(struct solo_enc_dev *solo_enc);
379
376/* Set the threshold for motion detection */ 380/* Set the threshold for motion detection */
377int solo_set_motion_threshold(struct solo_dev *solo_dev, u8 ch, u16 val); 381int solo_set_motion_threshold(struct solo_dev *solo_dev, u8 ch, u16 val);
378int solo_set_motion_block(struct solo_dev *solo_dev, u8 ch, u16 val, 382int 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
179static void solo_update_mode(struct solo_enc_dev *solo_enc) 179void 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
889static int solo_enc_s_std(struct file *file, void *priv, v4l2_std_id i) 885static 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
897static 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
894static int solo_enum_framesizes(struct file *file, void *priv, 904static 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 = {
1067static const struct v4l2_ioctl_ops solo_enc_ioctl_ops = { 1077static 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
1109static const struct v4l2_ctrl_ops solo_ctrl_ops = { 1118static 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
523static int solo_s_std(struct file *file, void *priv, v4l2_std_id i) 518static 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
529int 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
549static 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
528static int solo_s_ctrl(struct v4l2_ctrl *ctrl) 556static 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 = {
567static const struct v4l2_ioctl_ops solo_v4l2_ioctl_ops = { 595static 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
603static const struct v4l2_ctrl_ops solo_ctrl_ops = { 630static const struct v4l2_ctrl_ops solo_ctrl_ops = {