summaryrefslogtreecommitdiff
path: root/drivers/soc
diff options
context:
space:
mode:
authorDave Gerlach <d-gerlach@ti.com>2020-07-16 07:39:57 +0300
committerSimon Glass <sjg@chromium.org>2020-07-25 23:46:57 +0300
commit6d3b82df832908675fe4cf4c829779f3abc34999 (patch)
tree2c8be8def4d315905b9a1ac3b11881f081a85ed4 /drivers/soc
parent726eb121b8ba8a4bc6c58072e551ec93c09165ec (diff)
downloadu-boot-6d3b82df832908675fe4cf4c829779f3abc34999.tar.xz
dm: soc: Introduce UCLASS_SOC for SOC ID and attribute matching
Introduce UCLASS_SOC to be used for SOC identification and attribute matching based on the SoC ID info. This allows drivers to be provided for SoCs to retrieve SoC identifying information and also for matching device attributes for selecting SoC specific data. This is useful for other device drivers that may need different parameters or quirks enabled depending on the specific device variant in use. Reviewed-by: Simon Glass <sjg@chromium.org> Signed-off-by: Dave Gerlach <d-gerlach@ti.com>
Diffstat (limited to 'drivers/soc')
-rw-r--r--drivers/soc/Kconfig9
-rw-r--r--drivers/soc/Makefile1
-rw-r--r--drivers/soc/soc-uclass.c102
3 files changed, 112 insertions, 0 deletions
diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig
index 7b4e4d6130..e715dfd017 100644
--- a/drivers/soc/Kconfig
+++ b/drivers/soc/Kconfig
@@ -1,5 +1,14 @@
menu "SOC (System On Chip) specific Drivers"
+config SOC_DEVICE
+ bool "Enable SoC Device ID drivers using Driver Model"
+ help
+ This allows drivers to be provided for SoCs to help in identifying
+ the SoC in use and matching SoC attributes for selecting SoC
+ specific data. This is useful for other device drivers that may
+ need different parameters or quirks enabled depending on the
+ specific device variant in use.
+
source "drivers/soc/ti/Kconfig"
endmenu
diff --git a/drivers/soc/Makefile b/drivers/soc/Makefile
index ce253b7aa8..1c09a84656 100644
--- a/drivers/soc/Makefile
+++ b/drivers/soc/Makefile
@@ -3,3 +3,4 @@
# Makefile for the U-Boot SOC specific device drivers.
obj-$(CONFIG_SOC_TI) += ti/
+obj-$(CONFIG_SOC_DEVICE) += soc-uclass.o
diff --git a/drivers/soc/soc-uclass.c b/drivers/soc/soc-uclass.c
new file mode 100644
index 0000000000..c32d647864
--- /dev/null
+++ b/drivers/soc/soc-uclass.c
@@ -0,0 +1,102 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2020 - Texas Instruments Incorporated - http://www.ti.com/
+ * Dave Gerlach <d-gerlach@ti.com>
+ */
+
+#include <common.h>
+#include <soc.h>
+#include <dm.h>
+#include <errno.h>
+#include <dm/lists.h>
+#include <dm/root.h>
+
+int soc_get(struct udevice **devp)
+{
+ return uclass_first_device_err(UCLASS_SOC, devp);
+}
+
+int soc_get_machine(struct udevice *dev, char *buf, int size)
+{
+ struct soc_ops *ops = soc_get_ops(dev);
+
+ if (!ops->get_machine)
+ return -ENOSYS;
+
+ return ops->get_machine(dev, buf, size);
+}
+
+int soc_get_family(struct udevice *dev, char *buf, int size)
+{
+ struct soc_ops *ops = soc_get_ops(dev);
+
+ if (!ops->get_family)
+ return -ENOSYS;
+
+ return ops->get_family(dev, buf, size);
+}
+
+int soc_get_revision(struct udevice *dev, char *buf, int size)
+{
+ struct soc_ops *ops = soc_get_ops(dev);
+
+ if (!ops->get_revision)
+ return -ENOSYS;
+
+ return ops->get_revision(dev, buf, size);
+}
+
+const struct soc_attr *
+soc_device_match(const struct soc_attr *matches)
+{
+ bool match;
+ struct udevice *soc;
+ char str[SOC_MAX_STR_SIZE];
+
+ if (!matches)
+ return NULL;
+
+ if (soc_get(&soc))
+ return NULL;
+
+ while (1) {
+ if (!(matches->machine || matches->family ||
+ matches->revision))
+ break;
+
+ match = true;
+
+ if (matches->machine) {
+ if (!soc_get_machine(soc, str, SOC_MAX_STR_SIZE)) {
+ if (strcmp(matches->machine, str))
+ match = false;
+ }
+ }
+
+ if (matches->family) {
+ if (!soc_get_family(soc, str, SOC_MAX_STR_SIZE)) {
+ if (strcmp(matches->family, str))
+ match = false;
+ }
+ }
+
+ if (matches->revision) {
+ if (!soc_get_revision(soc, str, SOC_MAX_STR_SIZE)) {
+ if (strcmp(matches->revision, str))
+ match = false;
+ }
+ }
+
+ if (match)
+ return matches;
+
+ matches++;
+ }
+
+ return NULL;
+}
+
+UCLASS_DRIVER(soc) = {
+ .id = UCLASS_SOC,
+ .name = "soc",
+};