diff options
author | Antti Palosaari <crope@iki.fi> | 2015-04-16 21:55:31 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2015-06-10 10:09:20 -0400 |
commit | 76b91be3d360af85f4ad2a27a54268726bee7679 (patch) | |
tree | 3d22fb95488dc5e4278eded1c5621e58878ea78d /drivers/media | |
parent | 478932b16052f5ded74685d096ae920cd17d6424 (diff) |
[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>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/usb/em28xx/em28xx-dvb.c | 136 |
1 files changed, 83 insertions, 53 deletions
diff --git a/drivers/media/usb/em28xx/em28xx-dvb.c b/drivers/media/usb/em28xx/em28xx-dvb.c index be0abca04fb4..a38248360833 100644 --- a/drivers/media/usb/em28xx/em28xx-dvb.c +++ b/drivers/media/usb/em28xx/em28xx-dvb.c | |||
@@ -1521,64 +1521,94 @@ static int em28xx_dvb_init(struct em28xx *dev) | |||
1521 | } | 1521 | } |
1522 | } | 1522 | } |
1523 | break; | 1523 | break; |
1524 | case EM28178_BOARD_PCTV_461E: | 1524 | case EM28178_BOARD_PCTV_461E: { |
1525 | { | 1525 | struct i2c_client *client; |
1526 | /* demod I2C adapter */ | 1526 | struct i2c_adapter *i2c_adapter; |
1527 | struct i2c_adapter *i2c_adapter; | 1527 | struct i2c_board_info board_info; |
1528 | struct i2c_client *client; | 1528 | struct m88ds3103_platform_data m88ds3103_pdata = {}; |
1529 | struct i2c_board_info info; | 1529 | struct ts2020_config ts2020_config = {}; |
1530 | struct ts2020_config ts2020_config = { | 1530 | struct a8293_platform_data a8293_pdata = {}; |
1531 | }; | ||
1532 | memset(&info, 0, sizeof(struct i2c_board_info)); | ||
1533 | |||
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 | 1531 | ||
1564 | /* delegate signal strength measurement to tuner */ | 1532 | /* attach demod */ |
1565 | dvb->fe[0]->ops.read_signal_strength = | 1533 | m88ds3103_pdata.clk = 27000000; |
1566 | dvb->fe[0]->ops.tuner_ops.get_rf_strength; | 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; | ||
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; | ||
1567 | 1557 | ||
1568 | /* attach SEC */ | 1558 | /* attach tuner */ |
1569 | if (!dvb_attach(a8293_attach, dvb->fe[0], | 1559 | ts2020_config.fe = dvb->fe[0]; |
1570 | &dev->i2c_adap[dev->def_i2c_bus], | 1560 | memset(&board_info, 0, sizeof(board_info)); |
1571 | &em28xx_a8293_config)) { | 1561 | strlcpy(board_info.type, "ts2022", I2C_NAME_SIZE); |
1572 | module_put(client->dev.driver->owner); | 1562 | board_info.addr = 0x60; |
1573 | i2c_unregister_device(client); | 1563 | board_info.platform_data = &ts2020_config; |
1574 | dvb_frontend_detach(dvb->fe[0]); | 1564 | request_module("ts2020"); |
1575 | result = -ENODEV; | 1565 | client = i2c_new_device(i2c_adapter, &board_info); |
1576 | goto out_free; | 1566 | if (client == NULL || client->dev.driver == NULL) { |
1577 | } | 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; | ||
1578 | 1583 | ||
1579 | dvb->i2c_client_tuner = client; | 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; | ||
1580 | } | 1608 | } |
1609 | dvb->i2c_client_sec = client; | ||
1581 | break; | 1610 | break; |
1611 | } | ||
1582 | case EM28178_BOARD_PCTV_292E: | 1612 | case EM28178_BOARD_PCTV_292E: |
1583 | { | 1613 | { |
1584 | struct i2c_adapter *adapter; | 1614 | struct i2c_adapter *adapter; |