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 */ 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 */ 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 */ 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 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 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 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 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 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 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 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 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 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 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 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 */ 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 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 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 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 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 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 */ 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 */ 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 */ 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 */ 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 */ 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