diff mbox series

[4/5] drm/bridge: ti-tfp410: Add support for the powerdown GPIO

Message ID 20181206202610.18167-5-laurent.pinchart@ideasonboard.com (mailing list archive)
State New, archived
Headers show
Series drm: ti-tfp410 improvements | expand

Commit Message

Laurent Pinchart Dec. 6, 2018, 8:26 p.m. UTC
The TFP410 has a powerdown pin that can be connected to a GPIO to
control power saving. The DT bindings define a corresponding property,
but the driver doesn't implement support for it. Fix that.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/bridge/ti-tfp410.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

Comments

Jyri Sarha Dec. 11, 2018, 1:01 p.m. UTC | #1
On 06/12/2018 22:26, Laurent Pinchart wrote:
> The TFP410 has a powerdown pin that can be connected to a GPIO to
> control power saving. The DT bindings define a corresponding property,
> but the driver doesn't implement support for it. Fix that.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---

I find the naming of the the gpio bit backwards, but I guess it si fine
since it is also the name of the pin.

Reviewed-by: Jyri Sarha <jsarha@ti.com>

>  drivers/gpu/drm/bridge/ti-tfp410.c | 24 ++++++++++++++++++++++++
>  1 file changed, 24 insertions(+)
> 
> diff --git a/drivers/gpu/drm/bridge/ti-tfp410.c b/drivers/gpu/drm/bridge/ti-tfp410.c
> index e4280f5af9f5..d25d23cfe3f5 100644
> --- a/drivers/gpu/drm/bridge/ti-tfp410.c
> +++ b/drivers/gpu/drm/bridge/ti-tfp410.c
> @@ -32,6 +32,7 @@ struct tfp410 {
>  	struct i2c_adapter	*ddc;
>  	struct gpio_desc	*hpd;
>  	struct delayed_work	hpd_work;
> +	struct gpio_desc	*powerdown;
>  
>  	struct device *dev;
>  };
> @@ -139,8 +140,24 @@ static int tfp410_attach(struct drm_bridge *bridge)
>  	return 0;
>  }
>  
> +static void tfp410_enable(struct drm_bridge *bridge)
> +{
> +	struct tfp410 *dvi = drm_bridge_to_tfp410(bridge);
> +
> +	gpiod_set_value_cansleep(dvi->powerdown, 0);
> +}
> +
> +static void tfp410_disable(struct drm_bridge *bridge)
> +{
> +	struct tfp410 *dvi = drm_bridge_to_tfp410(bridge);
> +
> +	gpiod_set_value_cansleep(dvi->powerdown, 1);
> +}
> +
>  static const struct drm_bridge_funcs tfp410_bridge_funcs = {
>  	.attach		= tfp410_attach,
> +	.enable		= tfp410_enable,
> +	.disable	= tfp410_disable,
>  };
>  
>  static void tfp410_hpd_work_func(struct work_struct *work)
> @@ -229,6 +246,13 @@ static int tfp410_init(struct device *dev)
>  	if (ret)
>  		goto fail;
>  
> +	dvi->powerdown = devm_gpiod_get_optional(dev, "powerdown",
> +						 GPIOD_OUT_HIGH);
> +	if (IS_ERR(dvi->powerdown)) {
> +		dev_err(dev, "failed to parse powerdown gpio\n");
> +		return PTR_ERR(dvi->powerdown);
> +	}
> +
>  	if (dvi->hpd) {
>  		INIT_DELAYED_WORK(&dvi->hpd_work, tfp410_hpd_work_func);
>  
>
Laurent Pinchart Dec. 11, 2018, 2:26 p.m. UTC | #2
Hi Jyri,

On Tuesday, 11 December 2018 15:01:52 EET Jyri Sarha wrote:
> On 06/12/2018 22:26, Laurent Pinchart wrote:
> > The TFP410 has a powerdown pin that can be connected to a GPIO to
> > control power saving. The DT bindings define a corresponding property,
> > but the driver doesn't implement support for it. Fix that.
> > 
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > ---
> 
> I find the naming of the the gpio bit backwards, but I guess it si fine
> since it is also the name of the pin.

I would have gone for "enable-gpios", but given that we have DTs in the wild 
using the "powerdown-gpios" property (with the omapdrm-specific TFP410 driver 
which uses the same compatible string as the drm_bridge-based driver) I think 
we need to stick to it. As you mentioned this is the pin's name, so it's not 
too big of a deal.

I'll now wait for your review of patch 5/5 before merging these changes :-) 
The plan is to get them in drm-misc for v4.22, please let me know if that 
causes any problem for you. Also, please feel free to review 1/5 and 2/5 if 
you have time.

> Reviewed-by: Jyri Sarha <jsarha@ti.com>
> 
> >  drivers/gpu/drm/bridge/ti-tfp410.c | 24 ++++++++++++++++++++++++
> >  1 file changed, 24 insertions(+)
> > 
> > diff --git a/drivers/gpu/drm/bridge/ti-tfp410.c
> > b/drivers/gpu/drm/bridge/ti-tfp410.c index e4280f5af9f5..d25d23cfe3f5
> > 100644
> > --- a/drivers/gpu/drm/bridge/ti-tfp410.c
> > +++ b/drivers/gpu/drm/bridge/ti-tfp410.c
> > @@ -32,6 +32,7 @@ struct tfp410 {
> >  	struct i2c_adapter	*ddc;
> >  	struct gpio_desc	*hpd;
> >  	struct delayed_work	hpd_work;
> > +	struct gpio_desc	*powerdown;
> >  	struct device *dev;
> >  };
> > 
> > @@ -139,8 +140,24 @@ static int tfp410_attach(struct drm_bridge *bridge)
> >  	return 0;
> >  }
> > 
> > +static void tfp410_enable(struct drm_bridge *bridge)
> > +{
> > +	struct tfp410 *dvi = drm_bridge_to_tfp410(bridge);
> > +
> > +	gpiod_set_value_cansleep(dvi->powerdown, 0);
> > +}
> > +
> > +static void tfp410_disable(struct drm_bridge *bridge)
> > +{
> > +	struct tfp410 *dvi = drm_bridge_to_tfp410(bridge);
> > +
> > +	gpiod_set_value_cansleep(dvi->powerdown, 1);
> > +}
> > +
> >  static const struct drm_bridge_funcs tfp410_bridge_funcs = {
> >  	.attach		= tfp410_attach,
> > +	.enable		= tfp410_enable,
> > +	.disable	= tfp410_disable,
> >  };
> >  
> >  static void tfp410_hpd_work_func(struct work_struct *work)
> > @@ -229,6 +246,13 @@ static int tfp410_init(struct device *dev)
> >  	if (ret)
> >  		goto fail;
> > 
> > +	dvi->powerdown = devm_gpiod_get_optional(dev, "powerdown",
> > +						 GPIOD_OUT_HIGH);
> > +	if (IS_ERR(dvi->powerdown)) {
> > +		dev_err(dev, "failed to parse powerdown gpio\n");
> > +		return PTR_ERR(dvi->powerdown);
> > +	}
> > +
> >  	if (dvi->hpd) {
> >  		INIT_DELAYED_WORK(&dvi->hpd_work, tfp410_hpd_work_func);
diff mbox series

Patch

diff --git a/drivers/gpu/drm/bridge/ti-tfp410.c b/drivers/gpu/drm/bridge/ti-tfp410.c
index e4280f5af9f5..d25d23cfe3f5 100644
--- a/drivers/gpu/drm/bridge/ti-tfp410.c
+++ b/drivers/gpu/drm/bridge/ti-tfp410.c
@@ -32,6 +32,7 @@  struct tfp410 {
 	struct i2c_adapter	*ddc;
 	struct gpio_desc	*hpd;
 	struct delayed_work	hpd_work;
+	struct gpio_desc	*powerdown;
 
 	struct device *dev;
 };
@@ -139,8 +140,24 @@  static int tfp410_attach(struct drm_bridge *bridge)
 	return 0;
 }
 
+static void tfp410_enable(struct drm_bridge *bridge)
+{
+	struct tfp410 *dvi = drm_bridge_to_tfp410(bridge);
+
+	gpiod_set_value_cansleep(dvi->powerdown, 0);
+}
+
+static void tfp410_disable(struct drm_bridge *bridge)
+{
+	struct tfp410 *dvi = drm_bridge_to_tfp410(bridge);
+
+	gpiod_set_value_cansleep(dvi->powerdown, 1);
+}
+
 static const struct drm_bridge_funcs tfp410_bridge_funcs = {
 	.attach		= tfp410_attach,
+	.enable		= tfp410_enable,
+	.disable	= tfp410_disable,
 };
 
 static void tfp410_hpd_work_func(struct work_struct *work)
@@ -229,6 +246,13 @@  static int tfp410_init(struct device *dev)
 	if (ret)
 		goto fail;
 
+	dvi->powerdown = devm_gpiod_get_optional(dev, "powerdown",
+						 GPIOD_OUT_HIGH);
+	if (IS_ERR(dvi->powerdown)) {
+		dev_err(dev, "failed to parse powerdown gpio\n");
+		return PTR_ERR(dvi->powerdown);
+	}
+
 	if (dvi->hpd) {
 		INIT_DELAYED_WORK(&dvi->hpd_work, tfp410_hpd_work_func);