All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/2] smipcie: use add_i2c_client and del_i2c_client functions.
@ 2014-11-08 11:35 Nibble Max
  0 siblings, 0 replies; only message in thread
From: Nibble Max @ 2014-11-08 11:35 UTC (permalink / raw)
  To: Olli Salonen; +Cc: linux-media, Antti Palosaari

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>
---
 drivers/media/pci/smipcie/smipcie.c | 69 +++++++++++++++++++++----------------
 1 file changed, 40 insertions(+), 29 deletions(-)

diff --git a/drivers/media/pci/smipcie/smipcie.c b/drivers/media/pci/smipcie/smipcie.c
index d1c1463..c27e45b 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);
 }

-- 
1.9.1


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2014-11-08 11:35 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-08 11:35 [PATCH v2 1/2] smipcie: use add_i2c_client and del_i2c_client functions Nibble Max

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.