xref: /linux/include/sound/sdca_fdl.h (revision 509d3f45847627f4c5cdce004c3ec79262b5239c)
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 #include <linux/workqueue.h>
15 
16 struct device;
17 struct regmap;
18 struct sdca_fdl_set;
19 struct sdca_function_data;
20 struct sdca_interrupt;
21 struct sdca_interrupt_info;
22 
23 /**
24  * struct fdl_state - FDL state structure to keep data between interrupts
25  * @begin: Completion indicating the start of an FDL download cycle.
26  * @done: Completion indicating the end of an FDL download cycle.
27  * @timeout: Delayed work used for timing out UMP transactions.
28  * @lock: Mutex to protect between the timeout work and IRQ handlers.
29  * @interrupt: Pointer to the interrupt struct to which this FDL is attached.
30  * @set: Pointer to the FDL set currently being downloaded.
31  * @file_index: Index of the current file being processed.
32  */
33 struct fdl_state {
34 	struct completion begin;
35 	struct completion done;
36 	struct delayed_work timeout;
37 	struct mutex lock;
38 
39 	struct sdca_interrupt *interrupt;
40 	struct sdca_fdl_set *set;
41 	int file_index;
42 };
43 
44 #define SDCA_CTL_XU_FDLH_COMPLETE	0
45 #define SDCA_CTL_XU_FDLH_MORE_FILES	SDCA_CTL_XU_FDLH_SET_IN_PROGRESS
46 #define SDCA_CTL_XU_FDLH_FILE_AVAILABLE	(SDCA_CTL_XU_FDLH_TRANSFERRED_FILE | \
47 					 SDCA_CTL_XU_FDLH_SET_IN_PROGRESS)
48 #define SDCA_CTL_XU_FDLH_MASK		(SDCA_CTL_XU_FDLH_TRANSFERRED_CHUNK | \
49 					 SDCA_CTL_XU_FDLH_TRANSFERRED_FILE | \
50 					 SDCA_CTL_XU_FDLH_SET_IN_PROGRESS | \
51 					 SDCA_CTL_XU_FDLH_RESET_ACK | \
52 					 SDCA_CTL_XU_FDLH_REQ_ABORT)
53 
54 #define SDCA_CTL_XU_FDLD_COMPLETE	0
55 #define SDCA_CTL_XU_FDLD_FILE_OK	(SDCA_CTL_XU_FDLH_TRANSFERRED_FILE | \
56 					 SDCA_CTL_XU_FDLH_SET_IN_PROGRESS | \
57 					 SDCA_CTL_XU_FDLD_ACK_TRANSFER | \
58 					 SDCA_CTL_XU_FDLD_NEEDS_SET)
59 #define SDCA_CTL_XU_FDLD_MORE_FILES_OK	(SDCA_CTL_XU_FDLH_SET_IN_PROGRESS | \
60 					 SDCA_CTL_XU_FDLD_ACK_TRANSFER | \
61 					 SDCA_CTL_XU_FDLD_NEEDS_SET)
62 #define SDCA_CTL_XU_FDLD_MASK		(SDCA_CTL_XU_FDLD_REQ_RESET | \
63 					 SDCA_CTL_XU_FDLD_REQ_ABORT | \
64 					 SDCA_CTL_XU_FDLD_ACK_TRANSFER | \
65 					 SDCA_CTL_XU_FDLD_NEEDS_SET)
66 
67 #if IS_ENABLED(CONFIG_SND_SOC_SDCA_FDL)
68 
69 int sdca_fdl_alloc_state(struct sdca_interrupt *interrupt);
70 int sdca_fdl_process(struct sdca_interrupt *interrupt);
71 int sdca_fdl_sync(struct device *dev, struct sdca_function_data *function,
72 		  struct sdca_interrupt_info *info);
73 
74 int sdca_reset_function(struct device *dev, struct sdca_function_data *function,
75 			struct regmap *regmap);
76 
77 #else
78 
79 static inline int sdca_fdl_alloc_state(struct sdca_interrupt *interrupt)
80 {
81 	return 0;
82 }
83 
84 static inline int sdca_fdl_process(struct sdca_interrupt *interrupt)
85 {
86 	return 0;
87 }
88 
89 static inline int sdca_fdl_sync(struct device *dev,
90 				struct sdca_function_data *function,
91 				struct sdca_interrupt_info *info)
92 {
93 	return 0;
94 }
95 
96 static inline int sdca_reset_function(struct device *dev,
97 				      struct sdca_function_data *function,
98 				      struct regmap *regmap)
99 {
100 	return 0;
101 }
102 
103 #endif // CONFIG_SND_SOC_SDCA_FDL
104 
105 #endif // __SDCA_FDL_H__
106