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