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