linux/sound/soc/soc-ops.c
<<
>>
Prefs
   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        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}
  82EXPORT_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 */
  93int 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}
 115EXPORT_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 */
 132static 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 */
 181int 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}
 202EXPORT_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 */
 216int 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}
 230EXPORT_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 */
 242int 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}
 290EXPORT_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 */
 302int 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}
 352EXPORT_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 */
 364int 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}
 397EXPORT_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 */
 408int 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}
 443EXPORT_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 */
 455int 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}
 474EXPORT_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 */
 485int 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}
 526EXPORT_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 */
 537int 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}
 581EXPORT_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 */
 592int 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}
 620EXPORT_SYMBOL_GPL(snd_soc_limit_volume);
 621
 622int 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}
 633EXPORT_SYMBOL_GPL(snd_soc_bytes_info);
 634
 635int 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}
 670EXPORT_SYMBOL_GPL(snd_soc_bytes_get);
 671
 672int 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
 748out:
 749        kfree(data);
 750
 751        return ret;
 752}
 753EXPORT_SYMBOL_GPL(snd_soc_bytes_put);
 754
 755int 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}
 765EXPORT_SYMBOL_GPL(snd_soc_bytes_info_ext);
 766
 767int 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}
 786EXPORT_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 */
 799int 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}
 811EXPORT_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 */
 826int 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 = (1<<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}
 860EXPORT_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 */
 875int 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 = (1<<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}
 906EXPORT_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 */
 917int 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}
 942EXPORT_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 */
 954int 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}
 975EXPORT_SYMBOL_GPL(snd_soc_put_strobe);
 976