xref: /openbmc/linux/sound/soc/soc-ops.c (revision 4949009e)
1 /*
2  * soc-ops.c  --  Generic ASoC operations
3  *
4  * Copyright 2005 Wolfson Microelectronics PLC.
5  * Copyright 2005 Openedhand Ltd.
6  * Copyright (C) 2010 Slimlogic Ltd.
7  * Copyright (C) 2010 Texas Instruments Inc.
8  *
9  * Author: Liam Girdwood <lrg@slimlogic.co.uk>
10  *         with code, comments and ideas from :-
11  *         Richard Purdie <richard@openedhand.com>
12  *
13  *  This program is free software; you can redistribute  it and/or modify it
14  *  under  the terms of  the GNU General  Public License as published by the
15  *  Free Software Foundation;  either version 2 of the  License, or (at your
16  *  option) any later version.
17  */
18 
19 #include <linux/module.h>
20 #include <linux/moduleparam.h>
21 #include <linux/init.h>
22 #include <linux/delay.h>
23 #include <linux/pm.h>
24 #include <linux/bitops.h>
25 #include <linux/ctype.h>
26 #include <linux/slab.h>
27 #include <sound/core.h>
28 #include <sound/jack.h>
29 #include <sound/pcm.h>
30 #include <sound/pcm_params.h>
31 #include <sound/soc.h>
32 #include <sound/soc-dpcm.h>
33 #include <sound/initval.h>
34 
35 /**
36  * snd_soc_info_enum_double - enumerated double mixer info callback
37  * @kcontrol: mixer control
38  * @uinfo: control element information
39  *
40  * Callback to provide information about a double enumerated
41  * mixer control.
42  *
43  * Returns 0 for success.
44  */
45 int snd_soc_info_enum_double(struct snd_kcontrol *kcontrol,
46 	struct snd_ctl_elem_info *uinfo)
47 {
48 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
49 
50 	return snd_ctl_enum_info(uinfo, e->shift_l == e->shift_r ? 1 : 2,
51 				 e->items, e->texts);
52 }
53 EXPORT_SYMBOL_GPL(snd_soc_info_enum_double);
54 
55 /**
56  * snd_soc_get_enum_double - enumerated double mixer get callback
57  * @kcontrol: mixer control
58  * @ucontrol: control element information
59  *
60  * Callback to get the value of a double enumerated mixer.
61  *
62  * Returns 0 for success.
63  */
64 int snd_soc_get_enum_double(struct snd_kcontrol *kcontrol,
65 	struct snd_ctl_elem_value *ucontrol)
66 {
67 	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
68 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
69 	unsigned int val, item;
70 	unsigned int reg_val;
71 	int ret;
72 
73 	ret = snd_soc_component_read(component, e->reg, &reg_val);
74 	if (ret)
75 		return ret;
76 	val = (reg_val >> e->shift_l) & e->mask;
77 	item = snd_soc_enum_val_to_item(e, val);
78 	ucontrol->value.enumerated.item[0] = item;
79 	if (e->shift_l != e->shift_r) {
80 		val = (reg_val >> e->shift_l) & e->mask;
81 		item = snd_soc_enum_val_to_item(e, val);
82 		ucontrol->value.enumerated.item[1] = item;
83 	}
84 
85 	return 0;
86 }
87 EXPORT_SYMBOL_GPL(snd_soc_get_enum_double);
88 
89 /**
90  * snd_soc_put_enum_double - enumerated double mixer put callback
91  * @kcontrol: mixer control
92  * @ucontrol: control element information
93  *
94  * Callback to set the value of a double enumerated mixer.
95  *
96  * Returns 0 for success.
97  */
98 int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
99 	struct snd_ctl_elem_value *ucontrol)
100 {
101 	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
102 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
103 	unsigned int *item = ucontrol->value.enumerated.item;
104 	unsigned int val;
105 	unsigned int mask;
106 
107 	if (item[0] >= e->items)
108 		return -EINVAL;
109 	val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
110 	mask = e->mask << e->shift_l;
111 	if (e->shift_l != e->shift_r) {
112 		if (item[1] >= e->items)
113 			return -EINVAL;
114 		val |= snd_soc_enum_item_to_val(e, item[1]) << e->shift_r;
115 		mask |= e->mask << e->shift_r;
116 	}
117 
118 	return snd_soc_component_update_bits(component, e->reg, mask, val);
119 }
120 EXPORT_SYMBOL_GPL(snd_soc_put_enum_double);
121 
122 /**
123  * snd_soc_read_signed - Read a codec register and interprete as signed value
124  * @component: component
125  * @reg: Register to read
126  * @mask: Mask to use after shifting the register value
127  * @shift: Right shift of register value
128  * @sign_bit: Bit that describes if a number is negative or not.
129  * @signed_val: Pointer to where the read value should be stored
130  *
131  * This functions reads a codec register. The register value is shifted right
132  * by 'shift' bits and masked with the given 'mask'. Afterwards it translates
133  * the given registervalue into a signed integer if sign_bit is non-zero.
134  *
135  * Returns 0 on sucess, otherwise an error value
136  */
137 static int snd_soc_read_signed(struct snd_soc_component *component,
138 	unsigned int reg, unsigned int mask, unsigned int shift,
139 	unsigned int sign_bit, int *signed_val)
140 {
141 	int ret;
142 	unsigned int val;
143 
144 	ret = snd_soc_component_read(component, reg, &val);
145 	if (ret < 0)
146 		return ret;
147 
148 	val = (val >> shift) & mask;
149 
150 	if (!sign_bit) {
151 		*signed_val = val;
152 		return 0;
153 	}
154 
155 	/* non-negative number */
156 	if (!(val & BIT(sign_bit))) {
157 		*signed_val = val;
158 		return 0;
159 	}
160 
161 	ret = val;
162 
163 	/*
164 	 * The register most probably does not contain a full-sized int.
165 	 * Instead we have an arbitrary number of bits in a signed
166 	 * representation which has to be translated into a full-sized int.
167 	 * This is done by filling up all bits above the sign-bit.
168 	 */
169 	ret |= ~((int)(BIT(sign_bit) - 1));
170 
171 	*signed_val = ret;
172 
173 	return 0;
174 }
175 
176 /**
177  * snd_soc_info_volsw - single mixer info callback
178  * @kcontrol: mixer control
179  * @uinfo: control element information
180  *
181  * Callback to provide information about a single mixer control, or a double
182  * mixer control that spans 2 registers.
183  *
184  * Returns 0 for success.
185  */
186 int snd_soc_info_volsw(struct snd_kcontrol *kcontrol,
187 	struct snd_ctl_elem_info *uinfo)
188 {
189 	struct soc_mixer_control *mc =
190 		(struct soc_mixer_control *)kcontrol->private_value;
191 	int platform_max;
192 
193 	if (!mc->platform_max)
194 		mc->platform_max = mc->max;
195 	platform_max = mc->platform_max;
196 
197 	if (platform_max == 1 && !strstr(kcontrol->id.name, " Volume"))
198 		uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
199 	else
200 		uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
201 
202 	uinfo->count = snd_soc_volsw_is_stereo(mc) ? 2 : 1;
203 	uinfo->value.integer.min = 0;
204 	uinfo->value.integer.max = platform_max - mc->min;
205 	return 0;
206 }
207 EXPORT_SYMBOL_GPL(snd_soc_info_volsw);
208 
209 /**
210  * snd_soc_get_volsw - single mixer get callback
211  * @kcontrol: mixer control
212  * @ucontrol: control element information
213  *
214  * Callback to get the value of a single mixer control, or a double mixer
215  * control that spans 2 registers.
216  *
217  * Returns 0 for success.
218  */
219 int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
220 	struct snd_ctl_elem_value *ucontrol)
221 {
222 	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
223 	struct soc_mixer_control *mc =
224 		(struct soc_mixer_control *)kcontrol->private_value;
225 	unsigned int reg = mc->reg;
226 	unsigned int reg2 = mc->rreg;
227 	unsigned int shift = mc->shift;
228 	unsigned int rshift = mc->rshift;
229 	int max = mc->max;
230 	int min = mc->min;
231 	int sign_bit = mc->sign_bit;
232 	unsigned int mask = (1 << fls(max)) - 1;
233 	unsigned int invert = mc->invert;
234 	int val;
235 	int ret;
236 
237 	if (sign_bit)
238 		mask = BIT(sign_bit + 1) - 1;
239 
240 	ret = snd_soc_read_signed(component, reg, mask, shift, sign_bit, &val);
241 	if (ret)
242 		return ret;
243 
244 	ucontrol->value.integer.value[0] = val - min;
245 	if (invert)
246 		ucontrol->value.integer.value[0] =
247 			max - ucontrol->value.integer.value[0];
248 
249 	if (snd_soc_volsw_is_stereo(mc)) {
250 		if (reg == reg2)
251 			ret = snd_soc_read_signed(component, reg, mask, rshift,
252 				sign_bit, &val);
253 		else
254 			ret = snd_soc_read_signed(component, reg2, mask, shift,
255 				sign_bit, &val);
256 		if (ret)
257 			return ret;
258 
259 		ucontrol->value.integer.value[1] = val - min;
260 		if (invert)
261 			ucontrol->value.integer.value[1] =
262 				max - ucontrol->value.integer.value[1];
263 	}
264 
265 	return 0;
266 }
267 EXPORT_SYMBOL_GPL(snd_soc_get_volsw);
268 
269 /**
270  * snd_soc_put_volsw - single mixer put callback
271  * @kcontrol: mixer control
272  * @ucontrol: control element information
273  *
274  * Callback to set the value of a single mixer control, or a double mixer
275  * control that spans 2 registers.
276  *
277  * Returns 0 for success.
278  */
279 int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
280 	struct snd_ctl_elem_value *ucontrol)
281 {
282 	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
283 	struct soc_mixer_control *mc =
284 		(struct soc_mixer_control *)kcontrol->private_value;
285 	unsigned int reg = mc->reg;
286 	unsigned int reg2 = mc->rreg;
287 	unsigned int shift = mc->shift;
288 	unsigned int rshift = mc->rshift;
289 	int max = mc->max;
290 	int min = mc->min;
291 	unsigned int sign_bit = mc->sign_bit;
292 	unsigned int mask = (1 << fls(max)) - 1;
293 	unsigned int invert = mc->invert;
294 	int err;
295 	bool type_2r = false;
296 	unsigned int val2 = 0;
297 	unsigned int val, val_mask;
298 
299 	if (sign_bit)
300 		mask = BIT(sign_bit + 1) - 1;
301 
302 	val = ((ucontrol->value.integer.value[0] + min) & mask);
303 	if (invert)
304 		val = max - val;
305 	val_mask = mask << shift;
306 	val = val << shift;
307 	if (snd_soc_volsw_is_stereo(mc)) {
308 		val2 = ((ucontrol->value.integer.value[1] + min) & mask);
309 		if (invert)
310 			val2 = max - val2;
311 		if (reg == reg2) {
312 			val_mask |= mask << rshift;
313 			val |= val2 << rshift;
314 		} else {
315 			val2 = val2 << shift;
316 			type_2r = true;
317 		}
318 	}
319 	err = snd_soc_component_update_bits(component, reg, val_mask, val);
320 	if (err < 0)
321 		return err;
322 
323 	if (type_2r)
324 		err = snd_soc_component_update_bits(component, reg2, val_mask,
325 			val2);
326 
327 	return err;
328 }
329 EXPORT_SYMBOL_GPL(snd_soc_put_volsw);
330 
331 /**
332  * snd_soc_get_volsw_sx - single mixer get callback
333  * @kcontrol: mixer control
334  * @ucontrol: control element information
335  *
336  * Callback to get the value of a single mixer control, or a double mixer
337  * control that spans 2 registers.
338  *
339  * Returns 0 for success.
340  */
341 int snd_soc_get_volsw_sx(struct snd_kcontrol *kcontrol,
342 		      struct snd_ctl_elem_value *ucontrol)
343 {
344 	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
345 	struct soc_mixer_control *mc =
346 	    (struct soc_mixer_control *)kcontrol->private_value;
347 	unsigned int reg = mc->reg;
348 	unsigned int reg2 = mc->rreg;
349 	unsigned int shift = mc->shift;
350 	unsigned int rshift = mc->rshift;
351 	int max = mc->max;
352 	int min = mc->min;
353 	int mask = (1 << (fls(min + max) - 1)) - 1;
354 	unsigned int val;
355 	int ret;
356 
357 	ret = snd_soc_component_read(component, reg, &val);
358 	if (ret < 0)
359 		return ret;
360 
361 	ucontrol->value.integer.value[0] = ((val >> shift) - min) & mask;
362 
363 	if (snd_soc_volsw_is_stereo(mc)) {
364 		ret = snd_soc_component_read(component, reg2, &val);
365 		if (ret < 0)
366 			return ret;
367 
368 		val = ((val >> rshift) - min) & mask;
369 		ucontrol->value.integer.value[1] = val;
370 	}
371 
372 	return 0;
373 }
374 EXPORT_SYMBOL_GPL(snd_soc_get_volsw_sx);
375 
376 /**
377  * snd_soc_put_volsw_sx - double mixer set callback
378  * @kcontrol: mixer control
379  * @uinfo: control element information
380  *
381  * Callback to set the value of a double mixer control that spans 2 registers.
382  *
383  * Returns 0 for success.
384  */
385 int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
386 			 struct snd_ctl_elem_value *ucontrol)
387 {
388 	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
389 	struct soc_mixer_control *mc =
390 	    (struct soc_mixer_control *)kcontrol->private_value;
391 
392 	unsigned int reg = mc->reg;
393 	unsigned int reg2 = mc->rreg;
394 	unsigned int shift = mc->shift;
395 	unsigned int rshift = mc->rshift;
396 	int max = mc->max;
397 	int min = mc->min;
398 	int mask = (1 << (fls(min + max) - 1)) - 1;
399 	int err = 0;
400 	unsigned int val, val_mask, val2 = 0;
401 
402 	val_mask = mask << shift;
403 	val = (ucontrol->value.integer.value[0] + min) & mask;
404 	val = val << shift;
405 
406 	err = snd_soc_component_update_bits(component, reg, val_mask, val);
407 	if (err < 0)
408 		return err;
409 
410 	if (snd_soc_volsw_is_stereo(mc)) {
411 		val_mask = mask << rshift;
412 		val2 = (ucontrol->value.integer.value[1] + min) & mask;
413 		val2 = val2 << rshift;
414 
415 		err = snd_soc_component_update_bits(component, reg2, val_mask,
416 			val2);
417 	}
418 	return err;
419 }
420 EXPORT_SYMBOL_GPL(snd_soc_put_volsw_sx);
421 
422 /**
423  * snd_soc_info_volsw_range - single mixer info callback with range.
424  * @kcontrol: mixer control
425  * @uinfo: control element information
426  *
427  * Callback to provide information, within a range, about a single
428  * mixer control.
429  *
430  * returns 0 for success.
431  */
432 int snd_soc_info_volsw_range(struct snd_kcontrol *kcontrol,
433 	struct snd_ctl_elem_info *uinfo)
434 {
435 	struct soc_mixer_control *mc =
436 		(struct soc_mixer_control *)kcontrol->private_value;
437 	int platform_max;
438 	int min = mc->min;
439 
440 	if (!mc->platform_max)
441 		mc->platform_max = mc->max;
442 	platform_max = mc->platform_max;
443 
444 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
445 	uinfo->count = snd_soc_volsw_is_stereo(mc) ? 2 : 1;
446 	uinfo->value.integer.min = 0;
447 	uinfo->value.integer.max = platform_max - min;
448 
449 	return 0;
450 }
451 EXPORT_SYMBOL_GPL(snd_soc_info_volsw_range);
452 
453 /**
454  * snd_soc_put_volsw_range - single mixer put value callback with range.
455  * @kcontrol: mixer control
456  * @ucontrol: control element information
457  *
458  * Callback to set the value, within a range, for a single mixer control.
459  *
460  * Returns 0 for success.
461  */
462 int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
463 	struct snd_ctl_elem_value *ucontrol)
464 {
465 	struct soc_mixer_control *mc =
466 		(struct soc_mixer_control *)kcontrol->private_value;
467 	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
468 	unsigned int reg = mc->reg;
469 	unsigned int rreg = mc->rreg;
470 	unsigned int shift = mc->shift;
471 	int min = mc->min;
472 	int max = mc->max;
473 	unsigned int mask = (1 << fls(max)) - 1;
474 	unsigned int invert = mc->invert;
475 	unsigned int val, val_mask;
476 	int ret;
477 
478 	if (invert)
479 		val = (max - ucontrol->value.integer.value[0]) & mask;
480 	else
481 		val = ((ucontrol->value.integer.value[0] + min) & mask);
482 	val_mask = mask << shift;
483 	val = val << shift;
484 
485 	ret = snd_soc_component_update_bits(component, reg, val_mask, val);
486 	if (ret < 0)
487 		return ret;
488 
489 	if (snd_soc_volsw_is_stereo(mc)) {
490 		if (invert)
491 			val = (max - ucontrol->value.integer.value[1]) & mask;
492 		else
493 			val = ((ucontrol->value.integer.value[1] + min) & mask);
494 		val_mask = mask << shift;
495 		val = val << shift;
496 
497 		ret = snd_soc_component_update_bits(component, rreg, val_mask,
498 			val);
499 	}
500 
501 	return ret;
502 }
503 EXPORT_SYMBOL_GPL(snd_soc_put_volsw_range);
504 
505 /**
506  * snd_soc_get_volsw_range - single mixer get callback with range
507  * @kcontrol: mixer control
508  * @ucontrol: control element information
509  *
510  * Callback to get the value, within a range, of a single mixer control.
511  *
512  * Returns 0 for success.
513  */
514 int snd_soc_get_volsw_range(struct snd_kcontrol *kcontrol,
515 	struct snd_ctl_elem_value *ucontrol)
516 {
517 	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
518 	struct soc_mixer_control *mc =
519 		(struct soc_mixer_control *)kcontrol->private_value;
520 	unsigned int reg = mc->reg;
521 	unsigned int rreg = mc->rreg;
522 	unsigned int shift = mc->shift;
523 	int min = mc->min;
524 	int max = mc->max;
525 	unsigned int mask = (1 << fls(max)) - 1;
526 	unsigned int invert = mc->invert;
527 	unsigned int val;
528 	int ret;
529 
530 	ret = snd_soc_component_read(component, reg, &val);
531 	if (ret)
532 		return ret;
533 
534 	ucontrol->value.integer.value[0] = (val >> shift) & mask;
535 	if (invert)
536 		ucontrol->value.integer.value[0] =
537 			max - ucontrol->value.integer.value[0];
538 	else
539 		ucontrol->value.integer.value[0] =
540 			ucontrol->value.integer.value[0] - min;
541 
542 	if (snd_soc_volsw_is_stereo(mc)) {
543 		ret = snd_soc_component_read(component, rreg, &val);
544 		if (ret)
545 			return ret;
546 
547 		ucontrol->value.integer.value[1] = (val >> shift) & mask;
548 		if (invert)
549 			ucontrol->value.integer.value[1] =
550 				max - ucontrol->value.integer.value[1];
551 		else
552 			ucontrol->value.integer.value[1] =
553 				ucontrol->value.integer.value[1] - min;
554 	}
555 
556 	return 0;
557 }
558 EXPORT_SYMBOL_GPL(snd_soc_get_volsw_range);
559 
560 /**
561  * snd_soc_limit_volume - Set new limit to an existing volume control.
562  *
563  * @codec: where to look for the control
564  * @name: Name of the control
565  * @max: new maximum limit
566  *
567  * Return 0 for success, else error.
568  */
569 int snd_soc_limit_volume(struct snd_soc_codec *codec,
570 	const char *name, int max)
571 {
572 	struct snd_card *card = codec->component.card->snd_card;
573 	struct snd_kcontrol *kctl;
574 	struct soc_mixer_control *mc;
575 	int found = 0;
576 	int ret = -EINVAL;
577 
578 	/* Sanity check for name and max */
579 	if (unlikely(!name || max <= 0))
580 		return -EINVAL;
581 
582 	list_for_each_entry(kctl, &card->controls, list) {
583 		if (!strncmp(kctl->id.name, name, sizeof(kctl->id.name))) {
584 			found = 1;
585 			break;
586 		}
587 	}
588 	if (found) {
589 		mc = (struct soc_mixer_control *)kctl->private_value;
590 		if (max <= mc->max) {
591 			mc->platform_max = max;
592 			ret = 0;
593 		}
594 	}
595 	return ret;
596 }
597 EXPORT_SYMBOL_GPL(snd_soc_limit_volume);
598 
599 int snd_soc_bytes_info(struct snd_kcontrol *kcontrol,
600 		       struct snd_ctl_elem_info *uinfo)
601 {
602 	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
603 	struct soc_bytes *params = (void *)kcontrol->private_value;
604 
605 	uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
606 	uinfo->count = params->num_regs * component->val_bytes;
607 
608 	return 0;
609 }
610 EXPORT_SYMBOL_GPL(snd_soc_bytes_info);
611 
612 int snd_soc_bytes_get(struct snd_kcontrol *kcontrol,
613 		      struct snd_ctl_elem_value *ucontrol)
614 {
615 	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
616 	struct soc_bytes *params = (void *)kcontrol->private_value;
617 	int ret;
618 
619 	if (component->regmap)
620 		ret = regmap_raw_read(component->regmap, params->base,
621 				      ucontrol->value.bytes.data,
622 				      params->num_regs * component->val_bytes);
623 	else
624 		ret = -EINVAL;
625 
626 	/* Hide any masked bytes to ensure consistent data reporting */
627 	if (ret == 0 && params->mask) {
628 		switch (component->val_bytes) {
629 		case 1:
630 			ucontrol->value.bytes.data[0] &= ~params->mask;
631 			break;
632 		case 2:
633 			((u16 *)(&ucontrol->value.bytes.data))[0]
634 				&= cpu_to_be16(~params->mask);
635 			break;
636 		case 4:
637 			((u32 *)(&ucontrol->value.bytes.data))[0]
638 				&= cpu_to_be32(~params->mask);
639 			break;
640 		default:
641 			return -EINVAL;
642 		}
643 	}
644 
645 	return ret;
646 }
647 EXPORT_SYMBOL_GPL(snd_soc_bytes_get);
648 
649 int snd_soc_bytes_put(struct snd_kcontrol *kcontrol,
650 		      struct snd_ctl_elem_value *ucontrol)
651 {
652 	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
653 	struct soc_bytes *params = (void *)kcontrol->private_value;
654 	int ret, len;
655 	unsigned int val, mask;
656 	void *data;
657 
658 	if (!component->regmap || !params->num_regs)
659 		return -EINVAL;
660 
661 	len = params->num_regs * component->val_bytes;
662 
663 	data = kmemdup(ucontrol->value.bytes.data, len, GFP_KERNEL | GFP_DMA);
664 	if (!data)
665 		return -ENOMEM;
666 
667 	/*
668 	 * If we've got a mask then we need to preserve the register
669 	 * bits.  We shouldn't modify the incoming data so take a
670 	 * copy.
671 	 */
672 	if (params->mask) {
673 		ret = regmap_read(component->regmap, params->base, &val);
674 		if (ret != 0)
675 			goto out;
676 
677 		val &= params->mask;
678 
679 		switch (component->val_bytes) {
680 		case 1:
681 			((u8 *)data)[0] &= ~params->mask;
682 			((u8 *)data)[0] |= val;
683 			break;
684 		case 2:
685 			mask = ~params->mask;
686 			ret = regmap_parse_val(component->regmap,
687 							&mask, &mask);
688 			if (ret != 0)
689 				goto out;
690 
691 			((u16 *)data)[0] &= mask;
692 
693 			ret = regmap_parse_val(component->regmap,
694 							&val, &val);
695 			if (ret != 0)
696 				goto out;
697 
698 			((u16 *)data)[0] |= val;
699 			break;
700 		case 4:
701 			mask = ~params->mask;
702 			ret = regmap_parse_val(component->regmap,
703 							&mask, &mask);
704 			if (ret != 0)
705 				goto out;
706 
707 			((u32 *)data)[0] &= mask;
708 
709 			ret = regmap_parse_val(component->regmap,
710 							&val, &val);
711 			if (ret != 0)
712 				goto out;
713 
714 			((u32 *)data)[0] |= val;
715 			break;
716 		default:
717 			ret = -EINVAL;
718 			goto out;
719 		}
720 	}
721 
722 	ret = regmap_raw_write(component->regmap, params->base,
723 			       data, len);
724 
725 out:
726 	kfree(data);
727 
728 	return ret;
729 }
730 EXPORT_SYMBOL_GPL(snd_soc_bytes_put);
731 
732 int snd_soc_bytes_info_ext(struct snd_kcontrol *kcontrol,
733 			struct snd_ctl_elem_info *ucontrol)
734 {
735 	struct soc_bytes_ext *params = (void *)kcontrol->private_value;
736 
737 	ucontrol->type = SNDRV_CTL_ELEM_TYPE_BYTES;
738 	ucontrol->count = params->max;
739 
740 	return 0;
741 }
742 EXPORT_SYMBOL_GPL(snd_soc_bytes_info_ext);
743 
744 int snd_soc_bytes_tlv_callback(struct snd_kcontrol *kcontrol, int op_flag,
745 				unsigned int size, unsigned int __user *tlv)
746 {
747 	struct soc_bytes_ext *params = (void *)kcontrol->private_value;
748 	unsigned int count = size < params->max ? size : params->max;
749 	int ret = -ENXIO;
750 
751 	switch (op_flag) {
752 	case SNDRV_CTL_TLV_OP_READ:
753 		if (params->get)
754 			ret = params->get(tlv, count);
755 		break;
756 	case SNDRV_CTL_TLV_OP_WRITE:
757 		if (params->put)
758 			ret = params->put(tlv, count);
759 		break;
760 	}
761 	return ret;
762 }
763 EXPORT_SYMBOL_GPL(snd_soc_bytes_tlv_callback);
764 
765 /**
766  * snd_soc_info_xr_sx - signed multi register info callback
767  * @kcontrol: mreg control
768  * @uinfo: control element information
769  *
770  * Callback to provide information of a control that can
771  * span multiple codec registers which together
772  * forms a single signed value in a MSB/LSB manner.
773  *
774  * Returns 0 for success.
775  */
776 int snd_soc_info_xr_sx(struct snd_kcontrol *kcontrol,
777 	struct snd_ctl_elem_info *uinfo)
778 {
779 	struct soc_mreg_control *mc =
780 		(struct soc_mreg_control *)kcontrol->private_value;
781 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
782 	uinfo->count = 1;
783 	uinfo->value.integer.min = mc->min;
784 	uinfo->value.integer.max = mc->max;
785 
786 	return 0;
787 }
788 EXPORT_SYMBOL_GPL(snd_soc_info_xr_sx);
789 
790 /**
791  * snd_soc_get_xr_sx - signed multi register get callback
792  * @kcontrol: mreg control
793  * @ucontrol: control element information
794  *
795  * Callback to get the value of a control that can span
796  * multiple codec registers which together forms a single
797  * signed value in a MSB/LSB manner. The control supports
798  * specifying total no of bits used to allow for bitfields
799  * across the multiple codec registers.
800  *
801  * Returns 0 for success.
802  */
803 int snd_soc_get_xr_sx(struct snd_kcontrol *kcontrol,
804 	struct snd_ctl_elem_value *ucontrol)
805 {
806 	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
807 	struct soc_mreg_control *mc =
808 		(struct soc_mreg_control *)kcontrol->private_value;
809 	unsigned int regbase = mc->regbase;
810 	unsigned int regcount = mc->regcount;
811 	unsigned int regwshift = component->val_bytes * BITS_PER_BYTE;
812 	unsigned int regwmask = (1<<regwshift)-1;
813 	unsigned int invert = mc->invert;
814 	unsigned long mask = (1UL<<mc->nbits)-1;
815 	long min = mc->min;
816 	long max = mc->max;
817 	long val = 0;
818 	unsigned int regval;
819 	unsigned int i;
820 	int ret;
821 
822 	for (i = 0; i < regcount; i++) {
823 		ret = snd_soc_component_read(component, regbase+i, &regval);
824 		if (ret)
825 			return ret;
826 		val |= (regval & regwmask) << (regwshift*(regcount-i-1));
827 	}
828 	val &= mask;
829 	if (min < 0 && val > max)
830 		val |= ~mask;
831 	if (invert)
832 		val = max - val;
833 	ucontrol->value.integer.value[0] = val;
834 
835 	return 0;
836 }
837 EXPORT_SYMBOL_GPL(snd_soc_get_xr_sx);
838 
839 /**
840  * snd_soc_put_xr_sx - signed multi register get callback
841  * @kcontrol: mreg control
842  * @ucontrol: control element information
843  *
844  * Callback to set the value of a control that can span
845  * multiple codec registers which together forms a single
846  * signed value in a MSB/LSB manner. The control supports
847  * specifying total no of bits used to allow for bitfields
848  * across the multiple codec registers.
849  *
850  * Returns 0 for success.
851  */
852 int snd_soc_put_xr_sx(struct snd_kcontrol *kcontrol,
853 	struct snd_ctl_elem_value *ucontrol)
854 {
855 	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
856 	struct soc_mreg_control *mc =
857 		(struct soc_mreg_control *)kcontrol->private_value;
858 	unsigned int regbase = mc->regbase;
859 	unsigned int regcount = mc->regcount;
860 	unsigned int regwshift = component->val_bytes * BITS_PER_BYTE;
861 	unsigned int regwmask = (1<<regwshift)-1;
862 	unsigned int invert = mc->invert;
863 	unsigned long mask = (1UL<<mc->nbits)-1;
864 	long max = mc->max;
865 	long val = ucontrol->value.integer.value[0];
866 	unsigned int i, regval, regmask;
867 	int err;
868 
869 	if (invert)
870 		val = max - val;
871 	val &= mask;
872 	for (i = 0; i < regcount; i++) {
873 		regval = (val >> (regwshift*(regcount-i-1))) & regwmask;
874 		regmask = (mask >> (regwshift*(regcount-i-1))) & regwmask;
875 		err = snd_soc_component_update_bits(component, regbase+i,
876 				regmask, regval);
877 		if (err < 0)
878 			return err;
879 	}
880 
881 	return 0;
882 }
883 EXPORT_SYMBOL_GPL(snd_soc_put_xr_sx);
884 
885 /**
886  * snd_soc_get_strobe - strobe get callback
887  * @kcontrol: mixer control
888  * @ucontrol: control element information
889  *
890  * Callback get the value of a strobe mixer control.
891  *
892  * Returns 0 for success.
893  */
894 int snd_soc_get_strobe(struct snd_kcontrol *kcontrol,
895 	struct snd_ctl_elem_value *ucontrol)
896 {
897 	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
898 	struct soc_mixer_control *mc =
899 		(struct soc_mixer_control *)kcontrol->private_value;
900 	unsigned int reg = mc->reg;
901 	unsigned int shift = mc->shift;
902 	unsigned int mask = 1 << shift;
903 	unsigned int invert = mc->invert != 0;
904 	unsigned int val;
905 	int ret;
906 
907 	ret = snd_soc_component_read(component, reg, &val);
908 	if (ret)
909 		return ret;
910 
911 	val &= mask;
912 
913 	if (shift != 0 && val != 0)
914 		val = val >> shift;
915 	ucontrol->value.enumerated.item[0] = val ^ invert;
916 
917 	return 0;
918 }
919 EXPORT_SYMBOL_GPL(snd_soc_get_strobe);
920 
921 /**
922  * snd_soc_put_strobe - strobe put callback
923  * @kcontrol: mixer control
924  * @ucontrol: control element information
925  *
926  * Callback strobe a register bit to high then low (or the inverse)
927  * in one pass of a single mixer enum control.
928  *
929  * Returns 1 for success.
930  */
931 int snd_soc_put_strobe(struct snd_kcontrol *kcontrol,
932 	struct snd_ctl_elem_value *ucontrol)
933 {
934 	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
935 	struct soc_mixer_control *mc =
936 		(struct soc_mixer_control *)kcontrol->private_value;
937 	unsigned int reg = mc->reg;
938 	unsigned int shift = mc->shift;
939 	unsigned int mask = 1 << shift;
940 	unsigned int invert = mc->invert != 0;
941 	unsigned int strobe = ucontrol->value.enumerated.item[0] != 0;
942 	unsigned int val1 = (strobe ^ invert) ? mask : 0;
943 	unsigned int val2 = (strobe ^ invert) ? 0 : mask;
944 	int err;
945 
946 	err = snd_soc_component_update_bits(component, reg, mask, val1);
947 	if (err < 0)
948 		return err;
949 
950 	return snd_soc_component_update_bits(component, reg, mask, val2);
951 }
952 EXPORT_SYMBOL_GPL(snd_soc_put_strobe);
953