18e02d188SDavid Lechner /* SPDX-License-Identifier: GPL-2.0-only */
28e02d188SDavid Lechner /*
38e02d188SDavid Lechner  * Copyright (C) 2024 Analog Devices Inc.
48e02d188SDavid Lechner  * Copyright (C) 2024 BayLibre, SAS
58e02d188SDavid Lechner  */
68e02d188SDavid Lechner 
78e02d188SDavid Lechner #ifndef __LINUX_SPI_OFFLOAD_PROVIDER_H
88e02d188SDavid Lechner #define __LINUX_SPI_OFFLOAD_PROVIDER_H
98e02d188SDavid Lechner 
108e02d188SDavid Lechner #include <linux/module.h>
11*d7231be4SDavid Lechner #include <linux/spi/offload/types.h>
128e02d188SDavid Lechner #include <linux/types.h>
138e02d188SDavid Lechner 
148e02d188SDavid Lechner MODULE_IMPORT_NS("SPI_OFFLOAD");
158e02d188SDavid Lechner 
168e02d188SDavid Lechner struct device;
17*d7231be4SDavid Lechner struct spi_offload_trigger;
188e02d188SDavid Lechner 
198e02d188SDavid Lechner struct spi_offload *devm_spi_offload_alloc(struct device *dev, size_t priv_size);
208e02d188SDavid Lechner 
21*d7231be4SDavid Lechner struct spi_offload_trigger_ops {
22*d7231be4SDavid Lechner 	bool (*match)(struct spi_offload_trigger *trigger,
23*d7231be4SDavid Lechner 		      enum spi_offload_trigger_type type, u64 *args, u32 nargs);
24*d7231be4SDavid Lechner 	int (*request)(struct spi_offload_trigger *trigger,
25*d7231be4SDavid Lechner 		       enum spi_offload_trigger_type type, u64 *args, u32 nargs);
26*d7231be4SDavid Lechner 	void (*release)(struct spi_offload_trigger *trigger);
27*d7231be4SDavid Lechner 	int (*validate)(struct spi_offload_trigger *trigger,
28*d7231be4SDavid Lechner 			struct spi_offload_trigger_config *config);
29*d7231be4SDavid Lechner 	int (*enable)(struct spi_offload_trigger *trigger,
30*d7231be4SDavid Lechner 		      struct spi_offload_trigger_config *config);
31*d7231be4SDavid Lechner 	void (*disable)(struct spi_offload_trigger *trigger);
32*d7231be4SDavid Lechner };
33*d7231be4SDavid Lechner 
34*d7231be4SDavid Lechner struct spi_offload_trigger_info {
35*d7231be4SDavid Lechner 	/** @fwnode: Provider fwnode, used to match to consumer. */
36*d7231be4SDavid Lechner 	struct fwnode_handle *fwnode;
37*d7231be4SDavid Lechner 	/** @ops: Provider-specific callbacks. */
38*d7231be4SDavid Lechner 	const struct spi_offload_trigger_ops *ops;
39*d7231be4SDavid Lechner 	/** Provider-specific state to be used in callbacks. */
40*d7231be4SDavid Lechner 	void *priv;
41*d7231be4SDavid Lechner };
42*d7231be4SDavid Lechner 
43*d7231be4SDavid Lechner int devm_spi_offload_trigger_register(struct device *dev,
44*d7231be4SDavid Lechner 				      struct spi_offload_trigger_info *info);
45*d7231be4SDavid Lechner void *spi_offload_trigger_get_priv(struct spi_offload_trigger *trigger);
46*d7231be4SDavid Lechner 
478e02d188SDavid Lechner #endif /* __LINUX_SPI_OFFLOAD_PROVIDER_H */
48