1 // SPDX-License-Identifier: GPL-2.0+
2 //
3 // soc-ops.c -- Generic ASoC operations
4 //
5 // Copyright 2005 Wolfson Microelectronics PLC.
6 // Copyright 2005 Openedhand Ltd.
7 // Copyright (C) 2010 Slimlogic Ltd.
8 // Copyright (C) 2010 Texas Instruments Inc.
9 //
10 // Author: Liam Girdwood <lrg@slimlogic.co.uk>
11 // with code, comments and ideas from :-
12 // Richard Purdie <richard@openedhand.com>
13
14 #include <linux/cleanup.h>
15 #include <linux/module.h>
16 #include <linux/moduleparam.h>
17 #include <linux/init.h>
18 #include <linux/pm.h>
19 #include <linux/bitops.h>
20 #include <linux/ctype.h>
21 #include <linux/slab.h>
22 #include <sound/core.h>
23 #include <sound/jack.h>
24 #include <sound/pcm.h>
25 #include <sound/pcm_params.h>
26 #include <sound/soc.h>
27 #include <sound/initval.h>
28
29 /**
30 * snd_soc_info_enum_double - enumerated double mixer info callback
31 * @kcontrol: mixer control
32 * @uinfo: control element information
33 *
34 * Callback to provide information about a double enumerated
35 * mixer control.
36 *
37 * Returns 0 for success.
38 */
snd_soc_info_enum_double(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)39 int snd_soc_info_enum_double(struct snd_kcontrol *kcontrol,
40 struct snd_ctl_elem_info *uinfo)
41 {
42 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
43
44 return snd_ctl_enum_info(uinfo, e->shift_l == e->shift_r ? 1 : 2,
45 e->items, e->texts);
46 }
47 EXPORT_SYMBOL_GPL(snd_soc_info_enum_double);
48
49 /**
50 * snd_soc_get_enum_double - enumerated double mixer get callback
51 * @kcontrol: mixer control
52 * @ucontrol: control element information
53 *
54 * Callback to get the value of a double enumerated mixer.
55 *
56 * Returns 0 for success.
57 */
snd_soc_get_enum_double(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)58 int snd_soc_get_enum_double(struct snd_kcontrol *kcontrol,
59 struct snd_ctl_elem_value *ucontrol)
60 {
61 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
62 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
63 unsigned int val, item;
64 unsigned int reg_val;
65
66 reg_val = snd_soc_component_read(component, e->reg);
67 val = (reg_val >> e->shift_l) & e->mask;
68 item = snd_soc_enum_val_to_item(e, val);
69 ucontrol->value.enumerated.item[0] = item;
70 if (e->shift_l != e->shift_r) {
71 val = (reg_val >> e->shift_r) & e->mask;
72 item = snd_soc_enum_val_to_item(e, val);
73 ucontrol->value.enumerated.item[1] = item;
74 }
75
76 return 0;
77 }
78 EXPORT_SYMBOL_GPL(snd_soc_get_enum_double);
79
80 /**
81 * snd_soc_put_enum_double - enumerated double mixer put callback
82 * @kcontrol: mixer control
83 * @ucontrol: control element information
84 *
85 * Callback to set the value of a double enumerated mixer.
86 *
87 * Returns 0 for success.
88 */
snd_soc_put_enum_double(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)89 int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
90 struct snd_ctl_elem_value *ucontrol)
91 {
92 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
93 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
94 unsigned int *item = ucontrol->value.enumerated.item;
95 unsigned int val;
96 unsigned int mask;
97
98 if (item[0] >= e->items)
99 return -EINVAL;
100 val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
101 mask = e->mask << e->shift_l;
102 if (e->shift_l != e->shift_r) {
103 if (item[1] >= e->items)
104 return -EINVAL;
105 val |= snd_soc_enum_item_to_val(e, item[1]) << e->shift_r;
106 mask |= e->mask << e->shift_r;
107 }
108
109 return snd_soc_component_update_bits(component, e->reg, mask, val);
110 }
111 EXPORT_SYMBOL_GPL(snd_soc_put_enum_double);
112
soc_mixer_reg_to_ctl(struct soc_mixer_control * mc,unsigned int reg_val,unsigned int mask,unsigned int shift,int max)113 static int soc_mixer_reg_to_ctl(struct soc_mixer_control *mc, unsigned int reg_val,
114 unsigned int mask, unsigned int shift, int max)
115 {
116 int val = (reg_val >> shift) & mask;
117
118 if (mc->sign_bit)
119 val = sign_extend32(val, mc->sign_bit);
120
121 val -= mc->min;
122
123 if (mc->invert)
124 val = max - val;
125
126 return val & mask;
127 }
128
soc_mixer_ctl_to_reg(struct soc_mixer_control * mc,int val,unsigned int mask,unsigned int shift,int max)129 static unsigned int soc_mixer_ctl_to_reg(struct soc_mixer_control *mc, int val,
130 unsigned int mask, unsigned int shift,
131 int max)
132 {
133 unsigned int reg_val;
134
135 if (mc->invert)
136 val = max - val;
137
138 reg_val = val + mc->min;
139
140 return (reg_val & mask) << shift;
141 }
142
soc_mixer_valid_ctl(struct soc_mixer_control * mc,long val,int max)143 static int soc_mixer_valid_ctl(struct soc_mixer_control *mc, long val, int max)
144 {
145 if (val < 0)
146 return -EINVAL;
147
148 if (mc->platform_max && val > mc->platform_max)
149 return -EINVAL;
150
151 if (val > max)
152 return -EINVAL;
153
154 return 0;
155 }
156
soc_mixer_mask(struct soc_mixer_control * mc)157 static int soc_mixer_mask(struct soc_mixer_control *mc)
158 {
159 if (mc->sign_bit)
160 return GENMASK(mc->sign_bit, 0);
161 else
162 return GENMASK(fls(mc->max) - 1, 0);
163 }
164
soc_mixer_sx_mask(struct soc_mixer_control * mc)165 static int soc_mixer_sx_mask(struct soc_mixer_control *mc)
166 {
167 // min + max will take us 1-bit over the size of the mask
168 return GENMASK(fls(mc->min + mc->max) - 2, 0);
169 }
170
soc_info_volsw(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo,struct soc_mixer_control * mc,int max)171 static int soc_info_volsw(struct snd_kcontrol *kcontrol,
172 struct snd_ctl_elem_info *uinfo,
173 struct soc_mixer_control *mc, int max)
174 {
175 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
176
177 if (max == 1) {
178 /* Even two value controls ending in Volume should be integer */
179 const char *vol_string = strstr(kcontrol->id.name, " Volume");
180
181 if (!vol_string || strcmp(vol_string, " Volume"))
182 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
183 }
184
185 if (mc->platform_max && mc->platform_max < max)
186 max = mc->platform_max;
187
188 uinfo->count = snd_soc_volsw_is_stereo(mc) ? 2 : 1;
189 uinfo->value.integer.min = 0;
190 uinfo->value.integer.max = max;
191
192 return 0;
193 }
194
soc_put_volsw(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol,struct soc_mixer_control * mc,int mask,int max)195 static int soc_put_volsw(struct snd_kcontrol *kcontrol,
196 struct snd_ctl_elem_value *ucontrol,
197 struct soc_mixer_control *mc, int mask, int max)
198 {
199 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
200 unsigned int val1, val_mask;
201 unsigned int val2 = 0;
202 bool double_r = false;
203 int ret;
204
205 ret = soc_mixer_valid_ctl(mc, ucontrol->value.integer.value[0], max);
206 if (ret)
207 return ret;
208
209 val1 = soc_mixer_ctl_to_reg(mc, ucontrol->value.integer.value[0],
210 mask, mc->shift, max);
211 val_mask = mask << mc->shift;
212
213 if (snd_soc_volsw_is_stereo(mc)) {
214 ret = soc_mixer_valid_ctl(mc, ucontrol->value.integer.value[1], max);
215 if (ret)
216 return ret;
217
218 if (mc->reg == mc->rreg) {
219 val1 |= soc_mixer_ctl_to_reg(mc,
220 ucontrol->value.integer.value[1],
221 mask, mc->rshift, max);
222 val_mask |= mask << mc->rshift;
223 } else {
224 val2 = soc_mixer_ctl_to_reg(mc,
225 ucontrol->value.integer.value[1],
226 mask, mc->shift, max);
227 double_r = true;
228 }
229 }
230
231 ret = snd_soc_component_update_bits(component, mc->reg, val_mask, val1);
232 if (ret < 0)
233 return ret;
234
235 if (double_r) {
236 int err = snd_soc_component_update_bits(component, mc->rreg,
237 val_mask, val2);
238 /* Don't drop change flag */
239 if (err)
240 return err;
241 }
242
243 return ret;
244 }
245
soc_get_volsw(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol,struct soc_mixer_control * mc,int mask,int max)246 static int soc_get_volsw(struct snd_kcontrol *kcontrol,
247 struct snd_ctl_elem_value *ucontrol,
248 struct soc_mixer_control *mc, int mask, int max)
249 {
250 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
251 unsigned int reg_val;
252 int val;
253
254 reg_val = snd_soc_component_read(component, mc->reg);
255 val = soc_mixer_reg_to_ctl(mc, reg_val, mask, mc->shift, max);
256
257 ucontrol->value.integer.value[0] = val;
258
259 if (snd_soc_volsw_is_stereo(mc)) {
260 if (mc->reg == mc->rreg) {
261 val = soc_mixer_reg_to_ctl(mc, reg_val, mask, mc->rshift, max);
262 } else {
263 reg_val = snd_soc_component_read(component, mc->rreg);
264 val = soc_mixer_reg_to_ctl(mc, reg_val, mask, mc->shift, max);
265 }
266
267 ucontrol->value.integer.value[1] = val;
268 }
269
270 return 0;
271 }
272
273 /**
274 * snd_soc_info_volsw - single mixer info callback with range.
275 * @kcontrol: mixer control
276 * @uinfo: control element information
277 *
278 * Callback to provide information, with a range, about a single mixer control,
279 * or a double mixer control that spans 2 registers.
280 *
281 * Returns 0 for success.
282 */
snd_soc_info_volsw(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)283 int snd_soc_info_volsw(struct snd_kcontrol *kcontrol,
284 struct snd_ctl_elem_info *uinfo)
285 {
286 struct soc_mixer_control *mc =
287 (struct soc_mixer_control *)kcontrol->private_value;
288
289 return soc_info_volsw(kcontrol, uinfo, mc, mc->max - mc->min);
290 }
291 EXPORT_SYMBOL_GPL(snd_soc_info_volsw);
292
293 /**
294 * snd_soc_info_volsw_sx - Mixer info callback for SX TLV controls
295 * @kcontrol: mixer control
296 * @uinfo: control element information
297 *
298 * Callback to provide information about a single mixer control, or a double
299 * mixer control that spans 2 registers of the SX TLV type. SX TLV controls
300 * have a range that represents both positive and negative values either side
301 * of zero but without a sign bit. min is the minimum register value, max is
302 * the number of steps.
303 *
304 * Returns 0 for success.
305 */
snd_soc_info_volsw_sx(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)306 int snd_soc_info_volsw_sx(struct snd_kcontrol *kcontrol,
307 struct snd_ctl_elem_info *uinfo)
308 {
309 struct soc_mixer_control *mc =
310 (struct soc_mixer_control *)kcontrol->private_value;
311
312 return soc_info_volsw(kcontrol, uinfo, mc, mc->max);
313 }
314 EXPORT_SYMBOL_GPL(snd_soc_info_volsw_sx);
315
316 /**
317 * snd_soc_get_volsw - single mixer get callback with range
318 * @kcontrol: mixer control
319 * @ucontrol: control element information
320 *
321 * Callback to get the value, within a range, of a single mixer control, or a
322 * double mixer control that spans 2 registers.
323 *
324 * Returns 0 for success.
325 */
snd_soc_get_volsw(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)326 int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
327 struct snd_ctl_elem_value *ucontrol)
328 {
329 struct soc_mixer_control *mc =
330 (struct soc_mixer_control *)kcontrol->private_value;
331 unsigned int mask = soc_mixer_mask(mc);
332
333 return soc_get_volsw(kcontrol, ucontrol, mc, mask, mc->max - mc->min);
334 }
335 EXPORT_SYMBOL_GPL(snd_soc_get_volsw);
336
337 /**
338 * snd_soc_put_volsw - single mixer put callback with range
339 * @kcontrol: mixer control
340 * @ucontrol: control element information
341 *
342 * Callback to set the value , within a range, of a single mixer control, or
343 * a double mixer control that spans 2 registers.
344 *
345 * Returns 0 for success.
346 */
snd_soc_put_volsw(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)347 int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
348 struct snd_ctl_elem_value *ucontrol)
349 {
350 struct soc_mixer_control *mc =
351 (struct soc_mixer_control *)kcontrol->private_value;
352 unsigned int mask = soc_mixer_mask(mc);
353
354 return soc_put_volsw(kcontrol, ucontrol, mc, mask, mc->max - mc->min);
355 }
356 EXPORT_SYMBOL_GPL(snd_soc_put_volsw);
357
358 /**
359 * snd_soc_get_volsw_sx - single mixer get callback
360 * @kcontrol: mixer control
361 * @ucontrol: control element information
362 *
363 * Callback to get the value of a single mixer control, or a double mixer
364 * control that spans 2 registers.
365 *
366 * Returns 0 for success.
367 */
snd_soc_get_volsw_sx(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)368 int snd_soc_get_volsw_sx(struct snd_kcontrol *kcontrol,
369 struct snd_ctl_elem_value *ucontrol)
370 {
371 struct soc_mixer_control *mc =
372 (struct soc_mixer_control *)kcontrol->private_value;
373 unsigned int mask = soc_mixer_sx_mask(mc);
374
375 return soc_get_volsw(kcontrol, ucontrol, mc, mask, mc->max);
376 }
377 EXPORT_SYMBOL_GPL(snd_soc_get_volsw_sx);
378
379 /**
380 * snd_soc_put_volsw_sx - double mixer set callback
381 * @kcontrol: mixer control
382 * @ucontrol: control element information
383 *
384 * Callback to set the value of a double mixer control that spans 2 registers.
385 *
386 * Returns 0 for success.
387 */
snd_soc_put_volsw_sx(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)388 int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
389 struct snd_ctl_elem_value *ucontrol)
390 {
391 struct soc_mixer_control *mc =
392 (struct soc_mixer_control *)kcontrol->private_value;
393 unsigned int mask = soc_mixer_sx_mask(mc);
394
395 return soc_put_volsw(kcontrol, ucontrol, mc, mask, mc->max);
396 }
397 EXPORT_SYMBOL_GPL(snd_soc_put_volsw_sx);
398
snd_soc_clip_to_platform_max(struct snd_kcontrol * kctl)399 static int snd_soc_clip_to_platform_max(struct snd_kcontrol *kctl)
400 {
401 struct soc_mixer_control *mc = (struct soc_mixer_control *)kctl->private_value;
402 struct snd_ctl_elem_value *uctl;
403 int ret;
404
405 if (!mc->platform_max)
406 return 0;
407
408 uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
409 if (!uctl)
410 return -ENOMEM;
411
412 ret = kctl->get(kctl, uctl);
413 if (ret < 0)
414 goto out;
415
416 if (uctl->value.integer.value[0] > mc->platform_max)
417 uctl->value.integer.value[0] = mc->platform_max;
418
419 if (snd_soc_volsw_is_stereo(mc) &&
420 uctl->value.integer.value[1] > mc->platform_max)
421 uctl->value.integer.value[1] = mc->platform_max;
422
423 ret = kctl->put(kctl, uctl);
424
425 out:
426 kfree(uctl);
427 return ret;
428 }
429
430 /**
431 * snd_soc_limit_volume - Set new limit to an existing volume control.
432 *
433 * @card: where to look for the control
434 * @name: Name of the control
435 * @max: new maximum limit
436 *
437 * Return 0 for success, else error.
438 */
snd_soc_limit_volume(struct snd_soc_card * card,const char * name,int max)439 int snd_soc_limit_volume(struct snd_soc_card *card, const char *name, int max)
440 {
441 struct snd_kcontrol *kctl;
442 int ret = -EINVAL;
443
444 /* Sanity check for name and max */
445 if (unlikely(!name || max <= 0))
446 return -EINVAL;
447
448 kctl = snd_soc_card_get_kcontrol(card, name);
449 if (kctl) {
450 struct soc_mixer_control *mc =
451 (struct soc_mixer_control *)kctl->private_value;
452
453 if (max <= mc->max - mc->min) {
454 mc->platform_max = max;
455 ret = snd_soc_clip_to_platform_max(kctl);
456 }
457 }
458
459 return ret;
460 }
461 EXPORT_SYMBOL_GPL(snd_soc_limit_volume);
462
snd_soc_bytes_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)463 int snd_soc_bytes_info(struct snd_kcontrol *kcontrol,
464 struct snd_ctl_elem_info *uinfo)
465 {
466 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
467 struct soc_bytes *params = (void *)kcontrol->private_value;
468
469 uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
470 uinfo->count = params->num_regs * component->val_bytes;
471
472 return 0;
473 }
474 EXPORT_SYMBOL_GPL(snd_soc_bytes_info);
475
snd_soc_bytes_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)476 int snd_soc_bytes_get(struct snd_kcontrol *kcontrol,
477 struct snd_ctl_elem_value *ucontrol)
478 {
479 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
480 struct soc_bytes *params = (void *)kcontrol->private_value;
481 int ret;
482
483 if (component->regmap)
484 ret = regmap_raw_read(component->regmap, params->base,
485 ucontrol->value.bytes.data,
486 params->num_regs * component->val_bytes);
487 else
488 ret = -EINVAL;
489
490 /* Hide any masked bytes to ensure consistent data reporting */
491 if (ret == 0 && params->mask) {
492 switch (component->val_bytes) {
493 case 1:
494 ucontrol->value.bytes.data[0] &= ~params->mask;
495 break;
496 case 2:
497 ((u16 *)(&ucontrol->value.bytes.data))[0]
498 &= cpu_to_be16(~params->mask);
499 break;
500 case 4:
501 ((u32 *)(&ucontrol->value.bytes.data))[0]
502 &= cpu_to_be32(~params->mask);
503 break;
504 default:
505 return -EINVAL;
506 }
507 }
508
509 return ret;
510 }
511 EXPORT_SYMBOL_GPL(snd_soc_bytes_get);
512
snd_soc_bytes_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)513 int snd_soc_bytes_put(struct snd_kcontrol *kcontrol,
514 struct snd_ctl_elem_value *ucontrol)
515 {
516 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
517 struct soc_bytes *params = (void *)kcontrol->private_value;
518 unsigned int val, mask;
519 int ret, len;
520
521 if (!component->regmap || !params->num_regs)
522 return -EINVAL;
523
524 len = params->num_regs * component->val_bytes;
525
526 void *data __free(kfree) = kmemdup(ucontrol->value.bytes.data, len,
527 GFP_KERNEL | GFP_DMA);
528 if (!data)
529 return -ENOMEM;
530
531 /*
532 * If we've got a mask then we need to preserve the register
533 * bits. We shouldn't modify the incoming data so take a
534 * copy.
535 */
536 if (params->mask) {
537 ret = regmap_read(component->regmap, params->base, &val);
538 if (ret != 0)
539 return ret;
540
541 val &= params->mask;
542
543 switch (component->val_bytes) {
544 case 1:
545 ((u8 *)data)[0] &= ~params->mask;
546 ((u8 *)data)[0] |= val;
547 break;
548 case 2:
549 mask = ~params->mask;
550 ret = regmap_parse_val(component->regmap, &mask, &mask);
551 if (ret != 0)
552 return ret;
553
554 ((u16 *)data)[0] &= mask;
555
556 ret = regmap_parse_val(component->regmap, &val, &val);
557 if (ret != 0)
558 return ret;
559
560 ((u16 *)data)[0] |= val;
561 break;
562 case 4:
563 mask = ~params->mask;
564 ret = regmap_parse_val(component->regmap, &mask, &mask);
565 if (ret != 0)
566 return ret;
567
568 ((u32 *)data)[0] &= mask;
569
570 ret = regmap_parse_val(component->regmap, &val, &val);
571 if (ret != 0)
572 return ret;
573
574 ((u32 *)data)[0] |= val;
575 break;
576 default:
577 return -EINVAL;
578 }
579 }
580
581 return regmap_raw_write(component->regmap, params->base, data, len);
582 }
583 EXPORT_SYMBOL_GPL(snd_soc_bytes_put);
584
snd_soc_bytes_info_ext(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * ucontrol)585 int snd_soc_bytes_info_ext(struct snd_kcontrol *kcontrol,
586 struct snd_ctl_elem_info *ucontrol)
587 {
588 struct soc_bytes_ext *params = (void *)kcontrol->private_value;
589
590 ucontrol->type = SNDRV_CTL_ELEM_TYPE_BYTES;
591 ucontrol->count = params->max;
592
593 return 0;
594 }
595 EXPORT_SYMBOL_GPL(snd_soc_bytes_info_ext);
596
snd_soc_bytes_tlv_callback(struct snd_kcontrol * kcontrol,int op_flag,unsigned int size,unsigned int __user * tlv)597 int snd_soc_bytes_tlv_callback(struct snd_kcontrol *kcontrol, int op_flag,
598 unsigned int size, unsigned int __user *tlv)
599 {
600 struct soc_bytes_ext *params = (void *)kcontrol->private_value;
601 unsigned int count = size < params->max ? size : params->max;
602 int ret = -ENXIO;
603
604 switch (op_flag) {
605 case SNDRV_CTL_TLV_OP_READ:
606 if (params->get)
607 ret = params->get(kcontrol, tlv, count);
608 break;
609 case SNDRV_CTL_TLV_OP_WRITE:
610 if (params->put)
611 ret = params->put(kcontrol, tlv, count);
612 break;
613 }
614
615 return ret;
616 }
617 EXPORT_SYMBOL_GPL(snd_soc_bytes_tlv_callback);
618
619 /**
620 * snd_soc_info_xr_sx - signed multi register info callback
621 * @kcontrol: mreg control
622 * @uinfo: control element information
623 *
624 * Callback to provide information of a control that can span multiple
625 * codec registers which together forms a single signed value. Note
626 * that unlike the non-xr variant of sx controls these may or may not
627 * include the sign bit, depending on nbits, and there is no shift.
628 *
629 * Returns 0 for success.
630 */
snd_soc_info_xr_sx(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)631 int snd_soc_info_xr_sx(struct snd_kcontrol *kcontrol,
632 struct snd_ctl_elem_info *uinfo)
633 {
634 struct soc_mreg_control *mc =
635 (struct soc_mreg_control *)kcontrol->private_value;
636
637 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
638 uinfo->count = 1;
639 uinfo->value.integer.min = mc->min;
640 uinfo->value.integer.max = mc->max;
641
642 return 0;
643 }
644 EXPORT_SYMBOL_GPL(snd_soc_info_xr_sx);
645
646 /**
647 * snd_soc_get_xr_sx - signed multi register get callback
648 * @kcontrol: mreg control
649 * @ucontrol: control element information
650 *
651 * Callback to get the value of a control that can span multiple codec
652 * registers which together forms a single signed value. The control
653 * supports specifying total no of bits used to allow for bitfields
654 * across the multiple codec registers. Note that unlike the non-xr
655 * variant of sx controls these may or may not include the sign bit,
656 * depending on nbits, and there is no shift.
657 *
658 * Returns 0 for success.
659 */
snd_soc_get_xr_sx(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)660 int snd_soc_get_xr_sx(struct snd_kcontrol *kcontrol,
661 struct snd_ctl_elem_value *ucontrol)
662 {
663 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
664 struct soc_mreg_control *mc =
665 (struct soc_mreg_control *)kcontrol->private_value;
666 unsigned int regbase = mc->regbase;
667 unsigned int regcount = mc->regcount;
668 unsigned int regwshift = component->val_bytes * BITS_PER_BYTE;
669 unsigned int regwmask = GENMASK(regwshift - 1, 0);
670 unsigned long mask = GENMASK(mc->nbits - 1, 0);
671 long val = 0;
672 unsigned int i;
673
674 for (i = 0; i < regcount; i++) {
675 unsigned int regval = snd_soc_component_read(component, regbase + i);
676
677 val |= (regval & regwmask) << (regwshift * (regcount - i - 1));
678 }
679 val &= mask;
680 if (mc->min < 0 && val > mc->max)
681 val |= ~mask;
682 if (mc->invert)
683 val = mc->max - val;
684 ucontrol->value.integer.value[0] = val;
685
686 return 0;
687 }
688 EXPORT_SYMBOL_GPL(snd_soc_get_xr_sx);
689
690 /**
691 * snd_soc_put_xr_sx - signed multi register get callback
692 * @kcontrol: mreg control
693 * @ucontrol: control element information
694 *
695 * Callback to set the value of a control that can span multiple codec
696 * registers which together forms a single signed value. The control
697 * supports specifying total no of bits used to allow for bitfields
698 * across the multiple codec registers. Note that unlike the non-xr
699 * variant of sx controls these may or may not include the sign bit,
700 * depending on nbits, and there is no shift.
701 *
702 * Returns 0 for success.
703 */
snd_soc_put_xr_sx(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)704 int snd_soc_put_xr_sx(struct snd_kcontrol *kcontrol,
705 struct snd_ctl_elem_value *ucontrol)
706 {
707 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
708 struct soc_mreg_control *mc =
709 (struct soc_mreg_control *)kcontrol->private_value;
710 unsigned int regbase = mc->regbase;
711 unsigned int regcount = mc->regcount;
712 unsigned int regwshift = component->val_bytes * BITS_PER_BYTE;
713 unsigned int regwmask = GENMASK(regwshift - 1, 0);
714 unsigned long mask = GENMASK(mc->nbits - 1, 0);
715 long val = ucontrol->value.integer.value[0];
716 int ret = 0;
717 unsigned int i;
718
719 if (val < mc->min || val > mc->max)
720 return -EINVAL;
721 if (mc->invert)
722 val = mc->max - val;
723 val &= mask;
724 for (i = 0; i < regcount; i++) {
725 unsigned int regval = (val >> (regwshift * (regcount - i - 1))) &
726 regwmask;
727 unsigned int regmask = (mask >> (regwshift * (regcount - i - 1))) &
728 regwmask;
729 int err = snd_soc_component_update_bits(component, regbase + i,
730 regmask, regval);
731
732 if (err < 0)
733 return err;
734 if (err > 0)
735 ret = err;
736 }
737
738 return ret;
739 }
740 EXPORT_SYMBOL_GPL(snd_soc_put_xr_sx);
741
742 /**
743 * snd_soc_get_strobe - strobe get callback
744 * @kcontrol: mixer control
745 * @ucontrol: control element information
746 *
747 * Callback get the value of a strobe mixer control.
748 *
749 * Returns 0 for success.
750 */
snd_soc_get_strobe(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)751 int snd_soc_get_strobe(struct snd_kcontrol *kcontrol,
752 struct snd_ctl_elem_value *ucontrol)
753 {
754 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
755 struct soc_mixer_control *mc =
756 (struct soc_mixer_control *)kcontrol->private_value;
757 unsigned int invert = mc->invert != 0;
758 unsigned int mask = BIT(mc->shift);
759 unsigned int val;
760
761 val = snd_soc_component_read(component, mc->reg);
762 val &= mask;
763
764 if (mc->shift != 0 && val != 0)
765 val = val >> mc->shift;
766
767 ucontrol->value.enumerated.item[0] = val ^ invert;
768
769 return 0;
770 }
771 EXPORT_SYMBOL_GPL(snd_soc_get_strobe);
772
773 /**
774 * snd_soc_put_strobe - strobe put callback
775 * @kcontrol: mixer control
776 * @ucontrol: control element information
777 *
778 * Callback strobe a register bit to high then low (or the inverse)
779 * in one pass of a single mixer enum control.
780 *
781 * Returns 1 for success.
782 */
snd_soc_put_strobe(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)783 int snd_soc_put_strobe(struct snd_kcontrol *kcontrol,
784 struct snd_ctl_elem_value *ucontrol)
785 {
786 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
787 struct soc_mixer_control *mc =
788 (struct soc_mixer_control *)kcontrol->private_value;
789 unsigned int strobe = ucontrol->value.enumerated.item[0] != 0;
790 unsigned int invert = mc->invert != 0;
791 unsigned int mask = BIT(mc->shift);
792 unsigned int val1 = (strobe ^ invert) ? mask : 0;
793 unsigned int val2 = (strobe ^ invert) ? 0 : mask;
794 int ret;
795
796 ret = snd_soc_component_update_bits(component, mc->reg, mask, val1);
797 if (ret < 0)
798 return ret;
799
800 return snd_soc_component_update_bits(component, mc->reg, mask, val2);
801 }
802 EXPORT_SYMBOL_GPL(snd_soc_put_strobe);
803