Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 40699
b: refs/heads/master
c: 2b03b60
h: refs/heads/master
i:
  40697: a247853
  40695: ef8b65f
v: v3
  • Loading branch information
Dmitry Torokhov committed Nov 6, 2006
1 parent fba3344 commit 0131d28
Show file tree
Hide file tree
Showing 11 changed files with 235 additions and 93 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 41ad5fbabda0c3930136bb40cfc7a0c23013365f
refs/heads/master: 2b03b60e6b8635fffdd15d5d24943950f2bbf96e
22 changes: 17 additions & 5 deletions trunk/drivers/input/keyboard/amikbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -190,16 +190,16 @@ static int __init amikbd_init(void)
int i, j;

if (!AMIGAHW_PRESENT(AMI_KEYBOARD))
return -EIO;
return -ENODEV;

if (!request_mem_region(CIAA_PHYSADDR-1+0xb00, 0x100, "amikeyb"))
return -EBUSY;

amikbd_dev = input_allocate_device();
if (!amikbd_dev) {
printk(KERN_ERR "amikbd: not enough memory for input device\n");
release_mem_region(CIAA_PHYSADDR - 1 + 0xb00, 0x100);
return -ENOMEM;
err = -ENOMEM;
goto fail1;
}

amikbd_dev->name = "Amiga Keyboard";
Expand Down Expand Up @@ -231,10 +231,22 @@ static int __init amikbd_init(void)
memcpy(key_maps[i], temp_map, sizeof(temp_map));
}
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;

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)
Expand Down
159 changes: 129 additions & 30 deletions trunk/drivers/input/keyboard/atkbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -939,7 +939,7 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv)
atkbd = kzalloc(sizeof(struct atkbd), GFP_KERNEL);
dev = input_allocate_device();
if (!atkbd || !dev)
goto fail;
goto fail1;

atkbd->dev = dev;
ps2_init(&atkbd->ps2dev, serio);
Expand Down Expand Up @@ -967,14 +967,13 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv)

err = serio_open(serio, drv);
if (err)
goto fail;
goto fail2;

if (atkbd->write) {

if (atkbd_probe(atkbd)) {
serio_close(serio);
err = -ENODEV;
goto fail;
goto fail3;
}

atkbd->set = atkbd_select_set(atkbd, atkbd_set, atkbd_extra);
Expand All @@ -988,16 +987,22 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv)
atkbd_set_keycode_table(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);

input_register_device(atkbd->dev);
err = input_register_device(atkbd->dev);
if (err)
goto fail4;

return 0;

fail: serio_set_drvdata(serio, NULL);
input_free_device(dev);
fail4: sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group);
fail3: serio_close(serio);
fail2: serio_set_drvdata(serio, NULL);
fail1: input_free_device(dev);
kfree(atkbd);
return err;
}
Expand Down Expand Up @@ -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)
{
struct input_dev *new_dev;
struct input_dev *old_dev, *new_dev;
unsigned long value;
char *rest;
int err;
unsigned char old_extra, old_set;

if (!atkbd->write)
return -EIO;
Expand All @@ -1147,17 +1154,36 @@ static ssize_t atkbd_set_extra(struct atkbd *atkbd, const char *buf, size_t coun
if (atkbd->extra != value) {
/*
* Since device's properties will change we need to
* unregister old device. But allocate new one first
* to make sure we have it.
* unregister old device. But allocate and register
* 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;
input_unregister_device(atkbd->dev);

atkbd->dev = new_dev;
atkbd->set = atkbd_select_set(atkbd, atkbd->set, value);
atkbd_activate(atkbd);
atkbd_set_keycode_table(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;
}
Expand All @@ -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)
{
struct input_dev *new_dev;
struct input_dev *old_dev, *new_dev;
unsigned long value;
char *rest;
int err;
unsigned char old_scroll;

value = simple_strtoul(buf, &rest, 10);
if (*rest || value > 1)
return -EINVAL;

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;
input_unregister_device(atkbd->dev);

atkbd->dev = new_dev;
atkbd->scroll = value;
atkbd_set_keycode_table(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;
}
Expand All @@ -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)
{
struct input_dev *new_dev;
struct input_dev *old_dev, *new_dev;
unsigned long value;
char *rest;
int err;
unsigned char old_set, old_extra;

if (!atkbd->write)
return -EIO;
Expand All @@ -1209,15 +1255,32 @@ static ssize_t atkbd_set_set(struct atkbd *atkbd, const char *buf, size_t count)
return -EINVAL;

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;
input_unregister_device(atkbd->dev);

atkbd->dev = new_dev;
atkbd->set = atkbd_select_set(atkbd, value, atkbd->extra);
atkbd_activate(atkbd);
atkbd_set_keycode_table(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;
}
Expand All @@ -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)
{
struct input_dev *new_dev;
struct input_dev *old_dev, *new_dev;
unsigned long value;
char *rest;
int err;
unsigned char old_softrepeat, old_softraw;

if (!atkbd->write)
return -EIO;
Expand All @@ -1241,15 +1306,32 @@ static ssize_t atkbd_set_softrepeat(struct atkbd *atkbd, const char *buf, size_t
return -EINVAL;

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;
input_unregister_device(atkbd->dev);

atkbd->dev = new_dev;
atkbd->softrepeat = value;
if (atkbd->softrepeat)
atkbd->softraw = 1;
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;
}
Expand All @@ -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)
{
struct input_dev *new_dev;
struct input_dev *old_dev, *new_dev;
unsigned long value;
char *rest;
int err;
unsigned char old_softraw;

value = simple_strtoul(buf, &rest, 10);
if (*rest || value > 1)
return -EINVAL;

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;
input_unregister_device(atkbd->dev);

atkbd->dev = new_dev;
atkbd->softraw = value;
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;
}
Expand Down
17 changes: 10 additions & 7 deletions trunk/drivers/input/keyboard/corgikbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -291,15 +291,12 @@ static int __init corgikbd_probe(struct platform_device *pdev)
{
struct corgikbd *corgikbd;
struct input_dev *input_dev;
int i;
int i, err = -ENOMEM;

corgikbd = kzalloc(sizeof(struct corgikbd), GFP_KERNEL);
input_dev = input_allocate_device();
if (!corgikbd || !input_dev) {
kfree(corgikbd);
input_free_device(input_dev);
return -ENOMEM;
}
if (!corgikbd || !input_dev)
goto fail;

platform_set_drvdata(pdev, corgikbd);

Expand Down Expand Up @@ -341,7 +338,9 @@ static int __init corgikbd_probe(struct platform_device *pdev)
set_bit(SW_TABLET_MODE, 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));

Expand All @@ -362,6 +361,10 @@ static int __init corgikbd_probe(struct platform_device *pdev)
pxa_gpio_mode(CORGI_GPIO_AK_INT | GPIO_IN);

return 0;

fail: input_free_device(input_dev);
kfree(corgikbd);
return err;
}

static int corgikbd_remove(struct platform_device *pdev)
Expand Down
Loading

0 comments on commit 0131d28

Please sign in to comment.