]> git.karo-electronics.de Git - linux-beck.git/commitdiff
[media] rtl28xxu: switch rtl2832 demod attach to I2C binding
authorAntti Palosaari <crope@iki.fi>
Tue, 2 Dec 2014 14:00:23 +0000 (11:00 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Tue, 27 Jan 2015 12:57:18 +0000 (10:57 -0200)
As rtl2832 driver support now I2C binding we will switch to that one.

Tested-by: Benjamin Larsson <benjamin@southpole.se>
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/usb/dvb-usb-v2/rtl28xxu.c
drivers/media/usb/dvb-usb-v2/rtl28xxu.h

index 73580f8d5a17c2d7d3cff59db713a0ccc31d9470..21657341ce35d2b88965d81af078a8c34b679adb 100644 (file)
@@ -790,7 +790,10 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
        int ret;
        struct dvb_usb_device *d = adap_to_d(adap);
        struct rtl28xxu_priv *priv = d_to_priv(d);
+       struct rtl2832_platform_data platform_data;
        const struct rtl2832_config *rtl2832_config;
+       struct i2c_board_info board_info = {};
+       struct i2c_client *client;
 
        dev_dbg(&d->udev->dev, "%s:\n", __func__);
 
@@ -823,12 +826,26 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
        }
 
        /* attach demodulator */
-       adap->fe[0] = dvb_attach(rtl2832_attach, rtl2832_config, &d->i2c_adap);
-       if (!adap->fe[0]) {
+       platform_data.config = rtl2832_config;
+       platform_data.dvb_frontend = &adap->fe[0];
+       strlcpy(board_info.type, "rtl2832", I2C_NAME_SIZE);
+       board_info.addr = 0x10;
+       board_info.platform_data = &platform_data;
+       request_module("%s", board_info.type);
+       client = i2c_new_device(&d->i2c_adap, &board_info);
+       if (client == NULL || client->dev.driver == NULL) {
+               ret = -ENODEV;
+               goto err;
+       }
+
+       if (!try_module_get(client->dev.driver->owner)) {
+               i2c_unregister_device(client);
                ret = -ENODEV;
                goto err;
        }
 
+       priv->i2c_client_demod = client;
+
        /* RTL2832 I2C repeater */
        priv->demod_i2c_adapter = rtl2832_get_i2c_adapter(adap->fe[0]);
 
@@ -837,7 +854,6 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
 
        if (priv->slave_demod) {
                struct i2c_board_info info = {};
-               struct i2c_client *client;
 
                /*
                 * We continue on reduced mode, without DVB-T2/C, using master
@@ -1190,6 +1206,13 @@ static void rtl28xxu_exit(struct dvb_usb_device *d)
                i2c_unregister_device(client);
        }
 
+       /* remove I2C demod */
+       client = priv->i2c_client_demod;
+       if (client) {
+               module_put(client->dev.driver->owner);
+               i2c_unregister_device(client);
+       }
+
        return;
 }
 
index 3e3ea9d64a38e8a818ad4230cfc589a2711d62b5..e52a2b731b927ef94f9a5536ed260b1f58684c13 100644 (file)
@@ -57,6 +57,7 @@ struct rtl28xxu_priv {
        u8 page; /* integrated demod active register page */
        struct i2c_adapter *demod_i2c_adapter;
        bool rc_active;
+       struct i2c_client *i2c_client_demod;
        struct i2c_client *i2c_client_tuner;
        struct i2c_client *i2c_client_slave_demod;
        #define SLAVE_DEMOD_NONE           0