[PATCH] pxa/hx4700: Avoid unbalanced irq wakeup enables/disables

Philipp Zabel philipp.zabel at gmail.com
Mon Feb 27 02:42:34 EST 2012


Am Montag, den 27.02.2012, 10:00 +0800 schrieb Haojian Zhuang:
> On Sun, Feb 26, 2012 at 6:48 PM, Philipp Zabel <philipp.zabel at gmail.com> wrote:
> > On my hx4700 iPAQ running Windows Mobile 5, gpio button wakeup is
> > configurable under "Start -> Settings -> Personal -> Buttons -> Lock".
> > There is a checkbox "Disable all buttons except power button" which
> > enables/disables the keypad and ASIC3 GPIO buttons as wakeup sources.
> >
> > To achieve the same functionality on linux, we could split the power
> > button and the other buttons into separate gpio_keys devices and let
> > userspace disable the other buttons as wakeup sources via the device's
> > pm_wakeup interface. 
>
> It seems that this patch is only enable powerup key as wakeup source.

Yes. This is temporary until ASIC3 GPIO wakeup support is in place.

> Other gpio keys could be configured as wakeup source in user space. So could
> you help to figure out the interface of configuring gpio key as wakeup source
> in user space?

I was thinking of the /sys/devices/.../power/wakeup interface, as
documented in Documentation/ABI/testing/sysfs-devices-power.

Put the power button into its own gpio-keys device:

diff --git a/arch/arm/mach-pxa/hx4700.c b/arch/arm/mach-pxa/hx4700.c
index 06ec926..21d26a3 100644
--- a/arch/arm/mach-pxa/hx4700.c
+++ b/arch/arm/mach-pxa/hx4700.c
@@ -166,11 +166,26 @@ static struct pxaficp_platform_data ficp_info = {
 		.active_low = _active_low,		\
 		.desc       = _desc,			\
 		.type       = EV_KEY,			\
-		.wakeup     = KEY_##_code == KEY_POWER,	\
+		.wakeup     = 1,			\
 	}
 
+static struct gpio_keys_button gpio_keys_power_button =
+	INIT_KEY(POWER,       GPIO0_HX4700_nKEY_POWER,   1, "Power button");
+
+static struct gpio_keys_platform_data gpio_keys_power_data = {
+	.buttons = gpio_keys_power_button,
+	.nbuttons = 1,
+};
+
+static struct platform_device gpio_keys_power = {
+	.name = "gpio-keys",
+	.dev  = {
+		.platform_data = &gpio_keys_power_data,
+	},
+	.id   = 0,
+};
+
 static struct gpio_keys_button gpio_keys_buttons[] = {
-	INIT_KEY(POWER,       GPIO0_HX4700_nKEY_POWER,   1, "Power button"),
 	INIT_KEY(MAIL,        GPIO94_HX4700_KEY_MAIL,    0, "Mail button"),
 	INIT_KEY(ADDRESSBOOK, GPIO99_HX4700_KEY_CONTACTS,0, "Contacts button"),
 	INIT_KEY(RECORD,      GPIOD6_nKEY_RECORD,        1, "Record button"),
@@ -188,7 +203,7 @@ static struct platform_device gpio_keys = {
 	.dev  = {
 		.platform_data = &gpio_keys_data,
 	},
-	.id   = -1,
+	.id   = 1,
 };
 
 /*
@@ -836,6 +851,7 @@ static struct platform_device audio = {
 
 static struct platform_device *devices[] __initdata = {
 	&asic3,
+	&gpio_keys_power,
 	&gpio_keys,
 	&navpoint,
 	&backlight,

And then let userspace disable wakeup for the other keys via
echo disabled > /sys/devices/platform/gpio-keys.1/power/wakeup

The gpio-keys driver will check this setting with device_may_wakeup()
during gpio_keys_suspend() and decide whether to call enable_irq_wake()
for its button GPIOs.

regards
Philipp





More information about the linux-arm-kernel mailing list