xref: /linux/sound/soc/sdca/sdca_regmap.c (revision d061251387903e8502843ac983553f0b2e098ef8)
1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (C) 2025 Cirrus Logic, Inc. and
3 //                    Cirrus Logic International Semiconductor Ltd.
4 
5 /*
6  * The MIPI SDCA specification is available for public downloads at
7  * https://www.mipi.org/mipi-sdca-v1-0-download
8  */
9 
10 #include <linux/bitops.h>
11 #include <linux/minmax.h>
12 #include <linux/module.h>
13 #include <linux/regmap.h>
14 #include <linux/soundwire/sdw_registers.h>
15 #include <linux/types.h>
16 #include <sound/sdca.h>
17 #include <sound/sdca_function.h>
18 #include <sound/sdca_regmap.h>
19 
20 static struct sdca_entity *
21 function_find_entity(struct sdca_function_data *function, unsigned int reg)
22 {
23 	int i;
24 
25 	for (i = 0; i < function->num_entities; i++)
26 		if (SDW_SDCA_CTL_ENT(reg) == function->entities[i].id)
27 			return &function->entities[i];
28 
29 	return NULL;
30 }
31 
32 static struct sdca_control *
33 entity_find_control(struct sdca_entity *entity, unsigned int reg)
34 {
35 	int i;
36 
37 	for (i = 0; i < entity->num_controls; i++) {
38 		if (SDW_SDCA_CTL_CSEL(reg) == entity->controls[i].sel)
39 			return &entity->controls[i];
40 	}
41 
42 	return NULL;
43 }
44 
45 static struct sdca_control *
46 function_find_control(struct sdca_function_data *function, unsigned int reg)
47 {
48 	struct sdca_entity *entity;
49 
50 	entity = function_find_entity(function, reg);
51 	if (!entity)
52 		return NULL;
53 
54 	return entity_find_control(entity, reg);
55 }
56 
57 /**
58  * sdca_regmap_readable - return if a given SDCA Control is readable
59  * @function: Pointer to the Function information.
60  * @reg: Register address/Control to be processed.
61  *
62  * Return: Returns true if the register is readable.
63  */
64 bool sdca_regmap_readable(struct sdca_function_data *function, unsigned int reg)
65 {
66 	struct sdca_control *control;
67 
68 	if (!SDW_SDCA_VALID_CTL(reg))
69 		return false;
70 
71 	control = function_find_control(function, reg);
72 	if (!control)
73 		return false;
74 
75 	if (!(BIT(SDW_SDCA_CTL_CNUM(reg)) & control->cn_list))
76 		return false;
77 
78 	switch (control->mode) {
79 	case SDCA_ACCESS_MODE_RW:
80 	case SDCA_ACCESS_MODE_RO:
81 	case SDCA_ACCESS_MODE_RW1S:
82 	case SDCA_ACCESS_MODE_RW1C:
83 		if (SDW_SDCA_NEXT_CTL(0) & reg)
84 			return false;
85 		fallthrough;
86 	case SDCA_ACCESS_MODE_DUAL:
87 		/* No access to registers marked solely for device use */
88 		return control->layers & ~SDCA_ACCESS_LAYER_DEVICE;
89 	default:
90 		return false;
91 	}
92 }
93 EXPORT_SYMBOL_NS(sdca_regmap_readable, "SND_SOC_SDCA");
94 
95 /**
96  * sdca_regmap_writeable - return if a given SDCA Control is writeable
97  * @function: Pointer to the Function information.
98  * @reg: Register address/Control to be processed.
99  *
100  * Return: Returns true if the register is writeable.
101  */
102 bool sdca_regmap_writeable(struct sdca_function_data *function, unsigned int reg)
103 {
104 	struct sdca_control *control;
105 
106 	if (!SDW_SDCA_VALID_CTL(reg))
107 		return false;
108 
109 	control = function_find_control(function, reg);
110 	if (!control)
111 		return false;
112 
113 	if (!(BIT(SDW_SDCA_CTL_CNUM(reg)) & control->cn_list))
114 		return false;
115 
116 	switch (control->mode) {
117 	case SDCA_ACCESS_MODE_RW:
118 	case SDCA_ACCESS_MODE_RW1S:
119 	case SDCA_ACCESS_MODE_RW1C:
120 		if (SDW_SDCA_NEXT_CTL(0) & reg)
121 			return false;
122 		fallthrough;
123 	case SDCA_ACCESS_MODE_DUAL:
124 		/* No access to registers marked solely for device use */
125 		return control->layers & ~SDCA_ACCESS_LAYER_DEVICE;
126 	default:
127 		return false;
128 	}
129 }
130 EXPORT_SYMBOL_NS(sdca_regmap_writeable, "SND_SOC_SDCA");
131 
132 /**
133  * sdca_regmap_volatile - return if a given SDCA Control is volatile
134  * @function: Pointer to the Function information.
135  * @reg: Register address/Control to be processed.
136  *
137  * Return: Returns true if the register is volatile.
138  */
139 bool sdca_regmap_volatile(struct sdca_function_data *function, unsigned int reg)
140 {
141 	struct sdca_control *control;
142 
143 	if (!SDW_SDCA_VALID_CTL(reg))
144 		return false;
145 
146 	control = function_find_control(function, reg);
147 	if (!control)
148 		return false;
149 
150 	return control->is_volatile;
151 }
152 EXPORT_SYMBOL_NS(sdca_regmap_volatile, "SND_SOC_SDCA");
153 
154 /**
155  * sdca_regmap_deferrable - return if a given SDCA Control is deferrable
156  * @function: Pointer to the Function information.
157  * @reg: Register address/Control to be processed.
158  *
159  * Return: Returns true if the register is deferrable.
160  */
161 bool sdca_regmap_deferrable(struct sdca_function_data *function, unsigned int reg)
162 {
163 	struct sdca_control *control;
164 
165 	if (!SDW_SDCA_VALID_CTL(reg))
166 		return false;
167 
168 	control = function_find_control(function, reg);
169 	if (!control)
170 		return false;
171 
172 	return control->deferrable;
173 }
174 EXPORT_SYMBOL_NS(sdca_regmap_deferrable, "SND_SOC_SDCA");
175 
176 /**
177  * sdca_regmap_mbq_size - return size in bytes of a given SDCA Control
178  * @function: Pointer to the Function information.
179  * @reg: Register address/Control to be processed.
180  *
181  * Return: Returns the size in bytes of the Control.
182  */
183 int sdca_regmap_mbq_size(struct sdca_function_data *function, unsigned int reg)
184 {
185 	struct sdca_control *control;
186 
187 	if (!SDW_SDCA_VALID_CTL(reg))
188 		return -EINVAL;
189 
190 	control = function_find_control(function, reg);
191 	if (!control)
192 		return -EINVAL;
193 
194 	return clamp_val(control->nbits / BITS_PER_BYTE, sizeof(u8), sizeof(u32));
195 }
196 EXPORT_SYMBOL_NS(sdca_regmap_mbq_size, "SND_SOC_SDCA");
197 
198 /**
199  * sdca_regmap_count_constants - count the number of DisCo constant Controls
200  * @dev: Pointer to the device.
201  * @function: Pointer to the Function information, to be parsed.
202  *
203  * This function returns the number of DisCo constant Controls present
204  * in a function. Typically this information will be used to populate
205  * the regmap defaults array, allowing drivers to access the values of
206  * DisCo constants as any other physical register.
207  *
208  * Return: Returns number of DisCo constant controls, or a negative error
209  * code on failure.
210  */
211 int sdca_regmap_count_constants(struct device *dev,
212 				struct sdca_function_data *function)
213 {
214 	int nconsts = 0;
215 	int i, j;
216 
217 	for (i = 0; i < function->num_entities; i++) {
218 		struct sdca_entity *entity = &function->entities[i];
219 
220 		for (j = 0; j < entity->num_controls; j++) {
221 			if (entity->controls[j].mode == SDCA_ACCESS_MODE_DC ||
222 			    entity->controls[j].has_reset)
223 				nconsts += hweight64(entity->controls[j].cn_list);
224 		}
225 	}
226 
227 	return nconsts;
228 }
229 EXPORT_SYMBOL_NS(sdca_regmap_count_constants, "SND_SOC_SDCA");
230 
231 /**
232  * sdca_regmap_populate_constants - fill an array with DisCo constant values
233  * @dev: Pointer to the device.
234  * @function: Pointer to the Function information, to be parsed.
235  * @consts: Pointer to the array which should be filled with the DisCo
236  * constant values.
237  *
238  * This function will populate a regmap struct reg_default array with
239  * the values of the DisCo constants for a given Function. This
240  * allows to access the values of DisCo constants the same as any
241  * other physical register.
242  *
243  * Return: Returns the number of constants populated on success, a negative
244  * error code on failure.
245  */
246 int sdca_regmap_populate_constants(struct device *dev,
247 				   struct sdca_function_data *function,
248 				   struct reg_default *consts)
249 {
250 	int i, j, k, l;
251 
252 	for (i = 0, k = 0; i < function->num_entities; i++) {
253 		struct sdca_entity *entity = &function->entities[i];
254 
255 		for (j = 0; j < entity->num_controls; j++) {
256 			struct sdca_control *control = &entity->controls[j];
257 			int cn;
258 
259 			if (control->mode != SDCA_ACCESS_MODE_DC &&
260 			    !control->has_reset)
261 				continue;
262 
263 			l = 0;
264 			for_each_set_bit(cn, (unsigned long *)&control->cn_list,
265 					 BITS_PER_TYPE(control->cn_list)) {
266 				consts[k].reg = SDW_SDCA_CTL(function->desc->adr,
267 							     entity->id,
268 							     control->sel, cn);
269 				if (control->mode == SDCA_ACCESS_MODE_DC)
270 					consts[k].def = control->values[l];
271 				else
272 					consts[k].def = control->reset;
273 				k++;
274 				l++;
275 			}
276 		}
277 	}
278 
279 	return k;
280 }
281 EXPORT_SYMBOL_NS(sdca_regmap_populate_constants, "SND_SOC_SDCA");
282 
283 static int populate_control_defaults(struct device *dev, struct regmap *regmap,
284 				     struct sdca_function_data *function,
285 				     struct sdca_entity *entity,
286 				     struct sdca_control *control)
287 {
288 	int i, ret;
289 	int cn;
290 
291 	if (control->mode == SDCA_ACCESS_MODE_DC)
292 		return 0;
293 
294 	if (control->layers & SDCA_ACCESS_LAYER_DEVICE)
295 		return 0;
296 
297 	i = 0;
298 	for_each_set_bit(cn, (unsigned long *)&control->cn_list,
299 			 BITS_PER_TYPE(control->cn_list)) {
300 		unsigned int reg, val;
301 
302 		reg = SDW_SDCA_CTL(function->desc->adr, entity->id, control->sel, cn);
303 
304 		if (control->has_default || control->has_fixed) {
305 			ret = regmap_write(regmap, reg, control->values[i]);
306 			if (ret) {
307 				dev_err(dev, "Failed to write default %#x: %d\n",
308 					reg, ret);
309 				return ret;
310 			}
311 
312 			i++;
313 		} else if (!control->is_volatile) {
314 			if (control->has_reset)
315 				regcache_drop_region(regmap, reg, reg);
316 
317 			ret = regmap_read(regmap, reg, &val);
318 			if (ret) {
319 				dev_err(dev, "Failed to read initial %#x: %d\n",
320 					reg, ret);
321 				return ret;
322 			}
323 		}
324 	}
325 
326 	return 0;
327 }
328 
329 /**
330  * sdca_regmap_write_defaults - write out DisCo defaults to device
331  * @dev: Pointer to the device.
332  * @regmap: Pointer to the Function register map.
333  * @function: Pointer to the Function information, to be parsed.
334  *
335  * This function will write out to the hardware all the DisCo default and
336  * fixed value controls. This will cause them to be populated into the cache,
337  * and subsequent handling can be done through a cache sync. It will also
338  * read any non-volatile registers that don't have defaults/fixed values to
339  * populate those into the cache, this ensures they are available for reads
340  * even when the device is runtime suspended.
341  *
342  * Return: Returns zero on success, and a negative error code on failure.
343  */
344 int sdca_regmap_write_defaults(struct device *dev, struct regmap *regmap,
345 			       struct sdca_function_data *function)
346 {
347 	int i, j;
348 	int ret;
349 
350 	for (i = 0; i < function->num_entities; i++) {
351 		struct sdca_entity *entity = &function->entities[i];
352 
353 		for (j = 0; j < entity->num_controls; j++) {
354 			struct sdca_control *control = &entity->controls[j];
355 
356 			ret = populate_control_defaults(dev, regmap, function,
357 							entity, control);
358 			if (ret)
359 				return ret;
360 		}
361 	}
362 
363 	return 0;
364 }
365 EXPORT_SYMBOL_NS(sdca_regmap_write_defaults, "SND_SOC_SDCA");
366 
367 int sdca_regmap_write_init(struct device *dev, struct regmap *regmap,
368 			   struct sdca_function_data *function)
369 {
370 	struct sdca_init_write *init = function->init_table;
371 	int ret, i;
372 
373 	for (i = 0; i < function->num_init_table; i++) {
374 		ret = regmap_write(regmap, init[i].addr, init[i].val);
375 		if (ret)
376 			return ret;
377 	}
378 
379 	return 0;
380 }
381 EXPORT_SYMBOL_NS(sdca_regmap_write_init, "SND_SOC_SDCA");
382