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#ifndef __SOC_H 8#define __SOC_H 9 10#define SOC_MAX_STR_SIZE 128 11 12struct udevice; 13 14/** 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 */ 148