uboot/drivers/soc/soc-uclass.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * (C) Copyright 2020 - Texas Instruments Incorporated - http://www.ti.com/
   4 *      Dave Gerlach <d-gerlach@ti.com>
   5 */
   6
   7#define LOG_CATEGORY UCLASS_SOC
   8
   9#include <common.h>
  10#include <soc.h>
  11#include <dm.h>
  12#include <errno.h>
  13#include <dm/lists.h>
  14#include <dm/root.h>
  15
  16int soc_get(struct udevice **devp)
  17{
  18        return uclass_first_device_err(UCLASS_SOC, devp);
  19}
  20
  21int soc_get_machine(struct udevice *dev, char *buf, int size)
  22{
  23        struct soc_ops *ops = soc_get_ops(dev);
  24
  25        if (!ops->get_machine)
  26                return -ENOSYS;
  27
  28        return ops->get_machine(dev, buf, size);
  29}
  30
  31int soc_get_family(struct udevice *dev, char *buf, int size)
  32{
  33        struct soc_ops *ops = soc_get_ops(dev);
  34
  35        if (!ops->get_family)
  36                return -ENOSYS;
  37
  38        return ops->get_family(dev, buf, size);
  39}
  40
  41int soc_get_revision(struct udevice *dev, char *buf, int size)
  42{
  43        struct soc_ops *ops = soc_get_ops(dev);
  44
  45        if (!ops->get_revision)
  46                return -ENOSYS;
  47
  48        return ops->get_revision(dev, buf, size);
  49}
  50
  51const struct soc_attr *
  52soc_device_match(const struct soc_attr *matches)
  53{
  54        bool match;
  55        struct udevice *soc;
  56        char str[SOC_MAX_STR_SIZE];
  57
  58        if (!matches)
  59                return NULL;
  60
  61        if (soc_get(&soc))
  62                return NULL;
  63
  64        while (1) {
  65                if (!(matches->machine || matches->family ||
  66                      matches->revision))
  67                        break;
  68
  69                match = true;
  70
  71                if (matches->machine) {
  72                        if (!soc_get_machine(soc, str, SOC_MAX_STR_SIZE)) {
  73                                if (strcmp(matches->machine, str))
  74                                        match = false;
  75                        }
  76                }
  77
  78                if (matches->family) {
  79                        if (!soc_get_family(soc, str, SOC_MAX_STR_SIZE)) {
  80                                if (strcmp(matches->family, str))
  81                                        match = false;
  82                        }
  83                }
  84
  85                if (matches->revision) {
  86                        if (!soc_get_revision(soc, str, SOC_MAX_STR_SIZE)) {
  87                                if (strcmp(matches->revision, str))
  88                                        match = false;
  89                        }
  90                }
  91
  92                if (match)
  93                        return matches;
  94
  95                matches++;
  96        }
  97
  98        return NULL;
  99}
 100
 101UCLASS_DRIVER(soc) = {
 102        .id             = UCLASS_SOC,
 103        .name           = "soc",
 104};
 105