Skip to contentSkip to conversation

mvebu-gpio: Disable blinking when enabling a GPIO for output

PATCH New Jamie Lentin 4 participants 6 messages Oct 28, 2012 – Oct 30, 2012 GPIO

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 mvebu-gpio: Disable blinking when enabling a GPIO for output

The plat-orion GPIO driver would disable any pin blinking whenever using a pin for output. Do the same here, as a blinking LED will continue to blink regardless of what the GPIO pin level is.

---
The power LED on the DNS-320/DNS-325 is left blinking by the bootloader, the LED turning steady indicates it's booted. The blinking needs to be disabled before setting the GPIO pin level has any effect.

Apart from the custom init code running too soon, I think everything is working now.

I haven't tested this on any other boards, so not sure if it's sensible beyond the kirkwood/orion world.

 drivers/gpio/gpio-mvebu.c |   23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)
drivers/gpio/gpio-mvebu.c +23 -0
index cf7afb9..be65c04 100644
@@ -92,6 +92,11 @@ static inline void __iomem *mvebu_gpioreg_out(struct mvebu_gpio_chip *mvchip)
 	return mvchip->membase + GPIO_OUT_OFF;
 }
 
+static inline void __iomem *mvebu_gpioreg_blink(struct mvebu_gpio_chip *mvchip)
+{
+	return mvchip->membase + GPIO_BLINK_EN_OFF;
+}
+
 static inline void __iomem *mvebu_gpioreg_io_conf(struct mvebu_gpio_chip *mvchip)
 {
 	return mvchip->membase + GPIO_IO_CONF_OFF;
@@ -206,6 +211,23 @@ static int mvebu_gpio_get(struct gpio_chip *chip, unsigned pin)
 	return (u >> pin) & 1;
 }
 
+static void mvebu_gpio_blink(struct gpio_chip *chip, unsigned pin, int value)
+{
+	struct mvebu_gpio_chip *mvchip =
+		container_of(chip, struct mvebu_gpio_chip, chip);
+	unsigned long flags;
+	u32 u;
+
+	spin_lock_irqsave(&mvchip->lock, flags);
+	u = readl_relaxed(mvebu_gpioreg_blink(mvchip));
+	if (value)
+		u |= 1 << pin;
+	else
+		u &= ~(1 << pin);
+	writel_relaxed(u, mvebu_gpioreg_blink(mvchip));
+	spin_unlock_irqrestore(&mvchip->lock, flags);
+}
+
 static int mvebu_gpio_direction_input(struct gpio_chip *chip, unsigned pin)
 {
 	struct mvebu_gpio_chip *mvchip =
@@ -244,6 +266,7 @@ static int mvebu_gpio_direction_output(struct gpio_chip *chip, unsigned pin,
 	if (ret)
 		return ret;
 
+	mvebu_gpio_blink(chip, pin, 0);
 	mvebu_gpio_set(chip, pin, value);
 
 	spin_lock_irqsave(&mvchip->lock, flags);
Signature · 1 line
1.7.10.4
#1 lore raw

PATCH 1/1 mvebu-gpio: Disable blinking when enabling a GPIO for output

Am Sonntag 28 Oktober 2012, 13:23:24 schrieb Jamie Lentin:

Quoted 60 lines

The plat-orion GPIO driver would disable any pin blinking whenever using a pin for output. Do the same here, as a blinking LED will continue to blink regardless of what the GPIO pin level is.

---
The power LED on the DNS-320/DNS-325 is left blinking by the bootloader, the LED turning steady indicates it's booted. The blinking needs to be disabled before setting the GPIO pin level has any effect.

Apart from the custom init code running too soon, I think everything is working now.

I haven't tested this on any other boards, so not sure if it's sensible beyond the kirkwood/orion world.

 drivers/gpio/gpio-mvebu.c |   23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)
drivers/gpio/gpio-mvebu.c +20 -0
index cf7afb9..be65c04 100644
@@ -92,6 +92,11 @@ static inline void __iomem *mvebu_gpioreg_out(struct
 mvebu_gpio_chip *mvchip) return mvchip->membase + GPIO_OUT_OFF;
 }
 
+static inline void __iomem *mvebu_gpioreg_blink(struct mvebu_gpio_chip
 *mvchip) +{
+	return mvchip->membase + GPIO_BLINK_EN_OFF;
+}
+
 static inline void __iomem *mvebu_gpioreg_io_conf(struct mvebu_gpio_chip
 *mvchip) {
 	return mvchip->membase + GPIO_IO_CONF_OFF;
@@ -206,6 +211,23 @@ static int mvebu_gpio_get(struct gpio_chip *chip,
 unsigned pin) return (u >> pin) & 1;
 }
 
+static void mvebu_gpio_blink(struct gpio_chip *chip, unsigned pin, int
 value) +{
+	struct mvebu_gpio_chip *mvchip =
+		container_of(chip, struct mvebu_gpio_chip, chip);
+	unsigned long flags;
+	u32 u;
+
+	spin_lock_irqsave(&mvchip->lock, flags);
+	u = readl_relaxed(mvebu_gpioreg_blink(mvchip));
+	if (value)
+		u |= 1 << pin;
+	else
+		u &= ~(1 << pin);
+	writel_relaxed(u, mvebu_gpioreg_blink(mvchip));
+	spin_unlock_irqrestore(&mvchip->lock, flags);
+}
+
 static int mvebu_gpio_direction_input(struct gpio_chip *chip, unsigned
 pin) {
 	struct mvebu_gpio_chip *mvchip =

drivers/gpio/gpio-mvebu.c static int mvebu_gpio_direction_output(struct gpio_chip · line 272

Quoted 7 lines
drivers/gpio/gpio-mvebu.c +1 -0
@@ -244,6 +266,7 @@ static int mvebu_gpio_direction_output(struct gpio_chip
 *chip, unsigned pin, if (ret)
 		return ret;
 
+	mvebu_gpio_blink(chip, pin, 0);
 	mvebu_gpio_set(chip, pin, value);
 
 	spin_lock_irqsave(&mvchip->lock, flags);
Signature · 1 line
Michael
#2 lore raw

PATCH 1/1 mvebu-gpio: Disable blinking when enabling a GPIO for output

In reply to Jamie Lentin
Quoted 10 lines · Jamie Lentin

The plat-orion GPIO driver would disable any pin blinking whenever using a pin for output. Do the same here, as a blinking LED will continue to blink regardless of what the GPIO pin level is.

---
The power LED on the DNS-320/DNS-325 is left blinking by the bootloader, the LED turning steady indicates it's booted. The blinking needs to be disabled before setting the GPIO pin level has any effect.

Quoted 5 lines

Apart from the custom init code running too soon, I think everything is working now.

I haven't tested this on any other boards, so not sure if it's sensible beyond the kirkwood/orion world.

Can I have some ACK on this thing from Andrew or Thomas say...

Also is this a thing for the stable kernel -rc series or next merge window? I couldn't quite figure out if it was a regression.

Yours,
Linus Walleij

#3 lore raw

PATCH 1/1 mvebu-gpio: Disable blinking when enabling a GPIO for output

Dear Linus Walleij,

Quoted 1 line · Linus Walleij

Can I have some ACK on this thing from Andrew or Thomas say...

I just gave a formal ACK to the patch.

Quoted 2 lines

Also is this a thing for the stable kernel -rc series or next merge window? I couldn't quite figure out if it was a regression.

I don't think it is really necessary to have it in the 3.7-rc series. The driver has been introduced in 3.7, but technically speaking, nothing is using it yet. Users will only be introduced in 3.8.

Best regards,

Thomas

Signature · 4 lines
Thomas Petazzoni, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com
#4 lore raw

PATCH 1/1 mvebu-gpio: Disable blinking when enabling a GPIO for output

In reply to Jamie Lentin
Quoted 5 lines · Jamie Lentin

The plat-orion GPIO driver would disable any pin blinking whenever using a pin for output. Do the same here, as a blinking LED will continue to blink regardless of what the GPIO pin level is.

Signature · 4 lines
Thomas Petazzoni, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com
#5 lore raw

PATCH 1/1 mvebu-gpio: Disable blinking when enabling a GPIO for output

In reply to Jamie Lentin
Quoted 5 lines · Jamie Lentin

The plat-orion GPIO driver would disable any pin blinking whenever using a pin for output. Do the same here, as a blinking LED will continue to blink regardless of what the GPIO pin level is.

OK applied to my fixes branch with Thomas' ACK.

Yours,
Linus Walleij