Hi,
I am playing with OMAP 5910 based Amstrad E3 videophone (ams-delta)
machine. I am trying to expose GPIO 4, that hook switch hangs off, to
userspace.
I can successfully access the pin by exporting it using gpiolib sysfs. I
can check its value, following hook switch state changes. However, I
would like the switch to generate events.
I have tried two methods: gpio-switch and gpio-keys. gpio-switch device
is able to report the switch initial state correctly, gpio-keys device
just initializes without errors. However, for both methods, after first
switch change, the system stops responding, giving no error messages.
The code of goip-switch initialization sequence together with my
platform device definition (attached) does not look any different to me
than those for keyboard or modem (patches available from
http://the.earth.li/pub/e3/2.6.19/), that both also use GPIO interrupts
and do work for me.
Any hints?
Janusz
PS. This is my first post to linux-omap list, I don't know if you accept
attachments. If not, next time I switch to a different mail user agent
that allows me for inline file inclusion (or learn how to do it in my
thunderbird).
--- linux-2.6.27.22/arch/arm/mach-omap1/board-ams-delta.c.orig 2009-05-10 18:05:01.000000000 +0200
+++ linux-2.6.27.22/arch/arm/mach-omap1/board-ams-delta.c 2009-05-10 18:19:18.000000000 +0200
@@ -243,6 +243,17 @@ static struct uart_port ams_delta_modem_
.line = 1
};
+static struct omap_gpio_switch ams_delta_switches[] __initdata = {
+ /* Low when handset is picked up */
+ {
+ .name = "handset",
+ .gpio = AMS_DELTA_GPIO_PIN_HOOK_SWITCH,
+ .type = OMAP_GPIO_SWITCH_TYPE_ACTIVITY,
+ .flags = OMAP_GPIO_SWITCH_FLAG_INVERTED,
+ /* .notify = ams_delta_handset_detect, */
+ },
+};
+
static void __init ams_delta_init(void)
{
printk("ams_delta_init\n\r");
@@ -259,6 +270,9 @@ static void __init ams_delta_init(void)
platform_add_devices(ams_delta_devices, ARRAY_SIZE(ams_delta_devices));
+ omap_register_gpio_switches(ams_delta_switches,
+ ARRAY_SIZE(ams_delta_switches));
+
early_serial_setup(&ams_delta_modem_port);
#ifdef CONFIG_AMS_DELTA_FIQ