soc-ops.c (27004B)
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 */ 40int 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} 48EXPORT_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 */ 59int 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} 79EXPORT_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 */ 90int 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} 112EXPORT_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 */ 129static 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 */ 175int 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} 196EXPORT_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 */ 210int 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} 224EXPORT_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 */ 236int 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} 284EXPORT_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 */ 296int 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, ret; 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 && ((int)val + min) > 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 && ((int)val2 + min) > 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 ret = err; 354 355 if (type_2r) { 356 err = snd_soc_component_update_bits(component, reg2, val_mask, 357 val2); 358 /* Don't discard any error code or drop change flag */ 359 if (ret == 0 || err < 0) { 360 ret = err; 361 } 362 } 363 364 return ret; 365} 366EXPORT_SYMBOL_GPL(snd_soc_put_volsw); 367 368/** 369 * snd_soc_get_volsw_sx - single mixer get callback 370 * @kcontrol: mixer control 371 * @ucontrol: control element information 372 * 373 * Callback to get the value of a single mixer control, or a double mixer 374 * control that spans 2 registers. 375 * 376 * Returns 0 for success. 377 */ 378int snd_soc_get_volsw_sx(struct snd_kcontrol *kcontrol, 379 struct snd_ctl_elem_value *ucontrol) 380{ 381 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 382 struct soc_mixer_control *mc = 383 (struct soc_mixer_control *)kcontrol->private_value; 384 unsigned int reg = mc->reg; 385 unsigned int reg2 = mc->rreg; 386 unsigned int shift = mc->shift; 387 unsigned int rshift = mc->rshift; 388 int max = mc->max; 389 int min = mc->min; 390 unsigned int mask = (1U << (fls(min + max) - 1)) - 1; 391 unsigned int val; 392 393 val = snd_soc_component_read(component, reg); 394 ucontrol->value.integer.value[0] = ((val >> shift) - min) & mask; 395 396 if (snd_soc_volsw_is_stereo(mc)) { 397 val = snd_soc_component_read(component, reg2); 398 val = ((val >> rshift) - min) & mask; 399 ucontrol->value.integer.value[1] = val; 400 } 401 402 return 0; 403} 404EXPORT_SYMBOL_GPL(snd_soc_get_volsw_sx); 405 406/** 407 * snd_soc_put_volsw_sx - double mixer set callback 408 * @kcontrol: mixer control 409 * @ucontrol: control element information 410 * 411 * Callback to set the value of a double mixer control that spans 2 registers. 412 * 413 * Returns 0 for success. 414 */ 415int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol, 416 struct snd_ctl_elem_value *ucontrol) 417{ 418 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 419 struct soc_mixer_control *mc = 420 (struct soc_mixer_control *)kcontrol->private_value; 421 422 unsigned int reg = mc->reg; 423 unsigned int reg2 = mc->rreg; 424 unsigned int shift = mc->shift; 425 unsigned int rshift = mc->rshift; 426 int max = mc->max; 427 int min = mc->min; 428 unsigned int mask = (1U << (fls(min + max) - 1)) - 1; 429 int err = 0; 430 int ret; 431 unsigned int val, val_mask; 432 433 if (ucontrol->value.integer.value[0] < 0) 434 return -EINVAL; 435 val = ucontrol->value.integer.value[0]; 436 if (mc->platform_max && val > mc->platform_max) 437 return -EINVAL; 438 if (val > max - min) 439 return -EINVAL; 440 val_mask = mask << shift; 441 val = (val + min) & mask; 442 val = val << shift; 443 444 err = snd_soc_component_update_bits(component, reg, val_mask, val); 445 if (err < 0) 446 return err; 447 ret = err; 448 449 if (snd_soc_volsw_is_stereo(mc)) { 450 unsigned int val2; 451 452 val_mask = mask << rshift; 453 val2 = (ucontrol->value.integer.value[1] + min) & mask; 454 val2 = val2 << rshift; 455 456 err = snd_soc_component_update_bits(component, reg2, val_mask, 457 val2); 458 459 /* Don't discard any error code or drop change flag */ 460 if (ret == 0 || err < 0) { 461 ret = err; 462 } 463 } 464 return ret; 465} 466EXPORT_SYMBOL_GPL(snd_soc_put_volsw_sx); 467 468/** 469 * snd_soc_info_volsw_range - single mixer info callback with range. 470 * @kcontrol: mixer control 471 * @uinfo: control element information 472 * 473 * Callback to provide information, within a range, about a single 474 * mixer control. 475 * 476 * returns 0 for success. 477 */ 478int snd_soc_info_volsw_range(struct snd_kcontrol *kcontrol, 479 struct snd_ctl_elem_info *uinfo) 480{ 481 struct soc_mixer_control *mc = 482 (struct soc_mixer_control *)kcontrol->private_value; 483 int platform_max; 484 int min = mc->min; 485 486 if (!mc->platform_max) 487 mc->platform_max = mc->max; 488 platform_max = mc->platform_max; 489 490 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 491 uinfo->count = snd_soc_volsw_is_stereo(mc) ? 2 : 1; 492 uinfo->value.integer.min = 0; 493 uinfo->value.integer.max = platform_max - min; 494 495 return 0; 496} 497EXPORT_SYMBOL_GPL(snd_soc_info_volsw_range); 498 499/** 500 * snd_soc_put_volsw_range - single mixer put value callback with range. 501 * @kcontrol: mixer control 502 * @ucontrol: control element information 503 * 504 * Callback to set the value, within a range, for a single mixer control. 505 * 506 * Returns 0 for success. 507 */ 508int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, 509 struct snd_ctl_elem_value *ucontrol) 510{ 511 struct soc_mixer_control *mc = 512 (struct soc_mixer_control *)kcontrol->private_value; 513 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 514 unsigned int reg = mc->reg; 515 unsigned int rreg = mc->rreg; 516 unsigned int shift = mc->shift; 517 int min = mc->min; 518 int max = mc->max; 519 unsigned int mask = (1 << fls(max)) - 1; 520 unsigned int invert = mc->invert; 521 unsigned int val, val_mask; 522 int err, ret, tmp; 523 524 tmp = ucontrol->value.integer.value[0]; 525 if (tmp < 0) 526 return -EINVAL; 527 if (mc->platform_max && tmp > mc->platform_max) 528 return -EINVAL; 529 if (tmp > mc->max - mc->min) 530 return -EINVAL; 531 532 if (invert) 533 val = (max - ucontrol->value.integer.value[0]) & mask; 534 else 535 val = ((ucontrol->value.integer.value[0] + min) & mask); 536 val_mask = mask << shift; 537 val = val << shift; 538 539 err = snd_soc_component_update_bits(component, reg, val_mask, val); 540 if (err < 0) 541 return err; 542 ret = err; 543 544 if (snd_soc_volsw_is_stereo(mc)) { 545 tmp = ucontrol->value.integer.value[1]; 546 if (tmp < 0) 547 return -EINVAL; 548 if (mc->platform_max && tmp > mc->platform_max) 549 return -EINVAL; 550 if (tmp > mc->max - mc->min) 551 return -EINVAL; 552 553 if (invert) 554 val = (max - ucontrol->value.integer.value[1]) & mask; 555 else 556 val = ((ucontrol->value.integer.value[1] + min) & mask); 557 val_mask = mask << shift; 558 val = val << shift; 559 560 err = snd_soc_component_update_bits(component, rreg, val_mask, 561 val); 562 /* Don't discard any error code or drop change flag */ 563 if (ret == 0 || err < 0) { 564 ret = err; 565 } 566 } 567 568 return ret; 569} 570EXPORT_SYMBOL_GPL(snd_soc_put_volsw_range); 571 572/** 573 * snd_soc_get_volsw_range - single mixer get callback with range 574 * @kcontrol: mixer control 575 * @ucontrol: control element information 576 * 577 * Callback to get the value, within a range, of a single mixer control. 578 * 579 * Returns 0 for success. 580 */ 581int snd_soc_get_volsw_range(struct snd_kcontrol *kcontrol, 582 struct snd_ctl_elem_value *ucontrol) 583{ 584 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 585 struct soc_mixer_control *mc = 586 (struct soc_mixer_control *)kcontrol->private_value; 587 unsigned int reg = mc->reg; 588 unsigned int rreg = mc->rreg; 589 unsigned int shift = mc->shift; 590 int min = mc->min; 591 int max = mc->max; 592 unsigned int mask = (1 << fls(max)) - 1; 593 unsigned int invert = mc->invert; 594 unsigned int val; 595 596 val = snd_soc_component_read(component, reg); 597 ucontrol->value.integer.value[0] = (val >> shift) & mask; 598 if (invert) 599 ucontrol->value.integer.value[0] = 600 max - ucontrol->value.integer.value[0]; 601 else 602 ucontrol->value.integer.value[0] = 603 ucontrol->value.integer.value[0] - min; 604 605 if (snd_soc_volsw_is_stereo(mc)) { 606 val = snd_soc_component_read(component, rreg); 607 ucontrol->value.integer.value[1] = (val >> shift) & mask; 608 if (invert) 609 ucontrol->value.integer.value[1] = 610 max - ucontrol->value.integer.value[1]; 611 else 612 ucontrol->value.integer.value[1] = 613 ucontrol->value.integer.value[1] - min; 614 } 615 616 return 0; 617} 618EXPORT_SYMBOL_GPL(snd_soc_get_volsw_range); 619 620/** 621 * snd_soc_limit_volume - Set new limit to an existing volume control. 622 * 623 * @card: where to look for the control 624 * @name: Name of the control 625 * @max: new maximum limit 626 * 627 * Return 0 for success, else error. 628 */ 629int snd_soc_limit_volume(struct snd_soc_card *card, 630 const char *name, int max) 631{ 632 struct snd_kcontrol *kctl; 633 int ret = -EINVAL; 634 635 /* Sanity check for name and max */ 636 if (unlikely(!name || max <= 0)) 637 return -EINVAL; 638 639 kctl = snd_soc_card_get_kcontrol(card, name); 640 if (kctl) { 641 struct soc_mixer_control *mc = (struct soc_mixer_control *)kctl->private_value; 642 if (max <= mc->max) { 643 mc->platform_max = max; 644 ret = 0; 645 } 646 } 647 return ret; 648} 649EXPORT_SYMBOL_GPL(snd_soc_limit_volume); 650 651int snd_soc_bytes_info(struct snd_kcontrol *kcontrol, 652 struct snd_ctl_elem_info *uinfo) 653{ 654 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 655 struct soc_bytes *params = (void *)kcontrol->private_value; 656 657 uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; 658 uinfo->count = params->num_regs * component->val_bytes; 659 660 return 0; 661} 662EXPORT_SYMBOL_GPL(snd_soc_bytes_info); 663 664int snd_soc_bytes_get(struct snd_kcontrol *kcontrol, 665 struct snd_ctl_elem_value *ucontrol) 666{ 667 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 668 struct soc_bytes *params = (void *)kcontrol->private_value; 669 int ret; 670 671 if (component->regmap) 672 ret = regmap_raw_read(component->regmap, params->base, 673 ucontrol->value.bytes.data, 674 params->num_regs * component->val_bytes); 675 else 676 ret = -EINVAL; 677 678 /* Hide any masked bytes to ensure consistent data reporting */ 679 if (ret == 0 && params->mask) { 680 switch (component->val_bytes) { 681 case 1: 682 ucontrol->value.bytes.data[0] &= ~params->mask; 683 break; 684 case 2: 685 ((u16 *)(&ucontrol->value.bytes.data))[0] 686 &= cpu_to_be16(~params->mask); 687 break; 688 case 4: 689 ((u32 *)(&ucontrol->value.bytes.data))[0] 690 &= cpu_to_be32(~params->mask); 691 break; 692 default: 693 return -EINVAL; 694 } 695 } 696 697 return ret; 698} 699EXPORT_SYMBOL_GPL(snd_soc_bytes_get); 700 701int snd_soc_bytes_put(struct snd_kcontrol *kcontrol, 702 struct snd_ctl_elem_value *ucontrol) 703{ 704 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 705 struct soc_bytes *params = (void *)kcontrol->private_value; 706 int ret, len; 707 unsigned int val, mask; 708 void *data; 709 710 if (!component->regmap || !params->num_regs) 711 return -EINVAL; 712 713 len = params->num_regs * component->val_bytes; 714 715 data = kmemdup(ucontrol->value.bytes.data, len, GFP_KERNEL | GFP_DMA); 716 if (!data) 717 return -ENOMEM; 718 719 /* 720 * If we've got a mask then we need to preserve the register 721 * bits. We shouldn't modify the incoming data so take a 722 * copy. 723 */ 724 if (params->mask) { 725 ret = regmap_read(component->regmap, params->base, &val); 726 if (ret != 0) 727 goto out; 728 729 val &= params->mask; 730 731 switch (component->val_bytes) { 732 case 1: 733 ((u8 *)data)[0] &= ~params->mask; 734 ((u8 *)data)[0] |= val; 735 break; 736 case 2: 737 mask = ~params->mask; 738 ret = regmap_parse_val(component->regmap, 739 &mask, &mask); 740 if (ret != 0) 741 goto out; 742 743 ((u16 *)data)[0] &= mask; 744 745 ret = regmap_parse_val(component->regmap, 746 &val, &val); 747 if (ret != 0) 748 goto out; 749 750 ((u16 *)data)[0] |= val; 751 break; 752 case 4: 753 mask = ~params->mask; 754 ret = regmap_parse_val(component->regmap, 755 &mask, &mask); 756 if (ret != 0) 757 goto out; 758 759 ((u32 *)data)[0] &= mask; 760 761 ret = regmap_parse_val(component->regmap, 762 &val, &val); 763 if (ret != 0) 764 goto out; 765 766 ((u32 *)data)[0] |= val; 767 break; 768 default: 769 ret = -EINVAL; 770 goto out; 771 } 772 } 773 774 ret = regmap_raw_write(component->regmap, params->base, 775 data, len); 776 777out: 778 kfree(data); 779 780 return ret; 781} 782EXPORT_SYMBOL_GPL(snd_soc_bytes_put); 783 784int snd_soc_bytes_info_ext(struct snd_kcontrol *kcontrol, 785 struct snd_ctl_elem_info *ucontrol) 786{ 787 struct soc_bytes_ext *params = (void *)kcontrol->private_value; 788 789 ucontrol->type = SNDRV_CTL_ELEM_TYPE_BYTES; 790 ucontrol->count = params->max; 791 792 return 0; 793} 794EXPORT_SYMBOL_GPL(snd_soc_bytes_info_ext); 795 796int snd_soc_bytes_tlv_callback(struct snd_kcontrol *kcontrol, int op_flag, 797 unsigned int size, unsigned int __user *tlv) 798{ 799 struct soc_bytes_ext *params = (void *)kcontrol->private_value; 800 unsigned int count = size < params->max ? size : params->max; 801 int ret = -ENXIO; 802 803 switch (op_flag) { 804 case SNDRV_CTL_TLV_OP_READ: 805 if (params->get) 806 ret = params->get(kcontrol, tlv, count); 807 break; 808 case SNDRV_CTL_TLV_OP_WRITE: 809 if (params->put) 810 ret = params->put(kcontrol, tlv, count); 811 break; 812 } 813 return ret; 814} 815EXPORT_SYMBOL_GPL(snd_soc_bytes_tlv_callback); 816 817/** 818 * snd_soc_info_xr_sx - signed multi register info callback 819 * @kcontrol: mreg control 820 * @uinfo: control element information 821 * 822 * Callback to provide information of a control that can 823 * span multiple codec registers which together 824 * forms a single signed value in a MSB/LSB manner. 825 * 826 * Returns 0 for success. 827 */ 828int snd_soc_info_xr_sx(struct snd_kcontrol *kcontrol, 829 struct snd_ctl_elem_info *uinfo) 830{ 831 struct soc_mreg_control *mc = 832 (struct soc_mreg_control *)kcontrol->private_value; 833 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 834 uinfo->count = 1; 835 uinfo->value.integer.min = mc->min; 836 uinfo->value.integer.max = mc->max; 837 838 return 0; 839} 840EXPORT_SYMBOL_GPL(snd_soc_info_xr_sx); 841 842/** 843 * snd_soc_get_xr_sx - signed multi register get callback 844 * @kcontrol: mreg control 845 * @ucontrol: control element information 846 * 847 * Callback to get the value of a control that can span 848 * multiple codec registers which together forms a single 849 * signed value in a MSB/LSB manner. The control supports 850 * specifying total no of bits used to allow for bitfields 851 * across the multiple codec registers. 852 * 853 * Returns 0 for success. 854 */ 855int snd_soc_get_xr_sx(struct snd_kcontrol *kcontrol, 856 struct snd_ctl_elem_value *ucontrol) 857{ 858 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 859 struct soc_mreg_control *mc = 860 (struct soc_mreg_control *)kcontrol->private_value; 861 unsigned int regbase = mc->regbase; 862 unsigned int regcount = mc->regcount; 863 unsigned int regwshift = component->val_bytes * BITS_PER_BYTE; 864 unsigned int regwmask = (1UL<<regwshift)-1; 865 unsigned int invert = mc->invert; 866 unsigned long mask = (1UL<<mc->nbits)-1; 867 long min = mc->min; 868 long max = mc->max; 869 long val = 0; 870 unsigned int i; 871 872 for (i = 0; i < regcount; i++) { 873 unsigned int regval = snd_soc_component_read(component, regbase+i); 874 val |= (regval & regwmask) << (regwshift*(regcount-i-1)); 875 } 876 val &= mask; 877 if (min < 0 && val > max) 878 val |= ~mask; 879 if (invert) 880 val = max - val; 881 ucontrol->value.integer.value[0] = val; 882 883 return 0; 884} 885EXPORT_SYMBOL_GPL(snd_soc_get_xr_sx); 886 887/** 888 * snd_soc_put_xr_sx - signed multi register get callback 889 * @kcontrol: mreg control 890 * @ucontrol: control element information 891 * 892 * Callback to set the value of a control that can span 893 * multiple codec registers which together forms a single 894 * signed value in a MSB/LSB manner. The control supports 895 * specifying total no of bits used to allow for bitfields 896 * across the multiple codec registers. 897 * 898 * Returns 0 for success. 899 */ 900int snd_soc_put_xr_sx(struct snd_kcontrol *kcontrol, 901 struct snd_ctl_elem_value *ucontrol) 902{ 903 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 904 struct soc_mreg_control *mc = 905 (struct soc_mreg_control *)kcontrol->private_value; 906 unsigned int regbase = mc->regbase; 907 unsigned int regcount = mc->regcount; 908 unsigned int regwshift = component->val_bytes * BITS_PER_BYTE; 909 unsigned int regwmask = (1UL<<regwshift)-1; 910 unsigned int invert = mc->invert; 911 unsigned long mask = (1UL<<mc->nbits)-1; 912 long max = mc->max; 913 long val = ucontrol->value.integer.value[0]; 914 int ret = 0; 915 unsigned int i; 916 917 if (val < mc->min || val > mc->max) 918 return -EINVAL; 919 if (invert) 920 val = max - val; 921 val &= mask; 922 for (i = 0; i < regcount; i++) { 923 unsigned int regval = (val >> (regwshift*(regcount-i-1))) & regwmask; 924 unsigned int regmask = (mask >> (regwshift*(regcount-i-1))) & regwmask; 925 int err = snd_soc_component_update_bits(component, regbase+i, 926 regmask, regval); 927 if (err < 0) 928 return err; 929 if (err > 0) 930 ret = err; 931 } 932 933 return ret; 934} 935EXPORT_SYMBOL_GPL(snd_soc_put_xr_sx); 936 937/** 938 * snd_soc_get_strobe - strobe get callback 939 * @kcontrol: mixer control 940 * @ucontrol: control element information 941 * 942 * Callback get the value of a strobe mixer control. 943 * 944 * Returns 0 for success. 945 */ 946int snd_soc_get_strobe(struct snd_kcontrol *kcontrol, 947 struct snd_ctl_elem_value *ucontrol) 948{ 949 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 950 struct soc_mixer_control *mc = 951 (struct soc_mixer_control *)kcontrol->private_value; 952 unsigned int reg = mc->reg; 953 unsigned int shift = mc->shift; 954 unsigned int mask = 1 << shift; 955 unsigned int invert = mc->invert != 0; 956 unsigned int val; 957 958 val = snd_soc_component_read(component, reg); 959 val &= mask; 960 961 if (shift != 0 && val != 0) 962 val = val >> shift; 963 ucontrol->value.enumerated.item[0] = val ^ invert; 964 965 return 0; 966} 967EXPORT_SYMBOL_GPL(snd_soc_get_strobe); 968 969/** 970 * snd_soc_put_strobe - strobe put callback 971 * @kcontrol: mixer control 972 * @ucontrol: control element information 973 * 974 * Callback strobe a register bit to high then low (or the inverse) 975 * in one pass of a single mixer enum control. 976 * 977 * Returns 1 for success. 978 */ 979int snd_soc_put_strobe(struct snd_kcontrol *kcontrol, 980 struct snd_ctl_elem_value *ucontrol) 981{ 982 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 983 struct soc_mixer_control *mc = 984 (struct soc_mixer_control *)kcontrol->private_value; 985 unsigned int reg = mc->reg; 986 unsigned int shift = mc->shift; 987 unsigned int mask = 1 << shift; 988 unsigned int invert = mc->invert != 0; 989 unsigned int strobe = ucontrol->value.enumerated.item[0] != 0; 990 unsigned int val1 = (strobe ^ invert) ? mask : 0; 991 unsigned int val2 = (strobe ^ invert) ? 0 : mask; 992 int err; 993 994 err = snd_soc_component_update_bits(component, reg, mask, val1); 995 if (err < 0) 996 return err; 997 998 return snd_soc_component_update_bits(component, reg, mask, val2); 999} 1000EXPORT_SYMBOL_GPL(snd_soc_put_strobe);