Merge branch 'pnp'

* pnp:
PNP: Avoid leaving unregistered device objects in lists
PNP: Convert pnp_lock into a mutex
PNP: tty/serial/8250/8250_fintek: Use module_pnp_driver to register driver
PNP: platform/x86/apple-gmux: Use module_pnp_driver to register driver
PNP: net/sb1000: Use module_pnp_driver to register driver
PNP: media/rc: Use module_pnp_driver to register driver
PNP: ide/ide-pnp: Use module_pnp_driver to register driver
PNP: ata/pata_isapnp: Use module_pnp_driver to register driver
PNP: tpm/tpm_infineon: Use module_pnp_driver to register driver
PNP: Add helper macro for pnp_register_driver boilerplate
PNP / ACPI: Use ACPI_COMPANION_SET() during initialization

+89 -164
+1 -13
drivers/ata/pata_isapnp.c
··· 128 128 .remove = isapnp_remove_one, 129 129 }; 130 130 131 - static int __init isapnp_init(void) 132 - { 133 - return pnp_register_driver(&isapnp_driver); 134 - } 135 - 136 - static void __exit isapnp_exit(void) 137 - { 138 - pnp_unregister_driver(&isapnp_driver); 139 - } 140 - 131 + module_pnp_driver(isapnp_driver); 141 132 MODULE_AUTHOR("Alan Cox"); 142 133 MODULE_DESCRIPTION("low-level driver for ISA PnP ATA"); 143 134 MODULE_LICENSE("GPL"); 144 135 MODULE_VERSION(DRV_VERSION); 145 - 146 - module_init(isapnp_init); 147 - module_exit(isapnp_exit);
+1 -12
drivers/char/tpm/tpm_infineon.c
··· 637 637 .remove = tpm_inf_pnp_remove 638 638 }; 639 639 640 - static int __init init_inf(void) 641 - { 642 - return pnp_register_driver(&tpm_inf_pnp_driver); 643 - } 644 - 645 - static void __exit cleanup_inf(void) 646 - { 647 - pnp_unregister_driver(&tpm_inf_pnp_driver); 648 - } 649 - 650 - module_init(init_inf); 651 - module_exit(cleanup_inf); 640 + module_pnp_driver(tpm_inf_pnp_driver); 652 641 653 642 MODULE_AUTHOR("Marcel Selhorst <tpmdd@sirrix.com>"); 654 643 MODULE_DESCRIPTION("Driver for Infineon TPM SLD 9630 TT 1.1 / SLB 9635 TT 1.2");
+1 -13
drivers/ide/ide-pnp.c
··· 96 96 .remove = idepnp_remove, 97 97 }; 98 98 99 - static int __init pnpide_init(void) 100 - { 101 - return pnp_register_driver(&idepnp_driver); 102 - } 103 - 104 - static void __exit pnpide_exit(void) 105 - { 106 - pnp_unregister_driver(&idepnp_driver); 107 - } 108 - 109 - module_init(pnpide_init); 110 - module_exit(pnpide_exit); 111 - 99 + module_pnp_driver(idepnp_driver); 112 100 MODULE_LICENSE("GPL");
+1 -12
drivers/media/rc/ene_ir.c
··· 1195 1195 .shutdown = ene_shutdown, 1196 1196 }; 1197 1197 1198 - static int __init ene_init(void) 1199 - { 1200 - return pnp_register_driver(&ene_driver); 1201 - } 1202 - 1203 - static void ene_exit(void) 1204 - { 1205 - pnp_unregister_driver(&ene_driver); 1206 - } 1207 - 1208 1198 module_param(sample_period, int, S_IRUGO); 1209 1199 MODULE_PARM_DESC(sample_period, "Hardware sample period (50 us default)"); 1210 1200 ··· 1216 1226 MODULE_AUTHOR("Maxim Levitsky"); 1217 1227 MODULE_LICENSE("GPL"); 1218 1228 1219 - module_init(ene_init); 1220 - module_exit(ene_exit); 1229 + module_pnp_driver(ene_driver);
+1 -12
drivers/media/rc/fintek-cir.c
··· 684 684 .shutdown = fintek_shutdown, 685 685 }; 686 686 687 - static int __init fintek_init(void) 688 - { 689 - return pnp_register_driver(&fintek_driver); 690 - } 691 - 692 - static void __exit fintek_exit(void) 693 - { 694 - pnp_unregister_driver(&fintek_driver); 695 - } 696 - 697 687 module_param(debug, int, S_IRUGO | S_IWUSR); 698 688 MODULE_PARM_DESC(debug, "Enable debugging output"); 699 689 ··· 693 703 MODULE_AUTHOR("Jarod Wilson <jarod@redhat.com>"); 694 704 MODULE_LICENSE("GPL"); 695 705 696 - module_init(fintek_init); 697 - module_exit(fintek_exit); 706 + module_pnp_driver(fintek_driver);
+1 -12
drivers/media/rc/ite-cir.c
··· 1708 1708 .shutdown = ite_shutdown, 1709 1709 }; 1710 1710 1711 - static int __init ite_init(void) 1712 - { 1713 - return pnp_register_driver(&ite_driver); 1714 - } 1715 - 1716 - static void __exit ite_exit(void) 1717 - { 1718 - pnp_unregister_driver(&ite_driver); 1719 - } 1720 - 1721 1711 MODULE_DEVICE_TABLE(pnp, ite_ids); 1722 1712 MODULE_DESCRIPTION("ITE Tech Inc. IT8712F/ITE8512F CIR driver"); 1723 1713 1724 1714 MODULE_AUTHOR("Juan J. Garcia de Soria <skandalfo@gmail.com>"); 1725 1715 MODULE_LICENSE("GPL"); 1726 1716 1727 - module_init(ite_init); 1728 - module_exit(ite_exit); 1717 + module_pnp_driver(ite_driver);
+1 -12
drivers/media/rc/nuvoton-cir.c
··· 1219 1219 .shutdown = nvt_shutdown, 1220 1220 }; 1221 1221 1222 - static int __init nvt_init(void) 1223 - { 1224 - return pnp_register_driver(&nvt_driver); 1225 - } 1226 - 1227 - static void __exit nvt_exit(void) 1228 - { 1229 - pnp_unregister_driver(&nvt_driver); 1230 - } 1231 - 1232 1222 module_param(debug, int, S_IRUGO | S_IWUSR); 1233 1223 MODULE_PARM_DESC(debug, "Enable debugging output"); 1234 1224 ··· 1228 1238 MODULE_AUTHOR("Jarod Wilson <jarod@redhat.com>"); 1229 1239 MODULE_LICENSE("GPL"); 1230 1240 1231 - module_init(nvt_init); 1232 - module_exit(nvt_exit); 1241 + module_pnp_driver(nvt_driver);
+1 -14
drivers/net/sb1000.c
··· 1175 1175 MODULE_DESCRIPTION("General Instruments SB1000 driver"); 1176 1176 MODULE_LICENSE("GPL"); 1177 1177 1178 - static int __init 1179 - sb1000_init(void) 1180 - { 1181 - return pnp_register_driver(&sb1000_driver); 1182 - } 1183 - 1184 - static void __exit 1185 - sb1000_exit(void) 1186 - { 1187 - pnp_unregister_driver(&sb1000_driver); 1188 - } 1189 - 1190 - module_init(sb1000_init); 1191 - module_exit(sb1000_exit); 1178 + module_pnp_driver(sb1000_driver);
+1 -13
drivers/platform/x86/apple-gmux.c
··· 624 624 }, 625 625 }; 626 626 627 - static int __init apple_gmux_init(void) 628 - { 629 - return pnp_register_driver(&gmux_pnp_driver); 630 - } 631 - 632 - static void __exit apple_gmux_exit(void) 633 - { 634 - pnp_unregister_driver(&gmux_pnp_driver); 635 - } 636 - 637 - module_init(apple_gmux_init); 638 - module_exit(apple_gmux_exit); 639 - 627 + module_pnp_driver(gmux_pnp_driver); 640 628 MODULE_AUTHOR("Seth Forshee <seth.forshee@canonical.com>"); 641 629 MODULE_DESCRIPTION("Apple Gmux Driver"); 642 630 MODULE_LICENSE("GPL");
+1 -1
drivers/pnp/base.h
··· 3 3 * Bjorn Helgaas <bjorn.helgaas@hp.com> 4 4 */ 5 5 6 - extern spinlock_t pnp_lock; 6 + extern struct mutex pnp_lock; 7 7 extern const struct attribute_group *pnp_dev_groups[]; 8 8 void *pnp_alloc(long size); 9 9
+13 -12
drivers/pnp/card.c
··· 5 5 */ 6 6 7 7 #include <linux/module.h> 8 + #include <linux/mutex.h> 8 9 #include <linux/ctype.h> 9 10 #include <linux/slab.h> 10 11 #include <linux/pnp.h> ··· 245 244 } 246 245 247 246 pnp_interface_attach_card(card); 248 - spin_lock(&pnp_lock); 247 + mutex_lock(&pnp_lock); 249 248 list_add_tail(&card->global_list, &pnp_cards); 250 249 list_add_tail(&card->protocol_list, &card->protocol->cards); 251 - spin_unlock(&pnp_lock); 250 + mutex_unlock(&pnp_lock); 252 251 253 252 /* we wait until now to add devices in order to ensure the drivers 254 253 * will be able to use all of the related devices on the card ··· 277 276 struct list_head *pos, *temp; 278 277 279 278 device_unregister(&card->dev); 280 - spin_lock(&pnp_lock); 279 + mutex_lock(&pnp_lock); 281 280 list_del(&card->global_list); 282 281 list_del(&card->protocol_list); 283 - spin_unlock(&pnp_lock); 282 + mutex_unlock(&pnp_lock); 284 283 list_for_each_safe(pos, temp, &card->devices) { 285 284 struct pnp_dev *dev = card_to_pnp_dev(pos); 286 285 pnp_remove_card_device(dev); ··· 298 297 dev->card_link = NULL; 299 298 dev_set_name(&dev->dev, "%02x:%02x.%02x", 300 299 dev->protocol->number, card->number, dev->number); 301 - spin_lock(&pnp_lock); 300 + mutex_lock(&pnp_lock); 302 301 dev->card = card; 303 302 list_add_tail(&dev->card_list, &card->devices); 304 - spin_unlock(&pnp_lock); 303 + mutex_unlock(&pnp_lock); 305 304 return 0; 306 305 } 307 306 ··· 311 310 */ 312 311 void pnp_remove_card_device(struct pnp_dev *dev) 313 312 { 314 - spin_lock(&pnp_lock); 313 + mutex_lock(&pnp_lock); 315 314 dev->card = NULL; 316 315 list_del(&dev->card_list); 317 - spin_unlock(&pnp_lock); 316 + mutex_unlock(&pnp_lock); 318 317 __pnp_remove_device(dev); 319 318 } 320 319 ··· 427 426 if (error < 0) 428 427 return error; 429 428 430 - spin_lock(&pnp_lock); 429 + mutex_lock(&pnp_lock); 431 430 list_add_tail(&drv->global_list, &pnp_card_drivers); 432 - spin_unlock(&pnp_lock); 431 + mutex_unlock(&pnp_lock); 433 432 434 433 list_for_each_safe(pos, temp, &pnp_cards) { 435 434 struct pnp_card *card = ··· 445 444 */ 446 445 void pnp_unregister_card_driver(struct pnp_card_driver *drv) 447 446 { 448 - spin_lock(&pnp_lock); 447 + mutex_lock(&pnp_lock); 449 448 list_del(&drv->global_list); 450 - spin_unlock(&pnp_lock); 449 + mutex_unlock(&pnp_lock); 451 450 pnp_unregister_driver(&drv->link); 452 451 } 453 452
+46 -18
drivers/pnp/core.c
··· 9 9 #include <linux/list.h> 10 10 #include <linux/device.h> 11 11 #include <linux/module.h> 12 + #include <linux/mutex.h> 12 13 #include <linux/init.h> 13 14 #include <linux/string.h> 14 15 #include <linux/slab.h> ··· 20 19 21 20 static LIST_HEAD(pnp_protocols); 22 21 LIST_HEAD(pnp_global); 23 - DEFINE_SPINLOCK(pnp_lock); 22 + DEFINE_MUTEX(pnp_lock); 24 23 25 24 /* 26 25 * ACPI or PNPBIOS should tell us about all platform devices, so we can ··· 42 41 return result; 43 42 } 44 43 44 + static void pnp_remove_protocol(struct pnp_protocol *protocol) 45 + { 46 + mutex_lock(&pnp_lock); 47 + list_del(&protocol->protocol_list); 48 + mutex_unlock(&pnp_lock); 49 + } 50 + 45 51 /** 46 52 * pnp_protocol_register - adds a pnp protocol to the pnp layer 47 53 * @protocol: pointer to the corresponding pnp_protocol structure ··· 57 49 */ 58 50 int pnp_register_protocol(struct pnp_protocol *protocol) 59 51 { 60 - int nodenum; 61 52 struct list_head *pos; 53 + int nodenum, ret; 62 54 63 55 INIT_LIST_HEAD(&protocol->devices); 64 56 INIT_LIST_HEAD(&protocol->cards); 65 57 nodenum = 0; 66 - spin_lock(&pnp_lock); 58 + 59 + mutex_lock(&pnp_lock); 67 60 68 61 /* assign the lowest unused number */ 69 62 list_for_each(pos, &pnp_protocols) { ··· 75 66 } 76 67 } 77 68 78 - list_add_tail(&protocol->protocol_list, &pnp_protocols); 79 - spin_unlock(&pnp_lock); 80 - 81 69 protocol->number = nodenum; 82 70 dev_set_name(&protocol->dev, "pnp%d", nodenum); 83 - return device_register(&protocol->dev); 71 + 72 + list_add_tail(&protocol->protocol_list, &pnp_protocols); 73 + 74 + mutex_unlock(&pnp_lock); 75 + 76 + ret = device_register(&protocol->dev); 77 + if (ret) 78 + pnp_remove_protocol(protocol); 79 + 80 + return ret; 84 81 } 85 82 86 83 /** ··· 95 80 */ 96 81 void pnp_unregister_protocol(struct pnp_protocol *protocol) 97 82 { 98 - spin_lock(&pnp_lock); 99 - list_del(&protocol->protocol_list); 100 - spin_unlock(&pnp_lock); 83 + pnp_remove_protocol(protocol); 101 84 device_unregister(&protocol->dev); 102 85 } 103 86 ··· 170 157 return dev; 171 158 } 172 159 160 + static void pnp_delist_device(struct pnp_dev *dev) 161 + { 162 + mutex_lock(&pnp_lock); 163 + list_del(&dev->global_list); 164 + list_del(&dev->protocol_list); 165 + mutex_unlock(&pnp_lock); 166 + } 167 + 173 168 int __pnp_add_device(struct pnp_dev *dev) 174 169 { 170 + int ret; 171 + 175 172 pnp_fixup_device(dev); 176 173 dev->status = PNP_READY; 177 - spin_lock(&pnp_lock); 174 + 175 + mutex_lock(&pnp_lock); 176 + 178 177 list_add_tail(&dev->global_list, &pnp_global); 179 178 list_add_tail(&dev->protocol_list, &dev->protocol->devices); 180 - spin_unlock(&pnp_lock); 181 - if (dev->protocol->can_wakeup) 179 + 180 + mutex_unlock(&pnp_lock); 181 + 182 + ret = device_register(&dev->dev); 183 + if (ret) 184 + pnp_delist_device(dev); 185 + else if (dev->protocol->can_wakeup) 182 186 device_set_wakeup_capable(&dev->dev, 183 187 dev->protocol->can_wakeup(dev)); 184 - return device_register(&dev->dev); 188 + 189 + return ret; 185 190 } 186 191 187 192 /* ··· 234 203 235 204 void __pnp_remove_device(struct pnp_dev *dev) 236 205 { 237 - spin_lock(&pnp_lock); 238 - list_del(&dev->global_list); 239 - list_del(&dev->protocol_list); 240 - spin_unlock(&pnp_lock); 206 + pnp_delist_device(dev); 241 207 device_unregister(&dev->dev); 242 208 } 243 209
+5 -5
drivers/pnp/driver.c
··· 58 58 59 59 int pnp_device_attach(struct pnp_dev *pnp_dev) 60 60 { 61 - spin_lock(&pnp_lock); 61 + mutex_lock(&pnp_lock); 62 62 if (pnp_dev->status != PNP_READY) { 63 - spin_unlock(&pnp_lock); 63 + mutex_unlock(&pnp_lock); 64 64 return -EBUSY; 65 65 } 66 66 pnp_dev->status = PNP_ATTACHED; 67 - spin_unlock(&pnp_lock); 67 + mutex_unlock(&pnp_lock); 68 68 return 0; 69 69 } 70 70 71 71 void pnp_device_detach(struct pnp_dev *pnp_dev) 72 72 { 73 - spin_lock(&pnp_lock); 73 + mutex_lock(&pnp_lock); 74 74 if (pnp_dev->status == PNP_ATTACHED) 75 75 pnp_dev->status = PNP_READY; 76 - spin_unlock(&pnp_lock); 76 + mutex_unlock(&pnp_lock); 77 77 pnp_disable_dev(pnp_dev); 78 78 } 79 79
+2 -3
drivers/pnp/pnpacpi/core.c
··· 248 248 if (!dev) 249 249 return -ENOMEM; 250 250 251 + ACPI_COMPANION_SET(&dev->dev, device); 251 252 dev->data = device; 252 253 /* .enabled means the device can decode the resources */ 253 254 dev->active = device->status.enabled; ··· 291 290 return error; 292 291 } 293 292 294 - error = acpi_bind_one(&dev->dev, device); 295 - 296 293 num++; 297 294 298 - return error; 295 + return 0; 299 296 } 300 297 301 298 static acpi_status __init pnpacpi_add_device_handler(acpi_handle handle,
+1 -12
drivers/tty/serial/8250/8250_fintek.c
··· 234 234 .id_table = fintek_dev_table, 235 235 }; 236 236 237 - static int fintek_8250_init(void) 238 - { 239 - return pnp_register_driver(&fintek_8250_driver); 240 - } 241 - module_init(fintek_8250_init); 242 - 243 - static void fintek_8250_exit(void) 244 - { 245 - pnp_unregister_driver(&fintek_8250_driver); 246 - } 247 - module_exit(fintek_8250_exit); 248 - 237 + module_pnp_driver(fintek_8250_driver); 249 238 MODULE_DESCRIPTION("Fintek F812164 module"); 250 239 MODULE_AUTHOR("Ricardo Ribalda <ricardo.ribalda@gmail.com>"); 251 240 MODULE_LICENSE("GPL");
+12
include/linux/pnp.h
··· 510 510 511 511 #endif /* CONFIG_PNP */ 512 512 513 + /** 514 + * module_pnp_driver() - Helper macro for registering a PnP driver 515 + * @__pnp_driver: pnp_driver struct 516 + * 517 + * Helper macro for PnP drivers which do not do anything special in module 518 + * init/exit. This eliminates a lot of boilerplate. Each module may only 519 + * use this macro once, and calling it replaces module_init() and module_exit() 520 + */ 521 + #define module_pnp_driver(__pnp_driver) \ 522 + module_driver(__pnp_driver, pnp_register_driver, \ 523 + pnp_unregister_driver) 524 + 513 525 #endif /* _LINUX_PNP_H */