[2/2] gpio: 74x164: handling enable-gpios

Message ID 1502108833-10317-2-git-send-email-peng.fan@nxp.com
State New
Headers show

Commit Message

Peng Fan Aug. 7, 2017, 12:27 p.m.
To 74hc595 and 74lv595, there is an OE(low active) input pin.
To some boards, this pin is controller by GPIO, so handling
this pin in driver. When driver probe, use GPIOD_OUT_LOW flag
when requesting the gpio, so OE is set to low when probe.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
Cc: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/gpio/gpio-74x164.c | 9 +++++++++
 1 file changed, 9 insertions(+)

Comments

Fabio Estevam Aug. 7, 2017, 12:36 p.m. | #1
Hi Peng,

On Mon, Aug 7, 2017 at 9:27 AM, Peng Fan <peng.fan@nxp.com> wrote:
> To 74hc595 and 74lv595, there is an OE(low active) input pin.
> To some boards, this pin is controller by GPIO, so handling
> this pin in driver. When driver probe, use GPIOD_OUT_LOW flag
> when requesting the gpio, so OE is set to low when probe.

Well, this depends of the GPIO polarity.

>
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> Cc: Linus Walleij <linus.walleij@linaro.org>
> ---
>  drivers/gpio/gpio-74x164.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
>
> diff --git a/drivers/gpio/gpio-74x164.c b/drivers/gpio/gpio-74x164.c
> index a6607fa..e44422c 100644
> --- a/drivers/gpio/gpio-74x164.c
> +++ b/drivers/gpio/gpio-74x164.c
> @@ -23,6 +23,7 @@ struct gen_74x164_chip {
>         struct gpio_chip        gpio_chip;
>         struct mutex            lock;
>         u32                     registers;
> +       struct gpio_desc        *enable_gpio;
>         /*
>          * Since the registers are chained, every byte sent will make
>          * the previous byte shift to the next register in the
> @@ -142,6 +143,12 @@ static int gen_74x164_probe(struct spi_device *spi)
>         chip->gpio_chip.parent = &spi->dev;
>         chip->gpio_chip.owner = THIS_MODULE;
>
> +       chip->enable_gpio = devm_gpiod_get(&spi->dev, "enable", GPIOD_OUT_LOW);

It would be better to use devm_gpiod_get_optional instead.

> +       if (IS_ERR(chip->enable_gpio)) {
> +               dev_dbg(&spi->dev, "No enable-gpios property\n");
> +               chip->enable_gpio = NULL;
> +       }
> +
>         mutex_init(&chip->lock);
>
>         ret = __gen_74x164_write_config(chip);
> @@ -164,6 +171,8 @@ static int gen_74x164_remove(struct spi_device *spi)
>  {
>         struct gen_74x164_chip *chip = spi_get_drvdata(spi);
>
> +       if (chip->enable_gpio)
> +               gpiod_set_value(chip->enable_gpio, 0);

It would be better to use the cansleep variant instead.

Actually I have worked on adding this optional property, but haven't
submitted yet:
https://pastebin.com/u839DVD3
--
To unsubscribe from this list: send the line "unsubscribe linux-gpio" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Fabio Estevam Aug. 7, 2017, 12:40 p.m. | #2
On Mon, Aug 7, 2017 at 9:27 AM, Peng Fan <peng.fan@nxp.com> wrote:

> +       chip->enable_gpio = devm_gpiod_get(&spi->dev, "enable", GPIOD_OUT_LOW);
> +       if (IS_ERR(chip->enable_gpio)) {
> +               dev_dbg(&spi->dev, "No enable-gpios property\n");
> +               chip->enable_gpio = NULL;

Also, the error handling here is not correct as it will never
propagate EPROBE_DEFER.

I will submit my version of the patch if you don't mind.
--
To unsubscribe from this list: send the line "unsubscribe linux-gpio" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Peng Fan Aug. 8, 2017, 1:15 a.m. | #3
> > +       chip->enable_gpio = devm_gpiod_get(&spi->dev, "enable",

> GPIOD_OUT_LOW);

> > +       if (IS_ERR(chip->enable_gpio)) {

> > +               dev_dbg(&spi->dev, "No enable-gpios property\n");

> > +               chip->enable_gpio = NULL;

> 

> Also, the error handling here is not correct as it will never propagate

> EPROBE_DEFER.

> 

> I will submit my version of the patch if you don't mind.


That's ok if you have a better patch.

Regards,
Peng.

Patch

diff --git a/drivers/gpio/gpio-74x164.c b/drivers/gpio/gpio-74x164.c
index a6607fa..e44422c 100644
--- a/drivers/gpio/gpio-74x164.c
+++ b/drivers/gpio/gpio-74x164.c
@@ -23,6 +23,7 @@  struct gen_74x164_chip {
 	struct gpio_chip	gpio_chip;
 	struct mutex		lock;
 	u32			registers;
+	struct gpio_desc	*enable_gpio;
 	/*
 	 * Since the registers are chained, every byte sent will make
 	 * the previous byte shift to the next register in the
@@ -142,6 +143,12 @@  static int gen_74x164_probe(struct spi_device *spi)
 	chip->gpio_chip.parent = &spi->dev;
 	chip->gpio_chip.owner = THIS_MODULE;
 
+	chip->enable_gpio = devm_gpiod_get(&spi->dev, "enable", GPIOD_OUT_LOW);
+	if (IS_ERR(chip->enable_gpio)) {
+		dev_dbg(&spi->dev, "No enable-gpios property\n");
+		chip->enable_gpio = NULL;
+	}
+
 	mutex_init(&chip->lock);
 
 	ret = __gen_74x164_write_config(chip);
@@ -164,6 +171,8 @@  static int gen_74x164_remove(struct spi_device *spi)
 {
 	struct gen_74x164_chip *chip = spi_get_drvdata(spi);
 
+	if (chip->enable_gpio)
+		gpiod_set_value(chip->enable_gpio, 0);
 	gpiochip_remove(&chip->gpio_chip);
 	mutex_destroy(&chip->lock);