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