add error-checking in hil_keyb_init
Subsystems (2)
A message that is not in the archive (sent off-list or not yet received): [email protected]
From: Cyrill V. Gorcunov <[email protected]>
Also some extra spaces are removed.
--- drivers/input/keyboard/hilkbd.c | 106 +++++++++++++++++++++++---------------- 1 files changed, 62 insertions(+), 44 deletions(-)
drivers/input/keyboard/hilkbd.c +62 -43
@@ -6,10 +6,10 @@* Copyright (C) 1999-2006 Helge Deller <[email protected]> * * Very basic HP Human Interface Loop (HIL) driver. -* This driver handles the keyboard on HP300 (m68k) and on some +* This driver handles the keyboard on HP300 (m68k) and on some * HP700 (parisc) series machines. * -* +* * This file is subject to the terms and conditions of the GNU General Public * License version 2. See the file COPYING in the main directory of this * archive for more details.
@@ -64,9 +64,9 @@ MODULE_LICENSE("GPL v2");#endif - +/* HIL helper functions */ - +#define hil_busy () (hil_readb(HILBASE + HIL_CMD) & HIL_BUSY)#define hil_data_available () (hil_readb(HILBASE + HIL_CMD) & HIL_DATA_RDY)#define hil_status () (hil_readb(HILBASE + HIL_CMD))
@@ -75,7 +75,7 @@ MODULE_LICENSE("GPL v2");#define hil_write_data (x) do { hil_writeb((x), HILBASE + HIL_DATA); } while (0)/* HIL constants */ - +#define HIL_BUSY 0x02#define HIL_DATA_RDY 0x01
@@ -89,7 +89,7 @@ MODULE_LICENSE("GPL v2");#define HIL_READKBDSADR 0xF9#define HIL_WRITEKBDSADR 0xE9 -static unsigned int hphilkeyb_keycode[HIL_KEYCODES_SET1_TBLSIZE ] = +static unsigned int hphilkeyb_keycode[HIL_KEYCODES_SET1_TBLSIZE ] = {HIL_KEYCODES_SET1 };/* HIL structure */
@@ -97,11 +97,11 @@ static struct {struct input_dev *dev;unsigned int curdev; - +unsigned char s;unsigned char c;int valid; - +unsigned char data[16 ];unsigned int ptr;spinlock_t lock;
@@ -115,7 +115,7 @@ static void poll_finished(void)int down;int key;unsigned char scode; - +switch (hil_dev.data[0 ]) {case 0x40 : down = (hil_dev.data[1 ] &1 ) ==0 ;
@@ -127,6 +127,7 @@ static void poll_finished(void) hil_dev.curdev =0 ; } +static inline void handle_status (unsigned char s,unsigned char c) {if (c &0x8 ) {
@@ -143,6 +144,7 @@ static inline void handle_status(unsigned char s, unsigned char c) } } +static inline void handle_data (unsigned char s,unsigned char c) {if (hil_dev.curdev) {
@@ -152,13 +154,11 @@ static inline void handle_data(unsigned char s, unsigned char c) } -/* -* Handle HIL interrupts. -*/ +/* handle HIL interrupts */ static irqreturn_t hil_interrupt (int irq,void *handle) {unsigned char s, c; - + s =hil_status (); c =hil_read_data ();
@@ -179,10 +179,8 @@ static irqreturn_t hil_interrupt(int irq, void *handle)return IRQ_HANDLED ; } -/* -* Send a command to the HIL -*/ +/* send a command to the HIL */ static void hil_do (unsigned char cmd,unsigned char *data,unsigned int len) {unsigned long flags;
@@ -200,16 +198,14 @@ static void hil_do(unsigned char cmd, unsigned char *data, unsigned int len) } -/* -* Initialise HIL. -*/ - +/* initialise HIL */ static int __init hil_keyb_init (void ) {unsigned char c;unsigned int i, kbid;wait_queue_head_t hil_wait; +int err;if (hil_dev.dev) {return -ENODEV ;/* already initialized */
@@ -219,15 +215,25 @@ hil_keyb_init(void)if (!hil_dev.dev)return -ENOMEM ; hil_dev.dev->private = &hil_dev; - +#if defined(CONFIG_HP300 ) -if (!hwreg_present ((void *)(HILBASE +HIL_DATA ))) -return -ENODEV ; - -request_region (HILBASE +HIL_DATA ,2 ,"hil" ); +if (!hwreg_present ((void *)(HILBASE +HIL_DATA ))) { +printk (KERN_ERR "HIL: hardware register was not found\n" ); + err = -ENODEV ; + goto err1; + } +if (!request_region (HILBASE +HIL_DATA ,2 ,"hil" )) { +printk (KERN_ERR "HIL: IOPORT region already used\n" ); + err = -EIO ; + goto err1; + }#endif - -request_irq (HIL_IRQ , hil_interrupt,0 ,"hil" , hil_dev.dev_id); + + err =request_irq (HIL_IRQ , hil_interrupt,0 ,"hil" , hil_dev.dev_id); +if (err) { +printk (KERN_ERR "HIL: Can't get IRQ\n" ); + goto err2; + }/* Turn on interrupts */ hil_do (HIL_INTON ,NULL ,0 );
@@ -239,32 +245,32 @@ hil_keyb_init(void)init_waitqueue_head (&hil_wait);wait_event_interruptible_timeout (hil_wait, hil_dev.valid,3 *HZ );if (!hil_dev.valid) { -printk (KERN_WARNING "HIL: timed out, assuming no keyboard present.\n" ); +printk (KERN_WARNING "HIL: timed out, assuming no keyboard present\n" ); } - c = hil_dev.c; + c = hil_dev.c; hil_dev.valid =0 ;if (c ==0 ) { kbid =-1 ; -printk (KERN_WARNING "HIL: no keyboard present.\n" ); +printk (KERN_WARNING "HIL: no keyboard present\n" ); }else { kbid =ffz (~c); -/* printk(KERN_INFO "HIL: keyboard found at id %d\n", kbid); */ +printk (KERN_INFO "HIL: keyboard found at id %d\n" , kbid); }/* set it to raw mode */ c =0 ;hil_do (HIL_WRITEKBDSADR , &c,1 ); - +for (i =0 ; i <HIL_KEYCODES_SET1_TBLSIZE ; i++)if (hphilkeyb_keycode[i] !=KEY_RESERVED )set_bit (hphilkeyb_keycode[i], hil_dev.dev->keybit); - hil_dev.dev->evbit[0 ] =BIT (EV_KEY ) |BIT (EV_REP ); - hil_dev.dev->ledbit[0 ] =BIT (LED_NUML ) |BIT (LED_CAPSL ) |BIT (LED_SCROLLL ); - hil_dev.dev->keycodemax =HIL_KEYCODES_SET1_TBLSIZE ; - hil_dev.dev->keycodesize =sizeof (hphilkeyb_keycode[0 ]); - hil_dev.dev->keycode = hphilkeyb_keycode; + hil_dev.dev->evbit[0 ] =BIT (EV_KEY ) |BIT (EV_REP ); + hil_dev.dev->ledbit[0 ] =BIT (LED_NUML ) |BIT (LED_CAPSL ) |BIT (LED_SCROLLL ); + hil_dev.dev->keycodemax =HIL_KEYCODES_SET1_TBLSIZE ; + hil_dev.dev->keycodesize=sizeof (hphilkeyb_keycode[0 ]); + hil_dev.dev->keycode = hphilkeyb_keycode; hil_dev.dev->name ="HIL keyboard" ; hil_dev.dev->phys ="hpkbd/input0" ;
@@ -273,13 +279,29 @@ hil_keyb_init(void) hil_dev.dev->id.product =0x0001 ; hil_dev.dev->id.version =0x0010 ; -input_register_device (hil_dev.dev); + err =input_register_device (hil_dev.dev); +if (err) { +printk (KERN_ERR "HIL: Can't register device\n" ); + goto err3; + }printk (KERN_INFO "input: %s, ID %d at 0x%08lx (irq %d) found and attached\n" , - hil_dev.dev->name, kbid,HILBASE ,HIL_IRQ ); + hil_dev.dev->name, kbid,HILBASE ,HIL_IRQ );return 0 ; + +err3: +hil_do (HIL_INTOFF ,NULL ,0 ); +disable_irq (HIL_IRQ ); +free_irq (HIL_IRQ , hil_dev.dev_id); +err2: +release_region (HILBASE +HIL_DATA ,2 ); +err1: +input_free_device (hil_dev.dev); + hil_dev.dev =NULL ; +return err; } +#if defined(CONFIG_PARISC )static int __init hil_init_chip (struct parisc_device *dev)
@@ -292,7 +314,7 @@ hil_init_chip(struct parisc_device *dev) hil_base = dev->hpa.start; hil_irq = dev->irq; hil_dev.dev_id = dev; - +printk (KERN_INFO "Found HIL bus at 0x%08lx, IRQ %d\n" , hil_base, hil_irq);return hil_keyb_init ();
@@ -313,9 +335,6 @@ static struct parisc_driver hil_driver = {#endif /* CONFIG_PARISC */ - - -static int __init hil_init (void ) {#if defined(CONFIG_PARISC )
@@ -349,4 +368,3 @@ static void __exit hil_exit(void)module_init (hil_init);module_exit (hil_exit);
A message that is not in the archive (sent off-list or not yet received): [email protected]
[PARISC] fix uninitialized spinlock in HIL keyboard driver
From: Helge Deller <[email protected]>
- remove some warnings for PARISC part of the driver
- annotate hphilkeyb_keycode[] array as __read_mostly
--- drivers/input/keyboard/hilkbd.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-)
drivers/input/keyboard/hilkbd.c +6 -3
@@ -3,7 +3,7 @@* * Copyright (C) 1998 Philip Blundell <[email protected]> * Copyright (C) 1999 Matthew Wilcox <[email protected]> -* Copyright (C) 1999-2006 Helge Deller <[email protected]> +* Copyright (C) 1999-2007 Helge Deller <[email protected]> * * Very basic HP Human Interface Loop (HIL) driver. * This driver handles the keyboard on HP300 (m68k) and on some
@@ -89,7 +89,7 @@ MODULE_LICENSE("GPL v2");#define HIL_READKBDSADR 0xF9#define HIL_WRITEKBDSADR 0xE9 -static unsigned int hphilkeyb_keycode[HIL_KEYCODES_SET1_TBLSIZE ] = +static unsigned int hphilkeyb_keycode[HIL_KEYCODES_SET1_TBLSIZE ]__read_mostly = {HIL_KEYCODES_SET1 };/* HIL structure */
@@ -211,6 +211,7 @@ hil_keyb_init(void)return -ENODEV ;/* already initialized */ } +spin_lock_init (&hil_dev.lock); hil_dev.dev =input_allocate_device ();if (!hil_dev.dev)return -ENOMEM ;
@@ -295,7 +296,9 @@ err3:free_irq (HIL_IRQ , hil_dev.dev_id); err2:release_region (HILBASE +HIL_DATA ,2 ); +#if defined(CONFIG_HP300 ) err1: +#endif input_free_device (hil_dev.dev); hil_dev.dev =NULL ;return err;
@@ -307,7 +310,7 @@ static int __init hil_init_chip(struct parisc_device *dev) {if (!dev->irq) { -printk (KERN_WARNING "HIL: IRQ not found for HIL bus at 0x%08lx\n" , dev->hpa.start); +printk (KERN_WARNING "HIL: IRQ not found for HIL bus at 0x%08lux\n" , (unsigned long )dev->hpa.start);return -ENODEV ; }
Signature · 1 line
1.4.4.4
A message that is not in the archive (sent off-list or not yet received): [email protected]
[PARISC] hp_sdc: fix request_irq()/free_irq() parameters
From: Helge Deller <[email protected]>
With this fix it's possible to load and unload the hp_sdc module multiple times. Before the first loading of the module requested the irq lines, but never was able to free them again. This, a second loading of the module failed, because the irq was still occupied.
--- drivers/input/serio/hp_sdc.c | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-)
drivers/input/serio/hp_sdc.c +7 -7
@@ -818,12 +818,12 @@ static int __init hp_sdc_init(void)#endif errstr ="IRQ not available for" ; -if (request_irq (hp_sdc.irq, &hp_sdc_isr,0 ,"HP SDC" , - (void *) hp_sdc.base_io)) goto err1; +if (request_irq (hp_sdc.irq, &hp_sdc_isr,0 ,"HP SDC" , &hp_sdc)) + goto err1; errstr ="NMI not available for" ; -if (request_irq (hp_sdc.nmi, &hp_sdc_nmisr,0 ,"HP SDC NMI" , - (void *) hp_sdc.base_io)) goto err2; +if (request_irq (hp_sdc.nmi, &hp_sdc_nmisr,0 ,"HP SDC NMI" , &hp_sdc)) + goto err2; printk(KERN_INFO PREFIX "HP SDC at 0x%p, IRQ %d (NMI IRQ %d)\n", (void *)hp_sdc.base_io, hp_sdc.irq, hp_sdc.nmi);
@@ -855,7 +855,7 @@ static int __init hp_sdc_init(void) hp_sdc.dev_err =0 ;return 0 ; err2: -free_irq (hp_sdc.irq,NULL ); +free_irq (hp_sdc.irq, &hp_sdc); err1:release_region (hp_sdc.data_io,2 ); err0:
@@ -899,8 +899,8 @@ static void hp_sdc_exit(void)/* Wait until we know this has been processed by the i8042 */ hp_sdc_spin_ibf (); -free_irq (hp_sdc.nmi,NULL ); -free_irq (hp_sdc.irq,NULL ); +free_irq (hp_sdc.nmi, &hp_sdc); +free_irq (hp_sdc.irq, &hp_sdc);write_unlock_irq (&hp_sdc.lock);del_timer (&hp_sdc.kicker);
Signature · 1 line
1.4.4.4
A message that is not in the archive (sent off-list or not yet received): [email protected]
[PARISC] input: various cleanups
From: Helge Deller <[email protected]>
- mark some structures and data as const or __read_mostly; use USEC_PER_SEC
--- drivers/input/keyboard/hil_kbd.c | 8 ++++---- drivers/input/serio/hil_mlc.c | 19 +++++++++---------- drivers/input/serio/hp_sdc.c | 10 +++++----- drivers/input/serio/hp_sdc_mlc.c | 3 ++- 4 files changed, 20 insertions(+), 20 deletions(-)
drivers/input/keyboard/hil_kbd.c +4 -4
@@ -51,7 +51,7 @@ MODULE_LICENSE("Dual BSD/GPL");#define HIL_KBD_SET1_UPBIT 0x01#define HIL_KBD_SET1_SHIFT 1 -static unsigned int hil_kbd_set1[HIL_KEYCODES_SET1_TBLSIZE ] = +static unsigned int hil_kbd_set1[HIL_KEYCODES_SET1_TBLSIZE ]__read_mostly = {HIL_KEYCODES_SET1 };#define HIL_KBD_SET2_UPBIT 0x01
@@ -60,10 +60,10 @@ static unsigned int hil_kbd_set1[HIL_KEYCODES_SET1_TBLSIZE] =#define HIL_KBD_SET3_UPBIT 0x80#define HIL_KBD_SET3_SHIFT 0 -static unsigned int hil_kbd_set3[HIL_KEYCODES_SET3_TBLSIZE ] = +static unsigned int hil_kbd_set3[HIL_KEYCODES_SET3_TBLSIZE ]__read_mostly = {HIL_KEYCODES_SET3 }; -static char hil_language[][16 ] = {HIL_LOCALE_MAP }; +static const char hil_language[][16 ] = {HIL_LOCALE_MAP };struct hil_kbd {struct input_dev *dev;
@@ -368,7 +368,7 @@ static struct serio_device_id hil_kbd_ids[] = { { 0 } }; -struct serio_driver hil_kbd_serio_drv = { +static struct serio_driver hil_kbd_serio_drv = { .driver = { .name ="hil_kbd" , },
drivers/input/serio/hil_mlc.c +9 -10
@@ -409,7 +409,7 @@ static int hilse_operate(hil_mlc *mlc, int repoll) {#define OUT_LAST (pack) \ { HILSE_OUT_LAST, { .packet = pack }, 0, 0, 0, 0 }, -struct hilse_node hil_mlc_se[HILSEN_END ] = { +const struct hilse_node hil_mlc_se[HILSEN_END ] = {/* 0 HILSEN_START */ FUNC (hilse_init_lcv,0 ,HILSEN_NEXT ,HILSEN_SLEEP ,0 )
@@ -531,7 +531,7 @@ struct hilse_node hil_mlc_se[HILSEN_END] = {/* 60 HILSEN_END */ }; -static inline void hilse_setup_input (hil_mlc *mlc,struct hilse_node *node) { +static inline void hilse_setup_input (hil_mlc *mlc,const struct hilse_node *node) {switch (node->act) {case HILSE_EXPECT_DISC :
@@ -564,21 +564,19 @@ static inline void hilse_setup_input(hil_mlc *mlc, struct hilse_node *node) {#ifdef HIL_MLC_DEBUG static int doze =0 ;static int seidx;/* For debug */ -static int kick =1 ;#endif static int hilse_donode (hil_mlc *mlc) { -struct hilse_node *node; +const struct hilse_node *node;int nextidx =0 ;int sched_long =0 ;unsigned long flags;#ifdef HIL_MLC_DEBUG if (mlc->seidx && (mlc->seidx != seidx) && mlc->seidx !=41 && mlc->seidx !=42 && mlc->seidx !=43 ) { - printk(KERN_DEBUG PREFIX "z%i \n%s {%i}", doze, kick ? "K" : "", mlc->seidx); + printk(KERN_DEBUG PREFIX "z%i \n {%i}", doze, mlc->seidx); doze =0 ; } - kick =0 ; seidx = mlc->seidx;#endif
@@ -589,7 +587,6 @@ static int hilse_donode (hil_mlc *mlc) {hil_packet pack;case HILSE_FUNC : -if (node->object.func ==NULL )break ; rc = node->object.func (mlc, node->arg); nextidx = (rc >0 ) ? node->ugly : ((rc <0 ) ? node->bad : node->good);
@@ -675,10 +672,10 @@ static int hilse_donode (hil_mlc *mlc) {if (!sched_long) goto sched;do_gettimeofday (&tv); - tv.tv_usec +=1000000 * (tv.tv_sec - mlc->instart.tv_sec); + tv.tv_usec +=USEC_PER_SEC * (tv.tv_sec - mlc->instart.tv_sec); tv.tv_usec -= mlc->instart.tv_usec;if (tv.tv_usec >= mlc->intimeout) goto sched; - tv.tv_usec = (mlc->intimeout - tv.tv_usec) *HZ /1000000 ; + tv.tv_usec = (mlc->intimeout - tv.tv_usec) *HZ /USEC_PER_SEC ;if (!tv.tv_usec) goto sched;mod_timer (&hil_mlcs_kicker, jiffies + tv.tv_usec);break ;
@@ -838,7 +835,7 @@ static void hil_mlc_serio_close(struct serio *serio) {/* TODO wake up interruptable */ } -static struct serio_device_id hil_mlc_serio_id = { +static const struct serio_device_id hil_mlc_serio_id = { .type =SERIO_HIL_MLC , .proto =SERIO_HIL , .extra =SERIO_ANY ,
@@ -874,6 +871,8 @@ int hil_mlc_register(hil_mlc *mlc) {hil_mlc_copy_di_scratch (mlc, i); mlc_serio =kzalloc (sizeof (*mlc_serio),GFP_KERNEL ); mlc->serio[i] = mlc_serio; +snprintf (mlc_serio->name,sizeof (mlc_serio->name)-1 ,"HIL_SERIO%d" , i); +snprintf (mlc_serio->phys,sizeof (mlc_serio->phys)-1 ,"HIL%d" , i); mlc_serio->id = hil_mlc_serio_id; mlc_serio->write = hil_mlc_serio_write; mlc_serio->open = hil_mlc_serio_open;
drivers/input/serio/hp_sdc.c +5 -5
@@ -749,7 +749,7 @@ void hp_sdc_kicker (unsigned long data) { #if defined(__hppa__) -static struct parisc_device_id hp_sdc_tbl[] = { +static const struct parisc_device_id hp_sdc_tbl[] = { { .hw_type = HPHW_FIO, .hversion_rev = HVERSION_REV_ANY_ID,
@@ -818,12 +818,12 @@ static int __init hp_sdc_init(void)#endif errstr ="IRQ not available for" ; -if (request_irq (hp_sdc.irq, &hp_sdc_isr,0 ,"HP SDC" , &hp_sdc)) - goto err1; +if (request_irq (hp_sdc.irq, &hp_sdc_isr,IRQF_SHARED |IRQF_SAMPLE_RANDOM , +"HP SDC" , &hp_sdc)) goto err1; errstr ="NMI not available for" ; -if (request_irq (hp_sdc.nmi, &hp_sdc_nmisr,0 ,"HP SDC NMI" , &hp_sdc)) - goto err2; +if (request_irq (hp_sdc.nmi, &hp_sdc_nmisr,IRQF_SHARED , +"HP SDC NMI" , &hp_sdc)) goto err2; printk(KERN_INFO PREFIX "HP SDC at 0x%p, IRQ %d (NMI IRQ %d)\n", (void *)hp_sdc.base_io, hp_sdc.irq, hp_sdc.nmi);
drivers/input/serio/hp_sdc_mlc.c +2 -1
@@ -323,11 +323,12 @@ static int __init hp_sdc_mlc_init(void) mlc->in = &hp_sdc_mlc_in; mlc->out = &hp_sdc_mlc_out; + mlc->priv = &hp_sdc_mlc_priv; +if (hil_mlc_register (mlc)) { printk(KERN_WARNING PREFIX "Failed to register MLC structure with hil_mlc\n"); goto err0; } - mlc->priv = &hp_sdc_mlc_priv;if (hp_sdc_request_hil_irq (&hp_sdc_mlc_isr)) { printk(KERN_WARNING PREFIX "Request for raw HIL ISR hook denied\n");
Signature · 1 line
1.4.4.4
Helge Deller
maintainer[parisc-linux] Re: [PARISC] fix uninitialized spinlock in HIL keyboard driver
In reply to a message not in the archiveHi Dimitry,
please see below...
Quoted 45 lines · Kyle McMartin
From: Helge Deller <[email protected]>
- remove some warnings for PARISC part of the driver
- annotate hphilkeyb_keycode[] array as__read_mostlySigned-off-by Helge Deller <[email protected]>Signed-off-by Kyle McMartin <[email protected]>--- drivers/input/keyboard/hilkbd.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-)drivers/input/keyboard/hilkbd.c +3
-2@@ -3,7 +3,7 @@* * Copyright (C) 1998 Philip Blundell <[email protected]> * Copyright (C) 1999 Matthew Wilcox <[email protected]> -* Copyright (C) 1999-2006 Helge Deller <[email protected]> +* Copyright (C) 1999-2007 Helge Deller <[email protected]> * * Very basic HP Human Interface Loop (HIL) driver. * This driver handles the keyboard on HP300 (m68k) and on some @@ -89,7 +89,7 @@ MODULE_LICENSE("GPL v2");#define HIL_READKBDSADR 0xF9#define HIL_WRITEKBDSADR 0xE9 -static unsigned int hphilkeyb_keycode[HIL_KEYCODES_SET1_TBLSIZE ] = +static unsigned int hphilkeyb_keycode[HIL_KEYCODES_SET1_TBLSIZE ]__read_mostly = {HIL_KEYCODES_SET1 };/* HIL structure */ @@ -211,6 +211,7 @@ hil_keyb_init(void)return -ENODEV ;/* already initialized */ } +spin_lock_init (&hil_dev.lock); hil_dev.dev =input_allocate_device ();if (!hil_dev.dev)return -ENOMEM ;from here....
drivers/input/keyboard/hilkbd.c err3: · line 304
Quoted 9 lines
drivers/input/keyboard/hilkbd.c +2
-0@@ -295,7 +296,9 @@ err3:free_irq (HIL_IRQ , hil_dev.dev_id); err2:release_region (HILBASE +HIL_DATA ,2 ); +#if defined(CONFIG_HP300 ) err1: +#endif input_free_device (hil_dev.dev); hil_dev.dev =NULL ;return err;
Can you drop this ^^ piece of this patch ?
Cyrill V. Gorcunov's (<[email protected]>) HP300 patches from a few days ago are more correct since they include the release_region() call.
Or, if you want, I can resend this whole patch against your input-tree ? Just let me know...
Helge
drivers/input/keyboard/hilkbd.c static int __init · line 316
Quoted 9 lines
drivers/input/keyboard/hilkbd.c +1
-1@@ -307,7 +310,7 @@ static int __init hil_init_chip(struct parisc_device *dev) {if (!dev->irq) { -printk (KERN_WARNING "HIL: IRQ not found for HIL bus at 0x%08lx\n" , dev->hpa.start); +printk (KERN_WARNING "HIL: IRQ not found for HIL bus at 0x%08lux\n" , (unsigned long )dev->hpa.start);return -ENODEV ; }
_______________________________________________
parisc-linux mailing list
[email protected]
http://lists.parisc-linux.org/mailman/listinfo/parisc-linux
A message that is not in the archive (sent off-list or not yet received): [email protected]
Re: [PARISC] fix uninitialized spinlock in HIL keyboard driver
Hi Helge,
Quoted 5 lines · Helge Deller
Can you drop this ^^ piece of this patch ?
Cyrill V. Gorcunov's (<[email protected]>) HP300 patches from a few days ago are more correct since they include therelease_region()call.
I have 2 patches from Cyrill applied to my tree:
- one from couple days ago dealing with release_region() (2nd version that was acked by you)
- another came to me throughg Andrew and deals with handling errors from input_register_device(), request_region(), request_irq() + whitespace cleanup.
Quoted 3 lines
Or, if you want, I can resend this whole patch against your input-tree ? Just let me know...
If you could redo the patches against my tree that would be nice - I am having trouble applying "[PARISC] hp_sdc: fix request_irq()/free_irq() parameters"
Btw, is there any chance we coudl fix the code style in hil drivers. They are very different from the rest of the kernel. Something like patch below...
Signature · 804 lines
Dmitry Signed-off-by: Dmitry Torokhov <[email protected]> --- drivers/input/serio/hil_mlc.c | 381 +++++++++++++++++++++++++----------------- 1 files changed, 228 insertions(+), 153 deletions(-) Index: work/drivers/input/serio/hil_mlc.c =================================================================== --- work.orig/drivers/input/serio/hil_mlc.c +++ work/drivers/input/serio/hil_mlc.c @@ -32,11 +32,11 @@ * * Driver theory of operation: * - * Some access methods and an ISR is defined by the sub-driver - * (e.g. hp_sdc_mlc.c). These methods are expected to provide a - * few bits of logic in addition to raw access to the HIL MLC, - * specifically, the ISR, which is entirely registered by the - * sub-driver and invoked directly, must check for record + * Some access methods and an ISR is defined by the sub-driver + * (e.g. hp_sdc_mlc.c). These methods are expected to provide a + * few bits of logic in addition to raw access to the HIL MLC, + * specifically, the ISR, which is entirely registered by the + * sub-driver and invoked directly, must check for record * termination or packet match, at which point a semaphore must * be cleared and then the hil_mlcs_tasklet must be scheduled. * @@ -47,7 +47,7 @@ * itself if output is pending. (This rescheduling should be replaced * at some point with a sub-driver-specific mechanism.) * - * A timer task prods the tasklet once per second to prevent + * A timer task prods the tasklet once per second to prevent * hangups when attached devices do not return expected data * and to initiate probes of the loop for new devices. */ @@ -83,69 +83,86 @@ DECLARE_TASKLET_DISABLED(hil_mlcs_taskle /********************** Device info/instance management **********************/ -static void hil_mlc_clear_di_map (hil_mlc *mlc, int val) { +static void hil_mlc_clear_di_map(hil_mlc *mlc, int val) +{ int j; - for (j = val; j < 7 ; j++) { + + for (j = val; j < 7 ; j++) mlc->di_map[j] = -1; - } } -static void hil_mlc_clear_di_scratch (hil_mlc *mlc) { - memset(&(mlc->di_scratch), 0, sizeof(mlc->di_scratch)); +static void hil_mlc_clear_di_scratch(hil_mlc *mlc) +{ + memset(&mlc->di_scratch, 0, sizeof(mlc->di_scratch)); } -static void hil_mlc_copy_di_scratch (hil_mlc *mlc, int idx) { - memcpy(&(mlc->di[idx]), &(mlc->di_scratch), sizeof(mlc->di_scratch)); +static void hil_mlc_copy_di_scratch(hil_mlc *mlc, int idx) +{ + memcpy(&mlc->di[idx], &mlc->di_scratch, sizeof(mlc->di_scratch)); } -static int hil_mlc_match_di_scratch (hil_mlc *mlc) { +static int hil_mlc_match_di_scratch(hil_mlc *mlc) +{ int idx; for (idx = 0; idx < HIL_MLC_DEVMEM; idx++) { - int j, found; + int j, found = 0; /* In-use slots are not eligible. */ - found = 0; - for (j = 0; j < 7 ; j++) { - if (mlc->di_map[j] == idx) found++; - } - if (found) continue; - if (!memcmp(mlc->di + idx, - &(mlc->di_scratch), - sizeof(mlc->di_scratch))) break; + for (j = 0; j < 7 ; j++) + if (mlc->di_map[j] == idx) + found++; + + if (found) + continue; + + if (!memcmp(mlc->di + idx, &mlc->di_scratch, + sizeof(mlc->di_scratch))) + break; } - return((idx >= HIL_MLC_DEVMEM) ? -1 : idx); + + return idx >= HIL_MLC_DEVMEM ? -1 : idx; } -static int hil_mlc_find_free_di(hil_mlc *mlc) { +static int hil_mlc_find_free_di(hil_mlc *mlc) +{ int idx; - /* TODO: Pick all-zero slots first, failing that, - * randomize the slot picked among those eligible. + + /* TODO: Pick all-zero slots first, failing that, + * randomize the slot picked among those eligible. */ for (idx = 0; idx < HIL_MLC_DEVMEM; idx++) { - int j, found; - found = 0; - for (j = 0; j < 7 ; j++) { - if (mlc->di_map[j] == idx) found++; - } - if (!found) break; + int j, found = 0; + + for (j = 0; j < 7 ; j++) + if (mlc->di_map[j] == idx) + found++; + + if (!found) + break; } - return(idx); /* Note: It is guaranteed at least one above will match */ + + return idx; /* Note: It is guaranteed at least one above will match */ } -static inline void hil_mlc_clean_serio_map(hil_mlc *mlc) { +static inline void hil_mlc_clean_serio_map(hil_mlc *mlc) +{ int idx; + for (idx = 0; idx < HIL_MLC_DEVMEM; idx++) { - int j, found; - found = 0; - for (j = 0; j < 7 ; j++) { - if (mlc->di_map[j] == idx) found++; - } - if (!found) mlc->serio_map[idx].di_revmap = -1; + int j, found = 0; + + for (j = 0; j < 7 ; j++) + if (mlc->di_map[j] == idx) + found++; + + if (!found) + mlc->serio_map[idx].di_revmap = -1; } } -static void hil_mlc_send_polls(hil_mlc *mlc) { +static void hil_mlc_send_polls(hil_mlc *mlc) +{ int did, i, cnt; struct serio *serio; struct serio_driver *drv; @@ -157,26 +174,31 @@ static void hil_mlc_send_polls(hil_mlc * while (mlc->icount < 15 - i) { hil_packet p; + p = mlc->ipacket[i]; if (did != (p & HIL_PKT_ADDR_MASK) >> 8) { - if (drv == NULL || drv->interrupt == NULL) goto skip; + if (drv && drv->interrupt) { + drv->interrupt(serio, 0, 0); + drv->interrupt(serio, HIL_ERR_INT >> 16, 0); + drv->interrupt(serio, HIL_PKT_CMD >> 8, 0); + drv->interrupt(serio, HIL_CMD_POL + cnt, 0); + } - drv->interrupt(serio, 0, 0); - drv->interrupt(serio, HIL_ERR_INT >> 16, 0); - drv->interrupt(serio, HIL_PKT_CMD >> 8, 0); - drv->interrupt(serio, HIL_CMD_POL + cnt, 0); - skip: did = (p & HIL_PKT_ADDR_MASK) >> 8; serio = did ? mlc->serio[mlc->di_map[did-1]] : NULL; drv = (serio != NULL) ? serio->drv : NULL; cnt = 0; } - cnt++; i++; - if (drv == NULL || drv->interrupt == NULL) continue; - drv->interrupt(serio, (p >> 24), 0); - drv->interrupt(serio, (p >> 16) & 0xff, 0); - drv->interrupt(serio, (p >> 8) & ~HIL_PKT_ADDR_MASK, 0); - drv->interrupt(serio, p & 0xff, 0); + + cnt++; + i++; + + if (drv && drv->interrupt) { + drv->interrupt(serio, (p >> 24), 0); + drv->interrupt(serio, (p >> 16) & 0xff, 0); + drv->interrupt(serio, (p >> 8) & ~HIL_PKT_ADDR_MASK, 0); + drv->interrupt(serio, p & 0xff, 0); + } } } @@ -215,8 +237,10 @@ static void hil_mlc_send_polls(hil_mlc * #define HILSEN_DOZE (HILSEN_SAME | HILSEN_SCHED | HILSEN_BREAK) #define HILSEN_SLEEP (HILSEN_SAME | HILSEN_BREAK) -static int hilse_match(hil_mlc *mlc, int unused) { +static int hilse_match(hil_mlc *mlc, int unused) +{ int rc; + rc = hil_mlc_match_di_scratch(mlc); if (rc == -1) { rc = hil_mlc_find_free_di(mlc); @@ -244,21 +268,27 @@ static int hilse_match(hil_mlc *mlc, int } /* An LCV used to prevent runaway loops, forces 5 second sleep when reset. */ -static int hilse_init_lcv(hil_mlc *mlc, int unused) { +static int hilse_init_lcv(hil_mlc *mlc, int unused) +{ struct timeval tv; do_gettimeofday(&tv); - if(mlc->lcv == 0) goto restart; /* First init, no need to dally */ - if(tv.tv_sec - mlc->lcv_tv.tv_sec < 5) return -1; + if (mlc->lcv == 0) + goto restart; /* First init, no need to dally */ + if (tv.tv_sec - mlc->lcv_tv.tv_sec < 5) + return -1; restart: mlc->lcv_tv = tv; mlc->lcv = 0; return 0; } -static int hilse_inc_lcv(hil_mlc *mlc, int lim) { - if (mlc->lcv++ >= lim) return -1; +static int hilse_inc_lcv(hil_mlc *mlc, int lim) +{ + if (mlc->lcv++ >= lim) + return -1; + return 0; } @@ -270,15 +300,18 @@ static int hilse_set_lcv(hil_mlc *mlc, i #endif /* Management of the discovered device index (zero based, -1 means no devs) */ -static int hilse_set_ddi(hil_mlc *mlc, int val) { +static int hilse_set_ddi(hil_mlc *mlc, int val) +{ mlc->ddi = val; hil_mlc_clear_di_map(mlc, val + 1); + return 0; } -static int hilse_dec_ddi(hil_mlc *mlc, int unused) { +static int hilse_dec_ddi(hil_mlc *mlc, int unused) +{ mlc->ddi--; - if (mlc->ddi <= -1) { + if (mlc->ddi <= -1) { mlc->ddi = -1; hil_mlc_clear_di_map(mlc, 0); return -1; @@ -287,7 +320,8 @@ static int hilse_dec_ddi(hil_mlc *mlc, i return 0; } -static int hilse_inc_ddi(hil_mlc *mlc, int unused) { +static int hilse_inc_ddi(hil_mlc *mlc, int unused) +{ if (mlc->ddi >= 6) { BUG(); return -1; @@ -296,37 +330,42 @@ static int hilse_inc_ddi(hil_mlc *mlc, i return 0; } -static int hilse_take_idd(hil_mlc *mlc, int unused) { +static int hilse_take_idd(hil_mlc *mlc, int unused) +{ int i; - /* Help the state engine: - * Is this a real IDD response or just an echo? + /* Help the state engine: + * Is this a real IDD response or just an echo? * - * Real IDD response does not start with a command. + * Real IDD response does not start with a command. */ - if (mlc->ipacket[0] & HIL_PKT_CMD) goto bail; + if (mlc->ipacket[0] & HIL_PKT_CMD) + goto bail; /* Should have the command echoed further down. */ for (i = 1; i < 16; i++) { - if (((mlc->ipacket[i] & HIL_PKT_ADDR_MASK) == + if (((mlc->ipacket[i] & HIL_PKT_ADDR_MASK) == (mlc->ipacket[0] & HIL_PKT_ADDR_MASK)) && - (mlc->ipacket[i] & HIL_PKT_CMD) && + (mlc->ipacket[i] & HIL_PKT_CMD) && ((mlc->ipacket[i] & HIL_PKT_DATA_MASK) == HIL_CMD_IDD)) break; } - if (i > 15) goto bail; + if (i > 15) + goto bail; /* And the rest of the packets should still be clear. */ - while (++i < 16) { - if (mlc->ipacket[i]) break; - } - if (i < 16) goto bail; + while (++i < 16) + if (mlc->ipacket[i]) + break; + + if (i < 16) + goto bail; for (i = 0; i < 16; i++) { - mlc->di_scratch.idd[i] = + mlc->di_scratch.idd[i] = mlc->ipacket[i] & HIL_PKT_DATA_MASK; } /* Next step is to see if RSC supported */ - if (mlc->di_scratch.idd[1] & HIL_IDD_HEADER_RSC) + if (mlc->di_scratch.idd[1] & HIL_IDD_HEADER_RSC) return HILSEN_NEXT; - if (mlc->di_scratch.idd[1] & HIL_IDD_HEADER_EXD) + if (mlc->di_scratch.idd[1] & HIL_IDD_HEADER_EXD) return HILSEN_DOWN | 4; return 0; bail: @@ -334,56 +373,61 @@ static int hilse_take_idd(hil_mlc *mlc, return -1; /* This should send us off to ACF */ } -static int hilse_take_rsc(hil_mlc *mlc, int unused) { +static int hilse_take_rsc(hil_mlc *mlc, int unused) +{ int i; for (i = 0; i < 16; i++) { - mlc->di_scratch.rsc[i] = + mlc->di_scratch.rsc[i] = mlc->ipacket[i] & HIL_PKT_DATA_MASK; } /* Next step is to see if EXD supported (IDD has already been read) */ - if (mlc->di_scratch.idd[1] & HIL_IDD_HEADER_EXD) + if (mlc->di_scratch.idd[1] & HIL_IDD_HEADER_EXD) return HILSEN_NEXT; return 0; } -static int hilse_take_exd(hil_mlc *mlc, int unused) { +static int hilse_take_exd(hil_mlc *mlc, int unused) +{ int i; for (i = 0; i < 16; i++) { - mlc->di_scratch.exd[i] = + mlc->di_scratch.exd[i] = mlc->ipacket[i] & HIL_PKT_DATA_MASK; } /* Next step is to see if RNM supported. */ - if (mlc->di_scratch.exd[0] & HIL_EXD_HEADER_RNM) + if (mlc->di_scratch.exd[0] & HIL_EXD_HEADER_RNM) return HILSEN_NEXT; + return 0; } - -static int hilse_take_rnm(hil_mlc *mlc, int unused) { +static int hilse_take_rnm(hil_mlc *mlc, int unused) +{ int i; + char nam[17]; - for (i = 0; i < 16; i++) { - mlc->di_scratch.rnm[i] = + for (i = 0; i < 16; i++) + mlc->di_scratch.rnm[i] = mlc->ipacket[i] & HIL_PKT_DATA_MASK; - } - do { - char nam[17]; - snprintf(nam, 16, "%s", mlc->di_scratch.rnm); - nam[16] = '\0'; - printk(KERN_INFO PREFIX "Device name gotten: %s\n", nam); - } while (0); + + snprintf(nam, 16, "%s", mlc->di_scratch.rnm); + nam[16] = '\0'; + printk(KERN_INFO PREFIX "Device name gotten: %s\n", nam); + return 0; } -static int hilse_operate(hil_mlc *mlc, int repoll) { +static int hilse_operate(hil_mlc *mlc, int repoll) +{ - if (mlc->opercnt == 0) hil_mlcs_probe = 0; + if (mlc->opercnt == 0) + hil_mlcs_probe = 0; mlc->opercnt = 1; hil_mlc_send_polls(mlc); - if (!hil_mlcs_probe) return 0; + if (!hil_mlcs_probe) + return 0; hil_mlcs_probe = 0; mlc->opercnt = 0; return 1; @@ -428,7 +472,7 @@ struct hilse_node hil_mlc_se[HILSEN_END] EXPECT(HIL_ERR_INT | TEST_PACKET(0xa), 2000, HILSEN_NEXT, HILSEN_RESTART, HILSEN_RESTART) OUT(HIL_CTRL_ONLY | 0) /* Disable test mode */ - + /* 9 HILSEN_DHR */ FUNC(hilse_init_lcv, 0, HILSEN_NEXT, HILSEN_SLEEP, 0) @@ -439,7 +483,7 @@ struct hilse_node hil_mlc_se[HILSEN_END] IN(300000, HILSEN_DHR2, HILSEN_DHR2, HILSEN_NEXT) /* 14 HILSEN_IFC */ - OUT(HIL_PKT_CMD | HIL_CMD_IFC) + OUT(HIL_PKT_CMD | HIL_CMD_IFC) EXPECT(HIL_PKT_CMD | HIL_CMD_IFC | HIL_ERR_INT, 20000, HILSEN_DISC, HILSEN_DHR2, HILSEN_NEXT ) @@ -455,7 +499,7 @@ struct hilse_node hil_mlc_se[HILSEN_END] /* 18 HILSEN_HEAL */ OUT_LAST(HIL_CMD_ELB) - EXPECT_LAST(HIL_CMD_ELB | HIL_ERR_INT, + EXPECT_LAST(HIL_CMD_ELB | HIL_ERR_INT, 20000, HILSEN_REPOLL, HILSEN_DSR, HILSEN_NEXT) FUNC(hilse_dec_ddi, 0, HILSEN_HEAL, HILSEN_NEXT, 0) @@ -503,7 +547,7 @@ struct hilse_node hil_mlc_se[HILSEN_END] /* 44 HILSEN_PROBE */ OUT_LAST(HIL_PKT_CMD | HIL_CMD_EPT) - IN(10000, HILSEN_DISC, HILSEN_DSR, HILSEN_NEXT) + IN(10000, HILSEN_DISC, HILSEN_DSR, HILSEN_NEXT) OUT_DISC(HIL_PKT_CMD | HIL_CMD_ELB) IN(10000, HILSEN_DISC, HILSEN_DSR, HILSEN_NEXT) OUT(HIL_PKT_CMD | HIL_CMD_ACF | 1) @@ -514,7 +558,7 @@ struct hilse_node hil_mlc_se[HILSEN_END] /* 52 HILSEN_DSR */ FUNC(hilse_set_ddi, -1, HILSEN_NEXT, 0, 0) OUT(HIL_PKT_CMD | HIL_CMD_DSR) - IN(20000, HILSEN_DHR, HILSEN_DHR, HILSEN_IFC) + IN(20000, HILSEN_DHR, HILSEN_DHR, HILSEN_IFC) /* 55 HILSEN_REPOLL */ OUT(HIL_PKT_CMD | HIL_CMD_RPL) @@ -523,14 +567,15 @@ struct hilse_node hil_mlc_se[HILSEN_END] FUNC(hilse_operate, 1, HILSEN_OPERATE, HILSEN_IFC, HILSEN_PROBE) /* 58 HILSEN_IFCACF */ - OUT(HIL_PKT_CMD | HIL_CMD_IFC) + OUT(HIL_PKT_CMD | HIL_CMD_IFC) EXPECT(HIL_PKT_CMD | HIL_CMD_IFC | HIL_ERR_INT, 20000, HILSEN_ACF2, HILSEN_DHR2, HILSEN_HEAL) /* 60 HILSEN_END */ }; -static inline void hilse_setup_input(hil_mlc *mlc, struct hilse_node *node) { +static inline void hilse_setup_input(hil_mlc *mlc, struct hilse_node *node) +{ switch (node->act) { case HILSE_EXPECT_DISC: @@ -556,8 +601,6 @@ static inline void hilse_setup_input(hil mlc->icount = 15; memset(mlc->ipacket, 0, 16 * sizeof(hil_packet)); BUG_ON(down_trylock(&(mlc->isem))); - - return; } #ifdef HIL_MLC_DEBUG @@ -566,15 +609,18 @@ static int seidx; /* For debug */ static int kick = 1; #endif -static int hilse_donode (hil_mlc *mlc) { +static int hilse_donode (hil_mlc *mlc) +{ struct hilse_node *node; int nextidx = 0; int sched_long = 0; unsigned long flags; #ifdef HIL_MLC_DEBUG - if (mlc->seidx && (mlc->seidx != seidx) && mlc->seidx != 41 && mlc->seidx != 42 && mlc->seidx != 43) { - printk(KERN_DEBUG PREFIX "z%i \n%s {%i}", doze, kick ? "K" : "", mlc->seidx); + if (mlc->seidx && mlc->seidx != seidx && + mlc->seidx != 41 && mlc->seidx != 42 && mlc->seidx != 43) { + printk(KERN_DEBUG PREFIX "z%i \n%s {%i}", + doze, kick ? "K" : "", mlc->seidx); doze = 0; } kick = 0; @@ -588,12 +634,15 @@ static int hilse_donode (hil_mlc *mlc) { hil_packet pack; case HILSE_FUNC: - if (node->object.func == NULL) break; + if (node->object.func == NULL) + break; rc = node->object.func(mlc, node->arg); - nextidx = (rc > 0) ? node->ugly : + nextidx = (rc > 0) ? node->ugly : ((rc < 0) ? node->bad : node->good); - if (nextidx == HILSEN_FOLLOW) nextidx = rc; + if (nextidx == HILSEN_FOLLOW) + nextidx = rc; break; + case HILSE_EXPECT_LAST: case HILSE_EXPECT_DISC: case HILSE_EXPECT: @@ -607,33 +656,40 @@ static int hilse_donode (hil_mlc *mlc) { write_unlock_irqrestore(&(mlc->lock), flags); break; } - if (rc == 1) nextidx = node->ugly; - else if (rc == 0) nextidx = node->good; - else nextidx = node->bad; + if (rc == 1) + nextidx = node->ugly; + else if (rc == 0) + nextidx = node->good; + else + nextidx = node->bad; mlc->istarted = 0; write_unlock_irqrestore(&(mlc->lock), flags); break; + case HILSE_OUT_LAST: write_lock_irqsave(&(mlc->lock), flags); pack = node->object.packet; pack |= ((mlc->ddi + 1) << HIL_PKT_ADDR_SHIFT); goto out; + case HILSE_OUT_DISC: write_lock_irqsave(&(mlc->lock), flags); pack = node->object.packet; pack |= ((mlc->ddi + 2) << HIL_PKT_ADDR_SHIFT); goto out; + case HILSE_OUT: - write_lock_irqsave(&(mlc->lock), flags); + write_lock_irqsave(&mlc->lock, flags); pack = node->object.packet; out: - if (mlc->istarted) goto out2; + if (mlc->istarted) + goto out2; /* Prepare to receive input */ if ((node + 1)->act & HILSE_IN) hilse_setup_input(mlc, node + 1); out2: - write_unlock_irqrestore(&(mlc->lock), flags); + write_unlock_irqrestore(&mlc->lock, flags); if (down_trylock(&mlc->osem)) { nextidx = HILSEN_DOZE; @@ -641,8 +697,8 @@ static int hilse_donode (hil_mlc *mlc) { } up(&mlc->osem); - write_lock_irqsave(&(mlc->lock), flags); - if (!(mlc->ostarted)) { + write_lock_irqsave(&mlc->lock, flags); + if (!mlc->ostarted) { mlc->ostarted = 1; mlc->opacket = pack; mlc->out(mlc); @@ -651,13 +707,15 @@ static int hilse_donode (hil_mlc *mlc) { break; } mlc->ostarted = 0; - do_gettimeofday(&(mlc->instart)); - write_unlock_irqrestore(&(mlc->lock), flags); + do_gettimeofday(&mlc->instart); + write_unlock_irqrestore(&mlc->lock, flags); nextidx = HILSEN_NEXT; break; + case HILSE_CTS: nextidx = mlc->cts(mlc) ? node->bad : node->good; break; + default: BUG(); nextidx = 0; @@ -665,36 +723,47 @@ static int hilse_donode (hil_mlc *mlc) { } #ifdef HIL_MLC_DEBUG - if (nextidx == HILSEN_DOZE) doze++; + if (nextidx == HILSEN_DOZE) + doze++; #endif while (nextidx & HILSEN_SCHED) { struct timeval tv; - if (!sched_long) goto sched; + if (!sched_long) + goto sched; do_gettimeofday(&tv); tv.tv_usec += 1000000 * (tv.tv_sec - mlc->instart.tv_sec); tv.tv_usec -= mlc->instart.tv_usec; - if (tv.tv_usec >= mlc->intimeout) goto sched; + if (tv.tv_usec >= mlc->intimeout) + goto sched; tv.tv_usec = (mlc->intimeout - tv.tv_usec) * HZ / 1000000; - if (!tv.tv_usec) goto sched; + if (!tv.tv_usec) + goto sched; mod_timer(&hil_mlcs_kicker, jiffies + tv.tv_usec); break; sched: tasklet_schedule(&hil_mlcs_tasklet); break; - } - if (nextidx & HILSEN_DOWN) mlc->seidx += nextidx & HILSEN_MASK; - else if (nextidx & HILSEN_UP) mlc->seidx -= nextidx & HILSEN_MASK; - else mlc->seidx = nextidx & HILSEN_MASK; + } + + if (nextidx & HILSEN_DOWN) + mlc->seidx += nextidx & HILSEN_MASK; + else if (nextidx & HILSEN_UP) + mlc->seidx -= nextidx & HILSEN_MASK; + else + mlc->seidx = nextidx & HILSEN_MASK; + + if (nextidx & HILSEN_BREAK) + return 1; - if (nextidx & HILSEN_BREAK) return 1; return 0; } /******************** tasklet context functions **************************/ -static void hil_mlcs_process(unsigned long unused) { +static void hil_mlcs_process(unsigned long unused) +{ struct list_head *tmp; read_lock(&hil_mlcs_lock); @@ -702,19 +771,20 @@ static void hil_mlcs_process(unsigned lo struct hil_mlc *mlc = list_entry(tmp, hil_mlc, list); while (hilse_donode(mlc) == 0) { #ifdef HIL_MLC_DEBUG - if (mlc->seidx != 41 && - mlc->seidx != 42 && - mlc->seidx != 43) - printk(KERN_DEBUG PREFIX " + "); + if (mlc->seidx != 41 && + mlc->seidx != 42 && + mlc->seidx != 43) + printk(KERN_DEBUG PREFIX " + "); #endif - }; + } } read_unlock(&hil_mlcs_lock); } /************************* Keepalive timer task *********************/ -void hil_mlcs_timer (unsigned long data) { +void hil_mlcs_timer (unsigned long data) +{ hil_mlcs_probe = 1; tasklet_schedule(&hil_mlcs_tasklet); /* Re-insert the periodic task. */ @@ -724,7 +794,8 @@ void hil_mlcs_timer (unsigned long data) /******************** user/kernel context functions **********************/ -static int hil_mlc_serio_write(struct serio *serio, unsigned char c) { +static int hil_mlc_serio_write(struct serio *serio, unsigned char c) +{ struct hil_mlc_serio_map *map; struct hil_mlc *mlc; struct serio_driver *drv; @@ -740,12 +811,12 @@ static int hil_mlc_serio_write(struct se BUG(); return -EIO; } - mlc->serio_opacket[map->didx] |= + mlc->serio_opacket[map->didx] |= ((hil_packet)c) << (8 * (3 - mlc->serio_oidx[map->didx])); if (mlc->serio_oidx[map->didx] >= 3) { /* for now only commands */ - if (!(mlc->serio_opacket[map->didx] & HIL_PKT_CMD)) + if (!(mlc->serio_opacket[map->didx] & HIL_PKT_CMD)) return -EIO; switch (mlc->serio_opacket[map->didx] & HIL_PKT_DATA_MASK) { case HIL_CMD_IDD: @@ -776,7 +847,8 @@ static int hil_mlc_serio_write(struct se return -EIO; } last = idx + 15; - while ((last != idx) && (*last == 0)) last--; + while ((last != idx) && (*last == 0)) + last--; while (idx != last) { drv->interrupt(serio, 0, 0); @@ -789,14 +861,15 @@ static int hil_mlc_serio_write(struct se drv->interrupt(serio, HIL_ERR_INT >> 16, 0); drv->interrupt(serio, HIL_PKT_CMD >> 8, 0); drv->interrupt(serio, *idx, 0); - + mlc->serio_oidx[map->didx] = 0; mlc->serio_opacket[map->didx] = 0; return 0; } -static int hil_mlc_serio_open(struct serio *serio) { +static int hil_mlc_serio_open(struct serio *serio) +{ struct hil_mlc_serio_map *map; struct hil_mlc *mlc; @@ -817,7 +890,8 @@ static int hil_mlc_serio_open(struct ser return 0; } -static void hil_mlc_serio_close(struct serio *serio) { +static void hil_mlc_serio_close(struct serio *serio) +{ struct hil_mlc_serio_map *map; struct hil_mlc *mlc; @@ -844,13 +918,13 @@ static struct serio_device_id hil_mlc_se .id = SERIO_ANY, }; -int hil_mlc_register(hil_mlc *mlc) { +int hil_mlc_register(hil_mlc *mlc) +{ int i; unsigned long flags; - if (mlc == NULL) { + if (mlc == NULL) return -EINVAL; - } mlc->istarted = 0; mlc->ostarted = 0; @@ -897,7 +971,8 @@ int hil_mlc_register(hil_mlc *mlc) { return 0; } -int hil_mlc_unregister(hil_mlc *mlc) { +int hil_mlc_unregister(hil_mlc *mlc) +{ struct list_head *tmp; unsigned long flags; int i; @@ -942,7 +1017,7 @@ static int __init hil_mlc_init(void) return 0; } - + static void __exit hil_mlc_exit(void) { del_timer(&hil_mlcs_kicker); @@ -950,6 +1025,6 @@ static void __exit hil_mlc_exit(void) tasklet_disable(&hil_mlcs_tasklet); tasklet_kill(&hil_mlcs_tasklet); } - + module_init(hil_mlc_init); module_exit(hil_mlc_exit);
A message that is not in the archive (sent off-list or not yet received): [email protected]
Helge Deller
maintainer[parisc-linux] Re: [PARISC] fix uninitialized spinlock in HIL keyboard driver
Quoted 20 lines · Dmitry Torokhov
Hi Helge,
Quoted 5 lines · Helge Deller
Can you drop this ^^ piece of this patch ?
Cyrill V. Gorcunov's (<[email protected]>) HP300 patches from a few days ago are more correct since they include therelease_region()call.I have 2 patches from Cyrill applied to my tree:
- one from couple days ago dealing withrelease_region()(2nd version that was acked by you)
- another came to me throughg Andrew and deals with handling errors frominput_register_device(),request_region(),request_irq()+ whitespace cleanup.Quoted 3 lines
Or, if you want, I can resend this whole patch against your input-tree ? Just let me know...
Quoted 5 lines
If you could redo the patches against my tree that would be nice - I am having trouble applying "[PARISC]
hp_sdc: fix request_irq()/free_irq() parameters"Btw, is there any chance we coudl fix the code style in hil drivers. They are very different from the rest of the kernel. Something like patch below...
Sure, I'll do both and send you seperate patches soon.
Helge
_______________________________________________
parisc-linux mailing list
[email protected]
http://lists.parisc-linux.org/mailman/listinfo/parisc-linux
A message that is not in the archive (sent off-list or not yet received): [email protected]
Helge Deller
maintainer[parisc-linux] Re: [PARISC] fix uninitialized spinlock in HIL keyboard driver
Quoted 8 lines · Helge Deller
Quoted 5 lines · Dmitry Torokhov
If you could redo the patches against my tree that would be nice - I am having trouble applying "[PARISC]
hp_sdc: fix request_irq()/free_irq() parameters"Btw, is there any chance we coudl fix the code style in hil drivers. They are very different from the rest of the kernel. Something like patch below...
Sure, I'll do both and send you seperate patches soon.
Hi Dmitry,
Here is the patch and patchtext for the bugfixes which should cleanly apply to your git tree. The coding-style cleanups will follow soon as well.
----------
Input: HIL - various fixes for HIL drivers
- mark some structures const or __read_mostly
- hilkbd.c: fix uninitialized spinlock in HIL keyboard driver
- hil_mlc.c: use USEC_PER_SEC instead of 1000000
- hp_sdc: bugfix for request_irq()/free_irq() parameters, this prevented multiple load/unload cycles as module
----------
drivers/input/keyboard/hil_kbd.c +4 -4
@@ -51,7 +51,7 @@ MODULE_LICENSE("Dual BSD/GPL");#define HIL_KBD_SET1_UPBIT 0x01#define HIL_KBD_SET1_SHIFT 1 -static unsigned int hil_kbd_set1[HIL_KEYCODES_SET1_TBLSIZE ] = +static unsigned int hil_kbd_set1[HIL_KEYCODES_SET1_TBLSIZE ]__read_mostly = {HIL_KEYCODES_SET1 };#define HIL_KBD_SET2_UPBIT 0x01
@@ -60,10 +60,10 @@ static unsigned int hil_kbd_set1[HIL_KEY#define HIL_KBD_SET3_UPBIT 0x80#define HIL_KBD_SET3_SHIFT 0 -static unsigned int hil_kbd_set3[HIL_KEYCODES_SET3_TBLSIZE ] = +static unsigned int hil_kbd_set3[HIL_KEYCODES_SET3_TBLSIZE ]__read_mostly = {HIL_KEYCODES_SET3 }; -static char hil_language[][16 ] = {HIL_LOCALE_MAP }; +static const char hil_language[][16 ] = {HIL_LOCALE_MAP };struct hil_kbd {struct input_dev *dev;
@@ -368,7 +368,7 @@ static struct serio_device_id hil_kbd_id { 0 } }; -struct serio_driver hil_kbd_serio_drv = { +static struct serio_driver hil_kbd_serio_drv = { .driver = { .name ="hil_kbd" , },
drivers/input/keyboard/hilkbd.c +3 -2
@@ -3,7 +3,7 @@* * Copyright (C) 1998 Philip Blundell <[email protected]> * Copyright (C) 1999 Matthew Wilcox <[email protected]> -* Copyright (C) 1999-2006 Helge Deller <[email protected]> +* Copyright (C) 1999-2007 Helge Deller <[email protected]> * * Very basic HP Human Interface Loop (HIL) driver. * This driver handles the keyboard on HP300 (m68k) and on some
@@ -89,7 +89,7 @@ MODULE_LICENSE("GPL v2");#define HIL_READKBDSADR 0xF9#define HIL_WRITEKBDSADR 0xE9 -static unsigned int hphilkeyb_keycode[HIL_KEYCODES_SET1_TBLSIZE ] = +static unsigned int hphilkeyb_keycode[HIL_KEYCODES_SET1_TBLSIZE ]__read_mostly = {HIL_KEYCODES_SET1 };/* HIL structure */
@@ -211,6 +211,7 @@ hil_keyb_init(void)return -ENODEV ;/* already initialized */ } +spin_lock_init (&hil_dev.lock); hil_dev.dev =input_allocate_device ();if (!hil_dev.dev)return -ENOMEM ;
drivers/input/serio/hil_mlc.c +10 -10
@@ -408,7 +408,7 @@ static int hilse_operate(hil_mlc *mlc, i#define OUT_LAST (pack) \ { HILSE_OUT_LAST, { .packet = pack }, 0, 0, 0, 0 }, -struct hilse_node hil_mlc_se[HILSEN_END ] = { +const struct hilse_node hil_mlc_se[HILSEN_END ] = {/* 0 HILSEN_START */ FUNC (hilse_init_lcv,0 ,HILSEN_NEXT ,HILSEN_SLEEP ,0 )
@@ -530,7 +530,7 @@ struct hilse_node hil_mlc_se[HILSEN_END]/* 60 HILSEN_END */ }; -static inline void hilse_setup_input (hil_mlc *mlc,struct hilse_node *node) { +static inline void hilse_setup_input (hil_mlc *mlc,const struct hilse_node *node) {switch (node->act) {case HILSE_EXPECT_DISC :
@@ -563,21 +563,19 @@ static inline void hilse_setup_input(hil#ifdef HIL_MLC_DEBUG static int doze =0 ;static int seidx;/* For debug */ -static int kick =1 ;#endif static int hilse_donode (hil_mlc *mlc) { -struct hilse_node *node; +const struct hilse_node *node;int nextidx =0 ;int sched_long =0 ;unsigned long flags;#ifdef HIL_MLC_DEBUG if (mlc->seidx && (mlc->seidx != seidx) && mlc->seidx !=41 && mlc->seidx !=42 && mlc->seidx !=43 ) { - printk(KERN_DEBUG PREFIX "z%i \n%s {%i}", doze, kick ? "K" : "", mlc->seidx); + printk(KERN_DEBUG PREFIX "z%i \n {%i}", doze, mlc->seidx); doze =0 ; } - kick =0 ; seidx = mlc->seidx;#endif
@@ -588,7 +586,7 @@ static int hilse_donode (hil_mlc *mlc) {hil_packet pack;case HILSE_FUNC : -if (node->object.func ==NULL )break ; +BUG_ON (node->object.func ==NULL ); rc = node->object.func (mlc, node->arg); nextidx = (rc >0 ) ? node->ugly : ((rc <0 ) ? node->bad : node->good);
@@ -674,10 +672,10 @@ static int hilse_donode (hil_mlc *mlc) {if (!sched_long) goto sched;do_gettimeofday (&tv); - tv.tv_usec +=1000000 * (tv.tv_sec - mlc->instart.tv_sec); + tv.tv_usec +=USEC_PER_SEC * (tv.tv_sec - mlc->instart.tv_sec); tv.tv_usec -= mlc->instart.tv_usec;if (tv.tv_usec >= mlc->intimeout) goto sched; - tv.tv_usec = (mlc->intimeout - tv.tv_usec) *HZ /1000000 ; + tv.tv_usec = (mlc->intimeout - tv.tv_usec) *HZ /USEC_PER_SEC ;if (!tv.tv_usec) goto sched;mod_timer (&hil_mlcs_kicker, jiffies + tv.tv_usec);break ;
@@ -837,7 +835,7 @@ static void hil_mlc_serio_close(struct s/* TODO wake up interruptable */ } -static struct serio_device_id hil_mlc_serio_id = { +static const struct serio_device_id hil_mlc_serio_id = { .type =SERIO_HIL_MLC , .proto =SERIO_HIL , .extra =SERIO_ANY ,
@@ -873,6 +871,8 @@ int hil_mlc_register(hil_mlc *mlc) {hil_mlc_copy_di_scratch (mlc, i); mlc_serio =kzalloc (sizeof (*mlc_serio),GFP_KERNEL ); mlc->serio[i] = mlc_serio; +snprintf (mlc_serio->name,sizeof (mlc_serio->name)-1 ,"HIL_SERIO%d" , i); +snprintf (mlc_serio->phys,sizeof (mlc_serio->phys)-1 ,"HIL%d" , i); mlc_serio->id = hil_mlc_serio_id; mlc_serio->write = hil_mlc_serio_write; mlc_serio->open = hil_mlc_serio_open;
drivers/input/serio/hp_sdc.c +8 -8
@@ -748,7 +748,7 @@ void hp_sdc_kicker (unsigned long data) #if defined(__hppa__) -static struct parisc_device_id hp_sdc_tbl[] = { +static const struct parisc_device_id hp_sdc_tbl[] = { { .hw_type = HPHW_FIO, .hversion_rev = HVERSION_REV_ANY_ID,
@@ -817,12 +817,12 @@ static int __init hp_sdc_init(void)#endif errstr ="IRQ not available for" ; -if (request_irq (hp_sdc.irq, &hp_sdc_isr,0 ,"HP SDC" , - (void *) hp_sdc.base_io)) goto err1; +if (request_irq (hp_sdc.irq, &hp_sdc_isr,IRQF_SHARED |IRQF_SAMPLE_RANDOM , +"HP SDC" , &hp_sdc)) goto err1; errstr ="NMI not available for" ; -if (request_irq (hp_sdc.nmi, &hp_sdc_nmisr,0 ,"HP SDC NMI" , - (void *) hp_sdc.base_io)) goto err2; +if (request_irq (hp_sdc.nmi, &hp_sdc_nmisr,IRQF_SHARED , +"HP SDC NMI" , &hp_sdc)) goto err2; printk(KERN_INFO PREFIX "HP SDC at 0x%p, IRQ %d (NMI IRQ %d)\n", (void *)hp_sdc.base_io, hp_sdc.irq, hp_sdc.nmi);
@@ -854,7 +854,7 @@ static int __init hp_sdc_init(void) hp_sdc.dev_err =0 ;return 0 ; err2: -free_irq (hp_sdc.irq,NULL ); +free_irq (hp_sdc.irq, &hp_sdc); err1:release_region (hp_sdc.data_io,2 ); err0:
@@ -898,8 +898,8 @@ static void hp_sdc_exit(void)/* Wait until we know this has been processed by the i8042 */ hp_sdc_spin_ibf (); -free_irq (hp_sdc.nmi,NULL ); -free_irq (hp_sdc.irq,NULL ); +free_irq (hp_sdc.nmi, &hp_sdc); +free_irq (hp_sdc.irq, &hp_sdc);write_unlock_irq (&hp_sdc.lock);del_timer (&hp_sdc.kicker);
drivers/input/serio/hp_sdc_mlc.c +2 -1
@@ -323,11 +323,12 @@ static int __init hp_sdc_mlc_init(void) mlc->in = &hp_sdc_mlc_in; mlc->out = &hp_sdc_mlc_out; + mlc->priv = &hp_sdc_mlc_priv; +if (hil_mlc_register (mlc)) { printk(KERN_WARNING PREFIX "Failed to register MLC structure with hil_mlc\n"); goto err0; } - mlc->priv = &hp_sdc_mlc_priv;if (hp_sdc_request_hil_irq (&hp_sdc_mlc_isr)) { printk(KERN_WARNING PREFIX "Request for raw HIL ISR hook denied\n");
_______________________________________________
parisc-linux mailing list
[email protected]
http://lists.parisc-linux.org/mailman/listinfo/parisc-linux
A message that is not in the archive (sent off-list or not yet received): [email protected]
Helge Deller
maintainer[parisc-linux] Re: [PARISC] fix uninitialized spinlock in HIL keyboard driver (second input patch - coding style cleanup)
Hi Dmitry,
This the second (and last) patch which cleanes up the coding-style and it should apply on top of the previous patch I sent you yesterday.
----------
Input: HIL - cleanup coding style
----------
drivers/input/keyboard/hil_kbd.c +37 -28
@@ -95,9 +95,11 @@ static void hil_kbd_process_record(struc p = data[idx -1 ];if ((p & ~HIL_CMDCT_POL ) == - (HIL_ERR_INT |HIL_PKT_CMD |HIL_CMD_POL )) goto report; + (HIL_ERR_INT |HIL_PKT_CMD |HIL_CMD_POL )) + goto report;if ((p & ~HIL_CMDCT_RPL ) == - (HIL_ERR_INT |HIL_PKT_CMD |HIL_CMD_RPL )) goto report; + (HIL_ERR_INT |HIL_PKT_CMD |HIL_CMD_RPL )) + goto report;/* Not a poll response. See if we are loading config records. */ switch (p &HIL_PKT_DATA_MASK ) {
@@ -107,27 +109,32 @@ static void hil_kbd_process_record(strucfor (; i <HIL_KBD_MAX_LENGTH ; i++) kbd->idd[i] =0 ;break ; +case HIL_CMD_RSC :for (i =0 ; i < idx; i++) kbd->rsc[i] = kbd->data[i] &HIL_PKT_DATA_MASK ;for (; i <HIL_KBD_MAX_LENGTH ; i++) kbd->rsc[i] =0 ;break ; +case HIL_CMD_EXD :for (i =0 ; i < idx; i++) kbd->exd[i] = kbd->data[i] &HIL_PKT_DATA_MASK ;for (; i <HIL_KBD_MAX_LENGTH ; i++) kbd->exd[i] =0 ;break ; +case HIL_CMD_RNM :for (i =0 ; i < idx; i++) kbd->rnm[i] = kbd->data[i] &HIL_PKT_DATA_MASK ;for (; i <HIL_KBD_MAX_LENGTH +1 ; i++) kbd->rnm[i] ='\0' ;break ; +default :/* These occur when device isn't present */ -if (p == (HIL_ERR_INT |HIL_PKT_CMD ))break ; +if (p == (HIL_ERR_INT |HIL_PKT_CMD )) +break ;/* Anything else we'd like to know about. */ printk(KERN_WARNING PREFIX "Device sent unknown record %x\n", p);break ;
@@ -139,16 +146,19 @@ static void hil_kbd_process_record(strucswitch (kbd->data[0 ] &HIL_POL_CHARTYPE_MASK ) {case HIL_POL_CHARTYPE_NONE :break ; +case HIL_POL_CHARTYPE_ASCII :while (cnt < idx -1 )input_report_key (dev, kbd->data[cnt++] &0x7f ,1 );break ; +case HIL_POL_CHARTYPE_RSVD1 :case HIL_POL_CHARTYPE_RSVD2 :case HIL_POL_CHARTYPE_BINARY :while (cnt < idx -1 )input_report_key (dev, kbd->data[cnt++],1 );break ; +case HIL_POL_CHARTYPE_SET1 :while (cnt < idx -1 ) {unsigned int key;
@@ -161,6 +171,7 @@ static void hil_kbd_process_record(strucinput_report_key (dev, key, !up); }break ; +case HIL_POL_CHARTYPE_SET2 :while (cnt < idx -1 ) {unsigned int key;
@@ -173,6 +184,7 @@ static void hil_kbd_process_record(strucinput_report_key (dev, key, !up); }break ; +case HIL_POL_CHARTYPE_SET3 :while (cnt < idx -1 ) {unsigned int key;
@@ -191,42 +203,43 @@ static void hil_kbd_process_record(strucup (&kbd->sem); } -static void hil_kbd_process_err (struct hil_kbd *kbd) { +static void hil_kbd_process_err (struct hil_kbd *kbd) +{ printk(KERN_WARNING PREFIX "errored HIL packet\n"); kbd->idx4 =0 ;up (&kbd->sem); }static irqreturn_t hil_kbd_interrupt (struct serio *serio, -unsigned char data,unsigned int flags) +unsigned char data,unsigned int flags) {struct hil_kbd *kbd;hil_packet packet;int idx; kbd =serio_get_drvdata (serio); -if (kbd ==NULL ) { -BUG (); -return IRQ_HANDLED ; - } +BUG_ON (kbd ==NULL );if (kbd->idx4 >= (HIL_KBD_MAX_LENGTH *sizeof (hil_packet))) {hil_kbd_process_err (kbd);return IRQ_HANDLED ; } idx = kbd->idx4/4 ; -if (!(kbd->idx4 %4 )) kbd->data[idx] =0 ; +if (!(kbd->idx4 %4 )) + kbd->data[idx] =0 ; packet = kbd->data[idx]; packet |= ((hil_packet )data) << ((3 - (kbd->idx4 %4 )) *8 ); kbd->data[idx] = packet;/* Records of N 4-byte hil_packets must terminate with a command. */ -if ((++(kbd->idx4)) %4 )return IRQ_HANDLED ; +if ((++(kbd->idx4)) %4 ) +return IRQ_HANDLED ;if ((packet &0xffff0000 ) !=HIL_ERR_INT ) {hil_kbd_process_err (kbd);return IRQ_HANDLED ; } -if (packet &HIL_PKT_CMD )hil_kbd_process_record (kbd); +if (packet &HIL_PKT_CMD ) +hil_kbd_process_record (kbd);return IRQ_HANDLED ; }
@@ -235,10 +248,7 @@ static void hil_kbd_disconnect(struct sestruct hil_kbd *kbd; kbd =serio_get_drvdata (serio); -if (kbd ==NULL ) { -BUG (); -return ; - } +BUG_ON (kbd ==NULL );serio_close (serio);input_unregister_device (kbd->dev);
@@ -267,34 +277,34 @@ static int hil_kbd_connect(struct serioserio_set_drvdata (serio, kbd); kbd->serio = serio; -init_MUTEX_LOCKED (&(kbd->sem)); +init_MUTEX_LOCKED (&kbd->sem);/* Get device info. MLC driver supplies devid/status/etc. */ serio->write (serio,0 ); serio->write (serio,0 ); serio->write (serio,HIL_PKT_CMD >>8 ); serio->write (serio,HIL_CMD_IDD ); -down (&(kbd->sem)); +down (&kbd->sem); serio->write (serio,0 ); serio->write (serio,0 ); serio->write (serio,HIL_PKT_CMD >>8 ); serio->write (serio,HIL_CMD_RSC ); -down (&(kbd->sem)); +down (&kbd->sem); serio->write (serio,0 ); serio->write (serio,0 ); serio->write (serio,HIL_PKT_CMD >>8 ); serio->write (serio,HIL_CMD_RNM ); -down (&(kbd->sem)); +down (&kbd->sem); serio->write (serio,0 ); serio->write (serio,0 ); serio->write (serio,HIL_PKT_CMD >>8 ); serio->write (serio,HIL_CMD_EXD ); -down (&(kbd->sem)); +down (&kbd->sem); -up (&(kbd->sem)); +up (&kbd->sem); did = kbd->idd[0 ]; idd = kbd->idd +1 ;
@@ -310,12 +320,11 @@ static int hil_kbd_connect(struct serio goto bail2; } -if (HIL_IDD_NUM_BUTTONS (idd) ||HIL_IDD_NUM_AXES_PER_SET (*idd)) { +if (HIL_IDD_NUM_BUTTONS (idd) ||HIL_IDD_NUM_AXES_PER_SET (*idd)) { printk(KERN_INFO PREFIX "keyboards only, no combo devices supported.\n"); goto bail2; } - kbd->dev->evbit[0 ] =BIT (EV_KEY ) |BIT (EV_REP ); kbd->dev->ledbit[0 ] =BIT (LED_NUML ) |BIT (LED_CAPSL ) |BIT (LED_SCROLLL ); kbd->dev->keycodemax =HIL_KEYCODES_SET1_TBLSIZE ;
@@ -344,8 +353,8 @@ static int hil_kbd_connect(struct serio serio->write (serio,0 ); serio->write (serio,HIL_PKT_CMD >>8 ); serio->write (serio,HIL_CMD_EK1 );/* Enable Keyswitch Autorepeat 1 */ -down (&(kbd->sem)); -up (&(kbd->sem)); +down (&kbd->sem); +up (&kbd->sem);return 0 ; bail2:
@@ -383,11 +392,11 @@ static int __init hil_kbd_init(void) {return serio_register_driver (&hil_kbd_serio_drv); } - + static void __exit hil_kbd_exit(void) {serio_unregister_driver (&hil_kbd_serio_drv); } - +module_init (hil_kbd_init);module_exit (hil_kbd_exit);
drivers/input/mouse/hil_ptr.c +40 -35
215 lines not on this page · raw message
drivers/input/serio/hil_mlc.c +238 -181
785 lines not on this page · raw message
drivers/input/serio/hp_sdc.c +154 -105
653 lines not on this page · raw message
drivers/input/serio/hp_sdc_mlc.c +86 -78
343 lines not on this page · raw message
_______________________________________________
parisc-linux mailing list
[email protected]
http://lists.parisc-linux.org/mailman/listinfo/parisc-linux
[parisc-linux] Re: [PARISC] input: queued patches from parisc-linux
In reply to a message not in the archiveHi Kyle,
Quoted 8 lines · Kyle McMartin
Hi Dmitry,
The following are some patches committed to the input subsystem from parisc-linux.
Apologies if this turns out badly, this is my first time using git-send-email...
Thank you for the patches, everything looks pretty good, it would be even better if subjects had sequence numbers in them so I would know the order in which they should be applied.
It seems that I already have some of the patches, so I will wait for Helge to redo them against my tree (see my other e-mail).
Signature · 5 lines
Dmitry _______________________________________________ parisc-linux mailing list [email protected] http://lists.parisc-linux.org/mailman/listinfo/parisc-linux