Modified: trunk/drivers/input/misc/pcf8574_keypad.c (8436 => 8437)
--- trunk/drivers/input/misc/pcf8574_keypad.c 2010-03-09 15:58:22 UTC (rev 8436)
+++ trunk/drivers/input/misc/pcf8574_keypad.c 2010-03-09 20:55:08 UTC (rev 8437)
@@ -15,11 +15,7 @@
#define DRV_NAME "pcf8574_keypad"
-MODULE_AUTHOR("Michael Hennerich");
-MODULE_DESCRIPTION("Keypad input driver for 16 keys connected to PCF8574");
-MODULE_LICENSE("GPL");
-
-static unsigned char pcf8574_kp_btncode[] = {
+static const unsigned char pcf8574_kp_btncode[] = {
[0] = KEY_RESERVED,
[1] = KEY_ENTER,
[2] = KEY_BACKSLASH,
@@ -40,16 +36,14 @@
};
struct kp_data {
- unsigned char *btncode;
+ unsigned char btncode[17];
struct input_dev *idev;
struct i2c_client *client;
char name[64];
char phys[32];
unsigned char laststate;
unsigned char statechanged;
- unsigned long irq_handled;
- unsigned long events_sended;
- unsigned long events_processed;
+ unsigned long events_sent;
struct work_struct pcf8574_kp_work;
};
@@ -83,15 +77,13 @@
lp->statechanged = lp->laststate ^ nextstate;
- if (lp->statechanged) {
+ if (lp->statechanged)
input_report_key(lp->idev,
nextstate > 17 ? lp->btncode[lp->laststate] :
lp->btncode[nextstate],
nextstate > 17 ? 0 : 1);
-
- lp->events_sended++;
- }
lp->laststate = nextstate;
+
input_sync(lp->idev);
enable_irq(lp->client->irq);
}
@@ -117,24 +109,11 @@
return -ENODEV;
}
- lp = kzalloc(sizeof(struct kp_data), GFP_KERNEL);
+ lp = kzalloc(sizeof(*lp), GFP_KERNEL);
if (!lp)
return -ENOMEM;
lp->client = client;
- i2c_set_clientdata(client, lp);
-
- if (client->irq > 0) {
- ret = request_irq(client->irq, pcf8574_kp_irq_handler,
- IRQF_TRIGGER_LOW, DRV_NAME, lp);
- if (ret) {
- dev_err(&client->dev, "IRQ %d is not free\n", client->irq);
- goto fail_irq;
- }
- } else
- dev_warn(&client->dev, "IRQ not configured!\n");
-
-
idev = input_allocate_device();
if (!idev) {
dev_err(&client->dev, "Can't allocate input device\n");
@@ -143,7 +122,7 @@
}
lp->idev = idev;
- lp->btncode = pcf8574_kp_btncode;
+ memcpy(lp->btncode, pcf8574_kp_btncode, sizeof(pcf8574_kp_btncode));
idev->evbit[0] = 0;
@@ -169,7 +148,7 @@
input_set_drvdata(idev, lp);
- ret = input_register_device(lp->idev);
+ ret = input_register_device(idev);
if (ret) {
dev_err(&client->dev, "input_register_device() failed\n");
goto fail_register;
@@ -182,18 +161,23 @@
/* Set up our workqueue. */
INIT_WORK(&lp->pcf8574_kp_work, check_and_notify);
- dev_info(&client->dev, "input: %s at %s IRQ %d\n", lp->name, lp->phys,
- client->irq);
+ i2c_set_clientdata(client, lp);
+ ret = request_irq(client->irq, pcf8574_kp_irq_handler,
+ IRQF_TRIGGER_LOW, DRV_NAME, lp);
+ if (ret) {
+ dev_err(&client->dev, "IRQ %d is not free\n", client->irq);
+ goto fail_irq;
+ }
+
return 0;
+ fail_irq:
+ input_unregister_device(idev);
fail_register:
input_set_drvdata(idev, NULL);
input_free_device(idev);
fail_allocate:
- free_irq(client->irq, lp);
- fail_irq:
- i2c_set_clientdata(client, NULL);
kfree(lp);
return ret;
@@ -218,28 +202,13 @@
#ifdef CONFIG_PM
static int pcf8574_kp_resume(struct i2c_client *client)
{
- struct kp_data *lp = i2c_get_clientdata(client);
- int ret;
-
- if (client->irq > 0) {
- ret = request_irq(client->irq, pcf8574_kp_irq_handler,
- IRQF_TRIGGER_LOW, DRV_NAME, lp);
- if (ret) {
- dev_err(&client->dev, "IRQ %d is not free\n", client->irq);
- return -ENODEV;
- }
- }
-
+ enable_irq(client->irq);
return 0;
}
static int pcf8574_kp_suspend(struct i2c_client *client, pm_message_t mesg)
{
- struct kp_data *lp = i2c_get_clientdata(client);
-
- if (client->irq > 0)
- free_irq(client->irq, lp);
-
+ disable_irq(client->irq);
return 0;
}
#else
@@ -255,7 +224,8 @@
static struct i2c_driver pcf8574_kp_driver = {
.driver = {
- .name = DRV_NAME,
+ .name = DRV_NAME,
+ .owner = THIS_MODULE
},
.probe = pcf8574_kp_probe,
.remove = __devexit_p(pcf8574_kp_remove),
@@ -268,11 +238,14 @@
{
return i2c_add_driver(&pcf8574_kp_driver);
}
+module_init(pcf8574_kp_init);
static void __exit pcf8574_kp_exit(void)
{
i2c_del_driver(&pcf8574_kp_driver);
}
-
-module_init(pcf8574_kp_init);
module_exit(pcf8574_kp_exit);
+
+MODULE_AUTHOR("Michael Hennerich");
+MODULE_DESCRIPTION("Keypad input driver for 16 keys connected to PCF8574");
+MODULE_LICENSE("GPL");