| /* SPDX-License-Identifier: GPL-2.0+ */ |
| /* |
| * (C) Copyright 2017, 2018 |
| * Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc |
| */ |
| |
| #ifndef _AXI_H_ |
| #define _AXI_H_ |
| |
| #include <linux/types.h> |
| |
| struct udevice; |
| |
| /** |
| * enum axi_size_t - Determine size of AXI transfer |
| * @AXI_SIZE_8: AXI sransfer is 8-bit wide |
| * @AXI_SIZE_16: AXI sransfer is 16-bit wide |
| * @AXI_SIZE_32: AXI sransfer is 32-bit wide |
| */ |
| enum axi_size_t { |
| AXI_SIZE_8, |
| AXI_SIZE_16, |
| AXI_SIZE_32, |
| }; |
| |
| struct axi_ops { |
| /** |
| * read() - Read a single value from a specified address on a AXI bus |
| * @dev: AXI bus to read from. |
| * @address: The address to read from. |
| * @data: Pointer to a variable that takes the data value read |
| * from the address on the AXI bus. |
| * @size: The size of the data to be read. |
| * |
| * Return: 0 if OK, -ve on error. |
| */ |
| int (*read)(struct udevice *dev, ulong address, void *data, |
| enum axi_size_t size); |
| |
| /** |
| * write() - Write a single value to a specified address on a AXI bus |
| * @dev: AXI bus to write to. |
| * @address: The address to write to. |
| * @data: Pointer to the data value to be written to the address |
| * on the AXI bus. |
| * @size: The size of the data to write. |
| * |
| * Return 0 if OK, -ve on error. |
| */ |
| int (*write)(struct udevice *dev, ulong address, void *data, |
| enum axi_size_t size); |
| }; |
| |
| #define axi_get_ops(dev) ((struct axi_ops *)(dev)->driver->ops) |
| |
| /** |
| * axi_read() - Read a single value from a specified address on a AXI bus |
| * @dev: AXI bus to read from. |
| * @address: The address to read from. |
| * @data: Pointer to a variable that takes the data value read from the |
| * address on the AXI bus. |
| * @size: The size of the data to write. |
| * |
| * Return: 0 if OK, -ve on error. |
| */ |
| int axi_read(struct udevice *dev, ulong address, void *data, |
| enum axi_size_t size); |
| |
| /** |
| * axi_write() - Write a single value to a specified address on a AXI bus |
| * @dev: AXI bus to write to. |
| * @address: The address to write to. |
| * @data: Pointer to the data value to be written to the address on the |
| * AXI bus. |
| * @size: The size of the data to write. |
| * |
| * Return: 0 if OK, -ve on error. |
| */ |
| int axi_write(struct udevice *dev, ulong address, void *data, |
| enum axi_size_t size); |
| |
| struct axi_emul_ops { |
| /** |
| * read() - Read a single value from a specified address on a AXI bus |
| * @dev: AXI bus to read from. |
| * @address: The address to read from. |
| * @data: Pointer to a variable that takes the data value read |
| * from the address on the AXI bus. |
| * @size: The size of the data to be read. |
| * |
| * Return: 0 if OK, -ve on error. |
| */ |
| int (*read)(struct udevice *dev, ulong address, void *data, |
| enum axi_size_t size); |
| |
| /** |
| * write() - Write a single value to a specified address on a AXI bus |
| * @dev: AXI bus to write to. |
| * @address: The address to write to. |
| * @data: Pointer to the data value to be written to the address |
| * on the AXI bus. |
| * @size: The size of the data to write. |
| * |
| * Return: 0 if OK, -ve on error. |
| */ |
| int (*write)(struct udevice *dev, ulong address, void *data, |
| enum axi_size_t size); |
| |
| /** |
| * get_store() - Get address of internal storage of a emulated AXI |
| * device |
| * @dev: Emulated AXI device to get the pointer of the internal |
| * storage for. |
| * @storep: Pointer to the internal storage of the emulated AXI |
| * device. |
| * |
| * Return: 0 if OK, -ve on error. |
| */ |
| int (*get_store)(struct udevice *dev, u8 **storep); |
| }; |
| |
| #endif |