root/sound/soc/soc-ops.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. snd_soc_info_enum_double
  2. snd_soc_get_enum_double
  3. snd_soc_put_enum_double
  4. snd_soc_read_signed
  5. snd_soc_info_volsw
  6. snd_soc_info_volsw_sx
  7. snd_soc_get_volsw
  8. snd_soc_put_volsw
  9. snd_soc_get_volsw_sx
  10. snd_soc_put_volsw_sx
  11. snd_soc_info_volsw_range
  12. snd_soc_put_volsw_range
  13. snd_soc_get_volsw_range
  14. snd_soc_limit_volume
  15. snd_soc_bytes_info
  16. snd_soc_bytes_get
  17. snd_soc_bytes_put
  18. snd_soc_bytes_info_ext
  19. snd_soc_bytes_tlv_callback
  20. snd_soc_info_xr_sx
  21. snd_soc_get_xr_sx
  22. snd_soc_put_xr_sx
  23. snd_soc_get_strobe
  24. snd_soc_put_strobe

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

/* [<][>][^][v][top][bottom][index][help] */