mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-06 14:05:39 +00:00
ASoC: Extend wm_adsp so cs35l56 can suppress controls
Merge series from Simon Trimmer <simont@opensource.cirrus.com>: This pair of patches extend wm_adsp to add a callback that can be used to control whether ALSA controls are added and then tweak cs35l56 to use it to suppress controls made from firmware coefficients.
This commit is contained in:
commit
a44b7b57ef
@ -1095,6 +1095,11 @@ int cs35l56_system_resume(struct device *dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cs35l56_system_resume);
|
||||
|
||||
static int cs35l56_control_add_nop(struct wm_adsp *dsp, struct cs_dsp_coeff_ctl *cs_ctl)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cs35l56_dsp_init(struct cs35l56_private *cs35l56)
|
||||
{
|
||||
struct wm_adsp *dsp;
|
||||
@ -1117,6 +1122,12 @@ static int cs35l56_dsp_init(struct cs35l56_private *cs35l56)
|
||||
dsp->fw = 12;
|
||||
dsp->wmfw_optional = true;
|
||||
|
||||
/*
|
||||
* None of the firmware controls need to be exported so add a no-op
|
||||
* callback that suppresses creating an ALSA control.
|
||||
*/
|
||||
dsp->control_add = &cs35l56_control_add_nop;
|
||||
|
||||
dev_dbg(cs35l56->base.dev, "DSP system name: '%s'\n", dsp->system_name);
|
||||
|
||||
ret = wm_halo_init(dsp);
|
||||
|
@ -583,7 +583,7 @@ static void wm_adsp_ctl_work(struct work_struct *work)
|
||||
kfree(kcontrol);
|
||||
}
|
||||
|
||||
static int wm_adsp_control_add(struct cs_dsp_coeff_ctl *cs_ctl)
|
||||
int wm_adsp_control_add(struct cs_dsp_coeff_ctl *cs_ctl)
|
||||
{
|
||||
struct wm_adsp *dsp = container_of(cs_ctl->dsp, struct wm_adsp, cs_dsp);
|
||||
struct cs_dsp *cs_dsp = &dsp->cs_dsp;
|
||||
@ -658,6 +658,17 @@ static int wm_adsp_control_add(struct cs_dsp_coeff_ctl *cs_ctl)
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wm_adsp_control_add);
|
||||
|
||||
static int wm_adsp_control_add_cb(struct cs_dsp_coeff_ctl *cs_ctl)
|
||||
{
|
||||
struct wm_adsp *dsp = container_of(cs_ctl->dsp, struct wm_adsp, cs_dsp);
|
||||
|
||||
if (dsp->control_add)
|
||||
return (dsp->control_add)(dsp, cs_ctl);
|
||||
else
|
||||
return wm_adsp_control_add(cs_ctl);
|
||||
}
|
||||
|
||||
static void wm_adsp_control_remove(struct cs_dsp_coeff_ctl *cs_ctl)
|
||||
{
|
||||
@ -2072,12 +2083,12 @@ irqreturn_t wm_halo_wdt_expire(int irq, void *data)
|
||||
EXPORT_SYMBOL_GPL(wm_halo_wdt_expire);
|
||||
|
||||
static const struct cs_dsp_client_ops wm_adsp1_client_ops = {
|
||||
.control_add = wm_adsp_control_add,
|
||||
.control_add = wm_adsp_control_add_cb,
|
||||
.control_remove = wm_adsp_control_remove,
|
||||
};
|
||||
|
||||
static const struct cs_dsp_client_ops wm_adsp2_client_ops = {
|
||||
.control_add = wm_adsp_control_add,
|
||||
.control_add = wm_adsp_control_add_cb,
|
||||
.control_remove = wm_adsp_control_remove,
|
||||
.pre_run = wm_adsp_pre_run,
|
||||
.post_run = wm_adsp_event_post_run,
|
||||
|
@ -37,6 +37,7 @@ struct wm_adsp {
|
||||
bool wmfw_optional;
|
||||
|
||||
struct work_struct boot_work;
|
||||
int (*control_add)(struct wm_adsp *dsp, struct cs_dsp_coeff_ctl *cs_ctl);
|
||||
int (*pre_run)(struct wm_adsp *dsp);
|
||||
|
||||
bool preloaded;
|
||||
@ -132,6 +133,8 @@ int wm_adsp_compr_pointer(struct snd_soc_component *component,
|
||||
int wm_adsp_compr_copy(struct snd_soc_component *component,
|
||||
struct snd_compr_stream *stream,
|
||||
char __user *buf, size_t count);
|
||||
|
||||
int wm_adsp_control_add(struct cs_dsp_coeff_ctl *cs_ctl);
|
||||
int wm_adsp_write_ctl(struct wm_adsp *dsp, const char *name, int type,
|
||||
unsigned int alg, void *buf, size_t len);
|
||||
int wm_adsp_read_ctl(struct wm_adsp *dsp, const char *name, int type,
|
||||
|
Loading…
Reference in New Issue
Block a user