uboot/include/soc.h
<<
>>
Prefs
   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