blob: a52a300a84a60dfc7976d6aaa47a0bddad717a20 [file] [log] [blame]
Dave Gerlach50a6c082020-07-15 23:39:57 -05001/* 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#ifndef __SOC_H
8#define __SOC_H
9
10#define SOC_MAX_STR_SIZE 128
11
Simon Glass3ba929a2020-10-30 21:38:53 -060012struct udevice;
13
Dave Gerlach50a6c082020-07-15 23:39:57 -050014/**
15 * struct soc_attr - Contains SoC identify information to be used in
16 * SoC matching. An array of these structs
17 * representing different SoCs can be passed to
18 * soc_device_match and the struct matching the SoC
19 * in use will be returned.
20 *
21 * @family - Name of SoC family that can include multiple related SoC
22 * variants. Example: am33
23 * @machine - Name of a specific SoC. Example: am3352
24 * @revision - Name of a specific SoC revision. Example: SR1.1
25 * @data - A pointer to user data for the SoC variant
26 */
27struct soc_attr {
28 const char *family;
29 const char *machine;
30 const char *revision;
31 const void *data;
32};
33
34struct soc_ops {
35 /**
36 * get_machine() - Get machine name of an SOC
37 *
38 * @dev: Device to check (UCLASS_SOC)
39 * @buf: Buffer to place string
40 * @size: Size of string space
41 * @return 0 if OK, -ENOSPC if buffer is too small, other -ve on error
42 */
43 int (*get_machine)(struct udevice *dev, char *buf, int size);
44
45 /**
46 * get_revision() - Get revision name of a SOC
47 *
48 * @dev: Device to check (UCLASS_SOC)
49 * @buf: Buffer to place string
50 * @size: Size of string space
51 * @return 0 if OK, -ENOSPC if buffer is too small, other -ve on error
52 */
53 int (*get_revision)(struct udevice *dev, char *buf, int size);
54
55 /**
56 * get_family() - Get family name of an SOC
57 *
58 * @dev: Device to check (UCLASS_SOC)
59 * @buf: Buffer to place string
60 * @size: Size of string space
61 * @return 0 if OK, -ENOSPC if buffer is too small, other -ve on error
62 */
63 int (*get_family)(struct udevice *dev, char *buf, int size);
64};
65
66#define soc_get_ops(dev) ((struct soc_ops *)(dev)->driver->ops)
67
68#ifdef CONFIG_SOC_DEVICE
69/**
70 * soc_get() - Return the soc device for the soc in use.
71 * @devp: Pointer to structure to receive the soc device.
72 *
73 * Since there can only be at most one SOC instance, the API can supply a
74 * function that returns the unique device.
75 *
76 * Return: 0 if OK, -ve on error.
77 */
78int soc_get(struct udevice **devp);
79
80/**
81 * soc_get_machine() - Get machine name of an SOC
82 * @dev: Device to check (UCLASS_SOC)
83 * @buf: Buffer to place string
84 * @size: Size of string space
85 *
86 * Return: 0 if OK, -ENOSPC if buffer is too small, other -ve on error
87 */
88int soc_get_machine(struct udevice *dev, char *buf, int size);
89
90/**
91 * soc_get_revision() - Get revision name of an SOC
92 * @dev: Device to check (UCLASS_SOC)
93 * @buf: Buffer to place string
94 * @size: Size of string space
95 *
96 * Return: 0 if OK, -ENOSPC if buffer is too small, other -ve on error
97 */
98int soc_get_revision(struct udevice *dev, char *buf, int size);
99
100/**
101 * soc_get_family() - Get family name of an SOC
102 * @dev: Device to check (UCLASS_SOC)
103 * @buf: Buffer to place string
104 * @size: Size of string space
105 *
106 * Return: 0 if OK, -ENOSPC if buffer is too small, other -ve on error
107 */
108int soc_get_family(struct udevice *dev, char *buf, int size);
109
110/**
111 * soc_device_match() - Return match from an array of soc_attr
112 * @matches: Array with any combination of family, revision or machine set
113 *
114 * Return: Pointer to struct from matches array with set attributes matching
115 * those provided by the soc device, or NULL if no match found.
116 */
117const struct soc_attr *
118soc_device_match(const struct soc_attr *matches);
119
120#else
121static inline int soc_get(struct udevice **devp)
122{
123 return -ENOSYS;
124}
125
126static inline int soc_get_machine(struct udevice *dev, char *buf, int size)
127{
128 return -ENOSYS;
129}
130
131static inline int soc_get_revision(struct udevice *dev, char *buf, int size)
132{
133 return -ENOSYS;
134}
135
136static inline int soc_get_family(struct udevice *dev, char *buf, int size)
137{
138 return -ENOSYS;
139}
140
141static inline const struct soc_attr *
142soc_device_match(const struct soc_attr *matches)
143{
144 return NULL;
145}
146#endif
147#endif /* _SOC_H */