Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v5.4-rc2 387 lines 14 kB view raw
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 */