/* SPDX-License-Identifier: GPL-2.0+ */ /* * (C) Copyright 2020 - Texas Instruments Incorporated - http://www.ti.com/ * Dave Gerlach <d-gerlach@ti.com> */ #ifndef __SOC_H #define __SOC_H #define SOC_MAX_STR_SIZE 128 struct udevice; /** * struct soc_attr - Contains SoC identify information to be used in * SoC matching. An array of these structs * representing different SoCs can be passed to * soc_device_match and the struct matching the SoC * in use will be returned. * * @family - Name of SoC family that can include multiple related SoC * variants. Example: am33 * @machine - Name of a specific SoC. Example: am3352 * @revision - Name of a specific SoC revision. Example: SR1.1 * @data - A pointer to user data for the SoC variant */ struct soc_attr { const char *family; const char *machine; const char *revision; const void *data; }; struct soc_ops { /** * get_machine() - Get machine name of an SOC * * @dev: Device to check (UCLASS_SOC) * @buf: Buffer to place string * @size: Size of string space * @return 0 if OK, -ENOSPC if buffer is too small, other -ve on error */ int (*get_machine)(struct udevice *dev, char *buf, int size); /** * get_revision() - Get revision name of a SOC * * @dev: Device to check (UCLASS_SOC) * @buf: Buffer to place string * @size: Size of string space * @return 0 if OK, -ENOSPC if buffer is too small, other -ve on error */ int (*get_revision)(struct udevice *dev, char *buf, int size); /** * get_family() - Get family name of an SOC * * @dev: Device to check (UCLASS_SOC) * @buf: Buffer to place string * @size: Size of string space * @return 0 if OK, -ENOSPC if buffer is too small, other -ve on error */ int (*get_family)(struct udevice *dev, char *buf, int size); }; #define soc_get_ops(dev) ((struct soc_ops *)(dev)->driver->ops) #ifdef CONFIG_SOC_DEVICE /** * soc_get() - Return the soc device for the soc in use. * @devp: Pointer to structure to receive the soc device. * * Since there can only be at most one SOC instance, the API can supply a * function that returns the unique device. * * Return: 0 if OK, -ve on error. */ int soc_get(struct udevice **devp); /** * soc_get_machine() - Get machine name of an SOC * @dev: Device to check (UCLASS_SOC) * @buf: Buffer to place string * @size: Size of string space * * Return: 0 if OK, -ENOSPC if buffer is too small, other -ve on error */ int soc_get_machine(struct udevice *dev, char *buf, int size); /** * soc_get_revision() - Get revision name of an SOC * @dev: Device to check (UCLASS_SOC) * @buf: Buffer to place string * @size: Size of string space * * Return: 0 if OK, -ENOSPC if buffer is too small, other -ve on error */ int soc_get_revision(struct udevice *dev, char *buf, int size); /** * soc_get_family() - Get family name of an SOC * @dev: Device to check (UCLASS_SOC) * @buf: Buffer to place string * @size: Size of string space * * Return: 0 if OK, -ENOSPC if buffer is too small, other -ve on error */ int soc_get_family(struct udevice *dev, char *buf, int size); /** * soc_device_match() - Return match from an array of soc_attr * @matches: Array with any combination of family, revision or machine set * * Return: Pointer to struct from matches array with set attributes matching * those provided by the soc device, or NULL if no match found. */ const struct soc_attr * soc_device_match(const struct soc_attr *matches); #else static inline int soc_get(struct udevice **devp) { return -ENOSYS; } static inline int soc_get_machine(struct udevice *dev, char *buf, int size) { return -ENOSYS; } static inline int soc_get_revision(struct udevice *dev, char *buf, int size) { return -ENOSYS; } static inline int soc_get_family(struct udevice *dev, char *buf, int size) { return -ENOSYS; } static inline const struct soc_attr * soc_device_match(const struct soc_attr *matches) { return NULL; } #endif #endif /* _SOC_H */