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>

authored by

Vernon Mauery and committed by
Dmitry Torokhov
736ce432 6020bafc

+48 -34
+3 -3
drivers/misc/ibmasm/ibmasm.h
··· 141 141 }; 142 142 143 143 struct ibmasm_remote { 144 - struct input_dev keybd_dev; 145 - struct input_dev mouse_dev; 144 + struct input_dev *keybd_dev; 145 + struct input_dev *mouse_dev; 146 146 }; 147 147 148 148 struct service_processor { ··· 157 157 char dirname[IBMASM_NAME_SIZE]; 158 158 char devname[IBMASM_NAME_SIZE]; 159 159 unsigned int number; 160 - struct ibmasm_remote *remote; 160 + struct ibmasm_remote remote; 161 161 int serial_line; 162 162 struct device *dev; 163 163 };
+45 -31
drivers/misc/ibmasm/remote.c
··· 203 203 204 204 print_input(&input); 205 205 if (input.type == INPUT_TYPE_MOUSE) { 206 - send_mouse_event(&sp->remote->mouse_dev, regs, &input); 206 + send_mouse_event(sp->remote.mouse_dev, regs, &input); 207 207 } else if (input.type == INPUT_TYPE_KEYBOARD) { 208 - send_keyboard_event(&sp->remote->keybd_dev, regs, &input); 208 + send_keyboard_event(sp->remote.keybd_dev, regs, &input); 209 209 } else 210 210 break; 211 211 ··· 217 217 int ibmasm_init_remote_input_dev(struct service_processor *sp) 218 218 { 219 219 /* set up the mouse input device */ 220 - struct ibmasm_remote *remote; 220 + struct input_dev *mouse_dev, *keybd_dev; 221 221 struct pci_dev *pdev = to_pci_dev(sp->dev); 222 + int error = -ENOMEM; 222 223 int i; 223 224 224 - sp->remote = remote = kmalloc(sizeof(*remote), GFP_KERNEL); 225 - if (!remote) 226 - return -ENOMEM; 225 + sp->remote.mouse_dev = mouse_dev = input_allocate_device(); 226 + sp->remote.keybd_dev = keybd_dev = input_allocate_device(); 227 227 228 - memset(remote, 0, sizeof(*remote)); 228 + if (!mouse_dev || !keybd_dev) 229 + goto err_free_devices; 229 230 230 - remote->mouse_dev.private = remote; 231 - init_input_dev(&remote->mouse_dev); 232 - remote->mouse_dev.id.vendor = pdev->vendor; 233 - remote->mouse_dev.id.product = pdev->device; 234 - remote->mouse_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); 235 - remote->mouse_dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | 231 + mouse_dev->id.bustype = BUS_PCI; 232 + mouse_dev->id.vendor = pdev->vendor; 233 + mouse_dev->id.product = pdev->device; 234 + mouse_dev->id.version = 1; 235 + mouse_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); 236 + mouse_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | 236 237 BIT(BTN_RIGHT) | BIT(BTN_MIDDLE); 237 - set_bit(BTN_TOUCH, remote->mouse_dev.keybit); 238 - remote->mouse_dev.name = remote_mouse_name; 239 - input_set_abs_params(&remote->mouse_dev, ABS_X, 0, xmax, 0, 0); 240 - input_set_abs_params(&remote->mouse_dev, ABS_Y, 0, ymax, 0, 0); 238 + set_bit(BTN_TOUCH, mouse_dev->keybit); 239 + mouse_dev->name = remote_mouse_name; 240 + input_set_abs_params(mouse_dev, ABS_X, 0, xmax, 0, 0); 241 + input_set_abs_params(mouse_dev, ABS_Y, 0, ymax, 0, 0); 241 242 242 - remote->keybd_dev.private = remote; 243 - init_input_dev(&remote->keybd_dev); 244 - remote->keybd_dev.id.vendor = pdev->vendor; 245 - remote->keybd_dev.id.product = pdev->device; 246 - remote->keybd_dev.evbit[0] = BIT(EV_KEY); 247 - remote->keybd_dev.name = remote_keybd_name; 243 + mouse_dev->id.bustype = BUS_PCI; 244 + keybd_dev->id.vendor = pdev->vendor; 245 + keybd_dev->id.product = pdev->device; 246 + mouse_dev->id.version = 2; 247 + keybd_dev->evbit[0] = BIT(EV_KEY); 248 + keybd_dev->name = remote_keybd_name; 248 249 249 - for (i=0; i<XLATE_SIZE; i++) { 250 + for (i = 0; i < XLATE_SIZE; i++) { 250 251 if (xlate_high[i]) 251 - set_bit(xlate_high[i], remote->keybd_dev.keybit); 252 + set_bit(xlate_high[i], keybd_dev->keybit); 252 253 if (xlate[i]) 253 - set_bit(xlate[i], remote->keybd_dev.keybit); 254 + set_bit(xlate[i], keybd_dev->keybit); 254 255 } 255 256 256 - input_register_device(&remote->mouse_dev); 257 - input_register_device(&remote->keybd_dev); 257 + error = input_register_device(mouse_dev); 258 + if (error) 259 + goto err_free_devices; 260 + 261 + error = input_register_device(keybd_dev); 262 + if (error) 263 + goto err_unregister_mouse_dev; 264 + 258 265 enable_mouse_interrupts(sp); 259 266 260 267 printk(KERN_INFO "ibmasm remote responding to events on RSA card %d\n", sp->number); 261 268 262 269 return 0; 270 + 271 + err_unregister_mouse_dev: 272 + input_unregister_device(mouse_dev); 273 + err_free_devices: 274 + input_free_device(mouse_dev); 275 + input_free_device(keybd_dev); 276 + 277 + return error; 263 278 } 264 279 265 280 void ibmasm_free_remote_input_dev(struct service_processor *sp) 266 281 { 267 282 disable_mouse_interrupts(sp); 268 - input_unregister_device(&sp->remote->keybd_dev); 269 - input_unregister_device(&sp->remote->mouse_dev); 270 - kfree(sp->remote); 283 + input_unregister_device(sp->remote.mouse_dev); 284 + input_unregister_device(sp->remote.keybd_dev); 271 285 } 272 286