/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * (C) Copyright 2020 - Texas Instruments Incorporated - https://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 */
