mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
Input: keyboards - handle errors when registering input devices
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
parent
41ad5fbabd
commit
2b03b60e6b
@ -190,7 +190,7 @@ static int __init amikbd_init(void)
|
|||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
if (!AMIGAHW_PRESENT(AMI_KEYBOARD))
|
if (!AMIGAHW_PRESENT(AMI_KEYBOARD))
|
||||||
return -EIO;
|
return -ENODEV;
|
||||||
|
|
||||||
if (!request_mem_region(CIAA_PHYSADDR-1+0xb00, 0x100, "amikeyb"))
|
if (!request_mem_region(CIAA_PHYSADDR-1+0xb00, 0x100, "amikeyb"))
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
@ -198,8 +198,8 @@ static int __init amikbd_init(void)
|
|||||||
amikbd_dev = input_allocate_device();
|
amikbd_dev = input_allocate_device();
|
||||||
if (!amikbd_dev) {
|
if (!amikbd_dev) {
|
||||||
printk(KERN_ERR "amikbd: not enough memory for input device\n");
|
printk(KERN_ERR "amikbd: not enough memory for input device\n");
|
||||||
release_mem_region(CIAA_PHYSADDR - 1 + 0xb00, 0x100);
|
err = -ENOMEM;
|
||||||
return -ENOMEM;
|
goto fail1;
|
||||||
}
|
}
|
||||||
|
|
||||||
amikbd_dev->name = "Amiga Keyboard";
|
amikbd_dev->name = "Amiga Keyboard";
|
||||||
@ -231,10 +231,22 @@ static int __init amikbd_init(void)
|
|||||||
memcpy(key_maps[i], temp_map, sizeof(temp_map));
|
memcpy(key_maps[i], temp_map, sizeof(temp_map));
|
||||||
}
|
}
|
||||||
ciaa.cra &= ~0x41; /* serial data in, turn off TA */
|
ciaa.cra &= ~0x41; /* serial data in, turn off TA */
|
||||||
request_irq(IRQ_AMIGA_CIAA_SP, amikbd_interrupt, 0, "amikbd", amikbd_interrupt);
|
if (request_irq(IRQ_AMIGA_CIAA_SP, amikbd_interrupt, 0, "amikbd",
|
||||||
|
amikbd_interrupt)) {
|
||||||
|
err = -EBUSY;
|
||||||
|
goto fail2;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = input_register_device(amikbd_dev);
|
||||||
|
if (err)
|
||||||
|
goto fail3;
|
||||||
|
|
||||||
input_register_device(amikbd_dev);
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
fail3: free_irq(IRQ_AMIGA_CIAA_SP, amikbd_interrupt);
|
||||||
|
fail2: input_free_device(amikbd_dev);
|
||||||
|
fail1: release_mem_region(CIAA_PHYSADDR - 1 + 0xb00, 0x100);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit amikbd_exit(void)
|
static void __exit amikbd_exit(void)
|
||||||
|
@ -939,7 +939,7 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv)
|
|||||||
atkbd = kzalloc(sizeof(struct atkbd), GFP_KERNEL);
|
atkbd = kzalloc(sizeof(struct atkbd), GFP_KERNEL);
|
||||||
dev = input_allocate_device();
|
dev = input_allocate_device();
|
||||||
if (!atkbd || !dev)
|
if (!atkbd || !dev)
|
||||||
goto fail;
|
goto fail1;
|
||||||
|
|
||||||
atkbd->dev = dev;
|
atkbd->dev = dev;
|
||||||
ps2_init(&atkbd->ps2dev, serio);
|
ps2_init(&atkbd->ps2dev, serio);
|
||||||
@ -967,14 +967,13 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv)
|
|||||||
|
|
||||||
err = serio_open(serio, drv);
|
err = serio_open(serio, drv);
|
||||||
if (err)
|
if (err)
|
||||||
goto fail;
|
goto fail2;
|
||||||
|
|
||||||
if (atkbd->write) {
|
if (atkbd->write) {
|
||||||
|
|
||||||
if (atkbd_probe(atkbd)) {
|
if (atkbd_probe(atkbd)) {
|
||||||
serio_close(serio);
|
|
||||||
err = -ENODEV;
|
err = -ENODEV;
|
||||||
goto fail;
|
goto fail3;
|
||||||
}
|
}
|
||||||
|
|
||||||
atkbd->set = atkbd_select_set(atkbd, atkbd_set, atkbd_extra);
|
atkbd->set = atkbd_select_set(atkbd, atkbd_set, atkbd_extra);
|
||||||
@ -988,16 +987,22 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv)
|
|||||||
atkbd_set_keycode_table(atkbd);
|
atkbd_set_keycode_table(atkbd);
|
||||||
atkbd_set_device_attrs(atkbd);
|
atkbd_set_device_attrs(atkbd);
|
||||||
|
|
||||||
sysfs_create_group(&serio->dev.kobj, &atkbd_attribute_group);
|
err = sysfs_create_group(&serio->dev.kobj, &atkbd_attribute_group);
|
||||||
|
if (err)
|
||||||
|
goto fail3;
|
||||||
|
|
||||||
atkbd_enable(atkbd);
|
atkbd_enable(atkbd);
|
||||||
|
|
||||||
input_register_device(atkbd->dev);
|
err = input_register_device(atkbd->dev);
|
||||||
|
if (err)
|
||||||
|
goto fail4;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail: serio_set_drvdata(serio, NULL);
|
fail4: sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group);
|
||||||
input_free_device(dev);
|
fail3: serio_close(serio);
|
||||||
|
fail2: serio_set_drvdata(serio, NULL);
|
||||||
|
fail1: input_free_device(dev);
|
||||||
kfree(atkbd);
|
kfree(atkbd);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@ -1133,9 +1138,11 @@ static ssize_t atkbd_show_extra(struct atkbd *atkbd, char *buf)
|
|||||||
|
|
||||||
static ssize_t atkbd_set_extra(struct atkbd *atkbd, const char *buf, size_t count)
|
static ssize_t atkbd_set_extra(struct atkbd *atkbd, const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
struct input_dev *new_dev;
|
struct input_dev *old_dev, *new_dev;
|
||||||
unsigned long value;
|
unsigned long value;
|
||||||
char *rest;
|
char *rest;
|
||||||
|
int err;
|
||||||
|
unsigned char old_extra, old_set;
|
||||||
|
|
||||||
if (!atkbd->write)
|
if (!atkbd->write)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
@ -1147,17 +1154,36 @@ static ssize_t atkbd_set_extra(struct atkbd *atkbd, const char *buf, size_t coun
|
|||||||
if (atkbd->extra != value) {
|
if (atkbd->extra != value) {
|
||||||
/*
|
/*
|
||||||
* Since device's properties will change we need to
|
* Since device's properties will change we need to
|
||||||
* unregister old device. But allocate new one first
|
* unregister old device. But allocate and register
|
||||||
* to make sure we have it.
|
* new one first to make sure we have it.
|
||||||
*/
|
*/
|
||||||
if (!(new_dev = input_allocate_device()))
|
old_dev = atkbd->dev;
|
||||||
|
old_extra = atkbd->extra;
|
||||||
|
old_set = atkbd->set;
|
||||||
|
|
||||||
|
new_dev = input_allocate_device();
|
||||||
|
if (!new_dev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
input_unregister_device(atkbd->dev);
|
|
||||||
atkbd->dev = new_dev;
|
atkbd->dev = new_dev;
|
||||||
atkbd->set = atkbd_select_set(atkbd, atkbd->set, value);
|
atkbd->set = atkbd_select_set(atkbd, atkbd->set, value);
|
||||||
atkbd_activate(atkbd);
|
atkbd_activate(atkbd);
|
||||||
|
atkbd_set_keycode_table(atkbd);
|
||||||
atkbd_set_device_attrs(atkbd);
|
atkbd_set_device_attrs(atkbd);
|
||||||
input_register_device(atkbd->dev);
|
|
||||||
|
err = input_register_device(atkbd->dev);
|
||||||
|
if (err) {
|
||||||
|
input_free_device(new_dev);
|
||||||
|
|
||||||
|
atkbd->dev = old_dev;
|
||||||
|
atkbd->set = atkbd_select_set(atkbd, old_set, old_extra);
|
||||||
|
atkbd_set_keycode_table(atkbd);
|
||||||
|
atkbd_set_device_attrs(atkbd);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
input_unregister_device(old_dev);
|
||||||
|
|
||||||
}
|
}
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
@ -1169,23 +1195,41 @@ static ssize_t atkbd_show_scroll(struct atkbd *atkbd, char *buf)
|
|||||||
|
|
||||||
static ssize_t atkbd_set_scroll(struct atkbd *atkbd, const char *buf, size_t count)
|
static ssize_t atkbd_set_scroll(struct atkbd *atkbd, const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
struct input_dev *new_dev;
|
struct input_dev *old_dev, *new_dev;
|
||||||
unsigned long value;
|
unsigned long value;
|
||||||
char *rest;
|
char *rest;
|
||||||
|
int err;
|
||||||
|
unsigned char old_scroll;
|
||||||
|
|
||||||
value = simple_strtoul(buf, &rest, 10);
|
value = simple_strtoul(buf, &rest, 10);
|
||||||
if (*rest || value > 1)
|
if (*rest || value > 1)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (atkbd->scroll != value) {
|
if (atkbd->scroll != value) {
|
||||||
if (!(new_dev = input_allocate_device()))
|
old_dev = atkbd->dev;
|
||||||
|
old_scroll = atkbd->scroll;
|
||||||
|
|
||||||
|
new_dev = input_allocate_device();
|
||||||
|
if (!new_dev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
input_unregister_device(atkbd->dev);
|
|
||||||
atkbd->dev = new_dev;
|
atkbd->dev = new_dev;
|
||||||
atkbd->scroll = value;
|
atkbd->scroll = value;
|
||||||
atkbd_set_keycode_table(atkbd);
|
atkbd_set_keycode_table(atkbd);
|
||||||
atkbd_set_device_attrs(atkbd);
|
atkbd_set_device_attrs(atkbd);
|
||||||
input_register_device(atkbd->dev);
|
|
||||||
|
err = input_register_device(atkbd->dev);
|
||||||
|
if (err) {
|
||||||
|
input_free_device(new_dev);
|
||||||
|
|
||||||
|
atkbd->scroll = old_scroll;
|
||||||
|
atkbd->dev = old_dev;
|
||||||
|
atkbd_set_keycode_table(atkbd);
|
||||||
|
atkbd_set_device_attrs(atkbd);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
input_unregister_device(old_dev);
|
||||||
}
|
}
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
@ -1197,9 +1241,11 @@ static ssize_t atkbd_show_set(struct atkbd *atkbd, char *buf)
|
|||||||
|
|
||||||
static ssize_t atkbd_set_set(struct atkbd *atkbd, const char *buf, size_t count)
|
static ssize_t atkbd_set_set(struct atkbd *atkbd, const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
struct input_dev *new_dev;
|
struct input_dev *old_dev, *new_dev;
|
||||||
unsigned long value;
|
unsigned long value;
|
||||||
char *rest;
|
char *rest;
|
||||||
|
int err;
|
||||||
|
unsigned char old_set, old_extra;
|
||||||
|
|
||||||
if (!atkbd->write)
|
if (!atkbd->write)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
@ -1209,15 +1255,32 @@ static ssize_t atkbd_set_set(struct atkbd *atkbd, const char *buf, size_t count)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (atkbd->set != value) {
|
if (atkbd->set != value) {
|
||||||
if (!(new_dev = input_allocate_device()))
|
old_dev = atkbd->dev;
|
||||||
|
old_extra = atkbd->extra;
|
||||||
|
old_set = atkbd->set;
|
||||||
|
|
||||||
|
new_dev = input_allocate_device();
|
||||||
|
if (!new_dev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
input_unregister_device(atkbd->dev);
|
|
||||||
atkbd->dev = new_dev;
|
atkbd->dev = new_dev;
|
||||||
atkbd->set = atkbd_select_set(atkbd, value, atkbd->extra);
|
atkbd->set = atkbd_select_set(atkbd, value, atkbd->extra);
|
||||||
atkbd_activate(atkbd);
|
atkbd_activate(atkbd);
|
||||||
atkbd_set_keycode_table(atkbd);
|
atkbd_set_keycode_table(atkbd);
|
||||||
atkbd_set_device_attrs(atkbd);
|
atkbd_set_device_attrs(atkbd);
|
||||||
input_register_device(atkbd->dev);
|
|
||||||
|
err = input_register_device(atkbd->dev);
|
||||||
|
if (err) {
|
||||||
|
input_free_device(new_dev);
|
||||||
|
|
||||||
|
atkbd->dev = old_dev;
|
||||||
|
atkbd->set = atkbd_select_set(atkbd, old_set, old_extra);
|
||||||
|
atkbd_set_keycode_table(atkbd);
|
||||||
|
atkbd_set_device_attrs(atkbd);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
input_unregister_device(old_dev);
|
||||||
}
|
}
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
@ -1229,9 +1292,11 @@ static ssize_t atkbd_show_softrepeat(struct atkbd *atkbd, char *buf)
|
|||||||
|
|
||||||
static ssize_t atkbd_set_softrepeat(struct atkbd *atkbd, const char *buf, size_t count)
|
static ssize_t atkbd_set_softrepeat(struct atkbd *atkbd, const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
struct input_dev *new_dev;
|
struct input_dev *old_dev, *new_dev;
|
||||||
unsigned long value;
|
unsigned long value;
|
||||||
char *rest;
|
char *rest;
|
||||||
|
int err;
|
||||||
|
unsigned char old_softrepeat, old_softraw;
|
||||||
|
|
||||||
if (!atkbd->write)
|
if (!atkbd->write)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
@ -1241,15 +1306,32 @@ static ssize_t atkbd_set_softrepeat(struct atkbd *atkbd, const char *buf, size_t
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (atkbd->softrepeat != value) {
|
if (atkbd->softrepeat != value) {
|
||||||
if (!(new_dev = input_allocate_device()))
|
old_dev = atkbd->dev;
|
||||||
|
old_softrepeat = atkbd->softrepeat;
|
||||||
|
old_softraw = atkbd->softraw;
|
||||||
|
|
||||||
|
new_dev = input_allocate_device();
|
||||||
|
if (!new_dev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
input_unregister_device(atkbd->dev);
|
|
||||||
atkbd->dev = new_dev;
|
atkbd->dev = new_dev;
|
||||||
atkbd->softrepeat = value;
|
atkbd->softrepeat = value;
|
||||||
if (atkbd->softrepeat)
|
if (atkbd->softrepeat)
|
||||||
atkbd->softraw = 1;
|
atkbd->softraw = 1;
|
||||||
atkbd_set_device_attrs(atkbd);
|
atkbd_set_device_attrs(atkbd);
|
||||||
input_register_device(atkbd->dev);
|
|
||||||
|
err = input_register_device(atkbd->dev);
|
||||||
|
if (err) {
|
||||||
|
input_free_device(new_dev);
|
||||||
|
|
||||||
|
atkbd->dev = old_dev;
|
||||||
|
atkbd->softrepeat = old_softrepeat;
|
||||||
|
atkbd->softraw = old_softraw;
|
||||||
|
atkbd_set_device_attrs(atkbd);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
input_unregister_device(old_dev);
|
||||||
}
|
}
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
@ -1262,22 +1344,39 @@ static ssize_t atkbd_show_softraw(struct atkbd *atkbd, char *buf)
|
|||||||
|
|
||||||
static ssize_t atkbd_set_softraw(struct atkbd *atkbd, const char *buf, size_t count)
|
static ssize_t atkbd_set_softraw(struct atkbd *atkbd, const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
struct input_dev *new_dev;
|
struct input_dev *old_dev, *new_dev;
|
||||||
unsigned long value;
|
unsigned long value;
|
||||||
char *rest;
|
char *rest;
|
||||||
|
int err;
|
||||||
|
unsigned char old_softraw;
|
||||||
|
|
||||||
value = simple_strtoul(buf, &rest, 10);
|
value = simple_strtoul(buf, &rest, 10);
|
||||||
if (*rest || value > 1)
|
if (*rest || value > 1)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (atkbd->softraw != value) {
|
if (atkbd->softraw != value) {
|
||||||
if (!(new_dev = input_allocate_device()))
|
old_dev = atkbd->dev;
|
||||||
|
old_softraw = atkbd->softraw;
|
||||||
|
|
||||||
|
new_dev = input_allocate_device();
|
||||||
|
if (!new_dev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
input_unregister_device(atkbd->dev);
|
|
||||||
atkbd->dev = new_dev;
|
atkbd->dev = new_dev;
|
||||||
atkbd->softraw = value;
|
atkbd->softraw = value;
|
||||||
atkbd_set_device_attrs(atkbd);
|
atkbd_set_device_attrs(atkbd);
|
||||||
input_register_device(atkbd->dev);
|
|
||||||
|
err = input_register_device(atkbd->dev);
|
||||||
|
if (err) {
|
||||||
|
input_free_device(new_dev);
|
||||||
|
|
||||||
|
atkbd->dev = old_dev;
|
||||||
|
atkbd->softraw = old_softraw;
|
||||||
|
atkbd_set_device_attrs(atkbd);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
input_unregister_device(old_dev);
|
||||||
}
|
}
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
@ -291,15 +291,12 @@ static int __init corgikbd_probe(struct platform_device *pdev)
|
|||||||
{
|
{
|
||||||
struct corgikbd *corgikbd;
|
struct corgikbd *corgikbd;
|
||||||
struct input_dev *input_dev;
|
struct input_dev *input_dev;
|
||||||
int i;
|
int i, err = -ENOMEM;
|
||||||
|
|
||||||
corgikbd = kzalloc(sizeof(struct corgikbd), GFP_KERNEL);
|
corgikbd = kzalloc(sizeof(struct corgikbd), GFP_KERNEL);
|
||||||
input_dev = input_allocate_device();
|
input_dev = input_allocate_device();
|
||||||
if (!corgikbd || !input_dev) {
|
if (!corgikbd || !input_dev)
|
||||||
kfree(corgikbd);
|
goto fail;
|
||||||
input_free_device(input_dev);
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
platform_set_drvdata(pdev, corgikbd);
|
platform_set_drvdata(pdev, corgikbd);
|
||||||
|
|
||||||
@ -341,7 +338,9 @@ static int __init corgikbd_probe(struct platform_device *pdev)
|
|||||||
set_bit(SW_TABLET_MODE, input_dev->swbit);
|
set_bit(SW_TABLET_MODE, input_dev->swbit);
|
||||||
set_bit(SW_HEADPHONE_INSERT, input_dev->swbit);
|
set_bit(SW_HEADPHONE_INSERT, input_dev->swbit);
|
||||||
|
|
||||||
input_register_device(corgikbd->input);
|
err = input_register_device(corgikbd->input);
|
||||||
|
if (err)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
mod_timer(&corgikbd->htimer, jiffies + msecs_to_jiffies(HINGE_SCAN_INTERVAL));
|
mod_timer(&corgikbd->htimer, jiffies + msecs_to_jiffies(HINGE_SCAN_INTERVAL));
|
||||||
|
|
||||||
@ -362,6 +361,10 @@ static int __init corgikbd_probe(struct platform_device *pdev)
|
|||||||
pxa_gpio_mode(CORGI_GPIO_AK_INT | GPIO_IN);
|
pxa_gpio_mode(CORGI_GPIO_AK_INT | GPIO_IN);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
fail: input_free_device(input_dev);
|
||||||
|
kfree(corgikbd);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int corgikbd_remove(struct platform_device *pdev)
|
static int corgikbd_remove(struct platform_device *pdev)
|
||||||
|
@ -651,7 +651,7 @@ lkkbd_connect (struct serio *serio, struct serio_driver *drv)
|
|||||||
input_dev = input_allocate_device ();
|
input_dev = input_allocate_device ();
|
||||||
if (!lk || !input_dev) {
|
if (!lk || !input_dev) {
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
goto fail;
|
goto fail1;
|
||||||
}
|
}
|
||||||
|
|
||||||
lk->serio = serio;
|
lk->serio = serio;
|
||||||
@ -696,15 +696,19 @@ lkkbd_connect (struct serio *serio, struct serio_driver *drv)
|
|||||||
|
|
||||||
err = serio_open (serio, drv);
|
err = serio_open (serio, drv);
|
||||||
if (err)
|
if (err)
|
||||||
goto fail;
|
goto fail2;
|
||||||
|
|
||||||
|
err = input_register_device (lk->dev);
|
||||||
|
if (err)
|
||||||
|
goto fail3;
|
||||||
|
|
||||||
input_register_device (lk->dev);
|
|
||||||
lk->serio->write (lk->serio, LK_CMD_POWERCYCLE_RESET);
|
lk->serio->write (lk->serio, LK_CMD_POWERCYCLE_RESET);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail: serio_set_drvdata (serio, NULL);
|
fail3: serio_close (serio);
|
||||||
input_free_device (input_dev);
|
fail2: serio_set_drvdata (serio, NULL);
|
||||||
|
fail1: input_free_device (input_dev);
|
||||||
kfree (lk);
|
kfree (lk);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -193,22 +193,22 @@ static int locomokbd_probe(struct locomo_dev *dev)
|
|||||||
{
|
{
|
||||||
struct locomokbd *locomokbd;
|
struct locomokbd *locomokbd;
|
||||||
struct input_dev *input_dev;
|
struct input_dev *input_dev;
|
||||||
int i, ret;
|
int i, err;
|
||||||
|
|
||||||
locomokbd = kzalloc(sizeof(struct locomokbd), GFP_KERNEL);
|
locomokbd = kzalloc(sizeof(struct locomokbd), GFP_KERNEL);
|
||||||
input_dev = input_allocate_device();
|
input_dev = input_allocate_device();
|
||||||
if (!locomokbd || !input_dev) {
|
if (!locomokbd || !input_dev) {
|
||||||
ret = -ENOMEM;
|
err = -ENOMEM;
|
||||||
goto free;
|
goto err_free_mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* try and claim memory region */
|
/* try and claim memory region */
|
||||||
if (!request_mem_region((unsigned long) dev->mapbase,
|
if (!request_mem_region((unsigned long) dev->mapbase,
|
||||||
dev->length,
|
dev->length,
|
||||||
LOCOMO_DRIVER_NAME(dev))) {
|
LOCOMO_DRIVER_NAME(dev))) {
|
||||||
ret = -EBUSY;
|
err = -EBUSY;
|
||||||
printk(KERN_ERR "locomokbd: Can't acquire access to io memory for keyboard\n");
|
printk(KERN_ERR "locomokbd: Can't acquire access to io memory for keyboard\n");
|
||||||
goto free;
|
goto err_free_mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
locomokbd->ldev = dev;
|
locomokbd->ldev = dev;
|
||||||
@ -244,24 +244,28 @@ static int locomokbd_probe(struct locomo_dev *dev)
|
|||||||
clear_bit(0, input_dev->keybit);
|
clear_bit(0, input_dev->keybit);
|
||||||
|
|
||||||
/* attempt to get the interrupt */
|
/* attempt to get the interrupt */
|
||||||
ret = request_irq(dev->irq[0], locomokbd_interrupt, 0, "locomokbd", locomokbd);
|
err = request_irq(dev->irq[0], locomokbd_interrupt, 0, "locomokbd", locomokbd);
|
||||||
if (ret) {
|
if (err) {
|
||||||
printk(KERN_ERR "locomokbd: Can't get irq for keyboard\n");
|
printk(KERN_ERR "locomokbd: Can't get irq for keyboard\n");
|
||||||
goto out;
|
goto err_release_region;
|
||||||
}
|
}
|
||||||
|
|
||||||
input_register_device(locomokbd->input);
|
err = input_register_device(locomokbd->input);
|
||||||
|
if (err)
|
||||||
|
goto err_free_irq;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out:
|
err_free_irq:
|
||||||
|
free_irq(dev->irq[0], locomokbd);
|
||||||
|
err_release_region:
|
||||||
release_mem_region((unsigned long) dev->mapbase, dev->length);
|
release_mem_region((unsigned long) dev->mapbase, dev->length);
|
||||||
locomo_set_drvdata(dev, NULL);
|
locomo_set_drvdata(dev, NULL);
|
||||||
free:
|
err_free_mem:
|
||||||
input_free_device(input_dev);
|
input_free_device(input_dev);
|
||||||
kfree(locomokbd);
|
kfree(locomokbd);
|
||||||
|
|
||||||
return ret;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int locomokbd_remove(struct locomo_dev *dev)
|
static int locomokbd_remove(struct locomo_dev *dev)
|
||||||
|
@ -94,13 +94,13 @@ static int dc_kbd_connect(struct maple_device *dev)
|
|||||||
struct input_dev *input_dev;
|
struct input_dev *input_dev;
|
||||||
unsigned long data = be32_to_cpu(dev->devinfo.function_data[0]);
|
unsigned long data = be32_to_cpu(dev->devinfo.function_data[0]);
|
||||||
int i;
|
int i;
|
||||||
|
int err;
|
||||||
|
|
||||||
dev->private_data = kbd = kzalloc(sizeof(struct dc_kbd), GFP_KERNEL);
|
dev->private_data = kbd = kzalloc(sizeof(struct dc_kbd), GFP_KERNEL);
|
||||||
input_dev = input_allocate_device();
|
input_dev = input_allocate_device();
|
||||||
if (!kbd || !input_dev) {
|
if (!kbd || !input_dev) {
|
||||||
kfree(kbd);
|
err = -ENOMEM;
|
||||||
input_free_device(input_dev);
|
goto fail;
|
||||||
return -ENOMEM;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
kbd->dev = input_dev;
|
kbd->dev = input_dev;
|
||||||
@ -113,10 +113,16 @@ static int dc_kbd_connect(struct maple_device *dev)
|
|||||||
set_bit(dc_kbd_keycode[i], input_dev->keybit);
|
set_bit(dc_kbd_keycode[i], input_dev->keybit);
|
||||||
clear_bit(0, input_dev->keybit);
|
clear_bit(0, input_dev->keybit);
|
||||||
|
|
||||||
input_register_device(kbd->dev);
|
err = input_register_device(kbd->dev);
|
||||||
|
if (err)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
maple_getcond_callback(dev, dc_kbd_callback, 1, MAPLE_FUNC_KEYBOARD);
|
maple_getcond_callback(dev, dc_kbd_callback, 1, MAPLE_FUNC_KEYBOARD);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
fail: input_free_device(input_dev);
|
||||||
|
kfree(kbd);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ static int nkbd_connect(struct serio *serio, struct serio_driver *drv)
|
|||||||
nkbd = kzalloc(sizeof(struct nkbd), GFP_KERNEL);
|
nkbd = kzalloc(sizeof(struct nkbd), GFP_KERNEL);
|
||||||
input_dev = input_allocate_device();
|
input_dev = input_allocate_device();
|
||||||
if (!nkbd || !input_dev)
|
if (!nkbd || !input_dev)
|
||||||
goto fail;
|
goto fail1;
|
||||||
|
|
||||||
nkbd->serio = serio;
|
nkbd->serio = serio;
|
||||||
nkbd->dev = input_dev;
|
nkbd->dev = input_dev;
|
||||||
@ -119,13 +119,17 @@ static int nkbd_connect(struct serio *serio, struct serio_driver *drv)
|
|||||||
|
|
||||||
err = serio_open(serio, drv);
|
err = serio_open(serio, drv);
|
||||||
if (err)
|
if (err)
|
||||||
goto fail;
|
goto fail2;
|
||||||
|
|
||||||
|
err = input_register_device(nkbd->dev);
|
||||||
|
if (err)
|
||||||
|
goto fail3;
|
||||||
|
|
||||||
input_register_device(nkbd->dev);
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail: serio_set_drvdata(serio, NULL);
|
fail3: serio_close(serio);
|
||||||
input_free_device(input_dev);
|
fail2: serio_set_drvdata(serio, NULL);
|
||||||
|
fail1: input_free_device(input_dev);
|
||||||
kfree(nkbd);
|
kfree(nkbd);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -346,17 +346,12 @@ static int __init spitzkbd_probe(struct platform_device *dev)
|
|||||||
{
|
{
|
||||||
struct spitzkbd *spitzkbd;
|
struct spitzkbd *spitzkbd;
|
||||||
struct input_dev *input_dev;
|
struct input_dev *input_dev;
|
||||||
int i;
|
int i, err = -ENOMEM;
|
||||||
|
|
||||||
spitzkbd = kzalloc(sizeof(struct spitzkbd), GFP_KERNEL);
|
spitzkbd = kzalloc(sizeof(struct spitzkbd), GFP_KERNEL);
|
||||||
if (!spitzkbd)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
input_dev = input_allocate_device();
|
input_dev = input_allocate_device();
|
||||||
if (!input_dev) {
|
if (!spitzkbd || !input_dev)
|
||||||
kfree(spitzkbd);
|
goto fail;
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
platform_set_drvdata(dev, spitzkbd);
|
platform_set_drvdata(dev, spitzkbd);
|
||||||
strcpy(spitzkbd->phys, "spitzkbd/input0");
|
strcpy(spitzkbd->phys, "spitzkbd/input0");
|
||||||
@ -400,7 +395,9 @@ static int __init spitzkbd_probe(struct platform_device *dev)
|
|||||||
set_bit(SW_TABLET_MODE, input_dev->swbit);
|
set_bit(SW_TABLET_MODE, input_dev->swbit);
|
||||||
set_bit(SW_HEADPHONE_INSERT, input_dev->swbit);
|
set_bit(SW_HEADPHONE_INSERT, input_dev->swbit);
|
||||||
|
|
||||||
input_register_device(input_dev);
|
err = input_register_device(input_dev);
|
||||||
|
if (err)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
mod_timer(&spitzkbd->htimer, jiffies + msecs_to_jiffies(HINGE_SCAN_INTERVAL));
|
mod_timer(&spitzkbd->htimer, jiffies + msecs_to_jiffies(HINGE_SCAN_INTERVAL));
|
||||||
|
|
||||||
@ -434,13 +431,15 @@ static int __init spitzkbd_probe(struct platform_device *dev)
|
|||||||
request_irq(SPITZ_IRQ_GPIO_SWB, spitzkbd_hinge_isr,
|
request_irq(SPITZ_IRQ_GPIO_SWB, spitzkbd_hinge_isr,
|
||||||
IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
|
IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
|
||||||
"Spitzkbd SWB", spitzkbd);
|
"Spitzkbd SWB", spitzkbd);
|
||||||
request_irq(SPITZ_IRQ_GPIO_AK_INT, spitzkbd_hinge_isr,
|
request_irq(SPITZ_IRQ_GPIO_AK_INT, spitzkbd_hinge_isr,
|
||||||
IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
|
IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
|
||||||
"Spitzkbd HP", spitzkbd);
|
"Spitzkbd HP", spitzkbd);
|
||||||
|
|
||||||
printk(KERN_INFO "input: Spitz Keyboard Registered\n");
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
fail: input_free_device(input_dev);
|
||||||
|
kfree(spitzkbd);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int spitzkbd_remove(struct platform_device *dev)
|
static int spitzkbd_remove(struct platform_device *dev)
|
||||||
@ -474,6 +473,7 @@ static struct platform_driver spitzkbd_driver = {
|
|||||||
.resume = spitzkbd_resume,
|
.resume = spitzkbd_resume,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "spitz-keyboard",
|
.name = "spitz-keyboard",
|
||||||
|
.owner = THIS_MODULE,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -243,7 +243,7 @@ static int sunkbd_connect(struct serio *serio, struct serio_driver *drv)
|
|||||||
sunkbd = kzalloc(sizeof(struct sunkbd), GFP_KERNEL);
|
sunkbd = kzalloc(sizeof(struct sunkbd), GFP_KERNEL);
|
||||||
input_dev = input_allocate_device();
|
input_dev = input_allocate_device();
|
||||||
if (!sunkbd || !input_dev)
|
if (!sunkbd || !input_dev)
|
||||||
goto fail;
|
goto fail1;
|
||||||
|
|
||||||
sunkbd->serio = serio;
|
sunkbd->serio = serio;
|
||||||
sunkbd->dev = input_dev;
|
sunkbd->dev = input_dev;
|
||||||
@ -255,11 +255,11 @@ static int sunkbd_connect(struct serio *serio, struct serio_driver *drv)
|
|||||||
|
|
||||||
err = serio_open(serio, drv);
|
err = serio_open(serio, drv);
|
||||||
if (err)
|
if (err)
|
||||||
goto fail;
|
goto fail2;
|
||||||
|
|
||||||
if (sunkbd_initialize(sunkbd) < 0) {
|
if (sunkbd_initialize(sunkbd) < 0) {
|
||||||
serio_close(serio);
|
err = -ENODEV;
|
||||||
goto fail;
|
goto fail3;
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(sunkbd->name, sizeof(sunkbd->name), "Sun Type %d keyboard", sunkbd->type);
|
snprintf(sunkbd->name, sizeof(sunkbd->name), "Sun Type %d keyboard", sunkbd->type);
|
||||||
@ -287,11 +287,17 @@ static int sunkbd_connect(struct serio *serio, struct serio_driver *drv)
|
|||||||
clear_bit(0, input_dev->keybit);
|
clear_bit(0, input_dev->keybit);
|
||||||
|
|
||||||
sunkbd_enable(sunkbd, 1);
|
sunkbd_enable(sunkbd, 1);
|
||||||
input_register_device(sunkbd->dev);
|
|
||||||
|
err = input_register_device(sunkbd->dev);
|
||||||
|
if (err)
|
||||||
|
goto fail4;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail: serio_set_drvdata(serio, NULL);
|
fail4: sunkbd_enable(sunkbd, 0);
|
||||||
input_free_device(input_dev);
|
fail3: serio_close(serio);
|
||||||
|
fail2: serio_set_drvdata(serio, NULL);
|
||||||
|
fail1: input_free_device(input_dev);
|
||||||
kfree(sunkbd);
|
kfree(sunkbd);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -95,7 +95,7 @@ static int xtkbd_connect(struct serio *serio, struct serio_driver *drv)
|
|||||||
xtkbd = kmalloc(sizeof(struct xtkbd), GFP_KERNEL);
|
xtkbd = kmalloc(sizeof(struct xtkbd), GFP_KERNEL);
|
||||||
input_dev = input_allocate_device();
|
input_dev = input_allocate_device();
|
||||||
if (!xtkbd || !input_dev)
|
if (!xtkbd || !input_dev)
|
||||||
goto fail;
|
goto fail1;
|
||||||
|
|
||||||
xtkbd->serio = serio;
|
xtkbd->serio = serio;
|
||||||
xtkbd->dev = input_dev;
|
xtkbd->dev = input_dev;
|
||||||
@ -124,13 +124,17 @@ static int xtkbd_connect(struct serio *serio, struct serio_driver *drv)
|
|||||||
|
|
||||||
err = serio_open(serio, drv);
|
err = serio_open(serio, drv);
|
||||||
if (err)
|
if (err)
|
||||||
goto fail;
|
goto fail2;
|
||||||
|
|
||||||
|
err = input_register_device(xtkbd->dev);
|
||||||
|
if (err)
|
||||||
|
goto fail3;
|
||||||
|
|
||||||
input_register_device(xtkbd->dev);
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail: serio_set_drvdata(serio, NULL);
|
fail3: serio_close(serio);
|
||||||
input_free_device(input_dev);
|
fail2: serio_set_drvdata(serio, NULL);
|
||||||
|
fail1: input_free_device(input_dev);
|
||||||
kfree(xtkbd);
|
kfree(xtkbd);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user