Commit 20230620 authored by Mark Brown's avatar Mark Brown

Merge branch 'asoc-5.5' into asoc-linus

parents def9d278 8ce1cbd6
...@@ -529,6 +529,7 @@ SND_SOC_DAPM_OUTPUT("DRC2 Signal Activity"), ...@@ -529,6 +529,7 @@ SND_SOC_DAPM_OUTPUT("DRC2 Signal Activity"),
SND_SOC_DAPM_OUTPUT("DSP Trigger Out"), SND_SOC_DAPM_OUTPUT("DSP Trigger Out"),
SND_SOC_DAPM_DEMUX("HPOUT1 Demux", SND_SOC_NOPM, 0, 0, &cs47l15_outdemux), SND_SOC_DAPM_DEMUX("HPOUT1 Demux", SND_SOC_NOPM, 0, 0, &cs47l15_outdemux),
SND_SOC_DAPM_MUX("HPOUT1 Mono Mux", SND_SOC_NOPM, 0, 0, &cs47l15_outdemux),
SND_SOC_DAPM_PGA("PWM1 Driver", MADERA_PWM_DRIVE_1, MADERA_PWM1_ENA_SHIFT, SND_SOC_DAPM_PGA("PWM1 Driver", MADERA_PWM_DRIVE_1, MADERA_PWM1_ENA_SHIFT,
0, NULL, 0), 0, NULL, 0),
...@@ -1084,6 +1085,9 @@ static const struct snd_soc_dapm_route cs47l15_dapm_routes[] = { ...@@ -1084,6 +1085,9 @@ static const struct snd_soc_dapm_route cs47l15_dapm_routes[] = {
{ "AEC2 Loopback", "HPOUT1R", "OUT1R" }, { "AEC2 Loopback", "HPOUT1R", "OUT1R" },
{ "HPOUT1 Demux", NULL, "OUT1L" }, { "HPOUT1 Demux", NULL, "OUT1L" },
{ "HPOUT1 Demux", NULL, "OUT1R" }, { "HPOUT1 Demux", NULL, "OUT1R" },
{ "OUT1R", NULL, "HPOUT1 Mono Mux" },
{ "HPOUTL", "HPOUT", "HPOUT1 Demux" }, { "HPOUTL", "HPOUT", "HPOUT1 Demux" },
{ "HPOUTR", "HPOUT", "HPOUT1 Demux" }, { "HPOUTR", "HPOUT", "HPOUT1 Demux" },
{ "EPOUTP", "EPOUT", "HPOUT1 Demux" }, { "EPOUTP", "EPOUT", "HPOUT1 Demux" },
...@@ -1261,6 +1265,11 @@ static irqreturn_t cs47l15_adsp2_irq(int irq, void *data) ...@@ -1261,6 +1265,11 @@ static irqreturn_t cs47l15_adsp2_irq(int irq, void *data)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static const struct snd_soc_dapm_route cs47l15_mono_routes[] = {
{ "HPOUT1 Mono Mux", "HPOUT", "OUT1L" },
{ "HPOUT1 Mono Mux", "EPOUT", "OUT1L" },
};
static int cs47l15_component_probe(struct snd_soc_component *component) static int cs47l15_component_probe(struct snd_soc_component *component)
{ {
struct cs47l15 *cs47l15 = snd_soc_component_get_drvdata(component); struct cs47l15 *cs47l15 = snd_soc_component_get_drvdata(component);
...@@ -1277,7 +1286,9 @@ static int cs47l15_component_probe(struct snd_soc_component *component) ...@@ -1277,7 +1286,9 @@ static int cs47l15_component_probe(struct snd_soc_component *component)
if (ret) if (ret)
return ret; return ret;
ret = madera_init_outputs(component, CS47L15_MONO_OUTPUTS); ret = madera_init_outputs(component, cs47l15_mono_routes,
ARRAY_SIZE(cs47l15_mono_routes),
CS47L15_MONO_OUTPUTS);
if (ret) if (ret)
return ret; return ret;
......
...@@ -631,6 +631,7 @@ SND_SOC_DAPM_OUTPUT("DRC2 Signal Activity"), ...@@ -631,6 +631,7 @@ SND_SOC_DAPM_OUTPUT("DRC2 Signal Activity"),
SND_SOC_DAPM_OUTPUT("DSP Trigger Out"), SND_SOC_DAPM_OUTPUT("DSP Trigger Out"),
SND_SOC_DAPM_DEMUX("HPOUT1 Demux", SND_SOC_NOPM, 0, 0, &cs47l35_outdemux), SND_SOC_DAPM_DEMUX("HPOUT1 Demux", SND_SOC_NOPM, 0, 0, &cs47l35_outdemux),
SND_SOC_DAPM_MUX("HPOUT1 Mono Mux", SND_SOC_NOPM, 0, 0, &cs47l35_outdemux),
SND_SOC_DAPM_PGA("PWM1 Driver", MADERA_PWM_DRIVE_1, MADERA_PWM1_ENA_SHIFT, SND_SOC_DAPM_PGA("PWM1 Driver", MADERA_PWM_DRIVE_1, MADERA_PWM1_ENA_SHIFT,
0, NULL, 0), 0, NULL, 0),
...@@ -1309,6 +1310,8 @@ static const struct snd_soc_dapm_route cs47l35_dapm_routes[] = { ...@@ -1309,6 +1310,8 @@ static const struct snd_soc_dapm_route cs47l35_dapm_routes[] = {
{ "SPKOUTN", NULL, "OUT4L" }, { "SPKOUTN", NULL, "OUT4L" },
{ "SPKOUTP", NULL, "OUT4L" }, { "SPKOUTP", NULL, "OUT4L" },
{ "OUT1R", NULL, "HPOUT1 Mono Mux" },
{ "HPOUTL", "HPOUT", "HPOUT1 Demux" }, { "HPOUTL", "HPOUT", "HPOUT1 Demux" },
{ "HPOUTR", "HPOUT", "HPOUT1 Demux" }, { "HPOUTR", "HPOUT", "HPOUT1 Demux" },
{ "EPOUTP", "EPOUT", "HPOUT1 Demux" }, { "EPOUTP", "EPOUT", "HPOUT1 Demux" },
...@@ -1552,6 +1555,11 @@ static irqreturn_t cs47l35_adsp2_irq(int irq, void *data) ...@@ -1552,6 +1555,11 @@ static irqreturn_t cs47l35_adsp2_irq(int irq, void *data)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static const struct snd_soc_dapm_route cs47l35_mono_routes[] = {
{ "HPOUT1 Mono Mux", "HPOUT", "OUT1L" },
{ "HPOUT1 Mono Mux", "EPOUT", "OUT1L" },
};
static int cs47l35_component_probe(struct snd_soc_component *component) static int cs47l35_component_probe(struct snd_soc_component *component)
{ {
struct cs47l35 *cs47l35 = snd_soc_component_get_drvdata(component); struct cs47l35 *cs47l35 = snd_soc_component_get_drvdata(component);
...@@ -1568,7 +1576,9 @@ static int cs47l35_component_probe(struct snd_soc_component *component) ...@@ -1568,7 +1576,9 @@ static int cs47l35_component_probe(struct snd_soc_component *component)
if (ret) if (ret)
return ret; return ret;
ret = madera_init_outputs(component, CS47L35_MONO_OUTPUTS); ret = madera_init_outputs(component, cs47l35_mono_routes,
ARRAY_SIZE(cs47l35_mono_routes),
CS47L35_MONO_OUTPUTS);
if (ret) if (ret)
return ret; return ret;
......
...@@ -2005,12 +2005,18 @@ static const struct snd_soc_dapm_route cs47l85_dapm_routes[] = { ...@@ -2005,12 +2005,18 @@ static const struct snd_soc_dapm_route cs47l85_dapm_routes[] = {
{ "IN3R", NULL, "IN3R Mode" }, { "IN3R", NULL, "IN3R Mode" },
{ "IN4L", NULL, "DMICCLK4" }, { "IN4L", NULL, "DMICCLK4" },
{ "IN4L", NULL, "DMICDAT4" },
{ "IN4R", NULL, "DMICCLK4" },
{ "IN4R", NULL, "DMICDAT4" }, { "IN4R", NULL, "DMICDAT4" },
{ "IN5L", NULL, "DMICCLK5" }, { "IN5L", NULL, "DMICCLK5" },
{ "IN5L", NULL, "DMICDAT5" },
{ "IN5R", NULL, "DMICCLK5" },
{ "IN5R", NULL, "DMICDAT5" }, { "IN5R", NULL, "DMICDAT5" },
{ "IN6L", NULL, "DMICCLK6" }, { "IN6L", NULL, "DMICCLK6" },
{ "IN6L", NULL, "DMICDAT6" },
{ "IN6R", NULL, "DMICCLK6" },
{ "IN6R", NULL, "DMICDAT6" }, { "IN6R", NULL, "DMICDAT6" },
MADERA_MIXER_ROUTES("OUT1L", "HPOUT1L"), MADERA_MIXER_ROUTES("OUT1L", "HPOUT1L"),
...@@ -2507,7 +2513,8 @@ static int cs47l85_component_probe(struct snd_soc_component *component) ...@@ -2507,7 +2513,8 @@ static int cs47l85_component_probe(struct snd_soc_component *component)
if (ret) if (ret)
return ret; return ret;
ret = madera_init_outputs(component, CS47L85_MONO_OUTPUTS); ret = madera_init_outputs(component, NULL, CS47L85_MONO_OUTPUTS,
CS47L85_MONO_OUTPUTS);
if (ret) if (ret)
return ret; return ret;
......
...@@ -1935,12 +1935,18 @@ static const struct snd_soc_dapm_route cs47l90_dapm_routes[] = { ...@@ -1935,12 +1935,18 @@ static const struct snd_soc_dapm_route cs47l90_dapm_routes[] = {
{ "IN2R", NULL, "IN2R Mode" }, { "IN2R", NULL, "IN2R Mode" },
{ "IN3L", NULL, "DMICCLK3" }, { "IN3L", NULL, "DMICCLK3" },
{ "IN3L", NULL, "DMICDAT3" },
{ "IN3R", NULL, "DMICCLK3" },
{ "IN3R", NULL, "DMICDAT3" }, { "IN3R", NULL, "DMICDAT3" },
{ "IN4L", NULL, "DMICCLK4" }, { "IN4L", NULL, "DMICCLK4" },
{ "IN4L", NULL, "DMICDAT4" },
{ "IN4R", NULL, "DMICCLK4" },
{ "IN4R", NULL, "DMICDAT4" }, { "IN4R", NULL, "DMICDAT4" },
{ "IN5L", NULL, "DMICCLK5" }, { "IN5L", NULL, "DMICCLK5" },
{ "IN5L", NULL, "DMICDAT5" },
{ "IN5R", NULL, "DMICCLK5" },
{ "IN5R", NULL, "DMICDAT5" }, { "IN5R", NULL, "DMICDAT5" },
MADERA_MIXER_ROUTES("OUT1L", "HPOUT1L"), MADERA_MIXER_ROUTES("OUT1L", "HPOUT1L"),
...@@ -2418,7 +2424,8 @@ static int cs47l90_component_probe(struct snd_soc_component *component) ...@@ -2418,7 +2424,8 @@ static int cs47l90_component_probe(struct snd_soc_component *component)
if (ret) if (ret)
return ret; return ret;
ret = madera_init_outputs(component, CS47L90_MONO_OUTPUTS); ret = madera_init_outputs(component, NULL, CS47L90_MONO_OUTPUTS,
CS47L90_MONO_OUTPUTS);
if (ret) if (ret)
return ret; return ret;
......
...@@ -730,6 +730,7 @@ SND_SOC_DAPM_MUX("IN2L Mode", SND_SOC_NOPM, 0, 0, &madera_inmode[1]), ...@@ -730,6 +730,7 @@ SND_SOC_DAPM_MUX("IN2L Mode", SND_SOC_NOPM, 0, 0, &madera_inmode[1]),
SND_SOC_DAPM_MUX("IN2R Mode", SND_SOC_NOPM, 0, 0, &madera_inmode[1]), SND_SOC_DAPM_MUX("IN2R Mode", SND_SOC_NOPM, 0, 0, &madera_inmode[1]),
SND_SOC_DAPM_DEMUX("OUT3 Demux", SND_SOC_NOPM, 0, 0, &cs47l92_outdemux), SND_SOC_DAPM_DEMUX("OUT3 Demux", SND_SOC_NOPM, 0, 0, &cs47l92_outdemux),
SND_SOC_DAPM_MUX("OUT3 Mono Mux", SND_SOC_NOPM, 0, 0, &cs47l92_outdemux),
SND_SOC_DAPM_OUTPUT("DRC1 Signal Activity"), SND_SOC_DAPM_OUTPUT("DRC1 Signal Activity"),
SND_SOC_DAPM_OUTPUT("DRC2 Signal Activity"), SND_SOC_DAPM_OUTPUT("DRC2 Signal Activity"),
...@@ -1584,6 +1585,8 @@ static const struct snd_soc_dapm_route cs47l92_dapm_routes[] = { ...@@ -1584,6 +1585,8 @@ static const struct snd_soc_dapm_route cs47l92_dapm_routes[] = {
{ "OUT3 Demux", NULL, "OUT3L" }, { "OUT3 Demux", NULL, "OUT3L" },
{ "OUT3 Demux", NULL, "OUT3R" }, { "OUT3 Demux", NULL, "OUT3R" },
{ "OUT3R", NULL, "OUT3 Mono Mux" },
{ "HPOUT3L", "HPOUT3", "OUT3 Demux" }, { "HPOUT3L", "HPOUT3", "OUT3 Demux" },
{ "HPOUT3R", "HPOUT3", "OUT3 Demux" }, { "HPOUT3R", "HPOUT3", "OUT3 Demux" },
{ "HPOUT4L", "HPOUT4", "OUT3 Demux" }, { "HPOUT4L", "HPOUT4", "OUT3 Demux" },
...@@ -1817,6 +1820,13 @@ static irqreturn_t cs47l92_adsp2_irq(int irq, void *data) ...@@ -1817,6 +1820,13 @@ static irqreturn_t cs47l92_adsp2_irq(int irq, void *data)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static const struct snd_soc_dapm_route cs47l92_mono_routes[] = {
{ "OUT1R", NULL, "OUT1L" },
{ "OUT2R", NULL, "OUT2L" },
{ "OUT3 Mono Mux", "HPOUT3", "OUT3L" },
{ "OUT3 Mono Mux", "HPOUT4", "OUT3L" },
};
static int cs47l92_component_probe(struct snd_soc_component *component) static int cs47l92_component_probe(struct snd_soc_component *component)
{ {
struct cs47l92 *cs47l92 = snd_soc_component_get_drvdata(component); struct cs47l92 *cs47l92 = snd_soc_component_get_drvdata(component);
...@@ -1833,7 +1843,9 @@ static int cs47l92_component_probe(struct snd_soc_component *component) ...@@ -1833,7 +1843,9 @@ static int cs47l92_component_probe(struct snd_soc_component *component)
if (ret) if (ret)
return ret; return ret;
ret = madera_init_outputs(component, CS47L92_MONO_OUTPUTS); ret = madera_init_outputs(component, cs47l92_mono_routes,
ARRAY_SIZE(cs47l92_mono_routes),
CS47L92_MONO_OUTPUTS);
if (ret) if (ret)
return ret; return ret;
......
...@@ -1162,7 +1162,9 @@ static const struct snd_soc_dapm_route madera_mono_routes[] = { ...@@ -1162,7 +1162,9 @@ static const struct snd_soc_dapm_route madera_mono_routes[] = {
{ "OUT6R", NULL, "OUT6L" }, { "OUT6R", NULL, "OUT6L" },
}; };
int madera_init_outputs(struct snd_soc_component *component, int n_mono_routes) int madera_init_outputs(struct snd_soc_component *component,
const struct snd_soc_dapm_route *routes,
int n_mono_routes, int n_real)
{ {
struct snd_soc_dapm_context *dapm = struct snd_soc_dapm_context *dapm =
snd_soc_component_get_dapm(component); snd_soc_component_get_dapm(component);
...@@ -1179,16 +1181,21 @@ int madera_init_outputs(struct snd_soc_component *component, int n_mono_routes) ...@@ -1179,16 +1181,21 @@ int madera_init_outputs(struct snd_soc_component *component, int n_mono_routes)
n_mono_routes = MADERA_MAX_OUTPUT; n_mono_routes = MADERA_MAX_OUTPUT;
} }
if (!routes)
routes = madera_mono_routes;
for (i = 0; i < n_mono_routes; i++) { for (i = 0; i < n_mono_routes; i++) {
/* Default is 0 so noop with defaults */ /* Default is 0 so noop with defaults */
if (pdata->out_mono[i]) { if (pdata->out_mono[i]) {
val = MADERA_OUT1_MONO; val = MADERA_OUT1_MONO;
snd_soc_dapm_add_routes(dapm, snd_soc_dapm_add_routes(dapm, &routes[i], 1);
&madera_mono_routes[i], 1);
} else { } else {
val = 0; val = 0;
} }
if (i >= n_real)
continue;
regmap_update_bits(madera->regmap, regmap_update_bits(madera->regmap,
MADERA_OUTPUT_PATH_CONFIG_1L + (i * 8), MADERA_OUTPUT_PATH_CONFIG_1L + (i * 8),
MADERA_OUT1_MONO, val); MADERA_OUT1_MONO, val);
......
...@@ -421,7 +421,9 @@ int madera_core_free(struct madera_priv *priv); ...@@ -421,7 +421,9 @@ int madera_core_free(struct madera_priv *priv);
int madera_init_overheat(struct madera_priv *priv); int madera_init_overheat(struct madera_priv *priv);
int madera_free_overheat(struct madera_priv *priv); int madera_free_overheat(struct madera_priv *priv);
int madera_init_inputs(struct snd_soc_component *component); int madera_init_inputs(struct snd_soc_component *component);
int madera_init_outputs(struct snd_soc_component *component, int n_mono_routes); int madera_init_outputs(struct snd_soc_component *component,
const struct snd_soc_dapm_route *routes,
int n_mono_routes, int n_real);
int madera_init_bus_error_irq(struct madera_priv *priv, int dsp_num, int madera_init_bus_error_irq(struct madera_priv *priv, int dsp_num,
irq_handler_t handler); irq_handler_t handler);
void madera_free_bus_error_irq(struct madera_priv *priv, int dsp_num); void madera_free_bus_error_irq(struct madera_priv *priv, int dsp_num);
......
...@@ -1030,7 +1030,7 @@ static int wm_coeff_write_acked_control(struct wm_coeff_ctl *ctl, ...@@ -1030,7 +1030,7 @@ static int wm_coeff_write_acked_control(struct wm_coeff_ctl *ctl,
return -ETIMEDOUT; return -ETIMEDOUT;
} }
static int wm_coeff_write_control(struct wm_coeff_ctl *ctl, static int wm_coeff_write_ctrl_raw(struct wm_coeff_ctl *ctl,
const void *buf, size_t len) const void *buf, size_t len)
{ {
struct wm_adsp *dsp = ctl->dsp; struct wm_adsp *dsp = ctl->dsp;
...@@ -1061,6 +1061,23 @@ static int wm_coeff_write_control(struct wm_coeff_ctl *ctl, ...@@ -1061,6 +1061,23 @@ static int wm_coeff_write_control(struct wm_coeff_ctl *ctl,
return 0; return 0;
} }
static int wm_coeff_write_ctrl(struct wm_coeff_ctl *ctl,
const void *buf, size_t len)
{
int ret = 0;
if (ctl->flags & WMFW_CTL_FLAG_VOLATILE)
ret = -EPERM;
else if (buf != ctl->cache)
memcpy(ctl->cache, buf, len);
ctl->set = 1;
if (ctl->enabled && ctl->dsp->running)
ret = wm_coeff_write_ctrl_raw(ctl, buf, len);
return ret;
}
static int wm_coeff_put(struct snd_kcontrol *kctl, static int wm_coeff_put(struct snd_kcontrol *kctl,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
...@@ -1071,16 +1088,7 @@ static int wm_coeff_put(struct snd_kcontrol *kctl, ...@@ -1071,16 +1088,7 @@ static int wm_coeff_put(struct snd_kcontrol *kctl,
int ret = 0; int ret = 0;
mutex_lock(&ctl->dsp->pwr_lock); mutex_lock(&ctl->dsp->pwr_lock);
ret = wm_coeff_write_ctrl(ctl, p, ctl->len);
if (ctl->flags & WMFW_CTL_FLAG_VOLATILE)
ret = -EPERM;
else
memcpy(ctl->cache, p, ctl->len);
ctl->set = 1;
if (ctl->enabled && ctl->dsp->running)
ret = wm_coeff_write_control(ctl, p, ctl->len);
mutex_unlock(&ctl->dsp->pwr_lock); mutex_unlock(&ctl->dsp->pwr_lock);
return ret; return ret;
...@@ -1096,15 +1104,10 @@ static int wm_coeff_tlv_put(struct snd_kcontrol *kctl, ...@@ -1096,15 +1104,10 @@ static int wm_coeff_tlv_put(struct snd_kcontrol *kctl,
mutex_lock(&ctl->dsp->pwr_lock); mutex_lock(&ctl->dsp->pwr_lock);
if (copy_from_user(ctl->cache, bytes, size)) { if (copy_from_user(ctl->cache, bytes, size))
ret = -EFAULT; ret = -EFAULT;
} else { else
ctl->set = 1; ret = wm_coeff_write_ctrl(ctl, ctl->cache, size);
if (ctl->enabled && ctl->dsp->running)
ret = wm_coeff_write_control(ctl, ctl->cache, size);
else if (ctl->flags & WMFW_CTL_FLAG_VOLATILE)
ret = -EPERM;
}
mutex_unlock(&ctl->dsp->pwr_lock); mutex_unlock(&ctl->dsp->pwr_lock);
...@@ -1135,7 +1138,7 @@ static int wm_coeff_put_acked(struct snd_kcontrol *kctl, ...@@ -1135,7 +1138,7 @@ static int wm_coeff_put_acked(struct snd_kcontrol *kctl,
return ret; return ret;
} }
static int wm_coeff_read_control(struct wm_coeff_ctl *ctl, static int wm_coeff_read_ctrl_raw(struct wm_coeff_ctl *ctl,
void *buf, size_t len) void *buf, size_t len)
{ {
struct wm_adsp *dsp = ctl->dsp; struct wm_adsp *dsp = ctl->dsp;
...@@ -1166,29 +1169,37 @@ static int wm_coeff_read_control(struct wm_coeff_ctl *ctl, ...@@ -1166,29 +1169,37 @@ static int wm_coeff_read_control(struct wm_coeff_ctl *ctl,
return 0; return 0;
} }
static int wm_coeff_get(struct snd_kcontrol *kctl, static int wm_coeff_read_ctrl(struct wm_coeff_ctl *ctl, void *buf, size_t len)
struct snd_ctl_elem_value *ucontrol)
{ {
struct soc_bytes_ext *bytes_ext =
(struct soc_bytes_ext *)kctl->private_value;
struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext);
char *p = ucontrol->value.bytes.data;
int ret = 0; int ret = 0;
mutex_lock(&ctl->dsp->pwr_lock);
if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) { if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) {
if (ctl->enabled && ctl->dsp->running) if (ctl->enabled && ctl->dsp->running)
ret = wm_coeff_read_control(ctl, p, ctl->len); return wm_coeff_read_ctrl_raw(ctl, buf, len);
else else
ret = -EPERM; return -EPERM;
} else { } else {
if (!ctl->flags && ctl->enabled && ctl->dsp->running) if (!ctl->flags && ctl->enabled && ctl->dsp->running)
ret = wm_coeff_read_control(ctl, ctl->cache, ctl->len); ret = wm_coeff_read_ctrl_raw(ctl, ctl->cache, ctl->len);
memcpy(p, ctl->cache, ctl->len); if (buf != ctl->cache)
memcpy(buf, ctl->cache, len);
} }
return ret;
}
static int wm_coeff_get(struct snd_kcontrol *kctl,
struct snd_ctl_elem_value *ucontrol)
{
struct soc_bytes_ext *bytes_ext =
(struct soc_bytes_ext *)kctl->private_value;
struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext);
char *p = ucontrol->value.bytes.data;
int ret;
mutex_lock(&ctl->dsp->pwr_lock);
ret = wm_coeff_read_ctrl(ctl, p, ctl->len);
mutex_unlock(&ctl->dsp->pwr_lock); mutex_unlock(&ctl->dsp->pwr_lock);
return ret; return ret;
...@@ -1204,15 +1215,7 @@ static int wm_coeff_tlv_get(struct snd_kcontrol *kctl, ...@@ -1204,15 +1215,7 @@ static int wm_coeff_tlv_get(struct snd_kcontrol *kctl,
mutex_lock(&ctl->dsp->pwr_lock); mutex_lock(&ctl->dsp->pwr_lock);
if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) { ret = wm_coeff_read_ctrl_raw(ctl, ctl->cache, size);
if (ctl->enabled && ctl->dsp->running)
ret = wm_coeff_read_control(ctl, ctl->cache, size);
else
ret = -EPERM;
} else {
if (!ctl->flags && ctl->enabled && ctl->dsp->running)
ret = wm_coeff_read_control(ctl, ctl->cache, size);
}
if (!ret && copy_to_user(bytes, ctl->cache, size)) if (!ret && copy_to_user(bytes, ctl->cache, size))
ret = -EFAULT; ret = -EFAULT;
...@@ -1340,7 +1343,7 @@ static int wm_coeff_init_control_caches(struct wm_adsp *dsp) ...@@ -1340,7 +1343,7 @@ static int wm_coeff_init_control_caches(struct wm_adsp *dsp)
* created so we don't need to do anything. * created so we don't need to do anything.
*/ */
if (!ctl->flags || (ctl->flags & WMFW_CTL_FLAG_READABLE)) { if (!ctl->flags || (ctl->flags & WMFW_CTL_FLAG_READABLE)) {
ret = wm_coeff_read_control(ctl, ctl->cache, ctl->len); ret = wm_coeff_read_ctrl_raw(ctl, ctl->cache, ctl->len);
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
...@@ -1358,7 +1361,8 @@ static int wm_coeff_sync_controls(struct wm_adsp *dsp) ...@@ -1358,7 +1361,8 @@ static int wm_coeff_sync_controls(struct wm_adsp *dsp)
if (!ctl->enabled) if (!ctl->enabled)
continue; continue;
if (ctl->set && !(ctl->flags & WMFW_CTL_FLAG_VOLATILE)) { if (ctl->set && !(ctl->flags & WMFW_CTL_FLAG_VOLATILE)) {
ret = wm_coeff_write_control(ctl, ctl->cache, ctl->len); ret = wm_coeff_write_ctrl_raw(ctl, ctl->cache,
ctl->len);
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
...@@ -2048,7 +2052,7 @@ int wm_adsp_write_ctl(struct wm_adsp *dsp, const char *name, int type, ...@@ -2048,7 +2052,7 @@ int wm_adsp_write_ctl(struct wm_adsp *dsp, const char *name, int type,
if (len > ctl->len) if (len > ctl->len)
return -EINVAL; return -EINVAL;
ret = wm_coeff_write_control(ctl, buf, len); ret = wm_coeff_write_ctrl(ctl, buf, len);
kcontrol = snd_soc_card_get_kcontrol(dsp->component->card, ctl->name); kcontrol = snd_soc_card_get_kcontrol(dsp->component->card, ctl->name);
snd_ctl_notify(dsp->component->card->snd_card, snd_ctl_notify(dsp->component->card->snd_card,
...@@ -2070,7 +2074,7 @@ int wm_adsp_read_ctl(struct wm_adsp *dsp, const char *name, int type, ...@@ -2070,7 +2074,7 @@ int wm_adsp_read_ctl(struct wm_adsp *dsp, const char *name, int type,
if (len > ctl->len) if (len > ctl->len)
return -EINVAL; return -EINVAL;
return wm_coeff_read_control(ctl, buf, len); return wm_coeff_read_ctrl(ctl, buf, len);
} }
EXPORT_SYMBOL_GPL(wm_adsp_read_ctl); EXPORT_SYMBOL_GPL(wm_adsp_read_ctl);
......
...@@ -41,16 +41,19 @@ int skl_hda_hdmi_add_pcm(struct snd_soc_card *card, int device) ...@@ -41,16 +41,19 @@ int skl_hda_hdmi_add_pcm(struct snd_soc_card *card, int device)
return 0; return 0;
} }
SND_SOC_DAILINK_DEFS(idisp1, SND_SOC_DAILINK_DEF(idisp1_cpu,
DAILINK_COMP_ARRAY(COMP_CPU("iDisp1 Pin")), DAILINK_COMP_ARRAY(COMP_CPU("iDisp1 Pin")));
SND_SOC_DAILINK_DEF(idisp1_codec,
DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi1"))); DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi1")));
SND_SOC_DAILINK_DEFS(idisp2, SND_SOC_DAILINK_DEF(idisp2_cpu,
DAILINK_COMP_ARRAY(COMP_CPU("iDisp2 Pin")), DAILINK_COMP_ARRAY(COMP_CPU("iDisp2 Pin")));
SND_SOC_DAILINK_DEF(idisp2_codec,
DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi2"))); DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi2")));
SND_SOC_DAILINK_DEFS(idisp3, SND_SOC_DAILINK_DEF(idisp3_cpu,
DAILINK_COMP_ARRAY(COMP_CPU("iDisp3 Pin")), DAILINK_COMP_ARRAY(COMP_CPU("iDisp3 Pin")));
SND_SOC_DAILINK_DEF(idisp3_codec,
DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi3"))); DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi3")));
SND_SOC_DAILINK_DEF(analog_cpu, SND_SOC_DAILINK_DEF(analog_cpu,
...@@ -83,21 +86,21 @@ struct snd_soc_dai_link skl_hda_be_dai_links[HDA_DSP_MAX_BE_DAI_LINKS] = { ...@@ -83,21 +86,21 @@ struct snd_soc_dai_link skl_hda_be_dai_links[HDA_DSP_MAX_BE_DAI_LINKS] = {
.id = 1, .id = 1,
.dpcm_playback = 1, .dpcm_playback = 1,
.no_pcm = 1, .no_pcm = 1,
SND_SOC_DAILINK_REG(idisp1), SND_SOC_DAILINK_REG(idisp1_cpu, idisp1_codec, platform),
}, },
{ {
.name = "iDisp2", .name = "iDisp2",
.id = 2, .id = 2,
.dpcm_playback = 1, .dpcm_playback = 1,
.no_pcm = 1, .no_pcm = 1,
SND_SOC_DAILINK_REG(idisp2), SND_SOC_DAILINK_REG(idisp2_cpu, idisp2_codec, platform),
}, },
{ {
.name = "iDisp3", .name = "iDisp3",
.id = 3, .id = 3,
.dpcm_playback = 1, .dpcm_playback = 1,
.no_pcm = 1, .no_pcm = 1,
SND_SOC_DAILINK_REG(idisp3), SND_SOC_DAILINK_REG(idisp3_cpu, idisp3_codec, platform),
}, },
{ {
.name = "Analog Playback and Capture", .name = "Analog Playback and Capture",
......
...@@ -117,7 +117,6 @@ dmaengine_pcm_set_runtime_hwparams(struct snd_soc_component *component, ...@@ -117,7 +117,6 @@ dmaengine_pcm_set_runtime_hwparams(struct snd_soc_component *component,
struct dma_chan *chan = pcm->chan[substream->stream]; struct dma_chan *chan = pcm->chan[substream->stream];
struct snd_dmaengine_dai_dma_data *dma_data; struct snd_dmaengine_dai_dma_data *dma_data;
struct snd_pcm_hardware hw; struct snd_pcm_hardware hw;
int ret;
if (pcm->config && pcm->config->pcm_hardware) if (pcm->config && pcm->config->pcm_hardware)
return snd_soc_set_runtime_hwparams(substream, return snd_soc_set_runtime_hwparams(substream,
...@@ -138,12 +137,15 @@ dmaengine_pcm_set_runtime_hwparams(struct snd_soc_component *component, ...@@ -138,12 +137,15 @@ dmaengine_pcm_set_runtime_hwparams(struct snd_soc_component *component,
if (pcm->flags & SND_DMAENGINE_PCM_FLAG_NO_RESIDUE) if (pcm->flags & SND_DMAENGINE_PCM_FLAG_NO_RESIDUE)
hw.info |= SNDRV_PCM_INFO_BATCH; hw.info |= SNDRV_PCM_INFO_BATCH;
ret = snd_dmaengine_pcm_refine_runtime_hwparams(substream, /**
* FIXME: Remove the return value check to align with the code
* before adding snd_dmaengine_pcm_refine_runtime_hwparams
* function.
*/
snd_dmaengine_pcm_refine_runtime_hwparams(substream,
dma_data, dma_data,
&hw, &hw,
chan); chan);
if (ret)
return ret;
return snd_soc_set_runtime_hwparams(substream, &hw); return snd_soc_set_runtime_hwparams(substream, &hw);
} }
......
...@@ -2916,10 +2916,10 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) ...@@ -2916,10 +2916,10 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
for_each_rtd_codec_dai(rtd, i, codec_dai) { for_each_rtd_codec_dai(rtd, i, codec_dai) {
if (snd_soc_dai_stream_valid(codec_dai, SNDRV_PCM_STREAM_PLAYBACK) && if (snd_soc_dai_stream_valid(codec_dai, SNDRV_PCM_STREAM_PLAYBACK) &&
snd_soc_dai_stream_valid(cpu_dai, SNDRV_PCM_STREAM_PLAYBACK)) snd_soc_dai_stream_valid(cpu_dai, SNDRV_PCM_STREAM_CAPTURE))
playback = 1; playback = 1;
if (snd_soc_dai_stream_valid(codec_dai, SNDRV_PCM_STREAM_CAPTURE) && if (snd_soc_dai_stream_valid(codec_dai, SNDRV_PCM_STREAM_CAPTURE) &&
snd_soc_dai_stream_valid(cpu_dai, SNDRV_PCM_STREAM_CAPTURE)) snd_soc_dai_stream_valid(cpu_dai, SNDRV_PCM_STREAM_PLAYBACK))
capture = 1; capture = 1;
} }
......
...@@ -1906,6 +1906,10 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg, ...@@ -1906,6 +1906,10 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg,
link->num_codecs = 1; link->num_codecs = 1;
link->num_platforms = 1; link->num_platforms = 1;
link->dobj.index = tplg->index;
link->dobj.ops = tplg->ops;
link->dobj.type = SND_SOC_DOBJ_DAI_LINK;
if (strlen(pcm->pcm_name)) { if (strlen(pcm->pcm_name)) {
link->name = kstrdup(pcm->pcm_name, GFP_KERNEL); link->name = kstrdup(pcm->pcm_name, GFP_KERNEL);
link->stream_name = kstrdup(pcm->pcm_name, GFP_KERNEL); link->stream_name = kstrdup(pcm->pcm_name, GFP_KERNEL);
...@@ -1942,9 +1946,6 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg, ...@@ -1942,9 +1946,6 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg,
goto err; goto err;
} }
link->dobj.index = tplg->index;
link->dobj.ops = tplg->ops;
link->dobj.type = SND_SOC_DOBJ_DAI_LINK;
list_add(&link->dobj.list, &tplg->comp->dobj_list); list_add(&link->dobj.list, &tplg->comp->dobj_list);
return 0; return 0;
......
...@@ -345,7 +345,7 @@ ...@@ -345,7 +345,7 @@
/* Number of DAIs */ /* Number of DAIs */
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA) #if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
#define SOF_SKL_NUM_DAIS 14 #define SOF_SKL_NUM_DAIS 15
#else #else
#define SOF_SKL_NUM_DAIS 8 #define SOF_SKL_NUM_DAIS 8
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment