uboot/drivers/core/device.c
<<
>>
Prefs
   1/*
   2 * Device manager
   3 *
   4 * Copyright (c) 2013 Google, Inc
   5 *
   6 * (C) Copyright 2012
   7 * Pavel Herrmann <morpheus.ibis@gmail.com>
   8 *
   9 * SPDX-License-Identifier:     GPL-2.0+
  10 */
  11
  12#include <common.h>
  13#include <asm/io.h>
  14#include <fdtdec.h>
  15#include <fdt_support.h>
  16#include <malloc.h>
  17#include <dm/device.h>
  18#include <dm/device-internal.h>
  19#include <dm/lists.h>
  20#include <dm/pinctrl.h>
  21#include <dm/platdata.h>
  22#include <dm/read.h>
  23#include <dm/uclass.h>
  24#include <dm/uclass-internal.h>
  25#include <dm/util.h>
  26#include <linux/err.h>
  27#include <linux/list.h>
  28
  29DECLARE_GLOBAL_DATA_PTR;
  30
  31static int device_bind_common(struct udevice *parent, const struct driver *drv,
  32                              const char *name, void *platdata,
  33                              ulong driver_data, ofnode node,
  34                              uint of_platdata_size, struct udevice **devp)
  35{
  36        struct udevice *dev;
  37        struct uclass *uc;
  38        int size, ret = 0;
  39
  40        if (devp)
  41                *devp = NULL;
  42        if (!name)
  43                return -EINVAL;
  44
  45        ret = uclass_get(drv->id, &uc);
  46        if (ret) {
  47                debug("Missing uclass for driver %s\n", drv->name);
  48                return ret;
  49        }
  50
  51        dev = calloc(1, sizeof(struct udevice));
  52        if (!dev)
  53                return -ENOMEM;
  54
  55        INIT_LIST_HEAD(&dev->sibling_node);
  56        INIT_LIST_HEAD(&dev->child_head);
  57        INIT_LIST_HEAD(&dev->uclass_node);
  58#ifdef CONFIG_DEVRES
  59        INIT_LIST_HEAD(&dev->devres_head);
  60#endif
  61        dev->platdata = platdata;
  62        dev->driver_data = driver_data;
  63        dev->name = name;
  64        dev->node = node;
  65        dev->parent = parent;
  66        dev->driver = drv;
  67        dev->uclass = uc;
  68
  69        dev->seq = -1;
  70        dev->req_seq = -1;
  71        if (CONFIG_IS_ENABLED(OF_CONTROL) && CONFIG_IS_ENABLED(DM_SEQ_ALIAS)) {
  72                /*
  73                 * Some devices, such as a SPI bus, I2C bus and serial ports
  74                 * are numbered using aliases.
  75                 *
  76                 * This is just a 'requested' sequence, and will be
  77                 * resolved (and ->seq updated) when the device is probed.
  78                 */
  79                if (uc->uc_drv->flags & DM_UC_FLAG_SEQ_ALIAS) {
  80                        if (uc->uc_drv->name && ofnode_valid(node)) {
  81                                dev_read_alias_seq(dev, &dev->req_seq);
  82                        }
  83                }
  84        }
  85
  86        if (drv->platdata_auto_alloc_size) {
  87                bool alloc = !platdata;
  88
  89                if (CONFIG_IS_ENABLED(OF_PLATDATA)) {
  90                        if (of_platdata_size) {
  91                                dev->flags |= DM_FLAG_OF_PLATDATA;
  92                                if (of_platdata_size <
  93                                                drv->platdata_auto_alloc_size)
  94                                        alloc = true;
  95                        }
  96                }
  97                if (alloc) {
  98                        dev->flags |= DM_FLAG_ALLOC_PDATA;
  99                        dev->platdata = calloc(1,
 100                                               drv->platdata_auto_alloc_size);
 101                        if (!dev->platdata) {
 102                                ret = -ENOMEM;
 103                                goto fail_alloc1;
 104                        }
 105                        if (CONFIG_IS_ENABLED(OF_PLATDATA) && platdata) {
 106                                memcpy(dev->platdata, platdata,
 107                                       of_platdata_size);
 108                        }
 109                }
 110        }
 111
 112        size = uc->uc_drv->per_device_platdata_auto_alloc_size;
 113        if (size) {
 114                dev->flags |= DM_FLAG_ALLOC_UCLASS_PDATA;
 115                dev->uclass_platdata = calloc(1, size);
 116                if (!dev->uclass_platdata) {
 117                        ret = -ENOMEM;
 118                        goto fail_alloc2;
 119                }
 120        }
 121
 122        if (parent) {
 123                size = parent->driver->per_child_platdata_auto_alloc_size;
 124                if (!size) {
 125                        size = parent->uclass->uc_drv->
 126                                        per_child_platdata_auto_alloc_size;
 127                }
 128                if (size) {
 129                        dev->flags |= DM_FLAG_ALLOC_PARENT_PDATA;
 130                        dev->parent_platdata = calloc(1, size);
 131                        if (!dev->parent_platdata) {
 132                                ret = -ENOMEM;
 133                                goto fail_alloc3;
 134                        }
 135                }
 136        }
 137
 138        /* put dev into parent's successor list */
 139        if (parent)
 140                list_add_tail(&dev->sibling_node, &parent->child_head);
 141
 142        ret = uclass_bind_device(dev);
 143        if (ret)
 144                goto fail_uclass_bind;
 145
 146        /* if we fail to bind we remove device from successors and free it */
 147        if (drv->bind) {
 148                ret = drv->bind(dev);
 149                if (ret)
 150                        goto fail_bind;
 151        }
 152        if (parent && parent->driver->child_post_bind) {
 153                ret = parent->driver->child_post_bind(dev);
 154                if (ret)
 155                        goto fail_child_post_bind;
 156        }
 157        if (uc->uc_drv->post_bind) {
 158                ret = uc->uc_drv->post_bind(dev);
 159                if (ret)
 160                        goto fail_uclass_post_bind;
 161        }
 162
 163        if (parent)
 164                pr_debug("Bound device %s to %s\n", dev->name, parent->name);
 165        if (devp)
 166                *devp = dev;
 167
 168        dev->flags |= DM_FLAG_BOUND;
 169
 170        return 0;
 171
 172fail_uclass_post_bind:
 173        /* There is no child unbind() method, so no clean-up required */
 174fail_child_post_bind:
 175        if (CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)) {
 176                if (drv->unbind && drv->unbind(dev)) {
 177                        dm_warn("unbind() method failed on dev '%s' on error path\n",
 178                                dev->name);
 179                }
 180        }
 181
 182fail_bind:
 183        if (CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)) {
 184                if (uclass_unbind_device(dev)) {
 185                        dm_warn("Failed to unbind dev '%s' on error path\n",
 186                                dev->name);
 187                }
 188        }
 189fail_uclass_bind:
 190        if (CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)) {
 191                list_del(&dev->sibling_node);
 192                if (dev->flags & DM_FLAG_ALLOC_PARENT_PDATA) {
 193                        free(dev->parent_platdata);
 194                        dev->parent_platdata = NULL;
 195                }
 196        }
 197fail_alloc3:
 198        if (dev->flags & DM_FLAG_ALLOC_UCLASS_PDATA) {
 199                free(dev->uclass_platdata);
 200                dev->uclass_platdata = NULL;
 201        }
 202fail_alloc2:
 203        if (dev->flags & DM_FLAG_ALLOC_PDATA) {
 204                free(dev->platdata);
 205                dev->platdata = NULL;
 206        }
 207fail_alloc1:
 208        devres_release_all(dev);
 209
 210        free(dev);
 211
 212        return ret;
 213}
 214
 215int device_bind_with_driver_data(struct udevice *parent,
 216                                 const struct driver *drv, const char *name,
 217                                 ulong driver_data, ofnode node,
 218                                 struct udevice **devp)
 219{
 220        return device_bind_common(parent, drv, name, NULL, driver_data, node,
 221                                  0, devp);
 222}
 223
 224int device_bind(struct udevice *parent, const struct driver *drv,
 225                const char *name, void *platdata, int of_offset,
 226                struct udevice **devp)
 227{
 228        return device_bind_common(parent, drv, name, platdata, 0,
 229                                  offset_to_ofnode(of_offset), 0, devp);
 230}
 231
 232int device_bind_by_name(struct udevice *parent, bool pre_reloc_only,
 233                        const struct driver_info *info, struct udevice **devp)
 234{
 235        struct driver *drv;
 236        uint platdata_size = 0;
 237
 238        drv = lists_driver_lookup_name(info->name);
 239        if (!drv)
 240                return -ENOENT;
 241        if (pre_reloc_only && !(drv->flags & DM_FLAG_PRE_RELOC))
 242                return -EPERM;
 243
 244#if CONFIG_IS_ENABLED(OF_PLATDATA)
 245        platdata_size = info->platdata_size;
 246#endif
 247        return device_bind_common(parent, drv, info->name,
 248                        (void *)info->platdata, 0, ofnode_null(), platdata_size,
 249                        devp);
 250}
 251
 252static void *alloc_priv(int size, uint flags)
 253{
 254        void *priv;
 255
 256        if (flags & DM_FLAG_ALLOC_PRIV_DMA) {
 257                size = ROUND(size, ARCH_DMA_MINALIGN);
 258                priv = memalign(ARCH_DMA_MINALIGN, size);
 259                if (priv) {
 260                        memset(priv, '\0', size);
 261
 262                        /*
 263                         * Ensure that the zero bytes are flushed to memory.
 264                         * This prevents problems if the driver uses this as
 265                         * both an input and an output buffer:
 266                         *
 267                         * 1. Zeroes written to buffer (here) and sit in the
 268                         *      cache
 269                         * 2. Driver issues a read command to DMA
 270                         * 3. CPU runs out of cache space and evicts some cache
 271                         *      data in the buffer, writing zeroes to RAM from
 272                         *      the memset() above
 273                         * 4. DMA completes
 274                         * 5. Buffer now has some DMA data and some zeroes
 275                         * 6. Data being read is now incorrect
 276                         *
 277                         * To prevent this, ensure that the cache is clean
 278                         * within this range at the start. The driver can then
 279                         * use normal flush-after-write, invalidate-before-read
 280                         * procedures.
 281                         *
 282                         * TODO(sjg@chromium.org): Drop this microblaze
 283                         * exception.
 284                         */
 285#ifndef CONFIG_MICROBLAZE
 286                        flush_dcache_range((ulong)priv, (ulong)priv + size);
 287#endif
 288                }
 289        } else {
 290                priv = calloc(1, size);
 291        }
 292
 293        return priv;
 294}
 295
 296int device_probe(struct udevice *dev)
 297{
 298        const struct driver *drv;
 299        int size = 0;
 300        int ret;
 301        int seq;
 302
 303        if (!dev)
 304                return -EINVAL;
 305
 306        if (dev->flags & DM_FLAG_ACTIVATED)
 307                return 0;
 308
 309        drv = dev->driver;
 310        assert(drv);
 311
 312        /* Allocate private data if requested and not reentered */
 313        if (drv->priv_auto_alloc_size && !dev->priv) {
 314                dev->priv = alloc_priv(drv->priv_auto_alloc_size, drv->flags);
 315                if (!dev->priv) {
 316                        ret = -ENOMEM;
 317                        goto fail;
 318                }
 319        }
 320        /* Allocate private data if requested and not reentered */
 321        size = dev->uclass->uc_drv->per_device_auto_alloc_size;
 322        if (size && !dev->uclass_priv) {
 323                dev->uclass_priv = calloc(1, size);
 324                if (!dev->uclass_priv) {
 325                        ret = -ENOMEM;
 326                        goto fail;
 327                }
 328        }
 329
 330        /* Ensure all parents are probed */
 331        if (dev->parent) {
 332                size = dev->parent->driver->per_child_auto_alloc_size;
 333                if (!size) {
 334                        size = dev->parent->uclass->uc_drv->
 335                                        per_child_auto_alloc_size;
 336                }
 337                if (size && !dev->parent_priv) {
 338                        dev->parent_priv = alloc_priv(size, drv->flags);
 339                        if (!dev->parent_priv) {
 340                                ret = -ENOMEM;
 341                                goto fail;
 342                        }
 343                }
 344
 345                ret = device_probe(dev->parent);
 346                if (ret)
 347                        goto fail;
 348
 349                /*
 350                 * The device might have already been probed during
 351                 * the call to device_probe() on its parent device
 352                 * (e.g. PCI bridge devices). Test the flags again
 353                 * so that we don't mess up the device.
 354                 */
 355                if (dev->flags & DM_FLAG_ACTIVATED)
 356                        return 0;
 357        }
 358
 359        seq = uclass_resolve_seq(dev);
 360        if (seq < 0) {
 361                ret = seq;
 362                goto fail;
 363        }
 364        dev->seq = seq;
 365
 366        dev->flags |= DM_FLAG_ACTIVATED;
 367
 368        /*
 369         * Process pinctrl for everything except the root device, and
 370         * continue regardless of the result of pinctrl. Don't process pinctrl
 371         * settings for pinctrl devices since the device may not yet be
 372         * probed.
 373         */
 374        if (dev->parent && device_get_uclass_id(dev) != UCLASS_PINCTRL)
 375                pinctrl_select_state(dev, "default");
 376
 377        ret = uclass_pre_probe_device(dev);
 378        if (ret)
 379                goto fail;
 380
 381        if (dev->parent && dev->parent->driver->child_pre_probe) {
 382                ret = dev->parent->driver->child_pre_probe(dev);
 383                if (ret)
 384                        goto fail;
 385        }
 386
 387        if (drv->ofdata_to_platdata && dev_has_of_node(dev)) {
 388                ret = drv->ofdata_to_platdata(dev);
 389                if (ret)
 390                        goto fail;
 391        }
 392
 393        if (drv->probe) {
 394                ret = drv->probe(dev);
 395                if (ret) {
 396                        dev->flags &= ~DM_FLAG_ACTIVATED;
 397                        goto fail;
 398                }
 399        }
 400
 401        ret = uclass_post_probe_device(dev);
 402        if (ret)
 403                goto fail_uclass;
 404
 405        if (dev->parent && device_get_uclass_id(dev) == UCLASS_PINCTRL)
 406                pinctrl_select_state(dev, "default");
 407
 408        return 0;
 409fail_uclass:
 410        if (device_remove(dev, DM_REMOVE_NORMAL)) {
 411                dm_warn("%s: Device '%s' failed to remove on error path\n",
 412                        __func__, dev->name);
 413        }
 414fail:
 415        dev->flags &= ~DM_FLAG_ACTIVATED;
 416
 417        dev->seq = -1;
 418        device_free(dev);
 419
 420        return ret;
 421}
 422
 423void *dev_get_platdata(struct udevice *dev)
 424{
 425        if (!dev) {
 426                dm_warn("%s: null device\n", __func__);
 427                return NULL;
 428        }
 429
 430        return dev->platdata;
 431}
 432
 433void *dev_get_parent_platdata(struct udevice *dev)
 434{
 435        if (!dev) {
 436                dm_warn("%s: null device\n", __func__);
 437                return NULL;
 438        }
 439
 440        return dev->parent_platdata;
 441}
 442
 443void *dev_get_uclass_platdata(struct udevice *dev)
 444{
 445        if (!dev) {
 446                dm_warn("%s: null device\n", __func__);
 447                return NULL;
 448        }
 449
 450        return dev->uclass_platdata;
 451}
 452
 453void *dev_get_priv(struct udevice *dev)
 454{
 455        if (!dev) {
 456                dm_warn("%s: null device\n", __func__);
 457                return NULL;
 458        }
 459
 460        return dev->priv;
 461}
 462
 463void *dev_get_uclass_priv(struct udevice *dev)
 464{
 465        if (!dev) {
 466                dm_warn("%s: null device\n", __func__);
 467                return NULL;
 468        }
 469
 470        return dev->uclass_priv;
 471}
 472
 473void *dev_get_parent_priv(struct udevice *dev)
 474{
 475        if (!dev) {
 476                dm_warn("%s: null device\n", __func__);
 477                return NULL;
 478        }
 479
 480        return dev->parent_priv;
 481}
 482
 483static int device_get_device_tail(struct udevice *dev, int ret,
 484                                  struct udevice **devp)
 485{
 486        if (ret)
 487                return ret;
 488
 489        ret = device_probe(dev);
 490        if (ret)
 491                return ret;
 492
 493        *devp = dev;
 494
 495        return 0;
 496}
 497
 498int device_get_child(struct udevice *parent, int index, struct udevice **devp)
 499{
 500        struct udevice *dev;
 501
 502        list_for_each_entry(dev, &parent->child_head, sibling_node) {
 503                if (!index--)
 504                        return device_get_device_tail(dev, 0, devp);
 505        }
 506
 507        return -ENODEV;
 508}
 509
 510int device_find_child_by_seq(struct udevice *parent, int seq_or_req_seq,
 511                             bool find_req_seq, struct udevice **devp)
 512{
 513        struct udevice *dev;
 514
 515        *devp = NULL;
 516        if (seq_or_req_seq == -1)
 517                return -ENODEV;
 518
 519        list_for_each_entry(dev, &parent->child_head, sibling_node) {
 520                if ((find_req_seq ? dev->req_seq : dev->seq) ==
 521                                seq_or_req_seq) {
 522                        *devp = dev;
 523                        return 0;
 524                }
 525        }
 526
 527        return -ENODEV;
 528}
 529
 530int device_get_child_by_seq(struct udevice *parent, int seq,
 531                            struct udevice **devp)
 532{
 533        struct udevice *dev;
 534        int ret;
 535
 536        *devp = NULL;
 537        ret = device_find_child_by_seq(parent, seq, false, &dev);
 538        if (ret == -ENODEV) {
 539                /*
 540                 * We didn't find it in probed devices. See if there is one
 541                 * that will request this seq if probed.
 542                 */
 543                ret = device_find_child_by_seq(parent, seq, true, &dev);
 544        }
 545        return device_get_device_tail(dev, ret, devp);
 546}
 547
 548int device_find_child_by_of_offset(struct udevice *parent, int of_offset,
 549                                   struct udevice **devp)
 550{
 551        struct udevice *dev;
 552
 553        *devp = NULL;
 554
 555        list_for_each_entry(dev, &parent->child_head, sibling_node) {
 556                if (dev_of_offset(dev) == of_offset) {
 557                        *devp = dev;
 558                        return 0;
 559                }
 560        }
 561
 562        return -ENODEV;
 563}
 564
 565int device_get_child_by_of_offset(struct udevice *parent, int node,
 566                                  struct udevice **devp)
 567{
 568        struct udevice *dev;
 569        int ret;
 570
 571        *devp = NULL;
 572        ret = device_find_child_by_of_offset(parent, node, &dev);
 573        return device_get_device_tail(dev, ret, devp);
 574}
 575
 576static struct udevice *_device_find_global_by_of_offset(struct udevice *parent,
 577                                                        int of_offset)
 578{
 579        struct udevice *dev, *found;
 580
 581        if (dev_of_offset(parent) == of_offset)
 582                return parent;
 583
 584        list_for_each_entry(dev, &parent->child_head, sibling_node) {
 585                found = _device_find_global_by_of_offset(dev, of_offset);
 586                if (found)
 587                        return found;
 588        }
 589
 590        return NULL;
 591}
 592
 593int device_get_global_by_of_offset(int of_offset, struct udevice **devp)
 594{
 595        struct udevice *dev;
 596
 597        dev = _device_find_global_by_of_offset(gd->dm_root, of_offset);
 598        return device_get_device_tail(dev, dev ? 0 : -ENOENT, devp);
 599}
 600
 601int device_find_first_child(struct udevice *parent, struct udevice **devp)
 602{
 603        if (list_empty(&parent->child_head)) {
 604                *devp = NULL;
 605        } else {
 606                *devp = list_first_entry(&parent->child_head, struct udevice,
 607                                         sibling_node);
 608        }
 609
 610        return 0;
 611}
 612
 613int device_find_next_child(struct udevice **devp)
 614{
 615        struct udevice *dev = *devp;
 616        struct udevice *parent = dev->parent;
 617
 618        if (list_is_last(&dev->sibling_node, &parent->child_head)) {
 619                *devp = NULL;
 620        } else {
 621                *devp = list_entry(dev->sibling_node.next, struct udevice,
 622                                   sibling_node);
 623        }
 624
 625        return 0;
 626}
 627
 628struct udevice *dev_get_parent(struct udevice *child)
 629{
 630        return child->parent;
 631}
 632
 633ulong dev_get_driver_data(struct udevice *dev)
 634{
 635        return dev->driver_data;
 636}
 637
 638const void *dev_get_driver_ops(struct udevice *dev)
 639{
 640        if (!dev || !dev->driver->ops)
 641                return NULL;
 642
 643        return dev->driver->ops;
 644}
 645
 646enum uclass_id device_get_uclass_id(struct udevice *dev)
 647{
 648        return dev->uclass->uc_drv->id;
 649}
 650
 651const char *dev_get_uclass_name(struct udevice *dev)
 652{
 653        if (!dev)
 654                return NULL;
 655
 656        return dev->uclass->uc_drv->name;
 657}
 658
 659bool device_has_children(struct udevice *dev)
 660{
 661        return !list_empty(&dev->child_head);
 662}
 663
 664bool device_has_active_children(struct udevice *dev)
 665{
 666        struct udevice *child;
 667
 668        for (device_find_first_child(dev, &child);
 669             child;
 670             device_find_next_child(&child)) {
 671                if (device_active(child))
 672                        return true;
 673        }
 674
 675        return false;
 676}
 677
 678bool device_is_last_sibling(struct udevice *dev)
 679{
 680        struct udevice *parent = dev->parent;
 681
 682        if (!parent)
 683                return false;
 684        return list_is_last(&dev->sibling_node, &parent->child_head);
 685}
 686
 687void device_set_name_alloced(struct udevice *dev)
 688{
 689        dev->flags |= DM_FLAG_NAME_ALLOCED;
 690}
 691
 692int device_set_name(struct udevice *dev, const char *name)
 693{
 694        name = strdup(name);
 695        if (!name)
 696                return -ENOMEM;
 697        dev->name = name;
 698        device_set_name_alloced(dev);
 699
 700        return 0;
 701}
 702
 703bool device_is_compatible(struct udevice *dev, const char *compat)
 704{
 705        const void *fdt = gd->fdt_blob;
 706
 707        return !fdt_node_check_compatible(fdt, dev_of_offset(dev), compat);
 708}
 709
 710bool of_machine_is_compatible(const char *compat)
 711{
 712        const void *fdt = gd->fdt_blob;
 713
 714        return !fdt_node_check_compatible(fdt, 0, compat);
 715}
 716