diff options
Diffstat (limited to 'drivers/pnp')
-rw-r--r-- | drivers/pnp/base.h | 5 | ||||
-rw-r--r-- | drivers/pnp/core.c | 8 | ||||
-rw-r--r-- | drivers/pnp/driver.c | 9 | ||||
-rw-r--r-- | drivers/pnp/isapnp/proc.c | 1 | ||||
-rw-r--r-- | drivers/pnp/pnpacpi/core.c | 124 | ||||
-rw-r--r-- | drivers/pnp/resource.c | 10 |
6 files changed, 111 insertions, 46 deletions
diff --git a/drivers/pnp/base.h b/drivers/pnp/base.h index 0bab84ebb15d..19bc73695475 100644 --- a/drivers/pnp/base.h +++ b/drivers/pnp/base.h | |||
@@ -12,11 +12,12 @@ void pnp_unregister_protocol(struct pnp_protocol *protocol); | |||
12 | 12 | ||
13 | #define PNP_EISA_ID_MASK 0x7fffffff | 13 | #define PNP_EISA_ID_MASK 0x7fffffff |
14 | void pnp_eisa_id_to_string(u32 id, char *str); | 14 | void pnp_eisa_id_to_string(u32 id, char *str); |
15 | struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *, int id, char *pnpid); | 15 | struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *, int id, |
16 | const char *pnpid); | ||
16 | struct pnp_card *pnp_alloc_card(struct pnp_protocol *, int id, char *pnpid); | 17 | struct pnp_card *pnp_alloc_card(struct pnp_protocol *, int id, char *pnpid); |
17 | 18 | ||
18 | int pnp_add_device(struct pnp_dev *dev); | 19 | int pnp_add_device(struct pnp_dev *dev); |
19 | struct pnp_id *pnp_add_id(struct pnp_dev *dev, char *id); | 20 | struct pnp_id *pnp_add_id(struct pnp_dev *dev, const char *id); |
20 | 21 | ||
21 | int pnp_add_card(struct pnp_card *card); | 22 | int pnp_add_card(struct pnp_card *card); |
22 | void pnp_remove_card(struct pnp_card *card); | 23 | void pnp_remove_card(struct pnp_card *card); |
diff --git a/drivers/pnp/core.c b/drivers/pnp/core.c index 9801918b2726..cb6ce42f8e77 100644 --- a/drivers/pnp/core.c +++ b/drivers/pnp/core.c | |||
@@ -124,7 +124,8 @@ static void pnp_release_device(struct device *dmdev) | |||
124 | kfree(dev); | 124 | kfree(dev); |
125 | } | 125 | } |
126 | 126 | ||
127 | struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *protocol, int id, char *pnpid) | 127 | struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *protocol, int id, |
128 | const char *pnpid) | ||
128 | { | 129 | { |
129 | struct pnp_dev *dev; | 130 | struct pnp_dev *dev; |
130 | struct pnp_id *dev_id; | 131 | struct pnp_id *dev_id; |
@@ -194,8 +195,9 @@ int pnp_add_device(struct pnp_dev *dev) | |||
194 | for (id = dev->id; id; id = id->next) | 195 | for (id = dev->id; id; id = id->next) |
195 | len += scnprintf(buf + len, sizeof(buf) - len, " %s", id->id); | 196 | len += scnprintf(buf + len, sizeof(buf) - len, " %s", id->id); |
196 | 197 | ||
197 | pnp_dbg(&dev->dev, "%s device, IDs%s (%s)\n", | 198 | dev_printk(KERN_DEBUG, &dev->dev, "%s device, IDs%s (%s)\n", |
198 | dev->protocol->name, buf, dev->active ? "active" : "disabled"); | 199 | dev->protocol->name, buf, |
200 | dev->active ? "active" : "disabled"); | ||
199 | return 0; | 201 | return 0; |
200 | } | 202 | } |
201 | 203 | ||
diff --git a/drivers/pnp/driver.c b/drivers/pnp/driver.c index cd11b113494f..00e94032531a 100644 --- a/drivers/pnp/driver.c +++ b/drivers/pnp/driver.c | |||
@@ -189,8 +189,11 @@ static int pnp_bus_resume(struct device *dev) | |||
189 | if (!pnp_drv) | 189 | if (!pnp_drv) |
190 | return 0; | 190 | return 0; |
191 | 191 | ||
192 | if (pnp_dev->protocol->resume) | 192 | if (pnp_dev->protocol->resume) { |
193 | pnp_dev->protocol->resume(pnp_dev); | 193 | error = pnp_dev->protocol->resume(pnp_dev); |
194 | if (error) | ||
195 | return error; | ||
196 | } | ||
194 | 197 | ||
195 | if (pnp_can_write(pnp_dev)) { | 198 | if (pnp_can_write(pnp_dev)) { |
196 | error = pnp_start_dev(pnp_dev); | 199 | error = pnp_start_dev(pnp_dev); |
@@ -236,7 +239,7 @@ void pnp_unregister_driver(struct pnp_driver *drv) | |||
236 | * @dev: pointer to the desired device | 239 | * @dev: pointer to the desired device |
237 | * @id: pointer to an EISA id string | 240 | * @id: pointer to an EISA id string |
238 | */ | 241 | */ |
239 | struct pnp_id *pnp_add_id(struct pnp_dev *dev, char *id) | 242 | struct pnp_id *pnp_add_id(struct pnp_dev *dev, const char *id) |
240 | { | 243 | { |
241 | struct pnp_id *dev_id, *ptr; | 244 | struct pnp_id *dev_id, *ptr; |
242 | 245 | ||
diff --git a/drivers/pnp/isapnp/proc.c b/drivers/pnp/isapnp/proc.c index e73ebefdf3e0..315b3112aca8 100644 --- a/drivers/pnp/isapnp/proc.c +++ b/drivers/pnp/isapnp/proc.c | |||
@@ -21,7 +21,6 @@ | |||
21 | #include <linux/isapnp.h> | 21 | #include <linux/isapnp.h> |
22 | #include <linux/proc_fs.h> | 22 | #include <linux/proc_fs.h> |
23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
24 | #include <linux/smp_lock.h> | ||
25 | #include <asm/uaccess.h> | 24 | #include <asm/uaccess.h> |
26 | 25 | ||
27 | extern struct pnp_protocol isapnp_protocol; | 26 | extern struct pnp_protocol isapnp_protocol; |
diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c index dc4e32e031e9..ca84d5099ce7 100644 --- a/drivers/pnp/pnpacpi/core.c +++ b/drivers/pnp/pnpacpi/core.c | |||
@@ -28,7 +28,7 @@ | |||
28 | #include "../base.h" | 28 | #include "../base.h" |
29 | #include "pnpacpi.h" | 29 | #include "pnpacpi.h" |
30 | 30 | ||
31 | static int num = 0; | 31 | static int num; |
32 | 32 | ||
33 | /* We need only to blacklist devices that have already an acpi driver that | 33 | /* We need only to blacklist devices that have already an acpi driver that |
34 | * can't use pnp layer. We don't need to blacklist device that are directly | 34 | * can't use pnp layer. We don't need to blacklist device that are directly |
@@ -59,7 +59,7 @@ static inline int __init is_exclusive_device(struct acpi_device *dev) | |||
59 | #define TEST_ALPHA(c) \ | 59 | #define TEST_ALPHA(c) \ |
60 | if (!('@' <= (c) || (c) <= 'Z')) \ | 60 | if (!('@' <= (c) || (c) <= 'Z')) \ |
61 | return 0 | 61 | return 0 |
62 | static int __init ispnpidacpi(char *id) | 62 | static int __init ispnpidacpi(const char *id) |
63 | { | 63 | { |
64 | TEST_ALPHA(id[0]); | 64 | TEST_ALPHA(id[0]); |
65 | TEST_ALPHA(id[1]); | 65 | TEST_ALPHA(id[1]); |
@@ -81,12 +81,19 @@ static int pnpacpi_get_resources(struct pnp_dev *dev) | |||
81 | 81 | ||
82 | static int pnpacpi_set_resources(struct pnp_dev *dev) | 82 | static int pnpacpi_set_resources(struct pnp_dev *dev) |
83 | { | 83 | { |
84 | struct acpi_device *acpi_dev = dev->data; | 84 | struct acpi_device *acpi_dev; |
85 | acpi_handle handle = acpi_dev->handle; | 85 | acpi_handle handle; |
86 | struct acpi_buffer buffer; | 86 | struct acpi_buffer buffer; |
87 | int ret; | 87 | int ret; |
88 | 88 | ||
89 | pnp_dbg(&dev->dev, "set resources\n"); | 89 | pnp_dbg(&dev->dev, "set resources\n"); |
90 | |||
91 | handle = DEVICE_ACPI_HANDLE(&dev->dev); | ||
92 | if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &acpi_dev))) { | ||
93 | dev_dbg(&dev->dev, "ACPI device not found in %s!\n", __func__); | ||
94 | return -ENODEV; | ||
95 | } | ||
96 | |||
90 | ret = pnpacpi_build_resource_template(dev, &buffer); | 97 | ret = pnpacpi_build_resource_template(dev, &buffer); |
91 | if (ret) | 98 | if (ret) |
92 | return ret; | 99 | return ret; |
@@ -105,12 +112,18 @@ static int pnpacpi_set_resources(struct pnp_dev *dev) | |||
105 | 112 | ||
106 | static int pnpacpi_disable_resources(struct pnp_dev *dev) | 113 | static int pnpacpi_disable_resources(struct pnp_dev *dev) |
107 | { | 114 | { |
108 | struct acpi_device *acpi_dev = dev->data; | 115 | struct acpi_device *acpi_dev; |
109 | acpi_handle handle = acpi_dev->handle; | 116 | acpi_handle handle; |
110 | int ret; | 117 | int ret; |
111 | 118 | ||
112 | dev_dbg(&dev->dev, "disable resources\n"); | 119 | dev_dbg(&dev->dev, "disable resources\n"); |
113 | 120 | ||
121 | handle = DEVICE_ACPI_HANDLE(&dev->dev); | ||
122 | if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &acpi_dev))) { | ||
123 | dev_dbg(&dev->dev, "ACPI device not found in %s!\n", __func__); | ||
124 | return 0; | ||
125 | } | ||
126 | |||
114 | /* acpi_unregister_gsi(pnp_irq(dev, 0)); */ | 127 | /* acpi_unregister_gsi(pnp_irq(dev, 0)); */ |
115 | ret = 0; | 128 | ret = 0; |
116 | if (acpi_bus_power_manageable(handle)) | 129 | if (acpi_bus_power_manageable(handle)) |
@@ -124,46 +137,74 @@ static int pnpacpi_disable_resources(struct pnp_dev *dev) | |||
124 | #ifdef CONFIG_ACPI_SLEEP | 137 | #ifdef CONFIG_ACPI_SLEEP |
125 | static bool pnpacpi_can_wakeup(struct pnp_dev *dev) | 138 | static bool pnpacpi_can_wakeup(struct pnp_dev *dev) |
126 | { | 139 | { |
127 | struct acpi_device *acpi_dev = dev->data; | 140 | struct acpi_device *acpi_dev; |
128 | acpi_handle handle = acpi_dev->handle; | 141 | acpi_handle handle; |
142 | |||
143 | handle = DEVICE_ACPI_HANDLE(&dev->dev); | ||
144 | if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &acpi_dev))) { | ||
145 | dev_dbg(&dev->dev, "ACPI device not found in %s!\n", __func__); | ||
146 | return false; | ||
147 | } | ||
129 | 148 | ||
130 | return acpi_bus_can_wakeup(handle); | 149 | return acpi_bus_can_wakeup(handle); |
131 | } | 150 | } |
132 | 151 | ||
133 | static int pnpacpi_suspend(struct pnp_dev *dev, pm_message_t state) | 152 | static int pnpacpi_suspend(struct pnp_dev *dev, pm_message_t state) |
134 | { | 153 | { |
135 | struct acpi_device *acpi_dev = dev->data; | 154 | struct acpi_device *acpi_dev; |
136 | acpi_handle handle = acpi_dev->handle; | 155 | acpi_handle handle; |
137 | int power_state; | 156 | int error = 0; |
157 | |||
158 | handle = DEVICE_ACPI_HANDLE(&dev->dev); | ||
159 | if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &acpi_dev))) { | ||
160 | dev_dbg(&dev->dev, "ACPI device not found in %s!\n", __func__); | ||
161 | return 0; | ||
162 | } | ||
138 | 163 | ||
139 | if (device_can_wakeup(&dev->dev)) { | 164 | if (device_can_wakeup(&dev->dev)) { |
140 | int rc = acpi_pm_device_sleep_wake(&dev->dev, | 165 | error = acpi_pm_device_sleep_wake(&dev->dev, |
141 | device_may_wakeup(&dev->dev)); | 166 | device_may_wakeup(&dev->dev)); |
167 | if (error) | ||
168 | return error; | ||
169 | } | ||
170 | |||
171 | if (acpi_bus_power_manageable(handle)) { | ||
172 | int power_state = acpi_pm_device_sleep_state(&dev->dev, NULL); | ||
142 | 173 | ||
143 | if (rc) | 174 | if (power_state < 0) |
144 | return rc; | 175 | power_state = (state.event == PM_EVENT_ON) ? |
176 | ACPI_STATE_D0 : ACPI_STATE_D3; | ||
177 | |||
178 | /* | ||
179 | * acpi_bus_set_power() often fails (keyboard port can't be | ||
180 | * powered-down?), and in any case, our return value is ignored | ||
181 | * by pnp_bus_suspend(). Hence we don't revert the wakeup | ||
182 | * setting if the set_power fails. | ||
183 | */ | ||
184 | error = acpi_bus_set_power(handle, power_state); | ||
145 | } | 185 | } |
146 | power_state = acpi_pm_device_sleep_state(&dev->dev, NULL); | 186 | |
147 | if (power_state < 0) | 187 | return error; |
148 | power_state = (state.event == PM_EVENT_ON) ? | ||
149 | ACPI_STATE_D0 : ACPI_STATE_D3; | ||
150 | |||
151 | /* acpi_bus_set_power() often fails (keyboard port can't be | ||
152 | * powered-down?), and in any case, our return value is ignored | ||
153 | * by pnp_bus_suspend(). Hence we don't revert the wakeup | ||
154 | * setting if the set_power fails. | ||
155 | */ | ||
156 | return acpi_bus_set_power(handle, power_state); | ||
157 | } | 188 | } |
158 | 189 | ||
159 | static int pnpacpi_resume(struct pnp_dev *dev) | 190 | static int pnpacpi_resume(struct pnp_dev *dev) |
160 | { | 191 | { |
161 | struct acpi_device *acpi_dev = dev->data; | 192 | struct acpi_device *acpi_dev; |
162 | acpi_handle handle = acpi_dev->handle; | 193 | acpi_handle handle = DEVICE_ACPI_HANDLE(&dev->dev); |
194 | int error = 0; | ||
195 | |||
196 | if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &acpi_dev))) { | ||
197 | dev_dbg(&dev->dev, "ACPI device not found in %s!\n", __func__); | ||
198 | return -ENODEV; | ||
199 | } | ||
163 | 200 | ||
164 | if (device_may_wakeup(&dev->dev)) | 201 | if (device_may_wakeup(&dev->dev)) |
165 | acpi_pm_device_sleep_wake(&dev->dev, false); | 202 | acpi_pm_device_sleep_wake(&dev->dev, false); |
166 | return acpi_bus_set_power(handle, ACPI_STATE_D0); | 203 | |
204 | if (acpi_bus_power_manageable(handle)) | ||
205 | error = acpi_bus_set_power(handle, ACPI_STATE_D0); | ||
206 | |||
207 | return error; | ||
167 | } | 208 | } |
168 | #endif | 209 | #endif |
169 | 210 | ||
@@ -180,11 +221,24 @@ struct pnp_protocol pnpacpi_protocol = { | |||
180 | }; | 221 | }; |
181 | EXPORT_SYMBOL(pnpacpi_protocol); | 222 | EXPORT_SYMBOL(pnpacpi_protocol); |
182 | 223 | ||
224 | static char *__init pnpacpi_get_id(struct acpi_device *device) | ||
225 | { | ||
226 | struct acpi_hardware_id *id; | ||
227 | |||
228 | list_for_each_entry(id, &device->pnp.ids, list) { | ||
229 | if (ispnpidacpi(id->id)) | ||
230 | return id->id; | ||
231 | } | ||
232 | |||
233 | return NULL; | ||
234 | } | ||
235 | |||
183 | static int __init pnpacpi_add_device(struct acpi_device *device) | 236 | static int __init pnpacpi_add_device(struct acpi_device *device) |
184 | { | 237 | { |
185 | acpi_handle temp = NULL; | 238 | acpi_handle temp = NULL; |
186 | acpi_status status; | 239 | acpi_status status; |
187 | struct pnp_dev *dev; | 240 | struct pnp_dev *dev; |
241 | char *pnpid; | ||
188 | struct acpi_hardware_id *id; | 242 | struct acpi_hardware_id *id; |
189 | 243 | ||
190 | /* | 244 | /* |
@@ -192,11 +246,17 @@ static int __init pnpacpi_add_device(struct acpi_device *device) | |||
192 | * driver should not be loaded. | 246 | * driver should not be loaded. |
193 | */ | 247 | */ |
194 | status = acpi_get_handle(device->handle, "_CRS", &temp); | 248 | status = acpi_get_handle(device->handle, "_CRS", &temp); |
195 | if (ACPI_FAILURE(status) || !ispnpidacpi(acpi_device_hid(device)) || | 249 | if (ACPI_FAILURE(status)) |
196 | is_exclusive_device(device) || (!device->status.present)) | 250 | return 0; |
251 | |||
252 | pnpid = pnpacpi_get_id(device); | ||
253 | if (!pnpid) | ||
254 | return 0; | ||
255 | |||
256 | if (is_exclusive_device(device) || !device->status.present) | ||
197 | return 0; | 257 | return 0; |
198 | 258 | ||
199 | dev = pnp_alloc_dev(&pnpacpi_protocol, num, acpi_device_hid(device)); | 259 | dev = pnp_alloc_dev(&pnpacpi_protocol, num, pnpid); |
200 | if (!dev) | 260 | if (!dev) |
201 | return -ENOMEM; | 261 | return -ENOMEM; |
202 | 262 | ||
@@ -227,7 +287,7 @@ static int __init pnpacpi_add_device(struct acpi_device *device) | |||
227 | pnpacpi_parse_resource_option_data(dev); | 287 | pnpacpi_parse_resource_option_data(dev); |
228 | 288 | ||
229 | list_for_each_entry(id, &device->pnp.ids, list) { | 289 | list_for_each_entry(id, &device->pnp.ids, list) { |
230 | if (!strcmp(id->id, acpi_device_hid(device))) | 290 | if (!strcmp(id->id, pnpid)) |
231 | continue; | 291 | continue; |
232 | if (!ispnpidacpi(id->id)) | 292 | if (!ispnpidacpi(id->id)) |
233 | continue; | 293 | continue; |
diff --git a/drivers/pnp/resource.c b/drivers/pnp/resource.c index e3446ab8b563..a925e6b63d72 100644 --- a/drivers/pnp/resource.c +++ b/drivers/pnp/resource.c | |||
@@ -523,7 +523,7 @@ struct pnp_resource *pnp_add_irq_resource(struct pnp_dev *dev, int irq, | |||
523 | res->start = irq; | 523 | res->start = irq; |
524 | res->end = irq; | 524 | res->end = irq; |
525 | 525 | ||
526 | pnp_dbg(&dev->dev, " add %pr\n", res); | 526 | dev_printk(KERN_DEBUG, &dev->dev, "%pR\n", res); |
527 | return pnp_res; | 527 | return pnp_res; |
528 | } | 528 | } |
529 | 529 | ||
@@ -544,7 +544,7 @@ struct pnp_resource *pnp_add_dma_resource(struct pnp_dev *dev, int dma, | |||
544 | res->start = dma; | 544 | res->start = dma; |
545 | res->end = dma; | 545 | res->end = dma; |
546 | 546 | ||
547 | pnp_dbg(&dev->dev, " add %pr\n", res); | 547 | dev_printk(KERN_DEBUG, &dev->dev, "%pR\n", res); |
548 | return pnp_res; | 548 | return pnp_res; |
549 | } | 549 | } |
550 | 550 | ||
@@ -568,7 +568,7 @@ struct pnp_resource *pnp_add_io_resource(struct pnp_dev *dev, | |||
568 | res->start = start; | 568 | res->start = start; |
569 | res->end = end; | 569 | res->end = end; |
570 | 570 | ||
571 | pnp_dbg(&dev->dev, " add %pr\n", res); | 571 | dev_printk(KERN_DEBUG, &dev->dev, "%pR\n", res); |
572 | return pnp_res; | 572 | return pnp_res; |
573 | } | 573 | } |
574 | 574 | ||
@@ -592,7 +592,7 @@ struct pnp_resource *pnp_add_mem_resource(struct pnp_dev *dev, | |||
592 | res->start = start; | 592 | res->start = start; |
593 | res->end = end; | 593 | res->end = end; |
594 | 594 | ||
595 | pnp_dbg(&dev->dev, " add %pr\n", res); | 595 | dev_printk(KERN_DEBUG, &dev->dev, "%pR\n", res); |
596 | return pnp_res; | 596 | return pnp_res; |
597 | } | 597 | } |
598 | 598 | ||
@@ -616,7 +616,7 @@ struct pnp_resource *pnp_add_bus_resource(struct pnp_dev *dev, | |||
616 | res->start = start; | 616 | res->start = start; |
617 | res->end = end; | 617 | res->end = end; |
618 | 618 | ||
619 | pnp_dbg(&dev->dev, " add %pr\n", res); | 619 | dev_printk(KERN_DEBUG, &dev->dev, "%pR\n", res); |
620 | return pnp_res; | 620 | return pnp_res; |
621 | } | 621 | } |
622 | 622 | ||