linux/drivers/base/platform.c
<<
>>
Prefs
   1/*
   2 * platform.c - platform 'pseudo' bus for legacy devices
   3 *
   4 * Copyright (c) 2002-3 Patrick Mochel
   5 * Copyright (c) 2002-3 Open Source Development Labs
   6 *
   7 * This file is released under the GPLv2
   8 *
   9 * Please see Documentation/driver-model/platform.txt for more
  10 * information.
  11 */
  12
  13#include <linux/string.h>
  14#include <linux/platform_device.h>
  15#include <linux/of_device.h>
  16#include <linux/module.h>
  17#include <linux/init.h>
  18#include <linux/dma-mapping.h>
  19#include <linux/bootmem.h>
  20#include <linux/err.h>
  21#include <linux/slab.h>
  22#include <linux/pm_runtime.h>
  23#include <linux/idr.h>
  24#include <linux/acpi.h>
  25
  26#include "base.h"
  27#include "power/power.h"
  28
  29/* For automatically allocated device IDs */
  30static DEFINE_IDA(platform_devid_ida);
  31
  32struct device platform_bus = {
  33        .init_name      = "platform",
  34};
  35EXPORT_SYMBOL_GPL(platform_bus);
  36
  37/**
  38 * arch_setup_pdev_archdata - Allow manipulation of archdata before its used
  39 * @pdev: platform device
  40 *
  41 * This is called before platform_device_add() such that any pdev_archdata may
  42 * be setup before the platform_notifier is called.  So if a user needs to
  43 * manipulate any relevant information in the pdev_archdata they can do:
  44 *
  45 *      platform_device_alloc()
  46 *      ... manipulate ...
  47 *      platform_device_add()
  48 *
  49 * And if they don't care they can just call platform_device_register() and
  50 * everything will just work out.
  51 */
  52void __weak arch_setup_pdev_archdata(struct platform_device *pdev)
  53{
  54}
  55
  56/**
  57 * platform_get_resource - get a resource for a device
  58 * @dev: platform device
  59 * @type: resource type
  60 * @num: resource index
  61 */
  62struct resource *platform_get_resource(struct platform_device *dev,
  63                                       unsigned int type, unsigned int num)
  64{
  65        int i;
  66
  67        for (i = 0; i < dev->num_resources; i++) {
  68                struct resource *r = &dev->resource[i];
  69
  70                if (type == resource_type(r) && num-- == 0)
  71                        return r;
  72        }
  73        return NULL;
  74}
  75EXPORT_SYMBOL_GPL(platform_get_resource);
  76
  77/**
  78 * platform_get_irq - get an IRQ for a device
  79 * @dev: platform device
  80 * @num: IRQ number index
  81 */
  82int platform_get_irq(struct platform_device *dev, unsigned int num)
  83{
  84#ifdef CONFIG_SPARC
  85        /* sparc does not have irqs represented as IORESOURCE_IRQ resources */
  86        if (!dev || num >= dev->archdata.num_irqs)
  87                return -ENXIO;
  88        return dev->archdata.irqs[num];
  89#else
  90        struct resource *r = platform_get_resource(dev, IORESOURCE_IRQ, num);
  91
  92        return r ? r->start : -ENXIO;
  93#endif
  94}
  95EXPORT_SYMBOL_GPL(platform_get_irq);
  96
  97/**
  98 * platform_get_resource_byname - get a resource for a device by name
  99 * @dev: platform device
 100 * @type: resource type
 101 * @name: resource name
 102 */
 103struct resource *platform_get_resource_byname(struct platform_device *dev,
 104                                              unsigned int type,
 105                                              const char *name)
 106{
 107        int i;
 108
 109        for (i = 0; i < dev->num_resources; i++) {
 110                struct resource *r = &dev->resource[i];
 111
 112                if (unlikely(!r->name))
 113                        continue;
 114
 115                if (type == resource_type(r) && !strcmp(r->name, name))
 116                        return r;
 117        }
 118        return NULL;
 119}
 120EXPORT_SYMBOL_GPL(platform_get_resource_byname);
 121
 122/**
 123 * platform_get_irq_byname - get an IRQ for a device by name
 124 * @dev: platform device
 125 * @name: IRQ name
 126 */
 127int platform_get_irq_byname(struct platform_device *dev, const char *name)
 128{
 129        struct resource *r = platform_get_resource_byname(dev, IORESOURCE_IRQ,
 130                                                          name);
 131
 132        return r ? r->start : -ENXIO;
 133}
 134EXPORT_SYMBOL_GPL(platform_get_irq_byname);
 135
 136/**
 137 * platform_add_devices - add a numbers of platform devices
 138 * @devs: array of platform devices to add
 139 * @num: number of platform devices in array
 140 */
 141int platform_add_devices(struct platform_device **devs, int num)
 142{
 143        int i, ret = 0;
 144
 145        for (i = 0; i < num; i++) {
 146                ret = platform_device_register(devs[i]);
 147                if (ret) {
 148                        while (--i >= 0)
 149                                platform_device_unregister(devs[i]);
 150                        break;
 151                }
 152        }
 153
 154        return ret;
 155}
 156EXPORT_SYMBOL_GPL(platform_add_devices);
 157
 158struct platform_object {
 159        struct platform_device pdev;
 160        char name[1];
 161};
 162
 163/**
 164 * platform_device_put - destroy a platform device
 165 * @pdev: platform device to free
 166 *
 167 * Free all memory associated with a platform device.  This function must
 168 * _only_ be externally called in error cases.  All other usage is a bug.
 169 */
 170void platform_device_put(struct platform_device *pdev)
 171{
 172        if (pdev)
 173                put_device(&pdev->dev);
 174}
 175EXPORT_SYMBOL_GPL(platform_device_put);
 176
 177static void platform_device_release(struct device *dev)
 178{
 179        struct platform_object *pa = container_of(dev, struct platform_object,
 180                                                  pdev.dev);
 181
 182        of_device_node_put(&pa->pdev.dev);
 183        kfree(pa->pdev.dev.platform_data);
 184        kfree(pa->pdev.mfd_cell);
 185        kfree(pa->pdev.resource);
 186        kfree(pa);
 187}
 188
 189/**
 190 * platform_device_alloc - create a platform device
 191 * @name: base name of the device we're adding
 192 * @id: instance id
 193 *
 194 * Create a platform device object which can have other objects attached
 195 * to it, and which will have attached objects freed when it is released.
 196 */
 197struct platform_device *platform_device_alloc(const char *name, int id)
 198{
 199        struct platform_object *pa;
 200
 201        pa = kzalloc(sizeof(struct platform_object) + strlen(name), GFP_KERNEL);
 202        if (pa) {
 203                strcpy(pa->name, name);
 204                pa->pdev.name = pa->name;
 205                pa->pdev.id = id;
 206                device_initialize(&pa->pdev.dev);
 207                pa->pdev.dev.release = platform_device_release;
 208                arch_setup_pdev_archdata(&pa->pdev);
 209        }
 210
 211        return pa ? &pa->pdev : NULL;
 212}
 213EXPORT_SYMBOL_GPL(platform_device_alloc);
 214
 215/**
 216 * platform_device_add_resources - add resources to a platform device
 217 * @pdev: platform device allocated by platform_device_alloc to add resources to
 218 * @res: set of resources that needs to be allocated for the device
 219 * @num: number of resources
 220 *
 221 * Add a copy of the resources to the platform device.  The memory
 222 * associated with the resources will be freed when the platform device is
 223 * released.
 224 */
 225int platform_device_add_resources(struct platform_device *pdev,
 226                                  const struct resource *res, unsigned int num)
 227{
 228        struct resource *r = NULL;
 229
 230        if (res) {
 231                r = kmemdup(res, sizeof(struct resource) * num, GFP_KERNEL);
 232                if (!r)
 233                        return -ENOMEM;
 234        }
 235
 236        kfree(pdev->resource);
 237        pdev->resource = r;
 238        pdev->num_resources = num;
 239        return 0;
 240}
 241EXPORT_SYMBOL_GPL(platform_device_add_resources);
 242
 243/**
 244 * platform_device_add_data - add platform-specific data to a platform device
 245 * @pdev: platform device allocated by platform_device_alloc to add resources to
 246 * @data: platform specific data for this platform device
 247 * @size: size of platform specific data
 248 *
 249 * Add a copy of platform specific data to the platform device's
 250 * platform_data pointer.  The memory associated with the platform data
 251 * will be freed when the platform device is released.
 252 */
 253int platform_device_add_data(struct platform_device *pdev, const void *data,
 254                             size_t size)
 255{
 256        void *d = NULL;
 257
 258        if (data) {
 259                d = kmemdup(data, size, GFP_KERNEL);
 260                if (!d)
 261                        return -ENOMEM;
 262        }
 263
 264        kfree(pdev->dev.platform_data);
 265        pdev->dev.platform_data = d;
 266        return 0;
 267}
 268EXPORT_SYMBOL_GPL(platform_device_add_data);
 269
 270/**
 271 * platform_device_add - add a platform device to device hierarchy
 272 * @pdev: platform device we're adding
 273 *
 274 * This is part 2 of platform_device_register(), though may be called
 275 * separately _iff_ pdev was allocated by platform_device_alloc().
 276 */
 277int platform_device_add(struct platform_device *pdev)
 278{
 279        int i, ret;
 280
 281        if (!pdev)
 282                return -EINVAL;
 283
 284        if (!pdev->dev.parent)
 285                pdev->dev.parent = &platform_bus;
 286
 287        pdev->dev.bus = &platform_bus_type;
 288
 289        switch (pdev->id) {
 290        default:
 291                dev_set_name(&pdev->dev, "%s.%d", pdev->name,  pdev->id);
 292                break;
 293        case PLATFORM_DEVID_NONE:
 294                dev_set_name(&pdev->dev, "%s", pdev->name);
 295                break;
 296        case PLATFORM_DEVID_AUTO:
 297                /*
 298                 * Automatically allocated device ID. We mark it as such so
 299                 * that we remember it must be freed, and we append a suffix
 300                 * to avoid namespace collision with explicit IDs.
 301                 */
 302                ret = ida_simple_get(&platform_devid_ida, 0, 0, GFP_KERNEL);
 303                if (ret < 0)
 304                        goto err_out;
 305                pdev->id = ret;
 306                pdev->id_auto = true;
 307                dev_set_name(&pdev->dev, "%s.%d.auto", pdev->name, pdev->id);
 308                break;
 309        }
 310
 311        for (i = 0; i < pdev->num_resources; i++) {
 312                struct resource *p, *r = &pdev->resource[i];
 313
 314                if (r->name == NULL)
 315                        r->name = dev_name(&pdev->dev);
 316
 317                p = r->parent;
 318                if (!p) {
 319                        if (resource_type(r) == IORESOURCE_MEM)
 320                                p = &iomem_resource;
 321                        else if (resource_type(r) == IORESOURCE_IO)
 322                                p = &ioport_resource;
 323                }
 324
 325                if (p && insert_resource(p, r)) {
 326                        dev_err(&pdev->dev, "failed to claim resource %d\n", i);
 327                        ret = -EBUSY;
 328                        goto failed;
 329                }
 330        }
 331
 332        pr_debug("Registering platform device '%s'. Parent at %s\n",
 333                 dev_name(&pdev->dev), dev_name(pdev->dev.parent));
 334
 335        ret = device_add(&pdev->dev);
 336        if (ret == 0)
 337                return ret;
 338
 339 failed:
 340        if (pdev->id_auto) {
 341                ida_simple_remove(&platform_devid_ida, pdev->id);
 342                pdev->id = PLATFORM_DEVID_AUTO;
 343        }
 344
 345        while (--i >= 0) {
 346                struct resource *r = &pdev->resource[i];
 347                unsigned long type = resource_type(r);
 348
 349                if (type == IORESOURCE_MEM || type == IORESOURCE_IO)
 350                        release_resource(r);
 351        }
 352
 353 err_out:
 354        return ret;
 355}
 356EXPORT_SYMBOL_GPL(platform_device_add);
 357
 358/**
 359 * platform_device_del - remove a platform-level device
 360 * @pdev: platform device we're removing
 361 *
 362 * Note that this function will also release all memory- and port-based
 363 * resources owned by the device (@dev->resource).  This function must
 364 * _only_ be externally called in error cases.  All other usage is a bug.
 365 */
 366void platform_device_del(struct platform_device *pdev)
 367{
 368        int i;
 369
 370        if (pdev) {
 371                device_del(&pdev->dev);
 372
 373                if (pdev->id_auto) {
 374                        ida_simple_remove(&platform_devid_ida, pdev->id);
 375                        pdev->id = PLATFORM_DEVID_AUTO;
 376                }
 377
 378                for (i = 0; i < pdev->num_resources; i++) {
 379                        struct resource *r = &pdev->resource[i];
 380                        unsigned long type = resource_type(r);
 381
 382                        if (type == IORESOURCE_MEM || type == IORESOURCE_IO)
 383                                release_resource(r);
 384                }
 385        }
 386}
 387EXPORT_SYMBOL_GPL(platform_device_del);
 388
 389/**
 390 * platform_device_register - add a platform-level device
 391 * @pdev: platform device we're adding
 392 */
 393int platform_device_register(struct platform_device *pdev)
 394{
 395        device_initialize(&pdev->dev);
 396        arch_setup_pdev_archdata(pdev);
 397        return platform_device_add(pdev);
 398}
 399EXPORT_SYMBOL_GPL(platform_device_register);
 400
 401/**
 402 * platform_device_unregister - unregister a platform-level device
 403 * @pdev: platform device we're unregistering
 404 *
 405 * Unregistration is done in 2 steps. First we release all resources
 406 * and remove it from the subsystem, then we drop reference count by
 407 * calling platform_device_put().
 408 */
 409void platform_device_unregister(struct platform_device *pdev)
 410{
 411        platform_device_del(pdev);
 412        platform_device_put(pdev);
 413}
 414EXPORT_SYMBOL_GPL(platform_device_unregister);
 415
 416/**
 417 * platform_device_register_full - add a platform-level device with
 418 * resources and platform-specific data
 419 *
 420 * @pdevinfo: data used to create device
 421 *
 422 * Returns &struct platform_device pointer on success, or ERR_PTR() on error.
 423 */
 424struct platform_device *platform_device_register_full(
 425                const struct platform_device_info *pdevinfo)
 426{
 427        int ret = -ENOMEM;
 428        struct platform_device *pdev;
 429
 430        pdev = platform_device_alloc(pdevinfo->name, pdevinfo->id);
 431        if (!pdev)
 432                goto err_alloc;
 433
 434        pdev->dev.parent = pdevinfo->parent;
 435        ACPI_HANDLE_SET(&pdev->dev, pdevinfo->acpi_node.handle);
 436
 437        if (pdevinfo->dma_mask) {
 438                /*
 439                 * This memory isn't freed when the device is put,
 440                 * I don't have a nice idea for that though.  Conceptually
 441                 * dma_mask in struct device should not be a pointer.
 442                 * See http://thread.gmane.org/gmane.linux.kernel.pci/9081
 443                 */
 444                pdev->dev.dma_mask =
 445                        kmalloc(sizeof(*pdev->dev.dma_mask), GFP_KERNEL);
 446                if (!pdev->dev.dma_mask)
 447                        goto err;
 448
 449                *pdev->dev.dma_mask = pdevinfo->dma_mask;
 450                pdev->dev.coherent_dma_mask = pdevinfo->dma_mask;
 451        }
 452
 453        ret = platform_device_add_resources(pdev,
 454                        pdevinfo->res, pdevinfo->num_res);
 455        if (ret)
 456                goto err;
 457
 458        ret = platform_device_add_data(pdev,
 459                        pdevinfo->data, pdevinfo->size_data);
 460        if (ret)
 461                goto err;
 462
 463        ret = platform_device_add(pdev);
 464        if (ret) {
 465err:
 466                ACPI_HANDLE_SET(&pdev->dev, NULL);
 467                kfree(pdev->dev.dma_mask);
 468
 469err_alloc:
 470                platform_device_put(pdev);
 471                return ERR_PTR(ret);
 472        }
 473
 474        return pdev;
 475}
 476EXPORT_SYMBOL_GPL(platform_device_register_full);
 477
 478static int platform_drv_probe(struct device *_dev)
 479{
 480        struct platform_driver *drv = to_platform_driver(_dev->driver);
 481        struct platform_device *dev = to_platform_device(_dev);
 482        int ret;
 483
 484        if (ACPI_HANDLE(_dev))
 485                acpi_dev_pm_attach(_dev, true);
 486
 487        ret = drv->probe(dev);
 488        if (ret && ACPI_HANDLE(_dev))
 489                acpi_dev_pm_detach(_dev, true);
 490
 491        return ret;
 492}
 493
 494static int platform_drv_probe_fail(struct device *_dev)
 495{
 496        return -ENXIO;
 497}
 498
 499static int platform_drv_remove(struct device *_dev)
 500{
 501        struct platform_driver *drv = to_platform_driver(_dev->driver);
 502        struct platform_device *dev = to_platform_device(_dev);
 503        int ret;
 504
 505        ret = drv->remove(dev);
 506        if (ACPI_HANDLE(_dev))
 507                acpi_dev_pm_detach(_dev, true);
 508
 509        return ret;
 510}
 511
 512static void platform_drv_shutdown(struct device *_dev)
 513{
 514        struct platform_driver *drv = to_platform_driver(_dev->driver);
 515        struct platform_device *dev = to_platform_device(_dev);
 516
 517        drv->shutdown(dev);
 518        if (ACPI_HANDLE(_dev))
 519                acpi_dev_pm_detach(_dev, true);
 520}
 521
 522/**
 523 * __platform_driver_register - register a driver for platform-level devices
 524 * @drv: platform driver structure
 525 * @owner: owning module/driver
 526 */
 527int __platform_driver_register(struct platform_driver *drv,
 528                                struct module *owner)
 529{
 530        drv->driver.owner = owner;
 531        drv->driver.bus = &platform_bus_type;
 532        if (drv->probe)
 533                drv->driver.probe = platform_drv_probe;
 534        if (drv->remove)
 535                drv->driver.remove = platform_drv_remove;
 536        if (drv->shutdown)
 537                drv->driver.shutdown = platform_drv_shutdown;
 538
 539        return driver_register(&drv->driver);
 540}
 541EXPORT_SYMBOL_GPL(__platform_driver_register);
 542
 543/**
 544 * platform_driver_unregister - unregister a driver for platform-level devices
 545 * @drv: platform driver structure
 546 */
 547void platform_driver_unregister(struct platform_driver *drv)
 548{
 549        driver_unregister(&drv->driver);
 550}
 551EXPORT_SYMBOL_GPL(platform_driver_unregister);
 552
 553/**
 554 * platform_driver_probe - register driver for non-hotpluggable device
 555 * @drv: platform driver structure
 556 * @probe: the driver probe routine, probably from an __init section,
 557 *         must not return -EPROBE_DEFER.
 558 *
 559 * Use this instead of platform_driver_register() when you know the device
 560 * is not hotpluggable and has already been registered, and you want to
 561 * remove its run-once probe() infrastructure from memory after the driver
 562 * has bound to the device.
 563 *
 564 * One typical use for this would be with drivers for controllers integrated
 565 * into system-on-chip processors, where the controller devices have been
 566 * configured as part of board setup.
 567 *
 568 * This is incompatible with deferred probing so probe() must not
 569 * return -EPROBE_DEFER.
 570 *
 571 * Returns zero if the driver registered and bound to a device, else returns
 572 * a negative error code and with the driver not registered.
 573 */
 574int __init_or_module platform_driver_probe(struct platform_driver *drv,
 575                int (*probe)(struct platform_device *))
 576{
 577        int retval, code;
 578
 579        /* make sure driver won't have bind/unbind attributes */
 580        drv->driver.suppress_bind_attrs = true;
 581
 582        /* temporary section violation during probe() */
 583        drv->probe = probe;
 584        retval = code = platform_driver_register(drv);
 585
 586        /*
 587         * Fixup that section violation, being paranoid about code scanning
 588         * the list of drivers in order to probe new devices.  Check to see
 589         * if the probe was successful, and make sure any forced probes of
 590         * new devices fail.
 591         */
 592        spin_lock(&drv->driver.bus->p->klist_drivers.k_lock);
 593        drv->probe = NULL;
 594        if (code == 0 && list_empty(&drv->driver.p->klist_devices.k_list))
 595                retval = -ENODEV;
 596        drv->driver.probe = platform_drv_probe_fail;
 597        spin_unlock(&drv->driver.bus->p->klist_drivers.k_lock);
 598
 599        if (code != retval)
 600                platform_driver_unregister(drv);
 601        return retval;
 602}
 603EXPORT_SYMBOL_GPL(platform_driver_probe);
 604
 605/**
 606 * platform_create_bundle - register driver and create corresponding device
 607 * @driver: platform driver structure
 608 * @probe: the driver probe routine, probably from an __init section
 609 * @res: set of resources that needs to be allocated for the device
 610 * @n_res: number of resources
 611 * @data: platform specific data for this platform device
 612 * @size: size of platform specific data
 613 *
 614 * Use this in legacy-style modules that probe hardware directly and
 615 * register a single platform device and corresponding platform driver.
 616 *
 617 * Returns &struct platform_device pointer on success, or ERR_PTR() on error.
 618 */
 619struct platform_device * __init_or_module platform_create_bundle(
 620                        struct platform_driver *driver,
 621                        int (*probe)(struct platform_device *),
 622                        struct resource *res, unsigned int n_res,
 623                        const void *data, size_t size)
 624{
 625        struct platform_device *pdev;
 626        int error;
 627
 628        pdev = platform_device_alloc(driver->driver.name, -1);
 629        if (!pdev) {
 630                error = -ENOMEM;
 631                goto err_out;
 632        }
 633
 634        error = platform_device_add_resources(pdev, res, n_res);
 635        if (error)
 636                goto err_pdev_put;
 637
 638        error = platform_device_add_data(pdev, data, size);
 639        if (error)
 640                goto err_pdev_put;
 641
 642        error = platform_device_add(pdev);
 643        if (error)
 644                goto err_pdev_put;
 645
 646        error = platform_driver_probe(driver, probe);
 647        if (error)
 648                goto err_pdev_del;
 649
 650        return pdev;
 651
 652err_pdev_del:
 653        platform_device_del(pdev);
 654err_pdev_put:
 655        platform_device_put(pdev);
 656err_out:
 657        return ERR_PTR(error);
 658}
 659EXPORT_SYMBOL_GPL(platform_create_bundle);
 660
 661/* modalias support enables more hands-off userspace setup:
 662 * (a) environment variable lets new-style hotplug events work once system is
 663 *     fully running:  "modprobe $MODALIAS"
 664 * (b) sysfs attribute lets new-style coldplug recover from hotplug events
 665 *     mishandled before system is fully running:  "modprobe $(cat modalias)"
 666 */
 667static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
 668                             char *buf)
 669{
 670        struct platform_device  *pdev = to_platform_device(dev);
 671        int len = snprintf(buf, PAGE_SIZE, "platform:%s\n", pdev->name);
 672
 673        return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len;
 674}
 675
 676static struct device_attribute platform_dev_attrs[] = {
 677        __ATTR_RO(modalias),
 678        __ATTR_NULL,
 679};
 680
 681static int platform_uevent(struct device *dev, struct kobj_uevent_env *env)
 682{
 683        struct platform_device  *pdev = to_platform_device(dev);
 684        int rc;
 685
 686        /* Some devices have extra OF data and an OF-style MODALIAS */
 687        rc = of_device_uevent_modalias(dev, env);
 688        if (rc != -ENODEV)
 689                return rc;
 690
 691        add_uevent_var(env, "MODALIAS=%s%s", PLATFORM_MODULE_PREFIX,
 692                        pdev->name);
 693        return 0;
 694}
 695
 696static const struct platform_device_id *platform_match_id(
 697                        const struct platform_device_id *id,
 698                        struct platform_device *pdev)
 699{
 700        while (id->name[0]) {
 701                if (strcmp(pdev->name, id->name) == 0) {
 702                        pdev->id_entry = id;
 703                        return id;
 704                }
 705                id++;
 706        }
 707        return NULL;
 708}
 709
 710/**
 711 * platform_match - bind platform device to platform driver.
 712 * @dev: device.
 713 * @drv: driver.
 714 *
 715 * Platform device IDs are assumed to be encoded like this:
 716 * "<name><instance>", where <name> is a short description of the type of
 717 * device, like "pci" or "floppy", and <instance> is the enumerated
 718 * instance of the device, like '0' or '42'.  Driver IDs are simply
 719 * "<name>".  So, extract the <name> from the platform_device structure,
 720 * and compare it against the name of the driver. Return whether they match
 721 * or not.
 722 */
 723static int platform_match(struct device *dev, struct device_driver *drv)
 724{
 725        struct platform_device *pdev = to_platform_device(dev);
 726        struct platform_driver *pdrv = to_platform_driver(drv);
 727
 728        /* Attempt an OF style match first */
 729        if (of_driver_match_device(dev, drv))
 730                return 1;
 731
 732        /* Then try ACPI style match */
 733        if (acpi_driver_match_device(dev, drv))
 734                return 1;
 735
 736        /* Then try to match against the id table */
 737        if (pdrv->id_table)
 738                return platform_match_id(pdrv->id_table, pdev) != NULL;
 739
 740        /* fall-back to driver name match */
 741        return (strcmp(pdev->name, drv->name) == 0);
 742}
 743
 744#ifdef CONFIG_PM_SLEEP
 745
 746static int platform_legacy_suspend(struct device *dev, pm_message_t mesg)
 747{
 748        struct platform_driver *pdrv = to_platform_driver(dev->driver);
 749        struct platform_device *pdev = to_platform_device(dev);
 750        int ret = 0;
 751
 752        if (dev->driver && pdrv->suspend)
 753                ret = pdrv->suspend(pdev, mesg);
 754
 755        return ret;
 756}
 757
 758static int platform_legacy_resume(struct device *dev)
 759{
 760        struct platform_driver *pdrv = to_platform_driver(dev->driver);
 761        struct platform_device *pdev = to_platform_device(dev);
 762        int ret = 0;
 763
 764        if (dev->driver && pdrv->resume)
 765                ret = pdrv->resume(pdev);
 766
 767        return ret;
 768}
 769
 770#endif /* CONFIG_PM_SLEEP */
 771
 772#ifdef CONFIG_SUSPEND
 773
 774int platform_pm_suspend(struct device *dev)
 775{
 776        struct device_driver *drv = dev->driver;
 777        int ret = 0;
 778
 779        if (!drv)
 780                return 0;
 781
 782        if (drv->pm) {
 783                if (drv->pm->suspend)
 784                        ret = drv->pm->suspend(dev);
 785        } else {
 786                ret = platform_legacy_suspend(dev, PMSG_SUSPEND);
 787        }
 788
 789        return ret;
 790}
 791
 792int platform_pm_resume(struct device *dev)
 793{
 794        struct device_driver *drv = dev->driver;
 795        int ret = 0;
 796
 797        if (!drv)
 798                return 0;
 799
 800        if (drv->pm) {
 801                if (drv->pm->resume)
 802                        ret = drv->pm->resume(dev);
 803        } else {
 804                ret = platform_legacy_resume(dev);
 805        }
 806
 807        return ret;
 808}
 809
 810#endif /* CONFIG_SUSPEND */
 811
 812#ifdef CONFIG_HIBERNATE_CALLBACKS
 813
 814int platform_pm_freeze(struct device *dev)
 815{
 816        struct device_driver *drv = dev->driver;
 817        int ret = 0;
 818
 819        if (!drv)
 820                return 0;
 821
 822        if (drv->pm) {
 823                if (drv->pm->freeze)
 824                        ret = drv->pm->freeze(dev);
 825        } else {
 826                ret = platform_legacy_suspend(dev, PMSG_FREEZE);
 827        }
 828
 829        return ret;
 830}
 831
 832int platform_pm_thaw(struct device *dev)
 833{
 834        struct device_driver *drv = dev->driver;
 835        int ret = 0;
 836
 837        if (!drv)
 838                return 0;
 839
 840        if (drv->pm) {
 841                if (drv->pm->thaw)
 842                        ret = drv->pm->thaw(dev);
 843        } else {
 844                ret = platform_legacy_resume(dev);
 845        }
 846
 847        return ret;
 848}
 849
 850int platform_pm_poweroff(struct device *dev)
 851{
 852        struct device_driver *drv = dev->driver;
 853        int ret = 0;
 854
 855        if (!drv)
 856                return 0;
 857
 858        if (drv->pm) {
 859                if (drv->pm->poweroff)
 860                        ret = drv->pm->poweroff(dev);
 861        } else {
 862                ret = platform_legacy_suspend(dev, PMSG_HIBERNATE);
 863        }
 864
 865        return ret;
 866}
 867
 868int platform_pm_restore(struct device *dev)
 869{
 870        struct device_driver *drv = dev->driver;
 871        int ret = 0;
 872
 873        if (!drv)
 874                return 0;
 875
 876        if (drv->pm) {
 877                if (drv->pm->restore)
 878                        ret = drv->pm->restore(dev);
 879        } else {
 880                ret = platform_legacy_resume(dev);
 881        }
 882
 883        return ret;
 884}
 885
 886#endif /* CONFIG_HIBERNATE_CALLBACKS */
 887
 888static const struct dev_pm_ops platform_dev_pm_ops = {
 889        .runtime_suspend = pm_generic_runtime_suspend,
 890        .runtime_resume = pm_generic_runtime_resume,
 891        USE_PLATFORM_PM_SLEEP_OPS
 892};
 893
 894struct bus_type platform_bus_type = {
 895        .name           = "platform",
 896        .dev_attrs      = platform_dev_attrs,
 897        .match          = platform_match,
 898        .uevent         = platform_uevent,
 899        .pm             = &platform_dev_pm_ops,
 900};
 901EXPORT_SYMBOL_GPL(platform_bus_type);
 902
 903int __init platform_bus_init(void)
 904{
 905        int error;
 906
 907        early_platform_cleanup();
 908
 909        error = device_register(&platform_bus);
 910        if (error)
 911                return error;
 912        error =  bus_register(&platform_bus_type);
 913        if (error)
 914                device_unregister(&platform_bus);
 915        return error;
 916}
 917
 918#ifndef ARCH_HAS_DMA_GET_REQUIRED_MASK
 919u64 dma_get_required_mask(struct device *dev)
 920{
 921        u32 low_totalram = ((max_pfn - 1) << PAGE_SHIFT);
 922        u32 high_totalram = ((max_pfn - 1) >> (32 - PAGE_SHIFT));
 923        u64 mask;
 924
 925        if (!high_totalram) {
 926                /* convert to mask just covering totalram */
 927                low_totalram = (1 << (fls(low_totalram) - 1));
 928                low_totalram += low_totalram - 1;
 929                mask = low_totalram;
 930        } else {
 931                high_totalram = (1 << (fls(high_totalram) - 1));
 932                high_totalram += high_totalram - 1;
 933                mask = (((u64)high_totalram) << 32) + 0xffffffff;
 934        }
 935        return mask;
 936}
 937EXPORT_SYMBOL_GPL(dma_get_required_mask);
 938#endif
 939
 940static __initdata LIST_HEAD(early_platform_driver_list);
 941static __initdata LIST_HEAD(early_platform_device_list);
 942
 943/**
 944 * early_platform_driver_register - register early platform driver
 945 * @epdrv: early_platform driver structure
 946 * @buf: string passed from early_param()
 947 *
 948 * Helper function for early_platform_init() / early_platform_init_buffer()
 949 */
 950int __init early_platform_driver_register(struct early_platform_driver *epdrv,
 951                                          char *buf)
 952{
 953        char *tmp;
 954        int n;
 955
 956        /* Simply add the driver to the end of the global list.
 957         * Drivers will by default be put on the list in compiled-in order.
 958         */
 959        if (!epdrv->list.next) {
 960                INIT_LIST_HEAD(&epdrv->list);
 961                list_add_tail(&epdrv->list, &early_platform_driver_list);
 962        }
 963
 964        /* If the user has specified device then make sure the driver
 965         * gets prioritized. The driver of the last device specified on
 966         * command line will be put first on the list.
 967         */
 968        n = strlen(epdrv->pdrv->driver.name);
 969        if (buf && !strncmp(buf, epdrv->pdrv->driver.name, n)) {
 970                list_move(&epdrv->list, &early_platform_driver_list);
 971
 972                /* Allow passing parameters after device name */
 973                if (buf[n] == '\0' || buf[n] == ',')
 974                        epdrv->requested_id = -1;
 975                else {
 976                        epdrv->requested_id = simple_strtoul(&buf[n + 1],
 977                                                             &tmp, 10);
 978
 979                        if (buf[n] != '.' || (tmp == &buf[n + 1])) {
 980                                epdrv->requested_id = EARLY_PLATFORM_ID_ERROR;
 981                                n = 0;
 982                        } else
 983                                n += strcspn(&buf[n + 1], ",") + 1;
 984                }
 985
 986                if (buf[n] == ',')
 987                        n++;
 988
 989                if (epdrv->bufsize) {
 990                        memcpy(epdrv->buffer, &buf[n],
 991                               min_t(int, epdrv->bufsize, strlen(&buf[n]) + 1));
 992                        epdrv->buffer[epdrv->bufsize - 1] = '\0';
 993                }
 994        }
 995
 996        return 0;
 997}
 998
 999/**
1000 * early_platform_add_devices - adds a number of early platform devices
1001 * @devs: array of early platform devices to add
1002 * @num: number of early platform devices in array
1003 *
1004 * Used by early architecture code to register early platform devices and
1005 * their platform data.
1006 */
1007void __init early_platform_add_devices(struct platform_device **devs, int num)
1008{
1009        struct device *dev;
1010        int i;
1011
1012        /* simply add the devices to list */
1013        for (i = 0; i < num; i++) {
1014                dev = &devs[i]->dev;
1015
1016                if (!dev->devres_head.next) {
1017                        pm_runtime_early_init(dev);
1018                        INIT_LIST_HEAD(&dev->devres_head);
1019                        list_add_tail(&dev->devres_head,
1020                                      &early_platform_device_list);
1021                }
1022        }
1023}
1024
1025/**
1026 * early_platform_driver_register_all - register early platform drivers
1027 * @class_str: string to identify early platform driver class
1028 *
1029 * Used by architecture code to register all early platform drivers
1030 * for a certain class. If omitted then only early platform drivers
1031 * with matching kernel command line class parameters will be registered.
1032 */
1033void __init early_platform_driver_register_all(char *class_str)
1034{
1035        /* The "class_str" parameter may or may not be present on the kernel
1036         * command line. If it is present then there may be more than one
1037         * matching parameter.
1038         *
1039         * Since we register our early platform drivers using early_param()
1040         * we need to make sure that they also get registered in the case
1041         * when the parameter is missing from the kernel command line.
1042         *
1043         * We use parse_early_options() to make sure the early_param() gets
1044         * called at least once. The early_param() may be called more than
1045         * once since the name of the preferred device may be specified on
1046         * the kernel command line. early_platform_driver_register() handles
1047         * this case for us.
1048         */
1049        parse_early_options(class_str);
1050}
1051
1052/**
1053 * early_platform_match - find early platform device matching driver
1054 * @epdrv: early platform driver structure
1055 * @id: id to match against
1056 */
1057static  __init struct platform_device *
1058early_platform_match(struct early_platform_driver *epdrv, int id)
1059{
1060        struct platform_device *pd;
1061
1062        list_for_each_entry(pd, &early_platform_device_list, dev.devres_head)
1063                if (platform_match(&pd->dev, &epdrv->pdrv->driver))
1064                        if (pd->id == id)
1065                                return pd;
1066
1067        return NULL;
1068}
1069
1070/**
1071 * early_platform_left - check if early platform driver has matching devices
1072 * @epdrv: early platform driver structure
1073 * @id: return true if id or above exists
1074 */
1075static  __init int early_platform_left(struct early_platform_driver *epdrv,
1076                                       int id)
1077{
1078        struct platform_device *pd;
1079
1080        list_for_each_entry(pd, &early_platform_device_list, dev.devres_head)
1081                if (platform_match(&pd->dev, &epdrv->pdrv->driver))
1082                        if (pd->id >= id)
1083                                return 1;
1084
1085        return 0;
1086}
1087
1088/**
1089 * early_platform_driver_probe_id - probe drivers matching class_str and id
1090 * @class_str: string to identify early platform driver class
1091 * @id: id to match against
1092 * @nr_probe: number of platform devices to successfully probe before exiting
1093 */
1094static int __init early_platform_driver_probe_id(char *class_str,
1095                                                 int id,
1096                                                 int nr_probe)
1097{
1098        struct early_platform_driver *epdrv;
1099        struct platform_device *match;
1100        int match_id;
1101        int n = 0;
1102        int left = 0;
1103
1104        list_for_each_entry(epdrv, &early_platform_driver_list, list) {
1105                /* only use drivers matching our class_str */
1106                if (strcmp(class_str, epdrv->class_str))
1107                        continue;
1108
1109                if (id == -2) {
1110                        match_id = epdrv->requested_id;
1111                        left = 1;
1112
1113                } else {
1114                        match_id = id;
1115                        left += early_platform_left(epdrv, id);
1116
1117                        /* skip requested id */
1118                        switch (epdrv->requested_id) {
1119                        case EARLY_PLATFORM_ID_ERROR:
1120                        case EARLY_PLATFORM_ID_UNSET:
1121                                break;
1122                        default:
1123                                if (epdrv->requested_id == id)
1124                                        match_id = EARLY_PLATFORM_ID_UNSET;
1125                        }
1126                }
1127
1128                switch (match_id) {
1129                case EARLY_PLATFORM_ID_ERROR:
1130                        pr_warn("%s: unable to parse %s parameter\n",
1131                                class_str, epdrv->pdrv->driver.name);
1132                        /* fall-through */
1133                case EARLY_PLATFORM_ID_UNSET:
1134                        match = NULL;
1135                        break;
1136                default:
1137                        match = early_platform_match(epdrv, match_id);
1138                }
1139
1140                if (match) {
1141                        /*
1142                         * Set up a sensible init_name to enable
1143                         * dev_name() and others to be used before the
1144                         * rest of the driver core is initialized.
1145                         */
1146                        if (!match->dev.init_name && slab_is_available()) {
1147                                if (match->id != -1)
1148                                        match->dev.init_name =
1149                                                kasprintf(GFP_KERNEL, "%s.%d",
1150                                                          match->name,
1151                                                          match->id);
1152                                else
1153                                        match->dev.init_name =
1154                                                kasprintf(GFP_KERNEL, "%s",
1155                                                          match->name);
1156
1157                                if (!match->dev.init_name)
1158                                        return -ENOMEM;
1159                        }
1160
1161                        if (epdrv->pdrv->probe(match))
1162                                pr_warn("%s: unable to probe %s early.\n",
1163                                        class_str, match->name);
1164                        else
1165                                n++;
1166                }
1167
1168                if (n >= nr_probe)
1169                        break;
1170        }
1171
1172        if (left)
1173                return n;
1174        else
1175                return -ENODEV;
1176}
1177
1178/**
1179 * early_platform_driver_probe - probe a class of registered drivers
1180 * @class_str: string to identify early platform driver class
1181 * @nr_probe: number of platform devices to successfully probe before exiting
1182 * @user_only: only probe user specified early platform devices
1183 *
1184 * Used by architecture code to probe registered early platform drivers
1185 * within a certain class. For probe to happen a registered early platform
1186 * device matching a registered early platform driver is needed.
1187 */
1188int __init early_platform_driver_probe(char *class_str,
1189                                       int nr_probe,
1190                                       int user_only)
1191{
1192        int k, n, i;
1193
1194        n = 0;
1195        for (i = -2; n < nr_probe; i++) {
1196                k = early_platform_driver_probe_id(class_str, i, nr_probe - n);
1197
1198                if (k < 0)
1199                        break;
1200
1201                n += k;
1202
1203                if (user_only)
1204                        break;
1205        }
1206
1207        return n;
1208}
1209
1210/**
1211 * early_platform_cleanup - clean up early platform code
1212 */
1213void __init early_platform_cleanup(void)
1214{
1215        struct platform_device *pd, *pd2;
1216
1217        /* clean up the devres list used to chain devices */
1218        list_for_each_entry_safe(pd, pd2, &early_platform_device_list,
1219                                 dev.devres_head) {
1220                list_del(&pd->dev.devres_head);
1221                memset(&pd->dev.devres_head, 0, sizeof(pd->dev.devres_head));
1222        }
1223}
1224
1225
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.