aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/tvaudio.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/tvaudio.c')
-rw-r--r--drivers/media/video/tvaudio.c306
1 files changed, 178 insertions, 128 deletions
diff --git a/drivers/media/video/tvaudio.c b/drivers/media/video/tvaudio.c
index a19cdcc17ef7..bb510dd5ddab 100644
--- a/drivers/media/video/tvaudio.c
+++ b/drivers/media/video/tvaudio.c
@@ -307,14 +307,16 @@ static void generic_checkmode(struct CHIPSTATE *chip)
307 v4l_dbg(1, debug, &chip->c, "%s: thread checkmode\n", chip->c.name); 307 v4l_dbg(1, debug, &chip->c, "%s: thread checkmode\n", chip->c.name);
308 chip->prevmode = mode; 308 chip->prevmode = mode;
309 309
310 if (mode & VIDEO_SOUND_STEREO) 310 if (mode & V4L2_TUNER_MODE_STEREO)
311 desc->setmode(chip,VIDEO_SOUND_STEREO); 311 desc->setmode(chip,V4L2_TUNER_MODE_STEREO);
312 else if (mode & VIDEO_SOUND_LANG1) 312 if (mode & V4L2_TUNER_MODE_LANG1_LANG2)
313 desc->setmode(chip,VIDEO_SOUND_LANG1); 313 desc->setmode(chip,V4L2_TUNER_MODE_STEREO);
314 else if (mode & VIDEO_SOUND_LANG2) 314 else if (mode & V4L2_TUNER_MODE_LANG1)
315 desc->setmode(chip,VIDEO_SOUND_LANG2); 315 desc->setmode(chip,V4L2_TUNER_MODE_LANG1);
316 else if (mode & V4L2_TUNER_MODE_LANG2)
317 desc->setmode(chip,V4L2_TUNER_MODE_LANG2);
316 else 318 else
317 desc->setmode(chip,VIDEO_SOUND_MONO); 319 desc->setmode(chip,V4L2_TUNER_MODE_MONO);
318} 320}
319 321
320/* ---------------------------------------------------------------------- */ 322/* ---------------------------------------------------------------------- */
@@ -345,11 +347,11 @@ static int tda9840_getmode(struct CHIPSTATE *chip)
345 int val, mode; 347 int val, mode;
346 348
347 val = chip_read(chip); 349 val = chip_read(chip);
348 mode = VIDEO_SOUND_MONO; 350 mode = V4L2_TUNER_MODE_MONO;
349 if (val & TDA9840_DS_DUAL) 351 if (val & TDA9840_DS_DUAL)
350 mode |= VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2; 352 mode |= V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
351 if (val & TDA9840_ST_STEREO) 353 if (val & TDA9840_ST_STEREO)
352 mode |= VIDEO_SOUND_STEREO; 354 mode |= V4L2_TUNER_MODE_STEREO;
353 355
354 v4l_dbg(1, debug, &chip->c, "tda9840_getmode(): raw chip read: %d, return: %d\n", 356 v4l_dbg(1, debug, &chip->c, "tda9840_getmode(): raw chip read: %d, return: %d\n",
355 val, mode); 357 val, mode);
@@ -362,16 +364,16 @@ static void tda9840_setmode(struct CHIPSTATE *chip, int mode)
362 int t = chip->shadow.bytes[TDA9840_SW + 1] & ~0x7e; 364 int t = chip->shadow.bytes[TDA9840_SW + 1] & ~0x7e;
363 365
364 switch (mode) { 366 switch (mode) {
365 case VIDEO_SOUND_MONO: 367 case V4L2_TUNER_MODE_MONO:
366 t |= TDA9840_MONO; 368 t |= TDA9840_MONO;
367 break; 369 break;
368 case VIDEO_SOUND_STEREO: 370 case V4L2_TUNER_MODE_STEREO:
369 t |= TDA9840_STEREO; 371 t |= TDA9840_STEREO;
370 break; 372 break;
371 case VIDEO_SOUND_LANG1: 373 case V4L2_TUNER_MODE_LANG1:
372 t |= TDA9840_DUALA; 374 t |= TDA9840_DUALA;
373 break; 375 break;
374 case VIDEO_SOUND_LANG2: 376 case V4L2_TUNER_MODE_LANG2:
375 t |= TDA9840_DUALB; 377 t |= TDA9840_DUALB;
376 break; 378 break;
377 default: 379 default:
@@ -502,7 +504,7 @@ static int tda985x_getmode(struct CHIPSTATE *chip)
502 chip_read(chip)) >> 4; 504 chip_read(chip)) >> 4;
503 /* Add mono mode regardless of SAP and stereo */ 505 /* Add mono mode regardless of SAP and stereo */
504 /* Allows forced mono */ 506 /* Allows forced mono */
505 return mode | VIDEO_SOUND_MONO; 507 return mode | V4L2_TUNER_MODE_MONO;
506} 508}
507 509
508static void tda985x_setmode(struct CHIPSTATE *chip, int mode) 510static void tda985x_setmode(struct CHIPSTATE *chip, int mode)
@@ -511,13 +513,13 @@ static void tda985x_setmode(struct CHIPSTATE *chip, int mode)
511 int c6 = chip->shadow.bytes[TDA985x_C6+1] & 0x3f; 513 int c6 = chip->shadow.bytes[TDA985x_C6+1] & 0x3f;
512 514
513 switch (mode) { 515 switch (mode) {
514 case VIDEO_SOUND_MONO: 516 case V4L2_TUNER_MODE_MONO:
515 c6 |= TDA985x_MONO; 517 c6 |= TDA985x_MONO;
516 break; 518 break;
517 case VIDEO_SOUND_STEREO: 519 case V4L2_TUNER_MODE_STEREO:
518 c6 |= TDA985x_STEREO; 520 c6 |= TDA985x_STEREO;
519 break; 521 break;
520 case VIDEO_SOUND_LANG1: 522 case V4L2_TUNER_MODE_LANG1:
521 c6 |= TDA985x_SAP; 523 c6 |= TDA985x_SAP;
522 break; 524 break;
523 default: 525 default:
@@ -650,11 +652,11 @@ static int tda9873_getmode(struct CHIPSTATE *chip)
650 int val,mode; 652 int val,mode;
651 653
652 val = chip_read(chip); 654 val = chip_read(chip);
653 mode = VIDEO_SOUND_MONO; 655 mode = V4L2_TUNER_MODE_MONO;
654 if (val & TDA9873_STEREO) 656 if (val & TDA9873_STEREO)
655 mode |= VIDEO_SOUND_STEREO; 657 mode |= V4L2_TUNER_MODE_STEREO;
656 if (val & TDA9873_DUAL) 658 if (val & TDA9873_DUAL)
657 mode |= VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2; 659 mode |= V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
658 v4l_dbg(1, debug, &chip->c, "tda9873_getmode(): raw chip read: %d, return: %d\n", 660 v4l_dbg(1, debug, &chip->c, "tda9873_getmode(): raw chip read: %d, return: %d\n",
659 val, mode); 661 val, mode);
660 return mode; 662 return mode;
@@ -674,16 +676,16 @@ static void tda9873_setmode(struct CHIPSTATE *chip, int mode)
674 v4l_dbg(1, debug, &chip->c, "tda9873_setmode(): sw_data = %d\n", sw_data); 676 v4l_dbg(1, debug, &chip->c, "tda9873_setmode(): sw_data = %d\n", sw_data);
675 677
676 switch (mode) { 678 switch (mode) {
677 case VIDEO_SOUND_MONO: 679 case V4L2_TUNER_MODE_MONO:
678 sw_data |= TDA9873_TR_MONO; 680 sw_data |= TDA9873_TR_MONO;
679 break; 681 break;
680 case VIDEO_SOUND_STEREO: 682 case V4L2_TUNER_MODE_STEREO:
681 sw_data |= TDA9873_TR_STEREO; 683 sw_data |= TDA9873_TR_STEREO;
682 break; 684 break;
683 case VIDEO_SOUND_LANG1: 685 case V4L2_TUNER_MODE_LANG1:
684 sw_data |= TDA9873_TR_DUALA; 686 sw_data |= TDA9873_TR_DUALA;
685 break; 687 break;
686 case VIDEO_SOUND_LANG2: 688 case V4L2_TUNER_MODE_LANG2:
687 sw_data |= TDA9873_TR_DUALB; 689 sw_data |= TDA9873_TR_DUALB;
688 break; 690 break;
689 default: 691 default:
@@ -841,7 +843,7 @@ static int tda9874a_getmode(struct CHIPSTATE *chip)
841 int dsr,nsr,mode; 843 int dsr,nsr,mode;
842 int necr; /* just for debugging */ 844 int necr; /* just for debugging */
843 845
844 mode = VIDEO_SOUND_MONO; 846 mode = V4L2_TUNER_MODE_MONO;
845 847
846 if(-1 == (dsr = chip_read2(chip,TDA9874A_DSR))) 848 if(-1 == (dsr = chip_read2(chip,TDA9874A_DSR)))
847 return mode; 849 return mode;
@@ -860,18 +862,18 @@ static int tda9874a_getmode(struct CHIPSTATE *chip)
860 * that sound has (temporarily) switched from NICAM to 862 * that sound has (temporarily) switched from NICAM to
861 * mono FM (or AM) on 1st sound carrier due to high NICAM bit 863 * mono FM (or AM) on 1st sound carrier due to high NICAM bit
862 * error count. So in fact there is no stereo in this case :-( 864 * error count. So in fact there is no stereo in this case :-(
863 * But changing the mode to VIDEO_SOUND_MONO would switch 865 * But changing the mode to V4L2_TUNER_MODE_MONO would switch
864 * external 4052 multiplexer in audio_hook(). 866 * external 4052 multiplexer in audio_hook().
865 */ 867 */
866 if(nsr & 0x02) /* NSR.S/MB=1 */ 868 if(nsr & 0x02) /* NSR.S/MB=1 */
867 mode |= VIDEO_SOUND_STEREO; 869 mode |= V4L2_TUNER_MODE_STEREO;
868 if(nsr & 0x01) /* NSR.D/SB=1 */ 870 if(nsr & 0x01) /* NSR.D/SB=1 */
869 mode |= VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2; 871 mode |= V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
870 } else { 872 } else {
871 if(dsr & 0x02) /* DSR.IDSTE=1 */ 873 if(dsr & 0x02) /* DSR.IDSTE=1 */
872 mode |= VIDEO_SOUND_STEREO; 874 mode |= V4L2_TUNER_MODE_STEREO;
873 if(dsr & 0x04) /* DSR.IDDUA=1 */ 875 if(dsr & 0x04) /* DSR.IDDUA=1 */
874 mode |= VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2; 876 mode |= V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
875 } 877 }
876 878
877 v4l_dbg(1, debug, &chip->c, "tda9874a_getmode(): DSR=0x%X, NSR=0x%X, NECR=0x%X, return: %d.\n", 879 v4l_dbg(1, debug, &chip->c, "tda9874a_getmode(): DSR=0x%X, NSR=0x%X, NECR=0x%X, return: %d.\n",
@@ -902,14 +904,14 @@ static void tda9874a_setmode(struct CHIPSTATE *chip, int mode)
902 int mdacosr = (tda9874a_mode) ? 0x82:0x80; 904 int mdacosr = (tda9874a_mode) ? 0x82:0x80;
903 905
904 switch(mode) { 906 switch(mode) {
905 case VIDEO_SOUND_MONO: 907 case V4L2_TUNER_MODE_MONO:
906 case VIDEO_SOUND_STEREO: 908 case V4L2_TUNER_MODE_STEREO:
907 break; 909 break;
908 case VIDEO_SOUND_LANG1: 910 case V4L2_TUNER_MODE_LANG1:
909 aosr = 0x80; /* auto-select, dual A/A */ 911 aosr = 0x80; /* auto-select, dual A/A */
910 mdacosr = (tda9874a_mode) ? 0x82:0x80; 912 mdacosr = (tda9874a_mode) ? 0x82:0x80;
911 break; 913 break;
912 case VIDEO_SOUND_LANG2: 914 case V4L2_TUNER_MODE_LANG2:
913 aosr = 0xa0; /* auto-select, dual B/B */ 915 aosr = 0xa0; /* auto-select, dual B/B */
914 mdacosr = (tda9874a_mode) ? 0x83:0x81; 916 mdacosr = (tda9874a_mode) ? 0x83:0x81;
915 break; 917 break;
@@ -927,11 +929,11 @@ static void tda9874a_setmode(struct CHIPSTATE *chip, int mode)
927 int fmmr,aosr; 929 int fmmr,aosr;
928 930
929 switch(mode) { 931 switch(mode) {
930 case VIDEO_SOUND_MONO: 932 case V4L2_TUNER_MODE_MONO:
931 fmmr = 0x00; /* mono */ 933 fmmr = 0x00; /* mono */
932 aosr = 0x10; /* A/A */ 934 aosr = 0x10; /* A/A */
933 break; 935 break;
934 case VIDEO_SOUND_STEREO: 936 case V4L2_TUNER_MODE_STEREO:
935 if(tda9874a_mode) { 937 if(tda9874a_mode) {
936 fmmr = 0x00; 938 fmmr = 0x00;
937 aosr = 0x00; /* handled by NICAM auto-mute */ 939 aosr = 0x00; /* handled by NICAM auto-mute */
@@ -940,11 +942,11 @@ static void tda9874a_setmode(struct CHIPSTATE *chip, int mode)
940 aosr = 0x00; 942 aosr = 0x00;
941 } 943 }
942 break; 944 break;
943 case VIDEO_SOUND_LANG1: 945 case V4L2_TUNER_MODE_LANG1:
944 fmmr = 0x02; /* dual */ 946 fmmr = 0x02; /* dual */
945 aosr = 0x10; /* dual A/A */ 947 aosr = 0x10; /* dual A/A */
946 break; 948 break;
947 case VIDEO_SOUND_LANG2: 949 case V4L2_TUNER_MODE_LANG2:
948 fmmr = 0x02; /* dual */ 950 fmmr = 0x02; /* dual */
949 aosr = 0x20; /* dual B/B */ 951 aosr = 0x20; /* dual B/B */
950 break; 952 break;
@@ -1105,20 +1107,20 @@ static void tda8425_setmode(struct CHIPSTATE *chip, int mode)
1105{ 1107{
1106 int s1 = chip->shadow.bytes[TDA8425_S1+1] & 0xe1; 1108 int s1 = chip->shadow.bytes[TDA8425_S1+1] & 0xe1;
1107 1109
1108 if (mode & VIDEO_SOUND_LANG1) { 1110 if (mode & V4L2_TUNER_MODE_LANG1) {
1109 s1 |= TDA8425_S1_ML_SOUND_A; 1111 s1 |= TDA8425_S1_ML_SOUND_A;
1110 s1 |= TDA8425_S1_STEREO_PSEUDO; 1112 s1 |= TDA8425_S1_STEREO_PSEUDO;
1111 1113
1112 } else if (mode & VIDEO_SOUND_LANG2) { 1114 } else if (mode & V4L2_TUNER_MODE_LANG2) {
1113 s1 |= TDA8425_S1_ML_SOUND_B; 1115 s1 |= TDA8425_S1_ML_SOUND_B;
1114 s1 |= TDA8425_S1_STEREO_PSEUDO; 1116 s1 |= TDA8425_S1_STEREO_PSEUDO;
1115 1117
1116 } else { 1118 } else {
1117 s1 |= TDA8425_S1_ML_STEREO; 1119 s1 |= TDA8425_S1_ML_STEREO;
1118 1120
1119 if (mode & VIDEO_SOUND_MONO) 1121 if (mode & V4L2_TUNER_MODE_MONO)
1120 s1 |= TDA8425_S1_STEREO_MONO; 1122 s1 |= TDA8425_S1_STEREO_MONO;
1121 if (mode & VIDEO_SOUND_STEREO) 1123 if (mode & V4L2_TUNER_MODE_STEREO)
1122 s1 |= TDA8425_S1_STEREO_SPATIAL; 1124 s1 |= TDA8425_S1_STEREO_SPATIAL;
1123 } 1125 }
1124 chip_write(chip,TDA8425_S1,s1); 1126 chip_write(chip,TDA8425_S1,s1);
@@ -1177,11 +1179,11 @@ static int ta8874z_getmode(struct CHIPSTATE *chip)
1177 int val, mode; 1179 int val, mode;
1178 1180
1179 val = chip_read(chip); 1181 val = chip_read(chip);
1180 mode = VIDEO_SOUND_MONO; 1182 mode = V4L2_TUNER_MODE_MONO;
1181 if (val & TA8874Z_B1){ 1183 if (val & TA8874Z_B1){
1182 mode |= VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2; 1184 mode |= V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
1183 }else if (!(val & TA8874Z_B0)){ 1185 }else if (!(val & TA8874Z_B0)){
1184 mode |= VIDEO_SOUND_STEREO; 1186 mode |= V4L2_TUNER_MODE_STEREO;
1185 } 1187 }
1186 /* v4l_dbg(1, debug, &chip->c, "ta8874z_getmode(): raw chip read: 0x%02x, return: 0x%02x\n", val, mode); */ 1188 /* v4l_dbg(1, debug, &chip->c, "ta8874z_getmode(): raw chip read: 0x%02x, return: 0x%02x\n", val, mode); */
1187 return mode; 1189 return mode;
@@ -1199,16 +1201,16 @@ static void ta8874z_setmode(struct CHIPSTATE *chip, int mode)
1199 v4l_dbg(1, debug, &chip->c, "ta8874z_setmode(): mode: 0x%02x\n", mode); 1201 v4l_dbg(1, debug, &chip->c, "ta8874z_setmode(): mode: 0x%02x\n", mode);
1200 1202
1201 switch(mode){ 1203 switch(mode){
1202 case VIDEO_SOUND_MONO: 1204 case V4L2_TUNER_MODE_MONO:
1203 t = &ta8874z_mono; 1205 t = &ta8874z_mono;
1204 break; 1206 break;
1205 case VIDEO_SOUND_STEREO: 1207 case V4L2_TUNER_MODE_STEREO:
1206 t = &ta8874z_stereo; 1208 t = &ta8874z_stereo;
1207 break; 1209 break;
1208 case VIDEO_SOUND_LANG1: 1210 case V4L2_TUNER_MODE_LANG1:
1209 t = &ta8874z_main; 1211 t = &ta8874z_main;
1210 break; 1212 break;
1211 case VIDEO_SOUND_LANG2: 1213 case V4L2_TUNER_MODE_LANG2:
1212 t = &ta8874z_sub; 1214 t = &ta8874z_sub;
1213 break; 1215 break;
1214 default: 1216 default:
@@ -1570,7 +1572,48 @@ static int chip_detach(struct i2c_client *client)
1570 return 0; 1572 return 0;
1571} 1573}
1572 1574
1573static int tvaudio_set_ctrl(struct CHIPSTATE *chip, struct v4l2_control *ctrl) 1575static int tvaudio_get_ctrl(struct CHIPSTATE *chip,
1576 struct v4l2_control *ctrl)
1577{
1578 struct CHIPDESC *desc = chiplist + chip->type;
1579
1580 switch (ctrl->id) {
1581 case V4L2_CID_AUDIO_MUTE:
1582 ctrl->value=chip->muted;
1583 return 0;
1584 case V4L2_CID_AUDIO_VOLUME:
1585 if (!desc->flags & CHIP_HAS_VOLUME)
1586 break;
1587 ctrl->value = max(chip->left,chip->right);
1588 return 0;
1589 case V4L2_CID_AUDIO_BALANCE:
1590 {
1591 int volume;
1592 if (!desc->flags & CHIP_HAS_VOLUME)
1593 break;
1594 volume = max(chip->left,chip->right);
1595 if (volume)
1596 ctrl->value=(32768*min(chip->left,chip->right))/volume;
1597 else
1598 ctrl->value=32768;
1599 return 0;
1600 }
1601 case V4L2_CID_AUDIO_BASS:
1602 if (desc->flags & CHIP_HAS_BASSTREBLE)
1603 break;
1604 ctrl->value = chip->bass;
1605 return 0;
1606 case V4L2_CID_AUDIO_TREBLE:
1607 if (desc->flags & CHIP_HAS_BASSTREBLE)
1608 return -EINVAL;
1609 ctrl->value = chip->treble;
1610 return 0;
1611 }
1612 return -EINVAL;
1613}
1614
1615static int tvaudio_set_ctrl(struct CHIPSTATE *chip,
1616 struct v4l2_control *ctrl)
1574{ 1617{
1575 struct CHIPDESC *desc = chiplist + chip->type; 1618 struct CHIPDESC *desc = chiplist + chip->type;
1576 1619
@@ -1584,11 +1627,60 @@ static int tvaudio_set_ctrl(struct CHIPSTATE *chip, struct v4l2_control *ctrl)
1584 else 1627 else
1585 chip_write_masked(chip,desc->inputreg, 1628 chip_write_masked(chip,desc->inputreg,
1586 desc->inputmap[chip->input],desc->inputmask); 1629 desc->inputmap[chip->input],desc->inputmask);
1587 break; 1630 return 0;
1588 default: 1631 case V4L2_CID_AUDIO_VOLUME:
1589 return -EINVAL; 1632 {
1633 int volume,balance;
1634
1635 if (!desc->flags & CHIP_HAS_VOLUME)
1636 break;
1637
1638 volume = max(chip->left,chip->right);
1639 if (volume)
1640 balance=(32768*min(chip->left,chip->right))/volume;
1641 else
1642 balance=32768;
1643
1644 volume=ctrl->value;
1645 chip->left = (min(65536 - balance,32768) * volume) / 32768;
1646 chip->right = (min(balance,volume *(__u16)32768)) / 32768;
1647
1648 chip_write(chip,desc->leftreg,desc->volfunc(chip->left));
1649 chip_write(chip,desc->rightreg,desc->volfunc(chip->right));
1650
1651 return 0;
1590 } 1652 }
1591 return 0; 1653 case V4L2_CID_AUDIO_BALANCE:
1654 {
1655 int volume, balance;
1656 if (!desc->flags & CHIP_HAS_VOLUME)
1657 break;
1658
1659 volume = max(chip->left,chip->right);
1660 balance = ctrl->value;
1661
1662 chip_write(chip,desc->leftreg,desc->volfunc(chip->left));
1663 chip_write(chip,desc->rightreg,desc->volfunc(chip->right));
1664
1665 return 0;
1666 }
1667 case V4L2_CID_AUDIO_BASS:
1668 if (desc->flags & CHIP_HAS_BASSTREBLE)
1669 break;
1670 chip->bass = ctrl->value;
1671 chip_write(chip,desc->bassreg,desc->bassfunc(chip->bass));
1672
1673 return 0;
1674 case V4L2_CID_AUDIO_TREBLE:
1675 if (desc->flags & CHIP_HAS_BASSTREBLE)
1676 return -EINVAL;
1677
1678 chip->treble = ctrl->value;
1679 chip_write(chip,desc->treblereg,desc->treblefunc(chip->treble));
1680
1681 return 0;
1682 }
1683 return -EINVAL;
1592} 1684}
1593 1685
1594 1686
@@ -1609,67 +1701,36 @@ static int chip_command(struct i2c_client *client,
1609 chip->watch_stereo = 0; 1701 chip->watch_stereo = 0;
1610 /* del_timer(&chip->wt); */ 1702 /* del_timer(&chip->wt); */
1611 break; 1703 break;
1612
1613 /* --- v4l ioctls --- */ 1704 /* --- v4l ioctls --- */
1614 /* take care: bttv does userspace copying, we'll get a 1705 /* take care: bttv does userspace copying, we'll get a
1615 kernel pointer here... */ 1706 kernel pointer here... */
1616 case VIDIOCGAUDIO: 1707 case VIDIOC_QUERYCTRL:
1617 {
1618 struct video_audio *va = arg;
1619
1620 if (desc->flags & CHIP_HAS_VOLUME) {
1621 va->flags |= VIDEO_AUDIO_VOLUME;
1622 va->volume = max(chip->left,chip->right);
1623 if (va->volume)
1624 va->balance = (32768*min(chip->left,chip->right))/
1625 va->volume;
1626 else
1627 va->balance = 32768;
1628 }
1629 if (desc->flags & CHIP_HAS_BASSTREBLE) {
1630 va->flags |= VIDEO_AUDIO_BASS | VIDEO_AUDIO_TREBLE;
1631 va->bass = chip->bass;
1632 va->treble = chip->treble;
1633 }
1634 if (!chip->radio) {
1635 if (desc->getmode)
1636 va->mode = desc->getmode(chip);
1637 else
1638 va->mode = VIDEO_SOUND_MONO;
1639 }
1640 break;
1641 }
1642
1643 case VIDIOCSAUDIO:
1644 { 1708 {
1645 struct video_audio *va = arg; 1709 struct v4l2_queryctrl *qc = arg;
1646 1710
1647 if (desc->flags & CHIP_HAS_VOLUME) { 1711 switch (qc->id) {
1648 chip->left = (min(65536 - va->balance,32768) * 1712 case V4L2_CID_AUDIO_MUTE:
1649 va->volume) / 32768; 1713 break;
1650 chip->right = (min(va->balance,(__u16)32768) * 1714 case V4L2_CID_AUDIO_VOLUME:
1651 va->volume) / 32768; 1715 case V4L2_CID_AUDIO_BALANCE:
1652 chip_write(chip,desc->leftreg,desc->volfunc(chip->left)); 1716 if (!desc->flags & CHIP_HAS_VOLUME)
1653 chip_write(chip,desc->rightreg,desc->volfunc(chip->right)); 1717 return -EINVAL;
1654 } 1718 break;
1655 if (desc->flags & CHIP_HAS_BASSTREBLE) { 1719 case V4L2_CID_AUDIO_BASS:
1656 chip->bass = va->bass; 1720 case V4L2_CID_AUDIO_TREBLE:
1657 chip->treble = va->treble; 1721 if (desc->flags & CHIP_HAS_BASSTREBLE)
1658 chip_write(chip,desc->bassreg,desc->bassfunc(chip->bass)); 1722 return -EINVAL;
1659 chip_write(chip,desc->treblereg,desc->treblefunc(chip->treble)); 1723 break;
1660 } 1724 default:
1661 if (desc->setmode && va->mode) { 1725 return -EINVAL;
1662 chip->watch_stereo = 0;
1663 /* del_timer(&chip->wt); */
1664 chip->mode = va->mode;
1665 desc->setmode(chip,va->mode);
1666 } 1726 }
1667 break; 1727 return v4l2_ctrl_query_fill_std(qc);
1668 } 1728 }
1669
1670 case VIDIOC_S_CTRL: 1729 case VIDIOC_S_CTRL:
1671 return tvaudio_set_ctrl(chip, arg); 1730 return tvaudio_set_ctrl(chip, arg);
1672 1731
1732 case VIDIOC_G_CTRL:
1733 return tvaudio_get_ctrl(chip, arg);
1673 case VIDIOC_INT_G_AUDIO_ROUTING: 1734 case VIDIOC_INT_G_AUDIO_ROUTING:
1674 { 1735 {
1675 struct v4l2_routing *rt = arg; 1736 struct v4l2_routing *rt = arg;
@@ -1678,7 +1739,6 @@ static int chip_command(struct i2c_client *client,
1678 rt->output = 0; 1739 rt->output = 0;
1679 break; 1740 break;
1680 } 1741 }
1681
1682 case VIDIOC_INT_S_AUDIO_ROUTING: 1742 case VIDIOC_INT_S_AUDIO_ROUTING:
1683 { 1743 {
1684 struct v4l2_routing *rt = arg; 1744 struct v4l2_routing *rt = arg;
@@ -1693,7 +1753,6 @@ static int chip_command(struct i2c_client *client,
1693 desc->inputmap[chip->input], desc->inputmask); 1753 desc->inputmap[chip->input], desc->inputmask);
1694 break; 1754 break;
1695 } 1755 }
1696
1697 case VIDIOC_S_TUNER: 1756 case VIDIOC_S_TUNER:
1698 { 1757 {
1699 struct v4l2_tuner *vt = arg; 1758 struct v4l2_tuner *vt = arg;
@@ -1703,17 +1762,13 @@ static int chip_command(struct i2c_client *client,
1703 break; 1762 break;
1704 switch (vt->audmode) { 1763 switch (vt->audmode) {
1705 case V4L2_TUNER_MODE_MONO: 1764 case V4L2_TUNER_MODE_MONO:
1706 mode = VIDEO_SOUND_MONO;
1707 break;
1708 case V4L2_TUNER_MODE_STEREO: 1765 case V4L2_TUNER_MODE_STEREO:
1709 case V4L2_TUNER_MODE_LANG1_LANG2:
1710 mode = VIDEO_SOUND_STEREO;
1711 break;
1712 case V4L2_TUNER_MODE_LANG1: 1766 case V4L2_TUNER_MODE_LANG1:
1713 mode = VIDEO_SOUND_LANG1;
1714 break;
1715 case V4L2_TUNER_MODE_LANG2: 1767 case V4L2_TUNER_MODE_LANG2:
1716 mode = VIDEO_SOUND_LANG2; 1768 mode = vt->audmode;
1769 break;
1770 case V4L2_TUNER_MODE_LANG1_LANG2:
1771 mode = V4L2_TUNER_MODE_STEREO;
1717 break; 1772 break;
1718 default: 1773 default:
1719 return -EINVAL; 1774 return -EINVAL;
@@ -1728,11 +1783,10 @@ static int chip_command(struct i2c_client *client,
1728 } 1783 }
1729 break; 1784 break;
1730 } 1785 }
1731
1732 case VIDIOC_G_TUNER: 1786 case VIDIOC_G_TUNER:
1733 { 1787 {
1734 struct v4l2_tuner *vt = arg; 1788 struct v4l2_tuner *vt = arg;
1735 int mode = VIDEO_SOUND_MONO; 1789 int mode = V4L2_TUNER_MODE_MONO;
1736 1790
1737 if (chip->radio) 1791 if (chip->radio)
1738 break; 1792 break;
@@ -1744,30 +1798,26 @@ static int chip_command(struct i2c_client *client,
1744 if (desc->getmode) 1798 if (desc->getmode)
1745 mode = desc->getmode(chip); 1799 mode = desc->getmode(chip);
1746 1800
1747 if (mode & VIDEO_SOUND_MONO) 1801 if (mode & V4L2_TUNER_MODE_MONO)
1748 vt->rxsubchans |= V4L2_TUNER_SUB_MONO; 1802 vt->rxsubchans |= V4L2_TUNER_SUB_MONO;
1749 if (mode & VIDEO_SOUND_STEREO) 1803 if (mode & V4L2_TUNER_MODE_STEREO)
1750 vt->rxsubchans |= V4L2_TUNER_SUB_STEREO; 1804 vt->rxsubchans |= V4L2_TUNER_SUB_STEREO;
1751 /* Note: for SAP it should be mono/lang2 or stereo/lang2. 1805 /* Note: for SAP it should be mono/lang2 or stereo/lang2.
1752 When this module is converted fully to v4l2, then this 1806 When this module is converted fully to v4l2, then this
1753 should change for those chips that can detect SAP. */ 1807 should change for those chips that can detect SAP. */
1754 if (mode & VIDEO_SOUND_LANG1) 1808 if (mode & V4L2_TUNER_MODE_LANG1)
1755 vt->rxsubchans = V4L2_TUNER_SUB_LANG1 | 1809 vt->rxsubchans = V4L2_TUNER_SUB_LANG1 |
1756 V4L2_TUNER_SUB_LANG2; 1810 V4L2_TUNER_SUB_LANG2;
1757 break; 1811 break;
1758 } 1812 }
1759
1760 case VIDIOCSCHAN:
1761 case VIDIOC_S_STD: 1813 case VIDIOC_S_STD:
1762 chip->radio = 0; 1814 chip->radio = 0;
1763 break; 1815 break;
1764
1765 case VIDIOCSFREQ:
1766 case VIDIOC_S_FREQUENCY: 1816 case VIDIOC_S_FREQUENCY:
1767 chip->mode = 0; /* automatic */ 1817 chip->mode = 0; /* automatic */
1768 if (desc->checkmode) { 1818 if (desc->checkmode) {
1769 desc->setmode(chip,VIDEO_SOUND_MONO); 1819 desc->setmode(chip,V4L2_TUNER_MODE_MONO);
1770 if (chip->prevmode != VIDEO_SOUND_MONO) 1820 if (chip->prevmode != V4L2_TUNER_MODE_MONO)
1771 chip->prevmode = -1; /* reset previous mode */ 1821 chip->prevmode = -1; /* reset previous mode */
1772 mod_timer(&chip->wt, jiffies+msecs_to_jiffies(2000)); 1822 mod_timer(&chip->wt, jiffies+msecs_to_jiffies(2000));
1773 /* the thread will call checkmode() later */ 1823 /* the thread will call checkmode() later */