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

[media] em28xx: PCTV 461e use I2C client for demod and SEC

Use I2C client binding for demod and SEC.

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

authored by

Antti Palosaari and committed by
Mauro Carvalho Chehab
76b91be3 478932b1

+85 -55
+85 -55
drivers/media/usb/em28xx/em28xx-dvb.c
··· 1521 1521 } 1522 1522 } 1523 1523 break; 1524 - case EM28178_BOARD_PCTV_461E: 1525 - { 1526 - /* demod I2C adapter */ 1527 - struct i2c_adapter *i2c_adapter; 1528 - struct i2c_client *client; 1529 - struct i2c_board_info info; 1530 - struct ts2020_config ts2020_config = { 1531 - }; 1532 - memset(&info, 0, sizeof(struct i2c_board_info)); 1524 + case EM28178_BOARD_PCTV_461E: { 1525 + struct i2c_client *client; 1526 + struct i2c_adapter *i2c_adapter; 1527 + struct i2c_board_info board_info; 1528 + struct m88ds3103_platform_data m88ds3103_pdata = {}; 1529 + struct ts2020_config ts2020_config = {}; 1530 + struct a8293_platform_data a8293_pdata = {}; 1533 1531 1534 - /* attach demod */ 1535 - dvb->fe[0] = dvb_attach(m88ds3103_attach, 1536 - &pctv_461e_m88ds3103_config, 1537 - &dev->i2c_adap[dev->def_i2c_bus], 1538 - &i2c_adapter); 1539 - if (dvb->fe[0] == NULL) { 1540 - result = -ENODEV; 1541 - goto out_free; 1542 - } 1543 - 1544 - /* attach tuner */ 1545 - ts2020_config.fe = dvb->fe[0]; 1546 - strlcpy(info.type, "ts2022", I2C_NAME_SIZE); 1547 - info.addr = 0x60; 1548 - info.platform_data = &ts2020_config; 1549 - request_module("ts2020"); 1550 - client = i2c_new_device(i2c_adapter, &info); 1551 - if (client == NULL || client->dev.driver == NULL) { 1552 - dvb_frontend_detach(dvb->fe[0]); 1553 - result = -ENODEV; 1554 - goto out_free; 1555 - } 1556 - 1557 - if (!try_module_get(client->dev.driver->owner)) { 1558 - i2c_unregister_device(client); 1559 - dvb_frontend_detach(dvb->fe[0]); 1560 - result = -ENODEV; 1561 - goto out_free; 1562 - } 1563 - 1564 - /* delegate signal strength measurement to tuner */ 1565 - dvb->fe[0]->ops.read_signal_strength = 1566 - dvb->fe[0]->ops.tuner_ops.get_rf_strength; 1567 - 1568 - /* attach SEC */ 1569 - if (!dvb_attach(a8293_attach, dvb->fe[0], 1570 - &dev->i2c_adap[dev->def_i2c_bus], 1571 - &em28xx_a8293_config)) { 1572 - module_put(client->dev.driver->owner); 1573 - i2c_unregister_device(client); 1574 - dvb_frontend_detach(dvb->fe[0]); 1575 - result = -ENODEV; 1576 - goto out_free; 1577 - } 1578 - 1579 - dvb->i2c_client_tuner = client; 1532 + /* attach demod */ 1533 + m88ds3103_pdata.clk = 27000000; 1534 + m88ds3103_pdata.i2c_wr_max = 33; 1535 + m88ds3103_pdata.ts_mode = M88DS3103_TS_PARALLEL; 1536 + m88ds3103_pdata.ts_clk = 16000; 1537 + m88ds3103_pdata.ts_clk_pol = 1; 1538 + m88ds3103_pdata.agc = 0x99; 1539 + memset(&board_info, 0, sizeof(board_info)); 1540 + strlcpy(board_info.type, "m88ds3103", I2C_NAME_SIZE); 1541 + board_info.addr = 0x68; 1542 + board_info.platform_data = &m88ds3103_pdata; 1543 + request_module("m88ds3103"); 1544 + client = i2c_new_device(&dev->i2c_adap[dev->def_i2c_bus], &board_info); 1545 + if (client == NULL || client->dev.driver == NULL) { 1546 + result = -ENODEV; 1547 + goto out_free; 1580 1548 } 1549 + if (!try_module_get(client->dev.driver->owner)) { 1550 + i2c_unregister_device(client); 1551 + result = -ENODEV; 1552 + goto out_free; 1553 + } 1554 + dvb->fe[0] = m88ds3103_pdata.get_dvb_frontend(client); 1555 + i2c_adapter = m88ds3103_pdata.get_i2c_adapter(client); 1556 + dvb->i2c_client_demod = client; 1557 + 1558 + /* attach tuner */ 1559 + ts2020_config.fe = dvb->fe[0]; 1560 + memset(&board_info, 0, sizeof(board_info)); 1561 + strlcpy(board_info.type, "ts2022", I2C_NAME_SIZE); 1562 + board_info.addr = 0x60; 1563 + board_info.platform_data = &ts2020_config; 1564 + request_module("ts2020"); 1565 + client = i2c_new_device(i2c_adapter, &board_info); 1566 + if (client == NULL || client->dev.driver == NULL) { 1567 + module_put(dvb->i2c_client_demod->dev.driver->owner); 1568 + i2c_unregister_device(dvb->i2c_client_demod); 1569 + result = -ENODEV; 1570 + goto out_free; 1571 + } 1572 + if (!try_module_get(client->dev.driver->owner)) { 1573 + i2c_unregister_device(client); 1574 + module_put(dvb->i2c_client_demod->dev.driver->owner); 1575 + i2c_unregister_device(dvb->i2c_client_demod); 1576 + result = -ENODEV; 1577 + goto out_free; 1578 + } 1579 + dvb->i2c_client_tuner = client; 1580 + /* delegate signal strength measurement to tuner */ 1581 + dvb->fe[0]->ops.read_signal_strength = 1582 + dvb->fe[0]->ops.tuner_ops.get_rf_strength; 1583 + 1584 + /* attach SEC */ 1585 + a8293_pdata.dvb_frontend = dvb->fe[0]; 1586 + memset(&board_info, 0, sizeof(board_info)); 1587 + strlcpy(board_info.type, "a8293", I2C_NAME_SIZE); 1588 + board_info.addr = 0x08; 1589 + board_info.platform_data = &a8293_pdata; 1590 + request_module("a8293"); 1591 + client = i2c_new_device(&dev->i2c_adap[dev->def_i2c_bus], &board_info); 1592 + if (client == NULL || client->dev.driver == NULL) { 1593 + module_put(dvb->i2c_client_tuner->dev.driver->owner); 1594 + i2c_unregister_device(dvb->i2c_client_tuner); 1595 + module_put(dvb->i2c_client_demod->dev.driver->owner); 1596 + i2c_unregister_device(dvb->i2c_client_demod); 1597 + result = -ENODEV; 1598 + goto out_free; 1599 + } 1600 + if (!try_module_get(client->dev.driver->owner)) { 1601 + i2c_unregister_device(client); 1602 + module_put(dvb->i2c_client_tuner->dev.driver->owner); 1603 + i2c_unregister_device(dvb->i2c_client_tuner); 1604 + module_put(dvb->i2c_client_demod->dev.driver->owner); 1605 + i2c_unregister_device(dvb->i2c_client_demod); 1606 + result = -ENODEV; 1607 + goto out_free; 1608 + } 1609 + dvb->i2c_client_sec = client; 1581 1610 break; 1611 + } 1582 1612 case EM28178_BOARD_PCTV_292E: 1583 1613 { 1584 1614 struct i2c_adapter *adapter;