Commit 2b03b60e authored by Dmitry Torokhov's avatar Dmitry Torokhov

Input: keyboards - handle errors when registering input devices

Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 41ad5fba
...@@ -190,7 +190,7 @@ static int __init amikbd_init(void) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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));
...@@ -438,9 +435,11 @@ static int __init spitzkbd_probe(struct platform_device *dev) ...@@ -438,9 +435,11 @@ static int __init spitzkbd_probe(struct platform_device *dev)
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 = { ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment