diff mbox

[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. UTC
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. UTC | #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. UTC | #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. UTC | #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.
diff mbox

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);