media: ngene: adapt cxd2099 attach to the new i2c_client way
authorDaniel Scheller <d.scheller@gmx.net>
Thu, 8 Feb 2018 19:53:15 +0000 (14:53 -0500)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Tue, 6 Mar 2018 13:48:59 +0000 (08:48 -0500)
Change the way the cxd2099 hardware is being attached to the new I2C
client interface way.

Signed-off-by: Daniel Scheller <d.scheller@gmx.net>
Signed-off-by: Jasmin Jessich <jasmin@anw.at>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/pci/ngene/ngene-core.c
drivers/media/pci/ngene/ngene.h

index 8c92cb7f7e72f7af8ca6411ec60db81c8b95bbaa..80db777cb7ec998ee0238f0d5c0817b83e4201d9 100644 (file)
@@ -1562,9 +1562,8 @@ static int init_channels(struct ngene *dev)
        return 0;
 }
 
-static struct cxd2099_cfg cxd_cfg = {
+static const struct cxd2099_cfg cxd_cfgtmpl = {
        .bitrate = 62000,
-       .adr = 0x40,
        .polarity = 0,
        .clock_mode = 0,
 };
@@ -1572,18 +1571,52 @@ static struct cxd2099_cfg cxd_cfg = {
 static void cxd_attach(struct ngene *dev)
 {
        struct ngene_ci *ci = &dev->ci;
+       struct cxd2099_cfg cxd_cfg = cxd_cfgtmpl;
+       struct i2c_client *client;
+       struct i2c_board_info board_info = {
+               .type = "cxd2099",
+               .addr = 0x40,
+               .platform_data = &cxd_cfg,
+       };
+
+       cxd_cfg.en = &ci->en;
+
+       request_module(board_info.type);
+
+       client = i2c_new_device(&dev->channel[0].i2c_adapter, &board_info);
+       if (!client || !client->dev.driver)
+               goto err_ret;
+
+       if (!try_module_get(client->dev.driver->owner))
+               goto err_i2c;
+
+       if (!ci->en)
+               goto err_i2c;
 
-       ci->en = cxd2099_attach(&cxd_cfg, dev, &dev->channel[0].i2c_adapter);
        ci->dev = dev;
+       dev->channel[0].i2c_client[0] = client;
+       return;
+
+err_i2c:
+       i2c_unregister_device(client);
+err_ret:
+       printk(KERN_ERR DEVICE_NAME ": CXD2099AR attach failed\n");
        return;
 }
 
 static void cxd_detach(struct ngene *dev)
 {
        struct ngene_ci *ci = &dev->ci;
+       struct i2c_client *client;
 
        dvb_ca_en50221_release(ci->en);
-       kfree(ci->en);
+
+       client = dev->channel[0].i2c_client[0];
+       if (client) {
+               module_put(client->dev.driver->owner);
+               i2c_unregister_device(client);
+       }
+
        ci->en = NULL;
 }
 
index 02dbd18f92d09345df388ec01f1ea16bc7827ebc..caf8602c74590f54f4db03269f9e6755427f765d 100644 (file)
@@ -630,6 +630,7 @@ struct ngene_vopen {
 struct ngene_channel {
        struct device         device;
        struct i2c_adapter    i2c_adapter;
+       struct i2c_client    *i2c_client[1];
 
        struct ngene         *dev;
        int                   number;