diff options
Diffstat (limited to 'drivers/acpi')
-rw-r--r-- | drivers/acpi/asus_acpi.c | 2 | ||||
-rw-r--r-- | drivers/acpi/battery.c | 11 | ||||
-rw-r--r-- | drivers/acpi/dock.c | 1 | ||||
-rw-r--r-- | drivers/acpi/ec.c | 11 | ||||
-rw-r--r-- | drivers/acpi/pci_irq.c | 4 | ||||
-rw-r--r-- | drivers/acpi/processor_idle.c | 19 | ||||
-rw-r--r-- | drivers/acpi/sbshc.c | 1 | ||||
-rw-r--r-- | drivers/acpi/scan.c | 18 | ||||
-rw-r--r-- | drivers/acpi/sleep/main.c | 71 | ||||
-rw-r--r-- | drivers/acpi/video.c | 60 |
10 files changed, 50 insertions, 148 deletions
diff --git a/drivers/acpi/asus_acpi.c b/drivers/acpi/asus_acpi.c index d25ef961415c..44ad90c03c2e 100644 --- a/drivers/acpi/asus_acpi.c +++ b/drivers/acpi/asus_acpi.c | |||
@@ -610,7 +610,7 @@ write_led(const char __user * buffer, unsigned long count, | |||
610 | (led_out) ? (hotk->status | ledmask) : (hotk->status & ~ledmask); | 610 | (led_out) ? (hotk->status | ledmask) : (hotk->status & ~ledmask); |
611 | 611 | ||
612 | if (invert) /* invert target value */ | 612 | if (invert) /* invert target value */ |
613 | led_out = !led_out & 0x1; | 613 | led_out = !led_out; |
614 | 614 | ||
615 | if (!write_acpi_int(hotk->handle, ledname, led_out, NULL)) | 615 | if (!write_acpi_int(hotk->handle, ledname, led_out, NULL)) |
616 | printk(KERN_WARNING "Asus ACPI: LED (%s) write failed\n", | 616 | printk(KERN_WARNING "Asus ACPI: LED (%s) write failed\n", |
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index f6215e809808..d5729d5dc190 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c | |||
@@ -293,13 +293,12 @@ static int extract_package(struct acpi_battery *battery, | |||
293 | strncpy(ptr, (u8 *)&element->integer.value, | 293 | strncpy(ptr, (u8 *)&element->integer.value, |
294 | sizeof(acpi_integer)); | 294 | sizeof(acpi_integer)); |
295 | ptr[sizeof(acpi_integer)] = 0; | 295 | ptr[sizeof(acpi_integer)] = 0; |
296 | } else return -EFAULT; | 296 | } else |
297 | *ptr = 0; /* don't have value */ | ||
297 | } else { | 298 | } else { |
298 | if (element->type == ACPI_TYPE_INTEGER) { | 299 | int *x = (int *)((u8 *)battery + offsets[i].offset); |
299 | int *x = (int *)((u8 *)battery + | 300 | *x = (element->type == ACPI_TYPE_INTEGER) ? |
300 | offsets[i].offset); | 301 | element->integer.value : -1; |
301 | *x = element->integer.value; | ||
302 | } else return -EFAULT; | ||
303 | } | 302 | } |
304 | } | 303 | } |
305 | return 0; | 304 | return 0; |
diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c index 307cef65c247..fa44fb96fc34 100644 --- a/drivers/acpi/dock.c +++ b/drivers/acpi/dock.c | |||
@@ -710,6 +710,7 @@ static ssize_t write_undock(struct device *dev, struct device_attribute *attr, | |||
710 | if (!count) | 710 | if (!count) |
711 | return -EINVAL; | 711 | return -EINVAL; |
712 | 712 | ||
713 | begin_undock(dock_station); | ||
713 | ret = handle_eject_request(dock_station, ACPI_NOTIFY_EJECT_REQUEST); | 714 | ret = handle_eject_request(dock_station, ACPI_NOTIFY_EJECT_REQUEST); |
714 | return ret ? ret: count; | 715 | return ret ? ret: count; |
715 | } | 716 | } |
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index e7e197e3a4ff..7222a18a0319 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
@@ -129,7 +129,6 @@ static struct acpi_ec { | |||
129 | struct mutex lock; | 129 | struct mutex lock; |
130 | wait_queue_head_t wait; | 130 | wait_queue_head_t wait; |
131 | struct list_head list; | 131 | struct list_head list; |
132 | atomic_t irq_count; | ||
133 | u8 handlers_installed; | 132 | u8 handlers_installed; |
134 | } *boot_ec, *first_ec; | 133 | } *boot_ec, *first_ec; |
135 | 134 | ||
@@ -182,8 +181,6 @@ static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, int force_poll) | |||
182 | { | 181 | { |
183 | int ret = 0; | 182 | int ret = 0; |
184 | 183 | ||
185 | atomic_set(&ec->irq_count, 0); | ||
186 | |||
187 | if (unlikely(event == ACPI_EC_EVENT_OBF_1 && | 184 | if (unlikely(event == ACPI_EC_EVENT_OBF_1 && |
188 | test_bit(EC_FLAGS_NO_OBF1_GPE, &ec->flags))) | 185 | test_bit(EC_FLAGS_NO_OBF1_GPE, &ec->flags))) |
189 | force_poll = 1; | 186 | force_poll = 1; |
@@ -230,7 +227,6 @@ static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, int force_poll) | |||
230 | while (time_before(jiffies, delay)) { | 227 | while (time_before(jiffies, delay)) { |
231 | if (acpi_ec_check_status(ec, event)) | 228 | if (acpi_ec_check_status(ec, event)) |
232 | goto end; | 229 | goto end; |
233 | msleep(5); | ||
234 | } | 230 | } |
235 | } | 231 | } |
236 | pr_err(PREFIX "acpi_ec_wait timeout," | 232 | pr_err(PREFIX "acpi_ec_wait timeout," |
@@ -533,13 +529,6 @@ static u32 acpi_ec_gpe_handler(void *data) | |||
533 | struct acpi_ec *ec = data; | 529 | struct acpi_ec *ec = data; |
534 | 530 | ||
535 | pr_debug(PREFIX "~~~> interrupt\n"); | 531 | pr_debug(PREFIX "~~~> interrupt\n"); |
536 | atomic_inc(&ec->irq_count); | ||
537 | if (atomic_read(&ec->irq_count) > 5) { | ||
538 | pr_err(PREFIX "GPE storm detected, disabling EC GPE\n"); | ||
539 | acpi_disable_gpe(NULL, ec->gpe, ACPI_ISR); | ||
540 | clear_bit(EC_FLAGS_GPE_MODE, &ec->flags); | ||
541 | return ACPI_INTERRUPT_HANDLED; | ||
542 | } | ||
543 | clear_bit(EC_FLAGS_WAIT_GPE, &ec->flags); | 532 | clear_bit(EC_FLAGS_WAIT_GPE, &ec->flags); |
544 | if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags)) | 533 | if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags)) |
545 | wake_up(&ec->wait); | 534 | wake_up(&ec->wait); |
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c index 7af414a3c63e..89022a74faee 100644 --- a/drivers/acpi/pci_irq.c +++ b/drivers/acpi/pci_irq.c | |||
@@ -131,8 +131,8 @@ struct prt_quirk { | |||
131 | */ | 131 | */ |
132 | static struct prt_quirk prt_quirks[] = { | 132 | static struct prt_quirk prt_quirks[] = { |
133 | { medion_md9580, 0, 0, 9, 'A', | 133 | { medion_md9580, 0, 0, 9, 'A', |
134 | "\\_SB_.PCI0.ISA.LNKA", | 134 | "\\_SB_.PCI0.ISA_.LNKA", |
135 | "\\_SB_.PCI0.ISA.LNKB"}, | 135 | "\\_SB_.PCI0.ISA_.LNKB"}, |
136 | { dell_optiplex, 0, 0, 0xd, 'A', | 136 | { dell_optiplex, 0, 0, 0xd, 'A', |
137 | "\\_SB_.LNKB", | 137 | "\\_SB_.LNKB", |
138 | "\\_SB_.LNKA"}, | 138 | "\\_SB_.LNKA"}, |
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 6f3b217699e9..788da9781f80 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
@@ -216,8 +216,10 @@ static void acpi_safe_halt(void) | |||
216 | * test NEED_RESCHED: | 216 | * test NEED_RESCHED: |
217 | */ | 217 | */ |
218 | smp_mb(); | 218 | smp_mb(); |
219 | if (!need_resched()) | 219 | if (!need_resched()) { |
220 | safe_halt(); | 220 | safe_halt(); |
221 | local_irq_disable(); | ||
222 | } | ||
221 | current_thread_info()->status |= TS_POLLING; | 223 | current_thread_info()->status |= TS_POLLING; |
222 | } | 224 | } |
223 | 225 | ||
@@ -421,7 +423,9 @@ static void acpi_processor_idle(void) | |||
421 | else | 423 | else |
422 | acpi_safe_halt(); | 424 | acpi_safe_halt(); |
423 | 425 | ||
424 | local_irq_enable(); | 426 | if (irqs_disabled()) |
427 | local_irq_enable(); | ||
428 | |||
425 | return; | 429 | return; |
426 | } | 430 | } |
427 | 431 | ||
@@ -530,7 +534,9 @@ static void acpi_processor_idle(void) | |||
530 | * skew otherwise. | 534 | * skew otherwise. |
531 | */ | 535 | */ |
532 | sleep_ticks = 0xFFFFFFFF; | 536 | sleep_ticks = 0xFFFFFFFF; |
533 | local_irq_enable(); | 537 | if (irqs_disabled()) |
538 | local_irq_enable(); | ||
539 | |||
534 | break; | 540 | break; |
535 | 541 | ||
536 | case ACPI_STATE_C2: | 542 | case ACPI_STATE_C2: |
@@ -1481,7 +1487,6 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev, | |||
1481 | return 0; | 1487 | return 0; |
1482 | } | 1488 | } |
1483 | 1489 | ||
1484 | acpi_unlazy_tlb(smp_processor_id()); | ||
1485 | /* | 1490 | /* |
1486 | * Must be done before busmaster disable as we might need to | 1491 | * Must be done before busmaster disable as we might need to |
1487 | * access HPET ! | 1492 | * access HPET ! |
@@ -1571,6 +1576,8 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev, | |||
1571 | return 0; | 1576 | return 0; |
1572 | } | 1577 | } |
1573 | 1578 | ||
1579 | acpi_unlazy_tlb(smp_processor_id()); | ||
1580 | |||
1574 | /* Tell the scheduler that we are going deep-idle: */ | 1581 | /* Tell the scheduler that we are going deep-idle: */ |
1575 | sched_clock_idle_sleep_event(); | 1582 | sched_clock_idle_sleep_event(); |
1576 | /* | 1583 | /* |
@@ -1686,7 +1693,9 @@ static int acpi_processor_setup_cpuidle(struct acpi_processor *pr) | |||
1686 | switch (cx->type) { | 1693 | switch (cx->type) { |
1687 | case ACPI_STATE_C1: | 1694 | case ACPI_STATE_C1: |
1688 | state->flags |= CPUIDLE_FLAG_SHALLOW; | 1695 | state->flags |= CPUIDLE_FLAG_SHALLOW; |
1689 | state->flags |= CPUIDLE_FLAG_TIME_VALID; | 1696 | if (cx->entry_method == ACPI_CSTATE_FFH) |
1697 | state->flags |= CPUIDLE_FLAG_TIME_VALID; | ||
1698 | |||
1690 | state->enter = acpi_idle_enter_c1; | 1699 | state->enter = acpi_idle_enter_c1; |
1691 | dev->safe_state = state; | 1700 | dev->safe_state = state; |
1692 | break; | 1701 | break; |
diff --git a/drivers/acpi/sbshc.c b/drivers/acpi/sbshc.c index a2cf3008ce6c..bcf2c70fca87 100644 --- a/drivers/acpi/sbshc.c +++ b/drivers/acpi/sbshc.c | |||
@@ -130,7 +130,6 @@ static int acpi_smbus_transaction(struct acpi_smb_hc *hc, u8 protocol, | |||
130 | goto end; | 130 | goto end; |
131 | } | 131 | } |
132 | smb_hc_write(hc, ACPI_SMB_COMMAND, command); | 132 | smb_hc_write(hc, ACPI_SMB_COMMAND, command); |
133 | smb_hc_write(hc, ACPI_SMB_COMMAND, command); | ||
134 | if (!(protocol & 0x01)) { | 133 | if (!(protocol & 0x01)) { |
135 | smb_hc_write(hc, ACPI_SMB_BLOCK_COUNT, length); | 134 | smb_hc_write(hc, ACPI_SMB_BLOCK_COUNT, length); |
136 | for (i = 0; i < length; ++i) | 135 | for (i = 0; i < length; ++i) |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 57570ac47803..e6ce262b5d44 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -39,20 +39,26 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias, | |||
39 | int size) | 39 | int size) |
40 | { | 40 | { |
41 | int len; | 41 | int len; |
42 | int count; | ||
42 | 43 | ||
43 | if (!acpi_dev->flags.hardware_id) | 44 | if (!acpi_dev->flags.hardware_id && !acpi_dev->flags.compatible_ids) |
44 | return -ENODEV; | 45 | return -ENODEV; |
45 | 46 | ||
46 | len = snprintf(modalias, size, "acpi:%s:", | 47 | len = snprintf(modalias, size, "acpi:"); |
47 | acpi_dev->pnp.hardware_id); | ||
48 | if (len < 0 || len >= size) | ||
49 | return -EINVAL; | ||
50 | size -= len; | 48 | size -= len; |
51 | 49 | ||
50 | if (acpi_dev->flags.hardware_id) { | ||
51 | count = snprintf(&modalias[len], size, "%s:", | ||
52 | acpi_dev->pnp.hardware_id); | ||
53 | if (count < 0 || count >= size) | ||
54 | return -EINVAL; | ||
55 | len += count; | ||
56 | size -= count; | ||
57 | } | ||
58 | |||
52 | if (acpi_dev->flags.compatible_ids) { | 59 | if (acpi_dev->flags.compatible_ids) { |
53 | struct acpi_compatible_id_list *cid_list; | 60 | struct acpi_compatible_id_list *cid_list; |
54 | int i; | 61 | int i; |
55 | int count; | ||
56 | 62 | ||
57 | cid_list = acpi_dev->pnp.cid_list; | 63 | cid_list = acpi_dev->pnp.cid_list; |
58 | for (i = 0; i < cid_list->count; i++) { | 64 | for (i = 0; i < cid_list->count; i++) { |
diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c index d2f71a54726c..71183eea7906 100644 --- a/drivers/acpi/sleep/main.c +++ b/drivers/acpi/sleep/main.c | |||
@@ -26,21 +26,6 @@ u8 sleep_states[ACPI_S_STATE_COUNT]; | |||
26 | 26 | ||
27 | #ifdef CONFIG_PM_SLEEP | 27 | #ifdef CONFIG_PM_SLEEP |
28 | static u32 acpi_target_sleep_state = ACPI_STATE_S0; | 28 | static u32 acpi_target_sleep_state = ACPI_STATE_S0; |
29 | static bool acpi_sleep_finish_wake_up; | ||
30 | |||
31 | /* | ||
32 | * ACPI 2.0 and later want us to execute _PTS after suspending devices, so we | ||
33 | * allow the user to request that behavior by using the 'acpi_new_pts_ordering' | ||
34 | * kernel command line option that causes the following variable to be set. | ||
35 | */ | ||
36 | static bool new_pts_ordering; | ||
37 | |||
38 | static int __init acpi_new_pts_ordering(char *str) | ||
39 | { | ||
40 | new_pts_ordering = true; | ||
41 | return 1; | ||
42 | } | ||
43 | __setup("acpi_new_pts_ordering", acpi_new_pts_ordering); | ||
44 | #endif | 29 | #endif |
45 | 30 | ||
46 | static int acpi_sleep_prepare(u32 acpi_state) | 31 | static int acpi_sleep_prepare(u32 acpi_state) |
@@ -91,14 +76,6 @@ static int acpi_pm_begin(suspend_state_t pm_state) | |||
91 | 76 | ||
92 | if (sleep_states[acpi_state]) { | 77 | if (sleep_states[acpi_state]) { |
93 | acpi_target_sleep_state = acpi_state; | 78 | acpi_target_sleep_state = acpi_state; |
94 | if (new_pts_ordering) | ||
95 | return 0; | ||
96 | |||
97 | error = acpi_sleep_prepare(acpi_state); | ||
98 | if (error) | ||
99 | acpi_target_sleep_state = ACPI_STATE_S0; | ||
100 | else | ||
101 | acpi_sleep_finish_wake_up = true; | ||
102 | } else { | 79 | } else { |
103 | printk(KERN_ERR "ACPI does not support this state: %d\n", | 80 | printk(KERN_ERR "ACPI does not support this state: %d\n", |
104 | pm_state); | 81 | pm_state); |
@@ -116,14 +93,11 @@ static int acpi_pm_begin(suspend_state_t pm_state) | |||
116 | 93 | ||
117 | static int acpi_pm_prepare(void) | 94 | static int acpi_pm_prepare(void) |
118 | { | 95 | { |
119 | if (new_pts_ordering) { | 96 | int error = acpi_sleep_prepare(acpi_target_sleep_state); |
120 | int error = acpi_sleep_prepare(acpi_target_sleep_state); | ||
121 | 97 | ||
122 | if (error) { | 98 | if (error) { |
123 | acpi_target_sleep_state = ACPI_STATE_S0; | 99 | acpi_target_sleep_state = ACPI_STATE_S0; |
124 | return error; | 100 | return error; |
125 | } | ||
126 | acpi_sleep_finish_wake_up = true; | ||
127 | } | 101 | } |
128 | 102 | ||
129 | return ACPI_SUCCESS(acpi_hw_disable_all_gpes()) ? 0 : -EFAULT; | 103 | return ACPI_SUCCESS(acpi_hw_disable_all_gpes()) ? 0 : -EFAULT; |
@@ -212,7 +186,6 @@ static void acpi_pm_finish(void) | |||
212 | acpi_set_firmware_waking_vector((acpi_physical_address) 0); | 186 | acpi_set_firmware_waking_vector((acpi_physical_address) 0); |
213 | 187 | ||
214 | acpi_target_sleep_state = ACPI_STATE_S0; | 188 | acpi_target_sleep_state = ACPI_STATE_S0; |
215 | acpi_sleep_finish_wake_up = false; | ||
216 | 189 | ||
217 | #ifdef CONFIG_X86 | 190 | #ifdef CONFIG_X86 |
218 | if (init_8259A_after_S1) { | 191 | if (init_8259A_after_S1) { |
@@ -229,11 +202,10 @@ static void acpi_pm_finish(void) | |||
229 | static void acpi_pm_end(void) | 202 | static void acpi_pm_end(void) |
230 | { | 203 | { |
231 | /* | 204 | /* |
232 | * This is necessary in case acpi_pm_finish() is not called directly | 205 | * This is necessary in case acpi_pm_finish() is not called during a |
233 | * during a failing transition to a sleep state. | 206 | * failing transition to a sleep state. |
234 | */ | 207 | */ |
235 | if (acpi_sleep_finish_wake_up) | 208 | acpi_target_sleep_state = ACPI_STATE_S0; |
236 | acpi_pm_finish(); | ||
237 | } | 209 | } |
238 | 210 | ||
239 | static int acpi_pm_state_valid(suspend_state_t pm_state) | 211 | static int acpi_pm_state_valid(suspend_state_t pm_state) |
@@ -285,31 +257,18 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | |||
285 | #ifdef CONFIG_HIBERNATION | 257 | #ifdef CONFIG_HIBERNATION |
286 | static int acpi_hibernation_begin(void) | 258 | static int acpi_hibernation_begin(void) |
287 | { | 259 | { |
288 | int error; | ||
289 | |||
290 | acpi_target_sleep_state = ACPI_STATE_S4; | 260 | acpi_target_sleep_state = ACPI_STATE_S4; |
291 | if (new_pts_ordering) | ||
292 | return 0; | ||
293 | 261 | ||
294 | error = acpi_sleep_prepare(ACPI_STATE_S4); | 262 | return 0; |
295 | if (error) | ||
296 | acpi_target_sleep_state = ACPI_STATE_S0; | ||
297 | else | ||
298 | acpi_sleep_finish_wake_up = true; | ||
299 | |||
300 | return error; | ||
301 | } | 263 | } |
302 | 264 | ||
303 | static int acpi_hibernation_prepare(void) | 265 | static int acpi_hibernation_prepare(void) |
304 | { | 266 | { |
305 | if (new_pts_ordering) { | 267 | int error = acpi_sleep_prepare(ACPI_STATE_S4); |
306 | int error = acpi_sleep_prepare(ACPI_STATE_S4); | ||
307 | 268 | ||
308 | if (error) { | 269 | if (error) { |
309 | acpi_target_sleep_state = ACPI_STATE_S0; | 270 | acpi_target_sleep_state = ACPI_STATE_S0; |
310 | return error; | 271 | return error; |
311 | } | ||
312 | acpi_sleep_finish_wake_up = true; | ||
313 | } | 272 | } |
314 | 273 | ||
315 | return ACPI_SUCCESS(acpi_hw_disable_all_gpes()) ? 0 : -EFAULT; | 274 | return ACPI_SUCCESS(acpi_hw_disable_all_gpes()) ? 0 : -EFAULT; |
@@ -353,17 +312,15 @@ static void acpi_hibernation_finish(void) | |||
353 | acpi_set_firmware_waking_vector((acpi_physical_address) 0); | 312 | acpi_set_firmware_waking_vector((acpi_physical_address) 0); |
354 | 313 | ||
355 | acpi_target_sleep_state = ACPI_STATE_S0; | 314 | acpi_target_sleep_state = ACPI_STATE_S0; |
356 | acpi_sleep_finish_wake_up = false; | ||
357 | } | 315 | } |
358 | 316 | ||
359 | static void acpi_hibernation_end(void) | 317 | static void acpi_hibernation_end(void) |
360 | { | 318 | { |
361 | /* | 319 | /* |
362 | * This is necessary in case acpi_hibernation_finish() is not called | 320 | * This is necessary in case acpi_hibernation_finish() is not called |
363 | * directly during a failing transition to the sleep state. | 321 | * during a failing transition to the sleep state. |
364 | */ | 322 | */ |
365 | if (acpi_sleep_finish_wake_up) | 323 | acpi_target_sleep_state = ACPI_STATE_S0; |
366 | acpi_hibernation_finish(); | ||
367 | } | 324 | } |
368 | 325 | ||
369 | static int acpi_hibernation_pre_restore(void) | 326 | static int acpi_hibernation_pre_restore(void) |
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 1bc0c74f2755..12fb44f16766 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
@@ -807,40 +807,11 @@ static void acpi_video_bus_find_cap(struct acpi_video_bus *video) | |||
807 | static int acpi_video_bus_check(struct acpi_video_bus *video) | 807 | static int acpi_video_bus_check(struct acpi_video_bus *video) |
808 | { | 808 | { |
809 | acpi_status status = -ENOENT; | 809 | acpi_status status = -ENOENT; |
810 | long device_id; | 810 | |
811 | struct device *dev; | ||
812 | struct acpi_device *device; | ||
813 | 811 | ||
814 | if (!video) | 812 | if (!video) |
815 | return -EINVAL; | 813 | return -EINVAL; |
816 | 814 | ||
817 | device = video->device; | ||
818 | |||
819 | status = | ||
820 | acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id); | ||
821 | |||
822 | if (!ACPI_SUCCESS(status)) | ||
823 | return -ENODEV; | ||
824 | |||
825 | /* We need to attempt to determine whether the _ADR refers to a | ||
826 | PCI device or not. There's no terribly good way to do this, | ||
827 | so the best we can hope for is to assume that there'll never | ||
828 | be a video device in the host bridge */ | ||
829 | if (device_id >= 0x10000) { | ||
830 | /* It looks like a PCI device. Does it exist? */ | ||
831 | dev = acpi_get_physical_device(device->handle); | ||
832 | } else { | ||
833 | /* It doesn't look like a PCI device. Does its parent | ||
834 | exist? */ | ||
835 | acpi_handle phandle; | ||
836 | if (acpi_get_parent(device->handle, &phandle)) | ||
837 | return -ENODEV; | ||
838 | dev = acpi_get_physical_device(phandle); | ||
839 | } | ||
840 | if (!dev) | ||
841 | return -ENODEV; | ||
842 | put_device(dev); | ||
843 | |||
844 | /* Since there is no HID, CID and so on for VGA driver, we have | 815 | /* Since there is no HID, CID and so on for VGA driver, we have |
845 | * to check well known required nodes. | 816 | * to check well known required nodes. |
846 | */ | 817 | */ |
@@ -1366,37 +1337,8 @@ acpi_video_bus_write_DOS(struct file *file, | |||
1366 | 1337 | ||
1367 | static int acpi_video_bus_add_fs(struct acpi_device *device) | 1338 | static int acpi_video_bus_add_fs(struct acpi_device *device) |
1368 | { | 1339 | { |
1369 | long device_id; | ||
1370 | int status; | ||
1371 | struct proc_dir_entry *entry = NULL; | 1340 | struct proc_dir_entry *entry = NULL; |
1372 | struct acpi_video_bus *video; | 1341 | struct acpi_video_bus *video; |
1373 | struct device *dev; | ||
1374 | |||
1375 | status = | ||
1376 | acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id); | ||
1377 | |||
1378 | if (!ACPI_SUCCESS(status)) | ||
1379 | return -ENODEV; | ||
1380 | |||
1381 | /* We need to attempt to determine whether the _ADR refers to a | ||
1382 | PCI device or not. There's no terribly good way to do this, | ||
1383 | so the best we can hope for is to assume that there'll never | ||
1384 | be a video device in the host bridge */ | ||
1385 | if (device_id >= 0x10000) { | ||
1386 | /* It looks like a PCI device. Does it exist? */ | ||
1387 | dev = acpi_get_physical_device(device->handle); | ||
1388 | } else { | ||
1389 | /* It doesn't look like a PCI device. Does its parent | ||
1390 | exist? */ | ||
1391 | acpi_handle phandle; | ||
1392 | if (acpi_get_parent(device->handle, &phandle)) | ||
1393 | return -ENODEV; | ||
1394 | dev = acpi_get_physical_device(phandle); | ||
1395 | } | ||
1396 | if (!dev) | ||
1397 | return -ENODEV; | ||
1398 | put_device(dev); | ||
1399 | |||
1400 | 1342 | ||
1401 | 1343 | ||
1402 | video = acpi_driver_data(device); | 1344 | video = acpi_driver_data(device); |