From: Nibble Max Date: Sat, 8 Nov 2014 11:35:08 +0000 (-0300) Subject: [media] smipcie: use add_i2c_client and del_i2c_client functions X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=344e2e5ed7b3c82ac5f7a7641e4179f3215266b0;p=linux-beck.git [media] smipcie: use add_i2c_client and del_i2c_client functions 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 Signed-off-by: Mauro Carvalho Chehab --- diff --git a/drivers/media/pci/smipcie/smipcie.c b/drivers/media/pci/smipcie/smipcie.c index 8dc6afa50edb..39614a47af1e 100644 --- a/drivers/media/pci/smipcie/smipcie.c +++ b/drivers/media/pci/smipcie/smipcie.c @@ -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); }