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