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 
soc_get(struct udevice ** devp)16 int soc_get(struct udevice **devp)
17 {
18 	return uclass_first_device_err(UCLASS_SOC, devp);
19 }
20 
soc_get_machine(struct udevice * dev,char * buf,int size)21 int 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 
soc_get_family(struct udevice * dev,char * buf,int size)31 int 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 
soc_get_revision(struct udevice * dev,char * buf,int size)41 int 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 
51 const struct soc_attr *
soc_device_match(const struct soc_attr * matches)52 soc_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 
101 UCLASS_DRIVER(soc) = {
102 	.id		= UCLASS_SOC,
103 	.name		= "soc",
104 };
105