Hi Greg,
Below are the my changes in kernel side. As mentioned in previous
mail, I'm using Switch GPIO driver (which uses Switch Class driver) to
generate the headset uevent. In the patch, it's also included the
board file (for OMAP 3430SDP board) although it's not part of standard
android kernel it may be useful for reference.
diff --git a/arch/arm/mach-omap2/board-3430sdp.c
b/arch/arm/mach-omap2/board-3430sdp.c
index 0000d3b..701c861 100644
--- a/arch/arm/mach-omap2/board-3430sdp.c
+++ b/arch/arm/mach-omap2/board-3430sdp.c
@@ -24,6 +24,7 @@
#include <linux/spi/ads7846.h>
#include <linux/i2c/twl4030.h>
#include <linux/mm.h>
+#include <linux/switch.h>
#include <mach/hardware.h>
#include <asm/mach-types.h>
@@ -1140,10 +1141,24 @@ static struct platform_device sdp3430_lcd_device = {
.id = -1,
};
+
+static struct gpio_switch_platform_data headset_switch_data = {
+ .name = "h2w",
+ .gpio = OMAP_MAX_GPIO_LINES + 2, /*TWL4030 GPIO_2 */
+};
+
+static struct platform_device headset_switch_device = {
+ .name = "switch-gpio",
+ .dev = {
+ .platform_data = &headset_switch_data,
+ }
+};
+
static struct platform_device *sdp3430_devices[] __initdata = {
&sdp3430_smc91x_device,
&irda_device,
&sdp3430_lcd_device,
+ &headset_switch_device,
};
static inline void __init sdp3430_init_smc91x(void)
@@ -1224,6 +1239,7 @@ static struct twl4030_gpio_platform_data
sdp3430_gpio_data = {
.irq_end = TWL4030_GPIO_IRQ_END,
};
+
static struct twl4030_usb_data sdp3430_usb_data = {
.usb_mode = T2_USB_MODE_ULPI,
};
diff --git a/drivers/switch/switch_gpio.c b/drivers/switch/switch_gpio.c
index cfd1339..82e29a2 100644
--- a/drivers/switch/switch_gpio.c
+++ b/drivers/switch/switch_gpio.c
@@ -22,6 +22,7 @@
#include <linux/switch.h>
#include <linux/workqueue.h>
#include <linux/gpio.h>
+#include <linux/interrupt.h>
struct gpio_switch_data {
struct switch_dev sdev;
@@ -110,7 +111,8 @@ static int gpio_switch_probe(struct platform_device *pdev)
}
ret = request_irq(switch_data->irq, gpio_irq_handler,
- IRQF_TRIGGER_LOW, pdev->name, switch_data);
+ IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
+ pdev->name, switch_data);
if (ret < 0)
goto err_request_irq;
In Android side, the DEVPATH value generated by the uevent doesn't
match with the one specified in HeadsetObserver.
diff --git a/services/java/com/android/server/HeadsetObserver.java
b/services/java/com/android/server/HeadsetObserver.java
index 2bea731..e5c7706 100644
--- a/services/java/com/android/server/HeadsetObserver.java
+++ b/services/java/com/android/server/HeadsetObserver.java
@@ -32,7 +32,7 @@ import java.io.FileNotFoundException;
class HeadsetObserver extends UEventObserver {
private static final String TAG = HeadsetObserver.class.getSimpleName();
- private static final String HEADSET_UEVENT_MATCH =
"DEVPATH=/devices/virtual/switch/h2w";
+ private static final String HEADSET_UEVENT_MATCH =
"DEVPATH=/class/switch/h2w";
private static final String HEADSET_STATE_PATH =
"/sys/class/switch/h2w/state";
private static final String HEADSET_NAME_PATH =
"/sys/class/switch/h2w/name";
--~--~---------~--~----~------------~-------~--~----~
unsubscribe: [email protected]
website: http://groups.google.com/group/android-kernel
-~----------~----~----~----~------~----~------~--~---