xref: /linux/include/sound/sdca_fdl.h (revision 0723affa1bee50c3bd7ca00e00dee07fcef224b8)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * The MIPI SDCA specification is available for public downloads at
4  * https://www.mipi.org/mipi-sdca-v1-0-download
5  *
6  * Copyright (C) 2025 Cirrus Logic, Inc. and
7  *                    Cirrus Logic International Semiconductor Ltd.
8  */
9 
10 #ifndef __SDCA_FDL_H__
11 #define __SDCA_FDL_H__
12 
13 #include <linux/completion.h>
14 
15 struct device;
16 struct regmap;
17 struct sdca_fdl_set;
18 struct sdca_function_data;
19 struct sdca_interrupt;
20 struct sdca_interrupt_info;
21 
22 /**
23  * struct fdl_state - FDL state structure to keep data between interrupts
24  * @begin: Completion indicating the start of an FDL download cycle.
25  * @done: Completion indicating the end of an FDL download cycle.
26  * @set: Pointer to the FDL set currently being downloaded.
27  * @file_index: Index of the current file being processed.
28  */
29 struct fdl_state {
30 	struct completion begin;
31 	struct completion done;
32 
33 	struct sdca_fdl_set *set;
34 	int file_index;
35 };
36 
37 #define SDCA_CTL_XU_FDLH_COMPLETE	0
38 #define SDCA_CTL_XU_FDLH_MORE_FILES	SDCA_CTL_XU_FDLH_SET_IN_PROGRESS
39 #define SDCA_CTL_XU_FDLH_FILE_AVAILABLE	(SDCA_CTL_XU_FDLH_TRANSFERRED_FILE | \
40 					 SDCA_CTL_XU_FDLH_SET_IN_PROGRESS)
41 #define SDCA_CTL_XU_FDLH_MASK		(SDCA_CTL_XU_FDLH_TRANSFERRED_CHUNK | \
42 					 SDCA_CTL_XU_FDLH_TRANSFERRED_FILE | \
43 					 SDCA_CTL_XU_FDLH_SET_IN_PROGRESS | \
44 					 SDCA_CTL_XU_FDLH_RESET_ACK | \
45 					 SDCA_CTL_XU_FDLH_REQ_ABORT)
46 
47 #define SDCA_CTL_XU_FDLD_COMPLETE	0
48 #define SDCA_CTL_XU_FDLD_FILE_OK	(SDCA_CTL_XU_FDLH_TRANSFERRED_FILE | \
49 					 SDCA_CTL_XU_FDLH_SET_IN_PROGRESS | \
50 					 SDCA_CTL_XU_FDLD_ACK_TRANSFER | \
51 					 SDCA_CTL_XU_FDLD_NEEDS_SET)
52 #define SDCA_CTL_XU_FDLD_MORE_FILES_OK	(SDCA_CTL_XU_FDLH_SET_IN_PROGRESS | \
53 					 SDCA_CTL_XU_FDLD_ACK_TRANSFER | \
54 					 SDCA_CTL_XU_FDLD_NEEDS_SET)
55 #define SDCA_CTL_XU_FDLD_MASK		(SDCA_CTL_XU_FDLD_REQ_RESET | \
56 					 SDCA_CTL_XU_FDLD_REQ_ABORT | \
57 					 SDCA_CTL_XU_FDLD_ACK_TRANSFER | \
58 					 SDCA_CTL_XU_FDLD_NEEDS_SET)
59 
60 int sdca_fdl_alloc_state(struct sdca_interrupt *interrupt);
61 int sdca_fdl_process(struct sdca_interrupt *interrupt);
62 int sdca_fdl_sync(struct device *dev, struct sdca_function_data *function,
63 		  struct sdca_interrupt_info *info);
64 
65 int sdca_reset_function(struct device *dev, struct sdca_function_data *function,
66 			struct regmap *regmap);
67 
68 #endif // __SDCA_FDL_H__
69