diff mbox

[3/4,media] ddbridge: use common DVB I2C client handling helpers

Message ID 20180307192350.930-4-d.scheller.oss@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Daniel Scheller March 7, 2018, 7:23 p.m. UTC
From: Daniel Scheller <d.scheller@gmx.net>

Instead of keeping duplicated I2C client handling construct, make use of
the newly introduced dvb_module_*() helpers. This not only keeps things
way cleaner and removes the need for duplicated I2C client attach code,
but even allows to get rid of some variables that won't help in making
things look cleaner anymore.

The check on a valid ptr on port->en isn't really needed since the cxd2099
driver will set it at a time where it is going to return successfully
from probing.

Signed-off-by: Daniel Scheller <d.scheller@gmx.net>
---
 drivers/media/pci/ddbridge/ddbridge-ci.c   | 33 ++++++--------------------
 drivers/media/pci/ddbridge/ddbridge-core.c | 37 +++++++-----------------------
 2 files changed, 15 insertions(+), 55 deletions(-)

Comments

Mauro Carvalho Chehab March 7, 2018, 7:44 p.m. UTC | #1
Em Wed,  7 Mar 2018 20:23:49 +0100
Daniel Scheller <d.scheller.oss@gmail.com> escreveu:

> From: Daniel Scheller <d.scheller@gmx.net>
> 
> Instead of keeping duplicated I2C client handling construct, make use of
> the newly introduced dvb_module_*() helpers. This not only keeps things
> way cleaner and removes the need for duplicated I2C client attach code,
> but even allows to get rid of some variables that won't help in making
> things look cleaner anymore.
> 
> The check on a valid ptr on port->en isn't really needed since the cxd2099
> driver will set it at a time where it is going to return successfully
> from probing.
> 
> Signed-off-by: Daniel Scheller <d.scheller@gmx.net>
> ---
>  drivers/media/pci/ddbridge/ddbridge-ci.c   | 33 ++++++--------------------
>  drivers/media/pci/ddbridge/ddbridge-core.c | 37 +++++++-----------------------
>  2 files changed, 15 insertions(+), 55 deletions(-)
> 
> diff --git a/drivers/media/pci/ddbridge/ddbridge-ci.c b/drivers/media/pci/ddbridge/ddbridge-ci.c
> index 6585ef54ac22..d0ce6a1f1bd0 100644
> --- a/drivers/media/pci/ddbridge/ddbridge-ci.c
> +++ b/drivers/media/pci/ddbridge/ddbridge-ci.c
> @@ -324,34 +324,20 @@ static int ci_cxd2099_attach(struct ddb_port *port, u32 bitrate)
>  {
>  	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.bitrate = bitrate;
>  	cxd_cfg.en = &port->en;
>  
> -	request_module(board_info.type);
> -
> -	client = i2c_new_device(&port->i2c->adap, &board_info);
> -	if (!client || !client->dev.driver)
> -		goto err_ret;
> -
> -	if (!try_module_get(client->dev.driver->owner))
> -		goto err_i2c;
> -
> -	if (!port->en)
> -		goto err_i2c;
> +	client = dvb_module_probe("cxd2099", "cxd2099", &port->i2c->adap,
> +				  0x40, &cxd_cfg);

Here and on all similar calls, there's no need to duplicate the name, if
they're identical. Just use NULL at the second time, e. g.:

	client = dvb_module_probe("cxd2099", NULL, &port->i2c->adap,
				  0x40, &cxd_cfg);

The dvb_module_probe() will use the same string for both.

Regards,
Mauro
Daniel Scheller March 7, 2018, 8:09 p.m. UTC | #2
Am Wed, 7 Mar 2018 16:44:49 -0300
schrieb Mauro Carvalho Chehab <mchehab@kernel.org>:

> Em Wed,  7 Mar 2018 20:23:49 +0100
> Daniel Scheller <d.scheller.oss@gmail.com> escreveu:
> 
> > From: Daniel Scheller <d.scheller@gmx.net>
> > 
> > Instead of keeping duplicated I2C client handling construct, make
> > use of the newly introduced dvb_module_*() helpers. This not only
> > keeps things way cleaner and removes the need for duplicated I2C
> > client attach code, but even allows to get rid of some variables
> > that won't help in making things look cleaner anymore.
> > 
> > The check on a valid ptr on port->en isn't really needed since the
> > cxd2099 driver will set it at a time where it is going to return
> > successfully from probing.
> > 
> > Signed-off-by: Daniel Scheller <d.scheller@gmx.net>
> > ---
> >  drivers/media/pci/ddbridge/ddbridge-ci.c   | 33
> > ++++++--------------------
> > drivers/media/pci/ddbridge/ddbridge-core.c | 37
> > +++++++----------------------- 2 files changed, 15 insertions(+),
> > 55 deletions(-)
> > 
> > diff --git a/drivers/media/pci/ddbridge/ddbridge-ci.c
> > b/drivers/media/pci/ddbridge/ddbridge-ci.c index
> > 6585ef54ac22..d0ce6a1f1bd0 100644 ---
> > a/drivers/media/pci/ddbridge/ddbridge-ci.c +++
> > b/drivers/media/pci/ddbridge/ddbridge-ci.c @@ -324,34 +324,20 @@
> > static int ci_cxd2099_attach(struct ddb_port *port, u32 bitrate) {
> >  	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.bitrate = bitrate;
> >  	cxd_cfg.en = &port->en;
> >  
> > -	request_module(board_info.type);
> > -
> > -	client = i2c_new_device(&port->i2c->adap, &board_info);
> > -	if (!client || !client->dev.driver)
> > -		goto err_ret;
> > -
> > -	if (!try_module_get(client->dev.driver->owner))
> > -		goto err_i2c;
> > -
> > -	if (!port->en)
> > -		goto err_i2c;
> > +	client = dvb_module_probe("cxd2099", "cxd2099",
> > &port->i2c->adap,
> > +				  0x40, &cxd_cfg);  
> 
> Here and on all similar calls, there's no need to duplicate the name,
> if they're identical. Just use NULL at the second time, e. g.:
> 
> 	client = dvb_module_probe("cxd2099", NULL, &port->i2c->adap,
> 				  0x40, &cxd_cfg);
> 
> The dvb_module_probe() will use the same string for both.

Convinced (wanted to make this look "complete" and "proper").

V2 sent, skipped the cover letter though :-)

Best regards,
Daniel Scheller
diff mbox

Patch

diff --git a/drivers/media/pci/ddbridge/ddbridge-ci.c b/drivers/media/pci/ddbridge/ddbridge-ci.c
index 6585ef54ac22..d0ce6a1f1bd0 100644
--- a/drivers/media/pci/ddbridge/ddbridge-ci.c
+++ b/drivers/media/pci/ddbridge/ddbridge-ci.c
@@ -324,34 +324,20 @@  static int ci_cxd2099_attach(struct ddb_port *port, u32 bitrate)
 {
 	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.bitrate = bitrate;
 	cxd_cfg.en = &port->en;
 
-	request_module(board_info.type);
-
-	client = i2c_new_device(&port->i2c->adap, &board_info);
-	if (!client || !client->dev.driver)
-		goto err_ret;
-
-	if (!try_module_get(client->dev.driver->owner))
-		goto err_i2c;
-
-	if (!port->en)
-		goto err_i2c;
+	client = dvb_module_probe("cxd2099", "cxd2099", &port->i2c->adap,
+				  0x40, &cxd_cfg);
+	if (!client)
+		goto err;
 
 	port->dvb[0].i2c_client[0] = client;
 	port->en_freedata = 0;
 	return 0;
 
-err_i2c:
-	i2c_unregister_device(client);
-err_ret:
+err:
 	dev_err(port->dev->dev, "CXD2099AR attach failed\n");
 	return -ENODEV;
 }
@@ -385,18 +371,13 @@  int ddb_ci_attach(struct ddb_port *port, u32 bitrate)
 
 void ddb_ci_detach(struct ddb_port *port)
 {
-	struct i2c_client *client;
-
 	if (port->dvb[0].dev)
 		dvb_unregister_device(port->dvb[0].dev);
 	if (port->en) {
 		dvb_ca_en50221_release(port->en);
 
-		client = port->dvb[0].i2c_client[0];
-		if (client) {
-			module_put(client->dev.driver->owner);
-			i2c_unregister_device(client);
-		}
+		dvb_module_release(port->dvb[0].i2c_client[0]);
+		port->dvb[0].i2c_client[0] = NULL;
 
 		/* free alloc'ed memory if needed */
 		if (port->en_freedata)
diff --git a/drivers/media/pci/ddbridge/ddbridge-core.c b/drivers/media/pci/ddbridge/ddbridge-core.c
index f9bee36f1cad..36d2deb1c106 100644
--- a/drivers/media/pci/ddbridge/ddbridge-core.c
+++ b/drivers/media/pci/ddbridge/ddbridge-core.c
@@ -999,37 +999,22 @@  static int tuner_attach_tda18212(struct ddb_input *input, u32 porttype)
 		.if_dvbt2_8 = 4000,
 		.if_dvbc = 5000,
 	};
-	struct i2c_board_info board_info = {
-		.type = "tda18212",
-		.platform_data = &config,
-	};
-
-	if (input->nr & 1)
-		board_info.addr = 0x63;
-	else
-		board_info.addr = 0x60;
+	u8 addr = (input->nr & 1) ? 0x63 : 0x60;
 
 	/* due to a hardware quirk with the I2C gate on the stv0367+tda18212
 	 * combo, the tda18212 must be probed by reading it's id _twice_ when
 	 * cold started, or it very likely will fail.
 	 */
 	if (porttype == DDB_TUNER_DVBCT_ST)
-		tuner_tda18212_ping(input, board_info.addr);
-
-	request_module(board_info.type);
-
-	/* perform tuner init/attach */
-	client = i2c_new_device(adapter, &board_info);
-	if (!client || !client->dev.driver)
-		goto err;
+		tuner_tda18212_ping(input, addr);
 
-	if (!try_module_get(client->dev.driver->owner)) {
-		i2c_unregister_device(client);
+	/* perform tuner probe/init/attach */
+	client = dvb_module_probe("tda18212", "tda18212",
+				  adapter, addr, &config);
+	if (!client)
 		goto err;
-	}
 
 	dvb->i2c_client[0] = client;
-
 	return 0;
 err:
 	dev_err(dev, "TDA18212 tuner not found. Device is not fully operational.\n");
@@ -1253,7 +1238,6 @@  static void dvb_input_detach(struct ddb_input *input)
 {
 	struct ddb_dvb *dvb = &input->port->dvb[input->nr & 1];
 	struct dvb_demux *dvbdemux = &dvb->demux;
-	struct i2c_client *client;
 
 	switch (dvb->attached) {
 	case 0x31:
@@ -1263,13 +1247,8 @@  static void dvb_input_detach(struct ddb_input *input)
 			dvb_unregister_frontend(dvb->fe);
 		/* fallthrough */
 	case 0x30:
-		client = dvb->i2c_client[0];
-		if (client) {
-			module_put(client->dev.driver->owner);
-			i2c_unregister_device(client);
-			dvb->i2c_client[0] = NULL;
-			client = NULL;
-		}
+		dvb_module_release(dvb->i2c_client[0]);
+		dvb->i2c_client[0] = NULL;
 
 		if (dvb->fe2)
 			dvb_frontend_detach(dvb->fe2);