diff mbox

[4/6] em28xx: implement FE set_lna() callback

Message ID 1345167310-8738-5-git-send-email-crope@iki.fi (mailing list archive)
State New, archived
Headers show

Commit Message

Antti Palosaari Aug. 17, 2012, 1:35 a.m. UTC
Make LNA run-time switching possible for PCTV nanoStick T2 290e!

Signed-off-by: Antti Palosaari <crope@iki.fi>
---
 drivers/media/usb/em28xx/em28xx-dvb.c | 40 ++++++++++++++++++++++++++++++-----
 1 file changed, 35 insertions(+), 5 deletions(-)

Comments

Mauro Carvalho Chehab Sept. 27, 2012, 5:41 p.m. UTC | #1
Em Fri, 17 Aug 2012 04:35:08 +0300
Antti Palosaari <crope@iki.fi> escreveu:

> Make LNA run-time switching possible for PCTV nanoStick T2 290e!
> 
> Signed-off-by: Antti Palosaari <crope@iki.fi>
> ---
>  drivers/media/usb/em28xx/em28xx-dvb.c | 40 ++++++++++++++++++++++++++++++-----
>  1 file changed, 35 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/media/usb/em28xx/em28xx-dvb.c b/drivers/media/usb/em28xx/em28xx-dvb.c
> index 34c5ea9..75f907a 100644
> --- a/drivers/media/usb/em28xx/em28xx-dvb.c
> +++ b/drivers/media/usb/em28xx/em28xx-dvb.c
> @@ -81,6 +81,7 @@ struct em28xx_dvb {
>  	int (*gate_ctrl)(struct dvb_frontend *, int);
>  	struct semaphore      pll_mutex;
>  	bool			dont_attach_fe1;
> +	int			gpio;

Please, don't call it simply as "gpio". There are 12 GPIO pins at em28xx devices,
used by tuners, demods, IR's, LED's, etc. Instead, you should associate it
with its function. I would call it as "lna_gpio" (or something like that).

>  };
>  
>  
> @@ -568,6 +569,33 @@ static void pctv_520e_init(struct em28xx *dev)
>  		i2c_master_send(&dev->i2c_client, regs[i].r, regs[i].len);
>  };
>  
> +static int em28xx_pctv_290e_set_lna(struct dvb_frontend *fe, int val)
> +{
> +	struct em28xx *dev = fe->dvb->priv;
> +#ifdef CONFIG_GPIOLIB
> +	struct em28xx_dvb *dvb = dev->dvb;
> +	int ret;
> +	unsigned long flags;
> +
> +	if (val)
> +		flags = GPIOF_OUT_INIT_LOW;
> +	else
> +		flags = GPIOF_OUT_INIT_HIGH;
> +
> +	ret = gpio_request_one(dvb->gpio, flags, NULL);
> +	if (ret)
> +		em28xx_errdev("gpio request failed %d\n", ret);
> +	else
> +		gpio_free(dvb->gpio);
> +
> +	return ret;
> +#else
> +	dev_warn(&dev->udev->dev, "%s: LNA control is disabled\n",
> +			KBUILD_MODNAME);
> +	return 0;
> +#endif
> +}
> +
>  static int em28xx_mt352_terratec_xs_init(struct dvb_frontend *fe)
>  {
>  	/* Values extracted from a USB trace of the Terratec Windows driver */
> @@ -809,7 +837,7 @@ static void em28xx_unregister_dvb(struct em28xx_dvb *dvb)
>  
>  static int em28xx_dvb_init(struct em28xx *dev)
>  {
> -	int result = 0, mfe_shared = 0, gpio_chip_base;
> +	int result = 0, mfe_shared = 0;
>  	struct em28xx_dvb *dvb;
>  
>  	if (!dev->board.has_dvb) {
> @@ -958,7 +986,7 @@ static int em28xx_dvb_init(struct em28xx *dev)
>  		dvb->fe[0] = dvb_attach(cxd2820r_attach,
>  					&em28xx_cxd2820r_config,
>  					&dev->i2c_adap,
> -					&gpio_chip_base);
> +					&dvb->gpio);
>  		if (dvb->fe[0]) {
>  			/* FE 0 attach tuner */
>  			if (!dvb_attach(tda18271_attach,
> @@ -973,15 +1001,17 @@ static int em28xx_dvb_init(struct em28xx *dev)
>  			}
>  		}
>  
> +#ifdef CONFIG_GPIOLIB
>  		/* enable LNA for DVB-T, DVB-T2 and DVB-C */
> -		result = gpio_request_one(gpio_chip_base, GPIOF_INIT_LOW,
> -				"LNA");
> +		result = gpio_request_one(dvb->gpio, GPIOF_OUT_INIT_LOW, NULL);
>  		if (result)
>  			em28xx_errdev("gpio request failed %d\n", result);
>  		else
> -			gpio_free(gpio_chip_base);
> +			gpio_free(dvb->gpio);
>  
>  		result = 0; /* continue even set LNA fails */
> +#endif
> +		dvb->fe[0]->ops.set_lna = em28xx_pctv_290e_set_lna;
>  		break;
>  	case EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C:
>  	{
Mauro Carvalho Chehab Sept. 27, 2012, 6:21 p.m. UTC | #2
Em Thu, 27 Sep 2012 14:41:25 -0300
Mauro Carvalho Chehab <mchehab@redhat.com> escreveu:

> Em Fri, 17 Aug 2012 04:35:08 +0300
> Antti Palosaari <crope@iki.fi> escreveu:
> 
> > Make LNA run-time switching possible for PCTV nanoStick T2 290e!
> > 
> > Signed-off-by: Antti Palosaari <crope@iki.fi>
> > ---
> >  drivers/media/usb/em28xx/em28xx-dvb.c | 40 ++++++++++++++++++++++++++++++-----
> >  1 file changed, 35 insertions(+), 5 deletions(-)
> > 
> > diff --git a/drivers/media/usb/em28xx/em28xx-dvb.c b/drivers/media/usb/em28xx/em28xx-dvb.c
> > index 34c5ea9..75f907a 100644
> > --- a/drivers/media/usb/em28xx/em28xx-dvb.c
> > +++ b/drivers/media/usb/em28xx/em28xx-dvb.c
> > @@ -81,6 +81,7 @@ struct em28xx_dvb {
> >  	int (*gate_ctrl)(struct dvb_frontend *, int);
> >  	struct semaphore      pll_mutex;
> >  	bool			dont_attach_fe1;
> > +	int			gpio;
> 
> Please, don't call it simply as "gpio". There are 12 GPIO pins at em28xx devices,
> used by tuners, demods, IR's, LED's, etc. Instead, you should associate it
> with its function. I would call it as "lna_gpio" (or something like that).

Due to this changeset, I had to remove those two patches from the list of applied ones.

Aug,17 2012: cxd2820r: use static GPIO config when GPIOLIB is undefined             0006-cxd2820r-use-static-GPIO-config-when-GPIOLIB-is-unde.patch        Antti Palosaari <crope@iki.fi>
Sep,20 2012: em28xx: do not set PCTV 290e LNA handler if fe attach fail             0019-em28xx-do-not-set-PCTV-290e-LNA-handler-if-fe-attach.patch        Antti Palosaari <crope@iki.fi>

Please, re-submit them when you replace "gpio" by something meaningful.

Thanks!
Mauro
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/media/usb/em28xx/em28xx-dvb.c b/drivers/media/usb/em28xx/em28xx-dvb.c
index 34c5ea9..75f907a 100644
--- a/drivers/media/usb/em28xx/em28xx-dvb.c
+++ b/drivers/media/usb/em28xx/em28xx-dvb.c
@@ -81,6 +81,7 @@  struct em28xx_dvb {
 	int (*gate_ctrl)(struct dvb_frontend *, int);
 	struct semaphore      pll_mutex;
 	bool			dont_attach_fe1;
+	int			gpio;
 };
 
 
@@ -568,6 +569,33 @@  static void pctv_520e_init(struct em28xx *dev)
 		i2c_master_send(&dev->i2c_client, regs[i].r, regs[i].len);
 };
 
+static int em28xx_pctv_290e_set_lna(struct dvb_frontend *fe, int val)
+{
+	struct em28xx *dev = fe->dvb->priv;
+#ifdef CONFIG_GPIOLIB
+	struct em28xx_dvb *dvb = dev->dvb;
+	int ret;
+	unsigned long flags;
+
+	if (val)
+		flags = GPIOF_OUT_INIT_LOW;
+	else
+		flags = GPIOF_OUT_INIT_HIGH;
+
+	ret = gpio_request_one(dvb->gpio, flags, NULL);
+	if (ret)
+		em28xx_errdev("gpio request failed %d\n", ret);
+	else
+		gpio_free(dvb->gpio);
+
+	return ret;
+#else
+	dev_warn(&dev->udev->dev, "%s: LNA control is disabled\n",
+			KBUILD_MODNAME);
+	return 0;
+#endif
+}
+
 static int em28xx_mt352_terratec_xs_init(struct dvb_frontend *fe)
 {
 	/* Values extracted from a USB trace of the Terratec Windows driver */
@@ -809,7 +837,7 @@  static void em28xx_unregister_dvb(struct em28xx_dvb *dvb)
 
 static int em28xx_dvb_init(struct em28xx *dev)
 {
-	int result = 0, mfe_shared = 0, gpio_chip_base;
+	int result = 0, mfe_shared = 0;
 	struct em28xx_dvb *dvb;
 
 	if (!dev->board.has_dvb) {
@@ -958,7 +986,7 @@  static int em28xx_dvb_init(struct em28xx *dev)
 		dvb->fe[0] = dvb_attach(cxd2820r_attach,
 					&em28xx_cxd2820r_config,
 					&dev->i2c_adap,
-					&gpio_chip_base);
+					&dvb->gpio);
 		if (dvb->fe[0]) {
 			/* FE 0 attach tuner */
 			if (!dvb_attach(tda18271_attach,
@@ -973,15 +1001,17 @@  static int em28xx_dvb_init(struct em28xx *dev)
 			}
 		}
 
+#ifdef CONFIG_GPIOLIB
 		/* enable LNA for DVB-T, DVB-T2 and DVB-C */
-		result = gpio_request_one(gpio_chip_base, GPIOF_INIT_LOW,
-				"LNA");
+		result = gpio_request_one(dvb->gpio, GPIOF_OUT_INIT_LOW, NULL);
 		if (result)
 			em28xx_errdev("gpio request failed %d\n", result);
 		else
-			gpio_free(gpio_chip_base);
+			gpio_free(dvb->gpio);
 
 		result = 0; /* continue even set LNA fails */
+#endif
+		dvb->fe[0]->ops.set_lna = em28xx_pctv_290e_set_lna;
 		break;
 	case EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C:
 	{