aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/tda9887.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/tda9887.c')
-rw-r--r--drivers/media/video/tda9887.c41
1 files changed, 36 insertions, 5 deletions
diff --git a/drivers/media/video/tda9887.c b/drivers/media/video/tda9887.c
index 7e6e6dd966a2..33d6ee6cde48 100644
--- a/drivers/media/video/tda9887.c
+++ b/drivers/media/video/tda9887.c
@@ -33,6 +33,7 @@ static unsigned short normal_i2c[] = {
33 0x96 >>1, 33 0x96 >>1,
34 I2C_CLIENT_END, 34 I2C_CLIENT_END,
35}; 35};
36static unsigned short normal_i2c_range[] = {I2C_CLIENT_END,I2C_CLIENT_END};
36I2C_CLIENT_INSMOD; 37I2C_CLIENT_INSMOD;
37 38
38/* insmod options */ 39/* insmod options */
@@ -53,6 +54,7 @@ struct tda9887 {
53 unsigned int config; 54 unsigned int config;
54 unsigned int pinnacle_id; 55 unsigned int pinnacle_id;
55 unsigned int using_v4l2; 56 unsigned int using_v4l2;
57 unsigned int radio_mode;
56}; 58};
57 59
58struct tvnorm { 60struct tvnorm {
@@ -212,12 +214,22 @@ static struct tvnorm tvnorms[] = {
212 } 214 }
213}; 215};
214 216
215static struct tvnorm radio = { 217static struct tvnorm radio_stereo = {
216 .name = "radio", 218 .name = "Radio Stereo",
219 .b = ( cFmRadio |
220 cQSS ),
221 .c = ( cDeemphasisOFF |
222 cAudioGain6 ),
223 .e = ( cAudioIF_5_5 |
224 cRadioIF_38_90 ),
225};
226
227static struct tvnorm radio_mono = {
228 .name = "Radio Mono",
217 .b = ( cFmRadio | 229 .b = ( cFmRadio |
218 cQSS ), 230 cQSS ),
219 .c = ( cDeemphasisON | 231 .c = ( cDeemphasisON |
220 cDeemphasis50 ), 232 cDeemphasis50),
221 .e = ( cAudioIF_5_5 | 233 .e = ( cAudioIF_5_5 |
222 cRadioIF_38_90 ), 234 cRadioIF_38_90 ),
223}; 235};
@@ -354,7 +366,10 @@ static int tda9887_set_tvnorm(struct tda9887 *t, char *buf)
354 int i; 366 int i;
355 367
356 if (t->radio) { 368 if (t->radio) {
357 norm = &radio; 369 if (t->radio_mode == V4L2_TUNER_MODE_MONO)
370 norm = &radio_mono;
371 else
372 norm = &radio_stereo;
358 } else { 373 } else {
359 for (i = 0; i < ARRAY_SIZE(tvnorms); i++) { 374 for (i = 0; i < ARRAY_SIZE(tvnorms); i++) {
360 if (tvnorms[i].std & t->std) { 375 if (tvnorms[i].std & t->std) {
@@ -545,11 +560,14 @@ static int tda9887_configure(struct tda9887 *t)
545 560
546 memset(buf,0,sizeof(buf)); 561 memset(buf,0,sizeof(buf));
547 tda9887_set_tvnorm(t,buf); 562 tda9887_set_tvnorm(t,buf);
563
548 buf[1] |= cOutputPort1Inactive; 564 buf[1] |= cOutputPort1Inactive;
549 buf[1] |= cOutputPort2Inactive; 565 buf[1] |= cOutputPort2Inactive;
566
550 if (UNSET != t->pinnacle_id) { 567 if (UNSET != t->pinnacle_id) {
551 tda9887_set_pinnacle(t,buf); 568 tda9887_set_pinnacle(t,buf);
552 } 569 }
570
553 tda9887_set_config(t,buf); 571 tda9887_set_config(t,buf);
554 tda9887_set_insmod(t,buf); 572 tda9887_set_insmod(t,buf);
555 573
@@ -592,9 +610,12 @@ static int tda9887_attach(struct i2c_adapter *adap, int addr, int kind)
592 if (NULL == (t = kmalloc(sizeof(*t), GFP_KERNEL))) 610 if (NULL == (t = kmalloc(sizeof(*t), GFP_KERNEL)))
593 return -ENOMEM; 611 return -ENOMEM;
594 memset(t,0,sizeof(*t)); 612 memset(t,0,sizeof(*t));
613
595 t->client = client_template; 614 t->client = client_template;
596 t->std = 0; 615 t->std = 0;
597 t->pinnacle_id = UNSET; 616 t->pinnacle_id = UNSET;
617 t->radio_mode = V4L2_TUNER_MODE_STEREO;
618
598 i2c_set_clientdata(&t->client, t); 619 i2c_set_clientdata(&t->client, t);
599 i2c_attach_client(&t->client); 620 i2c_attach_client(&t->client);
600 621
@@ -733,6 +754,16 @@ tda9887_command(struct i2c_client *client, unsigned int cmd, void *arg)
733 } 754 }
734 break; 755 break;
735 } 756 }
757 case VIDIOC_S_TUNER:
758 {
759 struct v4l2_tuner* tuner = arg;
760
761 if (t->radio) {
762 t->radio_mode = tuner->audmode;
763 tda9887_configure (t);
764 }
765 break;
766 }
736 default: 767 default:
737 /* nothing */ 768 /* nothing */
738 break; 769 break;
@@ -740,7 +771,7 @@ tda9887_command(struct i2c_client *client, unsigned int cmd, void *arg)
740 return 0; 771 return 0;
741} 772}
742 773
743static int tda9887_suspend(struct device * dev, pm_message_t state, u32 level) 774static int tda9887_suspend(struct device * dev, u32 state, u32 level)
744{ 775{
745 dprintk("tda9887: suspend\n"); 776 dprintk("tda9887: suspend\n");
746 return 0; 777 return 0;