static void iforce_release(struct input_dev *dev) { struct iforce *iforce = input_get_drvdata(dev); int i; if (test_bit(EV_FF, dev->evbit)) { /* Check: no effects should be present in memory */ for (i = 0; i < dev->ff->max_effects; i++) { if (test_bit(FF_CORE_IS_USED, iforce->core_effects[i].flags)) { dev_warn(&dev->dev, "%s: Device still owns effects\n", __func__); break; } } /* Disable force feedback playback */ iforce_send_packet(iforce, FF_CMD_ENABLE, "\001"); } switch (iforce->bus) { #ifdef CONFIG_JOYSTICK_IFORCE_USB case IFORCE_USB: usb_kill_urb(iforce->irq); /* The device was unplugged before the file * was released */ if (iforce->usbdev == NULL) { iforce_delete_device(iforce); kfree(iforce); } break; #endif } }
static void iforce_usb_disconnect(struct usb_interface *intf) { struct iforce *iforce = usb_get_intfdata(intf); int open = 0; /* FIXME! iforce->dev.handle->open; */ usb_set_intfdata(intf, NULL); if (iforce) { iforce->usbdev = NULL; input_unregister_device(iforce->dev); if (!open) { iforce_delete_device(iforce); kfree(iforce); } } }