ASoC: add soc-component.c
ALSA SoC has many snd_soc_component_xxx(), but these are randomly located in many files. Because of it, code is difficult to read. This patch creates new soc-component.c, and moves existing snd_soc_component_xxx() into it. But not yet fully. We need more cleanup it. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Link: https://lore.kernel.org/r/87imrp5roa.wl-kuninori.morimoto.gx@renesas.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
57cb28856e
commit
4ff1fef10f
|
@ -0,0 +1,328 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* soc-component.h
|
||||
*
|
||||
* Copyright (c) 2019 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef __SOC_COMPONENT_H
|
||||
#define __SOC_COMPONENT_H
|
||||
|
||||
#include <sound/soc.h>
|
||||
|
||||
/*
|
||||
* Component probe and remove ordering levels for components with runtime
|
||||
* dependencies.
|
||||
*/
|
||||
#define SND_SOC_COMP_ORDER_FIRST -2
|
||||
#define SND_SOC_COMP_ORDER_EARLY -1
|
||||
#define SND_SOC_COMP_ORDER_NORMAL 0
|
||||
#define SND_SOC_COMP_ORDER_LATE 1
|
||||
#define SND_SOC_COMP_ORDER_LAST 2
|
||||
|
||||
#define for_each_comp_order(order) \
|
||||
for (order = SND_SOC_COMP_ORDER_FIRST; \
|
||||
order <= SND_SOC_COMP_ORDER_LAST; \
|
||||
order++)
|
||||
|
||||
/* component interface */
|
||||
struct snd_soc_component_driver {
|
||||
const char *name;
|
||||
|
||||
/* Default control and setup, added after probe() is run */
|
||||
const struct snd_kcontrol_new *controls;
|
||||
unsigned int num_controls;
|
||||
const struct snd_soc_dapm_widget *dapm_widgets;
|
||||
unsigned int num_dapm_widgets;
|
||||
const struct snd_soc_dapm_route *dapm_routes;
|
||||
unsigned int num_dapm_routes;
|
||||
|
||||
int (*probe)(struct snd_soc_component *component);
|
||||
void (*remove)(struct snd_soc_component *component);
|
||||
int (*suspend)(struct snd_soc_component *component);
|
||||
int (*resume)(struct snd_soc_component *component);
|
||||
|
||||
unsigned int (*read)(struct snd_soc_component *component,
|
||||
unsigned int reg);
|
||||
int (*write)(struct snd_soc_component *component,
|
||||
unsigned int reg, unsigned int val);
|
||||
|
||||
/* pcm creation and destruction */
|
||||
int (*pcm_new)(struct snd_soc_pcm_runtime *rtd);
|
||||
void (*pcm_free)(struct snd_pcm *pcm);
|
||||
|
||||
/* component wide operations */
|
||||
int (*set_sysclk)(struct snd_soc_component *component,
|
||||
int clk_id, int source, unsigned int freq, int dir);
|
||||
int (*set_pll)(struct snd_soc_component *component, int pll_id,
|
||||
int source, unsigned int freq_in, unsigned int freq_out);
|
||||
int (*set_jack)(struct snd_soc_component *component,
|
||||
struct snd_soc_jack *jack, void *data);
|
||||
|
||||
/* DT */
|
||||
int (*of_xlate_dai_name)(struct snd_soc_component *component,
|
||||
struct of_phandle_args *args,
|
||||
const char **dai_name);
|
||||
int (*of_xlate_dai_id)(struct snd_soc_component *comment,
|
||||
struct device_node *endpoint);
|
||||
void (*seq_notifier)(struct snd_soc_component *component,
|
||||
enum snd_soc_dapm_type type, int subseq);
|
||||
int (*stream_event)(struct snd_soc_component *component, int event);
|
||||
int (*set_bias_level)(struct snd_soc_component *component,
|
||||
enum snd_soc_bias_level level);
|
||||
|
||||
const struct snd_pcm_ops *ops;
|
||||
const struct snd_compr_ops *compr_ops;
|
||||
|
||||
/* probe ordering - for components with runtime dependencies */
|
||||
int probe_order;
|
||||
int remove_order;
|
||||
|
||||
/*
|
||||
* signal if the module handling the component should not be removed
|
||||
* if a pcm is open. Setting this would prevent the module
|
||||
* refcount being incremented in probe() but allow it be incremented
|
||||
* when a pcm is opened and decremented when it is closed.
|
||||
*/
|
||||
unsigned int module_get_upon_open:1;
|
||||
|
||||
/* bits */
|
||||
unsigned int idle_bias_on:1;
|
||||
unsigned int suspend_bias_off:1;
|
||||
unsigned int use_pmdown_time:1; /* care pmdown_time at stop */
|
||||
unsigned int endianness:1;
|
||||
unsigned int non_legacy_dai_naming:1;
|
||||
|
||||
/* this component uses topology and ignore machine driver FEs */
|
||||
const char *ignore_machine;
|
||||
const char *topology_name_prefix;
|
||||
int (*be_hw_params_fixup)(struct snd_soc_pcm_runtime *rtd,
|
||||
struct snd_pcm_hw_params *params);
|
||||
bool use_dai_pcm_id; /* use DAI link PCM ID as PCM device number */
|
||||
int be_pcm_base; /* base device ID for all BE PCMs */
|
||||
};
|
||||
|
||||
struct snd_soc_component {
|
||||
const char *name;
|
||||
int id;
|
||||
const char *name_prefix;
|
||||
struct device *dev;
|
||||
struct snd_soc_card *card;
|
||||
|
||||
unsigned int active;
|
||||
|
||||
unsigned int suspended:1; /* is in suspend PM state */
|
||||
|
||||
struct list_head list;
|
||||
struct list_head card_aux_list; /* for auxiliary bound components */
|
||||
struct list_head card_list;
|
||||
|
||||
const struct snd_soc_component_driver *driver;
|
||||
|
||||
struct list_head dai_list;
|
||||
int num_dai;
|
||||
|
||||
struct regmap *regmap;
|
||||
int val_bytes;
|
||||
|
||||
struct mutex io_mutex;
|
||||
|
||||
/* attached dynamic objects */
|
||||
struct list_head dobj_list;
|
||||
|
||||
/*
|
||||
* DO NOT use any of the fields below in drivers, they are temporary and
|
||||
* are going to be removed again soon. If you use them in driver code
|
||||
* the driver will be marked as BROKEN when these fields are removed.
|
||||
*/
|
||||
|
||||
/* Don't use these, use snd_soc_component_get_dapm() */
|
||||
struct snd_soc_dapm_context dapm;
|
||||
|
||||
/* machine specific init */
|
||||
int (*init)(struct snd_soc_component *component);
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct dentry *debugfs_root;
|
||||
const char *debugfs_prefix;
|
||||
#endif
|
||||
};
|
||||
|
||||
#define for_each_component_dais(component, dai)\
|
||||
list_for_each_entry(dai, &(component)->dai_list, list)
|
||||
#define for_each_component_dais_safe(component, dai, _dai)\
|
||||
list_for_each_entry_safe(dai, _dai, &(component)->dai_list, list)
|
||||
|
||||
/**
|
||||
* snd_soc_dapm_to_component() - Casts a DAPM context to the component it is
|
||||
* embedded in
|
||||
* @dapm: The DAPM context to cast to the component
|
||||
*
|
||||
* This function must only be used on DAPM contexts that are known to be part of
|
||||
* a component (e.g. in a component driver). Otherwise the behavior is
|
||||
* undefined.
|
||||
*/
|
||||
static inline struct snd_soc_component *snd_soc_dapm_to_component(
|
||||
struct snd_soc_dapm_context *dapm)
|
||||
{
|
||||
return container_of(dapm, struct snd_soc_component, dapm);
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_component_get_dapm() - Returns the DAPM context associated with a
|
||||
* component
|
||||
* @component: The component for which to get the DAPM context
|
||||
*/
|
||||
static inline struct snd_soc_dapm_context *snd_soc_component_get_dapm(
|
||||
struct snd_soc_component *component)
|
||||
{
|
||||
return &component->dapm;
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_component_init_bias_level() - Initialize COMPONENT DAPM bias level
|
||||
* @component: The COMPONENT for which to initialize the DAPM bias level
|
||||
* @level: The DAPM level to initialize to
|
||||
*
|
||||
* Initializes the COMPONENT DAPM bias level. See snd_soc_dapm_init_bias_level()
|
||||
*/
|
||||
static inline void
|
||||
snd_soc_component_init_bias_level(struct snd_soc_component *component,
|
||||
enum snd_soc_bias_level level)
|
||||
{
|
||||
snd_soc_dapm_init_bias_level(
|
||||
snd_soc_component_get_dapm(component), level);
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_component_get_bias_level() - Get current COMPONENT DAPM bias level
|
||||
* @component: The COMPONENT for which to get the DAPM bias level
|
||||
*
|
||||
* Returns: The current DAPM bias level of the COMPONENT.
|
||||
*/
|
||||
static inline enum snd_soc_bias_level
|
||||
snd_soc_component_get_bias_level(struct snd_soc_component *component)
|
||||
{
|
||||
return snd_soc_dapm_get_bias_level(
|
||||
snd_soc_component_get_dapm(component));
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_component_force_bias_level() - Set the COMPONENT DAPM bias level
|
||||
* @component: The COMPONENT for which to set the level
|
||||
* @level: The level to set to
|
||||
*
|
||||
* Forces the COMPONENT bias level to a specific state. See
|
||||
* snd_soc_dapm_force_bias_level().
|
||||
*/
|
||||
static inline int
|
||||
snd_soc_component_force_bias_level(struct snd_soc_component *component,
|
||||
enum snd_soc_bias_level level)
|
||||
{
|
||||
return snd_soc_dapm_force_bias_level(
|
||||
snd_soc_component_get_dapm(component),
|
||||
level);
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_dapm_kcontrol_component() - Returns the component associated to a
|
||||
* kcontrol
|
||||
* @kcontrol: The kcontrol
|
||||
*
|
||||
* This function must only be used on DAPM contexts that are known to be part of
|
||||
* a COMPONENT (e.g. in a COMPONENT driver). Otherwise the behavior is undefined
|
||||
*/
|
||||
static inline struct snd_soc_component *snd_soc_dapm_kcontrol_component(
|
||||
struct snd_kcontrol *kcontrol)
|
||||
{
|
||||
return snd_soc_dapm_to_component(snd_soc_dapm_kcontrol_dapm(kcontrol));
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_component_cache_sync() - Sync the register cache with the hardware
|
||||
* @component: COMPONENT to sync
|
||||
*
|
||||
* Note: This function will call regcache_sync()
|
||||
*/
|
||||
static inline int snd_soc_component_cache_sync(
|
||||
struct snd_soc_component *component)
|
||||
{
|
||||
return regcache_sync(component->regmap);
|
||||
}
|
||||
|
||||
/* component IO */
|
||||
int snd_soc_component_read(struct snd_soc_component *component,
|
||||
unsigned int reg, unsigned int *val);
|
||||
unsigned int snd_soc_component_read32(struct snd_soc_component *component,
|
||||
unsigned int reg);
|
||||
int snd_soc_component_write(struct snd_soc_component *component,
|
||||
unsigned int reg, unsigned int val);
|
||||
int snd_soc_component_update_bits(struct snd_soc_component *component,
|
||||
unsigned int reg, unsigned int mask,
|
||||
unsigned int val);
|
||||
int snd_soc_component_update_bits_async(struct snd_soc_component *component,
|
||||
unsigned int reg, unsigned int mask,
|
||||
unsigned int val);
|
||||
void snd_soc_component_async_complete(struct snd_soc_component *component);
|
||||
int snd_soc_component_test_bits(struct snd_soc_component *component,
|
||||
unsigned int reg, unsigned int mask,
|
||||
unsigned int value);
|
||||
|
||||
/* component wide operations */
|
||||
int snd_soc_component_set_sysclk(struct snd_soc_component *component,
|
||||
int clk_id, int source,
|
||||
unsigned int freq, int dir);
|
||||
int snd_soc_component_set_pll(struct snd_soc_component *component, int pll_id,
|
||||
int source, unsigned int freq_in,
|
||||
unsigned int freq_out);
|
||||
int snd_soc_component_set_jack(struct snd_soc_component *component,
|
||||
struct snd_soc_jack *jack, void *data);
|
||||
|
||||
#ifdef CONFIG_REGMAP
|
||||
void snd_soc_component_init_regmap(struct snd_soc_component *component,
|
||||
struct regmap *regmap);
|
||||
void snd_soc_component_exit_regmap(struct snd_soc_component *component);
|
||||
#endif
|
||||
|
||||
static inline void snd_soc_component_set_drvdata(struct snd_soc_component *c,
|
||||
void *data)
|
||||
{
|
||||
dev_set_drvdata(c->dev, data);
|
||||
}
|
||||
|
||||
static inline void *snd_soc_component_get_drvdata(struct snd_soc_component *c)
|
||||
{
|
||||
return dev_get_drvdata(c->dev);
|
||||
}
|
||||
|
||||
static inline bool snd_soc_component_is_active(
|
||||
struct snd_soc_component *component)
|
||||
{
|
||||
return component->active != 0;
|
||||
}
|
||||
|
||||
/* component pin */
|
||||
int snd_soc_component_enable_pin(struct snd_soc_component *component,
|
||||
const char *pin);
|
||||
int snd_soc_component_enable_pin_unlocked(struct snd_soc_component *component,
|
||||
const char *pin);
|
||||
int snd_soc_component_disable_pin(struct snd_soc_component *component,
|
||||
const char *pin);
|
||||
int snd_soc_component_disable_pin_unlocked(struct snd_soc_component *component,
|
||||
const char *pin);
|
||||
int snd_soc_component_nc_pin(struct snd_soc_component *component,
|
||||
const char *pin);
|
||||
int snd_soc_component_nc_pin_unlocked(struct snd_soc_component *component,
|
||||
const char *pin);
|
||||
int snd_soc_component_get_pin_status(struct snd_soc_component *component,
|
||||
const char *pin);
|
||||
int snd_soc_component_force_enable_pin(struct snd_soc_component *component,
|
||||
const char *pin);
|
||||
int snd_soc_component_force_enable_pin_unlocked(
|
||||
struct snd_soc_component *component,
|
||||
const char *pin);
|
||||
|
||||
#endif /* __SOC_COMPONENT_H */
|
|
@ -362,21 +362,6 @@
|
|||
#define SOC_ENUM_SINGLE_VIRT_DECL(name, xtexts) \
|
||||
const struct soc_enum name = SOC_ENUM_SINGLE_VIRT(ARRAY_SIZE(xtexts), xtexts)
|
||||
|
||||
/*
|
||||
* Component probe and remove ordering levels for components with runtime
|
||||
* dependencies.
|
||||
*/
|
||||
#define SND_SOC_COMP_ORDER_FIRST -2
|
||||
#define SND_SOC_COMP_ORDER_EARLY -1
|
||||
#define SND_SOC_COMP_ORDER_NORMAL 0
|
||||
#define SND_SOC_COMP_ORDER_LATE 1
|
||||
#define SND_SOC_COMP_ORDER_LAST 2
|
||||
|
||||
#define for_each_comp_order(order) \
|
||||
for (order = SND_SOC_COMP_ORDER_FIRST; \
|
||||
order <= SND_SOC_COMP_ORDER_LAST; \
|
||||
order++)
|
||||
|
||||
/*
|
||||
* Bias levels
|
||||
*
|
||||
|
@ -747,132 +732,6 @@ struct snd_soc_compr_ops {
|
|||
int (*trigger)(struct snd_compr_stream *);
|
||||
};
|
||||
|
||||
/* component interface */
|
||||
struct snd_soc_component_driver {
|
||||
const char *name;
|
||||
|
||||
/* Default control and setup, added after probe() is run */
|
||||
const struct snd_kcontrol_new *controls;
|
||||
unsigned int num_controls;
|
||||
const struct snd_soc_dapm_widget *dapm_widgets;
|
||||
unsigned int num_dapm_widgets;
|
||||
const struct snd_soc_dapm_route *dapm_routes;
|
||||
unsigned int num_dapm_routes;
|
||||
|
||||
int (*probe)(struct snd_soc_component *);
|
||||
void (*remove)(struct snd_soc_component *);
|
||||
int (*suspend)(struct snd_soc_component *);
|
||||
int (*resume)(struct snd_soc_component *);
|
||||
|
||||
unsigned int (*read)(struct snd_soc_component *, unsigned int);
|
||||
int (*write)(struct snd_soc_component *, unsigned int, unsigned int);
|
||||
|
||||
/* pcm creation and destruction */
|
||||
int (*pcm_new)(struct snd_soc_pcm_runtime *);
|
||||
void (*pcm_free)(struct snd_pcm *);
|
||||
|
||||
/* component wide operations */
|
||||
int (*set_sysclk)(struct snd_soc_component *component,
|
||||
int clk_id, int source, unsigned int freq, int dir);
|
||||
int (*set_pll)(struct snd_soc_component *component, int pll_id,
|
||||
int source, unsigned int freq_in, unsigned int freq_out);
|
||||
int (*set_jack)(struct snd_soc_component *component,
|
||||
struct snd_soc_jack *jack, void *data);
|
||||
|
||||
/* DT */
|
||||
int (*of_xlate_dai_name)(struct snd_soc_component *component,
|
||||
struct of_phandle_args *args,
|
||||
const char **dai_name);
|
||||
int (*of_xlate_dai_id)(struct snd_soc_component *comment,
|
||||
struct device_node *endpoint);
|
||||
void (*seq_notifier)(struct snd_soc_component *, enum snd_soc_dapm_type,
|
||||
int subseq);
|
||||
int (*stream_event)(struct snd_soc_component *, int event);
|
||||
int (*set_bias_level)(struct snd_soc_component *component,
|
||||
enum snd_soc_bias_level level);
|
||||
|
||||
const struct snd_pcm_ops *ops;
|
||||
const struct snd_compr_ops *compr_ops;
|
||||
|
||||
/* probe ordering - for components with runtime dependencies */
|
||||
int probe_order;
|
||||
int remove_order;
|
||||
|
||||
/*
|
||||
* signal if the module handling the component should not be removed
|
||||
* if a pcm is open. Setting this would prevent the module
|
||||
* refcount being incremented in probe() but allow it be incremented
|
||||
* when a pcm is opened and decremented when it is closed.
|
||||
*/
|
||||
unsigned int module_get_upon_open:1;
|
||||
|
||||
/* bits */
|
||||
unsigned int idle_bias_on:1;
|
||||
unsigned int suspend_bias_off:1;
|
||||
unsigned int use_pmdown_time:1; /* care pmdown_time at stop */
|
||||
unsigned int endianness:1;
|
||||
unsigned int non_legacy_dai_naming:1;
|
||||
|
||||
/* this component uses topology and ignore machine driver FEs */
|
||||
const char *ignore_machine;
|
||||
const char *topology_name_prefix;
|
||||
int (*be_hw_params_fixup)(struct snd_soc_pcm_runtime *rtd,
|
||||
struct snd_pcm_hw_params *params);
|
||||
bool use_dai_pcm_id; /* use the DAI link PCM ID as PCM device number */
|
||||
int be_pcm_base; /* base device ID for all BE PCMs */
|
||||
};
|
||||
|
||||
struct snd_soc_component {
|
||||
const char *name;
|
||||
int id;
|
||||
const char *name_prefix;
|
||||
struct device *dev;
|
||||
struct snd_soc_card *card;
|
||||
|
||||
unsigned int active;
|
||||
|
||||
unsigned int suspended:1; /* is in suspend PM state */
|
||||
|
||||
struct list_head list;
|
||||
struct list_head card_aux_list; /* for auxiliary bound components */
|
||||
struct list_head card_list;
|
||||
|
||||
const struct snd_soc_component_driver *driver;
|
||||
|
||||
struct list_head dai_list;
|
||||
int num_dai;
|
||||
|
||||
struct regmap *regmap;
|
||||
int val_bytes;
|
||||
|
||||
struct mutex io_mutex;
|
||||
|
||||
/* attached dynamic objects */
|
||||
struct list_head dobj_list;
|
||||
|
||||
/*
|
||||
* DO NOT use any of the fields below in drivers, they are temporary and
|
||||
* are going to be removed again soon. If you use them in driver code the
|
||||
* driver will be marked as BROKEN when these fields are removed.
|
||||
*/
|
||||
|
||||
/* Don't use these, use snd_soc_component_get_dapm() */
|
||||
struct snd_soc_dapm_context dapm;
|
||||
|
||||
/* machine specific init */
|
||||
int (*init)(struct snd_soc_component *component);
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct dentry *debugfs_root;
|
||||
const char *debugfs_prefix;
|
||||
#endif
|
||||
};
|
||||
|
||||
#define for_each_component_dais(component, dai)\
|
||||
list_for_each_entry(dai, &(component)->dai_list, list)
|
||||
#define for_each_component_dais_safe(component, dai, _dai)\
|
||||
list_for_each_entry_safe(dai, _dai, &(component)->dai_list, list)
|
||||
|
||||
struct snd_soc_rtdcom_list {
|
||||
struct snd_soc_component *component;
|
||||
struct list_head list; /* rtd::component_list */
|
||||
|
@ -1337,134 +1196,6 @@ struct soc_enum {
|
|||
struct snd_soc_dobj dobj;
|
||||
};
|
||||
|
||||
/**
|
||||
* snd_soc_dapm_to_component() - Casts a DAPM context to the component it is
|
||||
* embedded in
|
||||
* @dapm: The DAPM context to cast to the component
|
||||
*
|
||||
* This function must only be used on DAPM contexts that are known to be part of
|
||||
* a component (e.g. in a component driver). Otherwise the behavior is
|
||||
* undefined.
|
||||
*/
|
||||
static inline struct snd_soc_component *snd_soc_dapm_to_component(
|
||||
struct snd_soc_dapm_context *dapm)
|
||||
{
|
||||
return container_of(dapm, struct snd_soc_component, dapm);
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_component_get_dapm() - Returns the DAPM context associated with a
|
||||
* component
|
||||
* @component: The component for which to get the DAPM context
|
||||
*/
|
||||
static inline struct snd_soc_dapm_context *snd_soc_component_get_dapm(
|
||||
struct snd_soc_component *component)
|
||||
{
|
||||
return &component->dapm;
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_component_init_bias_level() - Initialize COMPONENT DAPM bias level
|
||||
* @component: The COMPONENT for which to initialize the DAPM bias level
|
||||
* @level: The DAPM level to initialize to
|
||||
*
|
||||
* Initializes the COMPONENT DAPM bias level. See snd_soc_dapm_init_bias_level().
|
||||
*/
|
||||
static inline void
|
||||
snd_soc_component_init_bias_level(struct snd_soc_component *component,
|
||||
enum snd_soc_bias_level level)
|
||||
{
|
||||
snd_soc_dapm_init_bias_level(
|
||||
snd_soc_component_get_dapm(component), level);
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_component_get_bias_level() - Get current COMPONENT DAPM bias level
|
||||
* @component: The COMPONENT for which to get the DAPM bias level
|
||||
*
|
||||
* Returns: The current DAPM bias level of the COMPONENT.
|
||||
*/
|
||||
static inline enum snd_soc_bias_level
|
||||
snd_soc_component_get_bias_level(struct snd_soc_component *component)
|
||||
{
|
||||
return snd_soc_dapm_get_bias_level(
|
||||
snd_soc_component_get_dapm(component));
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_component_force_bias_level() - Set the COMPONENT DAPM bias level
|
||||
* @component: The COMPONENT for which to set the level
|
||||
* @level: The level to set to
|
||||
*
|
||||
* Forces the COMPONENT bias level to a specific state. See
|
||||
* snd_soc_dapm_force_bias_level().
|
||||
*/
|
||||
static inline int
|
||||
snd_soc_component_force_bias_level(struct snd_soc_component *component,
|
||||
enum snd_soc_bias_level level)
|
||||
{
|
||||
return snd_soc_dapm_force_bias_level(
|
||||
snd_soc_component_get_dapm(component),
|
||||
level);
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_dapm_kcontrol_component() - Returns the component associated to a kcontrol
|
||||
* @kcontrol: The kcontrol
|
||||
*
|
||||
* This function must only be used on DAPM contexts that are known to be part of
|
||||
* a COMPONENT (e.g. in a COMPONENT driver). Otherwise the behavior is undefined.
|
||||
*/
|
||||
static inline struct snd_soc_component *snd_soc_dapm_kcontrol_component(
|
||||
struct snd_kcontrol *kcontrol)
|
||||
{
|
||||
return snd_soc_dapm_to_component(snd_soc_dapm_kcontrol_dapm(kcontrol));
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_component_cache_sync() - Sync the register cache with the hardware
|
||||
* @component: COMPONENT to sync
|
||||
*
|
||||
* Note: This function will call regcache_sync()
|
||||
*/
|
||||
static inline int snd_soc_component_cache_sync(
|
||||
struct snd_soc_component *component)
|
||||
{
|
||||
return regcache_sync(component->regmap);
|
||||
}
|
||||
|
||||
/* component IO */
|
||||
int snd_soc_component_read(struct snd_soc_component *component,
|
||||
unsigned int reg, unsigned int *val);
|
||||
unsigned int snd_soc_component_read32(struct snd_soc_component *component,
|
||||
unsigned int reg);
|
||||
int snd_soc_component_write(struct snd_soc_component *component,
|
||||
unsigned int reg, unsigned int val);
|
||||
int snd_soc_component_update_bits(struct snd_soc_component *component,
|
||||
unsigned int reg, unsigned int mask, unsigned int val);
|
||||
int snd_soc_component_update_bits_async(struct snd_soc_component *component,
|
||||
unsigned int reg, unsigned int mask, unsigned int val);
|
||||
void snd_soc_component_async_complete(struct snd_soc_component *component);
|
||||
int snd_soc_component_test_bits(struct snd_soc_component *component,
|
||||
unsigned int reg, unsigned int mask, unsigned int value);
|
||||
|
||||
/* component wide operations */
|
||||
int snd_soc_component_set_sysclk(struct snd_soc_component *component,
|
||||
int clk_id, int source, unsigned int freq, int dir);
|
||||
int snd_soc_component_set_pll(struct snd_soc_component *component, int pll_id,
|
||||
int source, unsigned int freq_in,
|
||||
unsigned int freq_out);
|
||||
int snd_soc_component_set_jack(struct snd_soc_component *component,
|
||||
struct snd_soc_jack *jack, void *data);
|
||||
|
||||
#ifdef CONFIG_REGMAP
|
||||
|
||||
void snd_soc_component_init_regmap(struct snd_soc_component *component,
|
||||
struct regmap *regmap);
|
||||
void snd_soc_component_exit_regmap(struct snd_soc_component *component);
|
||||
|
||||
#endif
|
||||
|
||||
/* device driver data */
|
||||
|
||||
static inline void snd_soc_card_set_drvdata(struct snd_soc_card *card,
|
||||
|
@ -1478,17 +1209,6 @@ static inline void *snd_soc_card_get_drvdata(struct snd_soc_card *card)
|
|||
return card->drvdata;
|
||||
}
|
||||
|
||||
static inline void snd_soc_component_set_drvdata(struct snd_soc_component *c,
|
||||
void *data)
|
||||
{
|
||||
dev_set_drvdata(c->dev, data);
|
||||
}
|
||||
|
||||
static inline void *snd_soc_component_get_drvdata(struct snd_soc_component *c)
|
||||
{
|
||||
return dev_get_drvdata(c->dev);
|
||||
}
|
||||
|
||||
static inline void snd_soc_initialize_card_lists(struct snd_soc_card *card)
|
||||
{
|
||||
INIT_LIST_HEAD(&card->widgets);
|
||||
|
@ -1535,12 +1255,6 @@ static inline unsigned int snd_soc_enum_item_to_val(struct soc_enum *e,
|
|||
return e->values[item];
|
||||
}
|
||||
|
||||
static inline bool snd_soc_component_is_active(
|
||||
struct snd_soc_component *component)
|
||||
{
|
||||
return component->active != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_kcontrol_component() - Returns the component that registered the
|
||||
* control
|
||||
|
@ -1676,24 +1390,6 @@ static inline void snd_soc_dapm_mutex_unlock(struct snd_soc_dapm_context *dapm)
|
|||
mutex_unlock(&dapm->card->dapm_mutex);
|
||||
}
|
||||
|
||||
int snd_soc_component_enable_pin(struct snd_soc_component *component,
|
||||
const char *pin);
|
||||
int snd_soc_component_enable_pin_unlocked(struct snd_soc_component *component,
|
||||
const char *pin);
|
||||
int snd_soc_component_disable_pin(struct snd_soc_component *component,
|
||||
const char *pin);
|
||||
int snd_soc_component_disable_pin_unlocked(struct snd_soc_component *component,
|
||||
const char *pin);
|
||||
int snd_soc_component_nc_pin(struct snd_soc_component *component,
|
||||
const char *pin);
|
||||
int snd_soc_component_nc_pin_unlocked(struct snd_soc_component *component,
|
||||
const char *pin);
|
||||
int snd_soc_component_get_pin_status(struct snd_soc_component *component,
|
||||
const char *pin);
|
||||
int snd_soc_component_force_enable_pin(struct snd_soc_component *component,
|
||||
const char *pin);
|
||||
int snd_soc_component_force_enable_pin_unlocked(
|
||||
struct snd_soc_component *component,
|
||||
const char *pin);
|
||||
#include <sound/soc-component.h>
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
snd-soc-core-objs := soc-core.o soc-dapm.o soc-jack.o soc-utils.o soc-dai.o
|
||||
snd-soc-core-objs := soc-core.o soc-dapm.o soc-jack.o soc-utils.o soc-dai.o soc-component.o
|
||||
snd-soc-core-objs += soc-pcm.o soc-io.o soc-devres.o soc-ops.o
|
||||
snd-soc-core-$(CONFIG_SND_SOC_COMPRESS) += soc-compress.o
|
||||
|
||||
|
|
|
@ -0,0 +1,269 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
//
|
||||
// soc-component.c
|
||||
//
|
||||
// Copyright (C) 2019 Renesas Electronics Corp.
|
||||
// Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
//
|
||||
#include <sound/soc.h>
|
||||
|
||||
/**
|
||||
* snd_soc_component_set_sysclk - configure COMPONENT system or master clock.
|
||||
* @component: COMPONENT
|
||||
* @clk_id: DAI specific clock ID
|
||||
* @source: Source for the clock
|
||||
* @freq: new clock frequency in Hz
|
||||
* @dir: new clock direction - input/output.
|
||||
*
|
||||
* Configures the CODEC master (MCLK) or system (SYSCLK) clocking.
|
||||
*/
|
||||
int snd_soc_component_set_sysclk(struct snd_soc_component *component,
|
||||
int clk_id, int source, unsigned int freq,
|
||||
int dir)
|
||||
{
|
||||
if (component->driver->set_sysclk)
|
||||
return component->driver->set_sysclk(component, clk_id, source,
|
||||
freq, dir);
|
||||
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_set_sysclk);
|
||||
|
||||
/*
|
||||
* snd_soc_component_set_pll - configure component PLL.
|
||||
* @component: COMPONENT
|
||||
* @pll_id: DAI specific PLL ID
|
||||
* @source: DAI specific source for the PLL
|
||||
* @freq_in: PLL input clock frequency in Hz
|
||||
* @freq_out: requested PLL output clock frequency in Hz
|
||||
*
|
||||
* Configures and enables PLL to generate output clock based on input clock.
|
||||
*/
|
||||
int snd_soc_component_set_pll(struct snd_soc_component *component, int pll_id,
|
||||
int source, unsigned int freq_in,
|
||||
unsigned int freq_out)
|
||||
{
|
||||
if (component->driver->set_pll)
|
||||
return component->driver->set_pll(component, pll_id, source,
|
||||
freq_in, freq_out);
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_set_pll);
|
||||
|
||||
int snd_soc_component_enable_pin(struct snd_soc_component *component,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_component_get_dapm(component);
|
||||
char *full_name;
|
||||
int ret;
|
||||
|
||||
if (!component->name_prefix)
|
||||
return snd_soc_dapm_enable_pin(dapm, pin);
|
||||
|
||||
full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
|
||||
if (!full_name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_dapm_enable_pin(dapm, full_name);
|
||||
kfree(full_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_enable_pin);
|
||||
|
||||
int snd_soc_component_enable_pin_unlocked(struct snd_soc_component *component,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_component_get_dapm(component);
|
||||
char *full_name;
|
||||
int ret;
|
||||
|
||||
if (!component->name_prefix)
|
||||
return snd_soc_dapm_enable_pin_unlocked(dapm, pin);
|
||||
|
||||
full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
|
||||
if (!full_name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_dapm_enable_pin_unlocked(dapm, full_name);
|
||||
kfree(full_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_enable_pin_unlocked);
|
||||
|
||||
int snd_soc_component_disable_pin(struct snd_soc_component *component,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_component_get_dapm(component);
|
||||
char *full_name;
|
||||
int ret;
|
||||
|
||||
if (!component->name_prefix)
|
||||
return snd_soc_dapm_disable_pin(dapm, pin);
|
||||
|
||||
full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
|
||||
if (!full_name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_dapm_disable_pin(dapm, full_name);
|
||||
kfree(full_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_disable_pin);
|
||||
|
||||
int snd_soc_component_disable_pin_unlocked(struct snd_soc_component *component,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_component_get_dapm(component);
|
||||
char *full_name;
|
||||
int ret;
|
||||
|
||||
if (!component->name_prefix)
|
||||
return snd_soc_dapm_disable_pin_unlocked(dapm, pin);
|
||||
|
||||
full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
|
||||
if (!full_name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_dapm_disable_pin_unlocked(dapm, full_name);
|
||||
kfree(full_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_disable_pin_unlocked);
|
||||
|
||||
int snd_soc_component_nc_pin(struct snd_soc_component *component,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_component_get_dapm(component);
|
||||
char *full_name;
|
||||
int ret;
|
||||
|
||||
if (!component->name_prefix)
|
||||
return snd_soc_dapm_nc_pin(dapm, pin);
|
||||
|
||||
full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
|
||||
if (!full_name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_dapm_nc_pin(dapm, full_name);
|
||||
kfree(full_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_nc_pin);
|
||||
|
||||
int snd_soc_component_nc_pin_unlocked(struct snd_soc_component *component,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_component_get_dapm(component);
|
||||
char *full_name;
|
||||
int ret;
|
||||
|
||||
if (!component->name_prefix)
|
||||
return snd_soc_dapm_nc_pin_unlocked(dapm, pin);
|
||||
|
||||
full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
|
||||
if (!full_name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_dapm_nc_pin_unlocked(dapm, full_name);
|
||||
kfree(full_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_nc_pin_unlocked);
|
||||
|
||||
int snd_soc_component_get_pin_status(struct snd_soc_component *component,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_component_get_dapm(component);
|
||||
char *full_name;
|
||||
int ret;
|
||||
|
||||
if (!component->name_prefix)
|
||||
return snd_soc_dapm_get_pin_status(dapm, pin);
|
||||
|
||||
full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
|
||||
if (!full_name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_dapm_get_pin_status(dapm, full_name);
|
||||
kfree(full_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_get_pin_status);
|
||||
|
||||
int snd_soc_component_force_enable_pin(struct snd_soc_component *component,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_component_get_dapm(component);
|
||||
char *full_name;
|
||||
int ret;
|
||||
|
||||
if (!component->name_prefix)
|
||||
return snd_soc_dapm_force_enable_pin(dapm, pin);
|
||||
|
||||
full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
|
||||
if (!full_name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_dapm_force_enable_pin(dapm, full_name);
|
||||
kfree(full_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_force_enable_pin);
|
||||
|
||||
int snd_soc_component_force_enable_pin_unlocked(
|
||||
struct snd_soc_component *component,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_component_get_dapm(component);
|
||||
char *full_name;
|
||||
int ret;
|
||||
|
||||
if (!component->name_prefix)
|
||||
return snd_soc_dapm_force_enable_pin_unlocked(dapm, pin);
|
||||
|
||||
full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
|
||||
if (!full_name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_dapm_force_enable_pin_unlocked(dapm, full_name);
|
||||
kfree(full_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_force_enable_pin_unlocked);
|
||||
|
||||
/**
|
||||
* snd_soc_component_set_jack - configure component jack.
|
||||
* @component: COMPONENTs
|
||||
* @jack: structure to use for the jack
|
||||
* @data: can be used if codec driver need extra data for configuring jack
|
||||
*
|
||||
* Configures and enables jack detection function.
|
||||
*/
|
||||
int snd_soc_component_set_jack(struct snd_soc_component *component,
|
||||
struct snd_soc_jack *jack, void *data)
|
||||
{
|
||||
if (component->driver->set_jack)
|
||||
return component->driver->set_jack(component, jack, data);
|
||||
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_set_jack);
|
|
@ -2345,50 +2345,6 @@ int snd_soc_add_dai_controls(struct snd_soc_dai *dai,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_add_dai_controls);
|
||||
|
||||
/**
|
||||
* snd_soc_component_set_sysclk - configure COMPONENT system or master clock.
|
||||
* @component: COMPONENT
|
||||
* @clk_id: DAI specific clock ID
|
||||
* @source: Source for the clock
|
||||
* @freq: new clock frequency in Hz
|
||||
* @dir: new clock direction - input/output.
|
||||
*
|
||||
* Configures the CODEC master (MCLK) or system (SYSCLK) clocking.
|
||||
*/
|
||||
int snd_soc_component_set_sysclk(struct snd_soc_component *component,
|
||||
int clk_id, int source, unsigned int freq,
|
||||
int dir)
|
||||
{
|
||||
if (component->driver->set_sysclk)
|
||||
return component->driver->set_sysclk(component, clk_id, source,
|
||||
freq, dir);
|
||||
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_set_sysclk);
|
||||
|
||||
/*
|
||||
* snd_soc_component_set_pll - configure component PLL.
|
||||
* @component: COMPONENT
|
||||
* @pll_id: DAI specific PLL ID
|
||||
* @source: DAI specific source for the PLL
|
||||
* @freq_in: PLL input clock frequency in Hz
|
||||
* @freq_out: requested PLL output clock frequency in Hz
|
||||
*
|
||||
* Configures and enables PLL to generate output clock based on input clock.
|
||||
*/
|
||||
int snd_soc_component_set_pll(struct snd_soc_component *component, int pll_id,
|
||||
int source, unsigned int freq_in,
|
||||
unsigned int freq_out)
|
||||
{
|
||||
if (component->driver->set_pll)
|
||||
return component->driver->set_pll(component, pll_id, source,
|
||||
freq_in, freq_out);
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_set_pll);
|
||||
|
||||
static int snd_soc_bind_card(struct snd_soc_card *card)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd;
|
||||
|
|
|
@ -23,24 +23,6 @@ struct jack_gpio_tbl {
|
|||
struct snd_soc_jack_gpio *gpios;
|
||||
};
|
||||
|
||||
/**
|
||||
* snd_soc_component_set_jack - configure component jack.
|
||||
* @component: COMPONENTs
|
||||
* @jack: structure to use for the jack
|
||||
* @data: can be used if codec driver need extra data for configuring jack
|
||||
*
|
||||
* Configures and enables jack detection function.
|
||||
*/
|
||||
int snd_soc_component_set_jack(struct snd_soc_component *component,
|
||||
struct snd_soc_jack *jack, void *data)
|
||||
{
|
||||
if (component->driver->set_jack)
|
||||
return component->driver->set_jack(component, jack, data);
|
||||
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_set_jack);
|
||||
|
||||
/**
|
||||
* snd_soc_card_jack_new - Create a new jack
|
||||
* @card: ASoC card
|
||||
|
|
|
@ -52,205 +52,6 @@ int snd_soc_params_to_bclk(struct snd_pcm_hw_params *params)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_params_to_bclk);
|
||||
|
||||
int snd_soc_component_enable_pin(struct snd_soc_component *component,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_component_get_dapm(component);
|
||||
char *full_name;
|
||||
int ret;
|
||||
|
||||
if (!component->name_prefix)
|
||||
return snd_soc_dapm_enable_pin(dapm, pin);
|
||||
|
||||
full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
|
||||
if (!full_name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_dapm_enable_pin(dapm, full_name);
|
||||
kfree(full_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_enable_pin);
|
||||
|
||||
int snd_soc_component_enable_pin_unlocked(struct snd_soc_component *component,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_component_get_dapm(component);
|
||||
char *full_name;
|
||||
int ret;
|
||||
|
||||
if (!component->name_prefix)
|
||||
return snd_soc_dapm_enable_pin_unlocked(dapm, pin);
|
||||
|
||||
full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
|
||||
if (!full_name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_dapm_enable_pin_unlocked(dapm, full_name);
|
||||
kfree(full_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_enable_pin_unlocked);
|
||||
|
||||
int snd_soc_component_disable_pin(struct snd_soc_component *component,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_component_get_dapm(component);
|
||||
char *full_name;
|
||||
int ret;
|
||||
|
||||
if (!component->name_prefix)
|
||||
return snd_soc_dapm_disable_pin(dapm, pin);
|
||||
|
||||
full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
|
||||
if (!full_name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_dapm_disable_pin(dapm, full_name);
|
||||
kfree(full_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_disable_pin);
|
||||
|
||||
int snd_soc_component_disable_pin_unlocked(struct snd_soc_component *component,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_component_get_dapm(component);
|
||||
char *full_name;
|
||||
int ret;
|
||||
|
||||
if (!component->name_prefix)
|
||||
return snd_soc_dapm_disable_pin_unlocked(dapm, pin);
|
||||
|
||||
full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
|
||||
if (!full_name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_dapm_disable_pin_unlocked(dapm, full_name);
|
||||
kfree(full_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_disable_pin_unlocked);
|
||||
|
||||
int snd_soc_component_nc_pin(struct snd_soc_component *component,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_component_get_dapm(component);
|
||||
char *full_name;
|
||||
int ret;
|
||||
|
||||
if (!component->name_prefix)
|
||||
return snd_soc_dapm_nc_pin(dapm, pin);
|
||||
|
||||
full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
|
||||
if (!full_name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_dapm_nc_pin(dapm, full_name);
|
||||
kfree(full_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_nc_pin);
|
||||
|
||||
int snd_soc_component_nc_pin_unlocked(struct snd_soc_component *component,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_component_get_dapm(component);
|
||||
char *full_name;
|
||||
int ret;
|
||||
|
||||
if (!component->name_prefix)
|
||||
return snd_soc_dapm_nc_pin_unlocked(dapm, pin);
|
||||
|
||||
full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
|
||||
if (!full_name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_dapm_nc_pin_unlocked(dapm, full_name);
|
||||
kfree(full_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_nc_pin_unlocked);
|
||||
|
||||
int snd_soc_component_get_pin_status(struct snd_soc_component *component,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_component_get_dapm(component);
|
||||
char *full_name;
|
||||
int ret;
|
||||
|
||||
if (!component->name_prefix)
|
||||
return snd_soc_dapm_get_pin_status(dapm, pin);
|
||||
|
||||
full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
|
||||
if (!full_name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_dapm_get_pin_status(dapm, full_name);
|
||||
kfree(full_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_get_pin_status);
|
||||
|
||||
int snd_soc_component_force_enable_pin(struct snd_soc_component *component,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_component_get_dapm(component);
|
||||
char *full_name;
|
||||
int ret;
|
||||
|
||||
if (!component->name_prefix)
|
||||
return snd_soc_dapm_force_enable_pin(dapm, pin);
|
||||
|
||||
full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
|
||||
if (!full_name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_dapm_force_enable_pin(dapm, full_name);
|
||||
kfree(full_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_force_enable_pin);
|
||||
|
||||
int snd_soc_component_force_enable_pin_unlocked(
|
||||
struct snd_soc_component *component,
|
||||
const char *pin)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_component_get_dapm(component);
|
||||
char *full_name;
|
||||
int ret;
|
||||
|
||||
if (!component->name_prefix)
|
||||
return snd_soc_dapm_force_enable_pin_unlocked(dapm, pin);
|
||||
|
||||
full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
|
||||
if (!full_name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_dapm_force_enable_pin_unlocked(dapm, full_name);
|
||||
kfree(full_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_component_force_enable_pin_unlocked);
|
||||
|
||||
static const struct snd_pcm_hardware dummy_dma_hardware = {
|
||||
/* Random values to keep userspace happy when checking constraints */
|
||||
.info = SNDRV_PCM_INFO_INTERLEAVED |
|
||||
|
|
Loading…
Reference in New Issue