linux/sound/soc/soc-component.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2//
   3// soc-component.c
   4//
   5// Copyright 2009-2011 Wolfson Microelectronics PLC.
   6// Copyright (C) 2019 Renesas Electronics Corp.
   7//
   8// Mark Brown <broonie@opensource.wolfsonmicro.com>
   9// Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
  10//
  11#include <linux/module.h>
  12#include <linux/pm_runtime.h>
  13#include <sound/soc.h>
  14#include <linux/bitops.h>
  15
  16#define soc_component_ret(dai, ret) _soc_component_ret(dai, __func__, ret)
  17static inline int _soc_component_ret(struct snd_soc_component *component, const char *func, int ret)
  18{
  19        return snd_soc_ret(component->dev, ret,
  20                           "at %s() on %s\n", func, component->name);
  21}
  22
  23#define soc_component_ret_reg_rw(dai, ret, reg) _soc_component_ret_reg_rw(dai, __func__, ret, reg)
  24static inline int _soc_component_ret_reg_rw(struct snd_soc_component *component,
  25                                            const char *func, int ret, int reg)
  26{
  27        return snd_soc_ret(component->dev, ret,
  28                           "at %s() on %s for register: [0x%08x]\n",
  29                           func, component->name, reg);
  30}
  31
  32static inline int soc_component_field_shift(struct snd_soc_component *component,
  33                                            unsigned int mask)
  34{
  35        if (!mask) {
  36                dev_err(component->dev, "ASoC: error field mask is zero for %s\n",
  37                        component->name);
  38                return 0;
  39        }
  40
  41        return (ffs(mask) - 1);
  42}
  43
  44/*
  45 * We might want to check substream by using list.
  46 * In such case, we can update these macros.
  47 */
  48#define soc_component_mark_push(component, substream, tgt)      ((component)->mark_##tgt = substream)
  49#define soc_component_mark_pop(component, tgt)  ((component)->mark_##tgt = NULL)
  50#define soc_component_mark_match(component, substream, tgt)     ((component)->mark_##tgt == substream)
  51
  52void snd_soc_component_set_aux(struct snd_soc_component *component,
  53                               struct snd_soc_aux_dev *aux)
  54{
  55        component->init = (aux) ? aux->init : NULL;
  56}
  57
  58int snd_soc_component_init(struct snd_soc_component *component)
  59{
  60        int ret = 0;
  61
  62        if (component->init)
  63                ret = component->init(component);
  64
  65        return soc_component_ret(component, ret);
  66}
  67
  68/**
  69 * snd_soc_component_set_sysclk - configure COMPONENT system or master clock.
  70 * @component: COMPONENT
  71 * @clk_id: DAI specific clock ID
  72 * @source: Source for the clock
  73 * @freq: new clock frequency in Hz
  74 * @dir: new clock direction - input/output.
  75 *
  76 * Configures the CODEC master (MCLK) or system (SYSCLK) clocking.
  77 */
  78int snd_soc_component_set_sysclk(struct snd_soc_component *component,
  79                                 int clk_id, int source, unsigned int freq,
  80                                 int dir)
  81{
  82        int ret = -ENOTSUPP;
  83
  84        if (component->driver->set_sysclk)
  85                ret = component->driver->set_sysclk(component, clk_id, source,
  86                                                     freq, dir);
  87
  88        return soc_component_ret(component, ret);
  89}
  90EXPORT_SYMBOL_GPL(snd_soc_component_set_sysclk);
  91
  92/*
  93 * snd_soc_component_set_pll - configure component PLL.
  94 * @component: COMPONENT
  95 * @pll_id: DAI specific PLL ID
  96 * @source: DAI specific source for the PLL
  97 * @freq_in: PLL input clock frequency in Hz
  98 * @freq_out: requested PLL output clock frequency in Hz
  99 *
 100 * Configures and enables PLL to generate output clock based on input clock.
 101 */
 102int snd_soc_component_set_pll(struct snd_soc_component *component, int pll_id,
 103                              int source, unsigned int freq_in,
 104                              unsigned int freq_out)
 105{
 106        int ret = -EINVAL;
 107
 108        if (component->driver->set_pll)
 109                ret = component->driver->set_pll(component, pll_id, source,
 110                                                  freq_in, freq_out);
 111
 112        return soc_component_ret(component, ret);
 113}
 114EXPORT_SYMBOL_GPL(snd_soc_component_set_pll);
 115
 116void snd_soc_component_seq_notifier(struct snd_soc_component *component,
 117                                    enum snd_soc_dapm_type type, int subseq)
 118{
 119        if (component->driver->seq_notifier)
 120                component->driver->seq_notifier(component, type, subseq);
 121}
 122
 123int snd_soc_component_stream_event(struct snd_soc_component *component,
 124                                   int event)
 125{
 126        int ret = 0;
 127
 128        if (component->driver->stream_event)
 129                ret = component->driver->stream_event(component, event);
 130
 131        return soc_component_ret(component, ret);
 132}
 133
 134int snd_soc_component_set_bias_level(struct snd_soc_component *component,
 135                                     enum snd_soc_bias_level level)
 136{
 137        int ret = 0;
 138
 139        if (component->driver->set_bias_level)
 140                ret = component->driver->set_bias_level(component, level);
 141
 142        return soc_component_ret(component, ret);
 143}
 144
 145int snd_soc_component_enable_pin(struct snd_soc_component *component,
 146                                 const char *pin)
 147{
 148        struct snd_soc_dapm_context *dapm =
 149                snd_soc_component_get_dapm(component);
 150        return snd_soc_dapm_enable_pin(dapm, pin);
 151}
 152EXPORT_SYMBOL_GPL(snd_soc_component_enable_pin);
 153
 154int snd_soc_component_enable_pin_unlocked(struct snd_soc_component *component,
 155                                          const char *pin)
 156{
 157        struct snd_soc_dapm_context *dapm =
 158                snd_soc_component_get_dapm(component);
 159        return snd_soc_dapm_enable_pin_unlocked(dapm, pin);
 160}
 161EXPORT_SYMBOL_GPL(snd_soc_component_enable_pin_unlocked);
 162
 163int snd_soc_component_disable_pin(struct snd_soc_component *component,
 164                                  const char *pin)
 165{
 166        struct snd_soc_dapm_context *dapm =
 167                snd_soc_component_get_dapm(component);
 168        return snd_soc_dapm_disable_pin(dapm, pin);
 169}
 170EXPORT_SYMBOL_GPL(snd_soc_component_disable_pin);
 171
 172int snd_soc_component_disable_pin_unlocked(struct snd_soc_component *component,
 173                                           const char *pin)
 174{
 175        struct snd_soc_dapm_context *dapm = 
 176                snd_soc_component_get_dapm(component);
 177        return snd_soc_dapm_disable_pin_unlocked(dapm, pin);
 178}
 179EXPORT_SYMBOL_GPL(snd_soc_component_disable_pin_unlocked);
 180
 181int snd_soc_component_nc_pin(struct snd_soc_component *component,
 182                             const char *pin)
 183{
 184        struct snd_soc_dapm_context *dapm =
 185                snd_soc_component_get_dapm(component);
 186        return snd_soc_dapm_nc_pin(dapm, pin);
 187}
 188EXPORT_SYMBOL_GPL(snd_soc_component_nc_pin);
 189
 190int snd_soc_component_nc_pin_unlocked(struct snd_soc_component *component,
 191                                      const char *pin)
 192{
 193        struct snd_soc_dapm_context *dapm =
 194                snd_soc_component_get_dapm(component);
 195        return snd_soc_dapm_nc_pin_unlocked(dapm, pin);
 196}
 197EXPORT_SYMBOL_GPL(snd_soc_component_nc_pin_unlocked);
 198
 199int snd_soc_component_get_pin_status(struct snd_soc_component *component,
 200                                     const char *pin)
 201{
 202        struct snd_soc_dapm_context *dapm =
 203                snd_soc_component_get_dapm(component);
 204        return snd_soc_dapm_get_pin_status(dapm, pin);
 205}
 206EXPORT_SYMBOL_GPL(snd_soc_component_get_pin_status);
 207
 208int snd_soc_component_force_enable_pin(struct snd_soc_component *component,
 209                                       const char *pin)
 210{
 211        struct snd_soc_dapm_context *dapm =
 212                snd_soc_component_get_dapm(component);
 213        return snd_soc_dapm_force_enable_pin(dapm, pin);
 214}
 215EXPORT_SYMBOL_GPL(snd_soc_component_force_enable_pin);
 216
 217int snd_soc_component_force_enable_pin_unlocked(
 218        struct snd_soc_component *component,
 219        const char *pin)
 220{
 221        struct snd_soc_dapm_context *dapm =
 222                snd_soc_component_get_dapm(component);
 223        return snd_soc_dapm_force_enable_pin_unlocked(dapm, pin);
 224}
 225EXPORT_SYMBOL_GPL(snd_soc_component_force_enable_pin_unlocked);
 226
 227static void soc_get_kcontrol_name(struct snd_soc_component *component,
 228                                  char *buf, int size, const char * const ctl)
 229{
 230        /* When updating, change also snd_soc_dapm_widget_name_cmp() */
 231        if (component->name_prefix)
 232                snprintf(buf, size, "%s %s", component->name_prefix, ctl);
 233        else
 234                snprintf(buf, size, "%s", ctl);
 235}
 236
 237struct snd_kcontrol *snd_soc_component_get_kcontrol(struct snd_soc_component *component,
 238                                                    const char * const ctl)
 239{
 240        char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
 241
 242        soc_get_kcontrol_name(component, name, ARRAY_SIZE(name), ctl);
 243
 244        return snd_soc_card_get_kcontrol(component->card, name);
 245}
 246EXPORT_SYMBOL_GPL(snd_soc_component_get_kcontrol);
 247
 248int snd_soc_component_notify_control(struct snd_soc_component *component,
 249                                     const char * const ctl)
 250{
 251        struct snd_kcontrol *kctl;
 252
 253        kctl = snd_soc_component_get_kcontrol(component, ctl);
 254        if (!kctl)
 255                return soc_component_ret(component, -EINVAL);
 256
 257        snd_ctl_notify(component->card->snd_card,
 258                       SNDRV_CTL_EVENT_MASK_VALUE, &kctl->id);
 259
 260        return 0;
 261}
 262EXPORT_SYMBOL_GPL(snd_soc_component_notify_control);
 263
 264/**
 265 * snd_soc_component_set_jack - configure component jack.
 266 * @component: COMPONENTs
 267 * @jack: structure to use for the jack
 268 * @data: can be used if codec driver need extra data for configuring jack
 269 *
 270 * Configures and enables jack detection function.
 271 */
 272int snd_soc_component_set_jack(struct snd_soc_component *component,
 273                               struct snd_soc_jack *jack, void *data)
 274{
 275        int ret = -ENOTSUPP;
 276
 277        if (component->driver->set_jack)
 278                ret = component->driver->set_jack(component, jack, data);
 279
 280        return soc_component_ret(component, ret);
 281}
 282EXPORT_SYMBOL_GPL(snd_soc_component_set_jack);
 283
 284/**
 285 * snd_soc_component_get_jack_type
 286 * @component: COMPONENTs
 287 *
 288 * Returns the jack type of the component
 289 * This can either be the supported type or one read from
 290 * devicetree with the property: jack-type.
 291 */
 292int snd_soc_component_get_jack_type(
 293        struct snd_soc_component *component)
 294{
 295        int ret = -ENOTSUPP;
 296
 297        if (component->driver->get_jack_type)
 298                ret = component->driver->get_jack_type(component);
 299
 300        return soc_component_ret(component, ret);
 301}
 302EXPORT_SYMBOL_GPL(snd_soc_component_get_jack_type);
 303
 304int snd_soc_component_module_get(struct snd_soc_component *component,
 305                                 void *mark, int upon_open)
 306{
 307        int ret = 0;
 308
 309        if (component->driver->module_get_upon_open == !!upon_open &&
 310            !try_module_get(component->dev->driver->owner))
 311                ret = -ENODEV;
 312
 313        /* mark module if succeeded */
 314        if (ret == 0)
 315                soc_component_mark_push(component, mark, module);
 316
 317        return soc_component_ret(component, ret);
 318}
 319
 320void snd_soc_component_module_put(struct snd_soc_component *component,
 321                                  void *mark, int upon_open, int rollback)
 322{
 323        if (rollback && !soc_component_mark_match(component, mark, module))
 324                return;
 325
 326        if (component->driver->module_get_upon_open == !!upon_open)
 327                module_put(component->dev->driver->owner);
 328
 329        /* remove the mark from module */
 330        soc_component_mark_pop(component, module);
 331}
 332
 333int snd_soc_component_open(struct snd_soc_component *component,
 334                           struct snd_pcm_substream *substream)
 335{
 336        int ret = 0;
 337
 338        if (component->driver->open)
 339                ret = component->driver->open(component, substream);
 340
 341        /* mark substream if succeeded */
 342        if (ret == 0)
 343                soc_component_mark_push(component, substream, open);
 344
 345        return soc_component_ret(component, ret);
 346}
 347
 348int snd_soc_component_close(struct snd_soc_component *component,
 349                            struct snd_pcm_substream *substream,
 350                            int rollback)
 351{
 352        int ret = 0;
 353
 354        if (rollback && !soc_component_mark_match(component, substream, open))
 355                return 0;
 356
 357        if (component->driver->close)
 358                ret = component->driver->close(component, substream);
 359
 360        /* remove marked substream */
 361        soc_component_mark_pop(component, open);
 362
 363        return soc_component_ret(component, ret);
 364}
 365
 366void snd_soc_component_suspend(struct snd_soc_component *component)
 367{
 368        if (component->driver->suspend)
 369                component->driver->suspend(component);
 370        component->suspended = 1;
 371}
 372
 373void snd_soc_component_resume(struct snd_soc_component *component)
 374{
 375        if (component->driver->resume)
 376                component->driver->resume(component);
 377        component->suspended = 0;
 378}
 379
 380int snd_soc_component_is_suspended(struct snd_soc_component *component)
 381{
 382        return component->suspended;
 383}
 384
 385int snd_soc_component_probe(struct snd_soc_component *component)
 386{
 387        int ret = 0;
 388
 389        if (component->driver->probe)
 390                ret = component->driver->probe(component);
 391
 392        return soc_component_ret(component, ret);
 393}
 394
 395void snd_soc_component_remove(struct snd_soc_component *component)
 396{
 397        if (component->driver->remove)
 398                component->driver->remove(component);
 399}
 400
 401int snd_soc_component_of_xlate_dai_id(struct snd_soc_component *component,
 402                                      struct device_node *ep)
 403{
 404        int ret = -ENOTSUPP;
 405
 406        if (component->driver->of_xlate_dai_id)
 407                ret = component->driver->of_xlate_dai_id(component, ep);
 408
 409        return soc_component_ret(component, ret);
 410}
 411
 412int snd_soc_component_of_xlate_dai_name(struct snd_soc_component *component,
 413                                        const struct of_phandle_args *args,
 414                                        const char **dai_name)
 415{
 416        if (component->driver->of_xlate_dai_name)
 417                return component->driver->of_xlate_dai_name(component,
 418                                                            args, dai_name);
 419        /*
 420         * Don't use soc_component_ret here because we may not want to report
 421         * the error just yet. If a device has more than one component, the
 422         * first may not match and we don't want spam the log with this.
 423         */
 424        return -ENOTSUPP;
 425}
 426
 427void snd_soc_component_setup_regmap(struct snd_soc_component *component)
 428{
 429        int val_bytes = regmap_get_val_bytes(component->regmap);
 430
 431        /* Errors are legitimate for non-integer byte multiples */
 432        if (val_bytes > 0)
 433                component->val_bytes = val_bytes;
 434}
 435
 436#ifdef CONFIG_REGMAP
 437
 438/**
 439 * snd_soc_component_init_regmap() - Initialize regmap instance for the
 440 *                                   component
 441 * @component: The component for which to initialize the regmap instance
 442 * @regmap: The regmap instance that should be used by the component
 443 *
 444 * This function allows deferred assignment of the regmap instance that is
 445 * associated with the component. Only use this if the regmap instance is not
 446 * yet ready when the component is registered. The function must also be called
 447 * before the first IO attempt of the component.
 448 */
 449void snd_soc_component_init_regmap(struct snd_soc_component *component,
 450                                   struct regmap *regmap)
 451{
 452        component->regmap = regmap;
 453        snd_soc_component_setup_regmap(component);
 454}
 455EXPORT_SYMBOL_GPL(snd_soc_component_init_regmap);
 456
 457/**
 458 * snd_soc_component_exit_regmap() - De-initialize regmap instance for the
 459 *                                   component
 460 * @component: The component for which to de-initialize the regmap instance
 461 *
 462 * Calls regmap_exit() on the regmap instance associated to the component and
 463 * removes the regmap instance from the component.
 464 *
 465 * This function should only be used if snd_soc_component_init_regmap() was used
 466 * to initialize the regmap instance.
 467 */
 468void snd_soc_component_exit_regmap(struct snd_soc_component *component)
 469{
 470        regmap_exit(component->regmap);
 471        component->regmap = NULL;
 472}
 473EXPORT_SYMBOL_GPL(snd_soc_component_exit_regmap);
 474
 475#endif
 476
 477int snd_soc_component_compr_open(struct snd_soc_component *component,
 478                                 struct snd_compr_stream *cstream)
 479{
 480        int ret = 0;
 481
 482        if (component->driver->compress_ops &&
 483            component->driver->compress_ops->open)
 484                ret = component->driver->compress_ops->open(component, cstream);
 485
 486        /* mark substream if succeeded */
 487        if (ret == 0)
 488                soc_component_mark_push(component, cstream, compr_open);
 489
 490        return soc_component_ret(component, ret);
 491}
 492EXPORT_SYMBOL_GPL(snd_soc_component_compr_open);
 493
 494void snd_soc_component_compr_free(struct snd_soc_component *component,
 495                                  struct snd_compr_stream *cstream,
 496                                  int rollback)
 497{
 498        if (rollback && !soc_component_mark_match(component, cstream, compr_open))
 499                return;
 500
 501        if (component->driver->compress_ops &&
 502            component->driver->compress_ops->free)
 503                component->driver->compress_ops->free(component, cstream);
 504
 505        /* remove marked substream */
 506        soc_component_mark_pop(component, compr_open);
 507}
 508EXPORT_SYMBOL_GPL(snd_soc_component_compr_free);
 509
 510int snd_soc_component_compr_trigger(struct snd_compr_stream *cstream, int cmd)
 511{
 512        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
 513        struct snd_soc_component *component;
 514        int i, ret;
 515
 516        for_each_rtd_components(rtd, i, component) {
 517                if (component->driver->compress_ops &&
 518                    component->driver->compress_ops->trigger) {
 519                        ret = component->driver->compress_ops->trigger(
 520                                component, cstream, cmd);
 521                        if (ret < 0)
 522                                return soc_component_ret(component, ret);
 523                }
 524        }
 525
 526        return 0;
 527}
 528EXPORT_SYMBOL_GPL(snd_soc_component_compr_trigger);
 529
 530int snd_soc_component_compr_set_params(struct snd_compr_stream *cstream,
 531                                       struct snd_compr_params *params)
 532{
 533        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
 534        struct snd_soc_component *component;
 535        int i, ret;
 536
 537        for_each_rtd_components(rtd, i, component) {
 538                if (component->driver->compress_ops &&
 539                    component->driver->compress_ops->set_params) {
 540                        ret = component->driver->compress_ops->set_params(
 541                                component, cstream, params);
 542                        if (ret < 0)
 543                                return soc_component_ret(component, ret);
 544                }
 545        }
 546
 547        return 0;
 548}
 549EXPORT_SYMBOL_GPL(snd_soc_component_compr_set_params);
 550
 551int snd_soc_component_compr_get_params(struct snd_compr_stream *cstream,
 552                                       struct snd_codec *params)
 553{
 554        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
 555        struct snd_soc_component *component;
 556        int i, ret;
 557
 558        for_each_rtd_components(rtd, i, component) {
 559                if (component->driver->compress_ops &&
 560                    component->driver->compress_ops->get_params) {
 561                        ret = component->driver->compress_ops->get_params(
 562                                component, cstream, params);
 563                        return soc_component_ret(component, ret);
 564                }
 565        }
 566
 567        return 0;
 568}
 569EXPORT_SYMBOL_GPL(snd_soc_component_compr_get_params);
 570
 571int snd_soc_component_compr_get_caps(struct snd_compr_stream *cstream,
 572                                     struct snd_compr_caps *caps)
 573{
 574        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
 575        struct snd_soc_component *component;
 576        int i, ret = 0;
 577
 578        snd_soc_dpcm_mutex_lock(rtd);
 579
 580        for_each_rtd_components(rtd, i, component) {
 581                if (component->driver->compress_ops &&
 582                    component->driver->compress_ops->get_caps) {
 583                        ret = component->driver->compress_ops->get_caps(
 584                                component, cstream, caps);
 585                        break;
 586                }
 587        }
 588
 589        snd_soc_dpcm_mutex_unlock(rtd);
 590
 591        return soc_component_ret(component, ret);
 592}
 593EXPORT_SYMBOL_GPL(snd_soc_component_compr_get_caps);
 594
 595int snd_soc_component_compr_get_codec_caps(struct snd_compr_stream *cstream,
 596                                           struct snd_compr_codec_caps *codec)
 597{
 598        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
 599        struct snd_soc_component *component;
 600        int i, ret = 0;
 601
 602        snd_soc_dpcm_mutex_lock(rtd);
 603
 604        for_each_rtd_components(rtd, i, component) {
 605                if (component->driver->compress_ops &&
 606                    component->driver->compress_ops->get_codec_caps) {
 607                        ret = component->driver->compress_ops->get_codec_caps(
 608                                component, cstream, codec);
 609                        break;
 610                }
 611        }
 612
 613        snd_soc_dpcm_mutex_unlock(rtd);
 614
 615        return soc_component_ret(component, ret);
 616}
 617EXPORT_SYMBOL_GPL(snd_soc_component_compr_get_codec_caps);
 618
 619int snd_soc_component_compr_ack(struct snd_compr_stream *cstream, size_t bytes)
 620{
 621        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
 622        struct snd_soc_component *component;
 623        int i, ret;
 624
 625        for_each_rtd_components(rtd, i, component) {
 626                if (component->driver->compress_ops &&
 627                    component->driver->compress_ops->ack) {
 628                        ret = component->driver->compress_ops->ack(
 629                                component, cstream, bytes);
 630                        if (ret < 0)
 631                                return soc_component_ret(component, ret);
 632                }
 633        }
 634
 635        return 0;
 636}
 637EXPORT_SYMBOL_GPL(snd_soc_component_compr_ack);
 638
 639int snd_soc_component_compr_pointer(struct snd_compr_stream *cstream,
 640                                    struct snd_compr_tstamp *tstamp)
 641{
 642        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
 643        struct snd_soc_component *component;
 644        int i, ret;
 645
 646        for_each_rtd_components(rtd, i, component) {
 647                if (component->driver->compress_ops &&
 648                    component->driver->compress_ops->pointer) {
 649                        ret = component->driver->compress_ops->pointer(
 650                                component, cstream, tstamp);
 651                        return soc_component_ret(component, ret);
 652                }
 653        }
 654
 655        return 0;
 656}
 657EXPORT_SYMBOL_GPL(snd_soc_component_compr_pointer);
 658
 659int snd_soc_component_compr_copy(struct snd_compr_stream *cstream,
 660                                 char __user *buf, size_t count)
 661{
 662        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
 663        struct snd_soc_component *component;
 664        int i, ret = 0;
 665
 666        snd_soc_dpcm_mutex_lock(rtd);
 667
 668        for_each_rtd_components(rtd, i, component) {
 669                if (component->driver->compress_ops &&
 670                    component->driver->compress_ops->copy) {
 671                        ret = component->driver->compress_ops->copy(
 672                                component, cstream, buf, count);
 673                        break;
 674                }
 675        }
 676
 677        snd_soc_dpcm_mutex_unlock(rtd);
 678
 679        return soc_component_ret(component, ret);
 680}
 681EXPORT_SYMBOL_GPL(snd_soc_component_compr_copy);
 682
 683int snd_soc_component_compr_set_metadata(struct snd_compr_stream *cstream,
 684                                         struct snd_compr_metadata *metadata)
 685{
 686        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
 687        struct snd_soc_component *component;
 688        int i, ret;
 689
 690        for_each_rtd_components(rtd, i, component) {
 691                if (component->driver->compress_ops &&
 692                    component->driver->compress_ops->set_metadata) {
 693                        ret = component->driver->compress_ops->set_metadata(
 694                                component, cstream, metadata);
 695                        if (ret < 0)
 696                                return soc_component_ret(component, ret);
 697                }
 698        }
 699
 700        return 0;
 701}
 702EXPORT_SYMBOL_GPL(snd_soc_component_compr_set_metadata);
 703
 704int snd_soc_component_compr_get_metadata(struct snd_compr_stream *cstream,
 705                                         struct snd_compr_metadata *metadata)
 706{
 707        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
 708        struct snd_soc_component *component;
 709        int i, ret;
 710
 711        for_each_rtd_components(rtd, i, component) {
 712                if (component->driver->compress_ops &&
 713                    component->driver->compress_ops->get_metadata) {
 714                        ret = component->driver->compress_ops->get_metadata(
 715                                component, cstream, metadata);
 716                        return soc_component_ret(component, ret);
 717                }
 718        }
 719
 720        return 0;
 721}
 722EXPORT_SYMBOL_GPL(snd_soc_component_compr_get_metadata);
 723
 724static unsigned int soc_component_read_no_lock(
 725        struct snd_soc_component *component,
 726        unsigned int reg)
 727{
 728        int ret;
 729        unsigned int val = 0;
 730
 731        if (component->regmap)
 732                ret = regmap_read(component->regmap, reg, &val);
 733        else if (component->driver->read) {
 734                ret = 0;
 735                val = component->driver->read(component, reg);
 736        }
 737        else
 738                ret = -EIO;
 739
 740        if (ret < 0)
 741                return soc_component_ret_reg_rw(component, ret, reg);
 742
 743        return val;
 744}
 745
 746/**
 747 * snd_soc_component_read() - Read register value
 748 * @component: Component to read from
 749 * @reg: Register to read
 750 *
 751 * Return: read value
 752 */
 753unsigned int snd_soc_component_read(struct snd_soc_component *component,
 754                                    unsigned int reg)
 755{
 756        unsigned int val;
 757
 758        mutex_lock(&component->io_mutex);
 759        val = soc_component_read_no_lock(component, reg);
 760        mutex_unlock(&component->io_mutex);
 761
 762        return val;
 763}
 764EXPORT_SYMBOL_GPL(snd_soc_component_read);
 765
 766static int soc_component_write_no_lock(
 767        struct snd_soc_component *component,
 768        unsigned int reg, unsigned int val)
 769{
 770        int ret = -EIO;
 771
 772        if (component->regmap)
 773                ret = regmap_write(component->regmap, reg, val);
 774        else if (component->driver->write)
 775                ret = component->driver->write(component, reg, val);
 776
 777        return soc_component_ret_reg_rw(component, ret, reg);
 778}
 779
 780/**
 781 * snd_soc_component_write() - Write register value
 782 * @component: Component to write to
 783 * @reg: Register to write
 784 * @val: Value to write to the register
 785 *
 786 * Return: 0 on success, a negative error code otherwise.
 787 */
 788int snd_soc_component_write(struct snd_soc_component *component,
 789                            unsigned int reg, unsigned int val)
 790{
 791        int ret;
 792
 793        mutex_lock(&component->io_mutex);
 794        ret = soc_component_write_no_lock(component, reg, val);
 795        mutex_unlock(&component->io_mutex);
 796
 797        return ret;
 798}
 799EXPORT_SYMBOL_GPL(snd_soc_component_write);
 800
 801static int snd_soc_component_update_bits_legacy(
 802        struct snd_soc_component *component, unsigned int reg,
 803        unsigned int mask, unsigned int val, bool *change)
 804{
 805        unsigned int old, new;
 806        int ret = 0;
 807
 808        mutex_lock(&component->io_mutex);
 809
 810        old = soc_component_read_no_lock(component, reg);
 811
 812        new = (old & ~mask) | (val & mask);
 813        *change = old != new;
 814        if (*change)
 815                ret = soc_component_write_no_lock(component, reg, new);
 816
 817        mutex_unlock(&component->io_mutex);
 818
 819        return soc_component_ret_reg_rw(component, ret, reg);
 820}
 821
 822/**
 823 * snd_soc_component_update_bits() - Perform read/modify/write cycle
 824 * @component: Component to update
 825 * @reg: Register to update
 826 * @mask: Mask that specifies which bits to update
 827 * @val: New value for the bits specified by mask
 828 *
 829 * Return: 1 if the operation was successful and the value of the register
 830 * changed, 0 if the operation was successful, but the value did not change.
 831 * Returns a negative error code otherwise.
 832 */
 833int snd_soc_component_update_bits(struct snd_soc_component *component,
 834                                  unsigned int reg, unsigned int mask, unsigned int val)
 835{
 836        bool change;
 837        int ret;
 838
 839        if (component->regmap)
 840                ret = regmap_update_bits_check(component->regmap, reg, mask,
 841                                               val, &change);
 842        else
 843                ret = snd_soc_component_update_bits_legacy(component, reg,
 844                                                           mask, val, &change);
 845
 846        if (ret < 0)
 847                return soc_component_ret_reg_rw(component, ret, reg);
 848        return change;
 849}
 850EXPORT_SYMBOL_GPL(snd_soc_component_update_bits);
 851
 852/**
 853 * snd_soc_component_update_bits_async() - Perform asynchronous
 854 *  read/modify/write cycle
 855 * @component: Component to update
 856 * @reg: Register to update
 857 * @mask: Mask that specifies which bits to update
 858 * @val: New value for the bits specified by mask
 859 *
 860 * This function is similar to snd_soc_component_update_bits(), but the update
 861 * operation is scheduled asynchronously. This means it may not be completed
 862 * when the function returns. To make sure that all scheduled updates have been
 863 * completed snd_soc_component_async_complete() must be called.
 864 *
 865 * Return: 1 if the operation was successful and the value of the register
 866 * changed, 0 if the operation was successful, but the value did not change.
 867 * Returns a negative error code otherwise.
 868 */
 869int snd_soc_component_update_bits_async(struct snd_soc_component *component,
 870                                        unsigned int reg, unsigned int mask, unsigned int val)
 871{
 872        bool change;
 873        int ret;
 874
 875        if (component->regmap)
 876                ret = regmap_update_bits_check_async(component->regmap, reg,
 877                                                     mask, val, &change);
 878        else
 879                ret = snd_soc_component_update_bits_legacy(component, reg,
 880                                                           mask, val, &change);
 881
 882        if (ret < 0)
 883                return soc_component_ret_reg_rw(component, ret, reg);
 884        return change;
 885}
 886EXPORT_SYMBOL_GPL(snd_soc_component_update_bits_async);
 887
 888/**
 889 * snd_soc_component_read_field() - Read register field value
 890 * @component: Component to read from
 891 * @reg: Register to read
 892 * @mask: mask of the register field
 893 *
 894 * Return: read value of register field.
 895 */
 896unsigned int snd_soc_component_read_field(struct snd_soc_component *component,
 897                                          unsigned int reg, unsigned int mask)
 898{
 899        unsigned int val;
 900
 901        val = snd_soc_component_read(component, reg);
 902
 903        val = (val & mask) >> soc_component_field_shift(component, mask);
 904
 905        return val;
 906}
 907EXPORT_SYMBOL_GPL(snd_soc_component_read_field);
 908
 909/**
 910 * snd_soc_component_write_field() - write to register field
 911 * @component: Component to write to
 912 * @reg: Register to write
 913 * @mask: mask of the register field to update
 914 * @val: value of the field to write
 915 *
 916 * Return: 1 for change, otherwise 0.
 917 */
 918int snd_soc_component_write_field(struct snd_soc_component *component,
 919                                  unsigned int reg, unsigned int mask,
 920                                  unsigned int val)
 921{
 922
 923        val = (val << soc_component_field_shift(component, mask)) & mask;
 924
 925        return snd_soc_component_update_bits(component, reg, mask, val);
 926}
 927EXPORT_SYMBOL_GPL(snd_soc_component_write_field);
 928
 929/**
 930 * snd_soc_component_async_complete() - Ensure asynchronous I/O has completed
 931 * @component: Component for which to wait
 932 *
 933 * This function blocks until all asynchronous I/O which has previously been
 934 * scheduled using snd_soc_component_update_bits_async() has completed.
 935 */
 936void snd_soc_component_async_complete(struct snd_soc_component *component)
 937{
 938        if (component->regmap)
 939                regmap_async_complete(component->regmap);
 940}
 941EXPORT_SYMBOL_GPL(snd_soc_component_async_complete);
 942
 943/**
 944 * snd_soc_component_test_bits - Test register for change
 945 * @component: component
 946 * @reg: Register to test
 947 * @mask: Mask that specifies which bits to test
 948 * @value: Value to test against
 949 *
 950 * Tests a register with a new value and checks if the new value is
 951 * different from the old value.
 952 *
 953 * Return: 1 for change, otherwise 0.
 954 */
 955int snd_soc_component_test_bits(struct snd_soc_component *component,
 956                                unsigned int reg, unsigned int mask, unsigned int value)
 957{
 958        unsigned int old, new;
 959
 960        old = snd_soc_component_read(component, reg);
 961        new = (old & ~mask) | value;
 962        return old != new;
 963}
 964EXPORT_SYMBOL_GPL(snd_soc_component_test_bits);
 965
 966int snd_soc_pcm_component_pointer(struct snd_pcm_substream *substream)
 967{
 968        struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 969        struct snd_soc_component *component;
 970        int i;
 971
 972        /* FIXME: use 1st pointer */
 973        for_each_rtd_components(rtd, i, component)
 974                if (component->driver->pointer)
 975                        return component->driver->pointer(component, substream);
 976
 977        return 0;
 978}
 979
 980static bool snd_soc_component_is_codec_on_rtd(struct snd_soc_pcm_runtime *rtd,
 981                                              struct snd_soc_component *component)
 982{
 983        struct snd_soc_dai *dai;
 984        int i;
 985
 986        for_each_rtd_codec_dais(rtd, i, dai) {
 987                if (dai->component == component)
 988                        return true;
 989        }
 990
 991        return false;
 992}
 993
 994void snd_soc_pcm_component_delay(struct snd_pcm_substream *substream,
 995                                 snd_pcm_sframes_t *cpu_delay,
 996                                 snd_pcm_sframes_t *codec_delay)
 997{
 998        struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 999        struct snd_soc_component *component;
1000        snd_pcm_sframes_t delay;
1001        int i;
1002
1003        /*
1004         * We're looking for the delay through the full audio path so it needs to
1005         * be the maximum of the Components doing transmit and the maximum of the
1006         * Components doing receive (ie, all CPUs and all CODECs) rather than
1007         * just the maximum of all Components.
1008         */
1009        for_each_rtd_components(rtd, i, component) {
1010                if (!component->driver->delay)
1011                        continue;
1012
1013                delay = component->driver->delay(component, substream);
1014
1015                if (snd_soc_component_is_codec_on_rtd(rtd, component))
1016                        *codec_delay = max(*codec_delay, delay);
1017                else
1018                        *cpu_delay = max(*cpu_delay, delay);
1019        }
1020}
1021
1022int snd_soc_pcm_component_ioctl(struct snd_pcm_substream *substream,
1023                                unsigned int cmd, void *arg)
1024{
1025        struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
1026        struct snd_soc_component *component;
1027        int i;
1028
1029        /* FIXME: use 1st ioctl */
1030        for_each_rtd_components(rtd, i, component)
1031                if (component->driver->ioctl)
1032                        return soc_component_ret(
1033                                component,
1034                                component->driver->ioctl(component,
1035                                                         substream, cmd, arg));
1036
1037        return snd_pcm_lib_ioctl(substream, cmd, arg);
1038}
1039
1040int snd_soc_pcm_component_sync_stop(struct snd_pcm_substream *substream)
1041{
1042        struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
1043        struct snd_soc_component *component;
1044        int i, ret;
1045
1046        for_each_rtd_components(rtd, i, component) {
1047                if (component->driver->sync_stop) {
1048                        ret = component->driver->sync_stop(component,
1049                                                           substream);
1050                        if (ret < 0)
1051                                return soc_component_ret(component, ret);
1052                }
1053        }
1054
1055        return 0;
1056}
1057
1058int snd_soc_pcm_component_copy(struct snd_pcm_substream *substream,
1059                               int channel, unsigned long pos,
1060                               struct iov_iter *iter, unsigned long bytes)
1061{
1062        struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
1063        struct snd_soc_component *component;
1064        int i;
1065
1066        /* FIXME. it returns 1st copy now */
1067        for_each_rtd_components(rtd, i, component)
1068                if (component->driver->copy)
1069                        return soc_component_ret(component,
1070                                component->driver->copy(component, substream,
1071                                        channel, pos, iter, bytes));
1072
1073        return -EINVAL;
1074}
1075
1076struct page *snd_soc_pcm_component_page(struct snd_pcm_substream *substream,
1077                                        unsigned long offset)
1078{
1079        struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
1080        struct snd_soc_component *component;
1081        struct page *page;
1082        int i;
1083
1084        /* FIXME. it returns 1st page now */
1085        for_each_rtd_components(rtd, i, component) {
1086                if (component->driver->page) {
1087                        page = component->driver->page(component,
1088                                                       substream, offset);
1089                        if (page)
1090                                return page;
1091                }
1092        }
1093
1094        return NULL;
1095}
1096
1097int snd_soc_pcm_component_mmap(struct snd_pcm_substream *substream,
1098                               struct vm_area_struct *vma)
1099{
1100        struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
1101        struct snd_soc_component *component;
1102        int i;
1103
1104        /* FIXME. it returns 1st mmap now */
1105        for_each_rtd_components(rtd, i, component)
1106                if (component->driver->mmap)
1107                        return soc_component_ret(
1108                                component,
1109                                component->driver->mmap(component,
1110                                                        substream, vma));
1111
1112        return -EINVAL;
1113}
1114
1115int snd_soc_pcm_component_new(struct snd_soc_pcm_runtime *rtd)
1116{
1117        struct snd_soc_component *component;
1118        int ret;
1119        int i;
1120
1121        for_each_rtd_components(rtd, i, component) {
1122                if (component->driver->pcm_construct) {
1123                        ret = component->driver->pcm_construct(component, rtd);
1124                        if (ret < 0)
1125                                return soc_component_ret(component, ret);
1126                }
1127        }
1128
1129        return 0;
1130}
1131
1132void snd_soc_pcm_component_free(struct snd_soc_pcm_runtime *rtd)
1133{
1134        struct snd_soc_component *component;
1135        int i;
1136
1137        if (!rtd->pcm)
1138                return;
1139
1140        for_each_rtd_components(rtd, i, component)
1141                if (component->driver->pcm_destruct)
1142                        component->driver->pcm_destruct(component, rtd->pcm);
1143}
1144
1145int snd_soc_pcm_component_prepare(struct snd_pcm_substream *substream)
1146{
1147        struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
1148        struct snd_soc_component *component;
1149        int i, ret;
1150
1151        for_each_rtd_components(rtd, i, component) {
1152                if (component->driver->prepare) {
1153                        ret = component->driver->prepare(component, substream);
1154                        if (ret < 0)
1155                                return soc_component_ret(component, ret);
1156                }
1157        }
1158
1159        return 0;
1160}
1161
1162int snd_soc_pcm_component_hw_params(struct snd_pcm_substream *substream,
1163                                    struct snd_pcm_hw_params *params)
1164{
1165        struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
1166        struct snd_soc_component *component;
1167        int i, ret;
1168
1169        for_each_rtd_components(rtd, i, component) {
1170                if (component->driver->hw_params) {
1171                        ret = component->driver->hw_params(component,
1172                                                           substream, params);
1173                        if (ret < 0)
1174                                return soc_component_ret(component, ret);
1175                }
1176                /* mark substream if succeeded */
1177                soc_component_mark_push(component, substream, hw_params);
1178        }
1179
1180        return 0;
1181}
1182
1183void snd_soc_pcm_component_hw_free(struct snd_pcm_substream *substream,
1184                                   int rollback)
1185{
1186        struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
1187        struct snd_soc_component *component;
1188        int i, ret;
1189
1190        for_each_rtd_components(rtd, i, component) {
1191                if (rollback && !soc_component_mark_match(component, substream, hw_params))
1192                        continue;
1193
1194                if (component->driver->hw_free) {
1195                        ret = component->driver->hw_free(component, substream);
1196                        if (ret < 0)
1197                                soc_component_ret(component, ret);
1198                }
1199
1200                /* remove marked substream */
1201                soc_component_mark_pop(component, hw_params);
1202        }
1203}
1204
1205static int soc_component_trigger(struct snd_soc_component *component,
1206                                 struct snd_pcm_substream *substream,
1207                                 int cmd)
1208{
1209        int ret = 0;
1210
1211        if (component->driver->trigger)
1212                ret = component->driver->trigger(component, substream, cmd);
1213
1214        return soc_component_ret(component, ret);
1215}
1216
1217int snd_soc_pcm_component_trigger(struct snd_pcm_substream *substream,
1218                                  int cmd, int rollback)
1219{
1220        struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
1221        struct snd_soc_component *component;
1222        int i, r, ret = 0;
1223
1224        switch (cmd) {
1225        case SNDRV_PCM_TRIGGER_START:
1226        case SNDRV_PCM_TRIGGER_RESUME:
1227        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1228                for_each_rtd_components(rtd, i, component) {
1229                        ret = soc_component_trigger(component, substream, cmd);
1230                        if (ret < 0)
1231                                break;
1232                        soc_component_mark_push(component, substream, trigger);
1233                }
1234                break;
1235        case SNDRV_PCM_TRIGGER_STOP:
1236        case SNDRV_PCM_TRIGGER_SUSPEND:
1237        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
1238                for_each_rtd_components(rtd, i, component) {
1239                        if (rollback && !soc_component_mark_match(component, substream, trigger))
1240                                continue;
1241
1242                        r = soc_component_trigger(component, substream, cmd);
1243                        if (r < 0)
1244                                ret = r; /* use last ret */
1245                        soc_component_mark_pop(component, trigger);
1246                }
1247        }
1248
1249        return ret;
1250}
1251
1252int snd_soc_pcm_component_pm_runtime_get(struct snd_soc_pcm_runtime *rtd,
1253                                         void *stream)
1254{
1255        struct snd_soc_component *component;
1256        int i;
1257
1258        for_each_rtd_components(rtd, i, component) {
1259                int ret = pm_runtime_get_sync(component->dev);
1260                if (ret < 0 && ret != -EACCES) {
1261                        pm_runtime_put_noidle(component->dev);
1262                        return soc_component_ret(component, ret);
1263                }
1264                /* mark stream if succeeded */
1265                soc_component_mark_push(component, stream, pm);
1266        }
1267
1268        return 0;
1269}
1270
1271void snd_soc_pcm_component_pm_runtime_put(struct snd_soc_pcm_runtime *rtd,
1272                                          void *stream, int rollback)
1273{
1274        struct snd_soc_component *component;
1275        int i;
1276
1277        for_each_rtd_components(rtd, i, component) {
1278                if (rollback && !soc_component_mark_match(component, stream, pm))
1279                        continue;
1280
1281                pm_runtime_put_autosuspend(component->dev);
1282
1283                /* remove marked stream */
1284                soc_component_mark_pop(component, pm);
1285        }
1286}
1287
1288int snd_soc_pcm_component_ack(struct snd_pcm_substream *substream)
1289{
1290        struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
1291        struct snd_soc_component *component;
1292        int i;
1293
1294        /* FIXME: use 1st pointer */
1295        for_each_rtd_components(rtd, i, component)
1296                if (component->driver->ack)
1297                        return component->driver->ack(component, substream);
1298
1299        return 0;
1300}
1301