linux-media.vger.kernel.org archive mirror
 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).