aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans Verkuil <hverkuil@xs4all.nl>2006-01-09 12:25:44 -0500
committerMauro Carvalho Chehab <mchehab@brturbo.com.br>2006-01-09 12:25:44 -0500
commit3faeeae48348959c58f3121d2a6a4fb0bc626da0 (patch)
treeb8a9388826d06542c190d7ce7c3fe44b78e22b30
parentd3900bc42e6bc5e461c29951cc2a50df09e08771 (diff)
V4L/DVB (3256): When in radio mode ignore VIDIOC_G_TUNER
- Detect when AUDC_SET_RADIO is called. - When in radio mode ignore VIDIOC_G_TUNER. Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@brturbo.com.br>
-rw-r--r--drivers/media/video/cx25840/cx25840-core.c40
-rw-r--r--drivers/media/video/cx25840/cx25840.h1
-rw-r--r--drivers/media/video/saa7115.c12
3 files changed, 32 insertions, 21 deletions
diff --git a/drivers/media/video/cx25840/cx25840-core.c b/drivers/media/video/cx25840/cx25840-core.c
index a897d6b7d708..07607264bd41 100644
--- a/drivers/media/video/cx25840/cx25840-core.c
+++ b/drivers/media/video/cx25840/cx25840-core.c
@@ -440,6 +440,9 @@ static int set_v4lctrl(struct i2c_client *client, struct v4l2_control *ctrl)
440 case V4L2_CID_AUDIO_BALANCE: 440 case V4L2_CID_AUDIO_BALANCE:
441 case V4L2_CID_AUDIO_MUTE: 441 case V4L2_CID_AUDIO_MUTE:
442 return cx25840_audio(client, VIDIOC_S_CTRL, ctrl); 442 return cx25840_audio(client, VIDIOC_S_CTRL, ctrl);
443
444 default:
445 return -EINVAL;
443 } 446 }
444 447
445 return 0; 448 return 0;
@@ -564,12 +567,8 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd,
564{ 567{
565 struct cx25840_state *state = i2c_get_clientdata(client); 568 struct cx25840_state *state = i2c_get_clientdata(client);
566 struct v4l2_tuner *vt = arg; 569 struct v4l2_tuner *vt = arg;
567 int result = 0;
568 570
569 switch (cmd) { 571 switch (cmd) {
570 case 0:
571 break;
572
573#ifdef CONFIG_VIDEO_ADV_DEBUG 572#ifdef CONFIG_VIDEO_ADV_DEBUG
574 /* ioctls to allow direct access to the 573 /* ioctls to allow direct access to the
575 * cx25840 registers for testing */ 574 * cx25840 registers for testing */
@@ -600,8 +599,7 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd,
600 return cx25840_vbi(client, cmd, arg); 599 return cx25840_vbi(client, cmd, arg);
601 600
602 case VIDIOC_INT_AUDIO_CLOCK_FREQ: 601 case VIDIOC_INT_AUDIO_CLOCK_FREQ:
603 result = cx25840_audio(client, cmd, arg); 602 return cx25840_audio(client, cmd, arg);
604 break;
605 603
606 case VIDIOC_STREAMON: 604 case VIDIOC_STREAMON:
607 cx25840_dbg("enable output\n"); 605 cx25840_dbg("enable output\n");
@@ -620,19 +618,21 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd,
620 break; 618 break;
621 619
622 case VIDIOC_G_CTRL: 620 case VIDIOC_G_CTRL:
623 result = get_v4lctrl(client, (struct v4l2_control *)arg); 621 return get_v4lctrl(client, (struct v4l2_control *)arg);
624 break;
625 622
626 case VIDIOC_S_CTRL: 623 case VIDIOC_S_CTRL:
627 result = set_v4lctrl(client, (struct v4l2_control *)arg); 624 return set_v4lctrl(client, (struct v4l2_control *)arg);
628 break;
629 625
630 case VIDIOC_G_STD: 626 case VIDIOC_G_STD:
631 *(v4l2_std_id *)arg = cx25840_get_v4lstd(client); 627 *(v4l2_std_id *)arg = cx25840_get_v4lstd(client);
632 break; 628 break;
633 629
634 case VIDIOC_S_STD: 630 case VIDIOC_S_STD:
635 result = set_v4lstd(client, *(v4l2_std_id *)arg); 631 state->radio = 0;
632 return set_v4lstd(client, *(v4l2_std_id *)arg);
633
634 case AUDC_SET_RADIO:
635 state->radio = 1;
636 break; 636 break;
637 637
638 case VIDIOC_G_INPUT: 638 case VIDIOC_G_INPUT:
@@ -640,15 +640,13 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd,
640 break; 640 break;
641 641
642 case VIDIOC_S_INPUT: 642 case VIDIOC_S_INPUT:
643 result = set_input(client, *(enum cx25840_video_input *)arg, state->aud_input); 643 return set_input(client, *(enum cx25840_video_input *)arg, state->aud_input);
644 break;
645 644
646 case VIDIOC_S_AUDIO: 645 case VIDIOC_S_AUDIO:
647 { 646 {
648 struct v4l2_audio *input = arg; 647 struct v4l2_audio *input = arg;
649 648
650 result = set_input(client, state->vid_input, input->index); 649 return set_input(client, state->vid_input, input->index);
651 break;
652 } 650 }
653 651
654 case VIDIOC_G_AUDIO: 652 case VIDIOC_G_AUDIO:
@@ -671,6 +669,9 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd,
671 u8 vpres = cx25840_read(client, 0x80a) & 0x10; 669 u8 vpres = cx25840_read(client, 0x80a) & 0x10;
672 int val = 0; 670 int val = 0;
673 671
672 if (state->radio)
673 break;
674
674 vt->capability |= 675 vt->capability |=
675 V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_LANG1 | 676 V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_LANG1 |
676 V4L2_TUNER_CAP_LANG2 | V4L2_TUNER_CAP_SAP; 677 V4L2_TUNER_CAP_LANG2 | V4L2_TUNER_CAP_SAP;
@@ -725,12 +726,10 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd,
725 break; 726 break;
726 727
727 case VIDIOC_G_FMT: 728 case VIDIOC_G_FMT:
728 result = get_v4lfmt(client, (struct v4l2_format *)arg); 729 return get_v4lfmt(client, (struct v4l2_format *)arg);
729 break;
730 730
731 case VIDIOC_S_FMT: 731 case VIDIOC_S_FMT:
732 result = set_v4lfmt(client, (struct v4l2_format *)arg); 732 return set_v4lfmt(client, (struct v4l2_format *)arg);
733 break;
734 733
735 case VIDIOC_INT_RESET: 734 case VIDIOC_INT_RESET:
736 cx25840_initialize(client, 0); 735 cx25840_initialize(client, 0);
@@ -742,11 +741,10 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd,
742 break; 741 break;
743 742
744 default: 743 default:
745 cx25840_err("invalid ioctl %x\n", cmd);
746 return -EINVAL; 744 return -EINVAL;
747 } 745 }
748 746
749 return result; 747 return 0;
750} 748}
751 749
752/* ----------------------------------------------------------------------- */ 750/* ----------------------------------------------------------------------- */
diff --git a/drivers/media/video/cx25840/cx25840.h b/drivers/media/video/cx25840/cx25840.h
index 3dc67e79c856..dc58d4292a34 100644
--- a/drivers/media/video/cx25840/cx25840.h
+++ b/drivers/media/video/cx25840/cx25840.h
@@ -89,6 +89,7 @@ enum cx25840_audio_input {
89 89
90struct cx25840_state { 90struct cx25840_state {
91 int pvr150_workaround; 91 int pvr150_workaround;
92 int radio;
92 enum cx25840_video_input vid_input; 93 enum cx25840_video_input vid_input;
93 enum cx25840_audio_input aud_input; 94 enum cx25840_audio_input aud_input;
94 u32 audclk_freq; 95 u32 audclk_freq;
diff --git a/drivers/media/video/saa7115.c b/drivers/media/video/saa7115.c
index 5d33d0922e79..9f550fd741d1 100644
--- a/drivers/media/video/saa7115.c
+++ b/drivers/media/video/saa7115.c
@@ -74,6 +74,7 @@ struct saa7115_state {
74 v4l2_std_id std; 74 v4l2_std_id std;
75 int input; 75 int input;
76 int enable; 76 int enable;
77 int radio;
77 int bright; 78 int bright;
78 int contrast; 79 int contrast;
79 int hue; 80 int hue;
@@ -634,6 +635,9 @@ static int saa7115_set_v4lctrl(struct i2c_client *client, struct v4l2_control *c
634 state->hue = ctrl->value; 635 state->hue = ctrl->value;
635 saa7115_write(client, 0x0d, state->hue); 636 saa7115_write(client, 0x0d, state->hue);
636 break; 637 break;
638
639 default:
640 return -EINVAL;
637 } 641 }
638 642
639 return 0; 643 return 0;
@@ -1043,6 +1047,8 @@ static int saa7115_command(struct i2c_client *client, unsigned int cmd, void *ar
1043 struct v4l2_tuner *vt = arg; 1047 struct v4l2_tuner *vt = arg;
1044 int status; 1048 int status;
1045 1049
1050 if (state->radio)
1051 break;
1046 status = saa7115_read(client, 0x1f); 1052 status = saa7115_read(client, 0x1f);
1047 1053
1048 saa7115_dbg("status: 0x%02x\n", status); 1054 saa7115_dbg("status: 0x%02x\n", status);
@@ -1065,9 +1071,14 @@ static int saa7115_command(struct i2c_client *client, unsigned int cmd, void *ar
1065 break; 1071 break;
1066 1072
1067 case VIDIOC_S_STD: 1073 case VIDIOC_S_STD:
1074 state->radio = 0;
1068 saa7115_set_v4lstd(client, *(v4l2_std_id *)arg); 1075 saa7115_set_v4lstd(client, *(v4l2_std_id *)arg);
1069 break; 1076 break;
1070 1077
1078 case AUDC_SET_RADIO:
1079 state->radio = 1;
1080 break;
1081
1071 case VIDIOC_G_INPUT: 1082 case VIDIOC_G_INPUT:
1072 *(int *)arg = state->input; 1083 *(int *)arg = state->input;
1073 break; 1084 break;
@@ -1230,6 +1241,7 @@ static int saa7115_attach(struct i2c_adapter *adapter, int address, int kind)
1230 state->std = V4L2_STD_NTSC; 1241 state->std = V4L2_STD_NTSC;
1231 state->input = -1; 1242 state->input = -1;
1232 state->enable = 1; 1243 state->enable = 1;
1244 state->radio = 0;
1233 state->bright = 128; 1245 state->bright = 128;
1234 state->contrast = 64; 1246 state->contrast = 64;
1235 state->hue = 0; 1247 state->hue = 0;