mirror of https://gitee.com/openkylin/linux.git
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 input_dev keybd_dev;
|
||||
struct input_dev mouse_dev;
|
||||
struct input_dev *keybd_dev;
|
||||
struct input_dev *mouse_dev;
|
||||
};
|
||||
|
||||
struct service_processor {
|
||||
|
@ -157,7 +157,7 @@ struct service_processor {
|
|||
char dirname[IBMASM_NAME_SIZE];
|
||||
char devname[IBMASM_NAME_SIZE];
|
||||
unsigned int number;
|
||||
struct ibmasm_remote *remote;
|
||||
struct ibmasm_remote remote;
|
||||
int serial_line;
|
||||
struct device *dev;
|
||||
};
|
||||
|
|
|
@ -203,9 +203,9 @@ void ibmasm_handle_mouse_interrupt(struct service_processor *sp,
|
|||
|
||||
print_input(&input);
|
||||
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) {
|
||||
send_keyboard_event(&sp->remote->keybd_dev, regs, &input);
|
||||
send_keyboard_event(sp->remote.keybd_dev, regs, &input);
|
||||
} else
|
||||
break;
|
||||
|
||||
|
@ -217,56 +217,70 @@ void ibmasm_handle_mouse_interrupt(struct service_processor *sp,
|
|||
int ibmasm_init_remote_input_dev(struct service_processor *sp)
|
||||
{
|
||||
/* 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);
|
||||
int error = -ENOMEM;
|
||||
int i;
|
||||
|
||||
sp->remote = remote = kmalloc(sizeof(*remote), GFP_KERNEL);
|
||||
if (!remote)
|
||||
return -ENOMEM;
|
||||
sp->remote.mouse_dev = mouse_dev = input_allocate_device();
|
||||
sp->remote.keybd_dev = keybd_dev = input_allocate_device();
|
||||
|
||||
memset(remote, 0, sizeof(*remote));
|
||||
if (!mouse_dev || !keybd_dev)
|
||||
goto err_free_devices;
|
||||
|
||||
remote->mouse_dev.private = remote;
|
||||
init_input_dev(&remote->mouse_dev);
|
||||
remote->mouse_dev.id.vendor = pdev->vendor;
|
||||
remote->mouse_dev.id.product = pdev->device;
|
||||
remote->mouse_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
|
||||
remote->mouse_dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) |
|
||||
mouse_dev->id.bustype = BUS_PCI;
|
||||
mouse_dev->id.vendor = pdev->vendor;
|
||||
mouse_dev->id.product = pdev->device;
|
||||
mouse_dev->id.version = 1;
|
||||
mouse_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
|
||||
mouse_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) |
|
||||
BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
|
||||
set_bit(BTN_TOUCH, remote->mouse_dev.keybit);
|
||||
remote->mouse_dev.name = remote_mouse_name;
|
||||
input_set_abs_params(&remote->mouse_dev, ABS_X, 0, xmax, 0, 0);
|
||||
input_set_abs_params(&remote->mouse_dev, ABS_Y, 0, ymax, 0, 0);
|
||||
set_bit(BTN_TOUCH, mouse_dev->keybit);
|
||||
mouse_dev->name = remote_mouse_name;
|
||||
input_set_abs_params(mouse_dev, ABS_X, 0, xmax, 0, 0);
|
||||
input_set_abs_params(mouse_dev, ABS_Y, 0, ymax, 0, 0);
|
||||
|
||||
remote->keybd_dev.private = remote;
|
||||
init_input_dev(&remote->keybd_dev);
|
||||
remote->keybd_dev.id.vendor = pdev->vendor;
|
||||
remote->keybd_dev.id.product = pdev->device;
|
||||
remote->keybd_dev.evbit[0] = BIT(EV_KEY);
|
||||
remote->keybd_dev.name = remote_keybd_name;
|
||||
mouse_dev->id.bustype = BUS_PCI;
|
||||
keybd_dev->id.vendor = pdev->vendor;
|
||||
keybd_dev->id.product = pdev->device;
|
||||
mouse_dev->id.version = 2;
|
||||
keybd_dev->evbit[0] = BIT(EV_KEY);
|
||||
keybd_dev->name = remote_keybd_name;
|
||||
|
||||
for (i = 0; i < XLATE_SIZE; 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])
|
||||
set_bit(xlate[i], remote->keybd_dev.keybit);
|
||||
set_bit(xlate[i], keybd_dev->keybit);
|
||||
}
|
||||
|
||||
input_register_device(&remote->mouse_dev);
|
||||
input_register_device(&remote->keybd_dev);
|
||||
error = input_register_device(mouse_dev);
|
||||
if (error)
|
||||
goto err_free_devices;
|
||||
|
||||
error = input_register_device(keybd_dev);
|
||||
if (error)
|
||||
goto err_unregister_mouse_dev;
|
||||
|
||||
enable_mouse_interrupts(sp);
|
||||
|
||||
printk(KERN_INFO "ibmasm remote responding to events on RSA card %d\n", sp->number);
|
||||
|
||||
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)
|
||||
{
|
||||
disable_mouse_interrupts(sp);
|
||||
input_unregister_device(&sp->remote->keybd_dev);
|
||||
input_unregister_device(&sp->remote->mouse_dev);
|
||||
kfree(sp->remote);
|
||||
input_unregister_device(sp->remote.mouse_dev);
|
||||
input_unregister_device(sp->remote.keybd_dev);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue