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: Helge Deller <deller@gmx.de> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
parent
969111e900
commit
3acaf540a3
@ -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] =
|
|||||||
|
|
||||||
#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[] = {
|
|||||||
{ 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 @@
|
|||||||
*
|
*
|
||||||
* 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");
|
|||||||
#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)
|
|||||||
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) {
|
|||||||
#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] = {
|
|||||||
/* 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) {
|
|||||||
#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) {
|
|||||||
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) {
|
|||||||
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) {
|
|||||||
/* 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) {
|
|||||||
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) {
|
|||||||
|
|
||||||
#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)
|
|||||||
#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)
|
|||||||
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)
|
|||||||
/* 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)
|
|||||||
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");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user