[media] smipcie: use add_i2c_client and del_i2c_client functions
authorNibble Max <nibble.max@gmail.com>
Sat, 8 Nov 2014 11:35:08 +0000 (08:35 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Tue, 25 Nov 2014 14:32:56 +0000 (12:32 -0200)
v2:
-no change, just resend with other patches.

"add_i2c_client" and "del_i2c_client" functions make code shorter and easy to maintain.

Signed-off-by: Nibble Max <nibble.max@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/pci/smipcie/smipcie.c

index 8dc6afa50edb48e3ddf96e591e4a3c34ac860572..39614a47af1e301755f0cb94d25aa630079afcfb 100644 (file)
@@ -477,6 +477,33 @@ static irqreturn_t smi_irq_handler(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
+static struct i2c_client *smi_add_i2c_client(struct i2c_adapter *adapter,
+                       struct i2c_board_info *info)
+{
+       struct i2c_client *client;
+
+       request_module(info->type);
+       client = i2c_new_device(adapter, info);
+       if (client == NULL || client->dev.driver == NULL)
+               goto err_add_i2c_client;
+
+       if (!try_module_get(client->dev.driver->owner)) {
+               i2c_unregister_device(client);
+               goto err_add_i2c_client;
+       }
+       return client;
+
+err_add_i2c_client:
+       client = NULL;
+       return client;
+}
+
+static void smi_del_i2c_client(struct i2c_client *client)
+{
+       module_put(client->dev.driver->owner);
+       i2c_unregister_device(client);
+}
+
 static const struct m88ds3103_config smi_dvbsky_m88ds3103_cfg = {
        .i2c_addr = 0x68,
        .clock = 27000000,
@@ -517,18 +544,12 @@ static int smi_dvbsky_m88ds3103_fe_attach(struct smi_port *port)
        strlcpy(tuner_info.type, "m88ts2022", I2C_NAME_SIZE);
        tuner_info.addr = 0x60;
        tuner_info.platform_data = &m88ts2022_config;
-       request_module("m88ts2022");
-       tuner_client = i2c_new_device(tuner_i2c_adapter, &tuner_info);
-       if (tuner_client == NULL || tuner_client->dev.driver == NULL) {
+       tuner_client = smi_add_i2c_client(tuner_i2c_adapter, &tuner_info);
+       if (!tuner_client) {
                ret = -ENODEV;
                goto err_tuner_i2c_device;
        }
 
-       if (!try_module_get(tuner_client->dev.driver->owner)) {
-               ret = -ENODEV;
-               goto err_tuner_i2c_module;
-       }
-
        /* delegate signal strength measurement to tuner */
        port->fe->ops.read_signal_strength =
                        port->fe->ops.tuner_ops.get_rf_strength;
@@ -536,8 +557,6 @@ static int smi_dvbsky_m88ds3103_fe_attach(struct smi_port *port)
        port->i2c_client_tuner = tuner_client;
        return ret;
 
-err_tuner_i2c_module:
-       i2c_unregister_device(tuner_client);
 err_tuner_i2c_device:
        dvb_frontend_detach(port->fe);
        return ret;
@@ -581,18 +600,12 @@ static int smi_dvbsky_m88rs6000_fe_attach(struct smi_port *port)
        strlcpy(tuner_info.type, "m88rs6000t", I2C_NAME_SIZE);
        tuner_info.addr = 0x21;
        tuner_info.platform_data = &m88rs6000t_config;
-       request_module("m88rs6000t");
-       tuner_client = i2c_new_device(tuner_i2c_adapter, &tuner_info);
-       if (tuner_client == NULL || tuner_client->dev.driver == NULL) {
+       tuner_client = smi_add_i2c_client(tuner_i2c_adapter, &tuner_info);
+       if (!tuner_client) {
                ret = -ENODEV;
                goto err_tuner_i2c_device;
        }
 
-       if (!try_module_get(tuner_client->dev.driver->owner)) {
-               ret = -ENODEV;
-               goto err_tuner_i2c_module;
-       }
-
        /* delegate signal strength measurement to tuner */
        port->fe->ops.read_signal_strength =
                        port->fe->ops.tuner_ops.get_rf_strength;
@@ -600,8 +613,6 @@ static int smi_dvbsky_m88rs6000_fe_attach(struct smi_port *port)
        port->i2c_client_tuner = tuner_client;
        return ret;
 
-err_tuner_i2c_module:
-       i2c_unregister_device(tuner_client);
 err_tuner_i2c_device:
        dvb_frontend_detach(port->fe);
        return ret;
@@ -631,7 +642,10 @@ static int smi_fe_init(struct smi_port *port)
        /* register dvb frontend */
        ret = dvb_register_frontend(adap, port->fe);
        if (ret < 0) {
-               i2c_unregister_device(port->i2c_client_tuner);
+               if (port->i2c_client_tuner)
+                       smi_del_i2c_client(port->i2c_client_tuner);
+               if (port->i2c_client_demod)
+                       smi_del_i2c_client(port->i2c_client_demod);
                dvb_frontend_detach(port->fe);
                return ret;
        }
@@ -645,15 +659,12 @@ static int smi_fe_init(struct smi_port *port)
 
 static void smi_fe_exit(struct smi_port *port)
 {
-       struct i2c_client *tuner_client;
-
        dvb_unregister_frontend(port->fe);
-       /* remove I2C tuner */
-       tuner_client = port->i2c_client_tuner;
-       if (tuner_client) {
-               module_put(tuner_client->dev.driver->owner);
-               i2c_unregister_device(tuner_client);
-       }
+       /* remove I2C demod and tuner */
+       if (port->i2c_client_tuner)
+               smi_del_i2c_client(port->i2c_client_tuner);
+       if (port->i2c_client_demod)
+               smi_del_i2c_client(port->i2c_client_demod);
        dvb_frontend_detach(port->fe);
 }