diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/dm/uclass-id.h | 1 | ||||
| -rw-r--r-- | include/extension_board.h | 86 |
2 files changed, 75 insertions, 12 deletions
diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h index 6be59093160..eb6416b5917 100644 --- a/include/dm/uclass-id.h +++ b/include/dm/uclass-id.h @@ -63,6 +63,7 @@ enum uclass_id { UCLASS_ETH, /* Ethernet device */ UCLASS_ETH_PHY, /* Ethernet PHY device */ UCLASS_EXTCON, /* External Connector Class */ + UCLASS_EXTENSION, /* Extension board */ UCLASS_FFA, /* Arm Firmware Framework for Armv8-A */ UCLASS_FFA_EMUL, /* sandbox FF-A device emulator */ UCLASS_FIRMWARE, /* Firmware */ diff --git a/include/extension_board.h b/include/extension_board.h index 22e4104bc54..0b9fb99ad7d 100644 --- a/include/extension_board.h +++ b/include/extension_board.h @@ -7,10 +7,58 @@ #ifndef __EXTENSION_SUPPORT_H #define __EXTENSION_SUPPORT_H +#include <alist.h> +#include <dm/device.h> #include <linux/list.h> +#include <dm/platdata.h> +extern struct list_head extension_list; + +/** + * extension_get_list - Get the extension list + * Return: The extension alist pointer, or NULL if no such list exists. + * + * The caller must not free the list. + */ +struct alist *extension_get_list(void); + +/** + * extension_probe - Probe extension device + * @dev: Extension device that needs to be probed + * Return: Zero on success, negative on failure. + */ +int extension_probe(struct udevice *dev); + +/** + * extension_remove - Remove extension device + * @dev: Extension device that needs to be removed + * Return: Zero on success, negative on failure. + */ +int extension_remove(struct udevice *dev); + +/** + * extension_scan - Scan extension boards available. + * Return: Zero on success, negative on failure. + */ +int extension_scan(void); + +/** + * extension_apply - Apply extension board overlay to the devicetree + * @working_fdt: Pointer to working flattened device tree + * @size: Size of the devicetree overlay + * Return: Zero on success, negative on failure. + */ +int extension_apply(struct fdt_header *working_fdt, ulong size); + +/** + * extension - Description fields of an extension board + * @name: Name of the extension + * @owner: Owner of the extension + * @version: Version of the extension + * @overlay: Devicetree overlay name to be loaded for this extension + * @other: Other information of this extension + */ struct extension { - struct list_head list; char name[32]; char owner[32]; char version[32]; @@ -18,16 +66,30 @@ struct extension { char other[32]; }; -/** - * extension_board_scan - Add system-specific function to scan extension board. - * @param extension_list List of extension board information to update. - * Return: the number of extension. - * - * This function is called if CONFIG_CMD_EXTENSION is defined. - * Needs to fill the list extension_list with elements. - * Each element need to be allocated to an extension structure. - * - */ -int extension_board_scan(struct list_head *extension_list); +struct extension_ops { + /** + * scan - Add system-specific function to scan extension boards. + * @dev: extension device + * @extension_list: alist of extension to expand + * Return: The number of extension or a negative value in case of + * error. + */ + int (*scan)(struct udevice *dev, struct alist *extension_list); +}; + +#define extension_get_ops(dev) ((struct extension_ops *)(dev)->driver->ops) + +/* Currently, only one extension driver enabled at a time is supported */ +#define U_BOOT_EXTENSION(_name, _scan_func) \ + U_BOOT_DRIVER(_name) = { \ + .name = #_name, \ + .id = UCLASS_EXTENSION, \ + .probe = extension_probe, \ + .remove = extension_remove, \ + .ops = &(struct extension_ops) { \ + .scan = _scan_func, \ + }, \ + .priv_auto = sizeof(struct alist), \ + } #endif /* __EXTENSION_SUPPORT_H */ |
