cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

platform.c (38747B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * platform.c - platform 'pseudo' bus for legacy devices
      4 *
      5 * Copyright (c) 2002-3 Patrick Mochel
      6 * Copyright (c) 2002-3 Open Source Development Labs
      7 *
      8 * Please see Documentation/driver-api/driver-model/platform.rst for more
      9 * information.
     10 */
     11
     12#include <linux/string.h>
     13#include <linux/platform_device.h>
     14#include <linux/of_device.h>
     15#include <linux/of_irq.h>
     16#include <linux/module.h>
     17#include <linux/init.h>
     18#include <linux/interrupt.h>
     19#include <linux/ioport.h>
     20#include <linux/dma-mapping.h>
     21#include <linux/memblock.h>
     22#include <linux/err.h>
     23#include <linux/slab.h>
     24#include <linux/pm_runtime.h>
     25#include <linux/pm_domain.h>
     26#include <linux/idr.h>
     27#include <linux/acpi.h>
     28#include <linux/clk/clk-conf.h>
     29#include <linux/limits.h>
     30#include <linux/property.h>
     31#include <linux/kmemleak.h>
     32#include <linux/types.h>
     33#include <linux/iommu.h>
     34#include <linux/dma-map-ops.h>
     35
     36#include "base.h"
     37#include "power/power.h"
     38
     39/* For automatically allocated device IDs */
     40static DEFINE_IDA(platform_devid_ida);
     41
     42struct device platform_bus = {
     43	.init_name	= "platform",
     44};
     45EXPORT_SYMBOL_GPL(platform_bus);
     46
     47/**
     48 * platform_get_resource - get a resource for a device
     49 * @dev: platform device
     50 * @type: resource type
     51 * @num: resource index
     52 *
     53 * Return: a pointer to the resource or NULL on failure.
     54 */
     55struct resource *platform_get_resource(struct platform_device *dev,
     56				       unsigned int type, unsigned int num)
     57{
     58	u32 i;
     59
     60	for (i = 0; i < dev->num_resources; i++) {
     61		struct resource *r = &dev->resource[i];
     62
     63		if (type == resource_type(r) && num-- == 0)
     64			return r;
     65	}
     66	return NULL;
     67}
     68EXPORT_SYMBOL_GPL(platform_get_resource);
     69
     70struct resource *platform_get_mem_or_io(struct platform_device *dev,
     71					unsigned int num)
     72{
     73	u32 i;
     74
     75	for (i = 0; i < dev->num_resources; i++) {
     76		struct resource *r = &dev->resource[i];
     77
     78		if ((resource_type(r) & (IORESOURCE_MEM|IORESOURCE_IO)) && num-- == 0)
     79			return r;
     80	}
     81	return NULL;
     82}
     83EXPORT_SYMBOL_GPL(platform_get_mem_or_io);
     84
     85#ifdef CONFIG_HAS_IOMEM
     86/**
     87 * devm_platform_get_and_ioremap_resource - call devm_ioremap_resource() for a
     88 *					    platform device and get resource
     89 *
     90 * @pdev: platform device to use both for memory resource lookup as well as
     91 *        resource management
     92 * @index: resource index
     93 * @res: optional output parameter to store a pointer to the obtained resource.
     94 *
     95 * Return: a pointer to the remapped memory or an ERR_PTR() encoded error code
     96 * on failure.
     97 */
     98void __iomem *
     99devm_platform_get_and_ioremap_resource(struct platform_device *pdev,
    100				unsigned int index, struct resource **res)
    101{
    102	struct resource *r;
    103
    104	r = platform_get_resource(pdev, IORESOURCE_MEM, index);
    105	if (res)
    106		*res = r;
    107	return devm_ioremap_resource(&pdev->dev, r);
    108}
    109EXPORT_SYMBOL_GPL(devm_platform_get_and_ioremap_resource);
    110
    111/**
    112 * devm_platform_ioremap_resource - call devm_ioremap_resource() for a platform
    113 *				    device
    114 *
    115 * @pdev: platform device to use both for memory resource lookup as well as
    116 *        resource management
    117 * @index: resource index
    118 *
    119 * Return: a pointer to the remapped memory or an ERR_PTR() encoded error code
    120 * on failure.
    121 */
    122void __iomem *devm_platform_ioremap_resource(struct platform_device *pdev,
    123					     unsigned int index)
    124{
    125	return devm_platform_get_and_ioremap_resource(pdev, index, NULL);
    126}
    127EXPORT_SYMBOL_GPL(devm_platform_ioremap_resource);
    128
    129/**
    130 * devm_platform_ioremap_resource_byname - call devm_ioremap_resource for
    131 *					   a platform device, retrieve the
    132 *					   resource by name
    133 *
    134 * @pdev: platform device to use both for memory resource lookup as well as
    135 *	  resource management
    136 * @name: name of the resource
    137 *
    138 * Return: a pointer to the remapped memory or an ERR_PTR() encoded error code
    139 * on failure.
    140 */
    141void __iomem *
    142devm_platform_ioremap_resource_byname(struct platform_device *pdev,
    143				      const char *name)
    144{
    145	struct resource *res;
    146
    147	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, name);
    148	return devm_ioremap_resource(&pdev->dev, res);
    149}
    150EXPORT_SYMBOL_GPL(devm_platform_ioremap_resource_byname);
    151#endif /* CONFIG_HAS_IOMEM */
    152
    153/**
    154 * platform_get_irq_optional - get an optional IRQ for a device
    155 * @dev: platform device
    156 * @num: IRQ number index
    157 *
    158 * Gets an IRQ for a platform device. Device drivers should check the return
    159 * value for errors so as to not pass a negative integer value to the
    160 * request_irq() APIs. This is the same as platform_get_irq(), except that it
    161 * does not print an error message if an IRQ can not be obtained.
    162 *
    163 * For example::
    164 *
    165 *		int irq = platform_get_irq_optional(pdev, 0);
    166 *		if (irq < 0)
    167 *			return irq;
    168 *
    169 * Return: non-zero IRQ number on success, negative error number on failure.
    170 */
    171int platform_get_irq_optional(struct platform_device *dev, unsigned int num)
    172{
    173	int ret;
    174#ifdef CONFIG_SPARC
    175	/* sparc does not have irqs represented as IORESOURCE_IRQ resources */
    176	if (!dev || num >= dev->archdata.num_irqs)
    177		goto out_not_found;
    178	ret = dev->archdata.irqs[num];
    179	goto out;
    180#else
    181	struct resource *r;
    182
    183	if (IS_ENABLED(CONFIG_OF_IRQ) && dev->dev.of_node) {
    184		ret = of_irq_get(dev->dev.of_node, num);
    185		if (ret > 0 || ret == -EPROBE_DEFER)
    186			goto out;
    187	}
    188
    189	r = platform_get_resource(dev, IORESOURCE_IRQ, num);
    190	if (has_acpi_companion(&dev->dev)) {
    191		if (r && r->flags & IORESOURCE_DISABLED) {
    192			ret = acpi_irq_get(ACPI_HANDLE(&dev->dev), num, r);
    193			if (ret)
    194				goto out;
    195		}
    196	}
    197
    198	/*
    199	 * The resources may pass trigger flags to the irqs that need
    200	 * to be set up. It so happens that the trigger flags for
    201	 * IORESOURCE_BITS correspond 1-to-1 to the IRQF_TRIGGER*
    202	 * settings.
    203	 */
    204	if (r && r->flags & IORESOURCE_BITS) {
    205		struct irq_data *irqd;
    206
    207		irqd = irq_get_irq_data(r->start);
    208		if (!irqd)
    209			goto out_not_found;
    210		irqd_set_trigger_type(irqd, r->flags & IORESOURCE_BITS);
    211	}
    212
    213	if (r) {
    214		ret = r->start;
    215		goto out;
    216	}
    217
    218	/*
    219	 * For the index 0 interrupt, allow falling back to GpioInt
    220	 * resources. While a device could have both Interrupt and GpioInt
    221	 * resources, making this fallback ambiguous, in many common cases
    222	 * the device will only expose one IRQ, and this fallback
    223	 * allows a common code path across either kind of resource.
    224	 */
    225	if (num == 0 && has_acpi_companion(&dev->dev)) {
    226		ret = acpi_dev_gpio_irq_get(ACPI_COMPANION(&dev->dev), num);
    227		/* Our callers expect -ENXIO for missing IRQs. */
    228		if (ret >= 0 || ret == -EPROBE_DEFER)
    229			goto out;
    230	}
    231
    232#endif
    233out_not_found:
    234	ret = -ENXIO;
    235out:
    236	if (WARN(!ret, "0 is an invalid IRQ number\n"))
    237		return -EINVAL;
    238	return ret;
    239}
    240EXPORT_SYMBOL_GPL(platform_get_irq_optional);
    241
    242/**
    243 * platform_get_irq - get an IRQ for a device
    244 * @dev: platform device
    245 * @num: IRQ number index
    246 *
    247 * Gets an IRQ for a platform device and prints an error message if finding the
    248 * IRQ fails. Device drivers should check the return value for errors so as to
    249 * not pass a negative integer value to the request_irq() APIs.
    250 *
    251 * For example::
    252 *
    253 *		int irq = platform_get_irq(pdev, 0);
    254 *		if (irq < 0)
    255 *			return irq;
    256 *
    257 * Return: non-zero IRQ number on success, negative error number on failure.
    258 */
    259int platform_get_irq(struct platform_device *dev, unsigned int num)
    260{
    261	int ret;
    262
    263	ret = platform_get_irq_optional(dev, num);
    264	if (ret < 0)
    265		return dev_err_probe(&dev->dev, ret,
    266				     "IRQ index %u not found\n", num);
    267
    268	return ret;
    269}
    270EXPORT_SYMBOL_GPL(platform_get_irq);
    271
    272/**
    273 * platform_irq_count - Count the number of IRQs a platform device uses
    274 * @dev: platform device
    275 *
    276 * Return: Number of IRQs a platform device uses or EPROBE_DEFER
    277 */
    278int platform_irq_count(struct platform_device *dev)
    279{
    280	int ret, nr = 0;
    281
    282	while ((ret = platform_get_irq_optional(dev, nr)) >= 0)
    283		nr++;
    284
    285	if (ret == -EPROBE_DEFER)
    286		return ret;
    287
    288	return nr;
    289}
    290EXPORT_SYMBOL_GPL(platform_irq_count);
    291
    292struct irq_affinity_devres {
    293	unsigned int count;
    294	unsigned int irq[];
    295};
    296
    297static void platform_disable_acpi_irq(struct platform_device *pdev, int index)
    298{
    299	struct resource *r;
    300
    301	r = platform_get_resource(pdev, IORESOURCE_IRQ, index);
    302	if (r)
    303		irqresource_disabled(r, 0);
    304}
    305
    306static void devm_platform_get_irqs_affinity_release(struct device *dev,
    307						    void *res)
    308{
    309	struct irq_affinity_devres *ptr = res;
    310	int i;
    311
    312	for (i = 0; i < ptr->count; i++) {
    313		irq_dispose_mapping(ptr->irq[i]);
    314
    315		if (has_acpi_companion(dev))
    316			platform_disable_acpi_irq(to_platform_device(dev), i);
    317	}
    318}
    319
    320/**
    321 * devm_platform_get_irqs_affinity - devm method to get a set of IRQs for a
    322 *				device using an interrupt affinity descriptor
    323 * @dev: platform device pointer
    324 * @affd: affinity descriptor
    325 * @minvec: minimum count of interrupt vectors
    326 * @maxvec: maximum count of interrupt vectors
    327 * @irqs: pointer holder for IRQ numbers
    328 *
    329 * Gets a set of IRQs for a platform device, and updates IRQ afffinty according
    330 * to the passed affinity descriptor
    331 *
    332 * Return: Number of vectors on success, negative error number on failure.
    333 */
    334int devm_platform_get_irqs_affinity(struct platform_device *dev,
    335				    struct irq_affinity *affd,
    336				    unsigned int minvec,
    337				    unsigned int maxvec,
    338				    int **irqs)
    339{
    340	struct irq_affinity_devres *ptr;
    341	struct irq_affinity_desc *desc;
    342	size_t size;
    343	int i, ret, nvec;
    344
    345	if (!affd)
    346		return -EPERM;
    347
    348	if (maxvec < minvec)
    349		return -ERANGE;
    350
    351	nvec = platform_irq_count(dev);
    352	if (nvec < 0)
    353		return nvec;
    354
    355	if (nvec < minvec)
    356		return -ENOSPC;
    357
    358	nvec = irq_calc_affinity_vectors(minvec, nvec, affd);
    359	if (nvec < minvec)
    360		return -ENOSPC;
    361
    362	if (nvec > maxvec)
    363		nvec = maxvec;
    364
    365	size = sizeof(*ptr) + sizeof(unsigned int) * nvec;
    366	ptr = devres_alloc(devm_platform_get_irqs_affinity_release, size,
    367			   GFP_KERNEL);
    368	if (!ptr)
    369		return -ENOMEM;
    370
    371	ptr->count = nvec;
    372
    373	for (i = 0; i < nvec; i++) {
    374		int irq = platform_get_irq(dev, i);
    375		if (irq < 0) {
    376			ret = irq;
    377			goto err_free_devres;
    378		}
    379		ptr->irq[i] = irq;
    380	}
    381
    382	desc = irq_create_affinity_masks(nvec, affd);
    383	if (!desc) {
    384		ret = -ENOMEM;
    385		goto err_free_devres;
    386	}
    387
    388	for (i = 0; i < nvec; i++) {
    389		ret = irq_update_affinity_desc(ptr->irq[i], &desc[i]);
    390		if (ret) {
    391			dev_err(&dev->dev, "failed to update irq%d affinity descriptor (%d)\n",
    392				ptr->irq[i], ret);
    393			goto err_free_desc;
    394		}
    395	}
    396
    397	devres_add(&dev->dev, ptr);
    398
    399	kfree(desc);
    400
    401	*irqs = ptr->irq;
    402
    403	return nvec;
    404
    405err_free_desc:
    406	kfree(desc);
    407err_free_devres:
    408	devres_free(ptr);
    409	return ret;
    410}
    411EXPORT_SYMBOL_GPL(devm_platform_get_irqs_affinity);
    412
    413/**
    414 * platform_get_resource_byname - get a resource for a device by name
    415 * @dev: platform device
    416 * @type: resource type
    417 * @name: resource name
    418 */
    419struct resource *platform_get_resource_byname(struct platform_device *dev,
    420					      unsigned int type,
    421					      const char *name)
    422{
    423	u32 i;
    424
    425	for (i = 0; i < dev->num_resources; i++) {
    426		struct resource *r = &dev->resource[i];
    427
    428		if (unlikely(!r->name))
    429			continue;
    430
    431		if (type == resource_type(r) && !strcmp(r->name, name))
    432			return r;
    433	}
    434	return NULL;
    435}
    436EXPORT_SYMBOL_GPL(platform_get_resource_byname);
    437
    438static int __platform_get_irq_byname(struct platform_device *dev,
    439				     const char *name)
    440{
    441	struct resource *r;
    442	int ret;
    443
    444	if (IS_ENABLED(CONFIG_OF_IRQ) && dev->dev.of_node) {
    445		ret = of_irq_get_byname(dev->dev.of_node, name);
    446		if (ret > 0 || ret == -EPROBE_DEFER)
    447			return ret;
    448	}
    449
    450	r = platform_get_resource_byname(dev, IORESOURCE_IRQ, name);
    451	if (r) {
    452		if (WARN(!r->start, "0 is an invalid IRQ number\n"))
    453			return -EINVAL;
    454		return r->start;
    455	}
    456
    457	return -ENXIO;
    458}
    459
    460/**
    461 * platform_get_irq_byname - get an IRQ for a device by name
    462 * @dev: platform device
    463 * @name: IRQ name
    464 *
    465 * Get an IRQ like platform_get_irq(), but then by name rather then by index.
    466 *
    467 * Return: non-zero IRQ number on success, negative error number on failure.
    468 */
    469int platform_get_irq_byname(struct platform_device *dev, const char *name)
    470{
    471	int ret;
    472
    473	ret = __platform_get_irq_byname(dev, name);
    474	if (ret < 0)
    475		return dev_err_probe(&dev->dev, ret, "IRQ %s not found\n",
    476				     name);
    477	return ret;
    478}
    479EXPORT_SYMBOL_GPL(platform_get_irq_byname);
    480
    481/**
    482 * platform_get_irq_byname_optional - get an optional IRQ for a device by name
    483 * @dev: platform device
    484 * @name: IRQ name
    485 *
    486 * Get an optional IRQ by name like platform_get_irq_byname(). Except that it
    487 * does not print an error message if an IRQ can not be obtained.
    488 *
    489 * Return: non-zero IRQ number on success, negative error number on failure.
    490 */
    491int platform_get_irq_byname_optional(struct platform_device *dev,
    492				     const char *name)
    493{
    494	return __platform_get_irq_byname(dev, name);
    495}
    496EXPORT_SYMBOL_GPL(platform_get_irq_byname_optional);
    497
    498/**
    499 * platform_add_devices - add a numbers of platform devices
    500 * @devs: array of platform devices to add
    501 * @num: number of platform devices in array
    502 */
    503int platform_add_devices(struct platform_device **devs, int num)
    504{
    505	int i, ret = 0;
    506
    507	for (i = 0; i < num; i++) {
    508		ret = platform_device_register(devs[i]);
    509		if (ret) {
    510			while (--i >= 0)
    511				platform_device_unregister(devs[i]);
    512			break;
    513		}
    514	}
    515
    516	return ret;
    517}
    518EXPORT_SYMBOL_GPL(platform_add_devices);
    519
    520struct platform_object {
    521	struct platform_device pdev;
    522	char name[];
    523};
    524
    525/*
    526 * Set up default DMA mask for platform devices if the they weren't
    527 * previously set by the architecture / DT.
    528 */
    529static void setup_pdev_dma_masks(struct platform_device *pdev)
    530{
    531	pdev->dev.dma_parms = &pdev->dma_parms;
    532
    533	if (!pdev->dev.coherent_dma_mask)
    534		pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
    535	if (!pdev->dev.dma_mask) {
    536		pdev->platform_dma_mask = DMA_BIT_MASK(32);
    537		pdev->dev.dma_mask = &pdev->platform_dma_mask;
    538	}
    539};
    540
    541/**
    542 * platform_device_put - destroy a platform device
    543 * @pdev: platform device to free
    544 *
    545 * Free all memory associated with a platform device.  This function must
    546 * _only_ be externally called in error cases.  All other usage is a bug.
    547 */
    548void platform_device_put(struct platform_device *pdev)
    549{
    550	if (!IS_ERR_OR_NULL(pdev))
    551		put_device(&pdev->dev);
    552}
    553EXPORT_SYMBOL_GPL(platform_device_put);
    554
    555static void platform_device_release(struct device *dev)
    556{
    557	struct platform_object *pa = container_of(dev, struct platform_object,
    558						  pdev.dev);
    559
    560	of_node_put(pa->pdev.dev.of_node);
    561	kfree(pa->pdev.dev.platform_data);
    562	kfree(pa->pdev.mfd_cell);
    563	kfree(pa->pdev.resource);
    564	kfree(pa->pdev.driver_override);
    565	kfree(pa);
    566}
    567
    568/**
    569 * platform_device_alloc - create a platform device
    570 * @name: base name of the device we're adding
    571 * @id: instance id
    572 *
    573 * Create a platform device object which can have other objects attached
    574 * to it, and which will have attached objects freed when it is released.
    575 */
    576struct platform_device *platform_device_alloc(const char *name, int id)
    577{
    578	struct platform_object *pa;
    579
    580	pa = kzalloc(sizeof(*pa) + strlen(name) + 1, GFP_KERNEL);
    581	if (pa) {
    582		strcpy(pa->name, name);
    583		pa->pdev.name = pa->name;
    584		pa->pdev.id = id;
    585		device_initialize(&pa->pdev.dev);
    586		pa->pdev.dev.release = platform_device_release;
    587		setup_pdev_dma_masks(&pa->pdev);
    588	}
    589
    590	return pa ? &pa->pdev : NULL;
    591}
    592EXPORT_SYMBOL_GPL(platform_device_alloc);
    593
    594/**
    595 * platform_device_add_resources - add resources to a platform device
    596 * @pdev: platform device allocated by platform_device_alloc to add resources to
    597 * @res: set of resources that needs to be allocated for the device
    598 * @num: number of resources
    599 *
    600 * Add a copy of the resources to the platform device.  The memory
    601 * associated with the resources will be freed when the platform device is
    602 * released.
    603 */
    604int platform_device_add_resources(struct platform_device *pdev,
    605				  const struct resource *res, unsigned int num)
    606{
    607	struct resource *r = NULL;
    608
    609	if (res) {
    610		r = kmemdup(res, sizeof(struct resource) * num, GFP_KERNEL);
    611		if (!r)
    612			return -ENOMEM;
    613	}
    614
    615	kfree(pdev->resource);
    616	pdev->resource = r;
    617	pdev->num_resources = num;
    618	return 0;
    619}
    620EXPORT_SYMBOL_GPL(platform_device_add_resources);
    621
    622/**
    623 * platform_device_add_data - add platform-specific data to a platform device
    624 * @pdev: platform device allocated by platform_device_alloc to add resources to
    625 * @data: platform specific data for this platform device
    626 * @size: size of platform specific data
    627 *
    628 * Add a copy of platform specific data to the platform device's
    629 * platform_data pointer.  The memory associated with the platform data
    630 * will be freed when the platform device is released.
    631 */
    632int platform_device_add_data(struct platform_device *pdev, const void *data,
    633			     size_t size)
    634{
    635	void *d = NULL;
    636
    637	if (data) {
    638		d = kmemdup(data, size, GFP_KERNEL);
    639		if (!d)
    640			return -ENOMEM;
    641	}
    642
    643	kfree(pdev->dev.platform_data);
    644	pdev->dev.platform_data = d;
    645	return 0;
    646}
    647EXPORT_SYMBOL_GPL(platform_device_add_data);
    648
    649/**
    650 * platform_device_add - add a platform device to device hierarchy
    651 * @pdev: platform device we're adding
    652 *
    653 * This is part 2 of platform_device_register(), though may be called
    654 * separately _iff_ pdev was allocated by platform_device_alloc().
    655 */
    656int platform_device_add(struct platform_device *pdev)
    657{
    658	u32 i;
    659	int ret;
    660
    661	if (!pdev)
    662		return -EINVAL;
    663
    664	if (!pdev->dev.parent)
    665		pdev->dev.parent = &platform_bus;
    666
    667	pdev->dev.bus = &platform_bus_type;
    668
    669	switch (pdev->id) {
    670	default:
    671		dev_set_name(&pdev->dev, "%s.%d", pdev->name,  pdev->id);
    672		break;
    673	case PLATFORM_DEVID_NONE:
    674		dev_set_name(&pdev->dev, "%s", pdev->name);
    675		break;
    676	case PLATFORM_DEVID_AUTO:
    677		/*
    678		 * Automatically allocated device ID. We mark it as such so
    679		 * that we remember it must be freed, and we append a suffix
    680		 * to avoid namespace collision with explicit IDs.
    681		 */
    682		ret = ida_alloc(&platform_devid_ida, GFP_KERNEL);
    683		if (ret < 0)
    684			goto err_out;
    685		pdev->id = ret;
    686		pdev->id_auto = true;
    687		dev_set_name(&pdev->dev, "%s.%d.auto", pdev->name, pdev->id);
    688		break;
    689	}
    690
    691	for (i = 0; i < pdev->num_resources; i++) {
    692		struct resource *p, *r = &pdev->resource[i];
    693
    694		if (r->name == NULL)
    695			r->name = dev_name(&pdev->dev);
    696
    697		p = r->parent;
    698		if (!p) {
    699			if (resource_type(r) == IORESOURCE_MEM)
    700				p = &iomem_resource;
    701			else if (resource_type(r) == IORESOURCE_IO)
    702				p = &ioport_resource;
    703		}
    704
    705		if (p) {
    706			ret = insert_resource(p, r);
    707			if (ret) {
    708				dev_err(&pdev->dev, "failed to claim resource %d: %pR\n", i, r);
    709				goto failed;
    710			}
    711		}
    712	}
    713
    714	pr_debug("Registering platform device '%s'. Parent at %s\n",
    715		 dev_name(&pdev->dev), dev_name(pdev->dev.parent));
    716
    717	ret = device_add(&pdev->dev);
    718	if (ret == 0)
    719		return ret;
    720
    721 failed:
    722	if (pdev->id_auto) {
    723		ida_free(&platform_devid_ida, pdev->id);
    724		pdev->id = PLATFORM_DEVID_AUTO;
    725	}
    726
    727	while (i--) {
    728		struct resource *r = &pdev->resource[i];
    729		if (r->parent)
    730			release_resource(r);
    731	}
    732
    733 err_out:
    734	return ret;
    735}
    736EXPORT_SYMBOL_GPL(platform_device_add);
    737
    738/**
    739 * platform_device_del - remove a platform-level device
    740 * @pdev: platform device we're removing
    741 *
    742 * Note that this function will also release all memory- and port-based
    743 * resources owned by the device (@dev->resource).  This function must
    744 * _only_ be externally called in error cases.  All other usage is a bug.
    745 */
    746void platform_device_del(struct platform_device *pdev)
    747{
    748	u32 i;
    749
    750	if (!IS_ERR_OR_NULL(pdev)) {
    751		device_del(&pdev->dev);
    752
    753		if (pdev->id_auto) {
    754			ida_free(&platform_devid_ida, pdev->id);
    755			pdev->id = PLATFORM_DEVID_AUTO;
    756		}
    757
    758		for (i = 0; i < pdev->num_resources; i++) {
    759			struct resource *r = &pdev->resource[i];
    760			if (r->parent)
    761				release_resource(r);
    762		}
    763	}
    764}
    765EXPORT_SYMBOL_GPL(platform_device_del);
    766
    767/**
    768 * platform_device_register - add a platform-level device
    769 * @pdev: platform device we're adding
    770 *
    771 * NOTE: _Never_ directly free @pdev after calling this function, even if it
    772 * returned an error! Always use platform_device_put() to give up the
    773 * reference initialised in this function instead.
    774 */
    775int platform_device_register(struct platform_device *pdev)
    776{
    777	device_initialize(&pdev->dev);
    778	setup_pdev_dma_masks(pdev);
    779	return platform_device_add(pdev);
    780}
    781EXPORT_SYMBOL_GPL(platform_device_register);
    782
    783/**
    784 * platform_device_unregister - unregister a platform-level device
    785 * @pdev: platform device we're unregistering
    786 *
    787 * Unregistration is done in 2 steps. First we release all resources
    788 * and remove it from the subsystem, then we drop reference count by
    789 * calling platform_device_put().
    790 */
    791void platform_device_unregister(struct platform_device *pdev)
    792{
    793	platform_device_del(pdev);
    794	platform_device_put(pdev);
    795}
    796EXPORT_SYMBOL_GPL(platform_device_unregister);
    797
    798/**
    799 * platform_device_register_full - add a platform-level device with
    800 * resources and platform-specific data
    801 *
    802 * @pdevinfo: data used to create device
    803 *
    804 * Returns &struct platform_device pointer on success, or ERR_PTR() on error.
    805 */
    806struct platform_device *platform_device_register_full(
    807		const struct platform_device_info *pdevinfo)
    808{
    809	int ret;
    810	struct platform_device *pdev;
    811
    812	pdev = platform_device_alloc(pdevinfo->name, pdevinfo->id);
    813	if (!pdev)
    814		return ERR_PTR(-ENOMEM);
    815
    816	pdev->dev.parent = pdevinfo->parent;
    817	pdev->dev.fwnode = pdevinfo->fwnode;
    818	pdev->dev.of_node = of_node_get(to_of_node(pdev->dev.fwnode));
    819	pdev->dev.of_node_reused = pdevinfo->of_node_reused;
    820
    821	if (pdevinfo->dma_mask) {
    822		pdev->platform_dma_mask = pdevinfo->dma_mask;
    823		pdev->dev.dma_mask = &pdev->platform_dma_mask;
    824		pdev->dev.coherent_dma_mask = pdevinfo->dma_mask;
    825	}
    826
    827	ret = platform_device_add_resources(pdev,
    828			pdevinfo->res, pdevinfo->num_res);
    829	if (ret)
    830		goto err;
    831
    832	ret = platform_device_add_data(pdev,
    833			pdevinfo->data, pdevinfo->size_data);
    834	if (ret)
    835		goto err;
    836
    837	if (pdevinfo->properties) {
    838		ret = device_create_managed_software_node(&pdev->dev,
    839							  pdevinfo->properties, NULL);
    840		if (ret)
    841			goto err;
    842	}
    843
    844	ret = platform_device_add(pdev);
    845	if (ret) {
    846err:
    847		ACPI_COMPANION_SET(&pdev->dev, NULL);
    848		platform_device_put(pdev);
    849		return ERR_PTR(ret);
    850	}
    851
    852	return pdev;
    853}
    854EXPORT_SYMBOL_GPL(platform_device_register_full);
    855
    856/**
    857 * __platform_driver_register - register a driver for platform-level devices
    858 * @drv: platform driver structure
    859 * @owner: owning module/driver
    860 */
    861int __platform_driver_register(struct platform_driver *drv,
    862				struct module *owner)
    863{
    864	drv->driver.owner = owner;
    865	drv->driver.bus = &platform_bus_type;
    866
    867	return driver_register(&drv->driver);
    868}
    869EXPORT_SYMBOL_GPL(__platform_driver_register);
    870
    871/**
    872 * platform_driver_unregister - unregister a driver for platform-level devices
    873 * @drv: platform driver structure
    874 */
    875void platform_driver_unregister(struct platform_driver *drv)
    876{
    877	driver_unregister(&drv->driver);
    878}
    879EXPORT_SYMBOL_GPL(platform_driver_unregister);
    880
    881static int platform_probe_fail(struct platform_device *pdev)
    882{
    883	return -ENXIO;
    884}
    885
    886/**
    887 * __platform_driver_probe - register driver for non-hotpluggable device
    888 * @drv: platform driver structure
    889 * @probe: the driver probe routine, probably from an __init section
    890 * @module: module which will be the owner of the driver
    891 *
    892 * Use this instead of platform_driver_register() when you know the device
    893 * is not hotpluggable and has already been registered, and you want to
    894 * remove its run-once probe() infrastructure from memory after the driver
    895 * has bound to the device.
    896 *
    897 * One typical use for this would be with drivers for controllers integrated
    898 * into system-on-chip processors, where the controller devices have been
    899 * configured as part of board setup.
    900 *
    901 * Note that this is incompatible with deferred probing.
    902 *
    903 * Returns zero if the driver registered and bound to a device, else returns
    904 * a negative error code and with the driver not registered.
    905 */
    906int __init_or_module __platform_driver_probe(struct platform_driver *drv,
    907		int (*probe)(struct platform_device *), struct module *module)
    908{
    909	int retval, code;
    910
    911	if (drv->driver.probe_type == PROBE_PREFER_ASYNCHRONOUS) {
    912		pr_err("%s: drivers registered with %s can not be probed asynchronously\n",
    913			 drv->driver.name, __func__);
    914		return -EINVAL;
    915	}
    916
    917	/*
    918	 * We have to run our probes synchronously because we check if
    919	 * we find any devices to bind to and exit with error if there
    920	 * are any.
    921	 */
    922	drv->driver.probe_type = PROBE_FORCE_SYNCHRONOUS;
    923
    924	/*
    925	 * Prevent driver from requesting probe deferral to avoid further
    926	 * futile probe attempts.
    927	 */
    928	drv->prevent_deferred_probe = true;
    929
    930	/* make sure driver won't have bind/unbind attributes */
    931	drv->driver.suppress_bind_attrs = true;
    932
    933	/* temporary section violation during probe() */
    934	drv->probe = probe;
    935	retval = code = __platform_driver_register(drv, module);
    936	if (retval)
    937		return retval;
    938
    939	/*
    940	 * Fixup that section violation, being paranoid about code scanning
    941	 * the list of drivers in order to probe new devices.  Check to see
    942	 * if the probe was successful, and make sure any forced probes of
    943	 * new devices fail.
    944	 */
    945	spin_lock(&drv->driver.bus->p->klist_drivers.k_lock);
    946	drv->probe = platform_probe_fail;
    947	if (code == 0 && list_empty(&drv->driver.p->klist_devices.k_list))
    948		retval = -ENODEV;
    949	spin_unlock(&drv->driver.bus->p->klist_drivers.k_lock);
    950
    951	if (code != retval)
    952		platform_driver_unregister(drv);
    953	return retval;
    954}
    955EXPORT_SYMBOL_GPL(__platform_driver_probe);
    956
    957/**
    958 * __platform_create_bundle - register driver and create corresponding device
    959 * @driver: platform driver structure
    960 * @probe: the driver probe routine, probably from an __init section
    961 * @res: set of resources that needs to be allocated for the device
    962 * @n_res: number of resources
    963 * @data: platform specific data for this platform device
    964 * @size: size of platform specific data
    965 * @module: module which will be the owner of the driver
    966 *
    967 * Use this in legacy-style modules that probe hardware directly and
    968 * register a single platform device and corresponding platform driver.
    969 *
    970 * Returns &struct platform_device pointer on success, or ERR_PTR() on error.
    971 */
    972struct platform_device * __init_or_module __platform_create_bundle(
    973			struct platform_driver *driver,
    974			int (*probe)(struct platform_device *),
    975			struct resource *res, unsigned int n_res,
    976			const void *data, size_t size, struct module *module)
    977{
    978	struct platform_device *pdev;
    979	int error;
    980
    981	pdev = platform_device_alloc(driver->driver.name, -1);
    982	if (!pdev) {
    983		error = -ENOMEM;
    984		goto err_out;
    985	}
    986
    987	error = platform_device_add_resources(pdev, res, n_res);
    988	if (error)
    989		goto err_pdev_put;
    990
    991	error = platform_device_add_data(pdev, data, size);
    992	if (error)
    993		goto err_pdev_put;
    994
    995	error = platform_device_add(pdev);
    996	if (error)
    997		goto err_pdev_put;
    998
    999	error = __platform_driver_probe(driver, probe, module);
   1000	if (error)
   1001		goto err_pdev_del;
   1002
   1003	return pdev;
   1004
   1005err_pdev_del:
   1006	platform_device_del(pdev);
   1007err_pdev_put:
   1008	platform_device_put(pdev);
   1009err_out:
   1010	return ERR_PTR(error);
   1011}
   1012EXPORT_SYMBOL_GPL(__platform_create_bundle);
   1013
   1014/**
   1015 * __platform_register_drivers - register an array of platform drivers
   1016 * @drivers: an array of drivers to register
   1017 * @count: the number of drivers to register
   1018 * @owner: module owning the drivers
   1019 *
   1020 * Registers platform drivers specified by an array. On failure to register a
   1021 * driver, all previously registered drivers will be unregistered. Callers of
   1022 * this API should use platform_unregister_drivers() to unregister drivers in
   1023 * the reverse order.
   1024 *
   1025 * Returns: 0 on success or a negative error code on failure.
   1026 */
   1027int __platform_register_drivers(struct platform_driver * const *drivers,
   1028				unsigned int count, struct module *owner)
   1029{
   1030	unsigned int i;
   1031	int err;
   1032
   1033	for (i = 0; i < count; i++) {
   1034		pr_debug("registering platform driver %ps\n", drivers[i]);
   1035
   1036		err = __platform_driver_register(drivers[i], owner);
   1037		if (err < 0) {
   1038			pr_err("failed to register platform driver %ps: %d\n",
   1039			       drivers[i], err);
   1040			goto error;
   1041		}
   1042	}
   1043
   1044	return 0;
   1045
   1046error:
   1047	while (i--) {
   1048		pr_debug("unregistering platform driver %ps\n", drivers[i]);
   1049		platform_driver_unregister(drivers[i]);
   1050	}
   1051
   1052	return err;
   1053}
   1054EXPORT_SYMBOL_GPL(__platform_register_drivers);
   1055
   1056/**
   1057 * platform_unregister_drivers - unregister an array of platform drivers
   1058 * @drivers: an array of drivers to unregister
   1059 * @count: the number of drivers to unregister
   1060 *
   1061 * Unregisters platform drivers specified by an array. This is typically used
   1062 * to complement an earlier call to platform_register_drivers(). Drivers are
   1063 * unregistered in the reverse order in which they were registered.
   1064 */
   1065void platform_unregister_drivers(struct platform_driver * const *drivers,
   1066				 unsigned int count)
   1067{
   1068	while (count--) {
   1069		pr_debug("unregistering platform driver %ps\n", drivers[count]);
   1070		platform_driver_unregister(drivers[count]);
   1071	}
   1072}
   1073EXPORT_SYMBOL_GPL(platform_unregister_drivers);
   1074
   1075static const struct platform_device_id *platform_match_id(
   1076			const struct platform_device_id *id,
   1077			struct platform_device *pdev)
   1078{
   1079	while (id->name[0]) {
   1080		if (strcmp(pdev->name, id->name) == 0) {
   1081			pdev->id_entry = id;
   1082			return id;
   1083		}
   1084		id++;
   1085	}
   1086	return NULL;
   1087}
   1088
   1089#ifdef CONFIG_PM_SLEEP
   1090
   1091static int platform_legacy_suspend(struct device *dev, pm_message_t mesg)
   1092{
   1093	struct platform_driver *pdrv = to_platform_driver(dev->driver);
   1094	struct platform_device *pdev = to_platform_device(dev);
   1095	int ret = 0;
   1096
   1097	if (dev->driver && pdrv->suspend)
   1098		ret = pdrv->suspend(pdev, mesg);
   1099
   1100	return ret;
   1101}
   1102
   1103static int platform_legacy_resume(struct device *dev)
   1104{
   1105	struct platform_driver *pdrv = to_platform_driver(dev->driver);
   1106	struct platform_device *pdev = to_platform_device(dev);
   1107	int ret = 0;
   1108
   1109	if (dev->driver && pdrv->resume)
   1110		ret = pdrv->resume(pdev);
   1111
   1112	return ret;
   1113}
   1114
   1115#endif /* CONFIG_PM_SLEEP */
   1116
   1117#ifdef CONFIG_SUSPEND
   1118
   1119int platform_pm_suspend(struct device *dev)
   1120{
   1121	struct device_driver *drv = dev->driver;
   1122	int ret = 0;
   1123
   1124	if (!drv)
   1125		return 0;
   1126
   1127	if (drv->pm) {
   1128		if (drv->pm->suspend)
   1129			ret = drv->pm->suspend(dev);
   1130	} else {
   1131		ret = platform_legacy_suspend(dev, PMSG_SUSPEND);
   1132	}
   1133
   1134	return ret;
   1135}
   1136
   1137int platform_pm_resume(struct device *dev)
   1138{
   1139	struct device_driver *drv = dev->driver;
   1140	int ret = 0;
   1141
   1142	if (!drv)
   1143		return 0;
   1144
   1145	if (drv->pm) {
   1146		if (drv->pm->resume)
   1147			ret = drv->pm->resume(dev);
   1148	} else {
   1149		ret = platform_legacy_resume(dev);
   1150	}
   1151
   1152	return ret;
   1153}
   1154
   1155#endif /* CONFIG_SUSPEND */
   1156
   1157#ifdef CONFIG_HIBERNATE_CALLBACKS
   1158
   1159int platform_pm_freeze(struct device *dev)
   1160{
   1161	struct device_driver *drv = dev->driver;
   1162	int ret = 0;
   1163
   1164	if (!drv)
   1165		return 0;
   1166
   1167	if (drv->pm) {
   1168		if (drv->pm->freeze)
   1169			ret = drv->pm->freeze(dev);
   1170	} else {
   1171		ret = platform_legacy_suspend(dev, PMSG_FREEZE);
   1172	}
   1173
   1174	return ret;
   1175}
   1176
   1177int platform_pm_thaw(struct device *dev)
   1178{
   1179	struct device_driver *drv = dev->driver;
   1180	int ret = 0;
   1181
   1182	if (!drv)
   1183		return 0;
   1184
   1185	if (drv->pm) {
   1186		if (drv->pm->thaw)
   1187			ret = drv->pm->thaw(dev);
   1188	} else {
   1189		ret = platform_legacy_resume(dev);
   1190	}
   1191
   1192	return ret;
   1193}
   1194
   1195int platform_pm_poweroff(struct device *dev)
   1196{
   1197	struct device_driver *drv = dev->driver;
   1198	int ret = 0;
   1199
   1200	if (!drv)
   1201		return 0;
   1202
   1203	if (drv->pm) {
   1204		if (drv->pm->poweroff)
   1205			ret = drv->pm->poweroff(dev);
   1206	} else {
   1207		ret = platform_legacy_suspend(dev, PMSG_HIBERNATE);
   1208	}
   1209
   1210	return ret;
   1211}
   1212
   1213int platform_pm_restore(struct device *dev)
   1214{
   1215	struct device_driver *drv = dev->driver;
   1216	int ret = 0;
   1217
   1218	if (!drv)
   1219		return 0;
   1220
   1221	if (drv->pm) {
   1222		if (drv->pm->restore)
   1223			ret = drv->pm->restore(dev);
   1224	} else {
   1225		ret = platform_legacy_resume(dev);
   1226	}
   1227
   1228	return ret;
   1229}
   1230
   1231#endif /* CONFIG_HIBERNATE_CALLBACKS */
   1232
   1233/* modalias support enables more hands-off userspace setup:
   1234 * (a) environment variable lets new-style hotplug events work once system is
   1235 *     fully running:  "modprobe $MODALIAS"
   1236 * (b) sysfs attribute lets new-style coldplug recover from hotplug events
   1237 *     mishandled before system is fully running:  "modprobe $(cat modalias)"
   1238 */
   1239static ssize_t modalias_show(struct device *dev,
   1240			     struct device_attribute *attr, char *buf)
   1241{
   1242	struct platform_device *pdev = to_platform_device(dev);
   1243	int len;
   1244
   1245	len = of_device_modalias(dev, buf, PAGE_SIZE);
   1246	if (len != -ENODEV)
   1247		return len;
   1248
   1249	len = acpi_device_modalias(dev, buf, PAGE_SIZE - 1);
   1250	if (len != -ENODEV)
   1251		return len;
   1252
   1253	return sysfs_emit(buf, "platform:%s\n", pdev->name);
   1254}
   1255static DEVICE_ATTR_RO(modalias);
   1256
   1257static ssize_t numa_node_show(struct device *dev,
   1258			      struct device_attribute *attr, char *buf)
   1259{
   1260	return sysfs_emit(buf, "%d\n", dev_to_node(dev));
   1261}
   1262static DEVICE_ATTR_RO(numa_node);
   1263
   1264static ssize_t driver_override_show(struct device *dev,
   1265				    struct device_attribute *attr, char *buf)
   1266{
   1267	struct platform_device *pdev = to_platform_device(dev);
   1268	ssize_t len;
   1269
   1270	device_lock(dev);
   1271	len = sysfs_emit(buf, "%s\n", pdev->driver_override);
   1272	device_unlock(dev);
   1273
   1274	return len;
   1275}
   1276
   1277static ssize_t driver_override_store(struct device *dev,
   1278				     struct device_attribute *attr,
   1279				     const char *buf, size_t count)
   1280{
   1281	struct platform_device *pdev = to_platform_device(dev);
   1282	int ret;
   1283
   1284	ret = driver_set_override(dev, &pdev->driver_override, buf, count);
   1285	if (ret)
   1286		return ret;
   1287
   1288	return count;
   1289}
   1290static DEVICE_ATTR_RW(driver_override);
   1291
   1292static struct attribute *platform_dev_attrs[] = {
   1293	&dev_attr_modalias.attr,
   1294	&dev_attr_numa_node.attr,
   1295	&dev_attr_driver_override.attr,
   1296	NULL,
   1297};
   1298
   1299static umode_t platform_dev_attrs_visible(struct kobject *kobj, struct attribute *a,
   1300		int n)
   1301{
   1302	struct device *dev = container_of(kobj, typeof(*dev), kobj);
   1303
   1304	if (a == &dev_attr_numa_node.attr &&
   1305			dev_to_node(dev) == NUMA_NO_NODE)
   1306		return 0;
   1307
   1308	return a->mode;
   1309}
   1310
   1311static const struct attribute_group platform_dev_group = {
   1312	.attrs = platform_dev_attrs,
   1313	.is_visible = platform_dev_attrs_visible,
   1314};
   1315__ATTRIBUTE_GROUPS(platform_dev);
   1316
   1317
   1318/**
   1319 * platform_match - bind platform device to platform driver.
   1320 * @dev: device.
   1321 * @drv: driver.
   1322 *
   1323 * Platform device IDs are assumed to be encoded like this:
   1324 * "<name><instance>", where <name> is a short description of the type of
   1325 * device, like "pci" or "floppy", and <instance> is the enumerated
   1326 * instance of the device, like '0' or '42'.  Driver IDs are simply
   1327 * "<name>".  So, extract the <name> from the platform_device structure,
   1328 * and compare it against the name of the driver. Return whether they match
   1329 * or not.
   1330 */
   1331static int platform_match(struct device *dev, struct device_driver *drv)
   1332{
   1333	struct platform_device *pdev = to_platform_device(dev);
   1334	struct platform_driver *pdrv = to_platform_driver(drv);
   1335
   1336	/* When driver_override is set, only bind to the matching driver */
   1337	if (pdev->driver_override)
   1338		return !strcmp(pdev->driver_override, drv->name);
   1339
   1340	/* Attempt an OF style match first */
   1341	if (of_driver_match_device(dev, drv))
   1342		return 1;
   1343
   1344	/* Then try ACPI style match */
   1345	if (acpi_driver_match_device(dev, drv))
   1346		return 1;
   1347
   1348	/* Then try to match against the id table */
   1349	if (pdrv->id_table)
   1350		return platform_match_id(pdrv->id_table, pdev) != NULL;
   1351
   1352	/* fall-back to driver name match */
   1353	return (strcmp(pdev->name, drv->name) == 0);
   1354}
   1355
   1356static int platform_uevent(struct device *dev, struct kobj_uevent_env *env)
   1357{
   1358	struct platform_device	*pdev = to_platform_device(dev);
   1359	int rc;
   1360
   1361	/* Some devices have extra OF data and an OF-style MODALIAS */
   1362	rc = of_device_uevent_modalias(dev, env);
   1363	if (rc != -ENODEV)
   1364		return rc;
   1365
   1366	rc = acpi_device_uevent_modalias(dev, env);
   1367	if (rc != -ENODEV)
   1368		return rc;
   1369
   1370	add_uevent_var(env, "MODALIAS=%s%s", PLATFORM_MODULE_PREFIX,
   1371			pdev->name);
   1372	return 0;
   1373}
   1374
   1375static int platform_probe(struct device *_dev)
   1376{
   1377	struct platform_driver *drv = to_platform_driver(_dev->driver);
   1378	struct platform_device *dev = to_platform_device(_dev);
   1379	int ret;
   1380
   1381	/*
   1382	 * A driver registered using platform_driver_probe() cannot be bound
   1383	 * again later because the probe function usually lives in __init code
   1384	 * and so is gone. For these drivers .probe is set to
   1385	 * platform_probe_fail in __platform_driver_probe(). Don't even prepare
   1386	 * clocks and PM domains for these to match the traditional behaviour.
   1387	 */
   1388	if (unlikely(drv->probe == platform_probe_fail))
   1389		return -ENXIO;
   1390
   1391	ret = of_clk_set_defaults(_dev->of_node, false);
   1392	if (ret < 0)
   1393		return ret;
   1394
   1395	ret = dev_pm_domain_attach(_dev, true);
   1396	if (ret)
   1397		goto out;
   1398
   1399	if (drv->probe) {
   1400		ret = drv->probe(dev);
   1401		if (ret)
   1402			dev_pm_domain_detach(_dev, true);
   1403	}
   1404
   1405out:
   1406	if (drv->prevent_deferred_probe && ret == -EPROBE_DEFER) {
   1407		dev_warn(_dev, "probe deferral not supported\n");
   1408		ret = -ENXIO;
   1409	}
   1410
   1411	return ret;
   1412}
   1413
   1414static void platform_remove(struct device *_dev)
   1415{
   1416	struct platform_driver *drv = to_platform_driver(_dev->driver);
   1417	struct platform_device *dev = to_platform_device(_dev);
   1418
   1419	if (drv->remove) {
   1420		int ret = drv->remove(dev);
   1421
   1422		if (ret)
   1423			dev_warn(_dev, "remove callback returned a non-zero value. This will be ignored.\n");
   1424	}
   1425	dev_pm_domain_detach(_dev, true);
   1426}
   1427
   1428static void platform_shutdown(struct device *_dev)
   1429{
   1430	struct platform_device *dev = to_platform_device(_dev);
   1431	struct platform_driver *drv;
   1432
   1433	if (!_dev->driver)
   1434		return;
   1435
   1436	drv = to_platform_driver(_dev->driver);
   1437	if (drv->shutdown)
   1438		drv->shutdown(dev);
   1439}
   1440
   1441static int platform_dma_configure(struct device *dev)
   1442{
   1443	struct platform_driver *drv = to_platform_driver(dev->driver);
   1444	enum dev_dma_attr attr;
   1445	int ret = 0;
   1446
   1447	if (dev->of_node) {
   1448		ret = of_dma_configure(dev, dev->of_node, true);
   1449	} else if (has_acpi_companion(dev)) {
   1450		attr = acpi_get_dma_attr(to_acpi_device_node(dev->fwnode));
   1451		ret = acpi_dma_configure(dev, attr);
   1452	}
   1453
   1454	if (!ret && !drv->driver_managed_dma) {
   1455		ret = iommu_device_use_default_domain(dev);
   1456		if (ret)
   1457			arch_teardown_dma_ops(dev);
   1458	}
   1459
   1460	return ret;
   1461}
   1462
   1463static void platform_dma_cleanup(struct device *dev)
   1464{
   1465	struct platform_driver *drv = to_platform_driver(dev->driver);
   1466
   1467	if (!drv->driver_managed_dma)
   1468		iommu_device_unuse_default_domain(dev);
   1469}
   1470
   1471static const struct dev_pm_ops platform_dev_pm_ops = {
   1472	SET_RUNTIME_PM_OPS(pm_generic_runtime_suspend, pm_generic_runtime_resume, NULL)
   1473	USE_PLATFORM_PM_SLEEP_OPS
   1474};
   1475
   1476struct bus_type platform_bus_type = {
   1477	.name		= "platform",
   1478	.dev_groups	= platform_dev_groups,
   1479	.match		= platform_match,
   1480	.uevent		= platform_uevent,
   1481	.probe		= platform_probe,
   1482	.remove		= platform_remove,
   1483	.shutdown	= platform_shutdown,
   1484	.dma_configure	= platform_dma_configure,
   1485	.dma_cleanup	= platform_dma_cleanup,
   1486	.pm		= &platform_dev_pm_ops,
   1487};
   1488EXPORT_SYMBOL_GPL(platform_bus_type);
   1489
   1490static inline int __platform_match(struct device *dev, const void *drv)
   1491{
   1492	return platform_match(dev, (struct device_driver *)drv);
   1493}
   1494
   1495/**
   1496 * platform_find_device_by_driver - Find a platform device with a given
   1497 * driver.
   1498 * @start: The device to start the search from.
   1499 * @drv: The device driver to look for.
   1500 */
   1501struct device *platform_find_device_by_driver(struct device *start,
   1502					      const struct device_driver *drv)
   1503{
   1504	return bus_find_device(&platform_bus_type, start, drv,
   1505			       __platform_match);
   1506}
   1507EXPORT_SYMBOL_GPL(platform_find_device_by_driver);
   1508
   1509void __weak __init early_platform_cleanup(void) { }
   1510
   1511int __init platform_bus_init(void)
   1512{
   1513	int error;
   1514
   1515	early_platform_cleanup();
   1516
   1517	error = device_register(&platform_bus);
   1518	if (error) {
   1519		put_device(&platform_bus);
   1520		return error;
   1521	}
   1522	error =  bus_register(&platform_bus_type);
   1523	if (error)
   1524		device_unregister(&platform_bus);
   1525	of_platform_register_reconfig_notifier();
   1526	return error;
   1527}