forked from luck/tmp_suning_uos_patched
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
328
include/sound/soc-component.h
Normal file
328
include/sound/soc-component.h
Normal file
|
@ -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) \
|
#define SOC_ENUM_SINGLE_VIRT_DECL(name, xtexts) \
|
||||||
const struct soc_enum name = SOC_ENUM_SINGLE_VIRT(ARRAY_SIZE(xtexts), 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
|
* Bias levels
|
||||||
*
|
*
|
||||||
|
@ -747,132 +732,6 @@ struct snd_soc_compr_ops {
|
||||||
int (*trigger)(struct snd_compr_stream *);
|
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_rtdcom_list {
|
||||||
struct snd_soc_component *component;
|
struct snd_soc_component *component;
|
||||||
struct list_head list; /* rtd::component_list */
|
struct list_head list; /* rtd::component_list */
|
||||||
|
@ -1337,134 +1196,6 @@ struct soc_enum {
|
||||||
struct snd_soc_dobj dobj;
|
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 */
|
/* device driver data */
|
||||||
|
|
||||||
static inline void snd_soc_card_set_drvdata(struct snd_soc_card *card,
|
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;
|
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)
|
static inline void snd_soc_initialize_card_lists(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
INIT_LIST_HEAD(&card->widgets);
|
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];
|
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
|
* snd_soc_kcontrol_component() - Returns the component that registered the
|
||||||
* control
|
* 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);
|
mutex_unlock(&dapm->card->dapm_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
int snd_soc_component_enable_pin(struct snd_soc_component *component,
|
#include <sound/soc-component.h>
|
||||||
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
|
#endif
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0
|
# 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-objs += soc-pcm.o soc-io.o soc-devres.o soc-ops.o
|
||||||
snd-soc-core-$(CONFIG_SND_SOC_COMPRESS) += soc-compress.o
|
snd-soc-core-$(CONFIG_SND_SOC_COMPRESS) += soc-compress.o
|
||||||
|
|
||||||
|
|
269
sound/soc/soc-component.c
Normal file
269
sound/soc/soc-component.c
Normal file
|
@ -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);
|
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)
|
static int snd_soc_bind_card(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
struct snd_soc_pcm_runtime *rtd;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
|
|
@ -23,24 +23,6 @@ struct jack_gpio_tbl {
|
||||||
struct snd_soc_jack_gpio *gpios;
|
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
|
* snd_soc_card_jack_new - Create a new jack
|
||||||
* @card: ASoC card
|
* @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);
|
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 = {
|
static const struct snd_pcm_hardware dummy_dma_hardware = {
|
||||||
/* Random values to keep userspace happy when checking constraints */
|
/* Random values to keep userspace happy when checking constraints */
|
||||||
.info = SNDRV_PCM_INFO_INTERLEAVED |
|
.info = SNDRV_PCM_INFO_INTERLEAVED |
|
||||||
|
|
Loading…
Reference in New Issue
Block a user