static int userio_char_release(struct inode *inode, struct file *file) { struct userio_device *userio = file->private_data; if (userio->running) { /* * Don't free the serio port here, serio_unregister_port() * does it for us. */ serio_unregister_port(userio->serio); } else { kfree(userio->serio); } kfree(userio); return 0; }
static int xps2_remove(struct device *dev) { struct xps2data *drvdata; if (!dev) return -EINVAL; drvdata = (struct xps2data *)dev_get_drvdata(dev); serio_unregister_port(&drvdata->serio); iounmap((void *)(drvdata->ps2.BaseAddress)); release_mem_region(drvdata->phys_addr, drvdata->remap_size); kfree(drvdata); dev_set_drvdata(dev, NULL); return 0; /* success */ }
/** * xps2_of_remove - unbinds the driver from the PS/2 device. * @of_dev: pointer to OF device structure * * This function is called if a device is physically removed from the system or * if the driver module is being unloaded. It frees any resources allocated to * the device. */ static int __devexit xps2_of_remove(struct platform_device *of_dev) { struct xps2data *drvdata = platform_get_drvdata(of_dev); struct resource r_mem; /* IO mem resources */ serio_unregister_port(drvdata->serio); iounmap(drvdata->base_address); /* Get iospace of the device */ if (of_address_to_resource(of_dev->dev.of_node, 0, &r_mem)) dev_err(drvdata->dev, "invalid address\n"); else release_mem_region(r_mem.start, resource_size(&r_mem)); kfree(drvdata); platform_set_drvdata(of_dev, NULL); return 0; }
static int __devexit xps2_of_remove(struct platform_device *of_dev) { struct device *dev = &of_dev->dev; struct xps2data *drvdata = dev_get_drvdata(dev); struct resource r_mem; serio_unregister_port(&drvdata->serio); iounmap(drvdata->base_address); if (of_address_to_resource(of_dev->dev.of_node, 0, &r_mem)) dev_err(dev, "invalid address\n"); else release_mem_region(r_mem.start, resource_size(&r_mem)); kfree(drvdata); dev_set_drvdata(dev, NULL); return 0; }
static void __exit q40kbd_exit(void) { serio_unregister_port(q40kbd_port); platform_device_unregister(q40kbd_device); }
static int __devexit q40kbd_remove(struct platform_device *dev) { serio_unregister_port(q40kbd_port); return 0; }
static int __devexit milkbd_remove(struct platform_device *dev) { struct serio *serio = platform_get_drvdata(dev); serio_unregister_port(serio); return 0; }
static int __devexit rpckbd_remove(struct device *dev) { struct serio *serio = dev_get_drvdata(dev); serio_unregister_port(serio); return 0; }
static int __devexit ct82c710_remove(struct platform_device *dev) { serio_unregister_port(ct82c710_port); return 0; }
static int nvec_mouse_remove(struct platform_device *pdev) { serio_unregister_port(ps2_dev.ser_dev); return 0; }
static void __exit ct82c710_exit(void) { serio_unregister_port(ct82c710_port); platform_device_unregister(ct82c710_device); }
static void __exit maceps2_exit(void) { serio_unregister_port(maceps2_port[0]); serio_unregister_port(maceps2_port[1]); platform_device_unregister(maceps2_device); }
static int arc_ps2_probe(struct platform_device *pdev) { struct arc_ps2_data *arc_ps2; struct resource *res; int irq; int error, id, i; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { dev_err(&pdev->dev, "no IO memory defined\n"); return -EINVAL; } irq = platform_get_irq_byname(pdev, "arc_ps2_irq"); if (irq < 0) { dev_err(&pdev->dev, "no IRQ defined\n"); return -EINVAL; } arc_ps2 = devm_kzalloc(&pdev->dev, sizeof(struct arc_ps2_data), GFP_KERNEL); if (!arc_ps2) { dev_err(&pdev->dev, "out of memory\n"); return -ENOMEM; } arc_ps2->addr = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(arc_ps2->addr)) return PTR_ERR(arc_ps2->addr); dev_info(&pdev->dev, "irq = %d, address = 0x%p, ports = %i\n", irq, arc_ps2->addr, ARC_PS2_PORTS); id = ioread32(arc_ps2->addr); if (id != ARC_ARC_PS2_ID) { dev_err(&pdev->dev, "device id does not match\n"); return -ENXIO; } arc_ps2_inhibit_ports(arc_ps2); error = devm_request_irq(&pdev->dev, irq, arc_ps2_interrupt, 0, "arc_ps2", arc_ps2); if (error) { dev_err(&pdev->dev, "Could not allocate IRQ\n"); return error; } for (i = 0; i < ARC_PS2_PORTS; i++) { error = arc_ps2_create_port(pdev, arc_ps2, i); if (error) { while (--i >= 0) serio_unregister_port(arc_ps2->port[i].io); return error; } } platform_set_drvdata(pdev, arc_ps2); return 0; }