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, ®_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_r) & 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 interpret 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_info_volsw_sx - Mixer info callback for SX TLV controls 211 * @kcontrol: mixer control 212 * @uinfo: control element information 213 * 214 * Callback to provide information about a single mixer control, or a double 215 * mixer control that spans 2 registers of the SX TLV type. SX TLV controls 216 * have a range that represents both positive and negative values either side 217 * of zero but without a sign bit. 218 * 219 * Returns 0 for success. 220 */ 221 int snd_soc_info_volsw_sx(struct snd_kcontrol *kcontrol, 222 struct snd_ctl_elem_info *uinfo) 223 { 224 struct soc_mixer_control *mc = 225 (struct soc_mixer_control *)kcontrol->private_value; 226 227 snd_soc_info_volsw(kcontrol, uinfo); 228 /* Max represents the number of levels in an SX control not the 229 * maximum value, so add the minimum value back on 230 */ 231 uinfo->value.integer.max += mc->min; 232 233 return 0; 234 } 235 EXPORT_SYMBOL_GPL(snd_soc_info_volsw_sx); 236 237 /** 238 * snd_soc_get_volsw - single mixer get callback 239 * @kcontrol: mixer control 240 * @ucontrol: control element information 241 * 242 * Callback to get the value of a single mixer control, or a double mixer 243 * control that spans 2 registers. 244 * 245 * Returns 0 for success. 246 */ 247 int snd_soc_get_volsw(struct snd_kcontrol *kcontrol, 248 struct snd_ctl_elem_value *ucontrol) 249 { 250 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 251 struct soc_mixer_control *mc = 252 (struct soc_mixer_control *)kcontrol->private_value; 253 unsigned int reg = mc->reg; 254 unsigned int reg2 = mc->rreg; 255 unsigned int shift = mc->shift; 256 unsigned int rshift = mc->rshift; 257 int max = mc->max; 258 int min = mc->min; 259 int sign_bit = mc->sign_bit; 260 unsigned int mask = (1 << fls(max)) - 1; 261 unsigned int invert = mc->invert; 262 int val; 263 int ret; 264 265 if (sign_bit) 266 mask = BIT(sign_bit + 1) - 1; 267 268 ret = snd_soc_read_signed(component, reg, mask, shift, sign_bit, &val); 269 if (ret) 270 return ret; 271 272 ucontrol->value.integer.value[0] = val - min; 273 if (invert) 274 ucontrol->value.integer.value[0] = 275 max - ucontrol->value.integer.value[0]; 276 277 if (snd_soc_volsw_is_stereo(mc)) { 278 if (reg == reg2) 279 ret = snd_soc_read_signed(component, reg, mask, rshift, 280 sign_bit, &val); 281 else 282 ret = snd_soc_read_signed(component, reg2, mask, shift, 283 sign_bit, &val); 284 if (ret) 285 return ret; 286 287 ucontrol->value.integer.value[1] = val - min; 288 if (invert) 289 ucontrol->value.integer.value[1] = 290 max - ucontrol->value.integer.value[1]; 291 } 292 293 return 0; 294 } 295 EXPORT_SYMBOL_GPL(snd_soc_get_volsw); 296 297 /** 298 * snd_soc_put_volsw - single mixer put callback 299 * @kcontrol: mixer control 300 * @ucontrol: control element information 301 * 302 * Callback to set the value of a single mixer control, or a double mixer 303 * control that spans 2 registers. 304 * 305 * Returns 0 for success. 306 */ 307 int snd_soc_put_volsw(struct snd_kcontrol *kcontrol, 308 struct snd_ctl_elem_value *ucontrol) 309 { 310 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 311 struct soc_mixer_control *mc = 312 (struct soc_mixer_control *)kcontrol->private_value; 313 unsigned int reg = mc->reg; 314 unsigned int reg2 = mc->rreg; 315 unsigned int shift = mc->shift; 316 unsigned int rshift = mc->rshift; 317 int max = mc->max; 318 int min = mc->min; 319 unsigned int sign_bit = mc->sign_bit; 320 unsigned int mask = (1 << fls(max)) - 1; 321 unsigned int invert = mc->invert; 322 int err; 323 bool type_2r = false; 324 unsigned int val2 = 0; 325 unsigned int val, val_mask; 326 327 if (sign_bit) 328 mask = BIT(sign_bit + 1) - 1; 329 330 val = ((ucontrol->value.integer.value[0] + min) & mask); 331 if (invert) 332 val = max - val; 333 val_mask = mask << shift; 334 val = val << shift; 335 if (snd_soc_volsw_is_stereo(mc)) { 336 val2 = ((ucontrol->value.integer.value[1] + min) & mask); 337 if (invert) 338 val2 = max - val2; 339 if (reg == reg2) { 340 val_mask |= mask << rshift; 341 val |= val2 << rshift; 342 } else { 343 val2 = val2 << shift; 344 type_2r = true; 345 } 346 } 347 err = snd_soc_component_update_bits(component, reg, val_mask, val); 348 if (err < 0) 349 return err; 350 351 if (type_2r) 352 err = snd_soc_component_update_bits(component, reg2, val_mask, 353 val2); 354 355 return err; 356 } 357 EXPORT_SYMBOL_GPL(snd_soc_put_volsw); 358 359 /** 360 * snd_soc_get_volsw_sx - single mixer get callback 361 * @kcontrol: mixer control 362 * @ucontrol: control element information 363 * 364 * Callback to get the value of a single mixer control, or a double mixer 365 * control that spans 2 registers. 366 * 367 * Returns 0 for success. 368 */ 369 int snd_soc_get_volsw_sx(struct snd_kcontrol *kcontrol, 370 struct snd_ctl_elem_value *ucontrol) 371 { 372 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 373 struct soc_mixer_control *mc = 374 (struct soc_mixer_control *)kcontrol->private_value; 375 unsigned int reg = mc->reg; 376 unsigned int reg2 = mc->rreg; 377 unsigned int shift = mc->shift; 378 unsigned int rshift = mc->rshift; 379 int max = mc->max; 380 int min = mc->min; 381 int mask = (1 << (fls(min + max) - 1)) - 1; 382 unsigned int val; 383 int ret; 384 385 ret = snd_soc_component_read(component, reg, &val); 386 if (ret < 0) 387 return ret; 388 389 ucontrol->value.integer.value[0] = ((val >> shift) - min) & mask; 390 391 if (snd_soc_volsw_is_stereo(mc)) { 392 ret = snd_soc_component_read(component, reg2, &val); 393 if (ret < 0) 394 return ret; 395 396 val = ((val >> rshift) - min) & mask; 397 ucontrol->value.integer.value[1] = val; 398 } 399 400 return 0; 401 } 402 EXPORT_SYMBOL_GPL(snd_soc_get_volsw_sx); 403 404 /** 405 * snd_soc_put_volsw_sx - double mixer set callback 406 * @kcontrol: mixer control 407 * @ucontrol: control element information 408 * 409 * Callback to set the value of a double mixer control that spans 2 registers. 410 * 411 * Returns 0 for success. 412 */ 413 int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol, 414 struct snd_ctl_elem_value *ucontrol) 415 { 416 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 417 struct soc_mixer_control *mc = 418 (struct soc_mixer_control *)kcontrol->private_value; 419 420 unsigned int reg = mc->reg; 421 unsigned int reg2 = mc->rreg; 422 unsigned int shift = mc->shift; 423 unsigned int rshift = mc->rshift; 424 int max = mc->max; 425 int min = mc->min; 426 int mask = (1 << (fls(min + max) - 1)) - 1; 427 int err = 0; 428 unsigned int val, val_mask, val2 = 0; 429 430 val_mask = mask << shift; 431 val = (ucontrol->value.integer.value[0] + min) & mask; 432 val = val << shift; 433 434 err = snd_soc_component_update_bits(component, reg, val_mask, val); 435 if (err < 0) 436 return err; 437 438 if (snd_soc_volsw_is_stereo(mc)) { 439 val_mask = mask << rshift; 440 val2 = (ucontrol->value.integer.value[1] + min) & mask; 441 val2 = val2 << rshift; 442 443 err = snd_soc_component_update_bits(component, reg2, val_mask, 444 val2); 445 } 446 return err; 447 } 448 EXPORT_SYMBOL_GPL(snd_soc_put_volsw_sx); 449 450 /** 451 * snd_soc_info_volsw_range - single mixer info callback with range. 452 * @kcontrol: mixer control 453 * @uinfo: control element information 454 * 455 * Callback to provide information, within a range, about a single 456 * mixer control. 457 * 458 * returns 0 for success. 459 */ 460 int snd_soc_info_volsw_range(struct snd_kcontrol *kcontrol, 461 struct snd_ctl_elem_info *uinfo) 462 { 463 struct soc_mixer_control *mc = 464 (struct soc_mixer_control *)kcontrol->private_value; 465 int platform_max; 466 int min = mc->min; 467 468 if (!mc->platform_max) 469 mc->platform_max = mc->max; 470 platform_max = mc->platform_max; 471 472 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 473 uinfo->count = snd_soc_volsw_is_stereo(mc) ? 2 : 1; 474 uinfo->value.integer.min = 0; 475 uinfo->value.integer.max = platform_max - min; 476 477 return 0; 478 } 479 EXPORT_SYMBOL_GPL(snd_soc_info_volsw_range); 480 481 /** 482 * snd_soc_put_volsw_range - single mixer put value callback with range. 483 * @kcontrol: mixer control 484 * @ucontrol: control element information 485 * 486 * Callback to set the value, within a range, for a single mixer control. 487 * 488 * Returns 0 for success. 489 */ 490 int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, 491 struct snd_ctl_elem_value *ucontrol) 492 { 493 struct soc_mixer_control *mc = 494 (struct soc_mixer_control *)kcontrol->private_value; 495 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 496 unsigned int reg = mc->reg; 497 unsigned int rreg = mc->rreg; 498 unsigned int shift = mc->shift; 499 int min = mc->min; 500 int max = mc->max; 501 unsigned int mask = (1 << fls(max)) - 1; 502 unsigned int invert = mc->invert; 503 unsigned int val, val_mask; 504 int ret; 505 506 if (invert) 507 val = (max - ucontrol->value.integer.value[0]) & mask; 508 else 509 val = ((ucontrol->value.integer.value[0] + min) & mask); 510 val_mask = mask << shift; 511 val = val << shift; 512 513 ret = snd_soc_component_update_bits(component, reg, val_mask, val); 514 if (ret < 0) 515 return ret; 516 517 if (snd_soc_volsw_is_stereo(mc)) { 518 if (invert) 519 val = (max - ucontrol->value.integer.value[1]) & mask; 520 else 521 val = ((ucontrol->value.integer.value[1] + min) & mask); 522 val_mask = mask << shift; 523 val = val << shift; 524 525 ret = snd_soc_component_update_bits(component, rreg, val_mask, 526 val); 527 } 528 529 return ret; 530 } 531 EXPORT_SYMBOL_GPL(snd_soc_put_volsw_range); 532 533 /** 534 * snd_soc_get_volsw_range - single mixer get callback with range 535 * @kcontrol: mixer control 536 * @ucontrol: control element information 537 * 538 * Callback to get the value, within a range, of a single mixer control. 539 * 540 * Returns 0 for success. 541 */ 542 int snd_soc_get_volsw_range(struct snd_kcontrol *kcontrol, 543 struct snd_ctl_elem_value *ucontrol) 544 { 545 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 546 struct soc_mixer_control *mc = 547 (struct soc_mixer_control *)kcontrol->private_value; 548 unsigned int reg = mc->reg; 549 unsigned int rreg = mc->rreg; 550 unsigned int shift = mc->shift; 551 int min = mc->min; 552 int max = mc->max; 553 unsigned int mask = (1 << fls(max)) - 1; 554 unsigned int invert = mc->invert; 555 unsigned int val; 556 int ret; 557 558 ret = snd_soc_component_read(component, reg, &val); 559 if (ret) 560 return ret; 561 562 ucontrol->value.integer.value[0] = (val >> shift) & mask; 563 if (invert) 564 ucontrol->value.integer.value[0] = 565 max - ucontrol->value.integer.value[0]; 566 else 567 ucontrol->value.integer.value[0] = 568 ucontrol->value.integer.value[0] - min; 569 570 if (snd_soc_volsw_is_stereo(mc)) { 571 ret = snd_soc_component_read(component, rreg, &val); 572 if (ret) 573 return ret; 574 575 ucontrol->value.integer.value[1] = (val >> shift) & mask; 576 if (invert) 577 ucontrol->value.integer.value[1] = 578 max - ucontrol->value.integer.value[1]; 579 else 580 ucontrol->value.integer.value[1] = 581 ucontrol->value.integer.value[1] - min; 582 } 583 584 return 0; 585 } 586 EXPORT_SYMBOL_GPL(snd_soc_get_volsw_range); 587 588 /** 589 * snd_soc_limit_volume - Set new limit to an existing volume control. 590 * 591 * @card: where to look for the control 592 * @name: Name of the control 593 * @max: new maximum limit 594 * 595 * Return 0 for success, else error. 596 */ 597 int snd_soc_limit_volume(struct snd_soc_card *card, 598 const char *name, int max) 599 { 600 struct snd_card *snd_card = card->snd_card; 601 struct snd_kcontrol *kctl; 602 struct soc_mixer_control *mc; 603 int found = 0; 604 int ret = -EINVAL; 605 606 /* Sanity check for name and max */ 607 if (unlikely(!name || max <= 0)) 608 return -EINVAL; 609 610 list_for_each_entry(kctl, &snd_card->controls, list) { 611 if (!strncmp(kctl->id.name, name, sizeof(kctl->id.name))) { 612 found = 1; 613 break; 614 } 615 } 616 if (found) { 617 mc = (struct soc_mixer_control *)kctl->private_value; 618 if (max <= mc->max) { 619 mc->platform_max = max; 620 ret = 0; 621 } 622 } 623 return ret; 624 } 625 EXPORT_SYMBOL_GPL(snd_soc_limit_volume); 626 627 int snd_soc_bytes_info(struct snd_kcontrol *kcontrol, 628 struct snd_ctl_elem_info *uinfo) 629 { 630 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 631 struct soc_bytes *params = (void *)kcontrol->private_value; 632 633 uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; 634 uinfo->count = params->num_regs * component->val_bytes; 635 636 return 0; 637 } 638 EXPORT_SYMBOL_GPL(snd_soc_bytes_info); 639 640 int snd_soc_bytes_get(struct snd_kcontrol *kcontrol, 641 struct snd_ctl_elem_value *ucontrol) 642 { 643 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 644 struct soc_bytes *params = (void *)kcontrol->private_value; 645 int ret; 646 647 if (component->regmap) 648 ret = regmap_raw_read(component->regmap, params->base, 649 ucontrol->value.bytes.data, 650 params->num_regs * component->val_bytes); 651 else 652 ret = -EINVAL; 653 654 /* Hide any masked bytes to ensure consistent data reporting */ 655 if (ret == 0 && params->mask) { 656 switch (component->val_bytes) { 657 case 1: 658 ucontrol->value.bytes.data[0] &= ~params->mask; 659 break; 660 case 2: 661 ((u16 *)(&ucontrol->value.bytes.data))[0] 662 &= cpu_to_be16(~params->mask); 663 break; 664 case 4: 665 ((u32 *)(&ucontrol->value.bytes.data))[0] 666 &= cpu_to_be32(~params->mask); 667 break; 668 default: 669 return -EINVAL; 670 } 671 } 672 673 return ret; 674 } 675 EXPORT_SYMBOL_GPL(snd_soc_bytes_get); 676 677 int snd_soc_bytes_put(struct snd_kcontrol *kcontrol, 678 struct snd_ctl_elem_value *ucontrol) 679 { 680 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 681 struct soc_bytes *params = (void *)kcontrol->private_value; 682 int ret, len; 683 unsigned int val, mask; 684 void *data; 685 686 if (!component->regmap || !params->num_regs) 687 return -EINVAL; 688 689 len = params->num_regs * component->val_bytes; 690 691 data = kmemdup(ucontrol->value.bytes.data, len, GFP_KERNEL | GFP_DMA); 692 if (!data) 693 return -ENOMEM; 694 695 /* 696 * If we've got a mask then we need to preserve the register 697 * bits. We shouldn't modify the incoming data so take a 698 * copy. 699 */ 700 if (params->mask) { 701 ret = regmap_read(component->regmap, params->base, &val); 702 if (ret != 0) 703 goto out; 704 705 val &= params->mask; 706 707 switch (component->val_bytes) { 708 case 1: 709 ((u8 *)data)[0] &= ~params->mask; 710 ((u8 *)data)[0] |= val; 711 break; 712 case 2: 713 mask = ~params->mask; 714 ret = regmap_parse_val(component->regmap, 715 &mask, &mask); 716 if (ret != 0) 717 goto out; 718 719 ((u16 *)data)[0] &= mask; 720 721 ret = regmap_parse_val(component->regmap, 722 &val, &val); 723 if (ret != 0) 724 goto out; 725 726 ((u16 *)data)[0] |= val; 727 break; 728 case 4: 729 mask = ~params->mask; 730 ret = regmap_parse_val(component->regmap, 731 &mask, &mask); 732 if (ret != 0) 733 goto out; 734 735 ((u32 *)data)[0] &= mask; 736 737 ret = regmap_parse_val(component->regmap, 738 &val, &val); 739 if (ret != 0) 740 goto out; 741 742 ((u32 *)data)[0] |= val; 743 break; 744 default: 745 ret = -EINVAL; 746 goto out; 747 } 748 } 749 750 ret = regmap_raw_write(component->regmap, params->base, 751 data, len); 752 753 out: 754 kfree(data); 755 756 return ret; 757 } 758 EXPORT_SYMBOL_GPL(snd_soc_bytes_put); 759 760 int snd_soc_bytes_info_ext(struct snd_kcontrol *kcontrol, 761 struct snd_ctl_elem_info *ucontrol) 762 { 763 struct soc_bytes_ext *params = (void *)kcontrol->private_value; 764 765 ucontrol->type = SNDRV_CTL_ELEM_TYPE_BYTES; 766 ucontrol->count = params->max; 767 768 return 0; 769 } 770 EXPORT_SYMBOL_GPL(snd_soc_bytes_info_ext); 771 772 int snd_soc_bytes_tlv_callback(struct snd_kcontrol *kcontrol, int op_flag, 773 unsigned int size, unsigned int __user *tlv) 774 { 775 struct soc_bytes_ext *params = (void *)kcontrol->private_value; 776 unsigned int count = size < params->max ? size : params->max; 777 int ret = -ENXIO; 778 779 switch (op_flag) { 780 case SNDRV_CTL_TLV_OP_READ: 781 if (params->get) 782 ret = params->get(kcontrol, tlv, count); 783 break; 784 case SNDRV_CTL_TLV_OP_WRITE: 785 if (params->put) 786 ret = params->put(kcontrol, tlv, count); 787 break; 788 } 789 return ret; 790 } 791 EXPORT_SYMBOL_GPL(snd_soc_bytes_tlv_callback); 792 793 /** 794 * snd_soc_info_xr_sx - signed multi register info callback 795 * @kcontrol: mreg control 796 * @uinfo: control element information 797 * 798 * Callback to provide information of a control that can 799 * span multiple codec registers which together 800 * forms a single signed value in a MSB/LSB manner. 801 * 802 * Returns 0 for success. 803 */ 804 int snd_soc_info_xr_sx(struct snd_kcontrol *kcontrol, 805 struct snd_ctl_elem_info *uinfo) 806 { 807 struct soc_mreg_control *mc = 808 (struct soc_mreg_control *)kcontrol->private_value; 809 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 810 uinfo->count = 1; 811 uinfo->value.integer.min = mc->min; 812 uinfo->value.integer.max = mc->max; 813 814 return 0; 815 } 816 EXPORT_SYMBOL_GPL(snd_soc_info_xr_sx); 817 818 /** 819 * snd_soc_get_xr_sx - signed multi register get callback 820 * @kcontrol: mreg control 821 * @ucontrol: control element information 822 * 823 * Callback to get the value of a control that can span 824 * multiple codec registers which together forms a single 825 * signed value in a MSB/LSB manner. The control supports 826 * specifying total no of bits used to allow for bitfields 827 * across the multiple codec registers. 828 * 829 * Returns 0 for success. 830 */ 831 int snd_soc_get_xr_sx(struct snd_kcontrol *kcontrol, 832 struct snd_ctl_elem_value *ucontrol) 833 { 834 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 835 struct soc_mreg_control *mc = 836 (struct soc_mreg_control *)kcontrol->private_value; 837 unsigned int regbase = mc->regbase; 838 unsigned int regcount = mc->regcount; 839 unsigned int regwshift = component->val_bytes * BITS_PER_BYTE; 840 unsigned int regwmask = (1<<regwshift)-1; 841 unsigned int invert = mc->invert; 842 unsigned long mask = (1UL<<mc->nbits)-1; 843 long min = mc->min; 844 long max = mc->max; 845 long val = 0; 846 unsigned int regval; 847 unsigned int i; 848 int ret; 849 850 for (i = 0; i < regcount; i++) { 851 ret = snd_soc_component_read(component, regbase+i, ®val); 852 if (ret) 853 return ret; 854 val |= (regval & regwmask) << (regwshift*(regcount-i-1)); 855 } 856 val &= mask; 857 if (min < 0 && val > max) 858 val |= ~mask; 859 if (invert) 860 val = max - val; 861 ucontrol->value.integer.value[0] = val; 862 863 return 0; 864 } 865 EXPORT_SYMBOL_GPL(snd_soc_get_xr_sx); 866 867 /** 868 * snd_soc_put_xr_sx - signed multi register get callback 869 * @kcontrol: mreg control 870 * @ucontrol: control element information 871 * 872 * Callback to set the value of a control that can span 873 * multiple codec registers which together forms a single 874 * signed value in a MSB/LSB manner. The control supports 875 * specifying total no of bits used to allow for bitfields 876 * across the multiple codec registers. 877 * 878 * Returns 0 for success. 879 */ 880 int snd_soc_put_xr_sx(struct snd_kcontrol *kcontrol, 881 struct snd_ctl_elem_value *ucontrol) 882 { 883 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 884 struct soc_mreg_control *mc = 885 (struct soc_mreg_control *)kcontrol->private_value; 886 unsigned int regbase = mc->regbase; 887 unsigned int regcount = mc->regcount; 888 unsigned int regwshift = component->val_bytes * BITS_PER_BYTE; 889 unsigned int regwmask = (1<<regwshift)-1; 890 unsigned int invert = mc->invert; 891 unsigned long mask = (1UL<<mc->nbits)-1; 892 long max = mc->max; 893 long val = ucontrol->value.integer.value[0]; 894 unsigned int i, regval, regmask; 895 int err; 896 897 if (invert) 898 val = max - val; 899 val &= mask; 900 for (i = 0; i < regcount; i++) { 901 regval = (val >> (regwshift*(regcount-i-1))) & regwmask; 902 regmask = (mask >> (regwshift*(regcount-i-1))) & regwmask; 903 err = snd_soc_component_update_bits(component, regbase+i, 904 regmask, regval); 905 if (err < 0) 906 return err; 907 } 908 909 return 0; 910 } 911 EXPORT_SYMBOL_GPL(snd_soc_put_xr_sx); 912 913 /** 914 * snd_soc_get_strobe - strobe get callback 915 * @kcontrol: mixer control 916 * @ucontrol: control element information 917 * 918 * Callback get the value of a strobe mixer control. 919 * 920 * Returns 0 for success. 921 */ 922 int snd_soc_get_strobe(struct snd_kcontrol *kcontrol, 923 struct snd_ctl_elem_value *ucontrol) 924 { 925 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 926 struct soc_mixer_control *mc = 927 (struct soc_mixer_control *)kcontrol->private_value; 928 unsigned int reg = mc->reg; 929 unsigned int shift = mc->shift; 930 unsigned int mask = 1 << shift; 931 unsigned int invert = mc->invert != 0; 932 unsigned int val; 933 int ret; 934 935 ret = snd_soc_component_read(component, reg, &val); 936 if (ret) 937 return ret; 938 939 val &= mask; 940 941 if (shift != 0 && val != 0) 942 val = val >> shift; 943 ucontrol->value.enumerated.item[0] = val ^ invert; 944 945 return 0; 946 } 947 EXPORT_SYMBOL_GPL(snd_soc_get_strobe); 948 949 /** 950 * snd_soc_put_strobe - strobe put callback 951 * @kcontrol: mixer control 952 * @ucontrol: control element information 953 * 954 * Callback strobe a register bit to high then low (or the inverse) 955 * in one pass of a single mixer enum control. 956 * 957 * Returns 1 for success. 958 */ 959 int snd_soc_put_strobe(struct snd_kcontrol *kcontrol, 960 struct snd_ctl_elem_value *ucontrol) 961 { 962 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 963 struct soc_mixer_control *mc = 964 (struct soc_mixer_control *)kcontrol->private_value; 965 unsigned int reg = mc->reg; 966 unsigned int shift = mc->shift; 967 unsigned int mask = 1 << shift; 968 unsigned int invert = mc->invert != 0; 969 unsigned int strobe = ucontrol->value.enumerated.item[0] != 0; 970 unsigned int val1 = (strobe ^ invert) ? mask : 0; 971 unsigned int val2 = (strobe ^ invert) ? 0 : mask; 972 int err; 973 974 err = snd_soc_component_update_bits(component, reg, mask, val1); 975 if (err < 0) 976 return err; 977 978 return snd_soc_component_update_bits(component, reg, mask, val2); 979 } 980 EXPORT_SYMBOL_GPL(snd_soc_put_strobe); 981