linux/include/sound/soc-component.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0
   2 *
   3 * soc-component.h
   4 *
   5 * Copyright (c) 2019 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2 as
   9 * published by the Free Software Foundation.
  10 */
  11#ifndef __SOC_COMPONENT_H
  12#define __SOC_COMPONENT_H
  13
  14#include <sound/soc.h>
  15
  16/*
  17 * Component probe and remove ordering levels for components with runtime
  18 * dependencies.
  19 */
  20#define SND_SOC_COMP_ORDER_FIRST        -2
  21#define SND_SOC_COMP_ORDER_EARLY        -1
  22#define SND_SOC_COMP_ORDER_NORMAL        0
  23#define SND_SOC_COMP_ORDER_LATE          1
  24#define SND_SOC_COMP_ORDER_LAST          2
  25
  26#define for_each_comp_order(order)              \
  27        for (order  = SND_SOC_COMP_ORDER_FIRST; \
  28             order <= SND_SOC_COMP_ORDER_LAST;  \
  29             order++)
  30
  31/* component interface */
  32struct snd_soc_component_driver {
  33        const char *name;
  34
  35        /* Default control and setup, added after probe() is run */
  36        const struct snd_kcontrol_new *controls;
  37        unsigned int num_controls;
  38        const struct snd_soc_dapm_widget *dapm_widgets;
  39        unsigned int num_dapm_widgets;
  40        const struct snd_soc_dapm_route *dapm_routes;
  41        unsigned int num_dapm_routes;
  42
  43        int (*probe)(struct snd_soc_component *component);
  44        void (*remove)(struct snd_soc_component *component);
  45        int (*suspend)(struct snd_soc_component *component);
  46        int (*resume)(struct snd_soc_component *component);
  47
  48        unsigned int (*read)(struct snd_soc_component *component,
  49                             unsigned int reg);
  50        int (*write)(struct snd_soc_component *component,
  51                     unsigned int reg, unsigned int val);
  52
  53        /* pcm creation and destruction */
  54        int (*pcm_new)(struct snd_soc_pcm_runtime *rtd);
  55        void (*pcm_free)(struct snd_pcm *pcm);
  56
  57        /* component wide operations */
  58        int (*set_sysclk)(struct snd_soc_component *component,
  59                          int clk_id, int source, unsigned int freq, int dir);
  60        int (*set_pll)(struct snd_soc_component *component, int pll_id,
  61                       int source, unsigned int freq_in, unsigned int freq_out);
  62        int (*set_jack)(struct snd_soc_component *component,
  63                        struct snd_soc_jack *jack,  void *data);
  64
  65        /* DT */
  66        int (*of_xlate_dai_name)(struct snd_soc_component *component,
  67                                 struct of_phandle_args *args,
  68                                 const char **dai_name);
  69        int (*of_xlate_dai_id)(struct snd_soc_component *comment,
  70                               struct device_node *endpoint);
  71        void (*seq_notifier)(struct snd_soc_component *component,
  72                             enum snd_soc_dapm_type type, int subseq);
  73        int (*stream_event)(struct snd_soc_component *component, int event);
  74        int (*set_bias_level)(struct snd_soc_component *component,
  75                              enum snd_soc_bias_level level);
  76
  77        const struct snd_pcm_ops *ops;
  78        const struct snd_compr_ops *compr_ops;
  79
  80        /* probe ordering - for components with runtime dependencies */
  81        int probe_order;
  82        int remove_order;
  83
  84        /*
  85         * signal if the module handling the component should not be removed
  86         * if a pcm is open. Setting this would prevent the module
  87         * refcount being incremented in probe() but allow it be incremented
  88         * when a pcm is opened and decremented when it is closed.
  89         */
  90        unsigned int module_get_upon_open:1;
  91
  92        /* bits */
  93        unsigned int idle_bias_on:1;
  94        unsigned int suspend_bias_off:1;
  95        unsigned int use_pmdown_time:1; /* care pmdown_time at stop */
  96        unsigned int endianness:1;
  97        unsigned int non_legacy_dai_naming:1;
  98
  99        /* this component uses topology and ignore machine driver FEs */
 100        const char *ignore_machine;
 101        const char *topology_name_prefix;
 102        int (*be_hw_params_fixup)(struct snd_soc_pcm_runtime *rtd,
 103                                  struct snd_pcm_hw_params *params);
 104        bool use_dai_pcm_id;    /* use DAI link PCM ID as PCM device number */
 105        int be_pcm_base;        /* base device ID for all BE PCMs */
 106};
 107
 108struct snd_soc_component {
 109        const char *name;
 110        int id;
 111        const char *name_prefix;
 112        struct device *dev;
 113        struct snd_soc_card *card;
 114
 115        unsigned int active;
 116
 117        unsigned int suspended:1; /* is in suspend PM state */
 118
 119        struct list_head list;
 120        struct list_head card_aux_list; /* for auxiliary bound components */
 121        struct list_head card_list;
 122
 123        const struct snd_soc_component_driver *driver;
 124
 125        struct list_head dai_list;
 126        int num_dai;
 127
 128        struct regmap *regmap;
 129        int val_bytes;
 130
 131        struct mutex io_mutex;
 132
 133        /* attached dynamic objects */
 134        struct list_head dobj_list;
 135
 136        /*
 137         * DO NOT use any of the fields below in drivers, they are temporary and
 138         * are going to be removed again soon. If you use them in driver code
 139         * the driver will be marked as BROKEN when these fields are removed.
 140         */
 141
 142        /* Don't use these, use snd_soc_component_get_dapm() */
 143        struct snd_soc_dapm_context dapm;
 144
 145        /* machine specific init */
 146        int (*init)(struct snd_soc_component *component);
 147
 148#ifdef CONFIG_DEBUG_FS
 149        struct dentry *debugfs_root;
 150        const char *debugfs_prefix;
 151#endif
 152};
 153
 154#define for_each_component_dais(component, dai)\
 155        list_for_each_entry(dai, &(component)->dai_list, list)
 156#define for_each_component_dais_safe(component, dai, _dai)\
 157        list_for_each_entry_safe(dai, _dai, &(component)->dai_list, list)
 158
 159/**
 160 * snd_soc_dapm_to_component() - Casts a DAPM context to the component it is
 161 *  embedded in
 162 * @dapm: The DAPM context to cast to the component
 163 *
 164 * This function must only be used on DAPM contexts that are known to be part of
 165 * a component (e.g. in a component driver). Otherwise the behavior is
 166 * undefined.
 167 */
 168static inline struct snd_soc_component *snd_soc_dapm_to_component(
 169        struct snd_soc_dapm_context *dapm)
 170{
 171        return container_of(dapm, struct snd_soc_component, dapm);
 172}
 173
 174/**
 175 * snd_soc_component_get_dapm() - Returns the DAPM context associated with a
 176 *  component
 177 * @component: The component for which to get the DAPM context
 178 */
 179static inline struct snd_soc_dapm_context *snd_soc_component_get_dapm(
 180        struct snd_soc_component *component)
 181{
 182        return &component->dapm;
 183}
 184
 185/**
 186 * snd_soc_component_init_bias_level() - Initialize COMPONENT DAPM bias level
 187 * @component: The COMPONENT for which to initialize the DAPM bias level
 188 * @level: The DAPM level to initialize to
 189 *
 190 * Initializes the COMPONENT DAPM bias level. See snd_soc_dapm_init_bias_level()
 191 */
 192static inline void
 193snd_soc_component_init_bias_level(struct snd_soc_component *component,
 194                                  enum snd_soc_bias_level level)
 195{
 196        snd_soc_dapm_init_bias_level(
 197                snd_soc_component_get_dapm(component), level);
 198}
 199
 200/**
 201 * snd_soc_component_get_bias_level() - Get current COMPONENT DAPM bias level
 202 * @component: The COMPONENT for which to get the DAPM bias level
 203 *
 204 * Returns: The current DAPM bias level of the COMPONENT.
 205 */
 206static inline enum snd_soc_bias_level
 207snd_soc_component_get_bias_level(struct snd_soc_component *component)
 208{
 209        return snd_soc_dapm_get_bias_level(
 210                snd_soc_component_get_dapm(component));
 211}
 212
 213/**
 214 * snd_soc_component_force_bias_level() - Set the COMPONENT DAPM bias level
 215 * @component: The COMPONENT for which to set the level
 216 * @level: The level to set to
 217 *
 218 * Forces the COMPONENT bias level to a specific state. See
 219 * snd_soc_dapm_force_bias_level().
 220 */
 221static inline int
 222snd_soc_component_force_bias_level(struct snd_soc_component *component,
 223                                   enum snd_soc_bias_level level)
 224{
 225        return snd_soc_dapm_force_bias_level(
 226                snd_soc_component_get_dapm(component),
 227                level);
 228}
 229
 230/**
 231 * snd_soc_dapm_kcontrol_component() - Returns the component associated to a
 232 * kcontrol
 233 * @kcontrol: The kcontrol
 234 *
 235 * This function must only be used on DAPM contexts that are known to be part of
 236 * a COMPONENT (e.g. in a COMPONENT driver). Otherwise the behavior is undefined
 237 */
 238static inline struct snd_soc_component *snd_soc_dapm_kcontrol_component(
 239        struct snd_kcontrol *kcontrol)
 240{
 241        return snd_soc_dapm_to_component(snd_soc_dapm_kcontrol_dapm(kcontrol));
 242}
 243
 244/**
 245 * snd_soc_component_cache_sync() - Sync the register cache with the hardware
 246 * @component: COMPONENT to sync
 247 *
 248 * Note: This function will call regcache_sync()
 249 */
 250static inline int snd_soc_component_cache_sync(
 251        struct snd_soc_component *component)
 252{
 253        return regcache_sync(component->regmap);
 254}
 255
 256/* component IO */
 257int snd_soc_component_read(struct snd_soc_component *component,
 258                           unsigned int reg, unsigned int *val);
 259unsigned int snd_soc_component_read32(struct snd_soc_component *component,
 260                                      unsigned int reg);
 261int snd_soc_component_write(struct snd_soc_component *component,
 262                            unsigned int reg, unsigned int val);
 263int snd_soc_component_update_bits(struct snd_soc_component *component,
 264                                  unsigned int reg, unsigned int mask,
 265                                  unsigned int val);
 266int snd_soc_component_update_bits_async(struct snd_soc_component *component,
 267                                        unsigned int reg, unsigned int mask,
 268                                        unsigned int val);
 269void snd_soc_component_async_complete(struct snd_soc_component *component);
 270int snd_soc_component_test_bits(struct snd_soc_component *component,
 271                                unsigned int reg, unsigned int mask,
 272                                unsigned int value);
 273
 274/* component wide operations */
 275int snd_soc_component_set_sysclk(struct snd_soc_component *component,
 276                                 int clk_id, int source,
 277                                 unsigned int freq, int dir);
 278int snd_soc_component_set_pll(struct snd_soc_component *component, int pll_id,
 279                              int source, unsigned int freq_in,
 280                              unsigned int freq_out);
 281int snd_soc_component_set_jack(struct snd_soc_component *component,
 282                               struct snd_soc_jack *jack, void *data);
 283
 284void snd_soc_component_seq_notifier(struct snd_soc_component *component,
 285                                    enum snd_soc_dapm_type type, int subseq);
 286int snd_soc_component_stream_event(struct snd_soc_component *component,
 287                                   int event);
 288int snd_soc_component_set_bias_level(struct snd_soc_component *component,
 289                                     enum snd_soc_bias_level level);
 290
 291#ifdef CONFIG_REGMAP
 292void snd_soc_component_init_regmap(struct snd_soc_component *component,
 293                                   struct regmap *regmap);
 294void snd_soc_component_exit_regmap(struct snd_soc_component *component);
 295#endif
 296
 297#define snd_soc_component_module_get_when_probe(component)\
 298        snd_soc_component_module_get(component, 0)
 299#define snd_soc_component_module_get_when_open(component)       \
 300        snd_soc_component_module_get(component, 1)
 301int snd_soc_component_module_get(struct snd_soc_component *component,
 302                                 int upon_open);
 303#define snd_soc_component_module_put_when_remove(component)     \
 304        snd_soc_component_module_put(component, 0)
 305#define snd_soc_component_module_put_when_close(component)      \
 306        snd_soc_component_module_put(component, 1)
 307void snd_soc_component_module_put(struct snd_soc_component *component,
 308                                  int upon_open);
 309
 310static inline void snd_soc_component_set_drvdata(struct snd_soc_component *c,
 311                                                 void *data)
 312{
 313        dev_set_drvdata(c->dev, data);
 314}
 315
 316static inline void *snd_soc_component_get_drvdata(struct snd_soc_component *c)
 317{
 318        return dev_get_drvdata(c->dev);
 319}
 320
 321static inline bool snd_soc_component_is_active(
 322        struct snd_soc_component *component)
 323{
 324        return component->active != 0;
 325}
 326
 327/* component pin */
 328int snd_soc_component_enable_pin(struct snd_soc_component *component,
 329                                 const char *pin);
 330int snd_soc_component_enable_pin_unlocked(struct snd_soc_component *component,
 331                                          const char *pin);
 332int snd_soc_component_disable_pin(struct snd_soc_component *component,
 333                                  const char *pin);
 334int snd_soc_component_disable_pin_unlocked(struct snd_soc_component *component,
 335                                           const char *pin);
 336int snd_soc_component_nc_pin(struct snd_soc_component *component,
 337                             const char *pin);
 338int snd_soc_component_nc_pin_unlocked(struct snd_soc_component *component,
 339                                      const char *pin);
 340int snd_soc_component_get_pin_status(struct snd_soc_component *component,
 341                                     const char *pin);
 342int snd_soc_component_force_enable_pin(struct snd_soc_component *component,
 343                                       const char *pin);
 344int snd_soc_component_force_enable_pin_unlocked(
 345        struct snd_soc_component *component,
 346        const char *pin);
 347
 348/* component driver ops */
 349int snd_soc_component_open(struct snd_soc_component *component,
 350                           struct snd_pcm_substream *substream);
 351int snd_soc_component_close(struct snd_soc_component *component,
 352                            struct snd_pcm_substream *substream);
 353int snd_soc_component_prepare(struct snd_soc_component *component,
 354                              struct snd_pcm_substream *substream);
 355int snd_soc_component_hw_params(struct snd_soc_component *component,
 356                                struct snd_pcm_substream *substream,
 357                                struct snd_pcm_hw_params *params);
 358int snd_soc_component_hw_free(struct snd_soc_component *component,
 359                              struct snd_pcm_substream *substream);
 360int snd_soc_component_trigger(struct snd_soc_component *component,
 361                              struct snd_pcm_substream *substream,
 362                              int cmd);
 363void snd_soc_component_suspend(struct snd_soc_component *component);
 364void snd_soc_component_resume(struct snd_soc_component *component);
 365int snd_soc_component_is_suspended(struct snd_soc_component *component);
 366int snd_soc_component_probe(struct snd_soc_component *component);
 367void snd_soc_component_remove(struct snd_soc_component *component);
 368int snd_soc_component_of_xlate_dai_id(struct snd_soc_component *component,
 369                                      struct device_node *ep);
 370int snd_soc_component_of_xlate_dai_name(struct snd_soc_component *component,
 371                                        struct of_phandle_args *args,
 372                                        const char **dai_name);
 373
 374int snd_soc_pcm_component_pointer(struct snd_pcm_substream *substream);
 375int snd_soc_pcm_component_ioctl(struct snd_pcm_substream *substream,
 376                                unsigned int cmd, void *arg);
 377int snd_soc_pcm_component_copy_user(struct snd_pcm_substream *substream,
 378                                    int channel, unsigned long pos,
 379                                    void __user *buf, unsigned long bytes);
 380struct page *snd_soc_pcm_component_page(struct snd_pcm_substream *substream,
 381                                        unsigned long offset);
 382int snd_soc_pcm_component_mmap(struct snd_pcm_substream *substream,
 383                               struct vm_area_struct *vma);
 384int snd_soc_pcm_component_new(struct snd_pcm *pcm);
 385void snd_soc_pcm_component_free(struct snd_pcm *pcm);
 386
 387#endif /* __SOC_COMPONENT_H */
 388