ASoC: Merge up fixes

Further development will need some of the fixes.
This commit is contained in:
Mark Brown 2022-06-27 18:27:03 +01:00
commit b9566b1d1f
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
7 changed files with 40 additions and 10 deletions

View File

@ -37,8 +37,8 @@ static const struct reg_default cs35l41_reg[] = {
{ CS35L41_DAC_PCM1_SRC, 0x00000008 }, { CS35L41_DAC_PCM1_SRC, 0x00000008 },
{ CS35L41_ASP_TX1_SRC, 0x00000018 }, { CS35L41_ASP_TX1_SRC, 0x00000018 },
{ CS35L41_ASP_TX2_SRC, 0x00000019 }, { CS35L41_ASP_TX2_SRC, 0x00000019 },
{ CS35L41_ASP_TX3_SRC, 0x00000020 }, { CS35L41_ASP_TX3_SRC, 0x00000000 },
{ CS35L41_ASP_TX4_SRC, 0x00000021 }, { CS35L41_ASP_TX4_SRC, 0x00000000 },
{ CS35L41_DSP1_RX1_SRC, 0x00000008 }, { CS35L41_DSP1_RX1_SRC, 0x00000008 },
{ CS35L41_DSP1_RX2_SRC, 0x00000009 }, { CS35L41_DSP1_RX2_SRC, 0x00000009 },
{ CS35L41_DSP1_RX3_SRC, 0x00000018 }, { CS35L41_DSP1_RX3_SRC, 0x00000018 },
@ -644,6 +644,8 @@ static const struct reg_sequence cs35l41_reva0_errata_patch[] = {
{ CS35L41_DSP1_XM_ACCEL_PL0_PRI, 0x00000000 }, { CS35L41_DSP1_XM_ACCEL_PL0_PRI, 0x00000000 },
{ CS35L41_PWR_CTRL2, 0x00000000 }, { CS35L41_PWR_CTRL2, 0x00000000 },
{ CS35L41_AMP_GAIN_CTRL, 0x00000000 }, { CS35L41_AMP_GAIN_CTRL, 0x00000000 },
{ CS35L41_ASP_TX3_SRC, 0x00000000 },
{ CS35L41_ASP_TX4_SRC, 0x00000000 },
}; };
static const struct reg_sequence cs35l41_revb0_errata_patch[] = { static const struct reg_sequence cs35l41_revb0_errata_patch[] = {
@ -655,6 +657,8 @@ static const struct reg_sequence cs35l41_revb0_errata_patch[] = {
{ CS35L41_DSP1_XM_ACCEL_PL0_PRI, 0x00000000 }, { CS35L41_DSP1_XM_ACCEL_PL0_PRI, 0x00000000 },
{ CS35L41_PWR_CTRL2, 0x00000000 }, { CS35L41_PWR_CTRL2, 0x00000000 },
{ CS35L41_AMP_GAIN_CTRL, 0x00000000 }, { CS35L41_AMP_GAIN_CTRL, 0x00000000 },
{ CS35L41_ASP_TX3_SRC, 0x00000000 },
{ CS35L41_ASP_TX4_SRC, 0x00000000 },
}; };
static const struct reg_sequence cs35l41_revb2_errata_patch[] = { static const struct reg_sequence cs35l41_revb2_errata_patch[] = {
@ -666,6 +670,8 @@ static const struct reg_sequence cs35l41_revb2_errata_patch[] = {
{ CS35L41_DSP1_XM_ACCEL_PL0_PRI, 0x00000000 }, { CS35L41_DSP1_XM_ACCEL_PL0_PRI, 0x00000000 },
{ CS35L41_PWR_CTRL2, 0x00000000 }, { CS35L41_PWR_CTRL2, 0x00000000 },
{ CS35L41_AMP_GAIN_CTRL, 0x00000000 }, { CS35L41_AMP_GAIN_CTRL, 0x00000000 },
{ CS35L41_ASP_TX3_SRC, 0x00000000 },
{ CS35L41_ASP_TX4_SRC, 0x00000000 },
}; };
static const struct reg_sequence cs35l41_fs_errata_patch[] = { static const struct reg_sequence cs35l41_fs_errata_patch[] = {

View File

@ -122,6 +122,9 @@ static int cs47l15_in1_adc_put(struct snd_kcontrol *kcontrol,
snd_soc_kcontrol_component(kcontrol); snd_soc_kcontrol_component(kcontrol);
struct cs47l15 *cs47l15 = snd_soc_component_get_drvdata(component); struct cs47l15 *cs47l15 = snd_soc_component_get_drvdata(component);
if (!!ucontrol->value.integer.value[0] == cs47l15->in1_lp_mode)
return 0;
switch (ucontrol->value.integer.value[0]) { switch (ucontrol->value.integer.value[0]) {
case 0: case 0:
/* Set IN1 to normal mode */ /* Set IN1 to normal mode */
@ -150,7 +153,7 @@ static int cs47l15_in1_adc_put(struct snd_kcontrol *kcontrol,
break; break;
} }
return 0; return 1;
} }
static const struct snd_kcontrol_new cs47l15_snd_controls[] = { static const struct snd_kcontrol_new cs47l15_snd_controls[] = {

View File

@ -618,7 +618,13 @@ int madera_out1_demux_put(struct snd_kcontrol *kcontrol,
end: end:
snd_soc_dapm_mutex_unlock(dapm); snd_soc_dapm_mutex_unlock(dapm);
return snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL); ret = snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL);
if (ret < 0) {
dev_err(madera->dev, "Failed to update demux power state: %d\n", ret);
return ret;
}
return change;
} }
EXPORT_SYMBOL_GPL(madera_out1_demux_put); EXPORT_SYMBOL_GPL(madera_out1_demux_put);
@ -893,7 +899,7 @@ static int madera_adsp_rate_put(struct snd_kcontrol *kcontrol,
struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
const int adsp_num = e->shift_l; const int adsp_num = e->shift_l;
const unsigned int item = ucontrol->value.enumerated.item[0]; const unsigned int item = ucontrol->value.enumerated.item[0];
int ret; int ret = 0;
if (item >= e->items) if (item >= e->items)
return -EINVAL; return -EINVAL;
@ -910,10 +916,10 @@ static int madera_adsp_rate_put(struct snd_kcontrol *kcontrol,
"Cannot change '%s' while in use by active audio paths\n", "Cannot change '%s' while in use by active audio paths\n",
kcontrol->id.name); kcontrol->id.name);
ret = -EBUSY; ret = -EBUSY;
} else { } else if (priv->adsp_rate_cache[adsp_num] != e->values[item]) {
/* Volatile register so defer until the codec is powered up */ /* Volatile register so defer until the codec is powered up */
priv->adsp_rate_cache[adsp_num] = e->values[item]; priv->adsp_rate_cache[adsp_num] = e->values[item];
ret = 0; ret = 1;
} }
mutex_unlock(&priv->rate_lock); mutex_unlock(&priv->rate_lock);

View File

@ -1795,6 +1795,9 @@ static int sgtl5000_i2c_remove(struct i2c_client *client)
{ {
struct sgtl5000_priv *sgtl5000 = i2c_get_clientdata(client); struct sgtl5000_priv *sgtl5000 = i2c_get_clientdata(client);
regmap_write(sgtl5000->regmap, SGTL5000_CHIP_DIG_POWER, SGTL5000_DIG_POWER_DEFAULT);
regmap_write(sgtl5000->regmap, SGTL5000_CHIP_ANA_POWER, SGTL5000_ANA_POWER_DEFAULT);
clk_disable_unprepare(sgtl5000->mclk); clk_disable_unprepare(sgtl5000->mclk);
regulator_bulk_disable(sgtl5000->num_supplies, sgtl5000->supplies); regulator_bulk_disable(sgtl5000->num_supplies, sgtl5000->supplies);
regulator_bulk_free(sgtl5000->num_supplies, sgtl5000->supplies); regulator_bulk_free(sgtl5000->num_supplies, sgtl5000->supplies);
@ -1802,6 +1805,11 @@ static int sgtl5000_i2c_remove(struct i2c_client *client)
return 0; return 0;
} }
static void sgtl5000_i2c_shutdown(struct i2c_client *client)
{
sgtl5000_i2c_remove(client);
}
static const struct i2c_device_id sgtl5000_id[] = { static const struct i2c_device_id sgtl5000_id[] = {
{"sgtl5000", 0}, {"sgtl5000", 0},
{}, {},
@ -1822,6 +1830,7 @@ static struct i2c_driver sgtl5000_i2c_driver = {
}, },
.probe_new = sgtl5000_i2c_probe, .probe_new = sgtl5000_i2c_probe,
.remove = sgtl5000_i2c_remove, .remove = sgtl5000_i2c_remove,
.shutdown = sgtl5000_i2c_shutdown,
.id_table = sgtl5000_id, .id_table = sgtl5000_id,
}; };

View File

@ -80,6 +80,7 @@
/* /*
* SGTL5000_CHIP_DIG_POWER * SGTL5000_CHIP_DIG_POWER
*/ */
#define SGTL5000_DIG_POWER_DEFAULT 0x0000
#define SGTL5000_ADC_EN 0x0040 #define SGTL5000_ADC_EN 0x0040
#define SGTL5000_DAC_EN 0x0020 #define SGTL5000_DAC_EN 0x0020
#define SGTL5000_DAP_POWERUP 0x0010 #define SGTL5000_DAP_POWERUP 0x0010

View File

@ -90,12 +90,12 @@ links indicates connection part of CPU side (= A).
ports@0 { ports@0 {
(X) (A) mcpu: port@0 { mcpu0_ep: endpoint { remote-endpoint = <&mcodec0_ep>; }; }; (X) (A) mcpu: port@0 { mcpu0_ep: endpoint { remote-endpoint = <&mcodec0_ep>; }; };
(y) port@1 { mcpu1_ep: endpoint { remote-endpoint = <&cpu1_ep>; }; }; (y) port@1 { mcpu1_ep: endpoint { remote-endpoint = <&cpu1_ep>; }; };
(y) port@1 { mcpu2_ep: endpoint { remote-endpoint = <&cpu2_ep>; }; }; (y) port@2 { mcpu2_ep: endpoint { remote-endpoint = <&cpu2_ep>; }; };
}; };
ports@1 { ports@1 {
(X) port@0 { mcodec0_ep: endpoint { remote-endpoint = <&mcpu0_ep>; }; }; (X) port@0 { mcodec0_ep: endpoint { remote-endpoint = <&mcpu0_ep>; }; };
(y) port@0 { mcodec1_ep: endpoint { remote-endpoint = <&codec1_ep>; }; }; (y) port@1 { mcodec1_ep: endpoint { remote-endpoint = <&codec1_ep>; }; };
(y) port@1 { mcodec2_ep: endpoint { remote-endpoint = <&codec2_ep>; }; }; (y) port@2 { mcodec2_ep: endpoint { remote-endpoint = <&codec2_ep>; }; };
}; };
}; };
}; };

View File

@ -62,6 +62,8 @@ struct snd_soc_dapm_widget *
snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm, snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm,
const struct snd_soc_dapm_widget *widget); const struct snd_soc_dapm_widget *widget);
static unsigned int soc_dapm_read(struct snd_soc_dapm_context *dapm, int reg);
/* dapm power sequences - make this per codec in the future */ /* dapm power sequences - make this per codec in the future */
static int dapm_up_seq[] = { static int dapm_up_seq[] = {
[snd_soc_dapm_pre] = 1, [snd_soc_dapm_pre] = 1,
@ -442,6 +444,9 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
snd_soc_dapm_add_path(widget->dapm, data->widget, snd_soc_dapm_add_path(widget->dapm, data->widget,
widget, NULL, NULL); widget, NULL, NULL);
} else if (e->reg != SND_SOC_NOPM) {
data->value = soc_dapm_read(widget->dapm, e->reg) &
(e->mask << e->shift_l);
} }
break; break;
default: default: