ASoC: Fixes for v6.0
A relatively large batch of fixes that came in since my pull request, none of them too major and mostly device specific apart from a series of security/robustness improvements from Takashi. -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAmL7feEACgkQJNaLcl1U h9Bxygf/cZrD1ke0CQSEp89KK5N36hidFgRcwkW/aMEFV2rCWlj4fufX5YRX8f0D WPRwojsiE7QRrKrwR8a1mewj4x5KqwzkeM6OVCpNJsut+MYsHmGpM/tsAqX8rFwi PMH3oN/9cDIqKjjxE7ZQ3AOfaVDZNV4+kVHYhhMGgZ2zpdPSSaLiIeoAkk5UQHcC K4FD21gp4tsE6mxZKu98N1aKM0v52/TYvrmMMG0oUSr8zdsGFUBkJ9UcicHRYD/v WgwW5lIW6h5nhdAk9yoFpv11M3rSaL16PFvbNQYMo9AACrMq9gbytZ0ej2FmEkqR K6qYEetQWXR6XW68YN8tytgJB8m5wQ== =ErLu -----END PGP SIGNATURE----- Merge tag 'asoc-fix-v6.0-rc1' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus ASoC: Fixes for v6.0 A relatively large batch of fixes that came in since my pull request, none of them too major and mostly device specific apart from a series of security/robustness improvements from Takashi.
This commit is contained in:
Коммит
25a3b95957
|
@ -143,6 +143,34 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
|
||||||
DMI_MATCH(DMI_PRODUCT_NAME, "21CL"),
|
DMI_MATCH(DMI_PRODUCT_NAME, "21CL"),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.driver_data = &acp6x_card,
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "21EM"),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.driver_data = &acp6x_card,
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "21EN"),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.driver_data = &acp6x_card,
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "21J5"),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.driver_data = &acp6x_card,
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "21J6"),
|
||||||
|
}
|
||||||
|
},
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1986,7 +1986,7 @@ static int rt5640_set_bias_level(struct snd_soc_component *component,
|
||||||
snd_soc_component_write(component, RT5640_PWR_MIXER, 0x0000);
|
snd_soc_component_write(component, RT5640_PWR_MIXER, 0x0000);
|
||||||
if (rt5640->jd_src == RT5640_JD_SRC_HDA_HEADER)
|
if (rt5640->jd_src == RT5640_JD_SRC_HDA_HEADER)
|
||||||
snd_soc_component_write(component, RT5640_PWR_ANLG1,
|
snd_soc_component_write(component, RT5640_PWR_ANLG1,
|
||||||
0x0018);
|
0x2818);
|
||||||
else
|
else
|
||||||
snd_soc_component_write(component, RT5640_PWR_ANLG1,
|
snd_soc_component_write(component, RT5640_PWR_ANLG1,
|
||||||
0x0000);
|
0x0000);
|
||||||
|
@ -2600,7 +2600,8 @@ static void rt5640_enable_hda_jack_detect(
|
||||||
snd_soc_component_update_bits(component, RT5640_DUMMY1, 0x400, 0x0);
|
snd_soc_component_update_bits(component, RT5640_DUMMY1, 0x400, 0x0);
|
||||||
|
|
||||||
snd_soc_component_update_bits(component, RT5640_PWR_ANLG1,
|
snd_soc_component_update_bits(component, RT5640_PWR_ANLG1,
|
||||||
RT5640_PWR_VREF2, RT5640_PWR_VREF2);
|
RT5640_PWR_VREF2 | RT5640_PWR_MB | RT5640_PWR_BG,
|
||||||
|
RT5640_PWR_VREF2 | RT5640_PWR_MB | RT5640_PWR_BG);
|
||||||
usleep_range(10000, 15000);
|
usleep_range(10000, 15000);
|
||||||
snd_soc_component_update_bits(component, RT5640_PWR_ANLG1,
|
snd_soc_component_update_bits(component, RT5640_PWR_ANLG1,
|
||||||
RT5640_PWR_FV2, RT5640_PWR_FV2);
|
RT5640_PWR_FV2, RT5640_PWR_FV2);
|
||||||
|
|
|
@ -46,34 +46,22 @@ static void tas2770_reset(struct tas2770_priv *tas2770)
|
||||||
usleep_range(1000, 2000);
|
usleep_range(1000, 2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tas2770_set_bias_level(struct snd_soc_component *component,
|
static int tas2770_update_pwr_ctrl(struct tas2770_priv *tas2770)
|
||||||
enum snd_soc_bias_level level)
|
|
||||||
{
|
{
|
||||||
struct tas2770_priv *tas2770 =
|
struct snd_soc_component *component = tas2770->component;
|
||||||
snd_soc_component_get_drvdata(component);
|
unsigned int val;
|
||||||
|
int ret;
|
||||||
|
|
||||||
switch (level) {
|
if (tas2770->dac_powered)
|
||||||
case SND_SOC_BIAS_ON:
|
val = tas2770->unmuted ?
|
||||||
snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
|
TAS2770_PWR_CTRL_ACTIVE : TAS2770_PWR_CTRL_MUTE;
|
||||||
TAS2770_PWR_CTRL_MASK,
|
else
|
||||||
TAS2770_PWR_CTRL_ACTIVE);
|
val = TAS2770_PWR_CTRL_SHUTDOWN;
|
||||||
break;
|
|
||||||
case SND_SOC_BIAS_STANDBY:
|
|
||||||
case SND_SOC_BIAS_PREPARE:
|
|
||||||
snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
|
|
||||||
TAS2770_PWR_CTRL_MASK,
|
|
||||||
TAS2770_PWR_CTRL_MUTE);
|
|
||||||
break;
|
|
||||||
case SND_SOC_BIAS_OFF:
|
|
||||||
snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
|
|
||||||
TAS2770_PWR_CTRL_MASK,
|
|
||||||
TAS2770_PWR_CTRL_SHUTDOWN);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
|
||||||
dev_err(tas2770->dev, "wrong power level setting %d\n", level);
|
TAS2770_PWR_CTRL_MASK, val);
|
||||||
return -EINVAL;
|
if (ret < 0)
|
||||||
}
|
return ret;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -114,9 +102,7 @@ static int tas2770_codec_resume(struct snd_soc_component *component)
|
||||||
gpiod_set_value_cansleep(tas2770->sdz_gpio, 1);
|
gpiod_set_value_cansleep(tas2770->sdz_gpio, 1);
|
||||||
usleep_range(1000, 2000);
|
usleep_range(1000, 2000);
|
||||||
} else {
|
} else {
|
||||||
ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
|
ret = tas2770_update_pwr_ctrl(tas2770);
|
||||||
TAS2770_PWR_CTRL_MASK,
|
|
||||||
TAS2770_PWR_CTRL_ACTIVE);
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -152,24 +138,19 @@ static int tas2770_dac_event(struct snd_soc_dapm_widget *w,
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case SND_SOC_DAPM_POST_PMU:
|
case SND_SOC_DAPM_POST_PMU:
|
||||||
ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
|
tas2770->dac_powered = 1;
|
||||||
TAS2770_PWR_CTRL_MASK,
|
ret = tas2770_update_pwr_ctrl(tas2770);
|
||||||
TAS2770_PWR_CTRL_MUTE);
|
|
||||||
break;
|
break;
|
||||||
case SND_SOC_DAPM_PRE_PMD:
|
case SND_SOC_DAPM_PRE_PMD:
|
||||||
ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
|
tas2770->dac_powered = 0;
|
||||||
TAS2770_PWR_CTRL_MASK,
|
ret = tas2770_update_pwr_ctrl(tas2770);
|
||||||
TAS2770_PWR_CTRL_SHUTDOWN);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
dev_err(tas2770->dev, "Not supported evevt\n");
|
dev_err(tas2770->dev, "Not supported evevt\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret < 0)
|
return ret;
|
||||||
return ret;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct snd_kcontrol_new isense_switch =
|
static const struct snd_kcontrol_new isense_switch =
|
||||||
|
@ -203,21 +184,11 @@ static const struct snd_soc_dapm_route tas2770_audio_map[] = {
|
||||||
static int tas2770_mute(struct snd_soc_dai *dai, int mute, int direction)
|
static int tas2770_mute(struct snd_soc_dai *dai, int mute, int direction)
|
||||||
{
|
{
|
||||||
struct snd_soc_component *component = dai->component;
|
struct snd_soc_component *component = dai->component;
|
||||||
int ret;
|
struct tas2770_priv *tas2770 =
|
||||||
|
snd_soc_component_get_drvdata(component);
|
||||||
|
|
||||||
if (mute)
|
tas2770->unmuted = !mute;
|
||||||
ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
|
return tas2770_update_pwr_ctrl(tas2770);
|
||||||
TAS2770_PWR_CTRL_MASK,
|
|
||||||
TAS2770_PWR_CTRL_MUTE);
|
|
||||||
else
|
|
||||||
ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
|
|
||||||
TAS2770_PWR_CTRL_MASK,
|
|
||||||
TAS2770_PWR_CTRL_ACTIVE);
|
|
||||||
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tas2770_set_bitwidth(struct tas2770_priv *tas2770, int bitwidth)
|
static int tas2770_set_bitwidth(struct tas2770_priv *tas2770, int bitwidth)
|
||||||
|
@ -337,7 +308,7 @@ static int tas2770_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||||
struct snd_soc_component *component = dai->component;
|
struct snd_soc_component *component = dai->component;
|
||||||
struct tas2770_priv *tas2770 =
|
struct tas2770_priv *tas2770 =
|
||||||
snd_soc_component_get_drvdata(component);
|
snd_soc_component_get_drvdata(component);
|
||||||
u8 tdm_rx_start_slot = 0, asi_cfg_1 = 0;
|
u8 tdm_rx_start_slot = 0, invert_fpol = 0, fpol_preinv = 0, asi_cfg_1 = 0;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
|
switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
|
||||||
|
@ -349,9 +320,15 @@ static int tas2770_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
|
switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
|
||||||
|
case SND_SOC_DAIFMT_NB_IF:
|
||||||
|
invert_fpol = 1;
|
||||||
|
fallthrough;
|
||||||
case SND_SOC_DAIFMT_NB_NF:
|
case SND_SOC_DAIFMT_NB_NF:
|
||||||
asi_cfg_1 |= TAS2770_TDM_CFG_REG1_RX_RSING;
|
asi_cfg_1 |= TAS2770_TDM_CFG_REG1_RX_RSING;
|
||||||
break;
|
break;
|
||||||
|
case SND_SOC_DAIFMT_IB_IF:
|
||||||
|
invert_fpol = 1;
|
||||||
|
fallthrough;
|
||||||
case SND_SOC_DAIFMT_IB_NF:
|
case SND_SOC_DAIFMT_IB_NF:
|
||||||
asi_cfg_1 |= TAS2770_TDM_CFG_REG1_RX_FALING;
|
asi_cfg_1 |= TAS2770_TDM_CFG_REG1_RX_FALING;
|
||||||
break;
|
break;
|
||||||
|
@ -369,15 +346,19 @@ static int tas2770_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||||
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
|
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
|
||||||
case SND_SOC_DAIFMT_I2S:
|
case SND_SOC_DAIFMT_I2S:
|
||||||
tdm_rx_start_slot = 1;
|
tdm_rx_start_slot = 1;
|
||||||
|
fpol_preinv = 0;
|
||||||
break;
|
break;
|
||||||
case SND_SOC_DAIFMT_DSP_A:
|
case SND_SOC_DAIFMT_DSP_A:
|
||||||
tdm_rx_start_slot = 0;
|
tdm_rx_start_slot = 0;
|
||||||
|
fpol_preinv = 1;
|
||||||
break;
|
break;
|
||||||
case SND_SOC_DAIFMT_DSP_B:
|
case SND_SOC_DAIFMT_DSP_B:
|
||||||
tdm_rx_start_slot = 1;
|
tdm_rx_start_slot = 1;
|
||||||
|
fpol_preinv = 1;
|
||||||
break;
|
break;
|
||||||
case SND_SOC_DAIFMT_LEFT_J:
|
case SND_SOC_DAIFMT_LEFT_J:
|
||||||
tdm_rx_start_slot = 0;
|
tdm_rx_start_slot = 0;
|
||||||
|
fpol_preinv = 1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
dev_err(tas2770->dev,
|
dev_err(tas2770->dev,
|
||||||
|
@ -391,6 +372,14 @@ static int tas2770_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
ret = snd_soc_component_update_bits(component, TAS2770_TDM_CFG_REG0,
|
||||||
|
TAS2770_TDM_CFG_REG0_FPOL_MASK,
|
||||||
|
(fpol_preinv ^ invert_fpol)
|
||||||
|
? TAS2770_TDM_CFG_REG0_FPOL_RSING
|
||||||
|
: TAS2770_TDM_CFG_REG0_FPOL_FALING);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -489,7 +478,7 @@ static struct snd_soc_dai_driver tas2770_dai_driver[] = {
|
||||||
.id = 0,
|
.id = 0,
|
||||||
.playback = {
|
.playback = {
|
||||||
.stream_name = "ASI1 Playback",
|
.stream_name = "ASI1 Playback",
|
||||||
.channels_min = 2,
|
.channels_min = 1,
|
||||||
.channels_max = 2,
|
.channels_max = 2,
|
||||||
.rates = TAS2770_RATES,
|
.rates = TAS2770_RATES,
|
||||||
.formats = TAS2770_FORMATS,
|
.formats = TAS2770_FORMATS,
|
||||||
|
@ -537,7 +526,6 @@ static const struct snd_soc_component_driver soc_component_driver_tas2770 = {
|
||||||
.probe = tas2770_codec_probe,
|
.probe = tas2770_codec_probe,
|
||||||
.suspend = tas2770_codec_suspend,
|
.suspend = tas2770_codec_suspend,
|
||||||
.resume = tas2770_codec_resume,
|
.resume = tas2770_codec_resume,
|
||||||
.set_bias_level = tas2770_set_bias_level,
|
|
||||||
.controls = tas2770_snd_controls,
|
.controls = tas2770_snd_controls,
|
||||||
.num_controls = ARRAY_SIZE(tas2770_snd_controls),
|
.num_controls = ARRAY_SIZE(tas2770_snd_controls),
|
||||||
.dapm_widgets = tas2770_dapm_widgets,
|
.dapm_widgets = tas2770_dapm_widgets,
|
||||||
|
|
|
@ -41,6 +41,9 @@
|
||||||
#define TAS2770_TDM_CFG_REG0_31_44_1_48KHZ 0x6
|
#define TAS2770_TDM_CFG_REG0_31_44_1_48KHZ 0x6
|
||||||
#define TAS2770_TDM_CFG_REG0_31_88_2_96KHZ 0x8
|
#define TAS2770_TDM_CFG_REG0_31_88_2_96KHZ 0x8
|
||||||
#define TAS2770_TDM_CFG_REG0_31_176_4_192KHZ 0xa
|
#define TAS2770_TDM_CFG_REG0_31_176_4_192KHZ 0xa
|
||||||
|
#define TAS2770_TDM_CFG_REG0_FPOL_MASK BIT(0)
|
||||||
|
#define TAS2770_TDM_CFG_REG0_FPOL_RSING 0
|
||||||
|
#define TAS2770_TDM_CFG_REG0_FPOL_FALING 1
|
||||||
/* TDM Configuration Reg1 */
|
/* TDM Configuration Reg1 */
|
||||||
#define TAS2770_TDM_CFG_REG1 TAS2770_REG(0X0, 0x0B)
|
#define TAS2770_TDM_CFG_REG1 TAS2770_REG(0X0, 0x0B)
|
||||||
#define TAS2770_TDM_CFG_REG1_MASK GENMASK(5, 1)
|
#define TAS2770_TDM_CFG_REG1_MASK GENMASK(5, 1)
|
||||||
|
@ -135,6 +138,8 @@ struct tas2770_priv {
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
int v_sense_slot;
|
int v_sense_slot;
|
||||||
int i_sense_slot;
|
int i_sense_slot;
|
||||||
|
bool dac_powered;
|
||||||
|
bool unmuted;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __TAS2770__ */
|
#endif /* __TAS2770__ */
|
||||||
|
|
|
@ -49,6 +49,8 @@ struct aic32x4_priv {
|
||||||
struct aic32x4_setup_data *setup;
|
struct aic32x4_setup_data *setup;
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
enum aic32x4_type type;
|
enum aic32x4_type type;
|
||||||
|
|
||||||
|
unsigned int fmt;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int aic32x4_reset_adc(struct snd_soc_dapm_widget *w,
|
static int aic32x4_reset_adc(struct snd_soc_dapm_widget *w,
|
||||||
|
@ -611,6 +613,7 @@ static int aic32x4_set_dai_sysclk(struct snd_soc_dai *codec_dai,
|
||||||
static int aic32x4_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
|
static int aic32x4_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
|
||||||
{
|
{
|
||||||
struct snd_soc_component *component = codec_dai->component;
|
struct snd_soc_component *component = codec_dai->component;
|
||||||
|
struct aic32x4_priv *aic32x4 = snd_soc_component_get_drvdata(component);
|
||||||
u8 iface_reg_1 = 0;
|
u8 iface_reg_1 = 0;
|
||||||
u8 iface_reg_2 = 0;
|
u8 iface_reg_2 = 0;
|
||||||
u8 iface_reg_3 = 0;
|
u8 iface_reg_3 = 0;
|
||||||
|
@ -653,6 +656,8 @@ static int aic32x4_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
aic32x4->fmt = fmt;
|
||||||
|
|
||||||
snd_soc_component_update_bits(component, AIC32X4_IFACE1,
|
snd_soc_component_update_bits(component, AIC32X4_IFACE1,
|
||||||
AIC32X4_IFACE1_DATATYPE_MASK |
|
AIC32X4_IFACE1_DATATYPE_MASK |
|
||||||
AIC32X4_IFACE1_MASTER_MASK, iface_reg_1);
|
AIC32X4_IFACE1_MASTER_MASK, iface_reg_1);
|
||||||
|
@ -757,6 +762,10 @@ static int aic32x4_setup_clocks(struct snd_soc_component *component,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* PCM over I2S is always 2-channel */
|
||||||
|
if ((aic32x4->fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_I2S)
|
||||||
|
channels = 2;
|
||||||
|
|
||||||
madc = DIV_ROUND_UP((32 * adc_resource_class), aosr);
|
madc = DIV_ROUND_UP((32 * adc_resource_class), aosr);
|
||||||
max_dosr = (AIC32X4_MAX_DOSR_FREQ / sample_rate / dosr_increment) *
|
max_dosr = (AIC32X4_MAX_DOSR_FREQ / sample_rate / dosr_increment) *
|
||||||
dosr_increment;
|
dosr_increment;
|
||||||
|
|
|
@ -636,8 +636,8 @@ static ssize_t topology_name_read(struct file *file, char __user *user_buf, size
|
||||||
char buf[64];
|
char buf[64];
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
len = snprintf(buf, sizeof(buf), "%s/%s\n", component->driver->topology_name_prefix,
|
len = scnprintf(buf, sizeof(buf), "%s/%s\n", component->driver->topology_name_prefix,
|
||||||
mach->tplg_filename);
|
mach->tplg_filename);
|
||||||
|
|
||||||
return simple_read_from_buffer(user_buf, count, ppos, buf, len);
|
return simple_read_from_buffer(user_buf, count, ppos, buf, len);
|
||||||
}
|
}
|
||||||
|
|
|
@ -759,6 +759,9 @@ static int sof_es8336_remove(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct platform_device_id board_ids[] = {
|
static const struct platform_device_id board_ids[] = {
|
||||||
|
{
|
||||||
|
.name = "sof-essx8336", /* default quirk == 0 */
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.name = "adl_es83x6_c1_h02",
|
.name = "adl_es83x6_c1_h02",
|
||||||
.driver_data = (kernel_ulong_t)(SOF_ES8336_SSP_CODEC(1) |
|
.driver_data = (kernel_ulong_t)(SOF_ES8336_SSP_CODEC(1) |
|
||||||
|
@ -786,5 +789,4 @@ module_platform_driver(sof_es8336_driver);
|
||||||
|
|
||||||
MODULE_DESCRIPTION("ASoC Intel(R) SOF + ES8336 Machine driver");
|
MODULE_DESCRIPTION("ASoC Intel(R) SOF + ES8336 Machine driver");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_ALIAS("platform:sof-essx8336");
|
|
||||||
MODULE_IMPORT_NS(SND_SOC_INTEL_HDA_DSP_COMMON);
|
MODULE_IMPORT_NS(SND_SOC_INTEL_HDA_DSP_COMMON);
|
||||||
|
|
|
@ -1017,32 +1017,36 @@ static int rz_ssi_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
ssi->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL);
|
ssi->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL);
|
||||||
if (IS_ERR(ssi->rstc)) {
|
if (IS_ERR(ssi->rstc)) {
|
||||||
rz_ssi_release_dma_channels(ssi);
|
ret = PTR_ERR(ssi->rstc);
|
||||||
return PTR_ERR(ssi->rstc);
|
goto err_reset;
|
||||||
}
|
}
|
||||||
|
|
||||||
reset_control_deassert(ssi->rstc);
|
reset_control_deassert(ssi->rstc);
|
||||||
pm_runtime_enable(&pdev->dev);
|
pm_runtime_enable(&pdev->dev);
|
||||||
ret = pm_runtime_resume_and_get(&pdev->dev);
|
ret = pm_runtime_resume_and_get(&pdev->dev);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
rz_ssi_release_dma_channels(ssi);
|
dev_err(&pdev->dev, "pm_runtime_resume_and_get failed\n");
|
||||||
pm_runtime_disable(ssi->dev);
|
goto err_pm;
|
||||||
reset_control_assert(ssi->rstc);
|
|
||||||
return dev_err_probe(ssi->dev, ret, "pm_runtime_resume_and_get failed\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = devm_snd_soc_register_component(&pdev->dev, &rz_ssi_soc_component,
|
ret = devm_snd_soc_register_component(&pdev->dev, &rz_ssi_soc_component,
|
||||||
rz_ssi_soc_dai,
|
rz_ssi_soc_dai,
|
||||||
ARRAY_SIZE(rz_ssi_soc_dai));
|
ARRAY_SIZE(rz_ssi_soc_dai));
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
rz_ssi_release_dma_channels(ssi);
|
|
||||||
|
|
||||||
pm_runtime_put(ssi->dev);
|
|
||||||
pm_runtime_disable(ssi->dev);
|
|
||||||
reset_control_assert(ssi->rstc);
|
|
||||||
dev_err(&pdev->dev, "failed to register snd component\n");
|
dev_err(&pdev->dev, "failed to register snd component\n");
|
||||||
|
goto err_snd_soc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_snd_soc:
|
||||||
|
pm_runtime_put(ssi->dev);
|
||||||
|
err_pm:
|
||||||
|
pm_runtime_disable(ssi->dev);
|
||||||
|
reset_control_assert(ssi->rstc);
|
||||||
|
err_reset:
|
||||||
|
rz_ssi_release_dma_channels(ssi);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1317,6 +1317,9 @@ static struct snd_soc_pcm_runtime *dpcm_get_be(struct snd_soc_card *card,
|
||||||
if (!be->dai_link->no_pcm)
|
if (!be->dai_link->no_pcm)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (!snd_soc_dpcm_get_substream(be, stream))
|
||||||
|
continue;
|
||||||
|
|
||||||
for_each_rtd_dais(be, i, dai) {
|
for_each_rtd_dais(be, i, dai) {
|
||||||
w = snd_soc_dai_get_widget(dai, stream);
|
w = snd_soc_dai_get_widget(dai, stream);
|
||||||
|
|
||||||
|
|
|
@ -252,9 +252,9 @@ static int memory_info_update(struct snd_sof_dev *sdev, char *buf, size_t buff_s
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0, len = 0; i < reply->num_elems; i++) {
|
for (i = 0, len = 0; i < reply->num_elems; i++) {
|
||||||
ret = snprintf(buf + len, buff_size - len, "zone %d.%d used %#8x free %#8x\n",
|
ret = scnprintf(buf + len, buff_size - len, "zone %d.%d used %#8x free %#8x\n",
|
||||||
reply->elems[i].zone, reply->elems[i].id,
|
reply->elems[i].zone, reply->elems[i].id,
|
||||||
reply->elems[i].used, reply->elems[i].free);
|
reply->elems[i].used, reply->elems[i].free);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto error;
|
goto error;
|
||||||
len += ret;
|
len += ret;
|
||||||
|
|
|
@ -574,7 +574,7 @@ static void hda_dsp_dump_ext_rom_status(struct snd_sof_dev *sdev, const char *le
|
||||||
chip = get_chip_info(sdev->pdata);
|
chip = get_chip_info(sdev->pdata);
|
||||||
for (i = 0; i < HDA_EXT_ROM_STATUS_SIZE; i++) {
|
for (i = 0; i < HDA_EXT_ROM_STATUS_SIZE; i++) {
|
||||||
value = snd_sof_dsp_read(sdev, HDA_DSP_BAR, chip->rom_status_reg + i * 0x4);
|
value = snd_sof_dsp_read(sdev, HDA_DSP_BAR, chip->rom_status_reg + i * 0x4);
|
||||||
len += snprintf(msg + len, sizeof(msg) - len, " 0x%x", value);
|
len += scnprintf(msg + len, sizeof(msg) - len, " 0x%x", value);
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_printk(level, sdev->dev, "extended rom status: %s", msg);
|
dev_printk(level, sdev->dev, "extended rom status: %s", msg);
|
||||||
|
|
|
@ -2338,7 +2338,7 @@ static int sof_ipc3_parse_manifest(struct snd_soc_component *scomp, int index,
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_info(scomp->dev,
|
dev_info(scomp->dev,
|
||||||
"Topology: ABI %d:%d:%d Kernel ABI %hhu:%hhu:%hhu\n",
|
"Topology: ABI %d:%d:%d Kernel ABI %d:%d:%d\n",
|
||||||
man->priv.data[0], man->priv.data[1], man->priv.data[2],
|
man->priv.data[0], man->priv.data[1], man->priv.data[2],
|
||||||
SOF_ABI_MAJOR, SOF_ABI_MINOR, SOF_ABI_PATCH);
|
SOF_ABI_MAJOR, SOF_ABI_MINOR, SOF_ABI_PATCH);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче