Commit 3d5746a1 authored by Mark Brown's avatar Mark Brown

ASoC: Merge fixes

Pull in wm8731 fix.
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parents 5cfe477f aa70527d
...@@ -179,6 +179,10 @@ struct snd_soc_component_driver { ...@@ -179,6 +179,10 @@ struct snd_soc_component_driver {
struct snd_pcm_hw_params *params); struct snd_pcm_hw_params *params);
bool use_dai_pcm_id; /* use DAI link PCM ID as PCM device number */ bool use_dai_pcm_id; /* use DAI link PCM ID as PCM device number */
int be_pcm_base; /* base device ID for all BE PCMs */ int be_pcm_base; /* base device ID for all BE PCMs */
#ifdef CONFIG_DEBUG_FS
const char *debugfs_prefix;
#endif
}; };
struct snd_soc_component { struct snd_soc_component {
......
...@@ -1206,9 +1206,16 @@ static int msm8916_wcd_digital_probe(struct platform_device *pdev) ...@@ -1206,9 +1206,16 @@ static int msm8916_wcd_digital_probe(struct platform_device *pdev)
dev_set_drvdata(dev, priv); dev_set_drvdata(dev, priv);
return devm_snd_soc_register_component(dev, &msm8916_wcd_digital, ret = devm_snd_soc_register_component(dev, &msm8916_wcd_digital,
msm8916_wcd_digital_dai, msm8916_wcd_digital_dai,
ARRAY_SIZE(msm8916_wcd_digital_dai)); ARRAY_SIZE(msm8916_wcd_digital_dai));
if (ret)
goto err_mclk;
return 0;
err_mclk:
clk_disable_unprepare(priv->mclk);
err_clk: err_clk:
clk_disable_unprepare(priv->ahbclk); clk_disable_unprepare(priv->ahbclk);
return ret; return ret;
......
...@@ -489,7 +489,7 @@ static int rk817_platform_probe(struct platform_device *pdev) ...@@ -489,7 +489,7 @@ static int rk817_platform_probe(struct platform_device *pdev)
rk817_codec_parse_dt_property(&pdev->dev, rk817_codec_data); rk817_codec_parse_dt_property(&pdev->dev, rk817_codec_data);
rk817_codec_data->mclk = clk_get(pdev->dev.parent, "mclk"); rk817_codec_data->mclk = devm_clk_get(pdev->dev.parent, "mclk");
if (IS_ERR(rk817_codec_data->mclk)) { if (IS_ERR(rk817_codec_data->mclk)) {
dev_dbg(&pdev->dev, "Unable to get mclk\n"); dev_dbg(&pdev->dev, "Unable to get mclk\n");
ret = -ENXIO; ret = -ENXIO;
......
...@@ -1100,6 +1100,15 @@ void rt5682_jack_detect_handler(struct work_struct *work) ...@@ -1100,6 +1100,15 @@ void rt5682_jack_detect_handler(struct work_struct *work)
return; return;
} }
if (rt5682->is_sdw) {
if (pm_runtime_status_suspended(rt5682->slave->dev.parent)) {
dev_dbg(&rt5682->slave->dev,
"%s: parent device is pm_runtime_status_suspended, skipping jack detection\n",
__func__);
return;
}
}
dapm = snd_soc_component_get_dapm(rt5682->component); dapm = snd_soc_component_get_dapm(rt5682->component);
snd_soc_dapm_mutex_lock(dapm); snd_soc_dapm_mutex_lock(dapm);
......
...@@ -245,6 +245,13 @@ static void rt711_jack_detect_handler(struct work_struct *work) ...@@ -245,6 +245,13 @@ static void rt711_jack_detect_handler(struct work_struct *work)
if (!rt711->component->card->instantiated) if (!rt711->component->card->instantiated)
return; return;
if (pm_runtime_status_suspended(rt711->slave->dev.parent)) {
dev_dbg(&rt711->slave->dev,
"%s: parent device is pm_runtime_status_suspended, skipping jack detection\n",
__func__);
return;
}
reg = RT711_VERB_GET_PIN_SENSE | RT711_HP_OUT; reg = RT711_VERB_GET_PIN_SENSE | RT711_HP_OUT;
ret = regmap_read(rt711->regmap, reg, &jack_status); ret = regmap_read(rt711->regmap, reg, &jack_status);
if (ret < 0) if (ret < 0)
......
...@@ -1274,29 +1274,7 @@ static int wcd934x_set_sido_input_src(struct wcd934x_codec *wcd, int sido_src) ...@@ -1274,29 +1274,7 @@ static int wcd934x_set_sido_input_src(struct wcd934x_codec *wcd, int sido_src)
if (sido_src == wcd->sido_input_src) if (sido_src == wcd->sido_input_src)
return 0; return 0;
if (sido_src == SIDO_SOURCE_INTERNAL) { if (sido_src == SIDO_SOURCE_RCO_BG) {
regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
WCD934X_ANA_BUCK_HI_ACCU_EN_MASK, 0);
usleep_range(100, 110);
regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
WCD934X_ANA_BUCK_HI_ACCU_PRE_ENX_MASK, 0x0);
usleep_range(100, 110);
regmap_update_bits(wcd->regmap, WCD934X_ANA_RCO,
WCD934X_ANA_RCO_BG_EN_MASK, 0);
usleep_range(100, 110);
regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
WCD934X_ANA_BUCK_PRE_EN1_MASK,
WCD934X_ANA_BUCK_PRE_EN1_ENABLE);
usleep_range(100, 110);
regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
WCD934X_ANA_BUCK_PRE_EN2_MASK,
WCD934X_ANA_BUCK_PRE_EN2_ENABLE);
usleep_range(100, 110);
regmap_update_bits(wcd->regmap, WCD934X_ANA_BUCK_CTL,
WCD934X_ANA_BUCK_HI_ACCU_EN_MASK,
WCD934X_ANA_BUCK_HI_ACCU_ENABLE);
usleep_range(100, 110);
} else if (sido_src == SIDO_SOURCE_RCO_BG) {
regmap_update_bits(wcd->regmap, WCD934X_ANA_RCO, regmap_update_bits(wcd->regmap, WCD934X_ANA_RCO,
WCD934X_ANA_RCO_BG_EN_MASK, WCD934X_ANA_RCO_BG_EN_MASK,
WCD934X_ANA_RCO_BG_ENABLE); WCD934X_ANA_RCO_BG_ENABLE);
...@@ -1382,8 +1360,6 @@ static int wcd934x_disable_ana_bias_and_syclk(struct wcd934x_codec *wcd) ...@@ -1382,8 +1360,6 @@ static int wcd934x_disable_ana_bias_and_syclk(struct wcd934x_codec *wcd)
regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG, regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG,
WCD934X_EXT_CLK_BUF_EN_MASK | WCD934X_EXT_CLK_BUF_EN_MASK |
WCD934X_MCLK_EN_MASK, 0x0); WCD934X_MCLK_EN_MASK, 0x0);
wcd934x_set_sido_input_src(wcd, SIDO_SOURCE_INTERNAL);
regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS, regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
WCD934X_ANA_BIAS_EN_MASK, 0); WCD934X_ANA_BIAS_EN_MASK, 0);
regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS, regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
......
...@@ -372,7 +372,7 @@ static int fsl_sai_set_bclk(struct snd_soc_dai *dai, bool tx, u32 freq) ...@@ -372,7 +372,7 @@ static int fsl_sai_set_bclk(struct snd_soc_dai *dai, bool tx, u32 freq)
continue; continue;
if (ratio == 1 && !support_1_1_ratio) if (ratio == 1 && !support_1_1_ratio)
continue; continue;
else if (ratio & 1) if ((ratio & 1) && ratio > 1)
continue; continue;
diff = abs((long)clk_rate - ratio * freq); diff = abs((long)clk_rate - ratio * freq);
......
...@@ -364,13 +364,15 @@ static int asoc_simple_set_tdm(struct snd_soc_dai *dai, ...@@ -364,13 +364,15 @@ static int asoc_simple_set_tdm(struct snd_soc_dai *dai,
struct snd_pcm_hw_params *params) struct snd_pcm_hw_params *params)
{ {
int sample_bits = params_width(params); int sample_bits = params_width(params);
int slot_width = simple_dai->slot_width; int slot_width, slot_count;
int slot_count = simple_dai->slots;
int i, ret; int i, ret;
if (!simple_dai || !simple_dai->tdm_width_map) if (!simple_dai || !simple_dai->tdm_width_map)
return 0; return 0;
slot_width = simple_dai->slot_width;
slot_count = simple_dai->slots;
if (slot_width == 0) if (slot_width == 0)
slot_width = sample_bits; slot_width = sample_bits;
......
...@@ -27,9 +27,11 @@ ...@@ -27,9 +27,11 @@
#define SOF_ES8336_SSP_CODEC(quirk) ((quirk) & GENMASK(3, 0)) #define SOF_ES8336_SSP_CODEC(quirk) ((quirk) & GENMASK(3, 0))
#define SOF_ES8336_SSP_CODEC_MASK (GENMASK(3, 0)) #define SOF_ES8336_SSP_CODEC_MASK (GENMASK(3, 0))
#define SOF_ES8336_TGL_GPIO_QUIRK BIT(4) #define SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK BIT(4)
#define SOF_ES8336_ENABLE_DMIC BIT(5) #define SOF_ES8336_ENABLE_DMIC BIT(5)
#define SOF_ES8336_JD_INVERTED BIT(6) #define SOF_ES8336_JD_INVERTED BIT(6)
#define SOF_ES8336_HEADPHONE_GPIO BIT(7)
#define SOC_ES8336_HEADSET_MIC1 BIT(8)
static unsigned long quirk; static unsigned long quirk;
...@@ -39,7 +41,7 @@ MODULE_PARM_DESC(quirk, "Board-specific quirk override"); ...@@ -39,7 +41,7 @@ MODULE_PARM_DESC(quirk, "Board-specific quirk override");
struct sof_es8336_private { struct sof_es8336_private {
struct device *codec_dev; struct device *codec_dev;
struct gpio_desc *gpio_pa; struct gpio_desc *gpio_speakers, *gpio_headphone;
struct snd_soc_jack jack; struct snd_soc_jack jack;
struct list_head hdmi_pcm_list; struct list_head hdmi_pcm_list;
bool speaker_en; bool speaker_en;
...@@ -51,19 +53,31 @@ struct sof_hdmi_pcm { ...@@ -51,19 +53,31 @@ struct sof_hdmi_pcm {
int device; int device;
}; };
static const struct acpi_gpio_params pa_enable_gpio = { 0, 0, true }; static const struct acpi_gpio_params enable_gpio0 = { 0, 0, true };
static const struct acpi_gpio_mapping acpi_es8336_gpios[] = { static const struct acpi_gpio_params enable_gpio1 = { 1, 0, true };
{ "pa-enable-gpios", &pa_enable_gpio, 1 },
static const struct acpi_gpio_mapping acpi_speakers_enable_gpio0[] = {
{ "speakers-enable-gpios", &enable_gpio0, 1 },
{ } { }
}; };
static const struct acpi_gpio_params quirk_pa_enable_gpio = { 1, 0, true }; static const struct acpi_gpio_mapping acpi_speakers_enable_gpio1[] = {
static const struct acpi_gpio_mapping quirk_acpi_es8336_gpios[] = { { "speakers-enable-gpios", &enable_gpio1, 1 },
{ "pa-enable-gpios", &quirk_pa_enable_gpio, 1 }, };
static const struct acpi_gpio_mapping acpi_enable_both_gpios[] = {
{ "speakers-enable-gpios", &enable_gpio0, 1 },
{ "headphone-enable-gpios", &enable_gpio1, 1 },
{ } { }
}; };
static const struct acpi_gpio_mapping *gpio_mapping = acpi_es8336_gpios; static const struct acpi_gpio_mapping acpi_enable_both_gpios_rev_order[] = {
{ "speakers-enable-gpios", &enable_gpio1, 1 },
{ "headphone-enable-gpios", &enable_gpio0, 1 },
{ }
};
static const struct acpi_gpio_mapping *gpio_mapping = acpi_speakers_enable_gpio0;
static void log_quirks(struct device *dev) static void log_quirks(struct device *dev)
{ {
...@@ -71,10 +85,14 @@ static void log_quirks(struct device *dev) ...@@ -71,10 +85,14 @@ static void log_quirks(struct device *dev)
dev_info(dev, "quirk SSP%ld\n", SOF_ES8336_SSP_CODEC(quirk)); dev_info(dev, "quirk SSP%ld\n", SOF_ES8336_SSP_CODEC(quirk));
if (quirk & SOF_ES8336_ENABLE_DMIC) if (quirk & SOF_ES8336_ENABLE_DMIC)
dev_info(dev, "quirk DMIC enabled\n"); dev_info(dev, "quirk DMIC enabled\n");
if (quirk & SOF_ES8336_TGL_GPIO_QUIRK) if (quirk & SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK)
dev_info(dev, "quirk TGL GPIO enabled\n"); dev_info(dev, "Speakers GPIO1 quirk enabled\n");
if (quirk & SOF_ES8336_HEADPHONE_GPIO)
dev_info(dev, "quirk headphone GPIO enabled\n");
if (quirk & SOF_ES8336_JD_INVERTED) if (quirk & SOF_ES8336_JD_INVERTED)
dev_info(dev, "quirk JD inverted enabled\n"); dev_info(dev, "quirk JD inverted enabled\n");
if (quirk & SOC_ES8336_HEADSET_MIC1)
dev_info(dev, "quirk headset at mic1 port enabled\n");
} }
static int sof_es8316_speaker_power_event(struct snd_soc_dapm_widget *w, static int sof_es8316_speaker_power_event(struct snd_soc_dapm_widget *w,
...@@ -83,12 +101,23 @@ static int sof_es8316_speaker_power_event(struct snd_soc_dapm_widget *w, ...@@ -83,12 +101,23 @@ static int sof_es8316_speaker_power_event(struct snd_soc_dapm_widget *w,
struct snd_soc_card *card = w->dapm->card; struct snd_soc_card *card = w->dapm->card;
struct sof_es8336_private *priv = snd_soc_card_get_drvdata(card); struct sof_es8336_private *priv = snd_soc_card_get_drvdata(card);
if (priv->speaker_en == !SND_SOC_DAPM_EVENT_ON(event))
return 0;
priv->speaker_en = !SND_SOC_DAPM_EVENT_ON(event);
if (SND_SOC_DAPM_EVENT_ON(event))
msleep(70);
gpiod_set_value_cansleep(priv->gpio_speakers, priv->speaker_en);
if (!(quirk & SOF_ES8336_HEADPHONE_GPIO))
return 0;
if (SND_SOC_DAPM_EVENT_ON(event)) if (SND_SOC_DAPM_EVENT_ON(event))
priv->speaker_en = false; msleep(70);
else
priv->speaker_en = true;
gpiod_set_value_cansleep(priv->gpio_pa, priv->speaker_en); gpiod_set_value_cansleep(priv->gpio_headphone, priv->speaker_en);
return 0; return 0;
} }
...@@ -114,18 +143,23 @@ static const struct snd_soc_dapm_route sof_es8316_audio_map[] = { ...@@ -114,18 +143,23 @@ static const struct snd_soc_dapm_route sof_es8316_audio_map[] = {
/* /*
* There is no separate speaker output instead the speakers are muxed to * There is no separate speaker output instead the speakers are muxed to
* the HP outputs. The mux is controlled by the "Speaker Power" supply. * the HP outputs. The mux is controlled Speaker and/or headphone switch.
*/ */
{"Speaker", NULL, "HPOL"}, {"Speaker", NULL, "HPOL"},
{"Speaker", NULL, "HPOR"}, {"Speaker", NULL, "HPOR"},
{"Speaker", NULL, "Speaker Power"}, {"Speaker", NULL, "Speaker Power"},
}; };
static const struct snd_soc_dapm_route sof_es8316_intmic_in1_map[] = { static const struct snd_soc_dapm_route sof_es8316_headset_mic2_map[] = {
{"MIC1", NULL, "Internal Mic"}, {"MIC1", NULL, "Internal Mic"},
{"MIC2", NULL, "Headset Mic"}, {"MIC2", NULL, "Headset Mic"},
}; };
static const struct snd_soc_dapm_route sof_es8316_headset_mic1_map[] = {
{"MIC2", NULL, "Internal Mic"},
{"MIC1", NULL, "Headset Mic"},
};
static const struct snd_soc_dapm_route dmic_map[] = { static const struct snd_soc_dapm_route dmic_map[] = {
/* digital mics */ /* digital mics */
{"DMic", NULL, "SoC DMIC"}, {"DMic", NULL, "SoC DMIC"},
...@@ -199,8 +233,13 @@ static int sof_es8316_init(struct snd_soc_pcm_runtime *runtime) ...@@ -199,8 +233,13 @@ static int sof_es8316_init(struct snd_soc_pcm_runtime *runtime)
card->dapm.idle_bias_off = true; card->dapm.idle_bias_off = true;
custom_map = sof_es8316_intmic_in1_map; if (quirk & SOC_ES8336_HEADSET_MIC1) {
num_routes = ARRAY_SIZE(sof_es8316_intmic_in1_map); custom_map = sof_es8316_headset_mic1_map;
num_routes = ARRAY_SIZE(sof_es8316_headset_mic1_map);
} else {
custom_map = sof_es8316_headset_mic2_map;
num_routes = ARRAY_SIZE(sof_es8316_headset_mic2_map);
}
ret = snd_soc_dapm_add_routes(&card->dapm, custom_map, num_routes); ret = snd_soc_dapm_add_routes(&card->dapm, custom_map, num_routes);
if (ret) if (ret)
...@@ -233,8 +272,14 @@ static int sof_es8336_quirk_cb(const struct dmi_system_id *id) ...@@ -233,8 +272,14 @@ static int sof_es8336_quirk_cb(const struct dmi_system_id *id)
{ {
quirk = (unsigned long)id->driver_data; quirk = (unsigned long)id->driver_data;
if (quirk & SOF_ES8336_TGL_GPIO_QUIRK) if (quirk & SOF_ES8336_HEADPHONE_GPIO) {
gpio_mapping = quirk_acpi_es8336_gpios; if (quirk & SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK)
gpio_mapping = acpi_enable_both_gpios;
else
gpio_mapping = acpi_enable_both_gpios_rev_order;
} else if (quirk & SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK) {
gpio_mapping = acpi_speakers_enable_gpio1;
}
return 1; return 1;
} }
...@@ -257,7 +302,16 @@ static const struct dmi_system_id sof_es8336_quirk_table[] = { ...@@ -257,7 +302,16 @@ static const struct dmi_system_id sof_es8336_quirk_table[] = {
DMI_MATCH(DMI_SYS_VENDOR, "IP3 tech"), DMI_MATCH(DMI_SYS_VENDOR, "IP3 tech"),
DMI_MATCH(DMI_BOARD_NAME, "WN1"), DMI_MATCH(DMI_BOARD_NAME, "WN1"),
}, },
.driver_data = (void *)(SOF_ES8336_TGL_GPIO_QUIRK) .driver_data = (void *)(SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK)
},
{
.callback = sof_es8336_quirk_cb,
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "HUAWEI"),
DMI_MATCH(DMI_BOARD_NAME, "BOHB-WAX9-PCB-B2"),
},
.driver_data = (void *)(SOF_ES8336_HEADPHONE_GPIO |
SOC_ES8336_HEADSET_MIC1)
}, },
{} {}
}; };
...@@ -585,10 +639,17 @@ static int sof_es8336_probe(struct platform_device *pdev) ...@@ -585,10 +639,17 @@ static int sof_es8336_probe(struct platform_device *pdev)
if (ret) if (ret)
dev_warn(codec_dev, "unable to add GPIO mapping table\n"); dev_warn(codec_dev, "unable to add GPIO mapping table\n");
priv->gpio_pa = gpiod_get_optional(codec_dev, "pa-enable", GPIOD_OUT_LOW); priv->gpio_speakers = gpiod_get_optional(codec_dev, "speakers-enable", GPIOD_OUT_LOW);
if (IS_ERR(priv->gpio_pa)) { if (IS_ERR(priv->gpio_speakers)) {
ret = dev_err_probe(dev, PTR_ERR(priv->gpio_pa), ret = dev_err_probe(dev, PTR_ERR(priv->gpio_speakers),
"could not get pa-enable GPIO\n"); "could not get speakers-enable GPIO\n");
goto err_put_codec;
}
priv->gpio_headphone = gpiod_get_optional(codec_dev, "headphone-enable", GPIOD_OUT_LOW);
if (IS_ERR(priv->gpio_headphone)) {
ret = dev_err_probe(dev, PTR_ERR(priv->gpio_headphone),
"could not get headphone-enable GPIO\n");
goto err_put_codec; goto err_put_codec;
} }
...@@ -604,7 +665,7 @@ static int sof_es8336_probe(struct platform_device *pdev) ...@@ -604,7 +665,7 @@ static int sof_es8336_probe(struct platform_device *pdev)
ret = devm_snd_soc_register_card(dev, card); ret = devm_snd_soc_register_card(dev, card);
if (ret) { if (ret) {
gpiod_put(priv->gpio_pa); gpiod_put(priv->gpio_speakers);
dev_err(dev, "snd_soc_register_card failed: %d\n", ret); dev_err(dev, "snd_soc_register_card failed: %d\n", ret);
goto err_put_codec; goto err_put_codec;
} }
...@@ -622,7 +683,7 @@ static int sof_es8336_remove(struct platform_device *pdev) ...@@ -622,7 +683,7 @@ static int sof_es8336_remove(struct platform_device *pdev)
struct snd_soc_card *card = platform_get_drvdata(pdev); struct snd_soc_card *card = platform_get_drvdata(pdev);
struct sof_es8336_private *priv = snd_soc_card_get_drvdata(card); struct sof_es8336_private *priv = snd_soc_card_get_drvdata(card);
gpiod_put(priv->gpio_pa); gpiod_put(priv->gpio_speakers);
device_remove_software_node(priv->codec_dev); device_remove_software_node(priv->codec_dev);
put_device(priv->codec_dev); put_device(priv->codec_dev);
......
...@@ -212,6 +212,19 @@ static const struct dmi_system_id sof_rt5682_quirk_table[] = { ...@@ -212,6 +212,19 @@ static const struct dmi_system_id sof_rt5682_quirk_table[] = {
SOF_SSP_BT_OFFLOAD_PRESENT), SOF_SSP_BT_OFFLOAD_PRESENT),
}, },
{
.callback = sof_rt5682_quirk_cb,
.matches = {
DMI_MATCH(DMI_PRODUCT_FAMILY, "Google_Brya"),
DMI_MATCH(DMI_OEM_STRING, "AUDIO-MAX98360_ALC5682I_I2S_AMP_SSP2"),
},
.driver_data = (void *)(SOF_RT5682_MCLK_EN |
SOF_RT5682_SSP_CODEC(0) |
SOF_SPEAKER_AMP_PRESENT |
SOF_MAX98360A_SPEAKER_AMP_PRESENT |
SOF_RT5682_SSP_AMP(2) |
SOF_RT5682_NUM_HDMIDEV(4)),
},
{} {}
}; };
......
...@@ -132,13 +132,13 @@ static const struct snd_soc_acpi_adr_device mx8373_1_adr[] = { ...@@ -132,13 +132,13 @@ static const struct snd_soc_acpi_adr_device mx8373_1_adr[] = {
{ {
.adr = 0x000123019F837300ull, .adr = 0x000123019F837300ull,
.num_endpoints = 1, .num_endpoints = 1,
.endpoints = &spk_l_endpoint, .endpoints = &spk_r_endpoint,
.name_prefix = "Right" .name_prefix = "Right"
}, },
{ {
.adr = 0x000127019F837300ull, .adr = 0x000127019F837300ull,
.num_endpoints = 1, .num_endpoints = 1,
.endpoints = &spk_r_endpoint, .endpoints = &spk_l_endpoint,
.name_prefix = "Left" .name_prefix = "Left"
} }
}; };
......
...@@ -193,6 +193,9 @@ static const struct snd_soc_component_driver aiu_acodec_ctrl_component = { ...@@ -193,6 +193,9 @@ static const struct snd_soc_component_driver aiu_acodec_ctrl_component = {
.of_xlate_dai_name = aiu_acodec_of_xlate_dai_name, .of_xlate_dai_name = aiu_acodec_of_xlate_dai_name,
.endianness = 1, .endianness = 1,
.non_legacy_dai_naming = 1, .non_legacy_dai_naming = 1,
#ifdef CONFIG_DEBUG_FS
.debugfs_prefix = "acodec",
#endif
}; };
int aiu_acodec_ctrl_register_component(struct device *dev) int aiu_acodec_ctrl_register_component(struct device *dev)
......
...@@ -140,6 +140,9 @@ static const struct snd_soc_component_driver aiu_hdmi_ctrl_component = { ...@@ -140,6 +140,9 @@ static const struct snd_soc_component_driver aiu_hdmi_ctrl_component = {
.of_xlate_dai_name = aiu_hdmi_of_xlate_dai_name, .of_xlate_dai_name = aiu_hdmi_of_xlate_dai_name,
.endianness = 1, .endianness = 1,
.non_legacy_dai_naming = 1, .non_legacy_dai_naming = 1,
#ifdef CONFIG_DEBUG_FS
.debugfs_prefix = "hdmi",
#endif
}; };
int aiu_hdmi_ctrl_register_component(struct device *dev) int aiu_hdmi_ctrl_register_component(struct device *dev)
......
...@@ -103,6 +103,9 @@ static const struct snd_soc_component_driver aiu_cpu_component = { ...@@ -103,6 +103,9 @@ static const struct snd_soc_component_driver aiu_cpu_component = {
.pointer = aiu_fifo_pointer, .pointer = aiu_fifo_pointer,
.probe = aiu_cpu_component_probe, .probe = aiu_cpu_component_probe,
.remove = aiu_cpu_component_remove, .remove = aiu_cpu_component_remove,
#ifdef CONFIG_DEBUG_FS
.debugfs_prefix = "cpu",
#endif
}; };
static struct snd_soc_dai_driver aiu_cpu_dai_drv[] = { static struct snd_soc_dai_driver aiu_cpu_dai_drv[] = {
......
...@@ -2587,6 +2587,11 @@ int snd_soc_component_initialize(struct snd_soc_component *component, ...@@ -2587,6 +2587,11 @@ int snd_soc_component_initialize(struct snd_soc_component *component,
component->dev = dev; component->dev = dev;
component->driver = driver; component->driver = driver;
#ifdef CONFIG_DEBUG_FS
if (!component->debugfs_prefix)
component->debugfs_prefix = driver->debugfs_prefix;
#endif
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(snd_soc_component_initialize); EXPORT_SYMBOL_GPL(snd_soc_component_initialize);
......
...@@ -83,7 +83,14 @@ static const struct dmi_system_id sof_tplg_table[] = { ...@@ -83,7 +83,14 @@ static const struct dmi_system_id sof_tplg_table[] = {
}, },
.driver_data = "sof-adl-max98357a-rt5682-2way.tplg", .driver_data = "sof-adl-max98357a-rt5682-2way.tplg",
}, },
{
.callback = sof_tplg_cb,
.matches = {
DMI_MATCH(DMI_PRODUCT_FAMILY, "Google_Brya"),
DMI_MATCH(DMI_OEM_STRING, "AUDIO-MAX98360_ALC5682I_I2S_AMP_SSP2"),
},
.driver_data = "sof-adl-max98357a-rt5682.tplg",
},
{} {}
}; };
......
...@@ -915,8 +915,10 @@ static int sof_control_load(struct snd_soc_component *scomp, int index, ...@@ -915,8 +915,10 @@ static int sof_control_load(struct snd_soc_component *scomp, int index,
return -ENOMEM; return -ENOMEM;
scontrol->name = kstrdup(hdr->name, GFP_KERNEL); scontrol->name = kstrdup(hdr->name, GFP_KERNEL);
if (!scontrol->name) if (!scontrol->name) {
kfree(scontrol);
return -ENOMEM; return -ENOMEM;
}
scontrol->scomp = scomp; scontrol->scomp = scomp;
scontrol->access = kc->access; scontrol->access = kc->access;
...@@ -1081,6 +1083,46 @@ static int sof_connect_dai_widget(struct snd_soc_component *scomp, ...@@ -1081,6 +1083,46 @@ static int sof_connect_dai_widget(struct snd_soc_component *scomp,
return 0; return 0;
} }
static void sof_disconnect_dai_widget(struct snd_soc_component *scomp,
struct snd_soc_dapm_widget *w)
{
struct snd_soc_card *card = scomp->card;
struct snd_soc_pcm_runtime *rtd;
struct snd_soc_dai *cpu_dai;
int i;
if (!w->sname)
return;
list_for_each_entry(rtd, &card->rtd_list, list) {
/* does stream match DAI link ? */
if (!rtd->dai_link->stream_name ||
strcmp(w->sname, rtd->dai_link->stream_name))
continue;
switch (w->id) {
case snd_soc_dapm_dai_out:
for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
if (cpu_dai->capture_widget == w) {
cpu_dai->capture_widget = NULL;
break;
}
}
break;
case snd_soc_dapm_dai_in:
for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
if (cpu_dai->playback_widget == w) {
cpu_dai->playback_widget = NULL;
break;
}
}
break;
default:
break;
}
}
}
/* bind PCM ID to host component ID */ /* bind PCM ID to host component ID */
static int spcm_bind(struct snd_soc_component *scomp, struct snd_sof_pcm *spcm, static int spcm_bind(struct snd_soc_component *scomp, struct snd_sof_pcm *spcm,
int dir) int dir)
...@@ -1364,6 +1406,9 @@ static int sof_widget_unload(struct snd_soc_component *scomp, ...@@ -1364,6 +1406,9 @@ static int sof_widget_unload(struct snd_soc_component *scomp,
if (dai) if (dai)
list_del(&dai->list); list_del(&dai->list);
sof_disconnect_dai_widget(scomp, widget);
break; break;
default: default:
break; break;
......
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