Skip to contentSkip to conversation

ARM: iop32x: fix power off handling for the EM7210 board

PATCH Superseded Linus Walleij 3 participants 4 messages Jan 29, 2014 – Jan 31, 2014

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 ARM: iop32x: fix power off handling for the EM7210 board

This board was missed when converting all the others to proper abstracted GPIO handling. Fix it up the right way by requesting and driving GPIO line 0 high through gpiolib to power off the machine.

---
ChangeLog v1->v2:
- Request the power off and set the power off hook with a device_initcall() so we know the GPIO driver is available when requesting the line.
- Refer to POWER OFF rather than RESET everywhere.

ARM SoC folks, if you're happy with this fix, please apply it directly to fixes in the ARM SoC tree.

---
 arch/arm/mach-iop32x/em7210.c | 32 +++++++++++++++++++++++++++-----
 1 file changed, 27 insertions(+), 5 deletions(-)
arch/arm/mach-iop32x/em7210.c +27 -5
index 177cd073a83b..77e1ff057303 100644
@@ -23,6 +23,7 @@
 #include <linux/mtd/physmap.h>
 #include <linux/platform_device.h>
 #include <linux/i2c.h>
+#include <linux/gpio.h>
 #include <mach/hardware.h>
 #include <linux/io.h>
 #include <linux/irq.h>
@@ -176,11 +177,35 @@ static struct platform_device em7210_serial_device = {
 	.resource	= &em7210_uart_resource,
 };
 
+#define EM7210_HARDWARE_POWER 0
+
 void em7210_power_off(void)
 {
-	*IOP3XX_GPOE &= 0xfe;
-	*IOP3XX_GPOD |= 0x01;
+	int ret;
+
+	ret = gpio_direction_output(EM7210_HARDWARE_POWER, 1);
+	if (ret)
+		pr_crit("could not drive power off GPIO high\n");
+}
+
+static int __init em7210_request_gpios(void)
+{
+	int ret;
+
+	if (!machine_is_em7210())
+		return 0;
+
+	ret = gpio_request(EM7210_HARDWARE_POWER, "power");
+	if (ret) {
+		pr_err("could not request power off GPIO\n");
+		return 0;
+	}
+
+	pm_power_off = em7210_power_off;
+
+	return 0;
 }
+device_initcall(em7210_request_gpios);
 
 static void __init em7210_init_machine(void)
 {
@@ -194,9 +219,6 @@ static void __init em7210_init_machine(void)
 
 	i2c_register_board_info(0, em7210_i2c_devices,
 		ARRAY_SIZE(em7210_i2c_devices));
-
-
-	pm_power_off = em7210_power_off;
 }
 
 MACHINE_START(EM7210, "Lanner EM7210")
Signature · 1 line
1.8.5.3
#1 lore raw

PATCH v2 1/1 ARM: iop32x: fix power off handling for the EM7210 board

Quoted 36 lines · Linus Walleij

This board was missed when converting all the others to proper abstracted GPIO handling. Fix it up the right way by requesting and driving GPIO line 0 high through gpiolib to power off the machine.

---
ChangeLog v1->v2:
- Request the power off and set the power off hook with a device_initcall() so we know the GPIO driver is available when requesting the line.
- Refer to POWER OFF rather than RESET everywhere.

ARM SoC folks, if you're happy with this fix, please apply it directly to fixes in the ARM SoC tree.

---
 arch/arm/mach-iop32x/em7210.c | 32 +++++++++++++++++++++++++++-----
 1 file changed, 27 insertions(+), 5 deletions(-)
arch/arm/mach-iop32x/em7210.c +1 -0
index 177cd073a83b..77e1ff057303 100644
@@ -23,6 +23,7 @@
 #include <linux/mtd/physmap.h>
 #include <linux/platform_device.h>
 #include <linux/i2c.h>
+#include <linux/gpio.h>
 #include <mach/hardware.h>
 #include <linux/io.h>
 #include <linux/irq.h>
@@ -176,11 +177,35 @@ static struct platform_device em7210_serial_device = {
 	.resource	= &em7210_uart_resource,
 };

arch/arm/mach-iop32x/em7210.c static struct platform_device em7210_serial_device = { · line 186

Quoted 10 lines
arch/arm/mach-iop32x/em7210.c +5 -2
 
+#define EM7210_HARDWARE_POWER 0
+
 void em7210_power_off(void)
 {
-	*IOP3XX_GPOE &= 0xfe;
-	*IOP3XX_GPOD |= 0x01;
+	int ret;
+
+	ret = gpio_direction_output(EM7210_HARDWARE_POWER, 1);

btw, any reason for not using gpio_direction_output() in em7210_request_gpios() and gpio_set_value() here ? (just wondering)

I can't test it on my ss4000e but at least this patch looks fine.

Arnaud

#2 lore raw

PATCH v2 1/1 ARM: iop32x: fix power off handling for the EM7210 board

Quoted 10 lines · Arnaud Patard

arch/arm/mach-iop32x/em7210.c static struct platform_device em7210_serial_device = { · line 186

Quoted 7 lines · Linus Walleij

void em7210_power_off(void)
{

arch/arm/mach-iop32x/em7210.c +3 -2
-     *IOP3XX_GPOE &= 0xfe;
-     *IOP3XX_GPOD |= 0x01;
+     int ret;
+
+     ret = gpio_direction_output(EM7210_HARDWARE_POWER, 1);
Quoted 2 lines

btw, any reason for not using gpio_direction_output() in em7210_request_gpios() and gpio_set_value() here ? (just wondering)

Mainly because the old code did not drive a default value on the pin (which would be zero then) but relies on the power-on default.

So by not doing this I'm not poking any hardware that wasn't poked earlier.

Quoted 1 line

I can't test it on my ss4000e but at least this patch looks fine.

Would be nice!

Yours,
Linus Walleij

#3 lore raw

PATCH v2 1/1 ARM: iop32x: fix power off handling for the EM7210 board

In reply to Linus Walleij
Quoted 8 lines · Linus Walleij

This board was missed when converting all the others to proper abstracted GPIO handling. Fix it up the right way by requesting and driving GPIO line 0 high through gpiolib to power off the machine.

Queueing for fixes (w/ack from Arnd.)

Kevin