* Re: [PATCH] HP Jornada 7xx keyboard support [not found] <20070718163259.2565fb8c.Kristoffer.Ericson@Gmail.com> @ 2007-07-18 15:00 ` Dmitry Torokhov [not found] ` <20070718191119.18bf1e9c.Kristoffer.Ericson@Gmail.com> 0 siblings, 1 reply; 9+ messages in thread From: Dmitry Torokhov @ 2007-07-18 15:00 UTC (permalink / raw) To: Kristoffer Ericson; +Cc: linux-input Hi Kristoffer, On 7/18/07, Kristoffer Ericson <kristoffer.ericson@gmail.com> wrote: > Greetings, > Thank you for your patch, I have a couple of comments. > Couldnt find any mailinglist, but please CC this there if there is one. > CCing linus-input... > + /* Lets drag them out one at a time */ > + while (count-- > 0) { > + /* Exchange TxDummy for a real key */ > + key = kbd_data = jornada_ssp_inout(TxDummy); > + > + if (key < 0) { /* whoops, no more waiting */ key is declared as "unsigned char", how can this condition ever trigger? > + jornada_ssp_end(); /* End transmission */ > + return IRQ_HANDLED; > + } > + > + if (key > 128) /* Key released */ > + key = key - 128; > + > + keycode = jornada_normal_keymap[key]; > + > + /* A key pressed down */ > + if (kbd_data < 128) { > + input_report_key(input_dev,keycode, 1); > + input_sync(input_dev); > + } > + else { /* Key released */ > + input_report_key(input_dev, keycode, 0); > + input_sync(input_dev); > + } All of this can be probably written as: input_report_key(input_dev, jornada_normal_keymap[kbd_data & 0x7f], !(kbd_data & 0x80)); input_sync(input_dev); > + } > + jornada_ssp_end(); /* End Transmission */ > + return IRQ_HANDLED; > +}; > + > +static int jornada720_kbd_probe(struct platform_device *pdev) __devinit? > +{ > + int i, ret; > + > + input_dev = input_allocate_device(); > + if (!input_dev) { > + return -ENOMEM; > + }; > + > + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); > + input_dev->keybit[LONG(KEY_SUSPEND)] |= BIT(KEY_SUSPEND); Why special treatment of KEY_SUSPEND? > + > + input_dev->name = "HP Jornada 720 keyboard"; > + input_dev->phys = "jornadakbd/input0"; please add "input_dev->dev.parent = &pdev->dev;" to place input device into proper place in sysfs. > + > + for (i=0 ; i<=128 ; i++) { > + if (jornada_normal_keymap[i]) > + set_bit(jornada_normal_keymap[i], input_dev->keybit); > + } Please allocate a copy of keymap and assign keycode, keycodemax and keycodesize in input_dev so that keymap can be adjusted at runtime. > + > + ret = request_irq(IRQ_GPIO0, > + jornada720_kbd_interrupt, > + IRQF_DISABLED | IRQF_TRIGGER_FALLING, > + "jornadakbd", input_dev); > + if (ret) { > + printk(KERN_INFO "Unable to grab IRQ for %s: %d\n", "jornadakbd", ret); > + input_free_device(input_dev); > + return ret; > + } > + > + input_register_device(input_dev); Error hanling please. > + > + return 0; > +}; > + > +static int jornada720_kbd_remove(struct platform_device *pdev) __devexit? > +{ > + free_irq(IRQ_GPIO0, input_dev); > + input_unregister_device(input_dev); > + return 0; > +} > + > +static struct platform_driver jornada720_kbd_driver = { > + .driver = { > + .name = "jornada720_kbd", > + }, > + .probe = jornada720_kbd_probe, > + .remove = jornada720_kbd_remove, > +}; > + > +static int __devinit jornada720_kbd_init(void) > +{ > + printk(KERN_INFO "HP Jornada 720 keyboard driver initialized\n"); I'd lose this printk - input core will print appropriate message when input device is registered. > + return platform_driver_register(&jornada720_kbd_driver); > +} > + > +static void __exit jornada720_kbd_exit(void) > +{ > + platform_driver_unregister(&jornada720_kbd_driver); > +} > + > +module_init(jornada720_kbd_init); > +module_exit(jornada720_kbd_exit); > Kconfig and Makefile changes seem to be missing..? -- Dmitry ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <20070718191119.18bf1e9c.Kristoffer.Ericson@Gmail.com>]
* Re: [PATCH] HP Jornada 7xx keyboard support [not found] ` <20070718191119.18bf1e9c.Kristoffer.Ericson@Gmail.com> @ 2007-07-20 18:54 ` Dmitry Torokhov 2007-07-21 4:25 ` Kristoffer Ericson 0 siblings, 1 reply; 9+ messages in thread From: Dmitry Torokhov @ 2007-07-20 18:54 UTC (permalink / raw) To: Kristoffer Ericson; +Cc: linux-input Hi Kristoffer, On 7/18/07, Kristoffer Ericson <kristoffer.ericson@gmail.com> wrote: > Try #2 > > Thanks for feedback, Ive tried a different approach to get it better handled. > Thank you for making the changes I requested, however there is still an issue: > + > + ret = request_irq(IRQ_GPIO0, > + jornada720_kbd_interrupt, > + IRQF_DISABLED | IRQF_TRIGGER_FALLING, > + "jornadakbd", input_dev); > + if (ret) { > + printk(KERN_WARNING "jornadakbd : Unable to grab IRQ\n"); > + goto failed; > + } > + > + err = input_register_device(jornadakbd->input); > + if (err) > + goto failed; > + Here if input_register_device() fails you free the memory but forget to free IRQ. -- Dmitry ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] HP Jornada 7xx keyboard support 2007-07-20 18:54 ` Dmitry Torokhov @ 2007-07-21 4:25 ` Kristoffer Ericson 2007-07-20 19:29 ` Dmitry Torokhov 0 siblings, 1 reply; 9+ messages in thread From: Kristoffer Ericson @ 2007-07-21 4:25 UTC (permalink / raw) To: Dmitry Torokhov; +Cc: Kristoffer Ericson, linux-input Greetings, Ive added it to free IRQ as you said, a minor change is also that jornada720.h defines are set in CAPS (just changed that for Russell). Ive also added the Kconfig and Makefile. Btw, do you keep patchtracker (like Russell) or drag from mail (like Paul)? Best wishes Kristoffer diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile index 28d211b..5145005 100644 --- a/drivers/input/keyboard/Makefile +++ b/drivers/input/keyboard/Makefile @@ -21,4 +21,4 @@ obj-$(CONFIG_KEYBOARD_OMAP) += omap-keypad.o obj-$(CONFIG_KEYBOARD_PXA27x) += pxa27x_keyboard.o obj-$(CONFIG_KEYBOARD_AAED2000) += aaed2000_kbd.o obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o - +obj-$(CONFIG_KEYBOARD_JORNADA720) += jornada720_kbd.o \ No newline at end of file diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig index c97d5eb..4a77c87 100644 --- a/drivers/input/keyboard/Kconfig +++ b/drivers/input/keyboard/Kconfig @@ -68,6 +68,13 @@ config KEYBOARD_ATKBD_RDI_KEYCODES right-hand column will be interpreted as the key shown in the left-hand column. +config KEYBOARD_JORNADA720 + tristate "HP 720 Keyboard Driver" + depends on SA1100_JORNADA720_SSP && SA1100_SSP + help + Say Y here to add support for the HP Jornada 7xx (710/720/728) onboard + keyboard. Its generally a good idea. + config KEYBOARD_SUNKBD tristate "Sun Type 4 and Type 5 keyboard" select SERIO diff --git a/drivers/input/keyboard/jornada720_kbd.c b/drivers/input/keyboard/jornada720_kbd.c new file mode 100644 index 0000000..b310f00 --- /dev/null +++ b/drivers/input/keyboard/jornada720_kbd.c @@ -0,0 +1,166 @@ +/* + * drivers/input/keyboard/jornada720_kbd.c + * + * HP Jornada 720 keyboard platform driver + * + * Copyright (C) 2006/2007 Kristoffer Ericson <Kristoffer.Ericson@Gmail.com> + * Copyright (C) 2006 jornada 720 kbd driver by Filip Zyzniewsk <Filip.Zyzniewski@tefnet.plX + * based on (C) 2004 jornada 720 kbd driver by Alex Lange <chicken@handhelds.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ +#include <linux/device.h> +#include <linux/init.h> +#include <linux/interrupt.h> +#include <linux/init.h> +#include <linux/input.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/platform_device.h> + +#include <asm/arch/jornada720.h> +#include <asm/hardware.h> + +MODULE_AUTHOR("Kristoffer Ericson <Kristoffer.Ericson@gmail.com>"); +MODULE_DESCRIPTION("HP Jornada 720 keyboard driver"); +MODULE_LICENSE("GPL"); + +static unsigned char jornada_normal_keymap[128] = { /* ROW */ + 0, KEY_ESC, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, /* #1 */ + KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_MUTE, /* -> */ + 0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, /* #2 */ + KEY_0, KEY_MINUS, KEY_EQUAL,0, 0, 0, /* -> */ + 0, KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, /* #3 */ + KEY_P, KEY_BACKSLASH, KEY_BACKSPACE, 0, 0, 0, /* -> */ + 0, KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L, /* #4 */ + KEY_SEMICOLON, KEY_LEFTBRACE, KEY_RIGHTBRACE, 0, 0, 0, /* -> */ + 0, KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMMA, /* #5 */ + KEY_DOT, KEY_KPMINUS, KEY_APOSTROPHE, KEY_ENTER, 0, 0,0, /* -> */ + 0, KEY_TAB, 0, KEY_LEFTSHIFT, 0, KEY_APOSTROPHE, 0, 0, 0, 0, /* #6 */ + KEY_UP, 0, KEY_RIGHTSHIFT, 0, 0, 0,0, 0, 0, 0, 0, KEY_LEFTALT, KEY_GRAVE, /* -> */ + 0, 0, KEY_LEFT, KEY_DOWN, KEY_RIGHT, 0, 0, 0, 0,0, KEY_KPASTERISK, /* -> */ + KEY_LEFTCTRL, 0, KEY_SPACE, 0, 0, 0, KEY_SLASH, KEY_DELETE, 0, 0, /* -> */ + 0, 0, 0, KEY_POWER, /* -> */ +}; + +struct jornadakbd { + unsigned char jornada_keymap[ARRAY_SIZE(jornada_normal_keymap)]; + struct input_dev *input; +}; + +static irqreturn_t jornada720_kbd_interrupt(int irq, void *dev_id) +{ + int count, kbd_data, ret; + + jornada_ssp_start(); + ret = jornada_ssp_inout(GETSCANKEYCODE); + + if (ret == -ETIMEOUT) { + printk(KERN_WARNING "jornada720_kdb:GetKeycode command failed with ETIMEOUT, flushed bus\n"); + jornada_ssp_end(); /* End transmission */ + return IRQ_HANDLED; + } + + /* How many keycodes are waiting for us? */ + count = jornada_ssp_inout(TXDUMMY); + + /* Lets drag them out one at a time */ + while (count-- > 0) { + /* Exchange TxDummy for location inside keymap */ + kbd_data = jornada_ssp_inout(TXDUMMY); + + input_report_key(input_dev, + jornada_normal_keymap[kbb_data & 0x7f], + !(kbd_data & 0x80)); + input_sync(input_dev); + } + jornada_ssp_end(); /* End Transmission */ + return IRQ_HANDLED; +}; + +static int __init jornada720_kbd_probe(struct platform_device *pdev) +{ + struct jornadakbd *jornadakbd; + struct input_dev *input_dev; + int i, ret, err; + + jornadakbd = kzalloc(sizeof(struct jornadakbd), GFP_KERNEL); + + input_dev = input_allocate_device(); + if (!input_dev || !jornadakbd) { + err = -ENOMEM; + goto failed; + }; + + platform_set_drvdata(pdev, jornadakbd); + + input_dev->dev.parent = &pdev.dev; + + memcpy(jornadakbd->jornada_keymap, normal_jornada_keymap, sizeof(jornadakbd->jornada_keymap); + + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); + input_dev->name = "HP Jornada 720 keyboard"; + input_dev->phys = "jornadakbd/input0"; + input_dev->keycode = jornadakbd->jornada_keymap; + input_dev->keycodesize = sizeof(unsigned char); + input_dev->keycodemax = ARRAY_SIZE(normal_jornada_keymap); + + for (i = 0; i < ARRAY_SIZE(jornadakbd_keymap); i++) + set_bit(jornadakbd->jornada_keymap[i], input_dev->keybit); + + ret = request_irq(IRQ_GPIO0, + jornada720_kbd_interrupt, + IRQF_DISABLED | IRQF_TRIGGER_FALLING, + "jornadakbd", input_dev); + if (ret) { + printk(KERN_WARNING "jornadakbd : Unable to grab IRQ\n"); + goto failed; + } + + err = input_register_device(jornadakbd->input); + if (err) + goto failed; + + return 0; + +failed: + free_irq(IRQ_GPIO0, input_dev); + input_free_device(input_dev); + kfree(jornadakbd); + return err; +}; + +static int jornada720_kbd_remove(struct platform_device *pdev) +{ + struct jornadakbd *jornadakbd = platform_get_drvdata(pdev); + + free_irq(IRQ_GPIO0, input_dev); + input_unregister_device(input_dev); + kfree(jornadakbd); + + return 0; +} + +static struct platform_driver jornada720_kbd_driver = { + .driver = { + .name = "jornada720_kbd", + }, + .probe = jornada720_kbd_probe, + .remove = jornada720_kbd_remove, +}; + +static int __devinit jornada720_kbd_init(void) +{ + return platform_driver_register(&jornada720_kbd_driver); +} + +static void __exit jornada720_kbd_exit(void) +{ + platform_driver_unregister(&jornada720_kbd_driver); +} + +module_init(jornada720_kbd_init); +module_exit(jornada720_kbd_exit); On Fri, 20 Jul 2007 14:54:14 -0400 "Dmitry Torokhov" <dmitry.torokhov@gmail.com> wrote: > Hi Kristoffer, > > On 7/18/07, Kristoffer Ericson <kristoffer.ericson@gmail.com> wrote: > > Try #2 > > > > Thanks for feedback, Ive tried a different approach to get it better handled. > > > > Thank you for making the changes I requested, however there is still an issue: > > > + > > + ret = request_irq(IRQ_GPIO0, > > + jornada720_kbd_interrupt, > > + IRQF_DISABLED | IRQF_TRIGGER_FALLING, > > + "jornadakbd", input_dev); > > + if (ret) { > > + printk(KERN_WARNING "jornadakbd : Unable to grab IRQ\n"); > > + goto failed; > > + } > > + > > + err = input_register_device(jornadakbd->input); > > + if (err) > > + goto failed; > > + > > Here if input_register_device() fails you free the memory but forget > to free IRQ. > > -- > Dmitry -- Kristoffer Ericson <Kristoffer.Ericson@Gmail.com> ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH] HP Jornada 7xx keyboard support 2007-07-21 4:25 ` Kristoffer Ericson @ 2007-07-20 19:29 ` Dmitry Torokhov 2007-07-21 5:02 ` Kristoffer Ericson 0 siblings, 1 reply; 9+ messages in thread From: Dmitry Torokhov @ 2007-07-20 19:29 UTC (permalink / raw) To: Kristoffer Ericson; +Cc: linux-input On 7/21/07, Kristoffer Ericson <kristoffer.ericson@gmail.com> wrote: > Greetings, > > Ive added it to free IRQ as you said, a minor change is also that jornada720.h defines are set in CAPS (just changed that for Russell). > Ive also added the Kconfig and Makefile. > > Btw, do you keep patchtracker (like Russell) or drag from mail (like Paul)? Get from the mail. > + > +failed: > + free_irq(IRQ_GPIO0, input_dev); Still not quire right - you may get to failed: when memory allocation fails or request_irq fails. We should not free IRQ that we did not get. Please split into 2 labels and jump accordingly. -- Dmitry ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] HP Jornada 7xx keyboard support 2007-07-20 19:29 ` Dmitry Torokhov @ 2007-07-21 5:02 ` Kristoffer Ericson 2007-07-20 20:36 ` Dmitry Torokhov 0 siblings, 1 reply; 9+ messages in thread From: Kristoffer Ericson @ 2007-07-21 5:02 UTC (permalink / raw) To: Dmitry Torokhov; +Cc: Kristoffer Ericson, linux-input #try 4: Ive changed the error handling so it only should release stuff it actually had aquired. Best wishes Kristoffer diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig index c97d5eb..4a77c87 100644 --- a/drivers/input/keyboard/Kconfig +++ b/drivers/input/keyboard/Kconfig @@ -68,6 +68,13 @@ config KEYBOARD_ATKBD_RDI_KEYCODES right-hand column will be interpreted as the key shown in the left-hand column. +config KEYBOARD_JORNADA720 + tristate "HP 720 Keyboard Driver" + depends on SA1100_JORNADA720_SSP && SA1100_SSP + help + Say Y here to add support for the HP Jornada 7xx (710/720/728) onboard + keyboard. Its generally a good idea. + config KEYBOARD_SUNKBD tristate "Sun Type 4 and Type 5 keyboard" select SERIO diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile index 28d211b..5145005 100644 --- a/drivers/input/keyboard/Makefile +++ b/drivers/input/keyboard/Makefile @@ -21,4 +21,4 @@ obj-$(CONFIG_KEYBOARD_OMAP) += omap-keypad.o obj-$(CONFIG_KEYBOARD_PXA27x) += pxa27x_keyboard.o obj-$(CONFIG_KEYBOARD_AAED2000) += aaed2000_kbd.o obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o - +obj-$(CONFIG_KEYBOARD_JORNADA720) += jornada720_kbd.o \ No newline at end of file diff --git a/drivers/input/keyboard/jornada720_kbd.c b/drivers/input/keyboard/jornada720_kbd.c new file mode 100644 index 0000000..f5af7f6 --- /dev/null +++ b/drivers/input/keyboard/jornada720_kbd.c @@ -0,0 +1,167 @@ +/* + * drivers/input/keyboard/jornada720_kbd.c + * + * HP Jornada 720 keyboard platform driver + * + * Copyright (C) 2006/2007 Kristoffer Ericson <Kristoffer.Ericson@Gmail.com> + * Copyright (C) 2006 jornada 720 kbd driver by Filip Zyzniewsk <Filip.Zyzniewski@tefnet.plX + * based on (C) 2004 jornada 720 kbd driver by Alex Lange <chicken@handhelds.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ +#include <linux/device.h> +#include <linux/init.h> +#include <linux/interrupt.h> +#include <linux/init.h> +#include <linux/input.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/platform_device.h> + +#include <asm/arch/jornada720.h> +#include <asm/hardware.h> + +MODULE_AUTHOR("Kristoffer Ericson <Kristoffer.Ericson@gmail.com>"); +MODULE_DESCRIPTION("HP Jornada 720 keyboard driver"); +MODULE_LICENSE("GPL"); + +static unsigned char jornada_normal_keymap[128] = { /* ROW */ + 0, KEY_ESC, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, /* #1 */ + KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_MUTE, /* -> */ + 0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, /* #2 */ + KEY_0, KEY_MINUS, KEY_EQUAL,0, 0, 0, /* -> */ + 0, KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, /* #3 */ + KEY_P, KEY_BACKSLASH, KEY_BACKSPACE, 0, 0, 0, /* -> */ + 0, KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L, /* #4 */ + KEY_SEMICOLON, KEY_LEFTBRACE, KEY_RIGHTBRACE, 0, 0, 0, /* -> */ + 0, KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMMA, /* #5 */ + KEY_DOT, KEY_KPMINUS, KEY_APOSTROPHE, KEY_ENTER, 0, 0,0, /* -> */ + 0, KEY_TAB, 0, KEY_LEFTSHIFT, 0, KEY_APOSTROPHE, 0, 0, 0, 0, /* #6 */ + KEY_UP, 0, KEY_RIGHTSHIFT, 0, 0, 0,0, 0, 0, 0, 0, KEY_LEFTALT, KEY_GRAVE, /* -> */ + 0, 0, KEY_LEFT, KEY_DOWN, KEY_RIGHT, 0, 0, 0, 0,0, KEY_KPASTERISK, /* -> */ + KEY_LEFTCTRL, 0, KEY_SPACE, 0, 0, 0, KEY_SLASH, KEY_DELETE, 0, 0, /* -> */ + 0, 0, 0, KEY_POWER, /* -> */ +}; + +struct jornadakbd { + unsigned char jornada_keymap[ARRAY_SIZE(jornada_normal_keymap)]; + struct input_dev *input; +}; + +static irqreturn_t jornada720_kbd_interrupt(int irq, void *dev_id) +{ + int count, kbd_data, ret; + + jornada_ssp_start(); + ret = jornada_ssp_inout(GETSCANKEYCODE); + + if (ret == -ETIMEOUT) { + printk(KERN_WARNING "jornada720_kdb:GetKeycode command failed with ETIMEOUT, flushed bus\n"); + jornada_ssp_end(); /* End transmission */ + return IRQ_HANDLED; + } + + /* How many keycodes are waiting for us? */ + count = jornada_ssp_inout(TXDUMMY); + + /* Lets drag them out one at a time */ + while (count-- > 0) { + /* Exchange TxDummy for location inside keymap */ + kbd_data = jornada_ssp_inout(TXDUMMY); + + input_report_key(input_dev, + jornada_normal_keymap[kbb_data & 0x7f], + !(kbd_data & 0x80)); + input_sync(input_dev); + } + jornada_ssp_end(); /* End Transmission */ + return IRQ_HANDLED; +}; + +static int __init jornada720_kbd_probe(struct platform_device *pdev) +{ + struct jornadakbd *jornadakbd; + struct input_dev *input_dev; + int i, ret, err; + + jornadakbd = kzalloc(sizeof(struct jornadakbd), GFP_KERNEL); + if (!jornadakbd) + return -ENOMEM; + + input_dev = input_allocate_device(); + if (!input_dev) + return -ENODEV; + + platform_set_drvdata(pdev, jornadakbd); + + input_dev->dev.parent = &pdev.dev; + + memcpy(jornadakbd->jornada_keymap, normal_jornada_keymap, sizeof(jornadakbd->jornada_keymap); + + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); + input_dev->name = "HP Jornada 720 keyboard"; + input_dev->phys = "jornadakbd/input0"; + input_dev->keycode = jornadakbd->jornada_keymap; + input_dev->keycodesize = sizeof(unsigned char); + input_dev->keycodemax = ARRAY_SIZE(normal_jornada_keymap); + + for (i = 0; i < ARRAY_SIZE(jornadakbd_keymap); i++) + set_bit(jornadakbd->jornada_keymap[i], input_dev->keybit); + + ret = request_irq(IRQ_GPIO0, + jornada720_kbd_interrupt, + IRQF_DISABLED | IRQF_TRIGGER_FALLING, + "jornadakbd", input_dev); + if (ret) { + printk(KERN_WARNING "jornadakbd : Unable to grab IRQ\n"); + goto failed1; + } + + err = input_register_device(jornadakbd->input); + if (err) + goto failed2; + + return 0; + +failed2: /* IRQ, DEVICE, MEMORY */ + free_irq(IRQ_GPIO0, input_dev); +failed1: /* DEVICE, MEMORY */ + input_free_device(input_dev); + kfree(jornadakbd); + return err; +}; + +static int jornada720_kbd_remove(struct platform_device *pdev) +{ + struct jornadakbd *jornadakbd = platform_get_drvdata(pdev); + + free_irq(IRQ_GPIO0, input_dev); + input_unregister_device(input_dev); + kfree(jornadakbd); + + return 0; +} + +static struct platform_driver jornada720_kbd_driver = { + .driver = { + .name = "jornada720_kbd", + }, + .probe = jornada720_kbd_probe, + .remove = jornada720_kbd_remove, +}; + +static int __devinit jornada720_kbd_init(void) +{ + return platform_driver_register(&jornada720_kbd_driver); +} + +static void __exit jornada720_kbd_exit(void) +{ + platform_driver_unregister(&jornada720_kbd_driver); +} + +module_init(jornada720_kbd_init); +module_exit(jornada720_kbd_exit); On Fri, 20 Jul 2007 15:29:08 -0400 "Dmitry Torokhov" <dmitry.torokhov@gmail.com> wrote: > On 7/21/07, Kristoffer Ericson <kristoffer.ericson@gmail.com> wrote: > > Greetings, > > > > Ive added it to free IRQ as you said, a minor change is also that jornada720.h defines are set in CAPS (just changed that for Russell). > > Ive also added the Kconfig and Makefile. > > > > Btw, do you keep patchtracker (like Russell) or drag from mail (like Paul)? > > Get from the mail. > > > + > > +failed: > > + free_irq(IRQ_GPIO0, input_dev); > > Still not quire right - you may get to failed: when memory allocation > fails or request_irq fails. We should not free IRQ that we did not > get. Please split into 2 labels and jump accordingly. > > -- > Dmitry -- Kristoffer Ericson <Kristoffer.Ericson@Gmail.com> ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH] HP Jornada 7xx keyboard support 2007-07-21 5:02 ` Kristoffer Ericson @ 2007-07-20 20:36 ` Dmitry Torokhov 2007-07-22 0:48 ` Kristoffer Ericson 0 siblings, 1 reply; 9+ messages in thread From: Dmitry Torokhov @ 2007-07-20 20:36 UTC (permalink / raw) To: Kristoffer Ericson; +Cc: linux-input On 7/21/07, Kristoffer Ericson <kristoffer.ericson@gmail.com> wrote: > #try 4: > > Ive changed the error handling so it only should release stuff it actually had aquired. > Looks good, thank you. Can I please get a "signed-off-by:" form you so I can apply it to the input tree? -- Dmitry ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] HP Jornada 7xx keyboard support 2007-07-20 20:36 ` Dmitry Torokhov @ 2007-07-22 0:48 ` Kristoffer Ericson 2007-07-22 5:29 ` Dmitry Torokhov 0 siblings, 1 reply; 9+ messages in thread From: Kristoffer Ericson @ 2007-07-22 0:48 UTC (permalink / raw) To: Dmitry Torokhov; +Cc: Kristoffer Ericson, linux-input Greetings, You got the description text before right?. Here's the signoff line: signed-off-by: Kristoffer Ericson <Kristoffer.Ericson@gmail.com> On Fri, 20 Jul 2007 16:36:02 -0400 "Dmitry Torokhov" <dmitry.torokhov@gmail.com> wrote: > On 7/21/07, Kristoffer Ericson <kristoffer.ericson@gmail.com> wrote: > > #try 4: > > > > Ive changed the error handling so it only should release stuff it actually had aquired. > > > > Looks good, thank you. Can I please get a "signed-off-by:" form you so > I can apply it to the input tree? > > -- > Dmitry -- Kristoffer Ericson <Kristoffer.Ericson@Gmail.com> ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] HP Jornada 7xx keyboard support 2007-07-22 0:48 ` Kristoffer Ericson @ 2007-07-22 5:29 ` Dmitry Torokhov 2007-07-22 15:58 ` Kristoffer Ericson 0 siblings, 1 reply; 9+ messages in thread From: Dmitry Torokhov @ 2007-07-22 5:29 UTC (permalink / raw) To: Kristoffer Ericson; +Cc: linux-input Hi Kristoffer, On Saturday 21 July 2007 20:48, Kristoffer Ericson wrote: > Greetings, > > You got the description text before right?. > > Here's the signoff line: > signed-off-by: Kristoffer Ericson <Kristoffer.Ericson@gmail.com> > I must say I am really pissed off. The code that you send not only was never tested on a real hardware, it was not even compiled once. I see a stream of missing parens, wrongly named variables, etc, etc, starting with rev 2 of your patch and going into rev 4 (the last one). I tried to fix all the issues I found, please make sure the code compiles and _works_ before resubmitting. I will not be able to apply it at the time anyway because jornada ssp pieces have not been merged yet. I am a bit concerned with -ETIMEOUT error code. It is not a standard error, is it something that is going to be added to arm arch code? -- Dmitry Subject: HP Jornada 7xx keyboard support From: Kristoffer Ericson <kristoffer.ericson@gmail.com> Input: HP Jornada 7xx keyboard driver Signed-off-by: Kristoffer Ericson <Kristoffer.Ericson@gmail.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru> --- drivers/input/keyboard/Kconfig | 7 + drivers/input/keyboard/Makefile | 1 drivers/input/keyboard/jornada720_kbd.c | 173 ++++++++++++++++++++++++++++++++ 3 files changed, 181 insertions(+) Index: work/drivers/input/keyboard/Kconfig =================================================================== --- work.orig/drivers/input/keyboard/Kconfig +++ work/drivers/input/keyboard/Kconfig @@ -68,6 +68,13 @@ config KEYBOARD_ATKBD_RDI_KEYCODES right-hand column will be interpreted as the key shown in the left-hand column. +config KEYBOARD_JORNADA720 + tristate "HP 720 Keyboard Driver" + depends on SA1100_JORNADA720_SSP && SA1100_SSP + help + Say Y here to add support for the HP Jornada 7xx (710/720/728) onboard + keyboard. Its generally a good idea. + config KEYBOARD_SUNKBD tristate "Sun Type 4 and Type 5 keyboard" select SERIO Index: work/drivers/input/keyboard/Makefile =================================================================== --- work.orig/drivers/input/keyboard/Makefile +++ work/drivers/input/keyboard/Makefile @@ -21,4 +21,5 @@ obj-$(CONFIG_KEYBOARD_OMAP) += omap-key obj-$(CONFIG_KEYBOARD_PXA27x) += pxa27x_keyboard.o obj-$(CONFIG_KEYBOARD_AAED2000) += aaed2000_kbd.o obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o +obj-$(CONFIG_KEYBOARD_JORNADA720) += jornada720_kbd.o Index: work/drivers/input/keyboard/jornada720_kbd.c =================================================================== --- /dev/null +++ work/drivers/input/keyboard/jornada720_kbd.c @@ -0,0 +1,173 @@ +/* + * drivers/input/keyboard/jornada720_kbd.c + * + * HP Jornada 720 keyboard platform driver + * + * Copyright (C) 2006/2007 Kristoffer Ericson <Kristoffer.Ericson@Gmail.com> + * Copyright (C) 2006 jornada 720 kbd driver by Filip Zyzniewsk <Filip.Zyzniewski@tefnet.plX + * based on (C) 2004 jornada 720 kbd driver by Alex Lange <chicken@handhelds.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ +#include <linux/device.h> +#include <linux/init.h> +#include <linux/interrupt.h> +#include <linux/init.h> +#include <linux/input.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/platform_device.h> + +#include <asm/arch/jornada720.h> +#include <asm/hardware.h> + +MODULE_AUTHOR("Kristoffer Ericson <Kristoffer.Ericson@gmail.com>"); +MODULE_DESCRIPTION("HP Jornada 720 keyboard driver"); +MODULE_LICENSE("GPL"); + +static unsigned char jornada_standard_keymap[128] = { /* ROW */ + 0, KEY_ESC, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, /* #1 */ + KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_MUTE, /* -> */ + 0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, /* #2 */ + KEY_0, KEY_MINUS, KEY_EQUAL,0, 0, 0, /* -> */ + 0, KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, /* #3 */ + KEY_P, KEY_BACKSLASH, KEY_BACKSPACE, 0, 0, 0, /* -> */ + 0, KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L, /* #4 */ + KEY_SEMICOLON, KEY_LEFTBRACE, KEY_RIGHTBRACE, 0, 0, 0, /* -> */ + 0, KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMMA, /* #5 */ + KEY_DOT, KEY_KPMINUS, KEY_APOSTROPHE, KEY_ENTER, 0, 0,0, /* -> */ + 0, KEY_TAB, 0, KEY_LEFTSHIFT, 0, KEY_APOSTROPHE, 0, 0, 0, 0, /* #6 */ + KEY_UP, 0, KEY_RIGHTSHIFT, 0, 0, 0,0, 0, 0, 0, 0, KEY_LEFTALT, KEY_GRAVE, /* -> */ + 0, 0, KEY_LEFT, KEY_DOWN, KEY_RIGHT, 0, 0, 0, 0,0, KEY_KPASTERISK, /* -> */ + KEY_LEFTCTRL, 0, KEY_SPACE, 0, 0, 0, KEY_SLASH, KEY_DELETE, 0, 0, /* -> */ + 0, 0, 0, KEY_POWER, /* -> */ +}; + +struct jornadakbd { + unsigned char keymap[ARRAY_SIZE(jornada_standard_keymap)]; + struct input_dev *input; +}; + +static irqreturn_t jornada720_kbd_interrupt(int irq, void *dev_id) +{ + struct platform_device *pdev = dev_id; + struct jornadakbd *jornadakbd = platform_get_drvdata(pdev); + struct input_dev *input_dev = jornadakbd->input; + int count, kbd_data, ret; + + jornada_ssp_start(); + ret = jornada_ssp_inout(GETSCANKEYCODE); + + if (ret == -ETIMEOUT) { + printk(KERN_WARNING "jornada720_kbd: " + "GetKeycode command failed with ETIMEOUT\n"); + goto out; + } + + /* How many keycodes are waiting for us? */ + count = jornada_ssp_inout(TXDUMMY); + + /* Lets drag them out one at a time */ + while (count-- > 0) { + /* Exchange TxDummy for location inside keymap */ + kbd_data = jornada_ssp_inout(TXDUMMY); + + input_report_key(input_dev, + jornadakbd->keymap[kbd_data & 0x7f], + !(kbd_data & 0x80)); + input_sync(input_dev); + } + out: + jornada_ssp_end(); /* End Transmission */ + return IRQ_HANDLED; +}; + +static int __devinit jornada720_kbd_probe(struct platform_device *pdev) +{ + struct jornadakbd *jornadakbd; + struct input_dev *input_dev; + int i, error; + + jornadakbd = kzalloc(sizeof(struct jornadakbd), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!jornadakbd || !input_dev) { + error = -ENOMEM; + goto fail1; + } + + platform_set_drvdata(pdev, jornadakbd); + + memcpy(jornadakbd->keymap, jornada_standard_keymap, + sizeof(jornadakbd->keymap)); + jornadakbd->input = input_dev; + + input_dev->name = "HP Jornada 720 keyboard"; + input_dev->phys = "jornadakbd/input0"; + input_dev->id.bustype = BUS_HOST; + input_dev->dev.parent = &pdev->dev; + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); + input_dev->keycode = jornadakbd->keymap; + input_dev->keycodesize = sizeof(unsigned char); + input_dev->keycodemax = ARRAY_SIZE(jornadakbd->keymap); + + for (i = 0; i < ARRAY_SIZE(jornadakbd->keymap); i++) + __set_bit(jornadakbd->keymap[i], input_dev->keybit); + + error = request_irq(IRQ_GPIO0, jornada720_kbd_interrupt, + IRQF_DISABLED | IRQF_TRIGGER_FALLING, + "jornadakbd", pdev); + if (error) { + printk(KERN_WARNING "jornadakbd : Unable to grab IRQ\n"); + goto fail1; + } + + error = input_register_device(jornadakbd->input); + if (error) + goto fail2; + + return 0; + + fail2: /* IRQ, DEVICE, MEMORY */ + free_irq(IRQ_GPIO0, input_dev); + fail1: /* DEVICE, MEMORY */ + platform_set_drvdata(pdev, NULL); + input_free_device(input_dev); + kfree(jornadakbd); + return error; +} + +static int __devexit jornada720_kbd_remove(struct platform_device *pdev) +{ + struct jornadakbd *jornadakbd = platform_get_drvdata(pdev); + + free_irq(IRQ_GPIO0, pdev); + platform_set_drvdata(pdev, NULL); + input_unregister_device(jornadakbd->input); + kfree(jornadakbd); + + return 0; +} + +static struct platform_driver jornada720_kbd_driver = { + .driver = { + .name = "jornada720_kbd", + }, + .probe = jornada720_kbd_probe, + .remove = __devexit_p(jornada720_kbd_remove), +}; + +static int __init jornada720_kbd_init(void) +{ + return platform_driver_register(&jornada720_kbd_driver); +} + +static void __exit jornada720_kbd_exit(void) +{ + platform_driver_unregister(&jornada720_kbd_driver); +} + +module_init(jornada720_kbd_init); +module_exit(jornada720_kbd_exit); ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] HP Jornada 7xx keyboard support 2007-07-22 5:29 ` Dmitry Torokhov @ 2007-07-22 15:58 ` Kristoffer Ericson 0 siblings, 0 replies; 9+ messages in thread From: Kristoffer Ericson @ 2007-07-22 15:58 UTC (permalink / raw) To: Dmitry Torokhov; +Cc: Kristoffer Ericson, linux-input On Sun, 22 Jul 2007 01:29:08 -0400 Dmitry Torokhov <dtor@insightbb.com> wrote: > Hi Kristoffer, > > On Saturday 21 July 2007 20:48, Kristoffer Ericson wrote: > > Greetings, > > > > You got the description text before right?. > > > > Here's the signoff line: > > signed-off-by: Kristoffer Ericson <Kristoffer.Ericson@gmail.com> > > > > I must say I am really pissed off. The code that you send not only was > never tested on a real hardware, it was not even compiled once. I see > a stream of missing parens, wrongly named variables, etc, etc, starting > with rev 2 of your patch and going into rev 4 (the last one). > I resubmitted the JORNADA_SSP patch to Russell 2 days ago which had renames for defines (at his request). Although its no excuse Ive been rewriting so much of the platform in the last week, Ive been poor at doing test builds. I'll make sure I do test compile before sending anything off in the future. > I tried to fix all the issues I found, please make sure the code > compiles and _works_ before resubmitting. I will not be able to > apply it at the time anyway because jornada ssp pieces have not been > merged yet. > > I am a bit concerned with -ETIMEOUT error code. It is not a standard error, > is it something that is going to be added to arm arch code? That should be -ETIMEDOUT error I believe. A typo on my part. > > -- > Dmitry > > Subject: HP Jornada 7xx keyboard support > From: Kristoffer Ericson <kristoffer.ericson@gmail.com> > > Input: HP Jornada 7xx keyboard driver > > Signed-off-by: Kristoffer Ericson <Kristoffer.Ericson@gmail.com> > Signed-off-by: Dmitry Torokhov <dtor@mail.ru> > --- > > drivers/input/keyboard/Kconfig | 7 + > drivers/input/keyboard/Makefile | 1 > drivers/input/keyboard/jornada720_kbd.c | 173 ++++++++++++++++++++++++++++++++ > 3 files changed, 181 insertions(+) > > Index: work/drivers/input/keyboard/Kconfig > =================================================================== > --- work.orig/drivers/input/keyboard/Kconfig > +++ work/drivers/input/keyboard/Kconfig > @@ -68,6 +68,13 @@ config KEYBOARD_ATKBD_RDI_KEYCODES > right-hand column will be interpreted as the key shown in the > left-hand column. > > +config KEYBOARD_JORNADA720 > + tristate "HP 720 Keyboard Driver" > + depends on SA1100_JORNADA720_SSP && SA1100_SSP > + help > + Say Y here to add support for the HP Jornada 7xx (710/720/728) onboard > + keyboard. Its generally a good idea. > + > config KEYBOARD_SUNKBD > tristate "Sun Type 4 and Type 5 keyboard" > select SERIO > Index: work/drivers/input/keyboard/Makefile > =================================================================== > --- work.orig/drivers/input/keyboard/Makefile > +++ work/drivers/input/keyboard/Makefile > @@ -21,4 +21,5 @@ obj-$(CONFIG_KEYBOARD_OMAP) += omap-key > obj-$(CONFIG_KEYBOARD_PXA27x) += pxa27x_keyboard.o > obj-$(CONFIG_KEYBOARD_AAED2000) += aaed2000_kbd.o > obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o > +obj-$(CONFIG_KEYBOARD_JORNADA720) += jornada720_kbd.o > > Index: work/drivers/input/keyboard/jornada720_kbd.c > =================================================================== > --- /dev/null > +++ work/drivers/input/keyboard/jornada720_kbd.c > @@ -0,0 +1,173 @@ > +/* > + * drivers/input/keyboard/jornada720_kbd.c > + * > + * HP Jornada 720 keyboard platform driver > + * > + * Copyright (C) 2006/2007 Kristoffer Ericson <Kristoffer.Ericson@Gmail.com> > + * Copyright (C) 2006 jornada 720 kbd driver by Filip Zyzniewsk <Filip.Zyzniewski@tefnet.plX > + * based on (C) 2004 jornada 720 kbd driver by Alex Lange <chicken@handhelds.org> > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + * > + */ > +#include <linux/device.h> > +#include <linux/init.h> > +#include <linux/interrupt.h> > +#include <linux/init.h> > +#include <linux/input.h> > +#include <linux/kernel.h> > +#include <linux/module.h> > +#include <linux/platform_device.h> > + > +#include <asm/arch/jornada720.h> > +#include <asm/hardware.h> > + > +MODULE_AUTHOR("Kristoffer Ericson <Kristoffer.Ericson@gmail.com>"); > +MODULE_DESCRIPTION("HP Jornada 720 keyboard driver"); > +MODULE_LICENSE("GPL"); > + > +static unsigned char jornada_standard_keymap[128] = { /* ROW */ > + 0, KEY_ESC, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, /* #1 */ > + KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_MUTE, /* -> */ > + 0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, /* #2 */ > + KEY_0, KEY_MINUS, KEY_EQUAL,0, 0, 0, /* -> */ > + 0, KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, /* #3 */ > + KEY_P, KEY_BACKSLASH, KEY_BACKSPACE, 0, 0, 0, /* -> */ > + 0, KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L, /* #4 */ > + KEY_SEMICOLON, KEY_LEFTBRACE, KEY_RIGHTBRACE, 0, 0, 0, /* -> */ > + 0, KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMMA, /* #5 */ > + KEY_DOT, KEY_KPMINUS, KEY_APOSTROPHE, KEY_ENTER, 0, 0,0, /* -> */ > + 0, KEY_TAB, 0, KEY_LEFTSHIFT, 0, KEY_APOSTROPHE, 0, 0, 0, 0, /* #6 */ > + KEY_UP, 0, KEY_RIGHTSHIFT, 0, 0, 0,0, 0, 0, 0, 0, KEY_LEFTALT, KEY_GRAVE, /* -> */ > + 0, 0, KEY_LEFT, KEY_DOWN, KEY_RIGHT, 0, 0, 0, 0,0, KEY_KPASTERISK, /* -> */ > + KEY_LEFTCTRL, 0, KEY_SPACE, 0, 0, 0, KEY_SLASH, KEY_DELETE, 0, 0, /* -> */ > + 0, 0, 0, KEY_POWER, /* -> */ > +}; > + > +struct jornadakbd { > + unsigned char keymap[ARRAY_SIZE(jornada_standard_keymap)]; > + struct input_dev *input; > +}; > + > +static irqreturn_t jornada720_kbd_interrupt(int irq, void *dev_id) > +{ > + struct platform_device *pdev = dev_id; > + struct jornadakbd *jornadakbd = platform_get_drvdata(pdev); > + struct input_dev *input_dev = jornadakbd->input; > + int count, kbd_data, ret; > + > + jornada_ssp_start(); > + ret = jornada_ssp_inout(GETSCANKEYCODE); > + > + if (ret == -ETIMEOUT) { > + printk(KERN_WARNING "jornada720_kbd: " > + "GetKeycode command failed with ETIMEOUT\n"); > + goto out; > + } > + > + /* How many keycodes are waiting for us? */ > + count = jornada_ssp_inout(TXDUMMY); > + > + /* Lets drag them out one at a time */ > + while (count-- > 0) { > + /* Exchange TxDummy for location inside keymap */ > + kbd_data = jornada_ssp_inout(TXDUMMY); > + > + input_report_key(input_dev, > + jornadakbd->keymap[kbd_data & 0x7f], > + !(kbd_data & 0x80)); > + input_sync(input_dev); > + } > + out: > + jornada_ssp_end(); /* End Transmission */ > + return IRQ_HANDLED; > +}; > + > +static int __devinit jornada720_kbd_probe(struct platform_device *pdev) > +{ > + struct jornadakbd *jornadakbd; > + struct input_dev *input_dev; > + int i, error; > + > + jornadakbd = kzalloc(sizeof(struct jornadakbd), GFP_KERNEL); > + input_dev = input_allocate_device(); > + if (!jornadakbd || !input_dev) { > + error = -ENOMEM; > + goto fail1; > + } > + > + platform_set_drvdata(pdev, jornadakbd); > + > + memcpy(jornadakbd->keymap, jornada_standard_keymap, > + sizeof(jornadakbd->keymap)); > + jornadakbd->input = input_dev; > + > + input_dev->name = "HP Jornada 720 keyboard"; > + input_dev->phys = "jornadakbd/input0"; > + input_dev->id.bustype = BUS_HOST; > + input_dev->dev.parent = &pdev->dev; > + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); > + input_dev->keycode = jornadakbd->keymap; > + input_dev->keycodesize = sizeof(unsigned char); > + input_dev->keycodemax = ARRAY_SIZE(jornadakbd->keymap); > + > + for (i = 0; i < ARRAY_SIZE(jornadakbd->keymap); i++) > + __set_bit(jornadakbd->keymap[i], input_dev->keybit); > + > + error = request_irq(IRQ_GPIO0, jornada720_kbd_interrupt, > + IRQF_DISABLED | IRQF_TRIGGER_FALLING, > + "jornadakbd", pdev); > + if (error) { > + printk(KERN_WARNING "jornadakbd : Unable to grab IRQ\n"); > + goto fail1; > + } > + > + error = input_register_device(jornadakbd->input); > + if (error) > + goto fail2; > + > + return 0; > + > + fail2: /* IRQ, DEVICE, MEMORY */ > + free_irq(IRQ_GPIO0, input_dev); > + fail1: /* DEVICE, MEMORY */ > + platform_set_drvdata(pdev, NULL); > + input_free_device(input_dev); > + kfree(jornadakbd); > + return error; > +} > + > +static int __devexit jornada720_kbd_remove(struct platform_device *pdev) > +{ > + struct jornadakbd *jornadakbd = platform_get_drvdata(pdev); > + > + free_irq(IRQ_GPIO0, pdev); > + platform_set_drvdata(pdev, NULL); > + input_unregister_device(jornadakbd->input); > + kfree(jornadakbd); > + > + return 0; > +} > + > +static struct platform_driver jornada720_kbd_driver = { > + .driver = { > + .name = "jornada720_kbd", > + }, > + .probe = jornada720_kbd_probe, > + .remove = __devexit_p(jornada720_kbd_remove), > +}; > + > +static int __init jornada720_kbd_init(void) > +{ > + return platform_driver_register(&jornada720_kbd_driver); > +} > + > +static void __exit jornada720_kbd_exit(void) > +{ > + platform_driver_unregister(&jornada720_kbd_driver); > +} > + > +module_init(jornada720_kbd_init); > +module_exit(jornada720_kbd_exit); -- Kristoffer Ericson <Kristoffer.Ericson@Gmail.com> ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2007-07-22 15:58 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <20070718163259.2565fb8c.Kristoffer.Ericson@Gmail.com> 2007-07-18 15:00 ` [PATCH] HP Jornada 7xx keyboard support Dmitry Torokhov [not found] ` <20070718191119.18bf1e9c.Kristoffer.Ericson@Gmail.com> 2007-07-20 18:54 ` Dmitry Torokhov 2007-07-21 4:25 ` Kristoffer Ericson 2007-07-20 19:29 ` Dmitry Torokhov 2007-07-21 5:02 ` Kristoffer Ericson 2007-07-20 20:36 ` Dmitry Torokhov 2007-07-22 0:48 ` Kristoffer Ericson 2007-07-22 5:29 ` Dmitry Torokhov 2007-07-22 15:58 ` Kristoffer Ericson
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).