diff options
Diffstat (limited to 'drivers/acpi')
-rw-r--r-- | drivers/acpi/acpi_platform.c | 2 | ||||
-rw-r--r-- | drivers/acpi/battery.c | 4 | ||||
-rw-r--r-- | drivers/acpi/blacklist.c | 8 | ||||
-rw-r--r-- | drivers/acpi/dock.c | 2 | ||||
-rw-r--r-- | drivers/acpi/ec.c | 123 | ||||
-rw-r--r-- | drivers/acpi/glue.c | 4 | ||||
-rw-r--r-- | drivers/acpi/pmic/intel_pmic_crc.c | 2 | ||||
-rw-r--r-- | drivers/acpi/scan.c | 388 | ||||
-rw-r--r-- | drivers/acpi/sleep.c | 17 | ||||
-rw-r--r-- | drivers/acpi/sleep.h | 2 | ||||
-rw-r--r-- | drivers/acpi/sysfs.c | 2 | ||||
-rw-r--r-- | drivers/acpi/video.c | 36 | ||||
-rw-r--r-- | drivers/acpi/video_detect.c | 8 |
13 files changed, 367 insertions, 231 deletions
diff --git a/drivers/acpi/acpi_platform.c b/drivers/acpi/acpi_platform.c index 1284138e42ab..4bf75597f732 100644 --- a/drivers/acpi/acpi_platform.c +++ b/drivers/acpi/acpi_platform.c | |||
@@ -102,7 +102,7 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev) | |||
102 | pdevinfo.id = -1; | 102 | pdevinfo.id = -1; |
103 | pdevinfo.res = resources; | 103 | pdevinfo.res = resources; |
104 | pdevinfo.num_res = count; | 104 | pdevinfo.num_res = count; |
105 | pdevinfo.acpi_node.companion = adev; | 105 | pdevinfo.fwnode = acpi_fwnode_handle(adev); |
106 | pdevinfo.dma_mask = DMA_BIT_MASK(32); | 106 | pdevinfo.dma_mask = DMA_BIT_MASK(32); |
107 | pdev = platform_device_register_full(&pdevinfo); | 107 | pdev = platform_device_register_full(&pdevinfo); |
108 | if (IS_ERR(pdev)) | 108 | if (IS_ERR(pdev)) |
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index d98ba4355819..baebd1a9b811 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c | |||
@@ -530,8 +530,8 @@ static int acpi_battery_get_state(struct acpi_battery *battery) | |||
530 | battery->rate_now != ACPI_BATTERY_VALUE_UNKNOWN && | 530 | battery->rate_now != ACPI_BATTERY_VALUE_UNKNOWN && |
531 | (s16)(battery->rate_now) < 0) { | 531 | (s16)(battery->rate_now) < 0) { |
532 | battery->rate_now = abs((s16)battery->rate_now); | 532 | battery->rate_now = abs((s16)battery->rate_now); |
533 | printk_once(KERN_WARNING FW_BUG "battery: (dis)charge rate" | 533 | printk_once(KERN_WARNING FW_BUG |
534 | " invalid.\n"); | 534 | "battery: (dis)charge rate invalid.\n"); |
535 | } | 535 | } |
536 | 536 | ||
537 | if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags) | 537 | if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags) |
diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c index 9b693d54c743..1d1791935c31 100644 --- a/drivers/acpi/blacklist.c +++ b/drivers/acpi/blacklist.c | |||
@@ -215,6 +215,14 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { | |||
215 | }, | 215 | }, |
216 | { | 216 | { |
217 | .callback = dmi_disable_osi_vista, | 217 | .callback = dmi_disable_osi_vista, |
218 | .ident = "VGN-SR19XN", | ||
219 | .matches = { | ||
220 | DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), | ||
221 | DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SR19XN"), | ||
222 | }, | ||
223 | }, | ||
224 | { | ||
225 | .callback = dmi_disable_osi_vista, | ||
218 | .ident = "Toshiba Satellite L355", | 226 | .ident = "Toshiba Satellite L355", |
219 | .matches = { | 227 | .matches = { |
220 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | 228 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), |
diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c index d9339b442a4e..a688aa243f6c 100644 --- a/drivers/acpi/dock.c +++ b/drivers/acpi/dock.c | |||
@@ -615,7 +615,7 @@ void acpi_dock_add(struct acpi_device *adev) | |||
615 | memset(&pdevinfo, 0, sizeof(pdevinfo)); | 615 | memset(&pdevinfo, 0, sizeof(pdevinfo)); |
616 | pdevinfo.name = "dock"; | 616 | pdevinfo.name = "dock"; |
617 | pdevinfo.id = dock_station_count; | 617 | pdevinfo.id = dock_station_count; |
618 | pdevinfo.acpi_node.companion = adev; | 618 | pdevinfo.fwnode = acpi_fwnode_handle(adev); |
619 | pdevinfo.data = &ds; | 619 | pdevinfo.data = &ds; |
620 | pdevinfo.size_data = sizeof(ds); | 620 | pdevinfo.size_data = sizeof(ds); |
621 | dd = platform_device_register_full(&pdevinfo); | 621 | dd = platform_device_register_full(&pdevinfo); |
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index a8dd2f763382..220d6406c9e9 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
@@ -137,6 +137,50 @@ static int EC_FLAGS_CLEAR_ON_RESUME; /* Needs acpi_ec_clear() on boot/resume */ | |||
137 | static int EC_FLAGS_QUERY_HANDSHAKE; /* Needs QR_EC issued when SCI_EVT set */ | 137 | static int EC_FLAGS_QUERY_HANDSHAKE; /* Needs QR_EC issued when SCI_EVT set */ |
138 | 138 | ||
139 | /* -------------------------------------------------------------------------- | 139 | /* -------------------------------------------------------------------------- |
140 | * Logging/Debugging | ||
141 | * -------------------------------------------------------------------------- */ | ||
142 | |||
143 | /* | ||
144 | * Splitters used by the developers to track the boundary of the EC | ||
145 | * handling processes. | ||
146 | */ | ||
147 | #ifdef DEBUG | ||
148 | #define EC_DBG_SEP " " | ||
149 | #define EC_DBG_DRV "+++++" | ||
150 | #define EC_DBG_STM "=====" | ||
151 | #define EC_DBG_REQ "*****" | ||
152 | #define EC_DBG_EVT "#####" | ||
153 | #else | ||
154 | #define EC_DBG_SEP "" | ||
155 | #define EC_DBG_DRV | ||
156 | #define EC_DBG_STM | ||
157 | #define EC_DBG_REQ | ||
158 | #define EC_DBG_EVT | ||
159 | #endif | ||
160 | |||
161 | #define ec_log_raw(fmt, ...) \ | ||
162 | pr_info(fmt "\n", ##__VA_ARGS__) | ||
163 | #define ec_dbg_raw(fmt, ...) \ | ||
164 | pr_debug(fmt "\n", ##__VA_ARGS__) | ||
165 | #define ec_log(filter, fmt, ...) \ | ||
166 | ec_log_raw(filter EC_DBG_SEP fmt EC_DBG_SEP filter, ##__VA_ARGS__) | ||
167 | #define ec_dbg(filter, fmt, ...) \ | ||
168 | ec_dbg_raw(filter EC_DBG_SEP fmt EC_DBG_SEP filter, ##__VA_ARGS__) | ||
169 | |||
170 | #define ec_log_drv(fmt, ...) \ | ||
171 | ec_log(EC_DBG_DRV, fmt, ##__VA_ARGS__) | ||
172 | #define ec_dbg_drv(fmt, ...) \ | ||
173 | ec_dbg(EC_DBG_DRV, fmt, ##__VA_ARGS__) | ||
174 | #define ec_dbg_stm(fmt, ...) \ | ||
175 | ec_dbg(EC_DBG_STM, fmt, ##__VA_ARGS__) | ||
176 | #define ec_dbg_req(fmt, ...) \ | ||
177 | ec_dbg(EC_DBG_REQ, fmt, ##__VA_ARGS__) | ||
178 | #define ec_dbg_evt(fmt, ...) \ | ||
179 | ec_dbg(EC_DBG_EVT, fmt, ##__VA_ARGS__) | ||
180 | #define ec_dbg_ref(ec, fmt, ...) \ | ||
181 | ec_dbg_raw("%lu: " fmt, ec->reference_count, ## __VA_ARGS__) | ||
182 | |||
183 | /* -------------------------------------------------------------------------- | ||
140 | * Device Flags | 184 | * Device Flags |
141 | * -------------------------------------------------------------------------- */ | 185 | * -------------------------------------------------------------------------- */ |
142 | 186 | ||
@@ -159,14 +203,14 @@ static inline u8 acpi_ec_read_status(struct acpi_ec *ec) | |||
159 | { | 203 | { |
160 | u8 x = inb(ec->command_addr); | 204 | u8 x = inb(ec->command_addr); |
161 | 205 | ||
162 | pr_debug("EC_SC(R) = 0x%2.2x " | 206 | ec_dbg_raw("EC_SC(R) = 0x%2.2x " |
163 | "SCI_EVT=%d BURST=%d CMD=%d IBF=%d OBF=%d\n", | 207 | "SCI_EVT=%d BURST=%d CMD=%d IBF=%d OBF=%d", |
164 | x, | 208 | x, |
165 | !!(x & ACPI_EC_FLAG_SCI), | 209 | !!(x & ACPI_EC_FLAG_SCI), |
166 | !!(x & ACPI_EC_FLAG_BURST), | 210 | !!(x & ACPI_EC_FLAG_BURST), |
167 | !!(x & ACPI_EC_FLAG_CMD), | 211 | !!(x & ACPI_EC_FLAG_CMD), |
168 | !!(x & ACPI_EC_FLAG_IBF), | 212 | !!(x & ACPI_EC_FLAG_IBF), |
169 | !!(x & ACPI_EC_FLAG_OBF)); | 213 | !!(x & ACPI_EC_FLAG_OBF)); |
170 | return x; | 214 | return x; |
171 | } | 215 | } |
172 | 216 | ||
@@ -175,20 +219,20 @@ static inline u8 acpi_ec_read_data(struct acpi_ec *ec) | |||
175 | u8 x = inb(ec->data_addr); | 219 | u8 x = inb(ec->data_addr); |
176 | 220 | ||
177 | ec->curr->timestamp = jiffies; | 221 | ec->curr->timestamp = jiffies; |
178 | pr_debug("EC_DATA(R) = 0x%2.2x\n", x); | 222 | ec_dbg_raw("EC_DATA(R) = 0x%2.2x", x); |
179 | return x; | 223 | return x; |
180 | } | 224 | } |
181 | 225 | ||
182 | static inline void acpi_ec_write_cmd(struct acpi_ec *ec, u8 command) | 226 | static inline void acpi_ec_write_cmd(struct acpi_ec *ec, u8 command) |
183 | { | 227 | { |
184 | pr_debug("EC_SC(W) = 0x%2.2x\n", command); | 228 | ec_dbg_raw("EC_SC(W) = 0x%2.2x", command); |
185 | outb(command, ec->command_addr); | 229 | outb(command, ec->command_addr); |
186 | ec->curr->timestamp = jiffies; | 230 | ec->curr->timestamp = jiffies; |
187 | } | 231 | } |
188 | 232 | ||
189 | static inline void acpi_ec_write_data(struct acpi_ec *ec, u8 data) | 233 | static inline void acpi_ec_write_data(struct acpi_ec *ec, u8 data) |
190 | { | 234 | { |
191 | pr_debug("EC_DATA(W) = 0x%2.2x\n", data); | 235 | ec_dbg_raw("EC_DATA(W) = 0x%2.2x", data); |
192 | outb(data, ec->data_addr); | 236 | outb(data, ec->data_addr); |
193 | ec->curr->timestamp = jiffies; | 237 | ec->curr->timestamp = jiffies; |
194 | } | 238 | } |
@@ -240,7 +284,7 @@ static inline void acpi_ec_enable_gpe(struct acpi_ec *ec, bool open) | |||
240 | * software need to manually trigger a pseudo GPE event on | 284 | * software need to manually trigger a pseudo GPE event on |
241 | * EN=1 writes. | 285 | * EN=1 writes. |
242 | */ | 286 | */ |
243 | pr_debug("***** Polling quirk *****\n"); | 287 | ec_dbg_raw("Polling quirk"); |
244 | advance_transaction(ec); | 288 | advance_transaction(ec); |
245 | } | 289 | } |
246 | } | 290 | } |
@@ -299,7 +343,7 @@ static void acpi_ec_set_storm(struct acpi_ec *ec, u8 flag) | |||
299 | { | 343 | { |
300 | if (!test_bit(flag, &ec->flags)) { | 344 | if (!test_bit(flag, &ec->flags)) { |
301 | acpi_ec_disable_gpe(ec, false); | 345 | acpi_ec_disable_gpe(ec, false); |
302 | pr_debug("+++++ Polling enabled +++++\n"); | 346 | ec_dbg_drv("Polling enabled"); |
303 | set_bit(flag, &ec->flags); | 347 | set_bit(flag, &ec->flags); |
304 | } | 348 | } |
305 | } | 349 | } |
@@ -309,7 +353,7 @@ static void acpi_ec_clear_storm(struct acpi_ec *ec, u8 flag) | |||
309 | if (test_bit(flag, &ec->flags)) { | 353 | if (test_bit(flag, &ec->flags)) { |
310 | clear_bit(flag, &ec->flags); | 354 | clear_bit(flag, &ec->flags); |
311 | acpi_ec_enable_gpe(ec, false); | 355 | acpi_ec_enable_gpe(ec, false); |
312 | pr_debug("+++++ Polling disabled +++++\n"); | 356 | ec_dbg_drv("Polling disabled"); |
313 | } | 357 | } |
314 | } | 358 | } |
315 | 359 | ||
@@ -335,7 +379,7 @@ static bool acpi_ec_submit_flushable_request(struct acpi_ec *ec) | |||
335 | static void acpi_ec_submit_query(struct acpi_ec *ec) | 379 | static void acpi_ec_submit_query(struct acpi_ec *ec) |
336 | { | 380 | { |
337 | if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) { | 381 | if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) { |
338 | pr_debug("***** Event started *****\n"); | 382 | ec_dbg_req("Event started"); |
339 | schedule_work(&ec->work); | 383 | schedule_work(&ec->work); |
340 | } | 384 | } |
341 | } | 385 | } |
@@ -344,7 +388,7 @@ static void acpi_ec_complete_query(struct acpi_ec *ec) | |||
344 | { | 388 | { |
345 | if (ec->curr->command == ACPI_EC_COMMAND_QUERY) { | 389 | if (ec->curr->command == ACPI_EC_COMMAND_QUERY) { |
346 | clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); | 390 | clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); |
347 | pr_debug("***** Event stopped *****\n"); | 391 | ec_dbg_req("Event stopped"); |
348 | } | 392 | } |
349 | } | 393 | } |
350 | 394 | ||
@@ -366,8 +410,8 @@ static void advance_transaction(struct acpi_ec *ec) | |||
366 | u8 status; | 410 | u8 status; |
367 | bool wakeup = false; | 411 | bool wakeup = false; |
368 | 412 | ||
369 | pr_debug("===== %s (%d) =====\n", | 413 | ec_dbg_stm("%s (%d)", in_interrupt() ? "IRQ" : "TASK", |
370 | in_interrupt() ? "IRQ" : "TASK", smp_processor_id()); | 414 | smp_processor_id()); |
371 | /* | 415 | /* |
372 | * By always clearing STS before handling all indications, we can | 416 | * By always clearing STS before handling all indications, we can |
373 | * ensure a hardware STS 0->1 change after this clearing can always | 417 | * ensure a hardware STS 0->1 change after this clearing can always |
@@ -390,8 +434,8 @@ static void advance_transaction(struct acpi_ec *ec) | |||
390 | if (t->rlen == t->ri) { | 434 | if (t->rlen == t->ri) { |
391 | t->flags |= ACPI_EC_COMMAND_COMPLETE; | 435 | t->flags |= ACPI_EC_COMMAND_COMPLETE; |
392 | if (t->command == ACPI_EC_COMMAND_QUERY) | 436 | if (t->command == ACPI_EC_COMMAND_QUERY) |
393 | pr_debug("***** Command(%s) hardware completion *****\n", | 437 | ec_dbg_req("Command(%s) hardware completion", |
394 | acpi_ec_cmd_string(t->command)); | 438 | acpi_ec_cmd_string(t->command)); |
395 | wakeup = true; | 439 | wakeup = true; |
396 | } | 440 | } |
397 | } else | 441 | } else |
@@ -410,8 +454,8 @@ static void advance_transaction(struct acpi_ec *ec) | |||
410 | acpi_ec_complete_query(ec); | 454 | acpi_ec_complete_query(ec); |
411 | t->rdata[t->ri++] = 0x00; | 455 | t->rdata[t->ri++] = 0x00; |
412 | t->flags |= ACPI_EC_COMMAND_COMPLETE; | 456 | t->flags |= ACPI_EC_COMMAND_COMPLETE; |
413 | pr_debug("***** Command(%s) software completion *****\n", | 457 | ec_dbg_req("Command(%s) software completion", |
414 | acpi_ec_cmd_string(t->command)); | 458 | acpi_ec_cmd_string(t->command)); |
415 | wakeup = true; | 459 | wakeup = true; |
416 | } else if ((status & ACPI_EC_FLAG_IBF) == 0) { | 460 | } else if ((status & ACPI_EC_FLAG_IBF) == 0) { |
417 | acpi_ec_write_cmd(ec, t->command); | 461 | acpi_ec_write_cmd(ec, t->command); |
@@ -502,21 +546,21 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, | |||
502 | ret = -EINVAL; | 546 | ret = -EINVAL; |
503 | goto unlock; | 547 | goto unlock; |
504 | } | 548 | } |
549 | ec_dbg_ref(ec, "Increase command"); | ||
505 | /* following two actions should be kept atomic */ | 550 | /* following two actions should be kept atomic */ |
506 | ec->curr = t; | 551 | ec->curr = t; |
507 | pr_debug("***** Command(%s) started *****\n", | 552 | ec_dbg_req("Command(%s) started", acpi_ec_cmd_string(t->command)); |
508 | acpi_ec_cmd_string(t->command)); | ||
509 | start_transaction(ec); | 553 | start_transaction(ec); |
510 | spin_unlock_irqrestore(&ec->lock, tmp); | 554 | spin_unlock_irqrestore(&ec->lock, tmp); |
511 | ret = ec_poll(ec); | 555 | ret = ec_poll(ec); |
512 | spin_lock_irqsave(&ec->lock, tmp); | 556 | spin_lock_irqsave(&ec->lock, tmp); |
513 | if (t->irq_count == ec_storm_threshold) | 557 | if (t->irq_count == ec_storm_threshold) |
514 | acpi_ec_clear_storm(ec, EC_FLAGS_COMMAND_STORM); | 558 | acpi_ec_clear_storm(ec, EC_FLAGS_COMMAND_STORM); |
515 | pr_debug("***** Command(%s) stopped *****\n", | 559 | ec_dbg_req("Command(%s) stopped", acpi_ec_cmd_string(t->command)); |
516 | acpi_ec_cmd_string(t->command)); | ||
517 | ec->curr = NULL; | 560 | ec->curr = NULL; |
518 | /* Disable GPE for command processing (IBF=0/OBF=1) */ | 561 | /* Disable GPE for command processing (IBF=0/OBF=1) */ |
519 | acpi_ec_complete_request(ec); | 562 | acpi_ec_complete_request(ec); |
563 | ec_dbg_ref(ec, "Decrease command"); | ||
520 | unlock: | 564 | unlock: |
521 | spin_unlock_irqrestore(&ec->lock, tmp); | 565 | spin_unlock_irqrestore(&ec->lock, tmp); |
522 | return ret; | 566 | return ret; |
@@ -676,11 +720,13 @@ static void acpi_ec_start(struct acpi_ec *ec, bool resuming) | |||
676 | 720 | ||
677 | spin_lock_irqsave(&ec->lock, flags); | 721 | spin_lock_irqsave(&ec->lock, flags); |
678 | if (!test_and_set_bit(EC_FLAGS_STARTED, &ec->flags)) { | 722 | if (!test_and_set_bit(EC_FLAGS_STARTED, &ec->flags)) { |
679 | pr_debug("+++++ Starting EC +++++\n"); | 723 | ec_dbg_drv("Starting EC"); |
680 | /* Enable GPE for event processing (SCI_EVT=1) */ | 724 | /* Enable GPE for event processing (SCI_EVT=1) */ |
681 | if (!resuming) | 725 | if (!resuming) { |
682 | acpi_ec_submit_request(ec); | 726 | acpi_ec_submit_request(ec); |
683 | pr_debug("EC started\n"); | 727 | ec_dbg_ref(ec, "Increase driver"); |
728 | } | ||
729 | ec_log_drv("EC started"); | ||
684 | } | 730 | } |
685 | spin_unlock_irqrestore(&ec->lock, flags); | 731 | spin_unlock_irqrestore(&ec->lock, flags); |
686 | } | 732 | } |
@@ -702,17 +748,19 @@ static void acpi_ec_stop(struct acpi_ec *ec, bool suspending) | |||
702 | 748 | ||
703 | spin_lock_irqsave(&ec->lock, flags); | 749 | spin_lock_irqsave(&ec->lock, flags); |
704 | if (acpi_ec_started(ec)) { | 750 | if (acpi_ec_started(ec)) { |
705 | pr_debug("+++++ Stopping EC +++++\n"); | 751 | ec_dbg_drv("Stopping EC"); |
706 | set_bit(EC_FLAGS_STOPPED, &ec->flags); | 752 | set_bit(EC_FLAGS_STOPPED, &ec->flags); |
707 | spin_unlock_irqrestore(&ec->lock, flags); | 753 | spin_unlock_irqrestore(&ec->lock, flags); |
708 | wait_event(ec->wait, acpi_ec_stopped(ec)); | 754 | wait_event(ec->wait, acpi_ec_stopped(ec)); |
709 | spin_lock_irqsave(&ec->lock, flags); | 755 | spin_lock_irqsave(&ec->lock, flags); |
710 | /* Disable GPE for event processing (SCI_EVT=1) */ | 756 | /* Disable GPE for event processing (SCI_EVT=1) */ |
711 | if (!suspending) | 757 | if (!suspending) { |
712 | acpi_ec_complete_request(ec); | 758 | acpi_ec_complete_request(ec); |
759 | ec_dbg_ref(ec, "Decrease driver"); | ||
760 | } | ||
713 | clear_bit(EC_FLAGS_STARTED, &ec->flags); | 761 | clear_bit(EC_FLAGS_STARTED, &ec->flags); |
714 | clear_bit(EC_FLAGS_STOPPED, &ec->flags); | 762 | clear_bit(EC_FLAGS_STOPPED, &ec->flags); |
715 | pr_debug("EC stopped\n"); | 763 | ec_log_drv("EC stopped"); |
716 | } | 764 | } |
717 | spin_unlock_irqrestore(&ec->lock, flags); | 765 | spin_unlock_irqrestore(&ec->lock, flags); |
718 | } | 766 | } |
@@ -824,12 +872,12 @@ static void acpi_ec_run(void *cxt) | |||
824 | 872 | ||
825 | if (!handler) | 873 | if (!handler) |
826 | return; | 874 | return; |
827 | pr_debug("##### Query(0x%02x) started #####\n", handler->query_bit); | 875 | ec_dbg_evt("Query(0x%02x) started", handler->query_bit); |
828 | if (handler->func) | 876 | if (handler->func) |
829 | handler->func(handler->data); | 877 | handler->func(handler->data); |
830 | else if (handler->handle) | 878 | else if (handler->handle) |
831 | acpi_evaluate_object(handler->handle, NULL, NULL, NULL); | 879 | acpi_evaluate_object(handler->handle, NULL, NULL, NULL); |
832 | pr_debug("##### Query(0x%02x) stopped #####\n", handler->query_bit); | 880 | ec_dbg_evt("Query(0x%02x) stopped", handler->query_bit); |
833 | acpi_ec_put_query_handler(handler); | 881 | acpi_ec_put_query_handler(handler); |
834 | } | 882 | } |
835 | 883 | ||
@@ -861,8 +909,8 @@ static int acpi_ec_query(struct acpi_ec *ec, u8 *data) | |||
861 | if (value == handler->query_bit) { | 909 | if (value == handler->query_bit) { |
862 | /* have custom handler for this bit */ | 910 | /* have custom handler for this bit */ |
863 | handler = acpi_ec_get_query_handler(handler); | 911 | handler = acpi_ec_get_query_handler(handler); |
864 | pr_debug("##### Query(0x%02x) scheduled #####\n", | 912 | ec_dbg_evt("Query(0x%02x) scheduled", |
865 | handler->query_bit); | 913 | handler->query_bit); |
866 | status = acpi_os_execute((handler->func) ? | 914 | status = acpi_os_execute((handler->func) ? |
867 | OSL_NOTIFY_HANDLER : OSL_GPE_HANDLER, | 915 | OSL_NOTIFY_HANDLER : OSL_GPE_HANDLER, |
868 | acpi_ec_run, handler); | 916 | acpi_ec_run, handler); |
@@ -1099,6 +1147,9 @@ static int acpi_ec_add(struct acpi_device *device) | |||
1099 | 1147 | ||
1100 | ret = ec_install_handlers(ec); | 1148 | ret = ec_install_handlers(ec); |
1101 | 1149 | ||
1150 | /* Reprobe devices depending on the EC */ | ||
1151 | acpi_walk_dep_device_list(ec->handle); | ||
1152 | |||
1102 | /* EC is fully operational, allow queries */ | 1153 | /* EC is fully operational, allow queries */ |
1103 | clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); | 1154 | clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); |
1104 | 1155 | ||
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c index f774c65ecb8b..39c485b0c25c 100644 --- a/drivers/acpi/glue.c +++ b/drivers/acpi/glue.c | |||
@@ -168,7 +168,7 @@ int acpi_bind_one(struct device *dev, struct acpi_device *acpi_dev) | |||
168 | unsigned int node_id; | 168 | unsigned int node_id; |
169 | int retval = -EINVAL; | 169 | int retval = -EINVAL; |
170 | 170 | ||
171 | if (ACPI_COMPANION(dev)) { | 171 | if (has_acpi_companion(dev)) { |
172 | if (acpi_dev) { | 172 | if (acpi_dev) { |
173 | dev_warn(dev, "ACPI companion already set\n"); | 173 | dev_warn(dev, "ACPI companion already set\n"); |
174 | return -EINVAL; | 174 | return -EINVAL; |
@@ -220,7 +220,7 @@ int acpi_bind_one(struct device *dev, struct acpi_device *acpi_dev) | |||
220 | list_add(&physical_node->node, physnode_list); | 220 | list_add(&physical_node->node, physnode_list); |
221 | acpi_dev->physical_node_count++; | 221 | acpi_dev->physical_node_count++; |
222 | 222 | ||
223 | if (!ACPI_COMPANION(dev)) | 223 | if (!has_acpi_companion(dev)) |
224 | ACPI_COMPANION_SET(dev, acpi_dev); | 224 | ACPI_COMPANION_SET(dev, acpi_dev); |
225 | 225 | ||
226 | acpi_physnode_link_name(physical_node_name, node_id); | 226 | acpi_physnode_link_name(physical_node_name, node_id); |
diff --git a/drivers/acpi/pmic/intel_pmic_crc.c b/drivers/acpi/pmic/intel_pmic_crc.c index ef7d8ff95abe..42df46a86c25 100644 --- a/drivers/acpi/pmic/intel_pmic_crc.c +++ b/drivers/acpi/pmic/intel_pmic_crc.c | |||
@@ -207,5 +207,5 @@ static int __init intel_crc_pmic_opregion_driver_init(void) | |||
207 | } | 207 | } |
208 | module_init(intel_crc_pmic_opregion_driver_init); | 208 | module_init(intel_crc_pmic_opregion_driver_init); |
209 | 209 | ||
210 | MODULE_DESCRIPTION("CrystalCove ACPI opration region driver"); | 210 | MODULE_DESCRIPTION("CrystalCove ACPI operation region driver"); |
211 | MODULE_LICENSE("GPL"); | 211 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index bbca7830e18a..d2e3c3e3f9c9 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -114,7 +114,12 @@ int acpi_scan_add_handler_with_hotplug(struct acpi_scan_handler *handler, | |||
114 | return 0; | 114 | return 0; |
115 | } | 115 | } |
116 | 116 | ||
117 | /* | 117 | /** |
118 | * create_pnp_modalias - Create hid/cid(s) string for modalias and uevent | ||
119 | * @acpi_dev: ACPI device object. | ||
120 | * @modalias: Buffer to print into. | ||
121 | * @size: Size of the buffer. | ||
122 | * | ||
118 | * Creates hid/cid(s) string needed for modalias and uevent | 123 | * Creates hid/cid(s) string needed for modalias and uevent |
119 | * e.g. on a device with hid:IBM0001 and cid:ACPI0001 you get: | 124 | * e.g. on a device with hid:IBM0001 and cid:ACPI0001 you get: |
120 | * char *modalias: "acpi:IBM0001:ACPI0001" | 125 | * char *modalias: "acpi:IBM0001:ACPI0001" |
@@ -122,68 +127,98 @@ int acpi_scan_add_handler_with_hotplug(struct acpi_scan_handler *handler, | |||
122 | * -EINVAL: output error | 127 | * -EINVAL: output error |
123 | * -ENOMEM: output is truncated | 128 | * -ENOMEM: output is truncated |
124 | */ | 129 | */ |
125 | static int create_modalias(struct acpi_device *acpi_dev, char *modalias, | 130 | static int create_pnp_modalias(struct acpi_device *acpi_dev, char *modalias, |
126 | int size) | 131 | int size) |
127 | { | 132 | { |
128 | int len; | 133 | int len; |
129 | int count; | 134 | int count; |
130 | struct acpi_hardware_id *id; | 135 | struct acpi_hardware_id *id; |
131 | 136 | ||
132 | if (list_empty(&acpi_dev->pnp.ids)) | ||
133 | return 0; | ||
134 | |||
135 | /* | 137 | /* |
136 | * If the device has PRP0001 we expose DT compatible modalias | 138 | * Since we skip PRP0001 from the modalias below, 0 should be returned |
137 | * instead in form of of:NnameTCcompatible. | 139 | * if PRP0001 is the only ACPI/PNP ID in the device's list. |
138 | */ | 140 | */ |
139 | if (acpi_dev->data.of_compatible) { | 141 | count = 0; |
140 | struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER }; | 142 | list_for_each_entry(id, &acpi_dev->pnp.ids, list) |
141 | const union acpi_object *of_compatible, *obj; | 143 | if (strcmp(id->id, "PRP0001")) |
142 | int i, nval; | 144 | count++; |
143 | char *c; | ||
144 | |||
145 | acpi_get_name(acpi_dev->handle, ACPI_SINGLE_NAME, &buf); | ||
146 | /* DT strings are all in lower case */ | ||
147 | for (c = buf.pointer; *c != '\0'; c++) | ||
148 | *c = tolower(*c); | ||
149 | |||
150 | len = snprintf(modalias, size, "of:N%sT", (char *)buf.pointer); | ||
151 | ACPI_FREE(buf.pointer); | ||
152 | |||
153 | of_compatible = acpi_dev->data.of_compatible; | ||
154 | if (of_compatible->type == ACPI_TYPE_PACKAGE) { | ||
155 | nval = of_compatible->package.count; | ||
156 | obj = of_compatible->package.elements; | ||
157 | } else { /* Must be ACPI_TYPE_STRING. */ | ||
158 | nval = 1; | ||
159 | obj = of_compatible; | ||
160 | } | ||
161 | for (i = 0; i < nval; i++, obj++) { | ||
162 | count = snprintf(&modalias[len], size, "C%s", | ||
163 | obj->string.pointer); | ||
164 | if (count < 0) | ||
165 | return -EINVAL; | ||
166 | if (count >= size) | ||
167 | return -ENOMEM; | ||
168 | |||
169 | len += count; | ||
170 | size -= count; | ||
171 | } | ||
172 | } else { | ||
173 | len = snprintf(modalias, size, "acpi:"); | ||
174 | size -= len; | ||
175 | 145 | ||
176 | list_for_each_entry(id, &acpi_dev->pnp.ids, list) { | 146 | if (!count) |
177 | count = snprintf(&modalias[len], size, "%s:", id->id); | 147 | return 0; |
178 | if (count < 0) | 148 | |
179 | return -EINVAL; | 149 | len = snprintf(modalias, size, "acpi:"); |
180 | if (count >= size) | 150 | if (len <= 0) |
181 | return -ENOMEM; | 151 | return len; |
182 | len += count; | 152 | |
183 | size -= count; | 153 | size -= len; |
184 | } | 154 | |
155 | list_for_each_entry(id, &acpi_dev->pnp.ids, list) { | ||
156 | if (!strcmp(id->id, "PRP0001")) | ||
157 | continue; | ||
158 | |||
159 | count = snprintf(&modalias[len], size, "%s:", id->id); | ||
160 | if (count < 0) | ||
161 | return -EINVAL; | ||
162 | |||
163 | if (count >= size) | ||
164 | return -ENOMEM; | ||
165 | |||
166 | len += count; | ||
167 | size -= count; | ||
185 | } | 168 | } |
169 | modalias[len] = '\0'; | ||
170 | return len; | ||
171 | } | ||
186 | 172 | ||
173 | /** | ||
174 | * create_of_modalias - Creates DT compatible string for modalias and uevent | ||
175 | * @acpi_dev: ACPI device object. | ||
176 | * @modalias: Buffer to print into. | ||
177 | * @size: Size of the buffer. | ||
178 | * | ||
179 | * Expose DT compatible modalias as of:NnameTCcompatible. This function should | ||
180 | * only be called for devices having PRP0001 in their list of ACPI/PNP IDs. | ||
181 | */ | ||
182 | static int create_of_modalias(struct acpi_device *acpi_dev, char *modalias, | ||
183 | int size) | ||
184 | { | ||
185 | struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER }; | ||
186 | const union acpi_object *of_compatible, *obj; | ||
187 | int len, count; | ||
188 | int i, nval; | ||
189 | char *c; | ||
190 | |||
191 | acpi_get_name(acpi_dev->handle, ACPI_SINGLE_NAME, &buf); | ||
192 | /* DT strings are all in lower case */ | ||
193 | for (c = buf.pointer; *c != '\0'; c++) | ||
194 | *c = tolower(*c); | ||
195 | |||
196 | len = snprintf(modalias, size, "of:N%sT", (char *)buf.pointer); | ||
197 | ACPI_FREE(buf.pointer); | ||
198 | |||
199 | if (len <= 0) | ||
200 | return len; | ||
201 | |||
202 | of_compatible = acpi_dev->data.of_compatible; | ||
203 | if (of_compatible->type == ACPI_TYPE_PACKAGE) { | ||
204 | nval = of_compatible->package.count; | ||
205 | obj = of_compatible->package.elements; | ||
206 | } else { /* Must be ACPI_TYPE_STRING. */ | ||
207 | nval = 1; | ||
208 | obj = of_compatible; | ||
209 | } | ||
210 | for (i = 0; i < nval; i++, obj++) { | ||
211 | count = snprintf(&modalias[len], size, "C%s", | ||
212 | obj->string.pointer); | ||
213 | if (count < 0) | ||
214 | return -EINVAL; | ||
215 | |||
216 | if (count >= size) | ||
217 | return -ENOMEM; | ||
218 | |||
219 | len += count; | ||
220 | size -= count; | ||
221 | } | ||
187 | modalias[len] = '\0'; | 222 | modalias[len] = '\0'; |
188 | return len; | 223 | return len; |
189 | } | 224 | } |
@@ -194,7 +229,8 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias, | |||
194 | * | 229 | * |
195 | * Check if the given device has an ACPI companion and if that companion has | 230 | * Check if the given device has an ACPI companion and if that companion has |
196 | * a valid list of PNP IDs, and if the device is the first (primary) physical | 231 | * a valid list of PNP IDs, and if the device is the first (primary) physical |
197 | * device associated with it. | 232 | * device associated with it. Return the companion pointer if that's the case |
233 | * or NULL otherwise. | ||
198 | * | 234 | * |
199 | * If multiple physical devices are attached to a single ACPI companion, we need | 235 | * If multiple physical devices are attached to a single ACPI companion, we need |
200 | * to be careful. The usage scenario for this kind of relationship is that all | 236 | * to be careful. The usage scenario for this kind of relationship is that all |
@@ -208,88 +244,127 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias, | |||
208 | * resources available from it but they will be matched normally using functions | 244 | * resources available from it but they will be matched normally using functions |
209 | * provided by their bus types (and analogously for their modalias). | 245 | * provided by their bus types (and analogously for their modalias). |
210 | */ | 246 | */ |
211 | static bool acpi_companion_match(const struct device *dev) | 247 | static struct acpi_device *acpi_companion_match(const struct device *dev) |
212 | { | 248 | { |
213 | struct acpi_device *adev; | 249 | struct acpi_device *adev; |
214 | bool ret; | ||
215 | 250 | ||
216 | adev = ACPI_COMPANION(dev); | 251 | adev = ACPI_COMPANION(dev); |
217 | if (!adev) | 252 | if (!adev) |
218 | return false; | 253 | return NULL; |
219 | 254 | ||
220 | if (list_empty(&adev->pnp.ids)) | 255 | if (list_empty(&adev->pnp.ids)) |
221 | return false; | 256 | return NULL; |
222 | 257 | ||
223 | mutex_lock(&adev->physical_node_lock); | 258 | mutex_lock(&adev->physical_node_lock); |
224 | if (list_empty(&adev->physical_node_list)) { | 259 | if (list_empty(&adev->physical_node_list)) { |
225 | ret = false; | 260 | adev = NULL; |
226 | } else { | 261 | } else { |
227 | const struct acpi_device_physical_node *node; | 262 | const struct acpi_device_physical_node *node; |
228 | 263 | ||
229 | node = list_first_entry(&adev->physical_node_list, | 264 | node = list_first_entry(&adev->physical_node_list, |
230 | struct acpi_device_physical_node, node); | 265 | struct acpi_device_physical_node, node); |
231 | ret = node->dev == dev; | 266 | if (node->dev != dev) |
267 | adev = NULL; | ||
232 | } | 268 | } |
233 | mutex_unlock(&adev->physical_node_lock); | 269 | mutex_unlock(&adev->physical_node_lock); |
234 | 270 | ||
235 | return ret; | 271 | return adev; |
236 | } | 272 | } |
237 | 273 | ||
238 | /* | 274 | static int __acpi_device_uevent_modalias(struct acpi_device *adev, |
239 | * Creates uevent modalias field for ACPI enumerated devices. | 275 | struct kobj_uevent_env *env) |
240 | * Because the other buses does not support ACPI HIDs & CIDs. | ||
241 | * e.g. for a device with hid:IBM0001 and cid:ACPI0001 you get: | ||
242 | * "acpi:IBM0001:ACPI0001" | ||
243 | */ | ||
244 | int acpi_device_uevent_modalias(struct device *dev, struct kobj_uevent_env *env) | ||
245 | { | 276 | { |
246 | int len; | 277 | int len; |
247 | 278 | ||
248 | if (!acpi_companion_match(dev)) | 279 | if (!adev) |
249 | return -ENODEV; | 280 | return -ENODEV; |
250 | 281 | ||
282 | if (list_empty(&adev->pnp.ids)) | ||
283 | return 0; | ||
284 | |||
251 | if (add_uevent_var(env, "MODALIAS=")) | 285 | if (add_uevent_var(env, "MODALIAS=")) |
252 | return -ENOMEM; | 286 | return -ENOMEM; |
253 | len = create_modalias(ACPI_COMPANION(dev), &env->buf[env->buflen - 1], | 287 | |
254 | sizeof(env->buf) - env->buflen); | 288 | len = create_pnp_modalias(adev, &env->buf[env->buflen - 1], |
255 | if (len <= 0) | 289 | sizeof(env->buf) - env->buflen); |
290 | if (len < 0) | ||
291 | return len; | ||
292 | |||
293 | env->buflen += len; | ||
294 | if (!adev->data.of_compatible) | ||
295 | return 0; | ||
296 | |||
297 | if (len > 0 && add_uevent_var(env, "MODALIAS=")) | ||
298 | return -ENOMEM; | ||
299 | |||
300 | len = create_of_modalias(adev, &env->buf[env->buflen - 1], | ||
301 | sizeof(env->buf) - env->buflen); | ||
302 | if (len < 0) | ||
256 | return len; | 303 | return len; |
304 | |||
257 | env->buflen += len; | 305 | env->buflen += len; |
306 | |||
258 | return 0; | 307 | return 0; |
259 | } | 308 | } |
260 | EXPORT_SYMBOL_GPL(acpi_device_uevent_modalias); | ||
261 | 309 | ||
262 | /* | 310 | /* |
263 | * Creates modalias sysfs attribute for ACPI enumerated devices. | 311 | * Creates uevent modalias field for ACPI enumerated devices. |
264 | * Because the other buses does not support ACPI HIDs & CIDs. | 312 | * Because the other buses does not support ACPI HIDs & CIDs. |
265 | * e.g. for a device with hid:IBM0001 and cid:ACPI0001 you get: | 313 | * e.g. for a device with hid:IBM0001 and cid:ACPI0001 you get: |
266 | * "acpi:IBM0001:ACPI0001" | 314 | * "acpi:IBM0001:ACPI0001" |
267 | */ | 315 | */ |
268 | int acpi_device_modalias(struct device *dev, char *buf, int size) | 316 | int acpi_device_uevent_modalias(struct device *dev, struct kobj_uevent_env *env) |
269 | { | 317 | { |
270 | int len; | 318 | return __acpi_device_uevent_modalias(acpi_companion_match(dev), env); |
319 | } | ||
320 | EXPORT_SYMBOL_GPL(acpi_device_uevent_modalias); | ||
321 | |||
322 | static int __acpi_device_modalias(struct acpi_device *adev, char *buf, int size) | ||
323 | { | ||
324 | int len, count; | ||
271 | 325 | ||
272 | if (!acpi_companion_match(dev)) | 326 | if (!adev) |
273 | return -ENODEV; | 327 | return -ENODEV; |
274 | 328 | ||
275 | len = create_modalias(ACPI_COMPANION(dev), buf, size -1); | 329 | if (list_empty(&adev->pnp.ids)) |
276 | if (len <= 0) | 330 | return 0; |
331 | |||
332 | len = create_pnp_modalias(adev, buf, size - 1); | ||
333 | if (len < 0) { | ||
334 | return len; | ||
335 | } else if (len > 0) { | ||
336 | buf[len++] = '\n'; | ||
337 | size -= len; | ||
338 | } | ||
339 | if (!adev->data.of_compatible) | ||
277 | return len; | 340 | return len; |
278 | buf[len++] = '\n'; | 341 | |
342 | count = create_of_modalias(adev, buf + len, size - 1); | ||
343 | if (count < 0) { | ||
344 | return count; | ||
345 | } else if (count > 0) { | ||
346 | len += count; | ||
347 | buf[len++] = '\n'; | ||
348 | } | ||
349 | |||
279 | return len; | 350 | return len; |
280 | } | 351 | } |
352 | |||
353 | /* | ||
354 | * Creates modalias sysfs attribute for ACPI enumerated devices. | ||
355 | * Because the other buses does not support ACPI HIDs & CIDs. | ||
356 | * e.g. for a device with hid:IBM0001 and cid:ACPI0001 you get: | ||
357 | * "acpi:IBM0001:ACPI0001" | ||
358 | */ | ||
359 | int acpi_device_modalias(struct device *dev, char *buf, int size) | ||
360 | { | ||
361 | return __acpi_device_modalias(acpi_companion_match(dev), buf, size); | ||
362 | } | ||
281 | EXPORT_SYMBOL_GPL(acpi_device_modalias); | 363 | EXPORT_SYMBOL_GPL(acpi_device_modalias); |
282 | 364 | ||
283 | static ssize_t | 365 | static ssize_t |
284 | acpi_device_modalias_show(struct device *dev, struct device_attribute *attr, char *buf) { | 366 | acpi_device_modalias_show(struct device *dev, struct device_attribute *attr, char *buf) { |
285 | struct acpi_device *acpi_dev = to_acpi_device(dev); | 367 | return __acpi_device_modalias(to_acpi_device(dev), buf, 1024); |
286 | int len; | ||
287 | |||
288 | len = create_modalias(acpi_dev, buf, 1024); | ||
289 | if (len <= 0) | ||
290 | return len; | ||
291 | buf[len++] = '\n'; | ||
292 | return len; | ||
293 | } | 368 | } |
294 | static DEVICE_ATTR(modalias, 0444, acpi_device_modalias_show, NULL); | 369 | static DEVICE_ATTR(modalias, 0444, acpi_device_modalias_show, NULL); |
295 | 370 | ||
@@ -894,8 +969,51 @@ static void acpi_device_remove_files(struct acpi_device *dev) | |||
894 | ACPI Bus operations | 969 | ACPI Bus operations |
895 | -------------------------------------------------------------------------- */ | 970 | -------------------------------------------------------------------------- */ |
896 | 971 | ||
972 | /** | ||
973 | * acpi_of_match_device - Match device object using the "compatible" property. | ||
974 | * @adev: ACPI device object to match. | ||
975 | * @of_match_table: List of device IDs to match against. | ||
976 | * | ||
977 | * If @dev has an ACPI companion which has the special PRP0001 device ID in its | ||
978 | * list of identifiers and a _DSD object with the "compatible" property, use | ||
979 | * that property to match against the given list of identifiers. | ||
980 | */ | ||
981 | static bool acpi_of_match_device(struct acpi_device *adev, | ||
982 | const struct of_device_id *of_match_table) | ||
983 | { | ||
984 | const union acpi_object *of_compatible, *obj; | ||
985 | int i, nval; | ||
986 | |||
987 | if (!adev) | ||
988 | return false; | ||
989 | |||
990 | of_compatible = adev->data.of_compatible; | ||
991 | if (!of_match_table || !of_compatible) | ||
992 | return false; | ||
993 | |||
994 | if (of_compatible->type == ACPI_TYPE_PACKAGE) { | ||
995 | nval = of_compatible->package.count; | ||
996 | obj = of_compatible->package.elements; | ||
997 | } else { /* Must be ACPI_TYPE_STRING. */ | ||
998 | nval = 1; | ||
999 | obj = of_compatible; | ||
1000 | } | ||
1001 | /* Now we can look for the driver DT compatible strings */ | ||
1002 | for (i = 0; i < nval; i++, obj++) { | ||
1003 | const struct of_device_id *id; | ||
1004 | |||
1005 | for (id = of_match_table; id->compatible[0]; id++) | ||
1006 | if (!strcasecmp(obj->string.pointer, id->compatible)) | ||
1007 | return true; | ||
1008 | } | ||
1009 | |||
1010 | return false; | ||
1011 | } | ||
1012 | |||
897 | static const struct acpi_device_id *__acpi_match_device( | 1013 | static const struct acpi_device_id *__acpi_match_device( |
898 | struct acpi_device *device, const struct acpi_device_id *ids) | 1014 | struct acpi_device *device, |
1015 | const struct acpi_device_id *ids, | ||
1016 | const struct of_device_id *of_ids) | ||
899 | { | 1017 | { |
900 | const struct acpi_device_id *id; | 1018 | const struct acpi_device_id *id; |
901 | struct acpi_hardware_id *hwid; | 1019 | struct acpi_hardware_id *hwid; |
@@ -904,14 +1022,27 @@ static const struct acpi_device_id *__acpi_match_device( | |||
904 | * If the device is not present, it is unnecessary to load device | 1022 | * If the device is not present, it is unnecessary to load device |
905 | * driver for it. | 1023 | * driver for it. |
906 | */ | 1024 | */ |
907 | if (!device->status.present) | 1025 | if (!device || !device->status.present) |
908 | return NULL; | 1026 | return NULL; |
909 | 1027 | ||
910 | for (id = ids; id->id[0]; id++) | 1028 | list_for_each_entry(hwid, &device->pnp.ids, list) { |
911 | list_for_each_entry(hwid, &device->pnp.ids, list) | 1029 | /* First, check the ACPI/PNP IDs provided by the caller. */ |
1030 | for (id = ids; id->id[0]; id++) | ||
912 | if (!strcmp((char *) id->id, hwid->id)) | 1031 | if (!strcmp((char *) id->id, hwid->id)) |
913 | return id; | 1032 | return id; |
914 | 1033 | ||
1034 | /* | ||
1035 | * Next, check the special "PRP0001" ID and try to match the | ||
1036 | * "compatible" property if found. | ||
1037 | * | ||
1038 | * The id returned by the below is not valid, but the only | ||
1039 | * caller passing non-NULL of_ids here is only interested in | ||
1040 | * whether or not the return value is NULL. | ||
1041 | */ | ||
1042 | if (!strcmp("PRP0001", hwid->id) | ||
1043 | && acpi_of_match_device(device, of_ids)) | ||
1044 | return id; | ||
1045 | } | ||
915 | return NULL; | 1046 | return NULL; |
916 | } | 1047 | } |
917 | 1048 | ||
@@ -929,68 +1060,26 @@ static const struct acpi_device_id *__acpi_match_device( | |||
929 | const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids, | 1060 | const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids, |
930 | const struct device *dev) | 1061 | const struct device *dev) |
931 | { | 1062 | { |
932 | struct acpi_device *adev; | 1063 | return __acpi_match_device(acpi_companion_match(dev), ids, NULL); |
933 | acpi_handle handle = ACPI_HANDLE(dev); | ||
934 | |||
935 | if (!ids || !handle || acpi_bus_get_device(handle, &adev)) | ||
936 | return NULL; | ||
937 | |||
938 | if (!acpi_companion_match(dev)) | ||
939 | return NULL; | ||
940 | |||
941 | return __acpi_match_device(adev, ids); | ||
942 | } | 1064 | } |
943 | EXPORT_SYMBOL_GPL(acpi_match_device); | 1065 | EXPORT_SYMBOL_GPL(acpi_match_device); |
944 | 1066 | ||
945 | int acpi_match_device_ids(struct acpi_device *device, | 1067 | int acpi_match_device_ids(struct acpi_device *device, |
946 | const struct acpi_device_id *ids) | 1068 | const struct acpi_device_id *ids) |
947 | { | 1069 | { |
948 | return __acpi_match_device(device, ids) ? 0 : -ENOENT; | 1070 | return __acpi_match_device(device, ids, NULL) ? 0 : -ENOENT; |
949 | } | 1071 | } |
950 | EXPORT_SYMBOL(acpi_match_device_ids); | 1072 | EXPORT_SYMBOL(acpi_match_device_ids); |
951 | 1073 | ||
952 | /* Performs match against special "PRP0001" shoehorn ACPI ID */ | ||
953 | static bool acpi_of_driver_match_device(struct device *dev, | ||
954 | const struct device_driver *drv) | ||
955 | { | ||
956 | const union acpi_object *of_compatible, *obj; | ||
957 | struct acpi_device *adev; | ||
958 | int i, nval; | ||
959 | |||
960 | adev = ACPI_COMPANION(dev); | ||
961 | if (!adev) | ||
962 | return false; | ||
963 | |||
964 | of_compatible = adev->data.of_compatible; | ||
965 | if (!drv->of_match_table || !of_compatible) | ||
966 | return false; | ||
967 | |||
968 | if (of_compatible->type == ACPI_TYPE_PACKAGE) { | ||
969 | nval = of_compatible->package.count; | ||
970 | obj = of_compatible->package.elements; | ||
971 | } else { /* Must be ACPI_TYPE_STRING. */ | ||
972 | nval = 1; | ||
973 | obj = of_compatible; | ||
974 | } | ||
975 | /* Now we can look for the driver DT compatible strings */ | ||
976 | for (i = 0; i < nval; i++, obj++) { | ||
977 | const struct of_device_id *id; | ||
978 | |||
979 | for (id = drv->of_match_table; id->compatible[0]; id++) | ||
980 | if (!strcasecmp(obj->string.pointer, id->compatible)) | ||
981 | return true; | ||
982 | } | ||
983 | |||
984 | return false; | ||
985 | } | ||
986 | |||
987 | bool acpi_driver_match_device(struct device *dev, | 1074 | bool acpi_driver_match_device(struct device *dev, |
988 | const struct device_driver *drv) | 1075 | const struct device_driver *drv) |
989 | { | 1076 | { |
990 | if (!drv->acpi_match_table) | 1077 | if (!drv->acpi_match_table) |
991 | return acpi_of_driver_match_device(dev, drv); | 1078 | return acpi_of_match_device(ACPI_COMPANION(dev), |
1079 | drv->of_match_table); | ||
992 | 1080 | ||
993 | return !!acpi_match_device(drv->acpi_match_table, dev); | 1081 | return !!__acpi_match_device(acpi_companion_match(dev), |
1082 | drv->acpi_match_table, drv->of_match_table); | ||
994 | } | 1083 | } |
995 | EXPORT_SYMBOL_GPL(acpi_driver_match_device); | 1084 | EXPORT_SYMBOL_GPL(acpi_driver_match_device); |
996 | 1085 | ||
@@ -1031,20 +1120,7 @@ static int acpi_bus_match(struct device *dev, struct device_driver *drv) | |||
1031 | 1120 | ||
1032 | static int acpi_device_uevent(struct device *dev, struct kobj_uevent_env *env) | 1121 | static int acpi_device_uevent(struct device *dev, struct kobj_uevent_env *env) |
1033 | { | 1122 | { |
1034 | struct acpi_device *acpi_dev = to_acpi_device(dev); | 1123 | return __acpi_device_uevent_modalias(to_acpi_device(dev), env); |
1035 | int len; | ||
1036 | |||
1037 | if (list_empty(&acpi_dev->pnp.ids)) | ||
1038 | return 0; | ||
1039 | |||
1040 | if (add_uevent_var(env, "MODALIAS=")) | ||
1041 | return -ENOMEM; | ||
1042 | len = create_modalias(acpi_dev, &env->buf[env->buflen - 1], | ||
1043 | sizeof(env->buf) - env->buflen); | ||
1044 | if (len <= 0) | ||
1045 | return len; | ||
1046 | env->buflen += len; | ||
1047 | return 0; | ||
1048 | } | 1124 | } |
1049 | 1125 | ||
1050 | static void acpi_device_notify(acpi_handle handle, u32 event, void *data) | 1126 | static void acpi_device_notify(acpi_handle handle, u32 event, void *data) |
@@ -1062,10 +1138,10 @@ static void acpi_device_notify_fixed(void *data) | |||
1062 | acpi_device_notify(NULL, ACPI_FIXED_HARDWARE_EVENT, device); | 1138 | acpi_device_notify(NULL, ACPI_FIXED_HARDWARE_EVENT, device); |
1063 | } | 1139 | } |
1064 | 1140 | ||
1065 | static acpi_status acpi_device_fixed_event(void *data) | 1141 | static u32 acpi_device_fixed_event(void *data) |
1066 | { | 1142 | { |
1067 | acpi_os_execute(OSL_NOTIFY_HANDLER, acpi_device_notify_fixed, data); | 1143 | acpi_os_execute(OSL_NOTIFY_HANDLER, acpi_device_notify_fixed, data); |
1068 | return AE_OK; | 1144 | return ACPI_INTERRUPT_HANDLED; |
1069 | } | 1145 | } |
1070 | 1146 | ||
1071 | static int acpi_device_install_notify_handler(struct acpi_device *device) | 1147 | static int acpi_device_install_notify_handler(struct acpi_device *device) |
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index 7f251dd1a687..2f0d4db40a9e 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c | |||
@@ -629,6 +629,7 @@ static int acpi_freeze_begin(void) | |||
629 | 629 | ||
630 | static int acpi_freeze_prepare(void) | 630 | static int acpi_freeze_prepare(void) |
631 | { | 631 | { |
632 | acpi_enable_wakeup_devices(ACPI_STATE_S0); | ||
632 | acpi_enable_all_wakeup_gpes(); | 633 | acpi_enable_all_wakeup_gpes(); |
633 | acpi_os_wait_events_complete(); | 634 | acpi_os_wait_events_complete(); |
634 | enable_irq_wake(acpi_gbl_FADT.sci_interrupt); | 635 | enable_irq_wake(acpi_gbl_FADT.sci_interrupt); |
@@ -637,6 +638,7 @@ static int acpi_freeze_prepare(void) | |||
637 | 638 | ||
638 | static void acpi_freeze_restore(void) | 639 | static void acpi_freeze_restore(void) |
639 | { | 640 | { |
641 | acpi_disable_wakeup_devices(ACPI_STATE_S0); | ||
640 | disable_irq_wake(acpi_gbl_FADT.sci_interrupt); | 642 | disable_irq_wake(acpi_gbl_FADT.sci_interrupt); |
641 | acpi_enable_all_runtime_gpes(); | 643 | acpi_enable_all_runtime_gpes(); |
642 | } | 644 | } |
@@ -806,21 +808,6 @@ static void acpi_sleep_hibernate_setup(void) | |||
806 | static inline void acpi_sleep_hibernate_setup(void) {} | 808 | static inline void acpi_sleep_hibernate_setup(void) {} |
807 | #endif /* !CONFIG_HIBERNATION */ | 809 | #endif /* !CONFIG_HIBERNATION */ |
808 | 810 | ||
809 | int acpi_suspend(u32 acpi_state) | ||
810 | { | ||
811 | suspend_state_t states[] = { | ||
812 | [1] = PM_SUSPEND_STANDBY, | ||
813 | [3] = PM_SUSPEND_MEM, | ||
814 | [5] = PM_SUSPEND_MAX | ||
815 | }; | ||
816 | |||
817 | if (acpi_state < 6 && states[acpi_state]) | ||
818 | return pm_suspend(states[acpi_state]); | ||
819 | if (acpi_state == 4) | ||
820 | return hibernate(); | ||
821 | return -EINVAL; | ||
822 | } | ||
823 | |||
824 | static void acpi_power_off_prepare(void) | 811 | static void acpi_power_off_prepare(void) |
825 | { | 812 | { |
826 | /* Prepare to power off the system */ | 813 | /* Prepare to power off the system */ |
diff --git a/drivers/acpi/sleep.h b/drivers/acpi/sleep.h index 0143540a2519..c797ffa568d5 100644 --- a/drivers/acpi/sleep.h +++ b/drivers/acpi/sleep.h | |||
@@ -1,6 +1,4 @@ | |||
1 | 1 | ||
2 | extern int acpi_suspend(u32 state); | ||
3 | |||
4 | extern void acpi_enable_wakeup_devices(u8 sleep_state); | 2 | extern void acpi_enable_wakeup_devices(u8 sleep_state); |
5 | extern void acpi_disable_wakeup_devices(u8 sleep_state); | 3 | extern void acpi_disable_wakeup_devices(u8 sleep_state); |
6 | 4 | ||
diff --git a/drivers/acpi/sysfs.c b/drivers/acpi/sysfs.c index 13e577c80201..0876d77b3206 100644 --- a/drivers/acpi/sysfs.c +++ b/drivers/acpi/sysfs.c | |||
@@ -527,7 +527,7 @@ static ssize_t counter_show(struct kobject *kobj, | |||
527 | acpi_irq_not_handled; | 527 | acpi_irq_not_handled; |
528 | all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_GPE].count = | 528 | all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_GPE].count = |
529 | acpi_gpe_count; | 529 | acpi_gpe_count; |
530 | size = sprintf(buf, "%8d", all_counters[index].count); | 530 | size = sprintf(buf, "%8u", all_counters[index].count); |
531 | 531 | ||
532 | /* "gpe_all" or "sci" */ | 532 | /* "gpe_all" or "sci" */ |
533 | if (index >= num_gpes + ACPI_NUM_FIXED_EVENTS) | 533 | if (index >= num_gpes + ACPI_NUM_FIXED_EVENTS) |
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 26eb70c8f518..cc79d3fedfb2 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
@@ -82,9 +82,15 @@ module_param(allow_duplicates, bool, 0644); | |||
82 | * For Windows 8 systems: used to decide if video module | 82 | * For Windows 8 systems: used to decide if video module |
83 | * should skip registering backlight interface of its own. | 83 | * should skip registering backlight interface of its own. |
84 | */ | 84 | */ |
85 | static int use_native_backlight_param = -1; | 85 | enum { |
86 | NATIVE_BACKLIGHT_NOT_SET = -1, | ||
87 | NATIVE_BACKLIGHT_OFF, | ||
88 | NATIVE_BACKLIGHT_ON, | ||
89 | }; | ||
90 | |||
91 | static int use_native_backlight_param = NATIVE_BACKLIGHT_NOT_SET; | ||
86 | module_param_named(use_native_backlight, use_native_backlight_param, int, 0444); | 92 | module_param_named(use_native_backlight, use_native_backlight_param, int, 0444); |
87 | static bool use_native_backlight_dmi = true; | 93 | static int use_native_backlight_dmi = NATIVE_BACKLIGHT_NOT_SET; |
88 | 94 | ||
89 | static int register_count; | 95 | static int register_count; |
90 | static struct mutex video_list_lock; | 96 | static struct mutex video_list_lock; |
@@ -237,15 +243,16 @@ static void acpi_video_switch_brightness(struct work_struct *work); | |||
237 | 243 | ||
238 | static bool acpi_video_use_native_backlight(void) | 244 | static bool acpi_video_use_native_backlight(void) |
239 | { | 245 | { |
240 | if (use_native_backlight_param != -1) | 246 | if (use_native_backlight_param != NATIVE_BACKLIGHT_NOT_SET) |
241 | return use_native_backlight_param; | 247 | return use_native_backlight_param; |
242 | else | 248 | else if (use_native_backlight_dmi != NATIVE_BACKLIGHT_NOT_SET) |
243 | return use_native_backlight_dmi; | 249 | return use_native_backlight_dmi; |
250 | return acpi_osi_is_win8(); | ||
244 | } | 251 | } |
245 | 252 | ||
246 | bool acpi_video_verify_backlight_support(void) | 253 | bool acpi_video_verify_backlight_support(void) |
247 | { | 254 | { |
248 | if (acpi_osi_is_win8() && acpi_video_use_native_backlight() && | 255 | if (acpi_video_use_native_backlight() && |
249 | backlight_device_registered(BACKLIGHT_RAW)) | 256 | backlight_device_registered(BACKLIGHT_RAW)) |
250 | return false; | 257 | return false; |
251 | return acpi_video_backlight_support(); | 258 | return acpi_video_backlight_support(); |
@@ -414,7 +421,13 @@ static int __init video_set_bqc_offset(const struct dmi_system_id *d) | |||
414 | 421 | ||
415 | static int __init video_disable_native_backlight(const struct dmi_system_id *d) | 422 | static int __init video_disable_native_backlight(const struct dmi_system_id *d) |
416 | { | 423 | { |
417 | use_native_backlight_dmi = false; | 424 | use_native_backlight_dmi = NATIVE_BACKLIGHT_OFF; |
425 | return 0; | ||
426 | } | ||
427 | |||
428 | static int __init video_enable_native_backlight(const struct dmi_system_id *d) | ||
429 | { | ||
430 | use_native_backlight_dmi = NATIVE_BACKLIGHT_ON; | ||
418 | return 0; | 431 | return 0; |
419 | } | 432 | } |
420 | 433 | ||
@@ -559,6 +572,17 @@ static struct dmi_system_id video_dmi_table[] __initdata = { | |||
559 | DMI_MATCH(DMI_PRODUCT_NAME, "XPS L521X"), | 572 | DMI_MATCH(DMI_PRODUCT_NAME, "XPS L521X"), |
560 | }, | 573 | }, |
561 | }, | 574 | }, |
575 | |||
576 | /* Non win8 machines which need native backlight nevertheless */ | ||
577 | { | ||
578 | /* https://bugzilla.redhat.com/show_bug.cgi?id=1187004 */ | ||
579 | .callback = video_enable_native_backlight, | ||
580 | .ident = "Lenovo Ideapad Z570", | ||
581 | .matches = { | ||
582 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
583 | DMI_MATCH(DMI_PRODUCT_NAME, "102434U"), | ||
584 | }, | ||
585 | }, | ||
562 | {} | 586 | {} |
563 | }; | 587 | }; |
564 | 588 | ||
diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c index 27c43499977a..c42feb2bacd0 100644 --- a/drivers/acpi/video_detect.c +++ b/drivers/acpi/video_detect.c | |||
@@ -174,14 +174,6 @@ static struct dmi_system_id video_detect_dmi_table[] = { | |||
174 | DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 5737"), | 174 | DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 5737"), |
175 | }, | 175 | }, |
176 | }, | 176 | }, |
177 | { | ||
178 | .callback = video_detect_force_vendor, | ||
179 | .ident = "Lenovo IdeaPad Z570", | ||
180 | .matches = { | ||
181 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
182 | DMI_MATCH(DMI_PRODUCT_VERSION, "Ideapad Z570"), | ||
183 | }, | ||
184 | }, | ||
185 | { }, | 177 | { }, |
186 | }; | 178 | }; |
187 | 179 | ||