mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-28 06:34:12 +08:00
Merge remote-tracking branches 'asoc/topic/adau17x1', 'asoc/topic/adsp', 'asoc/topic/ak4642', 'asoc/topic/amd' and 'asoc/topic/arizona' into asoc-next
This commit is contained in:
commit
a2d64282dd
@ -670,13 +670,10 @@ static int acp_dma_hw_params(struct snd_pcm_substream *substream,
|
||||
{
|
||||
int status;
|
||||
uint64_t size;
|
||||
struct snd_dma_buffer *dma_buffer;
|
||||
struct page *pg;
|
||||
struct snd_pcm_runtime *runtime;
|
||||
struct audio_substream_data *rtd;
|
||||
|
||||
dma_buffer = &substream->dma_buffer;
|
||||
|
||||
runtime = substream->runtime;
|
||||
rtd = runtime->private_data;
|
||||
|
||||
|
@ -65,7 +65,6 @@ static int adau17x1_pll_event(struct snd_soc_dapm_widget *w,
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
|
||||
struct adau *adau = snd_soc_codec_get_drvdata(codec);
|
||||
int ret;
|
||||
|
||||
if (SND_SOC_DAPM_EVENT_ON(event)) {
|
||||
adau->pll_regs[5] = 1;
|
||||
@ -78,7 +77,7 @@ static int adau17x1_pll_event(struct snd_soc_dapm_widget *w,
|
||||
}
|
||||
|
||||
/* The PLL register is 6 bytes long and can only be written at once. */
|
||||
ret = regmap_raw_write(adau->regmap, ADAU17X1_PLL_CONTROL,
|
||||
regmap_raw_write(adau->regmap, ADAU17X1_PLL_CONTROL,
|
||||
adau->pll_regs, ARRAY_SIZE(adau->pll_regs));
|
||||
|
||||
if (SND_SOC_DAPM_EVENT_ON(event)) {
|
||||
|
@ -189,7 +189,7 @@ static int ak4642_lout_event(struct snd_soc_dapm_widget *w,
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
case SND_SOC_DAPM_POST_PMD:
|
||||
/* Power save mode OFF */
|
||||
mdelay(300);
|
||||
msleep(300);
|
||||
snd_soc_update_bits(codec, SG_SL2, LOPS, 0);
|
||||
break;
|
||||
}
|
||||
|
@ -192,6 +192,7 @@ extern unsigned int arizona_mixer_values[ARIZONA_NUM_MIXER_INPUTS];
|
||||
#define ARIZONA_DSP_ROUTES(name) \
|
||||
{ name, NULL, name " Preloader"}, \
|
||||
{ name " Preloader", NULL, "SYSCLK" }, \
|
||||
{ name " Preload", NULL, name " Preloader"}, \
|
||||
{ name, NULL, name " Aux 1" }, \
|
||||
{ name, NULL, name " Aux 2" }, \
|
||||
{ name, NULL, name " Aux 3" }, \
|
||||
|
@ -173,6 +173,9 @@ SOC_ENUM("ISRC2 FSH", arizona_isrc_fsh[1]),
|
||||
SOC_ENUM("ISRC3 FSH", arizona_isrc_fsh[2]),
|
||||
SOC_ENUM("ASRC RATE 1", arizona_asrc_rate1),
|
||||
|
||||
WM_ADSP2_PRELOAD_SWITCH("DSP2", 2),
|
||||
WM_ADSP2_PRELOAD_SWITCH("DSP3", 3),
|
||||
|
||||
ARIZONA_MIXER_CONTROLS("DSP2L", ARIZONA_DSP2LMIX_INPUT_1_SOURCE),
|
||||
ARIZONA_MIXER_CONTROLS("DSP2R", ARIZONA_DSP2RMIX_INPUT_1_SOURCE),
|
||||
ARIZONA_MIXER_CONTROLS("DSP3L", ARIZONA_DSP3LMIX_INPUT_1_SOURCE),
|
||||
@ -1121,7 +1124,10 @@ static int cs47l24_codec_probe(struct snd_soc_codec *codec)
|
||||
|
||||
priv->core.arizona->dapm = dapm;
|
||||
|
||||
arizona_init_spk(codec);
|
||||
ret = arizona_init_spk(codec);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
arizona_init_gpio(codec);
|
||||
arizona_init_mono(codec);
|
||||
arizona_init_notifiers(codec);
|
||||
|
@ -855,6 +855,8 @@ ARIZONA_LHPF_CONTROL("LHPF2 Coefficients", ARIZONA_HPLPF2_2),
|
||||
ARIZONA_LHPF_CONTROL("LHPF3 Coefficients", ARIZONA_HPLPF3_2),
|
||||
ARIZONA_LHPF_CONTROL("LHPF4 Coefficients", ARIZONA_HPLPF4_2),
|
||||
|
||||
WM_ADSP2_PRELOAD_SWITCH("DSP1", 1),
|
||||
|
||||
ARIZONA_MIXER_CONTROLS("DSP1L", ARIZONA_DSP1LMIX_INPUT_1_SOURCE),
|
||||
ARIZONA_MIXER_CONTROLS("DSP1R", ARIZONA_DSP1RMIX_INPUT_1_SOURCE),
|
||||
|
||||
@ -1944,7 +1946,10 @@ static int wm5102_codec_probe(struct snd_soc_codec *codec)
|
||||
if (ret)
|
||||
goto err_adsp2_codec_probe;
|
||||
|
||||
arizona_init_spk(codec);
|
||||
ret = arizona_init_spk(codec);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
arizona_init_gpio(codec);
|
||||
arizona_init_notifiers(codec);
|
||||
|
||||
|
@ -778,6 +778,11 @@ SOC_ENUM("ISRC2 FSH", arizona_isrc_fsh[1]),
|
||||
SOC_ENUM("ISRC3 FSH", arizona_isrc_fsh[2]),
|
||||
SOC_ENUM("ASRC RATE 1", arizona_asrc_rate1),
|
||||
|
||||
WM_ADSP2_PRELOAD_SWITCH("DSP1", 1),
|
||||
WM_ADSP2_PRELOAD_SWITCH("DSP2", 2),
|
||||
WM_ADSP2_PRELOAD_SWITCH("DSP3", 3),
|
||||
WM_ADSP2_PRELOAD_SWITCH("DSP4", 4),
|
||||
|
||||
ARIZONA_MIXER_CONTROLS("DSP1L", ARIZONA_DSP1LMIX_INPUT_1_SOURCE),
|
||||
ARIZONA_MIXER_CONTROLS("DSP1R", ARIZONA_DSP1RMIX_INPUT_1_SOURCE),
|
||||
ARIZONA_MIXER_CONTROLS("DSP2L", ARIZONA_DSP2LMIX_INPUT_1_SOURCE),
|
||||
@ -2279,7 +2284,10 @@ static int wm5110_codec_probe(struct snd_soc_codec *codec)
|
||||
|
||||
priv->core.arizona->dapm = dapm;
|
||||
|
||||
arizona_init_spk(codec);
|
||||
ret = arizona_init_spk(codec);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
arizona_init_gpio(codec);
|
||||
arizona_init_mono(codec);
|
||||
arizona_init_notifiers(codec);
|
||||
|
@ -1062,8 +1062,12 @@ static int wm8997_codec_probe(struct snd_soc_codec *codec)
|
||||
struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
|
||||
struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
|
||||
struct wm8997_priv *priv = snd_soc_codec_get_drvdata(codec);
|
||||
int ret;
|
||||
|
||||
ret = arizona_init_spk(codec);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
arizona_init_spk(codec);
|
||||
arizona_init_notifiers(codec);
|
||||
|
||||
snd_soc_component_disable_pin(component, "HAPTICS");
|
||||
|
@ -1321,10 +1321,14 @@ static int wm8998_codec_probe(struct snd_soc_codec *codec)
|
||||
struct wm8998_priv *priv = snd_soc_codec_get_drvdata(codec);
|
||||
struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
|
||||
struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
|
||||
int ret;
|
||||
|
||||
priv->core.arizona->dapm = dapm;
|
||||
|
||||
arizona_init_spk(codec);
|
||||
ret = arizona_init_spk(codec);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
arizona_init_gpio(codec);
|
||||
arizona_init_notifiers(codec);
|
||||
|
||||
|
@ -2473,7 +2473,7 @@ static void wm_adsp2_boot_work(struct work_struct *work)
|
||||
|
||||
ret = wm_adsp2_ena(dsp);
|
||||
if (ret != 0)
|
||||
goto err_mutex;
|
||||
goto err_mem;
|
||||
|
||||
ret = wm_adsp_load(dsp);
|
||||
if (ret != 0)
|
||||
@ -2492,14 +2492,14 @@ static void wm_adsp2_boot_work(struct work_struct *work)
|
||||
if (ret != 0)
|
||||
goto err_ena;
|
||||
|
||||
dsp->booted = true;
|
||||
|
||||
/* Turn DSP back off until we are ready to run */
|
||||
ret = regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL,
|
||||
ADSP2_SYS_ENA, 0);
|
||||
if (ret != 0)
|
||||
goto err_ena;
|
||||
|
||||
dsp->booted = true;
|
||||
|
||||
mutex_unlock(&dsp->pwr_lock);
|
||||
|
||||
return;
|
||||
@ -2507,6 +2507,9 @@ static void wm_adsp2_boot_work(struct work_struct *work)
|
||||
err_ena:
|
||||
regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL,
|
||||
ADSP2_SYS_ENA | ADSP2_CORE_ENA | ADSP2_START, 0);
|
||||
err_mem:
|
||||
regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL,
|
||||
ADSP2_MEM_ENA, 0);
|
||||
err_mutex:
|
||||
mutex_unlock(&dsp->pwr_lock);
|
||||
}
|
||||
@ -2523,6 +2526,43 @@ static void wm_adsp2_set_dspclk(struct wm_adsp *dsp, unsigned int freq)
|
||||
adsp_err(dsp, "Failed to set clock rate: %d\n", ret);
|
||||
}
|
||||
|
||||
int wm_adsp2_preloader_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
|
||||
struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec);
|
||||
|
||||
ucontrol->value.integer.value[0] = dsp->preloaded;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wm_adsp2_preloader_get);
|
||||
|
||||
int wm_adsp2_preloader_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
|
||||
struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec);
|
||||
struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
|
||||
struct soc_mixer_control *mc =
|
||||
(struct soc_mixer_control *)kcontrol->private_value;
|
||||
char preload[32];
|
||||
|
||||
snprintf(preload, ARRAY_SIZE(preload), "DSP%d Preload", mc->shift);
|
||||
|
||||
dsp->preloaded = ucontrol->value.integer.value[0];
|
||||
|
||||
if (ucontrol->value.integer.value[0])
|
||||
snd_soc_dapm_force_enable_pin(dapm, preload);
|
||||
else
|
||||
snd_soc_dapm_disable_pin(dapm, preload);
|
||||
|
||||
snd_soc_dapm_sync(dapm);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wm_adsp2_preloader_put);
|
||||
|
||||
int wm_adsp2_early_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event,
|
||||
unsigned int freq)
|
||||
@ -2538,6 +2578,8 @@ int wm_adsp2_early_event(struct snd_soc_dapm_widget *w,
|
||||
queue_work(system_unbound_wq, &dsp->boot_work);
|
||||
break;
|
||||
case SND_SOC_DAPM_PRE_PMD:
|
||||
mutex_lock(&dsp->pwr_lock);
|
||||
|
||||
wm_adsp_debugfs_clear(dsp);
|
||||
|
||||
dsp->fw_id = 0;
|
||||
@ -2553,6 +2595,8 @@ int wm_adsp2_early_event(struct snd_soc_dapm_widget *w,
|
||||
|
||||
wm_adsp_free_alg_regions(dsp);
|
||||
|
||||
mutex_unlock(&dsp->pwr_lock);
|
||||
|
||||
adsp_dbg(dsp, "Shutdown complete\n");
|
||||
break;
|
||||
default:
|
||||
@ -2575,8 +2619,12 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
flush_work(&dsp->boot_work);
|
||||
|
||||
if (!dsp->booted)
|
||||
return -EIO;
|
||||
mutex_lock(&dsp->pwr_lock);
|
||||
|
||||
if (!dsp->booted) {
|
||||
ret = -EIO;
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = wm_adsp2_ena(dsp);
|
||||
if (ret != 0)
|
||||
@ -2594,18 +2642,14 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
|
||||
if (ret != 0)
|
||||
goto err;
|
||||
|
||||
dsp->running = true;
|
||||
|
||||
mutex_lock(&dsp->pwr_lock);
|
||||
|
||||
if (wm_adsp_fw[dsp->fw].num_caps != 0) {
|
||||
ret = wm_adsp_buffer_init(dsp);
|
||||
if (ret < 0) {
|
||||
mutex_unlock(&dsp->pwr_lock);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
dsp->running = true;
|
||||
|
||||
mutex_unlock(&dsp->pwr_lock);
|
||||
|
||||
break;
|
||||
@ -2648,16 +2692,23 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
|
||||
err:
|
||||
regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL,
|
||||
ADSP2_SYS_ENA | ADSP2_CORE_ENA | ADSP2_START, 0);
|
||||
mutex_unlock(&dsp->pwr_lock);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wm_adsp2_event);
|
||||
|
||||
int wm_adsp2_codec_probe(struct wm_adsp *dsp, struct snd_soc_codec *codec)
|
||||
{
|
||||
dsp->codec = codec;
|
||||
struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
|
||||
char preload[32];
|
||||
|
||||
snprintf(preload, ARRAY_SIZE(preload), "DSP%d Preload", dsp->num);
|
||||
snd_soc_dapm_disable_pin(dapm, preload);
|
||||
|
||||
wm_adsp2_init_debugfs(dsp, codec);
|
||||
|
||||
dsp->codec = codec;
|
||||
|
||||
return snd_soc_add_codec_controls(codec,
|
||||
&wm_adsp_fw_controls[dsp->num - 1],
|
||||
1);
|
||||
|
@ -62,6 +62,7 @@ struct wm_adsp {
|
||||
int fw;
|
||||
int fw_ver;
|
||||
|
||||
bool preloaded;
|
||||
bool booted;
|
||||
bool running;
|
||||
|
||||
@ -86,7 +87,12 @@ struct wm_adsp {
|
||||
SND_SOC_DAPM_PGA_E(wname, SND_SOC_NOPM, num, 0, NULL, 0, \
|
||||
wm_adsp1_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD)
|
||||
|
||||
#define WM_ADSP2_PRELOAD_SWITCH(wname, num) \
|
||||
SOC_SINGLE_EXT(wname " Preload Switch", SND_SOC_NOPM, num, 1, 0, \
|
||||
wm_adsp2_preloader_get, wm_adsp2_preloader_put)
|
||||
|
||||
#define WM_ADSP2(wname, num, event_fn) \
|
||||
SND_SOC_DAPM_SPK(wname " Preload", NULL), \
|
||||
{ .id = snd_soc_dapm_supply, .name = wname " Preloader", \
|
||||
.reg = SND_SOC_NOPM, .shift = num, .event = event_fn, \
|
||||
.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD, \
|
||||
@ -110,6 +116,11 @@ int wm_adsp2_early_event(struct snd_soc_dapm_widget *w,
|
||||
int wm_adsp2_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event);
|
||||
|
||||
int wm_adsp2_preloader_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
int wm_adsp2_preloader_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
|
||||
int wm_adsp_compr_open(struct wm_adsp *dsp, struct snd_compr_stream *stream);
|
||||
int wm_adsp_compr_free(struct snd_compr_stream *stream);
|
||||
int wm_adsp_compr_set_params(struct snd_compr_stream *stream,
|
||||
|
Loading…
Reference in New Issue
Block a user