Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] af9035: register it9133 tuner using platform binding

it913x tuner driver is changed to platform model so we need bind it
using platform_device_register_data().

Also remove hacks from I2C adapter where fake tuner driver address
(addr >> 1) were used as those are no longer needed.

Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>

authored by

Antti Palosaari and committed by
Mauro Carvalho Chehab
35ef193b 675ee801

+62 -64
+60 -64
drivers/media/usb/dvb-usb-v2/af9035.c
··· 335 335 /* TODO: correct limits > 40 */ 336 336 ret = -EOPNOTSUPP; 337 337 } else if ((msg[0].addr == state->af9033_i2c_addr[0]) || 338 - (msg[0].addr == state->af9033_i2c_addr[1]) || 339 - (state->chip_type == 0x9135)) { 338 + (msg[0].addr == state->af9033_i2c_addr[1])) { 340 339 /* demod access via firmware interface */ 341 340 u32 reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 | 342 341 msg[0].buf[2]; 343 342 344 - if (msg[0].addr == state->af9033_i2c_addr[1] || 345 - msg[0].addr == (state->af9033_i2c_addr[1] >> 1)) 343 + if (msg[0].addr == state->af9033_i2c_addr[1]) 346 344 reg |= 0x100000; 347 345 348 346 ret = af9035_rd_regs(d, reg, &msg[1].buf[0], ··· 394 396 /* TODO: correct limits > 40 */ 395 397 ret = -EOPNOTSUPP; 396 398 } else if ((msg[0].addr == state->af9033_i2c_addr[0]) || 397 - (msg[0].addr == state->af9033_i2c_addr[1]) || 398 - (state->chip_type == 0x9135)) { 399 + (msg[0].addr == state->af9033_i2c_addr[1])) { 399 400 /* demod access via firmware interface */ 400 401 u32 reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 | 401 402 msg[0].buf[2]; 402 403 403 - if (msg[0].addr == state->af9033_i2c_addr[1] || 404 - msg[0].addr == (state->af9033_i2c_addr[1] >> 1)) 404 + if (msg[0].addr == state->af9033_i2c_addr[1]) 405 405 reg |= 0x100000; 406 406 407 407 ret = af9035_wr_regs(d, reg, &msg[0].buf[3], ··· 1246 1250 struct state *state = adap_to_priv(adap); 1247 1251 struct dvb_usb_device *d = adap_to_d(adap); 1248 1252 struct usb_interface *intf = d->intf; 1249 - int demod2; 1250 1253 1251 1254 dev_dbg(&intf->dev, "adap->id=%d\n", adap->id); 1252 1255 1253 - /* 1254 - * For dual tuner devices we have to resolve 2nd demod client, as there 1255 - * is two different kind of tuner drivers; one is using I2C binding 1256 - * and the other is using DVB attach/detach binding. 1257 - */ 1258 - switch (state->af9033_config[adap->id].tuner) { 1259 - case AF9033_TUNER_IT9135_38: 1260 - case AF9033_TUNER_IT9135_51: 1261 - case AF9033_TUNER_IT9135_52: 1262 - case AF9033_TUNER_IT9135_60: 1263 - case AF9033_TUNER_IT9135_61: 1264 - case AF9033_TUNER_IT9135_62: 1265 - demod2 = 2; 1266 - break; 1267 - default: 1268 - demod2 = 1; 1269 - } 1270 - 1271 1256 if (adap->id == 1) { 1272 - if (state->i2c_client[demod2]) 1257 + if (state->i2c_client[1]) 1273 1258 af9035_del_i2c_dev(d); 1274 1259 } else if (adap->id == 0) { 1275 1260 if (state->i2c_client[0]) ··· 1490 1513 case AF9033_TUNER_IT9135_38: 1491 1514 case AF9033_TUNER_IT9135_51: 1492 1515 case AF9033_TUNER_IT9135_52: 1493 - { 1494 - struct it913x_config it913x_config = { 1495 - .fe = adap->fe[0], 1496 - .chip_ver = 1, 1497 - }; 1498 - 1499 - if (state->dual_mode) { 1500 - if (adap->id == 0) 1501 - it913x_config.role = IT913X_ROLE_DUAL_MASTER; 1502 - else 1503 - it913x_config.role = IT913X_ROLE_DUAL_SLAVE; 1504 - } 1505 - 1506 - ret = af9035_add_i2c_dev(d, "it913x", 1507 - state->af9033_i2c_addr[adap->id] >> 1, 1508 - &it913x_config, &d->i2c_adap); 1509 - if (ret) 1510 - goto err; 1511 - 1512 - fe = adap->fe[0]; 1513 - break; 1514 - } 1515 1516 case AF9033_TUNER_IT9135_60: 1516 1517 case AF9033_TUNER_IT9135_61: 1517 1518 case AF9033_TUNER_IT9135_62: 1518 1519 { 1519 - struct it913x_config it913x_config = { 1520 + struct platform_device *pdev; 1521 + struct it913x_platform_data it913x_pdata = { 1522 + .regmap = state->af9033_config[adap->id].regmap, 1520 1523 .fe = adap->fe[0], 1521 - .chip_ver = 2, 1522 1524 }; 1525 + 1526 + switch (state->af9033_config[adap->id].tuner) { 1527 + case AF9033_TUNER_IT9135_38: 1528 + case AF9033_TUNER_IT9135_51: 1529 + case AF9033_TUNER_IT9135_52: 1530 + it913x_pdata.chip_ver = 1; 1531 + break; 1532 + case AF9033_TUNER_IT9135_60: 1533 + case AF9033_TUNER_IT9135_61: 1534 + case AF9033_TUNER_IT9135_62: 1535 + it913x_pdata.chip_ver = 2; 1536 + break; 1537 + default: 1538 + ret = -ENODEV; 1539 + goto err; 1540 + } 1523 1541 1524 1542 if (state->dual_mode) { 1525 1543 if (adap->id == 0) 1526 - it913x_config.role = IT913X_ROLE_DUAL_MASTER; 1544 + it913x_pdata.role = IT913X_ROLE_DUAL_MASTER; 1527 1545 else 1528 - it913x_config.role = IT913X_ROLE_DUAL_SLAVE; 1546 + it913x_pdata.role = IT913X_ROLE_DUAL_SLAVE; 1547 + } else { 1548 + it913x_pdata.role = IT913X_ROLE_SINGLE; 1529 1549 } 1530 1550 1531 - ret = af9035_add_i2c_dev(d, "it913x", 1532 - state->af9033_i2c_addr[adap->id] >> 1, 1533 - &it913x_config, &d->i2c_adap); 1534 - if (ret) 1551 + request_module("%s", "it913x"); 1552 + pdev = platform_device_register_data(&d->intf->dev, 1553 + "it913x", 1554 + PLATFORM_DEVID_AUTO, 1555 + &it913x_pdata, 1556 + sizeof(it913x_pdata)); 1557 + if (IS_ERR(pdev) || !pdev->dev.driver) { 1558 + ret = -ENODEV; 1535 1559 goto err; 1560 + } 1561 + if (!try_module_get(pdev->dev.driver->owner)) { 1562 + platform_device_unregister(pdev); 1563 + ret = -ENODEV; 1564 + goto err; 1565 + } 1536 1566 1567 + state->platform_device_tuner[adap->id] = pdev; 1537 1568 fe = adap->fe[0]; 1538 1569 break; 1539 1570 } ··· 1663 1678 switch (state->af9033_config[adap->id].tuner) { 1664 1679 case AF9033_TUNER_TUA9001: 1665 1680 case AF9033_TUNER_FC2580: 1666 - case AF9033_TUNER_IT9135_38: 1667 - case AF9033_TUNER_IT9135_51: 1668 - case AF9033_TUNER_IT9135_52: 1669 - case AF9033_TUNER_IT9135_60: 1670 - case AF9033_TUNER_IT9135_61: 1671 - case AF9033_TUNER_IT9135_62: 1672 1681 if (adap->id == 1) { 1673 1682 if (state->i2c_client[3]) 1674 1683 af9035_del_i2c_dev(d); ··· 1670 1691 if (state->i2c_client[1]) 1671 1692 af9035_del_i2c_dev(d); 1672 1693 } 1694 + break; 1695 + case AF9033_TUNER_IT9135_38: 1696 + case AF9033_TUNER_IT9135_51: 1697 + case AF9033_TUNER_IT9135_52: 1698 + case AF9033_TUNER_IT9135_60: 1699 + case AF9033_TUNER_IT9135_61: 1700 + case AF9033_TUNER_IT9135_62: 1701 + { 1702 + struct platform_device *pdev; 1703 + 1704 + pdev = state->platform_device_tuner[adap->id]; 1705 + if (pdev) { 1706 + module_put(pdev->dev.driver->owner); 1707 + platform_device_unregister(pdev); 1708 + } 1709 + break; 1710 + } 1673 1711 } 1674 1712 1675 1713 return 0;
+2
drivers/media/usb/dvb-usb-v2/af9035.h
··· 22 22 #ifndef AF9035_H 23 23 #define AF9035_H 24 24 25 + #include <linux/platform_device.h> 25 26 #include "dvb_usb.h" 26 27 #include "af9033.h" 27 28 #include "tua9001.h" ··· 74 73 #define AF9035_I2C_CLIENT_MAX 4 75 74 struct i2c_client *i2c_client[AF9035_I2C_CLIENT_MAX]; 76 75 struct i2c_adapter *i2c_adapter_demod; 76 + struct platform_device *platform_device_tuner[2]; 77 77 }; 78 78 79 79 static const u32 clock_lut_af9035[] = {