[PATCH v4] backlight: lms283gf05: Convert to GPIO descriptors

Daniel Thompson daniel.thompson at linaro.org
Mon May 11 13:13:52 UTC 2020


On Mon, May 11, 2020 at 09:53:18AM +0200, Linus Walleij wrote:
> This converts the lms283gf05 backlight driver to use GPIO
> descriptors and switches the single PXA Palm Z2 device
> over to defining these.
> 
> Since the platform data was only used to convey GPIO
> information we can delete the platform data header.
> 
> Notice that we define the proper active low semantics in
> the board file GPIO descriptor table (active low) and
> assert the reset line by bringing it to "1" (asserted).
> 
> Cc: Marek Vasut <marex at denx.de>
> Cc: Daniel Mack <daniel at zonque.org>
> Cc: Haojian Zhuang <haojian.zhuang at gmail.com>
> Cc: Robert Jarzmik <robert.jarzmik at free.fr>
> Signed-off-by: Linus Walleij <linus.walleij at linaro.org>

Reviewed-by: Daniel Thompson <daniel.thompson at linaro.org>


> ---
> ChangeLog v3->v4:
> - Check IS_ERR() on the returned GPIO descriptor.
> - Unconditionally set consumer name since the API tolerates NULL.
> ChangeLog v2->v3:
> - Fix a use-before-allocated bug discovered by compile tests.
> - Remove unused ret variable as autobuilders complained.
> ChangeLog v1->v2:
> - Bring up the GPIO de-asserted in probe()
> 
> Marek: I saw this was written by you, are you regularly
> testing the Z2 device?
> ---
>  arch/arm/mach-pxa/z2.c               | 12 +++++---
>  drivers/video/backlight/lms283gf05.c | 43 +++++++++++-----------------
>  include/linux/spi/lms283gf05.h       | 16 -----------
>  3 files changed, 25 insertions(+), 46 deletions(-)
>  delete mode 100644 include/linux/spi/lms283gf05.h
> 
> diff --git a/arch/arm/mach-pxa/z2.c b/arch/arm/mach-pxa/z2.c
> index 21fd76bb09cd..89eb5243c85f 100644
> --- a/arch/arm/mach-pxa/z2.c
> +++ b/arch/arm/mach-pxa/z2.c
> @@ -20,7 +20,6 @@
>  #include <linux/spi/spi.h>
>  #include <linux/spi/pxa2xx_spi.h>
>  #include <linux/spi/libertas_spi.h>
> -#include <linux/spi/lms283gf05.h>
>  #include <linux/power_supply.h>
>  #include <linux/mtd/physmap.h>
>  #include <linux/gpio.h>
> @@ -578,8 +577,13 @@ static struct pxa2xx_spi_chip lms283_chip_info = {
>  	.gpio_cs	= GPIO88_ZIPITZ2_LCD_CS,
>  };
>  
> -static const struct lms283gf05_pdata lms283_pdata = {
> -	.reset_gpio	= GPIO19_ZIPITZ2_LCD_RESET,
> +static struct gpiod_lookup_table lms283_gpio_table = {
> +	.dev_id = "spi2.0", /* SPI bus 2 chip select 0 */
> +	.table = {
> +		GPIO_LOOKUP("gpio-pxa", GPIO19_ZIPITZ2_LCD_RESET,
> +			    "reset", GPIO_ACTIVE_LOW),
> +		{ },
> +	},
>  };
>  
>  static struct spi_board_info spi_board_info[] __initdata = {
> @@ -595,7 +599,6 @@ static struct spi_board_info spi_board_info[] __initdata = {
>  {
>  	.modalias		= "lms283gf05",
>  	.controller_data	= &lms283_chip_info,
> -	.platform_data		= &lms283_pdata,
>  	.max_speed_hz		= 400000,
>  	.bus_num		= 2,
>  	.chip_select		= 0,
> @@ -615,6 +618,7 @@ static void __init z2_spi_init(void)
>  {
>  	pxa2xx_set_spi_info(1, &pxa_ssp1_master_info);
>  	pxa2xx_set_spi_info(2, &pxa_ssp2_master_info);
> +	gpiod_add_lookup_table(&lms283_gpio_table);
>  	spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
>  }
>  #else
> diff --git a/drivers/video/backlight/lms283gf05.c b/drivers/video/backlight/lms283gf05.c
> index 0e45685bcc1c..36856962ed83 100644
> --- a/drivers/video/backlight/lms283gf05.c
> +++ b/drivers/video/backlight/lms283gf05.c
> @@ -9,16 +9,16 @@
>  #include <linux/kernel.h>
>  #include <linux/delay.h>
>  #include <linux/slab.h>
> -#include <linux/gpio.h>
> +#include <linux/gpio/consumer.h>
>  #include <linux/lcd.h>
>  
>  #include <linux/spi/spi.h>
> -#include <linux/spi/lms283gf05.h>
>  #include <linux/module.h>
>  
>  struct lms283gf05_state {
>  	struct spi_device	*spi;
>  	struct lcd_device	*ld;
> +	struct gpio_desc	*reset;
>  };
>  
>  struct lms283gf05_seq {
> @@ -90,13 +90,13 @@ static const struct lms283gf05_seq disp_pdwnseq[] = {
>  };
>  
>  
> -static void lms283gf05_reset(unsigned long gpio, bool inverted)
> +static void lms283gf05_reset(struct gpio_desc *gpiod)
>  {
> -	gpio_set_value(gpio, !inverted);
> +	gpiod_set_value(gpiod, 0); /* De-asserted */
>  	mdelay(100);
> -	gpio_set_value(gpio, inverted);
> +	gpiod_set_value(gpiod, 1); /* Asserted */
>  	mdelay(20);
> -	gpio_set_value(gpio, !inverted);
> +	gpiod_set_value(gpiod, 0); /* De-asserted */
>  	mdelay(20);
>  }
>  
> @@ -125,18 +125,15 @@ static int lms283gf05_power_set(struct lcd_device *ld, int power)
>  {
>  	struct lms283gf05_state *st = lcd_get_data(ld);
>  	struct spi_device *spi = st->spi;
> -	struct lms283gf05_pdata *pdata = dev_get_platdata(&spi->dev);
>  
>  	if (power <= FB_BLANK_NORMAL) {
> -		if (pdata)
> -			lms283gf05_reset(pdata->reset_gpio,
> -					pdata->reset_inverted);
> +		if (st->reset)
> +			lms283gf05_reset(st->reset);
>  		lms283gf05_toggle(spi, disp_initseq, ARRAY_SIZE(disp_initseq));
>  	} else {
>  		lms283gf05_toggle(spi, disp_pdwnseq, ARRAY_SIZE(disp_pdwnseq));
> -		if (pdata)
> -			gpio_set_value(pdata->reset_gpio,
> -					pdata->reset_inverted);
> +		if (st->reset)
> +			gpiod_set_value(st->reset, 1); /* Asserted */
>  	}
>  
>  	return 0;
> @@ -150,24 +147,18 @@ static struct lcd_ops lms_ops = {
>  static int lms283gf05_probe(struct spi_device *spi)
>  {
>  	struct lms283gf05_state *st;
> -	struct lms283gf05_pdata *pdata = dev_get_platdata(&spi->dev);
>  	struct lcd_device *ld;
> -	int ret = 0;
> -
> -	if (pdata != NULL) {
> -		ret = devm_gpio_request_one(&spi->dev, pdata->reset_gpio,
> -				GPIOF_DIR_OUT | (!pdata->reset_inverted ?
> -				GPIOF_INIT_HIGH : GPIOF_INIT_LOW),
> -				"LMS283GF05 RESET");
> -		if (ret)
> -			return ret;
> -	}
>  
>  	st = devm_kzalloc(&spi->dev, sizeof(struct lms283gf05_state),
>  				GFP_KERNEL);
>  	if (st == NULL)
>  		return -ENOMEM;
>  
> +	st->reset = gpiod_get_optional(&spi->dev, "reset", GPIOD_OUT_LOW);
> +	if (IS_ERR(st->reset))
> +		return PTR_ERR(st->reset);
> +	gpiod_set_consumer_name(st->reset, "LMS283GF05 RESET");
> +
>  	ld = devm_lcd_device_register(&spi->dev, "lms283gf05", &spi->dev, st,
>  					&lms_ops);
>  	if (IS_ERR(ld))
> @@ -179,8 +170,8 @@ static int lms283gf05_probe(struct spi_device *spi)
>  	spi_set_drvdata(spi, st);
>  
>  	/* kick in the LCD */
> -	if (pdata)
> -		lms283gf05_reset(pdata->reset_gpio, pdata->reset_inverted);
> +	if (st->reset)
> +		lms283gf05_reset(st->reset);
>  	lms283gf05_toggle(spi, disp_initseq, ARRAY_SIZE(disp_initseq));
>  
>  	return 0;
> diff --git a/include/linux/spi/lms283gf05.h b/include/linux/spi/lms283gf05.h
> deleted file mode 100644
> index f237b2d062e9..000000000000
> --- a/include/linux/spi/lms283gf05.h
> +++ /dev/null
> @@ -1,16 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0-only */
> -/*
> - * lms283gf05.h - Platform glue for Samsung LMS283GF05 LCD
> - *
> - * Copyright (C) 2009 Marek Vasut <marek.vasut at gmail.com>
> -*/
> -
> -#ifndef _INCLUDE_LINUX_SPI_LMS283GF05_H_
> -#define _INCLUDE_LINUX_SPI_LMS283GF05_H_
> -
> -struct lms283gf05_pdata {
> -	unsigned long	reset_gpio;
> -	bool		reset_inverted;
> -};
> -
> -#endif /* _INCLUDE_LINUX_SPI_LMS283GF05_H_ */
> -- 
> 2.25.4
> 


More information about the dri-devel mailing list