.. | .. |
---|
19 | 19 | #include <linux/debugfs.h> |
---|
20 | 20 | #include <linux/device.h> |
---|
21 | 21 | #include <linux/delay.h> |
---|
22 | | -#include <linux/dma-mapping.h> |
---|
| 22 | +#include <linux/dma-map-ops.h> |
---|
23 | 23 | #include <linux/init.h> |
---|
24 | 24 | #include <linux/module.h> |
---|
25 | 25 | #include <linux/kthread.h> |
---|
.. | .. |
---|
27 | 27 | #include <linux/async.h> |
---|
28 | 28 | #include <linux/pm_runtime.h> |
---|
29 | 29 | #include <linux/pinctrl/devinfo.h> |
---|
| 30 | +#include <linux/slab.h> |
---|
30 | 31 | |
---|
31 | 32 | #include "base.h" |
---|
32 | 33 | #include "power/power.h" |
---|
.. | .. |
---|
96 | 97 | |
---|
97 | 98 | get_device(dev); |
---|
98 | 99 | |
---|
| 100 | + kfree(dev->p->deferred_probe_reason); |
---|
| 101 | + dev->p->deferred_probe_reason = NULL; |
---|
| 102 | + |
---|
99 | 103 | /* |
---|
100 | 104 | * Drop the mutex while probing each device; the probe path may |
---|
101 | 105 | * manipulate the deferred list |
---|
.. | .. |
---|
136 | 140 | if (!list_empty(&dev->p->deferred_probe)) { |
---|
137 | 141 | dev_dbg(dev, "Removed from deferred list\n"); |
---|
138 | 142 | list_del_init(&dev->p->deferred_probe); |
---|
| 143 | + kfree(dev->p->deferred_probe_reason); |
---|
| 144 | + dev->p->deferred_probe_reason = NULL; |
---|
139 | 145 | } |
---|
140 | 146 | mutex_unlock(&deferred_probe_mutex); |
---|
141 | 147 | } |
---|
.. | .. |
---|
179 | 185 | * Kick the re-probe thread. It may already be scheduled, but it is |
---|
180 | 186 | * safe to kick it again. |
---|
181 | 187 | */ |
---|
182 | | - schedule_work(&deferred_probe_work); |
---|
| 188 | + queue_work(system_unbound_wq, &deferred_probe_work); |
---|
183 | 189 | } |
---|
184 | 190 | |
---|
185 | 191 | /** |
---|
186 | | - * device_block_probing() - Block/defere device's probes |
---|
| 192 | + * device_block_probing() - Block/defer device's probes |
---|
187 | 193 | * |
---|
188 | 194 | * It will disable probing of devices and defer their probes instead. |
---|
189 | 195 | */ |
---|
.. | .. |
---|
206 | 212 | driver_deferred_probe_trigger(); |
---|
207 | 213 | } |
---|
208 | 214 | |
---|
| 215 | +/** |
---|
| 216 | + * device_set_deferred_probe_reason() - Set defer probe reason message for device |
---|
| 217 | + * @dev: the pointer to the struct device |
---|
| 218 | + * @vaf: the pointer to va_format structure with message |
---|
| 219 | + */ |
---|
| 220 | +void device_set_deferred_probe_reason(const struct device *dev, struct va_format *vaf) |
---|
| 221 | +{ |
---|
| 222 | + const char *drv = dev_driver_string(dev); |
---|
| 223 | + |
---|
| 224 | + mutex_lock(&deferred_probe_mutex); |
---|
| 225 | + |
---|
| 226 | + kfree(dev->p->deferred_probe_reason); |
---|
| 227 | + dev->p->deferred_probe_reason = kasprintf(GFP_KERNEL, "%s: %pV", drv, vaf); |
---|
| 228 | + |
---|
| 229 | + mutex_unlock(&deferred_probe_mutex); |
---|
| 230 | +} |
---|
| 231 | + |
---|
209 | 232 | /* |
---|
210 | 233 | * deferred_devs_show() - Show the devices in the deferred probe pending list. |
---|
211 | 234 | */ |
---|
.. | .. |
---|
216 | 239 | mutex_lock(&deferred_probe_mutex); |
---|
217 | 240 | |
---|
218 | 241 | list_for_each_entry(curr, &deferred_probe_pending_list, deferred_probe) |
---|
219 | | - seq_printf(s, "%s\n", dev_name(curr->device)); |
---|
| 242 | + seq_printf(s, "%s\t%s", dev_name(curr->device), |
---|
| 243 | + curr->device->p->deferred_probe_reason ?: "\n"); |
---|
220 | 244 | |
---|
221 | 245 | mutex_unlock(&deferred_probe_mutex); |
---|
222 | 246 | |
---|
.. | .. |
---|
224 | 248 | } |
---|
225 | 249 | DEFINE_SHOW_ATTRIBUTE(deferred_devs); |
---|
226 | 250 | |
---|
227 | | -static int deferred_probe_timeout = -1; |
---|
| 251 | +int driver_deferred_probe_timeout; |
---|
| 252 | +EXPORT_SYMBOL_GPL(driver_deferred_probe_timeout); |
---|
| 253 | + |
---|
228 | 254 | static int __init deferred_probe_timeout_setup(char *str) |
---|
229 | 255 | { |
---|
230 | | - deferred_probe_timeout = simple_strtol(str, NULL, 10); |
---|
| 256 | + int timeout; |
---|
| 257 | + |
---|
| 258 | + if (!kstrtoint(str, 10, &timeout)) |
---|
| 259 | + driver_deferred_probe_timeout = timeout; |
---|
231 | 260 | return 1; |
---|
232 | 261 | } |
---|
233 | 262 | __setup("deferred_probe_timeout=", deferred_probe_timeout_setup); |
---|
.. | .. |
---|
236 | 265 | * driver_deferred_probe_check_state() - Check deferred probe state |
---|
237 | 266 | * @dev: device to check |
---|
238 | 267 | * |
---|
239 | | - * Returns -ENODEV if init is done and all built-in drivers have had a chance |
---|
240 | | - * to probe (i.e. initcalls are done), -ETIMEDOUT if deferred probe debug |
---|
241 | | - * timeout has expired, or -EPROBE_DEFER if none of those conditions are met. |
---|
| 268 | + * Return: |
---|
| 269 | + * -ENODEV if initcalls have completed and modules are disabled. |
---|
| 270 | + * -ETIMEDOUT if the deferred probe timeout was set and has expired |
---|
| 271 | + * and modules are enabled. |
---|
| 272 | + * -EPROBE_DEFER in other cases. |
---|
242 | 273 | * |
---|
243 | 274 | * Drivers or subsystems can opt-in to calling this function instead of directly |
---|
244 | 275 | * returning -EPROBE_DEFER. |
---|
245 | 276 | */ |
---|
246 | 277 | int driver_deferred_probe_check_state(struct device *dev) |
---|
247 | 278 | { |
---|
248 | | - if (initcalls_done) { |
---|
249 | | - if (!deferred_probe_timeout) { |
---|
250 | | - dev_WARN(dev, "deferred probe timeout, ignoring dependency"); |
---|
251 | | - return -ETIMEDOUT; |
---|
252 | | - } |
---|
253 | | - dev_warn(dev, "ignoring dependency for device, assuming no driver"); |
---|
| 279 | + if (!IS_ENABLED(CONFIG_MODULES) && initcalls_done) { |
---|
| 280 | + dev_warn(dev, "ignoring dependency for device, assuming no driver\n"); |
---|
254 | 281 | return -ENODEV; |
---|
255 | 282 | } |
---|
| 283 | + |
---|
| 284 | + if (!driver_deferred_probe_timeout && initcalls_done) { |
---|
| 285 | + dev_warn(dev, "deferred probe timeout, ignoring dependency\n"); |
---|
| 286 | + return -ETIMEDOUT; |
---|
| 287 | + } |
---|
| 288 | + |
---|
256 | 289 | return -EPROBE_DEFER; |
---|
257 | 290 | } |
---|
258 | 291 | |
---|
.. | .. |
---|
260 | 293 | { |
---|
261 | 294 | struct device_private *p; |
---|
262 | 295 | |
---|
263 | | - deferred_probe_timeout = 0; |
---|
| 296 | + driver_deferred_probe_timeout = 0; |
---|
264 | 297 | driver_deferred_probe_trigger(); |
---|
265 | 298 | flush_work(&deferred_probe_work); |
---|
266 | 299 | |
---|
.. | .. |
---|
296 | 329 | driver_deferred_probe_trigger(); |
---|
297 | 330 | flush_work(&deferred_probe_work); |
---|
298 | 331 | |
---|
299 | | - if (deferred_probe_timeout > 0) { |
---|
| 332 | + if (driver_deferred_probe_timeout > 0) { |
---|
300 | 333 | schedule_delayed_work(&deferred_probe_timeout_work, |
---|
301 | | - deferred_probe_timeout * HZ); |
---|
| 334 | + driver_deferred_probe_timeout * HZ); |
---|
302 | 335 | } |
---|
303 | 336 | return 0; |
---|
304 | 337 | } |
---|
.. | .. |
---|
327 | 360 | static void driver_bound(struct device *dev) |
---|
328 | 361 | { |
---|
329 | 362 | if (device_is_bound(dev)) { |
---|
330 | | - printk(KERN_WARNING "%s: device %s already bound\n", |
---|
| 363 | + pr_warn("%s: device %s already bound\n", |
---|
331 | 364 | __func__, kobject_name(&dev->kobj)); |
---|
332 | 365 | return; |
---|
333 | 366 | } |
---|
.. | .. |
---|
416 | 449 | * Allow manual attachment of a driver to a device. |
---|
417 | 450 | * Caller must have already set @dev->driver. |
---|
418 | 451 | * |
---|
419 | | - * Note that this does not modify the bus reference count |
---|
420 | | - * nor take the bus's rwsem. Please verify those are accounted |
---|
421 | | - * for before calling this. (It is ok to call with no other effort |
---|
422 | | - * from a driver's probe() method.) |
---|
| 452 | + * Note that this does not modify the bus reference count. |
---|
| 453 | + * Please verify that is accounted for before calling this. |
---|
| 454 | + * (It is ok to call with no other effort from a driver's probe() method.) |
---|
423 | 455 | * |
---|
424 | 456 | * This function must be called with the device lock held. |
---|
425 | 457 | */ |
---|
.. | .. |
---|
449 | 481 | driver_deferred_probe_trigger(); |
---|
450 | 482 | } |
---|
451 | 483 | |
---|
| 484 | +static ssize_t state_synced_show(struct device *dev, |
---|
| 485 | + struct device_attribute *attr, char *buf) |
---|
| 486 | +{ |
---|
| 487 | + bool val; |
---|
| 488 | + |
---|
| 489 | + device_lock(dev); |
---|
| 490 | + val = dev->state_synced; |
---|
| 491 | + device_unlock(dev); |
---|
| 492 | + |
---|
| 493 | + return sysfs_emit(buf, "%u\n", val); |
---|
| 494 | +} |
---|
| 495 | +static DEVICE_ATTR_RO(state_synced); |
---|
| 496 | + |
---|
452 | 497 | static int really_probe(struct device *dev, struct device_driver *drv) |
---|
453 | 498 | { |
---|
454 | 499 | int ret = -EPROBE_DEFER; |
---|
.. | .. |
---|
459 | 504 | if (defer_all_probes) { |
---|
460 | 505 | /* |
---|
461 | 506 | * Value of defer_all_probes can be set only by |
---|
462 | | - * device_defer_all_probes_enable() which, in turn, will call |
---|
| 507 | + * device_block_probing() which, in turn, will call |
---|
463 | 508 | * wait_for_device_probe() right after that to avoid any races. |
---|
464 | 509 | */ |
---|
465 | 510 | dev_dbg(dev, "Driver %s force probe deferral\n", drv->name); |
---|
.. | .. |
---|
490 | 535 | if (ret) |
---|
491 | 536 | goto pinctrl_bind_failed; |
---|
492 | 537 | |
---|
493 | | - ret = dma_configure(dev); |
---|
494 | | - if (ret) |
---|
495 | | - goto probe_failed; |
---|
| 538 | + if (dev->bus->dma_configure) { |
---|
| 539 | + ret = dev->bus->dma_configure(dev); |
---|
| 540 | + if (ret) |
---|
| 541 | + goto probe_failed; |
---|
| 542 | + } |
---|
496 | 543 | |
---|
497 | | - if (driver_sysfs_add(dev)) { |
---|
498 | | - printk(KERN_ERR "%s: driver_sysfs_add(%s) failed\n", |
---|
499 | | - __func__, dev_name(dev)); |
---|
| 544 | + ret = driver_sysfs_add(dev); |
---|
| 545 | + if (ret) { |
---|
| 546 | + pr_err("%s: driver_sysfs_add(%s) failed\n", |
---|
| 547 | + __func__, dev_name(dev)); |
---|
500 | 548 | goto probe_failed; |
---|
501 | 549 | } |
---|
502 | 550 | |
---|
.. | .. |
---|
516 | 564 | goto probe_failed; |
---|
517 | 565 | } |
---|
518 | 566 | |
---|
| 567 | + ret = device_add_groups(dev, drv->dev_groups); |
---|
| 568 | + if (ret) { |
---|
| 569 | + dev_err(dev, "device_add_groups() failed\n"); |
---|
| 570 | + goto dev_groups_failed; |
---|
| 571 | + } |
---|
| 572 | + |
---|
| 573 | + if (dev_has_sync_state(dev)) { |
---|
| 574 | + ret = device_create_file(dev, &dev_attr_state_synced); |
---|
| 575 | + if (ret) { |
---|
| 576 | + dev_err(dev, "state_synced sysfs add failed\n"); |
---|
| 577 | + goto dev_sysfs_state_synced_failed; |
---|
| 578 | + } |
---|
| 579 | + } |
---|
| 580 | + |
---|
519 | 581 | if (test_remove) { |
---|
520 | 582 | test_remove = false; |
---|
| 583 | + |
---|
| 584 | + device_remove_file(dev, &dev_attr_state_synced); |
---|
| 585 | + device_remove_groups(dev, drv->dev_groups); |
---|
521 | 586 | |
---|
522 | 587 | if (dev->bus->remove) |
---|
523 | 588 | dev->bus->remove(dev); |
---|
.. | .. |
---|
525 | 590 | drv->remove(dev); |
---|
526 | 591 | |
---|
527 | 592 | devres_release_all(dev); |
---|
| 593 | + arch_teardown_dma_ops(dev); |
---|
| 594 | + kfree(dev->dma_range_map); |
---|
| 595 | + dev->dma_range_map = NULL; |
---|
528 | 596 | driver_sysfs_remove(dev); |
---|
529 | 597 | dev->driver = NULL; |
---|
530 | 598 | dev_set_drvdata(dev, NULL); |
---|
.. | .. |
---|
546 | 614 | drv->bus->name, __func__, dev_name(dev), drv->name); |
---|
547 | 615 | goto done; |
---|
548 | 616 | |
---|
| 617 | +dev_sysfs_state_synced_failed: |
---|
| 618 | + device_remove_groups(dev, drv->dev_groups); |
---|
| 619 | +dev_groups_failed: |
---|
| 620 | + if (dev->bus->remove) |
---|
| 621 | + dev->bus->remove(dev); |
---|
| 622 | + else if (drv->remove) |
---|
| 623 | + drv->remove(dev); |
---|
549 | 624 | probe_failed: |
---|
550 | 625 | if (dev->bus) |
---|
551 | 626 | blocking_notifier_call_chain(&dev->bus->p->bus_notifier, |
---|
.. | .. |
---|
553 | 628 | pinctrl_bind_failed: |
---|
554 | 629 | device_links_no_driver(dev); |
---|
555 | 630 | devres_release_all(dev); |
---|
556 | | - dma_deconfigure(dev); |
---|
| 631 | + arch_teardown_dma_ops(dev); |
---|
| 632 | + kfree(dev->dma_range_map); |
---|
| 633 | + dev->dma_range_map = NULL; |
---|
557 | 634 | driver_sysfs_remove(dev); |
---|
558 | 635 | dev->driver = NULL; |
---|
559 | 636 | dev_set_drvdata(dev, NULL); |
---|
.. | .. |
---|
575 | 652 | break; |
---|
576 | 653 | default: |
---|
577 | 654 | /* driver matched but the probe failed */ |
---|
578 | | - printk(KERN_WARNING |
---|
579 | | - "%s: probe of %s failed with error %d\n", |
---|
580 | | - drv->name, dev_name(dev), ret); |
---|
| 655 | + pr_warn("%s: probe of %s failed with error %d\n", |
---|
| 656 | + drv->name, dev_name(dev), ret); |
---|
581 | 657 | } |
---|
582 | 658 | /* |
---|
583 | 659 | * Ignore errors returned by ->probe so that the next driver can try |
---|
.. | .. |
---|
595 | 671 | */ |
---|
596 | 672 | static int really_probe_debug(struct device *dev, struct device_driver *drv) |
---|
597 | 673 | { |
---|
598 | | - ktime_t calltime, delta, rettime; |
---|
| 674 | + ktime_t calltime, rettime; |
---|
599 | 675 | int ret; |
---|
600 | 676 | |
---|
601 | 677 | calltime = ktime_get(); |
---|
602 | 678 | ret = really_probe(dev, drv); |
---|
603 | 679 | rettime = ktime_get(); |
---|
604 | | - delta = ktime_sub(rettime, calltime); |
---|
| 680 | + /* |
---|
| 681 | + * Don't change this to pr_debug() because that requires |
---|
| 682 | + * CONFIG_DYNAMIC_DEBUG and we want a simple 'initcall_debug' on the |
---|
| 683 | + * kernel commandline to print this all the time at the debug level. |
---|
| 684 | + */ |
---|
605 | 685 | printk(KERN_DEBUG "probe of %s returned %d after %lld usecs\n", |
---|
606 | | - dev_name(dev), ret, (s64) ktime_to_us(delta)); |
---|
| 686 | + dev_name(dev), ret, ktime_us_delta(rettime, calltime)); |
---|
607 | 687 | return ret; |
---|
608 | 688 | } |
---|
609 | 689 | |
---|
.. | .. |
---|
615 | 695 | */ |
---|
616 | 696 | int driver_probe_done(void) |
---|
617 | 697 | { |
---|
618 | | - pr_debug("%s: probe_count = %d\n", __func__, |
---|
619 | | - atomic_read(&probe_count)); |
---|
620 | | - if (atomic_read(&probe_count)) |
---|
| 698 | + int local_probe_count = atomic_read(&probe_count); |
---|
| 699 | + |
---|
| 700 | + pr_debug("%s: probe_count = %d\n", __func__, local_probe_count); |
---|
| 701 | + if (local_probe_count) |
---|
621 | 702 | return -EBUSY; |
---|
622 | 703 | return 0; |
---|
623 | 704 | } |
---|
.. | .. |
---|
687 | 768 | static int __init save_async_options(char *buf) |
---|
688 | 769 | { |
---|
689 | 770 | if (strlen(buf) >= ASYNC_DRV_NAMES_MAX_LEN) |
---|
690 | | - printk(KERN_WARNING |
---|
691 | | - "Too long list of driver names for 'driver_async_probe'!\n"); |
---|
| 771 | + pr_warn("Too long list of driver names for 'driver_async_probe'!\n"); |
---|
692 | 772 | |
---|
693 | 773 | strlcpy(async_probe_drv_names, buf, ASYNC_DRV_NAMES_MAX_LEN); |
---|
694 | | - return 0; |
---|
| 774 | + return 1; |
---|
695 | 775 | } |
---|
696 | 776 | __setup("driver_async_probe=", save_async_options); |
---|
697 | 777 | |
---|
.. | .. |
---|
762 | 842 | } else if (ret == -EPROBE_DEFER) { |
---|
763 | 843 | dev_dbg(dev, "Device match requests probe deferral\n"); |
---|
764 | 844 | driver_deferred_probe_add(dev); |
---|
| 845 | + /* |
---|
| 846 | + * Device can't match with a driver right now, so don't attempt |
---|
| 847 | + * to match or bind with other drivers on the bus. |
---|
| 848 | + */ |
---|
| 849 | + return ret; |
---|
765 | 850 | } else if (ret < 0) { |
---|
766 | | - dev_dbg(dev, "Bus failed to match device: %d", ret); |
---|
| 851 | + dev_dbg(dev, "Bus failed to match device: %d\n", ret); |
---|
767 | 852 | return ret; |
---|
768 | 853 | } /* ret > 0 means positive match */ |
---|
769 | 854 | |
---|
.. | .. |
---|
817 | 902 | static int __device_attach(struct device *dev, bool allow_async) |
---|
818 | 903 | { |
---|
819 | 904 | int ret = 0; |
---|
| 905 | + bool async = false; |
---|
820 | 906 | |
---|
821 | 907 | device_lock(dev); |
---|
822 | 908 | if (dev->p->dead) { |
---|
.. | .. |
---|
855 | 941 | */ |
---|
856 | 942 | dev_dbg(dev, "scheduling asynchronous probe\n"); |
---|
857 | 943 | get_device(dev); |
---|
858 | | - async_schedule(__device_attach_async_helper, dev); |
---|
| 944 | + async = true; |
---|
859 | 945 | } else { |
---|
860 | 946 | pm_request_idle(dev); |
---|
861 | 947 | } |
---|
.. | .. |
---|
865 | 951 | } |
---|
866 | 952 | out_unlock: |
---|
867 | 953 | device_unlock(dev); |
---|
| 954 | + if (async) |
---|
| 955 | + async_schedule_dev(__device_attach_async_helper, dev); |
---|
868 | 956 | return ret; |
---|
869 | 957 | } |
---|
870 | 958 | |
---|
.. | .. |
---|
978 | 1066 | static int __driver_attach(struct device *dev, void *data) |
---|
979 | 1067 | { |
---|
980 | 1068 | struct device_driver *drv = data; |
---|
| 1069 | + bool async = false; |
---|
981 | 1070 | int ret; |
---|
982 | 1071 | |
---|
983 | 1072 | /* |
---|
.. | .. |
---|
997 | 1086 | } else if (ret == -EPROBE_DEFER) { |
---|
998 | 1087 | dev_dbg(dev, "Device match requests probe deferral\n"); |
---|
999 | 1088 | driver_deferred_probe_add(dev); |
---|
| 1089 | + /* |
---|
| 1090 | + * Driver could not match with device, but may match with |
---|
| 1091 | + * another device on the bus. |
---|
| 1092 | + */ |
---|
| 1093 | + return 0; |
---|
1000 | 1094 | } else if (ret < 0) { |
---|
1001 | | - dev_dbg(dev, "Bus failed to match device: %d", ret); |
---|
1002 | | - return ret; |
---|
| 1095 | + dev_dbg(dev, "Bus failed to match device: %d\n", ret); |
---|
| 1096 | + /* |
---|
| 1097 | + * Driver could not match with device, but may match with |
---|
| 1098 | + * another device on the bus. |
---|
| 1099 | + */ |
---|
| 1100 | + return 0; |
---|
1003 | 1101 | } /* ret > 0 means positive match */ |
---|
1004 | 1102 | |
---|
1005 | 1103 | if (driver_allows_async_probing(drv)) { |
---|
.. | .. |
---|
1015 | 1113 | if (!dev->driver) { |
---|
1016 | 1114 | get_device(dev); |
---|
1017 | 1115 | dev->p->async_driver = drv; |
---|
1018 | | - async_schedule(__driver_attach_async_helper, dev); |
---|
| 1116 | + async = true; |
---|
1019 | 1117 | } |
---|
1020 | 1118 | device_unlock(dev); |
---|
| 1119 | + if (async) |
---|
| 1120 | + async_schedule_dev(__driver_attach_async_helper, dev); |
---|
1021 | 1121 | return 0; |
---|
1022 | 1122 | } |
---|
1023 | 1123 | |
---|
.. | .. |
---|
1070 | 1170 | } |
---|
1071 | 1171 | } |
---|
1072 | 1172 | |
---|
1073 | | - pm_runtime_clean_up_links(dev); |
---|
1074 | | - |
---|
1075 | 1173 | driver_sysfs_remove(dev); |
---|
1076 | 1174 | |
---|
1077 | 1175 | if (dev->bus) |
---|
.. | .. |
---|
1081 | 1179 | |
---|
1082 | 1180 | pm_runtime_put_sync(dev); |
---|
1083 | 1181 | |
---|
| 1182 | + device_remove_file(dev, &dev_attr_state_synced); |
---|
| 1183 | + device_remove_groups(dev, drv->dev_groups); |
---|
| 1184 | + |
---|
1084 | 1185 | if (dev->bus && dev->bus->remove) |
---|
1085 | 1186 | dev->bus->remove(dev); |
---|
1086 | 1187 | else if (drv->remove) |
---|
.. | .. |
---|
1089 | 1190 | device_links_driver_cleanup(dev); |
---|
1090 | 1191 | |
---|
1091 | 1192 | devres_release_all(dev); |
---|
1092 | | - dma_deconfigure(dev); |
---|
| 1193 | + arch_teardown_dma_ops(dev); |
---|
| 1194 | + kfree(dev->dma_range_map); |
---|
| 1195 | + dev->dma_range_map = NULL; |
---|
1093 | 1196 | dev->driver = NULL; |
---|
1094 | 1197 | dev_set_drvdata(dev, NULL); |
---|
1095 | 1198 | if (dev->pm_domain && dev->pm_domain->dismiss) |
---|
.. | .. |
---|
1172 | 1275 | spin_unlock(&drv->p->klist_devices.k_lock); |
---|
1173 | 1276 | break; |
---|
1174 | 1277 | } |
---|
1175 | | - dev_prv = list_entry(drv->p->klist_devices.k_list.prev, |
---|
| 1278 | + dev_prv = list_last_entry(&drv->p->klist_devices.k_list, |
---|
1176 | 1279 | struct device_private, |
---|
1177 | 1280 | knode_driver.n_node); |
---|
1178 | 1281 | dev = dev_prv->device; |
---|