Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6

* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6:
V4L/DVB (9624): CVE-2008-5033: fix OOPS on tvaudio when controlling bass/treble
V4L/DVB (9623): tvaudio: Improve debug msg by printing something more human
V4L/DVB (9622): tvaudio: Improve comments and remove a unneeded prototype
V4L/DVB (9621): Avoid writing outside shadow.bytes[] array
V4L/DVB (9620): tvaudio: use a direct reference for chip description
V4L/DVB (9619): tvaudio: update initial comments
V4L/DVB (9618): tvaudio: add additional logic to avoid OOPS
V4L/DVB (9617): tvtime: remove generic_checkmode callback
V4L/DVB (9616): tvaudio: cleanup - group all callbacks together
V4L/DVB (9615): tvaudio: instead of using a magic number, use ARRAY_SIZE
V4L/DVB (9613): tvaudio: fix a memory leak

+149 -82
+149 -82
drivers/media/video/tvaudio.c
··· 1 /* 2 - * experimental driver for simple i2c audio chips. 3 * 4 * Copyright (c) 2000 Gerd Knorr 5 * based on code by: 6 * Eric Sandeen (eric_sandeen@bigfoot.com) 7 * Steve VanDeBogart (vandebo@uclink.berkeley.edu) 8 * Greg Alexander (galexand@acm.org) 9 * 10 * This code is placed under the terms of the GNU General Public License 11 * ··· 34 35 #include <media/tvaudio.h> 36 #include <media/v4l2-common.h> 37 #include <media/v4l2-chip-ident.h> 38 #include <media/v4l2-i2c-drv-legacy.h> 39 ··· 63 typedef int (*initialize)(struct CHIPSTATE*); 64 typedef int (*getmode)(struct CHIPSTATE*); 65 typedef void (*setmode)(struct CHIPSTATE*, int mode); 66 - typedef void (*checkmode)(struct CHIPSTATE*); 67 68 /* i2c command */ 69 typedef struct AUDIOCMD { ··· 83 #define CHIP_HAS_VOLUME 1 84 #define CHIP_HAS_BASSTREBLE 2 85 #define CHIP_HAS_INPUTSEL 4 86 87 /* various i2c command sequences */ 88 audiocmd init; ··· 101 getmode getmode; 102 setmode setmode; 103 104 - /* check / autoswitch audio after channel switches */ 105 - checkmode checkmode; 106 - 107 /* input switch register + values for v4l inputs */ 108 int inputreg; 109 int inputmap[4]; 110 int inputmute; 111 int inputmask; 112 }; 113 - static struct CHIPDESC chiplist[]; 114 115 /* current state of the chip */ 116 struct CHIPSTATE { 117 struct i2c_client *c; 118 119 - /* index into CHIPDESC array */ 120 - int type; 121 122 /* shadow register set */ 123 audiocmd shadow; ··· 154 { 155 unsigned char buffer[2]; 156 157 - if (-1 == subaddr) { 158 v4l_dbg(1, debug, chip->c, "%s: chip_write: 0x%x\n", 159 chip->c->name, val); 160 chip->shadow.bytes[1] = val; ··· 165 return -1; 166 } 167 } else { 168 v4l_dbg(1, debug, chip->c, "%s: chip_write: reg%d=0x%x\n", 169 chip->c->name, subaddr, val); 170 chip->shadow.bytes[subaddr+1] = val; ··· 186 return 0; 187 } 188 189 - static int chip_write_masked(struct CHIPSTATE *chip, int subaddr, int val, int mask) 190 { 191 if (mask != 0) { 192 - if (-1 == subaddr) { 193 val = (chip->shadow.bytes[1] & ~mask) | (val & mask); 194 } else { 195 val = (chip->shadow.bytes[subaddr+1] & ~mask) | (val & mask); 196 } 197 } ··· 245 if (0 == cmd->count) 246 return 0; 247 248 /* update our shadow register set; print bytes if (debug > 0) */ 249 v4l_dbg(1, debug, chip->c, "%s: chip_cmd(%s): reg=%d, data:", 250 chip->c->name, name,cmd->bytes[0]); ··· 289 static int chip_thread(void *data) 290 { 291 struct CHIPSTATE *chip = data; 292 - struct CHIPDESC *desc = chiplist + chip->type; 293 294 v4l_dbg(1, debug, chip->c, "%s: thread started\n", chip->c->name); 295 set_freezable(); ··· 309 continue; 310 311 /* have a look what's going on */ 312 - desc->checkmode(chip); 313 314 /* schedule next check */ 315 mod_timer(&chip->wt, jiffies+msecs_to_jiffies(2000)); ··· 336 337 v4l_dbg(1, debug, chip->c, "%s: thread exiting\n", chip->c->name); 338 return 0; 339 - } 340 - 341 - static void generic_checkmode(struct CHIPSTATE *chip) 342 - { 343 - struct CHIPDESC *desc = chiplist + chip->type; 344 - int mode = desc->getmode(chip); 345 - 346 - if (mode == chip->prevmode) 347 - return; 348 - 349 - v4l_dbg(1, debug, chip->c, "%s: thread checkmode\n", chip->c->name); 350 - chip->prevmode = mode; 351 - 352 - if (mode & V4L2_TUNER_MODE_STEREO) 353 - desc->setmode(chip,V4L2_TUNER_MODE_STEREO); 354 - if (mode & V4L2_TUNER_MODE_LANG1_LANG2) 355 - desc->setmode(chip,V4L2_TUNER_MODE_STEREO); 356 - else if (mode & V4L2_TUNER_MODE_LANG1) 357 - desc->setmode(chip,V4L2_TUNER_MODE_LANG1); 358 - else if (mode & V4L2_TUNER_MODE_LANG2) 359 - desc->setmode(chip,V4L2_TUNER_MODE_LANG2); 360 - else 361 - desc->setmode(chip,V4L2_TUNER_MODE_MONO); 362 } 363 364 /* ---------------------------------------------------------------------- */ ··· 800 char *name; 801 audiocmd cmd; 802 } tda9874a_modelist[9] = { 803 - { "A2, B/G", 804 { 9, { TDA9874A_C1FRA, 0x72,0x95,0x55, 0x77,0xA0,0x00, 0x00,0x00 }} }, 805 { "A2, M (Korea)", 806 { 9, { TDA9874A_C1FRA, 0x5D,0xC0,0x00, 0x62,0x6A,0xAA, 0x20,0x22 }} }, ··· 814 { 9, { TDA9874A_C1FRA, 0x7D,0x00,0x00, 0x88,0x8A,0xAA, 0x08,0x33 }} }, 815 { "NICAM, B/G", 816 { 9, { TDA9874A_C1FRA, 0x72,0x95,0x55, 0x79,0xEA,0xAA, 0x08,0x33 }} }, 817 - { "NICAM, D/K", /* default */ 818 { 9, { TDA9874A_C1FRA, 0x87,0x6A,0xAA, 0x79,0xEA,0xAA, 0x08,0x33 }} }, 819 { "NICAM, L", 820 { 9, { TDA9874A_C1FRA, 0x87,0x6A,0xAA, 0x79,0xEA,0xAA, 0x09,0x33 }} } ··· 1004 { 1005 if (tda9874a_SIF > 2) 1006 tda9874a_SIF = 1; 1007 - if (tda9874a_STD > 8) 1008 tda9874a_STD = 0; 1009 if(tda9874a_AMSEL > 1) 1010 tda9874a_AMSEL = 0; ··· 1112 1113 static int tda8425_initialize(struct CHIPSTATE *chip) 1114 { 1115 - struct CHIPDESC *desc = chiplist + chip->type; 1116 int inputmap[4] = { /* tuner */ TDA8425_S1_CH2, /* radio */ TDA8425_S1_CH1, 1117 /* extern */ TDA8425_S1_CH1, /* intern */ TDA8425_S1_OFF}; 1118 ··· 1282 .addr_lo = I2C_ADDR_TDA9840 >> 1, 1283 .addr_hi = I2C_ADDR_TDA9840 >> 1, 1284 .registers = 5, 1285 1286 .checkit = tda9840_checkit, 1287 .getmode = tda9840_getmode, 1288 .setmode = tda9840_setmode, 1289 - .checkmode = generic_checkmode, 1290 1291 .init = { 2, { TDA9840_TEST, TDA9840_TEST_INT1SN 1292 /* ,TDA9840_SW, TDA9840_MONO */} } 1293 }, 1294 { 1295 .name = "tda9873h", 1296 - .checkit = tda9873_checkit, 1297 .insmodopt = &tda9873, 1298 .addr_lo = I2C_ADDR_TDA985x_L >> 1, 1299 .addr_hi = I2C_ADDR_TDA985x_H >> 1, 1300 .registers = 3, 1301 - .flags = CHIP_HAS_INPUTSEL, 1302 1303 .getmode = tda9873_getmode, 1304 .setmode = tda9873_setmode, 1305 - .checkmode = generic_checkmode, 1306 1307 .init = { 4, { TDA9873_SW, 0xa4, 0x06, 0x03 } }, 1308 .inputreg = TDA9873_SW, ··· 1314 }, 1315 { 1316 .name = "tda9874h/a", 1317 - .checkit = tda9874a_checkit, 1318 - .initialize = tda9874a_initialize, 1319 .insmodopt = &tda9874a, 1320 .addr_lo = I2C_ADDR_TDA9874 >> 1, 1321 .addr_hi = I2C_ADDR_TDA9874 >> 1, 1322 1323 .getmode = tda9874a_getmode, 1324 .setmode = tda9874a_setmode, 1325 - .checkmode = generic_checkmode, 1326 }, 1327 { 1328 .name = "tda9850", ··· 1349 .rightreg = TDA9855_VR, 1350 .bassreg = TDA9855_BA, 1351 .treblereg = TDA9855_TR, 1352 .volfunc = tda9855_volume, 1353 .bassfunc = tda9855_bass, 1354 .treblefunc = tda9855_treble, 1355 - 1356 .getmode = tda985x_getmode, 1357 .setmode = tda985x_setmode, 1358 ··· 1374 .rightreg = TEA6300_VL, 1375 .bassreg = TEA6300_BA, 1376 .treblereg = TEA6300_TR, 1377 .volfunc = tea6300_shift10, 1378 .bassfunc = tea6300_shift12, 1379 .treblefunc = tea6300_shift12, ··· 1386 }, 1387 { 1388 .name = "tea6320", 1389 - .initialize = tea6320_initialize, 1390 .insmodopt = &tea6320, 1391 .addr_lo = I2C_ADDR_TEA6300 >> 1, 1392 .addr_hi = I2C_ADDR_TEA6300 >> 1, ··· 1396 .rightreg = TEA6320_V, 1397 .bassreg = TEA6320_BA, 1398 .treblereg = TEA6320_TR, 1399 .volfunc = tea6320_volume, 1400 .bassfunc = tea6320_shift11, 1401 .treblefunc = tea6320_shift11, ··· 1431 .rightreg = TDA8425_VR, 1432 .bassreg = TDA8425_BA, 1433 .treblereg = TDA8425_TR, 1434 .volfunc = tda8425_shift10, 1435 .bassfunc = tda8425_shift12, 1436 .treblefunc = tda8425_shift12, 1437 1438 .inputreg = TDA8425_S1, 1439 .inputmap = { TDA8425_S1_CH1, TDA8425_S1_CH1, TDA8425_S1_CH1 }, 1440 .inputmute = TDA8425_S1_OFF, 1441 1442 - .setmode = tda8425_setmode, 1443 - .initialize = tda8425_initialize, 1444 }, 1445 { 1446 .name = "pic16c54 (PV951)", ··· 1466 .addr_lo = I2C_ADDR_TDA9840 >> 1, 1467 .addr_hi = I2C_ADDR_TDA9840 >> 1, 1468 .registers = 2, 1469 1470 .getmode = ta8874z_getmode, 1471 .setmode = ta8874z_setmode, 1472 - .checkmode = generic_checkmode, 1473 1474 .init = {2, { TA8874Z_MONO_SET, TA8874Z_SEPARATION_DEFAULT}}, 1475 }, ··· 1514 } 1515 if (desc->name == NULL) { 1516 v4l_dbg(1, debug, client, "no matching chip description found\n"); 1517 return -EIO; 1518 } 1519 v4l_info(client, "%s found @ 0x%x (%s)\n", desc->name, client->addr<<1, client->adapter->name); ··· 1528 /* fill required data structures */ 1529 if (!id) 1530 strlcpy(client->name, desc->name, I2C_NAME_SIZE); 1531 - chip->type = desc-chiplist; 1532 chip->shadow.count = desc->registers+1; 1533 chip->prevmode = -1; 1534 chip->audmode = V4L2_TUNER_MODE_LANG1; ··· 1540 chip_cmd(chip,"init",&desc->init); 1541 1542 if (desc->flags & CHIP_HAS_VOLUME) { 1543 - chip->left = desc->leftinit ? desc->leftinit : 65535; 1544 - chip->right = desc->rightinit ? desc->rightinit : 65535; 1545 - chip_write(chip,desc->leftreg,desc->volfunc(chip->left)); 1546 - chip_write(chip,desc->rightreg,desc->volfunc(chip->right)); 1547 } 1548 if (desc->flags & CHIP_HAS_BASSTREBLE) { 1549 - chip->treble = desc->trebleinit ? desc->trebleinit : 32768; 1550 - chip->bass = desc->bassinit ? desc->bassinit : 32768; 1551 - chip_write(chip,desc->bassreg,desc->bassfunc(chip->bass)); 1552 - chip_write(chip,desc->treblereg,desc->treblefunc(chip->treble)); 1553 } 1554 1555 chip->thread = NULL; 1556 - if (desc->checkmode) { 1557 /* start async thread */ 1558 init_timer(&chip->wt); 1559 chip->wt.function = chip_thread_wake; ··· 1615 static int tvaudio_get_ctrl(struct CHIPSTATE *chip, 1616 struct v4l2_control *ctrl) 1617 { 1618 - struct CHIPDESC *desc = chiplist + chip->type; 1619 1620 switch (ctrl->id) { 1621 case V4L2_CID_AUDIO_MUTE: ··· 1639 return 0; 1640 } 1641 case V4L2_CID_AUDIO_BASS: 1642 - if (desc->flags & CHIP_HAS_BASSTREBLE) 1643 break; 1644 ctrl->value = chip->bass; 1645 return 0; 1646 case V4L2_CID_AUDIO_TREBLE: 1647 - if (desc->flags & CHIP_HAS_BASSTREBLE) 1648 - return -EINVAL; 1649 ctrl->value = chip->treble; 1650 return 0; 1651 } ··· 1655 static int tvaudio_set_ctrl(struct CHIPSTATE *chip, 1656 struct v4l2_control *ctrl) 1657 { 1658 - struct CHIPDESC *desc = chiplist + chip->type; 1659 1660 switch (ctrl->id) { 1661 case V4L2_CID_AUDIO_MUTE: ··· 1705 return 0; 1706 } 1707 case V4L2_CID_AUDIO_BASS: 1708 - if (desc->flags & CHIP_HAS_BASSTREBLE) 1709 break; 1710 chip->bass = ctrl->value; 1711 chip_write(chip,desc->bassreg,desc->bassfunc(chip->bass)); 1712 1713 return 0; 1714 case V4L2_CID_AUDIO_TREBLE: 1715 - if (desc->flags & CHIP_HAS_BASSTREBLE) 1716 - return -EINVAL; 1717 - 1718 chip->treble = ctrl->value; 1719 chip_write(chip,desc->treblereg,desc->treblefunc(chip->treble)); 1720 ··· 1730 unsigned int cmd, void *arg) 1731 { 1732 struct CHIPSTATE *chip = i2c_get_clientdata(client); 1733 - struct CHIPDESC *desc = chiplist + chip->type; 1734 1735 - v4l_dbg(1, debug, chip->c, "%s: chip_command 0x%x\n", chip->c->name, cmd); 1736 1737 switch (cmd) { 1738 case AUDC_SET_RADIO: ··· 1760 break; 1761 case V4L2_CID_AUDIO_BASS: 1762 case V4L2_CID_AUDIO_TREBLE: 1763 - if (desc->flags & CHIP_HAS_BASSTREBLE) 1764 return -EINVAL; 1765 break; 1766 default: ··· 1857 break; 1858 case VIDIOC_S_FREQUENCY: 1859 chip->mode = 0; /* automatic */ 1860 - if (desc->checkmode && desc->setmode) { 1861 desc->setmode(chip,V4L2_TUNER_MODE_MONO); 1862 if (chip->prevmode != V4L2_TUNER_MODE_MONO) 1863 chip->prevmode = -1; /* reset previous mode */ 1864 mod_timer(&chip->wt, jiffies+msecs_to_jiffies(2000)); 1865 - /* the thread will call checkmode() later */ 1866 } 1867 break; 1868 ··· 1909 .legacy_probe = chip_legacy_probe, 1910 .id_table = chip_id, 1911 }; 1912 - 1913 - /* 1914 - * Local variables: 1915 - * c-basic-offset: 8 1916 - * End: 1917 - */
··· 1 /* 2 + * Driver for simple i2c audio chips. 3 * 4 * Copyright (c) 2000 Gerd Knorr 5 * based on code by: 6 * Eric Sandeen (eric_sandeen@bigfoot.com) 7 * Steve VanDeBogart (vandebo@uclink.berkeley.edu) 8 * Greg Alexander (galexand@acm.org) 9 + * 10 + * Copyright(c) 2005-2008 Mauro Carvalho Chehab 11 + * - Some cleanups, code fixes, etc 12 + * - Convert it to V4L2 API 13 * 14 * This code is placed under the terms of the GNU General Public License 15 * ··· 30 31 #include <media/tvaudio.h> 32 #include <media/v4l2-common.h> 33 + #include <media/v4l2-ioctl.h> 34 #include <media/v4l2-chip-ident.h> 35 #include <media/v4l2-i2c-drv-legacy.h> 36 ··· 58 typedef int (*initialize)(struct CHIPSTATE*); 59 typedef int (*getmode)(struct CHIPSTATE*); 60 typedef void (*setmode)(struct CHIPSTATE*, int mode); 61 62 /* i2c command */ 63 typedef struct AUDIOCMD { ··· 79 #define CHIP_HAS_VOLUME 1 80 #define CHIP_HAS_BASSTREBLE 2 81 #define CHIP_HAS_INPUTSEL 4 82 + #define CHIP_NEED_CHECKMODE 8 83 84 /* various i2c command sequences */ 85 audiocmd init; ··· 96 getmode getmode; 97 setmode setmode; 98 99 /* input switch register + values for v4l inputs */ 100 int inputreg; 101 int inputmap[4]; 102 int inputmute; 103 int inputmask; 104 }; 105 106 /* current state of the chip */ 107 struct CHIPSTATE { 108 struct i2c_client *c; 109 110 + /* chip-specific description - should point to 111 + an entry at CHIPDESC table */ 112 + struct CHIPDESC *desc; 113 114 /* shadow register set */ 115 audiocmd shadow; ··· 152 { 153 unsigned char buffer[2]; 154 155 + if (subaddr < 0) { 156 v4l_dbg(1, debug, chip->c, "%s: chip_write: 0x%x\n", 157 chip->c->name, val); 158 chip->shadow.bytes[1] = val; ··· 163 return -1; 164 } 165 } else { 166 + if (subaddr + 1 >= ARRAY_SIZE(chip->shadow.bytes)) { 167 + v4l_info(chip->c, 168 + "Tried to access a non-existent register: %d\n", 169 + subaddr); 170 + return -EINVAL; 171 + } 172 + 173 v4l_dbg(1, debug, chip->c, "%s: chip_write: reg%d=0x%x\n", 174 chip->c->name, subaddr, val); 175 chip->shadow.bytes[subaddr+1] = val; ··· 177 return 0; 178 } 179 180 + static int chip_write_masked(struct CHIPSTATE *chip, 181 + int subaddr, int val, int mask) 182 { 183 if (mask != 0) { 184 + if (subaddr < 0) { 185 val = (chip->shadow.bytes[1] & ~mask) | (val & mask); 186 } else { 187 + if (subaddr + 1 >= ARRAY_SIZE(chip->shadow.bytes)) { 188 + v4l_info(chip->c, 189 + "Tried to access a non-existent register: %d\n", 190 + subaddr); 191 + return -EINVAL; 192 + } 193 + 194 val = (chip->shadow.bytes[subaddr+1] & ~mask) | (val & mask); 195 } 196 } ··· 228 if (0 == cmd->count) 229 return 0; 230 231 + if (cmd->count + cmd->bytes[0] - 1 >= ARRAY_SIZE(chip->shadow.bytes)) { 232 + v4l_info(chip->c, 233 + "Tried to access a non-existent register range: %d to %d\n", 234 + cmd->bytes[0] + 1, cmd->bytes[0] + cmd->count - 1); 235 + return -EINVAL; 236 + } 237 + 238 + /* FIXME: it seems that the shadow bytes are wrong bellow !*/ 239 + 240 /* update our shadow register set; print bytes if (debug > 0) */ 241 v4l_dbg(1, debug, chip->c, "%s: chip_cmd(%s): reg=%d, data:", 242 chip->c->name, name,cmd->bytes[0]); ··· 263 static int chip_thread(void *data) 264 { 265 struct CHIPSTATE *chip = data; 266 + struct CHIPDESC *desc = chip->desc; 267 + int mode; 268 269 v4l_dbg(1, debug, chip->c, "%s: thread started\n", chip->c->name); 270 set_freezable(); ··· 282 continue; 283 284 /* have a look what's going on */ 285 + mode = desc->getmode(chip); 286 + if (mode == chip->prevmode) 287 + continue; 288 + 289 + /* chip detected a new audio mode - set it */ 290 + v4l_dbg(1, debug, chip->c, "%s: thread checkmode\n", 291 + chip->c->name); 292 + 293 + chip->prevmode = mode; 294 + 295 + if (mode & V4L2_TUNER_MODE_STEREO) 296 + desc->setmode(chip, V4L2_TUNER_MODE_STEREO); 297 + if (mode & V4L2_TUNER_MODE_LANG1_LANG2) 298 + desc->setmode(chip, V4L2_TUNER_MODE_STEREO); 299 + else if (mode & V4L2_TUNER_MODE_LANG1) 300 + desc->setmode(chip, V4L2_TUNER_MODE_LANG1); 301 + else if (mode & V4L2_TUNER_MODE_LANG2) 302 + desc->setmode(chip, V4L2_TUNER_MODE_LANG2); 303 + else 304 + desc->setmode(chip, V4L2_TUNER_MODE_MONO); 305 306 /* schedule next check */ 307 mod_timer(&chip->wt, jiffies+msecs_to_jiffies(2000)); ··· 290 291 v4l_dbg(1, debug, chip->c, "%s: thread exiting\n", chip->c->name); 292 return 0; 293 } 294 295 /* ---------------------------------------------------------------------- */ ··· 777 char *name; 778 audiocmd cmd; 779 } tda9874a_modelist[9] = { 780 + { "A2, B/G", /* default */ 781 { 9, { TDA9874A_C1FRA, 0x72,0x95,0x55, 0x77,0xA0,0x00, 0x00,0x00 }} }, 782 { "A2, M (Korea)", 783 { 9, { TDA9874A_C1FRA, 0x5D,0xC0,0x00, 0x62,0x6A,0xAA, 0x20,0x22 }} }, ··· 791 { 9, { TDA9874A_C1FRA, 0x7D,0x00,0x00, 0x88,0x8A,0xAA, 0x08,0x33 }} }, 792 { "NICAM, B/G", 793 { 9, { TDA9874A_C1FRA, 0x72,0x95,0x55, 0x79,0xEA,0xAA, 0x08,0x33 }} }, 794 + { "NICAM, D/K", 795 { 9, { TDA9874A_C1FRA, 0x87,0x6A,0xAA, 0x79,0xEA,0xAA, 0x08,0x33 }} }, 796 { "NICAM, L", 797 { 9, { TDA9874A_C1FRA, 0x87,0x6A,0xAA, 0x79,0xEA,0xAA, 0x09,0x33 }} } ··· 981 { 982 if (tda9874a_SIF > 2) 983 tda9874a_SIF = 1; 984 + if (tda9874a_STD >= ARRAY_SIZE(tda9874a_modelist)) 985 tda9874a_STD = 0; 986 if(tda9874a_AMSEL > 1) 987 tda9874a_AMSEL = 0; ··· 1089 1090 static int tda8425_initialize(struct CHIPSTATE *chip) 1091 { 1092 + struct CHIPDESC *desc = chip->desc; 1093 int inputmap[4] = { /* tuner */ TDA8425_S1_CH2, /* radio */ TDA8425_S1_CH1, 1094 /* extern */ TDA8425_S1_CH1, /* intern */ TDA8425_S1_OFF}; 1095 ··· 1259 .addr_lo = I2C_ADDR_TDA9840 >> 1, 1260 .addr_hi = I2C_ADDR_TDA9840 >> 1, 1261 .registers = 5, 1262 + .flags = CHIP_NEED_CHECKMODE, 1263 1264 + /* callbacks */ 1265 .checkit = tda9840_checkit, 1266 .getmode = tda9840_getmode, 1267 .setmode = tda9840_setmode, 1268 1269 .init = { 2, { TDA9840_TEST, TDA9840_TEST_INT1SN 1270 /* ,TDA9840_SW, TDA9840_MONO */} } 1271 }, 1272 { 1273 .name = "tda9873h", 1274 .insmodopt = &tda9873, 1275 .addr_lo = I2C_ADDR_TDA985x_L >> 1, 1276 .addr_hi = I2C_ADDR_TDA985x_H >> 1, 1277 .registers = 3, 1278 + .flags = CHIP_HAS_INPUTSEL | CHIP_NEED_CHECKMODE, 1279 1280 + /* callbacks */ 1281 + .checkit = tda9873_checkit, 1282 .getmode = tda9873_getmode, 1283 .setmode = tda9873_setmode, 1284 1285 .init = { 4, { TDA9873_SW, 0xa4, 0x06, 0x03 } }, 1286 .inputreg = TDA9873_SW, ··· 1290 }, 1291 { 1292 .name = "tda9874h/a", 1293 .insmodopt = &tda9874a, 1294 .addr_lo = I2C_ADDR_TDA9874 >> 1, 1295 .addr_hi = I2C_ADDR_TDA9874 >> 1, 1296 + .flags = CHIP_NEED_CHECKMODE, 1297 1298 + /* callbacks */ 1299 + .initialize = tda9874a_initialize, 1300 + .checkit = tda9874a_checkit, 1301 .getmode = tda9874a_getmode, 1302 .setmode = tda9874a_setmode, 1303 }, 1304 { 1305 .name = "tda9850", ··· 1324 .rightreg = TDA9855_VR, 1325 .bassreg = TDA9855_BA, 1326 .treblereg = TDA9855_TR, 1327 + 1328 + /* callbacks */ 1329 .volfunc = tda9855_volume, 1330 .bassfunc = tda9855_bass, 1331 .treblefunc = tda9855_treble, 1332 .getmode = tda985x_getmode, 1333 .setmode = tda985x_setmode, 1334 ··· 1348 .rightreg = TEA6300_VL, 1349 .bassreg = TEA6300_BA, 1350 .treblereg = TEA6300_TR, 1351 + 1352 + /* callbacks */ 1353 .volfunc = tea6300_shift10, 1354 .bassfunc = tea6300_shift12, 1355 .treblefunc = tea6300_shift12, ··· 1358 }, 1359 { 1360 .name = "tea6320", 1361 .insmodopt = &tea6320, 1362 .addr_lo = I2C_ADDR_TEA6300 >> 1, 1363 .addr_hi = I2C_ADDR_TEA6300 >> 1, ··· 1369 .rightreg = TEA6320_V, 1370 .bassreg = TEA6320_BA, 1371 .treblereg = TEA6320_TR, 1372 + 1373 + /* callbacks */ 1374 + .initialize = tea6320_initialize, 1375 .volfunc = tea6320_volume, 1376 .bassfunc = tea6320_shift11, 1377 .treblefunc = tea6320_shift11, ··· 1401 .rightreg = TDA8425_VR, 1402 .bassreg = TDA8425_BA, 1403 .treblereg = TDA8425_TR, 1404 + 1405 + /* callbacks */ 1406 + .initialize = tda8425_initialize, 1407 .volfunc = tda8425_shift10, 1408 .bassfunc = tda8425_shift12, 1409 .treblefunc = tda8425_shift12, 1410 + .setmode = tda8425_setmode, 1411 1412 .inputreg = TDA8425_S1, 1413 .inputmap = { TDA8425_S1_CH1, TDA8425_S1_CH1, TDA8425_S1_CH1 }, 1414 .inputmute = TDA8425_S1_OFF, 1415 1416 }, 1417 { 1418 .name = "pic16c54 (PV951)", ··· 1434 .addr_lo = I2C_ADDR_TDA9840 >> 1, 1435 .addr_hi = I2C_ADDR_TDA9840 >> 1, 1436 .registers = 2, 1437 + .flags = CHIP_NEED_CHECKMODE, 1438 1439 + /* callbacks */ 1440 .getmode = ta8874z_getmode, 1441 .setmode = ta8874z_setmode, 1442 1443 .init = {2, { TA8874Z_MONO_SET, TA8874Z_SEPARATION_DEFAULT}}, 1444 }, ··· 1481 } 1482 if (desc->name == NULL) { 1483 v4l_dbg(1, debug, client, "no matching chip description found\n"); 1484 + kfree(chip); 1485 return -EIO; 1486 } 1487 v4l_info(client, "%s found @ 0x%x (%s)\n", desc->name, client->addr<<1, client->adapter->name); ··· 1494 /* fill required data structures */ 1495 if (!id) 1496 strlcpy(client->name, desc->name, I2C_NAME_SIZE); 1497 + chip->desc = desc; 1498 chip->shadow.count = desc->registers+1; 1499 chip->prevmode = -1; 1500 chip->audmode = V4L2_TUNER_MODE_LANG1; ··· 1506 chip_cmd(chip,"init",&desc->init); 1507 1508 if (desc->flags & CHIP_HAS_VOLUME) { 1509 + if (!desc->volfunc) { 1510 + /* This shouldn't be happen. Warn user, but keep working 1511 + without volume controls 1512 + */ 1513 + v4l_info(chip->c, "volume callback undefined!\n"); 1514 + desc->flags &= ~CHIP_HAS_VOLUME; 1515 + } else { 1516 + chip->left = desc->leftinit ? desc->leftinit : 65535; 1517 + chip->right = desc->rightinit ? desc->rightinit : 65535; 1518 + chip_write(chip, desc->leftreg, 1519 + desc->volfunc(chip->left)); 1520 + chip_write(chip, desc->rightreg, 1521 + desc->volfunc(chip->right)); 1522 + } 1523 } 1524 if (desc->flags & CHIP_HAS_BASSTREBLE) { 1525 + if (!desc->bassfunc || !desc->treblefunc) { 1526 + /* This shouldn't be happen. Warn user, but keep working 1527 + without bass/treble controls 1528 + */ 1529 + v4l_info(chip->c, "bass/treble callbacks undefined!\n"); 1530 + desc->flags &= ~CHIP_HAS_BASSTREBLE; 1531 + } else { 1532 + chip->treble = desc->trebleinit ? 1533 + desc->trebleinit : 32768; 1534 + chip->bass = desc->bassinit ? 1535 + desc->bassinit : 32768; 1536 + chip_write(chip, desc->bassreg, 1537 + desc->bassfunc(chip->bass)); 1538 + chip_write(chip, desc->treblereg, 1539 + desc->treblefunc(chip->treble)); 1540 + } 1541 } 1542 1543 chip->thread = NULL; 1544 + if (desc->flags & CHIP_NEED_CHECKMODE) { 1545 + if (!desc->getmode || !desc->setmode) { 1546 + /* This shouldn't be happen. Warn user, but keep working 1547 + without kthread 1548 + */ 1549 + v4l_info(chip->c, "set/get mode callbacks undefined!\n"); 1550 + return 0; 1551 + } 1552 /* start async thread */ 1553 init_timer(&chip->wt); 1554 chip->wt.function = chip_thread_wake; ··· 1552 static int tvaudio_get_ctrl(struct CHIPSTATE *chip, 1553 struct v4l2_control *ctrl) 1554 { 1555 + struct CHIPDESC *desc = chip->desc; 1556 1557 switch (ctrl->id) { 1558 case V4L2_CID_AUDIO_MUTE: ··· 1576 return 0; 1577 } 1578 case V4L2_CID_AUDIO_BASS: 1579 + if (!(desc->flags & CHIP_HAS_BASSTREBLE)) 1580 break; 1581 ctrl->value = chip->bass; 1582 return 0; 1583 case V4L2_CID_AUDIO_TREBLE: 1584 + if (!(desc->flags & CHIP_HAS_BASSTREBLE)) 1585 + break; 1586 ctrl->value = chip->treble; 1587 return 0; 1588 } ··· 1592 static int tvaudio_set_ctrl(struct CHIPSTATE *chip, 1593 struct v4l2_control *ctrl) 1594 { 1595 + struct CHIPDESC *desc = chip->desc; 1596 1597 switch (ctrl->id) { 1598 case V4L2_CID_AUDIO_MUTE: ··· 1642 return 0; 1643 } 1644 case V4L2_CID_AUDIO_BASS: 1645 + if (!(desc->flags & CHIP_HAS_BASSTREBLE)) 1646 break; 1647 chip->bass = ctrl->value; 1648 chip_write(chip,desc->bassreg,desc->bassfunc(chip->bass)); 1649 1650 return 0; 1651 case V4L2_CID_AUDIO_TREBLE: 1652 + if (!(desc->flags & CHIP_HAS_BASSTREBLE)) 1653 + break; 1654 chip->treble = ctrl->value; 1655 chip_write(chip,desc->treblereg,desc->treblefunc(chip->treble)); 1656 ··· 1668 unsigned int cmd, void *arg) 1669 { 1670 struct CHIPSTATE *chip = i2c_get_clientdata(client); 1671 + struct CHIPDESC *desc = chip->desc; 1672 1673 + if (debug > 0) { 1674 + v4l_i2c_print_ioctl(chip->c, cmd); 1675 + printk("\n"); 1676 + } 1677 1678 switch (cmd) { 1679 case AUDC_SET_RADIO: ··· 1695 break; 1696 case V4L2_CID_AUDIO_BASS: 1697 case V4L2_CID_AUDIO_TREBLE: 1698 + if (!(desc->flags & CHIP_HAS_BASSTREBLE)) 1699 return -EINVAL; 1700 break; 1701 default: ··· 1792 break; 1793 case VIDIOC_S_FREQUENCY: 1794 chip->mode = 0; /* automatic */ 1795 + 1796 + /* For chips that provide getmode and setmode, and doesn't 1797 + automatically follows the stereo carrier, a kthread is 1798 + created to set the audio standard. In this case, when then 1799 + the video channel is changed, tvaudio starts on MONO mode. 1800 + After waiting for 2 seconds, the kernel thread is called, 1801 + to follow whatever audio standard is pointed by the 1802 + audio carrier. 1803 + */ 1804 + if (chip->thread) { 1805 desc->setmode(chip,V4L2_TUNER_MODE_MONO); 1806 if (chip->prevmode != V4L2_TUNER_MODE_MONO) 1807 chip->prevmode = -1; /* reset previous mode */ 1808 mod_timer(&chip->wt, jiffies+msecs_to_jiffies(2000)); 1809 } 1810 break; 1811 ··· 1836 .legacy_probe = chip_legacy_probe, 1837 .id_table = chip_id, 1838 };