mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
Input: ibmasm - convert to dynamic input_dev allocation
Update the ibmasm driver to use the dynamic allocation of input_dev structs to work with the sysfs subsystem. Vojtech: Fixed some problems/bugs in the patch. Dmitry: Fixed some more. Signed-off-by: Vernon Mauery <vernux@us.ibm.com> Signed-off-by: Vojtech Pavlik <vojtech@suse.cz> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
parent
6020bafc9e
commit
736ce43295
@ -141,8 +141,8 @@ struct reverse_heartbeat {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct ibmasm_remote {
|
struct ibmasm_remote {
|
||||||
struct input_dev keybd_dev;
|
struct input_dev *keybd_dev;
|
||||||
struct input_dev mouse_dev;
|
struct input_dev *mouse_dev;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct service_processor {
|
struct service_processor {
|
||||||
@ -157,7 +157,7 @@ struct service_processor {
|
|||||||
char dirname[IBMASM_NAME_SIZE];
|
char dirname[IBMASM_NAME_SIZE];
|
||||||
char devname[IBMASM_NAME_SIZE];
|
char devname[IBMASM_NAME_SIZE];
|
||||||
unsigned int number;
|
unsigned int number;
|
||||||
struct ibmasm_remote *remote;
|
struct ibmasm_remote remote;
|
||||||
int serial_line;
|
int serial_line;
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
};
|
};
|
||||||
|
@ -203,9 +203,9 @@ void ibmasm_handle_mouse_interrupt(struct service_processor *sp,
|
|||||||
|
|
||||||
print_input(&input);
|
print_input(&input);
|
||||||
if (input.type == INPUT_TYPE_MOUSE) {
|
if (input.type == INPUT_TYPE_MOUSE) {
|
||||||
send_mouse_event(&sp->remote->mouse_dev, regs, &input);
|
send_mouse_event(sp->remote.mouse_dev, regs, &input);
|
||||||
} else if (input.type == INPUT_TYPE_KEYBOARD) {
|
} else if (input.type == INPUT_TYPE_KEYBOARD) {
|
||||||
send_keyboard_event(&sp->remote->keybd_dev, regs, &input);
|
send_keyboard_event(sp->remote.keybd_dev, regs, &input);
|
||||||
} else
|
} else
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -217,56 +217,70 @@ void ibmasm_handle_mouse_interrupt(struct service_processor *sp,
|
|||||||
int ibmasm_init_remote_input_dev(struct service_processor *sp)
|
int ibmasm_init_remote_input_dev(struct service_processor *sp)
|
||||||
{
|
{
|
||||||
/* set up the mouse input device */
|
/* set up the mouse input device */
|
||||||
struct ibmasm_remote *remote;
|
struct input_dev *mouse_dev, *keybd_dev;
|
||||||
struct pci_dev *pdev = to_pci_dev(sp->dev);
|
struct pci_dev *pdev = to_pci_dev(sp->dev);
|
||||||
|
int error = -ENOMEM;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
sp->remote = remote = kmalloc(sizeof(*remote), GFP_KERNEL);
|
sp->remote.mouse_dev = mouse_dev = input_allocate_device();
|
||||||
if (!remote)
|
sp->remote.keybd_dev = keybd_dev = input_allocate_device();
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
memset(remote, 0, sizeof(*remote));
|
if (!mouse_dev || !keybd_dev)
|
||||||
|
goto err_free_devices;
|
||||||
|
|
||||||
remote->mouse_dev.private = remote;
|
mouse_dev->id.bustype = BUS_PCI;
|
||||||
init_input_dev(&remote->mouse_dev);
|
mouse_dev->id.vendor = pdev->vendor;
|
||||||
remote->mouse_dev.id.vendor = pdev->vendor;
|
mouse_dev->id.product = pdev->device;
|
||||||
remote->mouse_dev.id.product = pdev->device;
|
mouse_dev->id.version = 1;
|
||||||
remote->mouse_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
|
mouse_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
|
||||||
remote->mouse_dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) |
|
mouse_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) |
|
||||||
BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
|
BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
|
||||||
set_bit(BTN_TOUCH, remote->mouse_dev.keybit);
|
set_bit(BTN_TOUCH, mouse_dev->keybit);
|
||||||
remote->mouse_dev.name = remote_mouse_name;
|
mouse_dev->name = remote_mouse_name;
|
||||||
input_set_abs_params(&remote->mouse_dev, ABS_X, 0, xmax, 0, 0);
|
input_set_abs_params(mouse_dev, ABS_X, 0, xmax, 0, 0);
|
||||||
input_set_abs_params(&remote->mouse_dev, ABS_Y, 0, ymax, 0, 0);
|
input_set_abs_params(mouse_dev, ABS_Y, 0, ymax, 0, 0);
|
||||||
|
|
||||||
remote->keybd_dev.private = remote;
|
mouse_dev->id.bustype = BUS_PCI;
|
||||||
init_input_dev(&remote->keybd_dev);
|
keybd_dev->id.vendor = pdev->vendor;
|
||||||
remote->keybd_dev.id.vendor = pdev->vendor;
|
keybd_dev->id.product = pdev->device;
|
||||||
remote->keybd_dev.id.product = pdev->device;
|
mouse_dev->id.version = 2;
|
||||||
remote->keybd_dev.evbit[0] = BIT(EV_KEY);
|
keybd_dev->evbit[0] = BIT(EV_KEY);
|
||||||
remote->keybd_dev.name = remote_keybd_name;
|
keybd_dev->name = remote_keybd_name;
|
||||||
|
|
||||||
for (i=0; i<XLATE_SIZE; i++) {
|
for (i = 0; i < XLATE_SIZE; i++) {
|
||||||
if (xlate_high[i])
|
if (xlate_high[i])
|
||||||
set_bit(xlate_high[i], remote->keybd_dev.keybit);
|
set_bit(xlate_high[i], keybd_dev->keybit);
|
||||||
if (xlate[i])
|
if (xlate[i])
|
||||||
set_bit(xlate[i], remote->keybd_dev.keybit);
|
set_bit(xlate[i], keybd_dev->keybit);
|
||||||
}
|
}
|
||||||
|
|
||||||
input_register_device(&remote->mouse_dev);
|
error = input_register_device(mouse_dev);
|
||||||
input_register_device(&remote->keybd_dev);
|
if (error)
|
||||||
|
goto err_free_devices;
|
||||||
|
|
||||||
|
error = input_register_device(keybd_dev);
|
||||||
|
if (error)
|
||||||
|
goto err_unregister_mouse_dev;
|
||||||
|
|
||||||
enable_mouse_interrupts(sp);
|
enable_mouse_interrupts(sp);
|
||||||
|
|
||||||
printk(KERN_INFO "ibmasm remote responding to events on RSA card %d\n", sp->number);
|
printk(KERN_INFO "ibmasm remote responding to events on RSA card %d\n", sp->number);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_unregister_mouse_dev:
|
||||||
|
input_unregister_device(mouse_dev);
|
||||||
|
err_free_devices:
|
||||||
|
input_free_device(mouse_dev);
|
||||||
|
input_free_device(keybd_dev);
|
||||||
|
|
||||||
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ibmasm_free_remote_input_dev(struct service_processor *sp)
|
void ibmasm_free_remote_input_dev(struct service_processor *sp)
|
||||||
{
|
{
|
||||||
disable_mouse_interrupts(sp);
|
disable_mouse_interrupts(sp);
|
||||||
input_unregister_device(&sp->remote->keybd_dev);
|
input_unregister_device(sp->remote.mouse_dev);
|
||||||
input_unregister_device(&sp->remote->mouse_dev);
|
input_unregister_device(sp->remote.keybd_dev);
|
||||||
kfree(sp->remote);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user