提交 3acaf540 编写于 作者: H Helge Deller 提交者: Dmitry Torokhov

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
Signed-off-by: NHelge Deller <deller@gmx.de>
Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
上级 969111e9
...@@ -51,7 +51,7 @@ MODULE_LICENSE("Dual BSD/GPL"); ...@@ -51,7 +51,7 @@ MODULE_LICENSE("Dual BSD/GPL");
#define HIL_KBD_SET1_UPBIT 0x01 #define HIL_KBD_SET1_UPBIT 0x01
#define HIL_KBD_SET1_SHIFT 1 #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 }; { HIL_KEYCODES_SET1 };
#define HIL_KBD_SET2_UPBIT 0x01 #define HIL_KBD_SET2_UPBIT 0x01
...@@ -60,10 +60,10 @@ static unsigned int hil_kbd_set1[HIL_KEYCODES_SET1_TBLSIZE] = ...@@ -60,10 +60,10 @@ static unsigned int hil_kbd_set1[HIL_KEYCODES_SET1_TBLSIZE] =
#define HIL_KBD_SET3_UPBIT 0x80 #define HIL_KBD_SET3_UPBIT 0x80
#define HIL_KBD_SET3_SHIFT 0 #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 }; { HIL_KEYCODES_SET3 };
static char hil_language[][16] = { HIL_LOCALE_MAP }; static const char hil_language[][16] = { HIL_LOCALE_MAP };
struct hil_kbd { struct hil_kbd {
struct input_dev *dev; struct input_dev *dev;
...@@ -368,7 +368,7 @@ static struct serio_device_id hil_kbd_ids[] = { ...@@ -368,7 +368,7 @@ static struct serio_device_id hil_kbd_ids[] = {
{ 0 } { 0 }
}; };
struct serio_driver hil_kbd_serio_drv = { static struct serio_driver hil_kbd_serio_drv = {
.driver = { .driver = {
.name = "hil_kbd", .name = "hil_kbd",
}, },
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* Copyright (C) 1998 Philip Blundell <philb@gnu.org> * Copyright (C) 1998 Philip Blundell <philb@gnu.org>
* Copyright (C) 1999 Matthew Wilcox <willy@bofh.ai> * Copyright (C) 1999 Matthew Wilcox <willy@bofh.ai>
* Copyright (C) 1999-2006 Helge Deller <deller@gmx.de> * Copyright (C) 1999-2007 Helge Deller <deller@gmx.de>
* *
* Very basic HP Human Interface Loop (HIL) driver. * 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
...@@ -89,7 +89,7 @@ MODULE_LICENSE("GPL v2"); ...@@ -89,7 +89,7 @@ MODULE_LICENSE("GPL v2");
#define HIL_READKBDSADR 0xF9 #define HIL_READKBDSADR 0xF9
#define HIL_WRITEKBDSADR 0xE9 #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_KEYCODES_SET1 };
/* HIL structure */ /* HIL structure */
...@@ -211,6 +211,7 @@ hil_keyb_init(void) ...@@ -211,6 +211,7 @@ hil_keyb_init(void)
return -ENODEV; /* already initialized */ return -ENODEV; /* already initialized */
} }
spin_lock_init(&hil_dev.lock);
hil_dev.dev = input_allocate_device(); hil_dev.dev = input_allocate_device();
if (!hil_dev.dev) if (!hil_dev.dev)
return -ENOMEM; return -ENOMEM;
......
...@@ -408,7 +408,7 @@ static int hilse_operate(hil_mlc *mlc, int repoll) { ...@@ -408,7 +408,7 @@ static int hilse_operate(hil_mlc *mlc, int repoll) {
#define OUT_LAST(pack) \ #define OUT_LAST(pack) \
{ HILSE_OUT_LAST, { .packet = pack }, 0, 0, 0, 0 }, { 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 */ /* 0 HILSEN_START */
FUNC(hilse_init_lcv, 0, HILSEN_NEXT, HILSEN_SLEEP, 0) FUNC(hilse_init_lcv, 0, HILSEN_NEXT, HILSEN_SLEEP, 0)
...@@ -530,7 +530,7 @@ struct hilse_node hil_mlc_se[HILSEN_END] = { ...@@ -530,7 +530,7 @@ struct hilse_node hil_mlc_se[HILSEN_END] = {
/* 60 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) { switch (node->act) {
case HILSE_EXPECT_DISC: case HILSE_EXPECT_DISC:
...@@ -563,21 +563,19 @@ static inline void hilse_setup_input(hil_mlc *mlc, struct hilse_node *node) { ...@@ -563,21 +563,19 @@ static inline void hilse_setup_input(hil_mlc *mlc, struct hilse_node *node) {
#ifdef HIL_MLC_DEBUG #ifdef HIL_MLC_DEBUG
static int doze = 0; static int doze = 0;
static int seidx; /* For debug */ static int seidx; /* For debug */
static int kick = 1;
#endif #endif
static int hilse_donode (hil_mlc *mlc) { static int hilse_donode (hil_mlc *mlc) {
struct hilse_node *node; const struct hilse_node *node;
int nextidx = 0; int nextidx = 0;
int sched_long = 0; int sched_long = 0;
unsigned long flags; unsigned long flags;
#ifdef HIL_MLC_DEBUG #ifdef HIL_MLC_DEBUG
if (mlc->seidx && (mlc->seidx != seidx) && mlc->seidx != 41 && mlc->seidx != 42 && mlc->seidx != 43) { 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; doze = 0;
} }
kick = 0;
seidx = mlc->seidx; seidx = mlc->seidx;
#endif #endif
...@@ -588,7 +586,7 @@ static int hilse_donode (hil_mlc *mlc) { ...@@ -588,7 +586,7 @@ static int hilse_donode (hil_mlc *mlc) {
hil_packet pack; hil_packet pack;
case HILSE_FUNC: case HILSE_FUNC:
if (node->object.func == NULL) break; BUG_ON(node->object.func == NULL);
rc = node->object.func(mlc, node->arg); rc = node->object.func(mlc, node->arg);
nextidx = (rc > 0) ? node->ugly : nextidx = (rc > 0) ? node->ugly :
((rc < 0) ? node->bad : node->good); ((rc < 0) ? node->bad : node->good);
...@@ -674,10 +672,10 @@ static int hilse_donode (hil_mlc *mlc) { ...@@ -674,10 +672,10 @@ static int hilse_donode (hil_mlc *mlc) {
if (!sched_long) goto sched; if (!sched_long) goto sched;
do_gettimeofday(&tv); 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; 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; tv.tv_usec = (mlc->intimeout - tv.tv_usec) * HZ / USEC_PER_SEC;
if (!tv.tv_usec) goto sched; if (!tv.tv_usec) goto sched;
mod_timer(&hil_mlcs_kicker, jiffies + tv.tv_usec); mod_timer(&hil_mlcs_kicker, jiffies + tv.tv_usec);
break; break;
...@@ -837,7 +835,7 @@ static void hil_mlc_serio_close(struct serio *serio) { ...@@ -837,7 +835,7 @@ static void hil_mlc_serio_close(struct serio *serio) {
/* TODO wake up interruptable */ /* 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, .type = SERIO_HIL_MLC,
.proto = SERIO_HIL, .proto = SERIO_HIL,
.extra = SERIO_ANY, .extra = SERIO_ANY,
...@@ -873,6 +871,8 @@ int hil_mlc_register(hil_mlc *mlc) { ...@@ -873,6 +871,8 @@ int hil_mlc_register(hil_mlc *mlc) {
hil_mlc_copy_di_scratch(mlc, i); hil_mlc_copy_di_scratch(mlc, i);
mlc_serio = kzalloc(sizeof(*mlc_serio), GFP_KERNEL); mlc_serio = kzalloc(sizeof(*mlc_serio), GFP_KERNEL);
mlc->serio[i] = mlc_serio; 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->id = hil_mlc_serio_id;
mlc_serio->write = hil_mlc_serio_write; mlc_serio->write = hil_mlc_serio_write;
mlc_serio->open = hil_mlc_serio_open; mlc_serio->open = hil_mlc_serio_open;
......
...@@ -748,7 +748,7 @@ void hp_sdc_kicker (unsigned long data) { ...@@ -748,7 +748,7 @@ void hp_sdc_kicker (unsigned long data) {
#if defined(__hppa__) #if defined(__hppa__)
static struct parisc_device_id hp_sdc_tbl[] = { static const struct parisc_device_id hp_sdc_tbl[] = {
{ {
.hw_type = HPHW_FIO, .hw_type = HPHW_FIO,
.hversion_rev = HVERSION_REV_ANY_ID, .hversion_rev = HVERSION_REV_ANY_ID,
...@@ -817,12 +817,12 @@ static int __init hp_sdc_init(void) ...@@ -817,12 +817,12 @@ static int __init hp_sdc_init(void)
#endif #endif
errstr = "IRQ not available for"; errstr = "IRQ not available for";
if(request_irq(hp_sdc.irq, &hp_sdc_isr, 0, "HP SDC", if (request_irq(hp_sdc.irq, &hp_sdc_isr, IRQF_SHARED|IRQF_SAMPLE_RANDOM,
(void *) hp_sdc.base_io)) goto err1; "HP SDC", &hp_sdc)) goto err1;
errstr = "NMI not available for"; errstr = "NMI not available for";
if (request_irq(hp_sdc.nmi, &hp_sdc_nmisr, 0, "HP SDC NMI", if (request_irq(hp_sdc.nmi, &hp_sdc_nmisr, IRQF_SHARED,
(void *) hp_sdc.base_io)) goto err2; "HP SDC NMI", &hp_sdc)) goto err2;
printk(KERN_INFO PREFIX "HP SDC at 0x%p, IRQ %d (NMI IRQ %d)\n", 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); (void *)hp_sdc.base_io, hp_sdc.irq, hp_sdc.nmi);
...@@ -854,7 +854,7 @@ static int __init hp_sdc_init(void) ...@@ -854,7 +854,7 @@ static int __init hp_sdc_init(void)
hp_sdc.dev_err = 0; hp_sdc.dev_err = 0;
return 0; return 0;
err2: err2:
free_irq(hp_sdc.irq, NULL); free_irq(hp_sdc.irq, &hp_sdc);
err1: err1:
release_region(hp_sdc.data_io, 2); release_region(hp_sdc.data_io, 2);
err0: err0:
...@@ -898,8 +898,8 @@ static void hp_sdc_exit(void) ...@@ -898,8 +898,8 @@ static void hp_sdc_exit(void)
/* Wait until we know this has been processed by the i8042 */ /* Wait until we know this has been processed by the i8042 */
hp_sdc_spin_ibf(); hp_sdc_spin_ibf();
free_irq(hp_sdc.nmi, NULL); free_irq(hp_sdc.nmi, &hp_sdc);
free_irq(hp_sdc.irq, NULL); free_irq(hp_sdc.irq, &hp_sdc);
write_unlock_irq(&hp_sdc.lock); write_unlock_irq(&hp_sdc.lock);
del_timer(&hp_sdc.kicker); del_timer(&hp_sdc.kicker);
......
...@@ -323,11 +323,12 @@ static int __init hp_sdc_mlc_init(void) ...@@ -323,11 +323,12 @@ static int __init hp_sdc_mlc_init(void)
mlc->in = &hp_sdc_mlc_in; mlc->in = &hp_sdc_mlc_in;
mlc->out = &hp_sdc_mlc_out; mlc->out = &hp_sdc_mlc_out;
mlc->priv = &hp_sdc_mlc_priv;
if (hil_mlc_register(mlc)) { if (hil_mlc_register(mlc)) {
printk(KERN_WARNING PREFIX "Failed to register MLC structure with hil_mlc\n"); printk(KERN_WARNING PREFIX "Failed to register MLC structure with hil_mlc\n");
goto err0; goto err0;
} }
mlc->priv = &hp_sdc_mlc_priv;
if (hp_sdc_request_hil_irq(&hp_sdc_mlc_isr)) { if (hp_sdc_request_hil_irq(&hp_sdc_mlc_isr)) {
printk(KERN_WARNING PREFIX "Request for raw HIL ISR hook denied\n"); printk(KERN_WARNING PREFIX "Request for raw HIL ISR hook denied\n");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册