mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-05 21:35:04 +08:00
[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>
This commit is contained in:
parent
675ee80163
commit
35ef193b2a
@ -335,14 +335,12 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap,
|
||||
/* TODO: correct limits > 40 */
|
||||
ret = -EOPNOTSUPP;
|
||||
} else if ((msg[0].addr == state->af9033_i2c_addr[0]) ||
|
||||
(msg[0].addr == state->af9033_i2c_addr[1]) ||
|
||||
(state->chip_type == 0x9135)) {
|
||||
(msg[0].addr == state->af9033_i2c_addr[1])) {
|
||||
/* demod access via firmware interface */
|
||||
u32 reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 |
|
||||
msg[0].buf[2];
|
||||
|
||||
if (msg[0].addr == state->af9033_i2c_addr[1] ||
|
||||
msg[0].addr == (state->af9033_i2c_addr[1] >> 1))
|
||||
if (msg[0].addr == state->af9033_i2c_addr[1])
|
||||
reg |= 0x100000;
|
||||
|
||||
ret = af9035_rd_regs(d, reg, &msg[1].buf[0],
|
||||
@ -396,14 +394,12 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap,
|
||||
/* TODO: correct limits > 40 */
|
||||
ret = -EOPNOTSUPP;
|
||||
} else if ((msg[0].addr == state->af9033_i2c_addr[0]) ||
|
||||
(msg[0].addr == state->af9033_i2c_addr[1]) ||
|
||||
(state->chip_type == 0x9135)) {
|
||||
(msg[0].addr == state->af9033_i2c_addr[1])) {
|
||||
/* demod access via firmware interface */
|
||||
u32 reg = msg[0].buf[0] << 16 | msg[0].buf[1] << 8 |
|
||||
msg[0].buf[2];
|
||||
|
||||
if (msg[0].addr == state->af9033_i2c_addr[1] ||
|
||||
msg[0].addr == (state->af9033_i2c_addr[1] >> 1))
|
||||
if (msg[0].addr == state->af9033_i2c_addr[1])
|
||||
reg |= 0x100000;
|
||||
|
||||
ret = af9035_wr_regs(d, reg, &msg[0].buf[3],
|
||||
@ -1250,30 +1246,11 @@ static int af9035_frontend_detach(struct dvb_usb_adapter *adap)
|
||||
struct state *state = adap_to_priv(adap);
|
||||
struct dvb_usb_device *d = adap_to_d(adap);
|
||||
struct usb_interface *intf = d->intf;
|
||||
int demod2;
|
||||
|
||||
dev_dbg(&intf->dev, "adap->id=%d\n", adap->id);
|
||||
|
||||
/*
|
||||
* For dual tuner devices we have to resolve 2nd demod client, as there
|
||||
* is two different kind of tuner drivers; one is using I2C binding
|
||||
* and the other is using DVB attach/detach binding.
|
||||
*/
|
||||
switch (state->af9033_config[adap->id].tuner) {
|
||||
case AF9033_TUNER_IT9135_38:
|
||||
case AF9033_TUNER_IT9135_51:
|
||||
case AF9033_TUNER_IT9135_52:
|
||||
case AF9033_TUNER_IT9135_60:
|
||||
case AF9033_TUNER_IT9135_61:
|
||||
case AF9033_TUNER_IT9135_62:
|
||||
demod2 = 2;
|
||||
break;
|
||||
default:
|
||||
demod2 = 1;
|
||||
}
|
||||
|
||||
if (adap->id == 1) {
|
||||
if (state->i2c_client[demod2])
|
||||
if (state->i2c_client[1])
|
||||
af9035_del_i2c_dev(d);
|
||||
} else if (adap->id == 0) {
|
||||
if (state->i2c_client[0])
|
||||
@ -1513,50 +1490,58 @@ static int af9035_tuner_attach(struct dvb_usb_adapter *adap)
|
||||
case AF9033_TUNER_IT9135_38:
|
||||
case AF9033_TUNER_IT9135_51:
|
||||
case AF9033_TUNER_IT9135_52:
|
||||
{
|
||||
struct it913x_config it913x_config = {
|
||||
.fe = adap->fe[0],
|
||||
.chip_ver = 1,
|
||||
};
|
||||
|
||||
if (state->dual_mode) {
|
||||
if (adap->id == 0)
|
||||
it913x_config.role = IT913X_ROLE_DUAL_MASTER;
|
||||
else
|
||||
it913x_config.role = IT913X_ROLE_DUAL_SLAVE;
|
||||
}
|
||||
|
||||
ret = af9035_add_i2c_dev(d, "it913x",
|
||||
state->af9033_i2c_addr[adap->id] >> 1,
|
||||
&it913x_config, &d->i2c_adap);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
fe = adap->fe[0];
|
||||
break;
|
||||
}
|
||||
case AF9033_TUNER_IT9135_60:
|
||||
case AF9033_TUNER_IT9135_61:
|
||||
case AF9033_TUNER_IT9135_62:
|
||||
{
|
||||
struct it913x_config it913x_config = {
|
||||
struct platform_device *pdev;
|
||||
struct it913x_platform_data it913x_pdata = {
|
||||
.regmap = state->af9033_config[adap->id].regmap,
|
||||
.fe = adap->fe[0],
|
||||
.chip_ver = 2,
|
||||
};
|
||||
|
||||
switch (state->af9033_config[adap->id].tuner) {
|
||||
case AF9033_TUNER_IT9135_38:
|
||||
case AF9033_TUNER_IT9135_51:
|
||||
case AF9033_TUNER_IT9135_52:
|
||||
it913x_pdata.chip_ver = 1;
|
||||
break;
|
||||
case AF9033_TUNER_IT9135_60:
|
||||
case AF9033_TUNER_IT9135_61:
|
||||
case AF9033_TUNER_IT9135_62:
|
||||
it913x_pdata.chip_ver = 2;
|
||||
break;
|
||||
default:
|
||||
ret = -ENODEV;
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (state->dual_mode) {
|
||||
if (adap->id == 0)
|
||||
it913x_config.role = IT913X_ROLE_DUAL_MASTER;
|
||||
it913x_pdata.role = IT913X_ROLE_DUAL_MASTER;
|
||||
else
|
||||
it913x_config.role = IT913X_ROLE_DUAL_SLAVE;
|
||||
it913x_pdata.role = IT913X_ROLE_DUAL_SLAVE;
|
||||
} else {
|
||||
it913x_pdata.role = IT913X_ROLE_SINGLE;
|
||||
}
|
||||
|
||||
ret = af9035_add_i2c_dev(d, "it913x",
|
||||
state->af9033_i2c_addr[adap->id] >> 1,
|
||||
&it913x_config, &d->i2c_adap);
|
||||
if (ret)
|
||||
request_module("%s", "it913x");
|
||||
pdev = platform_device_register_data(&d->intf->dev,
|
||||
"it913x",
|
||||
PLATFORM_DEVID_AUTO,
|
||||
&it913x_pdata,
|
||||
sizeof(it913x_pdata));
|
||||
if (IS_ERR(pdev) || !pdev->dev.driver) {
|
||||
ret = -ENODEV;
|
||||
goto err;
|
||||
}
|
||||
if (!try_module_get(pdev->dev.driver->owner)) {
|
||||
platform_device_unregister(pdev);
|
||||
ret = -ENODEV;
|
||||
goto err;
|
||||
}
|
||||
|
||||
state->platform_device_tuner[adap->id] = pdev;
|
||||
fe = adap->fe[0];
|
||||
break;
|
||||
}
|
||||
@ -1678,12 +1663,6 @@ static int af9035_tuner_detach(struct dvb_usb_adapter *adap)
|
||||
switch (state->af9033_config[adap->id].tuner) {
|
||||
case AF9033_TUNER_TUA9001:
|
||||
case AF9033_TUNER_FC2580:
|
||||
case AF9033_TUNER_IT9135_38:
|
||||
case AF9033_TUNER_IT9135_51:
|
||||
case AF9033_TUNER_IT9135_52:
|
||||
case AF9033_TUNER_IT9135_60:
|
||||
case AF9033_TUNER_IT9135_61:
|
||||
case AF9033_TUNER_IT9135_62:
|
||||
if (adap->id == 1) {
|
||||
if (state->i2c_client[3])
|
||||
af9035_del_i2c_dev(d);
|
||||
@ -1691,6 +1670,23 @@ static int af9035_tuner_detach(struct dvb_usb_adapter *adap)
|
||||
if (state->i2c_client[1])
|
||||
af9035_del_i2c_dev(d);
|
||||
}
|
||||
break;
|
||||
case AF9033_TUNER_IT9135_38:
|
||||
case AF9033_TUNER_IT9135_51:
|
||||
case AF9033_TUNER_IT9135_52:
|
||||
case AF9033_TUNER_IT9135_60:
|
||||
case AF9033_TUNER_IT9135_61:
|
||||
case AF9033_TUNER_IT9135_62:
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
|
||||
pdev = state->platform_device_tuner[adap->id];
|
||||
if (pdev) {
|
||||
module_put(pdev->dev.driver->owner);
|
||||
platform_device_unregister(pdev);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -22,6 +22,7 @@
|
||||
#ifndef AF9035_H
|
||||
#define AF9035_H
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include "dvb_usb.h"
|
||||
#include "af9033.h"
|
||||
#include "tua9001.h"
|
||||
@ -73,6 +74,7 @@ struct state {
|
||||
#define AF9035_I2C_CLIENT_MAX 4
|
||||
struct i2c_client *i2c_client[AF9035_I2C_CLIENT_MAX];
|
||||
struct i2c_adapter *i2c_adapter_demod;
|
||||
struct platform_device *platform_device_tuner[2];
|
||||
};
|
||||
|
||||
static const u32 clock_lut_af9035[] = {
|
||||
|
Loading…
Reference in New Issue
Block a user