From: Roger Quadros <rogerq@ti.com>
To: Tony Lindgren <tony@atomide.com>,
linux-arm-kernel@lists.infradead.org, linux-omap@vger.kernel.org
Cc: Linus Walleij <linus.walleij@linaro.org>,
Peter Ujfalusi <peter.ujfalusi@ti.com>,
linux-gpio@vger.kernel.org
Subject: Re: [PATCH 5/8] gpio: twl4030: Fix regression for twl gpio output
Date: Tue, 3 Dec 2013 15:30:11 +0200 [thread overview]
Message-ID: <529DDCE3.5020902@ti.com> (raw)
In-Reply-To: <1384396537-3486-6-git-send-email-tony@atomide.com>
Hi Tony,
On 11/14/2013 04:35 AM, Tony Lindgren wrote:
> Commit c111feabe2e2 (gpio: twl4030: Cache the direction and output
> states in private data) improved things in general, but caused a
> regression for setting the GPIO output direction.
>
> The change reorganized twl_direction_out() and twl_set() and swapped
> the function names around in the process. While doing that, a bug got
> introduced that's not obvious while reading the patch as it appears
> as no change to the code.
>
> The bug is we now call function twl4030_set_gpio_dataout() twice in
> both twl_direction_out() and twl_set(). Instead, we should first
> call twl_direction_out() in twl_direction_out() followed by
> twl4030_set_gpio_dataout() in twl_set().
>
> This regression probably has gone unnoticed for a long time as the
> bootloader may have set the GPIO direction properly in many cases.
> This fixes at least the LCD panel not turning on omap3 LDP for
> example.
>
> Cc: Linus Walleij <linus.walleij@linaro.org>
> Cc: Peter Ujfalusi <peter.ujfalusi@ti.com>
> Cc: linux-gpio@vger.kernel.org
> Signed-off-by: Tony Lindgren <tony@atomide.com>
> ---
>
> If this looks OK, I'd like to merge this as a fix via arm-soc tree
> along with the other patches in this series as my later patches
> depend on patches in this series.
This patch causes a regression with LED outputs (GPO) on twl4030 on 3.13-rc2.
As one of the LED GPO is used for USB host on beagleboard, it will cause failure
of USB host probe.
I'll explain why below.
>
> ---
> drivers/gpio/gpio-twl4030.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpio/gpio-twl4030.c b/drivers/gpio/gpio-twl4030.c
> index 0c7e891..5738d5a 100644
> --- a/drivers/gpio/gpio-twl4030.c
> +++ b/drivers/gpio/gpio-twl4030.c
> @@ -354,17 +354,18 @@ static void twl_set(struct gpio_chip *chip, unsigned offset, int value)
> static int twl_direction_out(struct gpio_chip *chip, unsigned offset, int value)
> {
> struct gpio_twl4030_priv *priv = to_gpio_twl4030(chip);
> + int ret = -EINVAL;
>
> mutex_lock(&priv->mutex);
> if (offset < TWL4030_GPIO_MAX)
> - twl4030_set_gpio_dataout(offset, value);
> + ret = twl4030_set_gpio_direction(offset, 0);
twl_direction_out() is supposed to return 0 on success and non-zero only on failure.
for (offset >= TWL4030_GPIO_MAX) i.e. LED output case we now return -EINVAL, which
causes the LED GPO set_direction_out to fail. LED outputs are always outputs so
this function shouldn't fail.
>
> priv->direction |= BIT(offset);
> mutex_unlock(&priv->mutex);
>
> twl_set(chip, offset, value);
>
> - return 0;
> + return ret;
> }
>
> static int twl_to_irq(struct gpio_chip *chip, unsigned offset)
>
Below is a proposed fix for this.
>From 7c36c8952ee3c7220ea21396cd3f84a1f9e9ea73 Mon Sep 17 00:00:00 2001
From: Roger Quadros <rogerq@ti.com>
Date: Tue, 3 Dec 2013 15:24:05 +0200
Subject: [PATCH] gpio: twl4030: Fix regression for twl gpio LED output
Commit 0b2aa8be introduced a regression that causes failure
in setting LED GPO direction to OUT.
This causes USB host probe failures for Beagleboard C4.
[ 2.075469] platform usb_phy_gen_xceiv.2: Driver usb_phy_gen_xceiv requests probe deferral
[ 2.090454] hsusb2_vcc: Failed to request enable GPIO510: -22
[ 2.100982] reg-fixed-voltage reg-fixed-voltage.0.auto: Failed to register regulator: -22
[ 2.109954] reg-fixed-voltage: probe of reg-fixed-voltage.0.auto failed with error -22
direction_out/direction_in must return 0 if the operation succeeded.
Signed-off-by: Roger Quadros <rogerq@ti.com>
---
drivers/gpio/gpio-twl4030.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/drivers/gpio/gpio-twl4030.c b/drivers/gpio/gpio-twl4030.c
index b97d6a6..0999ed1 100644
--- a/drivers/gpio/gpio-twl4030.c
+++ b/drivers/gpio/gpio-twl4030.c
@@ -294,13 +294,13 @@ out:
static int twl_direction_in(struct gpio_chip *chip, unsigned offset)
{
struct gpio_twl4030_priv *priv = to_gpio_twl4030(chip);
- int ret;
+ int ret = 0;
mutex_lock(&priv->mutex);
if (offset < TWL4030_GPIO_MAX)
- ret = twl4030_set_gpio_direction(offset, 1);
+ twl4030_set_gpio_direction(offset, 1);
else
- ret = -EINVAL;
+ ret = -EINVAL; /* LED outputs can't be set as input */
if (!ret)
priv->direction &= ~BIT(offset);
@@ -354,18 +354,21 @@ static void twl_set(struct gpio_chip *chip, unsigned offset, int value)
static int twl_direction_out(struct gpio_chip *chip, unsigned offset, int value)
{
struct gpio_twl4030_priv *priv = to_gpio_twl4030(chip);
- int ret = -EINVAL;
mutex_lock(&priv->mutex);
if (offset < TWL4030_GPIO_MAX)
- ret = twl4030_set_gpio_direction(offset, 0);
+ twl4030_set_gpio_direction(offset, 0);
+
+ /*
+ * LED gpio's i.e. offset >= TWL4030_GPIO_MAX are always output
+ */
priv->direction |= BIT(offset);
mutex_unlock(&priv->mutex);
twl_set(chip, offset, value);
- return ret;
+ return 0;
}
static int twl_to_irq(struct gpio_chip *chip, unsigned offset)
--
1.8.3.2
WARNING: multiple messages have this Message-ID (diff)
From: rogerq@ti.com (Roger Quadros)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 5/8] gpio: twl4030: Fix regression for twl gpio output
Date: Tue, 3 Dec 2013 15:30:11 +0200 [thread overview]
Message-ID: <529DDCE3.5020902@ti.com> (raw)
In-Reply-To: <1384396537-3486-6-git-send-email-tony@atomide.com>
Hi Tony,
On 11/14/2013 04:35 AM, Tony Lindgren wrote:
> Commit c111feabe2e2 (gpio: twl4030: Cache the direction and output
> states in private data) improved things in general, but caused a
> regression for setting the GPIO output direction.
>
> The change reorganized twl_direction_out() and twl_set() and swapped
> the function names around in the process. While doing that, a bug got
> introduced that's not obvious while reading the patch as it appears
> as no change to the code.
>
> The bug is we now call function twl4030_set_gpio_dataout() twice in
> both twl_direction_out() and twl_set(). Instead, we should first
> call twl_direction_out() in twl_direction_out() followed by
> twl4030_set_gpio_dataout() in twl_set().
>
> This regression probably has gone unnoticed for a long time as the
> bootloader may have set the GPIO direction properly in many cases.
> This fixes at least the LCD panel not turning on omap3 LDP for
> example.
>
> Cc: Linus Walleij <linus.walleij@linaro.org>
> Cc: Peter Ujfalusi <peter.ujfalusi@ti.com>
> Cc: linux-gpio at vger.kernel.org
> Signed-off-by: Tony Lindgren <tony@atomide.com>
> ---
>
> If this looks OK, I'd like to merge this as a fix via arm-soc tree
> along with the other patches in this series as my later patches
> depend on patches in this series.
This patch causes a regression with LED outputs (GPO) on twl4030 on 3.13-rc2.
As one of the LED GPO is used for USB host on beagleboard, it will cause failure
of USB host probe.
I'll explain why below.
>
> ---
> drivers/gpio/gpio-twl4030.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpio/gpio-twl4030.c b/drivers/gpio/gpio-twl4030.c
> index 0c7e891..5738d5a 100644
> --- a/drivers/gpio/gpio-twl4030.c
> +++ b/drivers/gpio/gpio-twl4030.c
> @@ -354,17 +354,18 @@ static void twl_set(struct gpio_chip *chip, unsigned offset, int value)
> static int twl_direction_out(struct gpio_chip *chip, unsigned offset, int value)
> {
> struct gpio_twl4030_priv *priv = to_gpio_twl4030(chip);
> + int ret = -EINVAL;
>
> mutex_lock(&priv->mutex);
> if (offset < TWL4030_GPIO_MAX)
> - twl4030_set_gpio_dataout(offset, value);
> + ret = twl4030_set_gpio_direction(offset, 0);
twl_direction_out() is supposed to return 0 on success and non-zero only on failure.
for (offset >= TWL4030_GPIO_MAX) i.e. LED output case we now return -EINVAL, which
causes the LED GPO set_direction_out to fail. LED outputs are always outputs so
this function shouldn't fail.
>
> priv->direction |= BIT(offset);
> mutex_unlock(&priv->mutex);
>
> twl_set(chip, offset, value);
>
> - return 0;
> + return ret;
> }
>
> static int twl_to_irq(struct gpio_chip *chip, unsigned offset)
>
Below is a proposed fix for this.
>From 7c36c8952ee3c7220ea21396cd3f84a1f9e9ea73 Mon Sep 17 00:00:00 2001
From: Roger Quadros <rogerq@ti.com>
Date: Tue, 3 Dec 2013 15:24:05 +0200
Subject: [PATCH] gpio: twl4030: Fix regression for twl gpio LED output
Commit 0b2aa8be introduced a regression that causes failure
in setting LED GPO direction to OUT.
This causes USB host probe failures for Beagleboard C4.
[ 2.075469] platform usb_phy_gen_xceiv.2: Driver usb_phy_gen_xceiv requests probe deferral
[ 2.090454] hsusb2_vcc: Failed to request enable GPIO510: -22
[ 2.100982] reg-fixed-voltage reg-fixed-voltage.0.auto: Failed to register regulator: -22
[ 2.109954] reg-fixed-voltage: probe of reg-fixed-voltage.0.auto failed with error -22
direction_out/direction_in must return 0 if the operation succeeded.
Signed-off-by: Roger Quadros <rogerq@ti.com>
---
drivers/gpio/gpio-twl4030.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/drivers/gpio/gpio-twl4030.c b/drivers/gpio/gpio-twl4030.c
index b97d6a6..0999ed1 100644
--- a/drivers/gpio/gpio-twl4030.c
+++ b/drivers/gpio/gpio-twl4030.c
@@ -294,13 +294,13 @@ out:
static int twl_direction_in(struct gpio_chip *chip, unsigned offset)
{
struct gpio_twl4030_priv *priv = to_gpio_twl4030(chip);
- int ret;
+ int ret = 0;
mutex_lock(&priv->mutex);
if (offset < TWL4030_GPIO_MAX)
- ret = twl4030_set_gpio_direction(offset, 1);
+ twl4030_set_gpio_direction(offset, 1);
else
- ret = -EINVAL;
+ ret = -EINVAL; /* LED outputs can't be set as input */
if (!ret)
priv->direction &= ~BIT(offset);
@@ -354,18 +354,21 @@ static void twl_set(struct gpio_chip *chip, unsigned offset, int value)
static int twl_direction_out(struct gpio_chip *chip, unsigned offset, int value)
{
struct gpio_twl4030_priv *priv = to_gpio_twl4030(chip);
- int ret = -EINVAL;
mutex_lock(&priv->mutex);
if (offset < TWL4030_GPIO_MAX)
- ret = twl4030_set_gpio_direction(offset, 0);
+ twl4030_set_gpio_direction(offset, 0);
+
+ /*
+ * LED gpio's i.e. offset >= TWL4030_GPIO_MAX are always output
+ */
priv->direction |= BIT(offset);
mutex_unlock(&priv->mutex);
twl_set(chip, offset, value);
- return ret;
+ return 0;
}
static int twl_to_irq(struct gpio_chip *chip, unsigned offset)
--
1.8.3.2
next prev parent reply other threads:[~2013-12-03 13:30 UTC|newest]
Thread overview: 98+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-14 2:35 [PATCH 0/8] Various omap device tree usability fixes for v3.13 merge window Tony Lindgren
2013-11-14 2:35 ` Tony Lindgren
2013-11-14 2:35 ` [PATCH 1/8] net: smc91x: Fix device tree based configuration so it's usable Tony Lindgren
2013-11-14 2:35 ` Tony Lindgren
2013-11-14 11:03 ` Mark Rutland
2013-11-14 11:03 ` Mark Rutland
2013-11-14 16:08 ` Tony Lindgren
2013-11-14 16:08 ` Tony Lindgren
2013-11-16 15:16 ` Tony Lindgren
2013-11-16 15:16 ` Tony Lindgren
2013-11-27 18:36 ` Tony Lindgren
2013-11-27 18:36 ` Tony Lindgren
2013-11-14 2:35 ` [PATCH 2/8] mmc: omap: Fix DMA configuration to not rely on device id Tony Lindgren
2013-11-14 2:35 ` Tony Lindgren
2013-11-18 18:47 ` Tony Lindgren
2013-11-18 18:47 ` Tony Lindgren
2013-11-26 23:33 ` Chris Ball
2013-11-26 23:33 ` Chris Ball
2013-11-26 23:52 ` Tony Lindgren
2013-11-26 23:52 ` Tony Lindgren
2013-11-27 20:57 ` Jarkko Nikula
2013-11-27 20:57 ` Jarkko Nikula
2013-11-27 21:37 ` Tony Lindgren
2013-11-27 21:37 ` Tony Lindgren
2013-11-28 17:02 ` Jarkko Nikula
2013-11-28 17:02 ` Jarkko Nikula
2013-11-29 16:34 ` Tony Lindgren
2013-11-29 16:34 ` Tony Lindgren
2013-11-27 21:47 ` Chris Ball
2013-11-27 21:47 ` Chris Ball
2013-11-27 21:59 ` Tony Lindgren
2013-11-27 21:59 ` Tony Lindgren
2013-11-28 16:13 ` Jarkko Nikula
2013-11-28 16:13 ` Jarkko Nikula
2013-11-29 17:13 ` Tony Lindgren
2013-11-29 17:13 ` Tony Lindgren
2013-11-30 0:38 ` Joel Fernandes
2013-11-30 0:38 ` Joel Fernandes
2013-11-30 17:33 ` Tony Lindgren
2013-11-30 17:33 ` Tony Lindgren
2013-11-14 2:35 ` [PATCH 3/8] mmc: omap: Fix I2C dependency and make driver usable with device tree Tony Lindgren
2013-11-14 2:35 ` Tony Lindgren
2013-11-14 11:05 ` Mark Rutland
2013-11-14 11:05 ` Mark Rutland
2013-11-14 17:25 ` Tony Lindgren
2013-11-14 17:25 ` Tony Lindgren
2013-11-26 23:34 ` Chris Ball
2013-11-26 23:34 ` Chris Ball
[not found] ` <1384396537-3486-1-git-send-email-tony-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2013-11-14 2:35 ` [PATCH 4/8] i2c: omap: Fix missing device tree flags for omap2 Tony Lindgren
2013-11-14 2:35 ` Tony Lindgren
[not found] ` <1384396537-3486-5-git-send-email-tony-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2013-11-14 6:58 ` Wolfram Sang
2013-11-14 6:58 ` Wolfram Sang
2013-11-14 17:34 ` Tony Lindgren
2013-11-14 17:34 ` Tony Lindgren
[not found] ` <20131114173429.GF10317-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2013-11-14 17:49 ` Wolfram Sang
2013-11-14 17:49 ` Wolfram Sang
2013-11-14 17:53 ` Tony Lindgren
2013-11-14 17:53 ` Tony Lindgren
2013-11-14 11:07 ` Mark Rutland
2013-11-14 11:07 ` Mark Rutland
2013-11-14 17:30 ` Tony Lindgren
2013-11-14 17:30 ` Tony Lindgren
2013-11-14 2:35 ` [PATCH 5/8] gpio: twl4030: Fix regression for twl gpio output Tony Lindgren
2013-11-14 2:35 ` Tony Lindgren
2013-11-14 9:45 ` Peter Ujfalusi
2013-11-14 9:45 ` Peter Ujfalusi
2013-11-14 17:37 ` Tony Lindgren
2013-11-14 17:37 ` Tony Lindgren
2013-11-18 22:45 ` Linus Walleij
2013-11-18 22:45 ` Linus Walleij
2013-12-03 13:30 ` Roger Quadros [this message]
2013-12-03 13:30 ` Roger Quadros
2013-12-09 13:09 ` Linus Walleij
2013-12-09 13:09 ` Linus Walleij
2013-12-09 17:10 ` Tony Lindgren
2013-12-09 17:10 ` Tony Lindgren
2013-12-10 12:17 ` Linus Walleij
2013-12-10 12:17 ` Linus Walleij
2013-12-10 15:20 ` Tony Lindgren
2013-12-10 15:20 ` Tony Lindgren
2013-11-14 2:35 ` [PATCH 6/8] gpio: twl4030: Fix passing of pdata in the device tree case Tony Lindgren
2013-11-14 2:35 ` Tony Lindgren
2013-11-18 18:27 ` Tony Lindgren
2013-11-18 18:27 ` Tony Lindgren
2013-11-18 22:46 ` Linus Walleij
2013-11-18 22:46 ` Linus Walleij
2013-11-14 2:35 ` [PATCH 7/8] ARM: OMAP2+: Fix GPMC and simplify bootloader timings for 8250 and smc91x Tony Lindgren
2013-11-14 2:35 ` Tony Lindgren
2013-11-14 2:35 ` [PATCH 8/8] ARM: dts: Fix omap2 specific dtsi files by adding the missing entries Tony Lindgren
2013-11-14 2:35 ` Tony Lindgren
2013-11-14 23:08 ` [PATCH 9/8] i2c: Fix device tree binding for i2c-cbus-gpio Tony Lindgren
2013-11-14 23:08 ` Tony Lindgren
[not found] ` <20131114230842.GU10317-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2013-11-15 18:49 ` Aaro Koskinen
2013-11-15 18:49 ` Aaro Koskinen
2013-11-15 22:26 ` Wolfram Sang
2013-11-15 22:26 ` Wolfram Sang
2013-11-15 22:30 ` Tony Lindgren
2013-11-15 22:30 ` Tony Lindgren
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=529DDCE3.5020902@ti.com \
--to=rogerq@ti.com \
--cc=linus.walleij@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=peter.ujfalusi@ti.com \
--cc=tony@atomide.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.