| /* SPDX-License-Identifier: GPL-2.0+ */ |
| /* |
| * (C) Copyright 2021 |
| * Köry Maincent, Bootlin, <kory.maincent@bootlin.com> |
| */ |
| |
| #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 { |
| char name[32]; |
| char owner[32]; |
| char version[32]; |
| char overlay[64]; |
| char other[32]; |
| }; |
| |
| 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 */ |