Hi,

Michael Trimarchi wrote:
Hi,

Andy Green wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Somebody in the thread at some point said:

| Version based on the last andy-andytracking

That's current HEAD, great.

| Status:
| wifi: ok
| bluetooth ok
| SIM problem, remain locked. I don't have the source code so I can't do
| nothing.
| Maybe I can restart from the gsmmux daemon avalaible in source.

It sounds really encouraging for the kernel anyway, what's the situation
with suspend reliability?

Sometimes seems that the system doesn't takes event from the power button. I must try one or more or try with the usb cable. And It power on and if I don't press power again, the system suspend again. I think that depends on android. All the operation is done using the graphics interface. I don't have time now. Because I take an airplane in 3 hours to return in italy.
- -Andy
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org

iEYEARECAAYFAklndR8ACgkQOjLpvpq7dMpANgCdGsz6zH6L8VUYg5K2Qvk4TYu8
nogAniIHnzwM74sUaX5TvySzxHmZ43sk
=07VI
-----END PGP SIGNATURE-----


Regards Michael


git diff with openmoko kernel :)

Michael
diff --git a/drivers/input/misc/pcf50633-input.c b/drivers/input/misc/pcf50633-input.c
index a3cc4d6..3ac50a4 100644
--- a/drivers/input/misc/pcf50633-input.c
+++ b/drivers/input/misc/pcf50633-input.c
@@ -28,10 +28,15 @@
 #include <linux/mfd/pcf50633/core.h>
 #include <linux/mfd/pcf50633/input.h>
 
+struct pcf50633_key_data {
+	int key;
+};
+
 static void
 pcf50633_input_irq(struct pcf50633 *pcf, int irq, void *data)
 {
 	struct input_dev *input_dev = pcf->input.input_dev;
+	struct pcf50633_key_data *kd = data;
 	int onkey_released;
 
 	/* We report only one event depending on if the key status */
@@ -39,20 +44,32 @@ pcf50633_input_irq(struct pcf50633 *pcf, int irq, void *data)
 					PCF50633_OOCSTAT_ONKEY;
 
 	if (irq == PCF50633_IRQ_ONKEYF && !onkey_released)
-		input_report_key(input_dev, KEY_POWER, 1);
-	else if (irq == PCF50633_IRQ_ONKEYR && onkey_released)
-		input_report_key(input_dev, KEY_POWER, 0);
-
-	input_sync(input_dev);
+		kd->key = KEY_MENU;
+	else if (irq == PCF50633_IRQ_ONKEYR && onkey_released) {
+		if (kd->key == KEY_MENU) {
+			input_report_key(input_dev, kd->key, 1);
+			input_sync(input_dev);
+		}
+		input_report_key(input_dev, kd->key, 0);
+		input_sync(input_dev);
+	} else if (irq == PCF50633_IRQ_ONKEY1S && !onkey_released) {
+		kd->key = KEY_POWER;
+		input_report_key(input_dev, kd->key, 1);
+		input_sync(input_dev);
+	}
 }
 
 int __init pcf50633_input_probe(struct platform_device *pdev)
 {
 	struct pcf50633 *pcf;
 	struct input_dev *input_dev;
+	struct pcf50633_key_data *kd;
 	int ret;
 
 	pcf = platform_get_drvdata(pdev);
+	kd = kzalloc(sizeof(*kd), GFP_KERNEL);
+	if (!kd)
+		return -ENOMEM;
 
 	input_dev = input_allocate_device();
 	if (!input_dev)
@@ -62,6 +79,7 @@ int __init pcf50633_input_probe(struct platform_device *pdev)
 	input_dev->id.bustype = BUS_I2C;
 
 	input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_PWR);
+	set_bit(KEY_MENU, input_dev->keybit);
 	set_bit(KEY_POWER, input_dev->keybit);
 	set_bit(KEY_POWER2, input_dev->keybit);
 
@@ -77,8 +95,13 @@ int __init pcf50633_input_probe(struct platform_device *pdev)
 	 * two handlers for an IRQ
 	 */
 	pcf->irq_handler[PCF50633_IRQ_ONKEYR].handler = pcf50633_input_irq;
+	pcf->irq_handler[PCF50633_IRQ_ONKEYR].data = kd;
 
 	pcf->irq_handler[PCF50633_IRQ_ONKEYF].handler = pcf50633_input_irq;
+	pcf->irq_handler[PCF50633_IRQ_ONKEYF].data = kd;
+
+	pcf->irq_handler[PCF50633_IRQ_ONKEY1S].handler = pcf50633_input_irq;
+	pcf->irq_handler[PCF50633_IRQ_ONKEY1S].data = kd;
 
 	return 0;
 
@@ -90,8 +113,22 @@ out:
 static int __devexit pcf50633_input_remove(struct platform_device *pdev)
 {
 	struct pcf50633 *pcf;
+	struct pcf50633_key_data *kd;
 
 	pcf = platform_get_drvdata(pdev);
+
+	kd = pcf->irq_handler[PCF50633_IRQ_ONKEYR].data;
+
+	pcf->irq_handler[PCF50633_IRQ_ONKEYR].handler = NULL;
+	pcf->irq_handler[PCF50633_IRQ_ONKEYR].data = NULL;
+
+	pcf->irq_handler[PCF50633_IRQ_ONKEYF].handler = NULL;
+	pcf->irq_handler[PCF50633_IRQ_ONKEYF].data = NULL;
+
+	pcf->irq_handler[PCF50633_IRQ_ONKEY1S].handler = NULL;
+	pcf->irq_handler[PCF50633_IRQ_ONKEY1S].data = NULL;
+
+	kfree(kd);
 	input_unregister_device(pcf->input.input_dev);
 
 	return 0;

Reply via email to