All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] drivers: fbtft: Refactor backlight logic
@ 2022-02-12  4:27 ` qianfanguijin
  0 siblings, 0 replies; 4+ messages in thread
From: qianfanguijin @ 2022-02-12  4:27 UTC (permalink / raw)
  To: dri-devel, linux-fbdev; +Cc: preid, andriy.shevchenko, qianfan Zhao

From: qianfan Zhao <qianfanguijin@163.com>

Control led gpios by using GPIO_ACTIVE flags, don't detect the polarity
by reading the gpio value when probe.

Signed-off-by: qianfan Zhao <qianfanguijin@163.com>
---
 drivers/staging/fbtft/fbtft-core.c | 54 +++++++++++++++++-------------
 drivers/staging/fbtft/fbtft.h      |  1 -
 2 files changed, 30 insertions(+), 25 deletions(-)

diff --git a/drivers/staging/fbtft/fbtft-core.c b/drivers/staging/fbtft/fbtft-core.c
index ed992ca605eb..37548848af99 100644
--- a/drivers/staging/fbtft/fbtft-core.c
+++ b/drivers/staging/fbtft/fbtft-core.c
@@ -70,14 +70,14 @@ void fbtft_dbg_hex(const struct device *dev, int groupsize,
 }
 EXPORT_SYMBOL(fbtft_dbg_hex);
 
-static int fbtft_request_one_gpio(struct fbtft_par *par,
-				  const char *name, int index,
-				  struct gpio_desc **gpiop)
+static int fbtft_request_one_gpio_with_flags(struct fbtft_par *par,
+					     const char *name, int index,
+					     enum gpiod_flags flags,
+					     struct gpio_desc **gpiop)
 {
 	struct device *dev = par->info->device;
 
-	*gpiop = devm_gpiod_get_index_optional(dev, name, index,
-					       GPIOD_OUT_LOW);
+	*gpiop = devm_gpiod_get_index_optional(dev, name, index, flags);
 	if (IS_ERR(*gpiop))
 		return dev_err_probe(dev, PTR_ERR(*gpiop), "Failed to request %s GPIO\n", name);
 
@@ -87,6 +87,25 @@ static int fbtft_request_one_gpio(struct fbtft_par *par,
 	return 0;
 }
 
+static int fbtft_request_one_gpio(struct fbtft_par *par,
+				  const char *name, int index,
+				  struct gpio_desc **gpiop)
+{
+	enum gpiod_flags flags = GPIOD_OUT_LOW;
+
+	return fbtft_request_one_gpio_with_flags(par, name, index, flags, gpiop);
+}
+
+static int fbtft_request_led_gpio(struct fbtft_par *par,
+				  const char *name, int index,
+				  struct gpio_desc **gpiop)
+{
+	enum gpiod_flags flags = GPIOD_OUT_HIGH;
+
+	/* request and turn on backlight */
+	return fbtft_request_one_gpio_with_flags(par, name, index, flags, gpiop);
+}
+
 static int fbtft_request_gpios(struct fbtft_par *par)
 {
 	int i;
@@ -115,7 +134,7 @@ static int fbtft_request_gpios(struct fbtft_par *par)
 					     &par->gpio.db[i]);
 		if (ret)
 			return ret;
-		ret = fbtft_request_one_gpio(par, "led", i,
+		ret = fbtft_request_led_gpio(par, "led", i,
 					     &par->gpio.led[i]);
 		if (ret)
 			return ret;
@@ -132,17 +151,16 @@ static int fbtft_request_gpios(struct fbtft_par *par)
 static int fbtft_backlight_update_status(struct backlight_device *bd)
 {
 	struct fbtft_par *par = bl_get_data(bd);
-	bool polarity = par->polarity;
 
 	fbtft_par_dbg(DEBUG_BACKLIGHT, par,
-		      "%s: polarity=%d, power=%d, fb_blank=%d\n",
-		      __func__, polarity, bd->props.power, bd->props.fb_blank);
+		      "%s: power=%d, fb_blank=%d\n",
+		      __func__, bd->props.power, bd->props.fb_blank);
 
 	if ((bd->props.power == FB_BLANK_UNBLANK) &&
 	    (bd->props.fb_blank == FB_BLANK_UNBLANK))
-		gpiod_set_value(par->gpio.led[0], polarity);
+		gpiod_set_value(par->gpio.led[0], 1);
 	else
-		gpiod_set_value(par->gpio.led[0], !polarity);
+		gpiod_set_value(par->gpio.led[0], 0);
 
 	return 0;
 }
@@ -179,11 +197,7 @@ void fbtft_register_backlight(struct fbtft_par *par)
 	}
 
 	bl_props.type = BACKLIGHT_RAW;
-	/* Assume backlight is off, get polarity from current state of pin */
-	bl_props.power = FB_BLANK_POWERDOWN;
-	if (!gpiod_get_value(par->gpio.led[0]))
-		par->polarity = true;
-
+	bl_props.power = FB_BLANK_UNBLANK;
 	bd = backlight_device_register(dev_driver_string(par->info->device),
 				       par->info->device, par,
 				       &fbtft_bl_ops, &bl_props);
@@ -853,14 +867,6 @@ int fbtft_register_framebuffer(struct fb_info *fb_info)
 		 fb_info->fix.smem_len >> 10, text1,
 		 HZ / fb_info->fbdefio->delay, text2);
 
-#ifdef CONFIG_FB_BACKLIGHT
-	/* Turn on backlight if available */
-	if (fb_info->bl_dev) {
-		fb_info->bl_dev->props.power = FB_BLANK_UNBLANK;
-		fb_info->bl_dev->ops->update_status(fb_info->bl_dev);
-	}
-#endif
-
 	return 0;
 
 reg_fail:
diff --git a/drivers/staging/fbtft/fbtft.h b/drivers/staging/fbtft/fbtft.h
index 76f8c090a837..6751c129df4d 100644
--- a/drivers/staging/fbtft/fbtft.h
+++ b/drivers/staging/fbtft/fbtft.h
@@ -228,7 +228,6 @@ struct fbtft_par {
 	ktime_t update_time;
 	bool bgr;
 	void *extra;
-	bool polarity;
 };
 
 #define NUMARGS(...)  (sizeof((int[]){__VA_ARGS__}) / sizeof(int))
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH] drivers: fbtft: Refactor backlight logic
@ 2022-02-12  4:27 ` qianfanguijin
  0 siblings, 0 replies; 4+ messages in thread
From: qianfanguijin @ 2022-02-12  4:27 UTC (permalink / raw)
  To: dri-devel, linux-fbdev; +Cc: qianfan Zhao, preid, andriy.shevchenko

From: qianfan Zhao <qianfanguijin@163.com>

Control led gpios by using GPIO_ACTIVE flags, don't detect the polarity
by reading the gpio value when probe.

Signed-off-by: qianfan Zhao <qianfanguijin@163.com>
---
 drivers/staging/fbtft/fbtft-core.c | 54 +++++++++++++++++-------------
 drivers/staging/fbtft/fbtft.h      |  1 -
 2 files changed, 30 insertions(+), 25 deletions(-)

diff --git a/drivers/staging/fbtft/fbtft-core.c b/drivers/staging/fbtft/fbtft-core.c
index ed992ca605eb..37548848af99 100644
--- a/drivers/staging/fbtft/fbtft-core.c
+++ b/drivers/staging/fbtft/fbtft-core.c
@@ -70,14 +70,14 @@ void fbtft_dbg_hex(const struct device *dev, int groupsize,
 }
 EXPORT_SYMBOL(fbtft_dbg_hex);
 
-static int fbtft_request_one_gpio(struct fbtft_par *par,
-				  const char *name, int index,
-				  struct gpio_desc **gpiop)
+static int fbtft_request_one_gpio_with_flags(struct fbtft_par *par,
+					     const char *name, int index,
+					     enum gpiod_flags flags,
+					     struct gpio_desc **gpiop)
 {
 	struct device *dev = par->info->device;
 
-	*gpiop = devm_gpiod_get_index_optional(dev, name, index,
-					       GPIOD_OUT_LOW);
+	*gpiop = devm_gpiod_get_index_optional(dev, name, index, flags);
 	if (IS_ERR(*gpiop))
 		return dev_err_probe(dev, PTR_ERR(*gpiop), "Failed to request %s GPIO\n", name);
 
@@ -87,6 +87,25 @@ static int fbtft_request_one_gpio(struct fbtft_par *par,
 	return 0;
 }
 
+static int fbtft_request_one_gpio(struct fbtft_par *par,
+				  const char *name, int index,
+				  struct gpio_desc **gpiop)
+{
+	enum gpiod_flags flags = GPIOD_OUT_LOW;
+
+	return fbtft_request_one_gpio_with_flags(par, name, index, flags, gpiop);
+}
+
+static int fbtft_request_led_gpio(struct fbtft_par *par,
+				  const char *name, int index,
+				  struct gpio_desc **gpiop)
+{
+	enum gpiod_flags flags = GPIOD_OUT_HIGH;
+
+	/* request and turn on backlight */
+	return fbtft_request_one_gpio_with_flags(par, name, index, flags, gpiop);
+}
+
 static int fbtft_request_gpios(struct fbtft_par *par)
 {
 	int i;
@@ -115,7 +134,7 @@ static int fbtft_request_gpios(struct fbtft_par *par)
 					     &par->gpio.db[i]);
 		if (ret)
 			return ret;
-		ret = fbtft_request_one_gpio(par, "led", i,
+		ret = fbtft_request_led_gpio(par, "led", i,
 					     &par->gpio.led[i]);
 		if (ret)
 			return ret;
@@ -132,17 +151,16 @@ static int fbtft_request_gpios(struct fbtft_par *par)
 static int fbtft_backlight_update_status(struct backlight_device *bd)
 {
 	struct fbtft_par *par = bl_get_data(bd);
-	bool polarity = par->polarity;
 
 	fbtft_par_dbg(DEBUG_BACKLIGHT, par,
-		      "%s: polarity=%d, power=%d, fb_blank=%d\n",
-		      __func__, polarity, bd->props.power, bd->props.fb_blank);
+		      "%s: power=%d, fb_blank=%d\n",
+		      __func__, bd->props.power, bd->props.fb_blank);
 
 	if ((bd->props.power == FB_BLANK_UNBLANK) &&
 	    (bd->props.fb_blank == FB_BLANK_UNBLANK))
-		gpiod_set_value(par->gpio.led[0], polarity);
+		gpiod_set_value(par->gpio.led[0], 1);
 	else
-		gpiod_set_value(par->gpio.led[0], !polarity);
+		gpiod_set_value(par->gpio.led[0], 0);
 
 	return 0;
 }
@@ -179,11 +197,7 @@ void fbtft_register_backlight(struct fbtft_par *par)
 	}
 
 	bl_props.type = BACKLIGHT_RAW;
-	/* Assume backlight is off, get polarity from current state of pin */
-	bl_props.power = FB_BLANK_POWERDOWN;
-	if (!gpiod_get_value(par->gpio.led[0]))
-		par->polarity = true;
-
+	bl_props.power = FB_BLANK_UNBLANK;
 	bd = backlight_device_register(dev_driver_string(par->info->device),
 				       par->info->device, par,
 				       &fbtft_bl_ops, &bl_props);
@@ -853,14 +867,6 @@ int fbtft_register_framebuffer(struct fb_info *fb_info)
 		 fb_info->fix.smem_len >> 10, text1,
 		 HZ / fb_info->fbdefio->delay, text2);
 
-#ifdef CONFIG_FB_BACKLIGHT
-	/* Turn on backlight if available */
-	if (fb_info->bl_dev) {
-		fb_info->bl_dev->props.power = FB_BLANK_UNBLANK;
-		fb_info->bl_dev->ops->update_status(fb_info->bl_dev);
-	}
-#endif
-
 	return 0;
 
 reg_fail:
diff --git a/drivers/staging/fbtft/fbtft.h b/drivers/staging/fbtft/fbtft.h
index 76f8c090a837..6751c129df4d 100644
--- a/drivers/staging/fbtft/fbtft.h
+++ b/drivers/staging/fbtft/fbtft.h
@@ -228,7 +228,6 @@ struct fbtft_par {
 	ktime_t update_time;
 	bool bgr;
 	void *extra;
-	bool polarity;
 };
 
 #define NUMARGS(...)  (sizeof((int[]){__VA_ARGS__}) / sizeof(int))
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] drivers: fbtft: Refactor backlight logic
  2022-02-12  4:27 ` qianfanguijin
@ 2022-02-14 10:01   ` Andy Shevchenko
  -1 siblings, 0 replies; 4+ messages in thread
From: Andy Shevchenko @ 2022-02-14 10:01 UTC (permalink / raw)
  To: qianfanguijin; +Cc: linux-fbdev, preid, dri-devel

On Sat, Feb 12, 2022 at 12:27:39PM +0800, qianfanguijin@163.com wrote:
> From: qianfan Zhao <qianfanguijin@163.com>
> 
> Control led gpios by using GPIO_ACTIVE flags, don't detect the polarity
> by reading the gpio value when probe.

...

> +	enum gpiod_flags flags = GPIOD_OUT_HIGH;
> +
> +	/* request and turn on backlight */
> +	return fbtft_request_one_gpio_with_flags(par, name, index, flags, gpiop);

But taking into consideration all possible polarities this is wrong
assumption. Depending on the flags in DT or ACPI this may give an
opposite effect.

P.S. Please, Cc all your fbtft patches to fbdev maintainer as well.

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] drivers: fbtft: Refactor backlight logic
@ 2022-02-14 10:01   ` Andy Shevchenko
  0 siblings, 0 replies; 4+ messages in thread
From: Andy Shevchenko @ 2022-02-14 10:01 UTC (permalink / raw)
  To: qianfanguijin; +Cc: dri-devel, linux-fbdev, preid

On Sat, Feb 12, 2022 at 12:27:39PM +0800, qianfanguijin@163.com wrote:
> From: qianfan Zhao <qianfanguijin@163.com>
> 
> Control led gpios by using GPIO_ACTIVE flags, don't detect the polarity
> by reading the gpio value when probe.

...

> +	enum gpiod_flags flags = GPIOD_OUT_HIGH;
> +
> +	/* request and turn on backlight */
> +	return fbtft_request_one_gpio_with_flags(par, name, index, flags, gpiop);

But taking into consideration all possible polarities this is wrong
assumption. Depending on the flags in DT or ACPI this may give an
opposite effect.

P.S. Please, Cc all your fbtft patches to fbdev maintainer as well.

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-02-14 10:37 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-12  4:27 [PATCH] drivers: fbtft: Refactor backlight logic qianfanguijin
2022-02-12  4:27 ` qianfanguijin
2022-02-14 10:01 ` Andy Shevchenko
2022-02-14 10:01   ` Andy Shevchenko

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.