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

ASoC: Merge fixes for consistent cs42l43 schema

We have adjacent changes for the cs42l43 DT schema, merge the fixes
branch up so that there's a single thing for people to base future
changes on.
parents 4a221b2e 99d426c6
...@@ -82,7 +82,7 @@ properties: ...@@ -82,7 +82,7 @@ properties:
description: description:
Current at which the headset micbias sense clamp will engage, 0 to Current at which the headset micbias sense clamp will engage, 0 to
disable. disable.
enum: [ 0, 14, 23, 41, 50, 60, 68, 86, 95 ] enum: [ 0, 14, 24, 43, 52, 61, 71, 90, 99 ]
default: 14 default: 14
cirrus,bias-ramp-ms: cirrus,bias-ramp-ms:
......
...@@ -56,6 +56,9 @@ properties: ...@@ -56,6 +56,9 @@ properties:
- const: clkext3 - const: clkext3
minItems: 2 minItems: 2
"#sound-dai-cells":
const: 0
required: required:
- compatible - compatible
- reg - reg
......
...@@ -469,6 +469,7 @@ void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card); ...@@ -469,6 +469,7 @@ void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card);
int snd_soc_dapm_update_dai(struct snd_pcm_substream *substream, int snd_soc_dapm_update_dai(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params, struct snd_soc_dai *dai); struct snd_pcm_hw_params *params, struct snd_soc_dai *dai);
int snd_soc_dapm_widget_name_cmp(struct snd_soc_dapm_widget *widget, const char *s);
/* dapm path setup */ /* dapm path setup */
int snd_soc_dapm_new_widgets(struct snd_soc_card *card); int snd_soc_dapm_new_widgets(struct snd_soc_card *card);
......
...@@ -1134,6 +1134,8 @@ struct snd_soc_pcm_runtime { ...@@ -1134,6 +1134,8 @@ struct snd_soc_pcm_runtime {
unsigned int pop_wait:1; unsigned int pop_wait:1;
unsigned int fe_compr:1; /* for Dynamic PCM */ unsigned int fe_compr:1; /* for Dynamic PCM */
bool initialized;
int num_components; int num_components;
struct snd_soc_component *components[]; /* CPU/Codec/Platform */ struct snd_soc_component *components[]; /* CPU/Codec/Platform */
}; };
......
...@@ -241,6 +241,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = { ...@@ -241,6 +241,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "82V2"), DMI_MATCH(DMI_PRODUCT_NAME, "82V2"),
} }
}, },
{
.driver_data = &acp6x_card,
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_NAME, "82YM"),
}
},
{ {
.driver_data = &acp6x_card, .driver_data = &acp6x_card,
.matches = { .matches = {
......
...@@ -706,7 +706,7 @@ static void cs35l56_patch(struct cs35l56_private *cs35l56) ...@@ -706,7 +706,7 @@ static void cs35l56_patch(struct cs35l56_private *cs35l56)
mutex_lock(&cs35l56->base.irq_lock); mutex_lock(&cs35l56->base.irq_lock);
init_completion(&cs35l56->init_completion); reinit_completion(&cs35l56->init_completion);
cs35l56->soft_resetting = true; cs35l56->soft_resetting = true;
cs35l56_system_reset(&cs35l56->base, !!cs35l56->sdw_peripheral); cs35l56_system_reset(&cs35l56->base, !!cs35l56->sdw_peripheral);
...@@ -1197,6 +1197,12 @@ int cs35l56_init(struct cs35l56_private *cs35l56) ...@@ -1197,6 +1197,12 @@ int cs35l56_init(struct cs35l56_private *cs35l56)
/* Registers could be dirty after soft reset or SoundWire enumeration */ /* Registers could be dirty after soft reset or SoundWire enumeration */
regcache_sync(cs35l56->base.regmap); regcache_sync(cs35l56->base.regmap);
/* Set ASP1 DOUT to high-impedance when it is not transmitting audio data. */
ret = regmap_set_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL3,
CS35L56_ASP1_DOUT_HIZ_CTRL_MASK);
if (ret)
return dev_err_probe(cs35l56->base.dev, ret, "Failed to write ASP1_CONTROL3\n");
cs35l56->base.init_done = true; cs35l56->base.init_done = true;
complete(&cs35l56->init_completion); complete(&cs35l56->init_completion);
......
...@@ -34,7 +34,7 @@ static const unsigned int cs42l43_accdet_db_ms[] = { ...@@ -34,7 +34,7 @@ static const unsigned int cs42l43_accdet_db_ms[] = {
static const unsigned int cs42l43_accdet_ramp_ms[] = { 10, 40, 90, 170 }; static const unsigned int cs42l43_accdet_ramp_ms[] = { 10, 40, 90, 170 };
static const unsigned int cs42l43_accdet_bias_sense[] = { static const unsigned int cs42l43_accdet_bias_sense[] = {
14, 23, 41, 50, 60, 68, 86, 95, 0, 14, 24, 43, 52, 61, 71, 90, 99, 0,
}; };
static int cs42l43_find_index(struct cs42l43_codec *priv, const char * const prop, static int cs42l43_find_index(struct cs42l43_codec *priv, const char * const prop,
......
...@@ -531,7 +531,10 @@ static int hdmi_codec_fill_codec_params(struct snd_soc_dai *dai, ...@@ -531,7 +531,10 @@ static int hdmi_codec_fill_codec_params(struct snd_soc_dai *dai,
hp->sample_rate = sample_rate; hp->sample_rate = sample_rate;
hp->channels = channels; hp->channels = channels;
hcp->chmap_idx = idx; if (pcm_audio)
hcp->chmap_idx = ca_id;
else
hcp->chmap_idx = HDMI_CODEC_CHMAP_IDX_UNKNOWN;
return 0; return 0;
} }
......
...@@ -1675,12 +1675,12 @@ static int wsa_macro_spk_boost_event(struct snd_soc_dapm_widget *w, ...@@ -1675,12 +1675,12 @@ static int wsa_macro_spk_boost_event(struct snd_soc_dapm_widget *w,
u16 boost_path_ctl, boost_path_cfg1; u16 boost_path_ctl, boost_path_cfg1;
u16 reg, reg_mix; u16 reg, reg_mix;
if (!strcmp(w->name, "WSA_RX INT0 CHAIN")) { if (!snd_soc_dapm_widget_name_cmp(w, "WSA_RX INT0 CHAIN")) {
boost_path_ctl = CDC_WSA_BOOST0_BOOST_PATH_CTL; boost_path_ctl = CDC_WSA_BOOST0_BOOST_PATH_CTL;
boost_path_cfg1 = CDC_WSA_RX0_RX_PATH_CFG1; boost_path_cfg1 = CDC_WSA_RX0_RX_PATH_CFG1;
reg = CDC_WSA_RX0_RX_PATH_CTL; reg = CDC_WSA_RX0_RX_PATH_CTL;
reg_mix = CDC_WSA_RX0_RX_PATH_MIX_CTL; reg_mix = CDC_WSA_RX0_RX_PATH_MIX_CTL;
} else if (!strcmp(w->name, "WSA_RX INT1 CHAIN")) { } else if (!snd_soc_dapm_widget_name_cmp(w, "WSA_RX INT1 CHAIN")) {
boost_path_ctl = CDC_WSA_BOOST1_BOOST_PATH_CTL; boost_path_ctl = CDC_WSA_BOOST1_BOOST_PATH_CTL;
boost_path_cfg1 = CDC_WSA_RX1_RX_PATH_CFG1; boost_path_cfg1 = CDC_WSA_RX1_RX_PATH_CFG1;
reg = CDC_WSA_RX1_RX_PATH_CTL; reg = CDC_WSA_RX1_RX_PATH_CTL;
......
...@@ -157,11 +157,6 @@ static int rt5682_i2c_probe(struct i2c_client *i2c) ...@@ -157,11 +157,6 @@ static int rt5682_i2c_probe(struct i2c_client *i2c)
return ret; return ret;
} }
ret = devm_add_action_or_reset(&i2c->dev, rt5682_i2c_disable_regulators,
rt5682);
if (ret)
return ret;
ret = regulator_bulk_enable(ARRAY_SIZE(rt5682->supplies), ret = regulator_bulk_enable(ARRAY_SIZE(rt5682->supplies),
rt5682->supplies); rt5682->supplies);
if (ret) { if (ret) {
...@@ -169,6 +164,11 @@ static int rt5682_i2c_probe(struct i2c_client *i2c) ...@@ -169,6 +164,11 @@ static int rt5682_i2c_probe(struct i2c_client *i2c)
return ret; return ret;
} }
ret = devm_add_action_or_reset(&i2c->dev, rt5682_i2c_disable_regulators,
rt5682);
if (ret)
return ret;
ret = rt5682_get_ldo1(rt5682, &i2c->dev); ret = rt5682_get_ldo1(rt5682, &i2c->dev);
if (ret) if (ret)
return ret; return ret;
......
...@@ -293,7 +293,7 @@ ...@@ -293,7 +293,7 @@
#define ADC3XXX_BYPASS_RPGA 0x80 #define ADC3XXX_BYPASS_RPGA 0x80
/* MICBIAS control bits */ /* MICBIAS control bits */
#define ADC3XXX_MICBIAS_MASK 0x2 #define ADC3XXX_MICBIAS_MASK 0x3
#define ADC3XXX_MICBIAS1_SHIFT 5 #define ADC3XXX_MICBIAS1_SHIFT 5
#define ADC3XXX_MICBIAS2_SHIFT 3 #define ADC3XXX_MICBIAS2_SHIFT 3
...@@ -1099,7 +1099,7 @@ static int adc3xxx_parse_dt_micbias(struct adc3xxx *adc3xxx, ...@@ -1099,7 +1099,7 @@ static int adc3xxx_parse_dt_micbias(struct adc3xxx *adc3xxx,
unsigned int val; unsigned int val;
if (!of_property_read_u32(np, propname, &val)) { if (!of_property_read_u32(np, propname, &val)) {
if (val >= ADC3XXX_MICBIAS_AVDD) { if (val > ADC3XXX_MICBIAS_AVDD) {
dev_err(dev, "Invalid property value for '%s'\n", propname); dev_err(dev, "Invalid property value for '%s'\n", propname);
return -EINVAL; return -EINVAL;
} }
......
...@@ -1278,7 +1278,31 @@ static int wcd9380_probe(struct sdw_slave *pdev, ...@@ -1278,7 +1278,31 @@ static int wcd9380_probe(struct sdw_slave *pdev,
pm_runtime_set_active(dev); pm_runtime_set_active(dev);
pm_runtime_enable(dev); pm_runtime_enable(dev);
return component_add(dev, &wcd938x_sdw_component_ops); ret = component_add(dev, &wcd938x_sdw_component_ops);
if (ret)
goto err_disable_rpm;
return 0;
err_disable_rpm:
pm_runtime_disable(dev);
pm_runtime_set_suspended(dev);
pm_runtime_dont_use_autosuspend(dev);
return ret;
}
static int wcd9380_remove(struct sdw_slave *pdev)
{
struct device *dev = &pdev->dev;
component_del(dev, &wcd938x_sdw_component_ops);
pm_runtime_disable(dev);
pm_runtime_set_suspended(dev);
pm_runtime_dont_use_autosuspend(dev);
return 0;
} }
static const struct sdw_device_id wcd9380_slave_id[] = { static const struct sdw_device_id wcd9380_slave_id[] = {
...@@ -1320,6 +1344,7 @@ static const struct dev_pm_ops wcd938x_sdw_pm_ops = { ...@@ -1320,6 +1344,7 @@ static const struct dev_pm_ops wcd938x_sdw_pm_ops = {
static struct sdw_driver wcd9380_codec_driver = { static struct sdw_driver wcd9380_codec_driver = {
.probe = wcd9380_probe, .probe = wcd9380_probe,
.remove = wcd9380_remove,
.ops = &wcd9380_slave_ops, .ops = &wcd9380_slave_ops,
.id_table = wcd9380_slave_id, .id_table = wcd9380_slave_id,
.driver = { .driver = {
......
...@@ -3325,8 +3325,10 @@ static int wcd938x_populate_dt_data(struct wcd938x_priv *wcd938x, struct device ...@@ -3325,8 +3325,10 @@ static int wcd938x_populate_dt_data(struct wcd938x_priv *wcd938x, struct device
return dev_err_probe(dev, ret, "Failed to get supplies\n"); return dev_err_probe(dev, ret, "Failed to get supplies\n");
ret = regulator_bulk_enable(WCD938X_MAX_SUPPLY, wcd938x->supplies); ret = regulator_bulk_enable(WCD938X_MAX_SUPPLY, wcd938x->supplies);
if (ret) if (ret) {
regulator_bulk_free(WCD938X_MAX_SUPPLY, wcd938x->supplies);
return dev_err_probe(dev, ret, "Failed to enable supplies\n"); return dev_err_probe(dev, ret, "Failed to enable supplies\n");
}
wcd938x_dt_parse_micbias_info(dev, wcd938x); wcd938x_dt_parse_micbias_info(dev, wcd938x);
...@@ -3435,7 +3437,8 @@ static int wcd938x_bind(struct device *dev) ...@@ -3435,7 +3437,8 @@ static int wcd938x_bind(struct device *dev)
wcd938x->rxdev = wcd938x_sdw_device_get(wcd938x->rxnode); wcd938x->rxdev = wcd938x_sdw_device_get(wcd938x->rxnode);
if (!wcd938x->rxdev) { if (!wcd938x->rxdev) {
dev_err(dev, "could not find slave with matching of node\n"); dev_err(dev, "could not find slave with matching of node\n");
return -EINVAL; ret = -EINVAL;
goto err_unbind;
} }
wcd938x->sdw_priv[AIF1_PB] = dev_get_drvdata(wcd938x->rxdev); wcd938x->sdw_priv[AIF1_PB] = dev_get_drvdata(wcd938x->rxdev);
wcd938x->sdw_priv[AIF1_PB]->wcd938x = wcd938x; wcd938x->sdw_priv[AIF1_PB]->wcd938x = wcd938x;
...@@ -3443,46 +3446,47 @@ static int wcd938x_bind(struct device *dev) ...@@ -3443,46 +3446,47 @@ static int wcd938x_bind(struct device *dev)
wcd938x->txdev = wcd938x_sdw_device_get(wcd938x->txnode); wcd938x->txdev = wcd938x_sdw_device_get(wcd938x->txnode);
if (!wcd938x->txdev) { if (!wcd938x->txdev) {
dev_err(dev, "could not find txslave with matching of node\n"); dev_err(dev, "could not find txslave with matching of node\n");
return -EINVAL; ret = -EINVAL;
goto err_put_rxdev;
} }
wcd938x->sdw_priv[AIF1_CAP] = dev_get_drvdata(wcd938x->txdev); wcd938x->sdw_priv[AIF1_CAP] = dev_get_drvdata(wcd938x->txdev);
wcd938x->sdw_priv[AIF1_CAP]->wcd938x = wcd938x; wcd938x->sdw_priv[AIF1_CAP]->wcd938x = wcd938x;
wcd938x->tx_sdw_dev = dev_to_sdw_dev(wcd938x->txdev); wcd938x->tx_sdw_dev = dev_to_sdw_dev(wcd938x->txdev);
if (!wcd938x->tx_sdw_dev) {
dev_err(dev, "could not get txslave with matching of dev\n");
return -EINVAL;
}
/* As TX is main CSR reg interface, which should not be suspended first. /* As TX is main CSR reg interface, which should not be suspended first.
* expicilty add the dependency link */ * expicilty add the dependency link */
if (!device_link_add(wcd938x->rxdev, wcd938x->txdev, DL_FLAG_STATELESS | if (!device_link_add(wcd938x->rxdev, wcd938x->txdev, DL_FLAG_STATELESS |
DL_FLAG_PM_RUNTIME)) { DL_FLAG_PM_RUNTIME)) {
dev_err(dev, "could not devlink tx and rx\n"); dev_err(dev, "could not devlink tx and rx\n");
return -EINVAL; ret = -EINVAL;
goto err_put_txdev;
} }
if (!device_link_add(dev, wcd938x->txdev, DL_FLAG_STATELESS | if (!device_link_add(dev, wcd938x->txdev, DL_FLAG_STATELESS |
DL_FLAG_PM_RUNTIME)) { DL_FLAG_PM_RUNTIME)) {
dev_err(dev, "could not devlink wcd and tx\n"); dev_err(dev, "could not devlink wcd and tx\n");
return -EINVAL; ret = -EINVAL;
goto err_remove_rxtx_link;
} }
if (!device_link_add(dev, wcd938x->rxdev, DL_FLAG_STATELESS | if (!device_link_add(dev, wcd938x->rxdev, DL_FLAG_STATELESS |
DL_FLAG_PM_RUNTIME)) { DL_FLAG_PM_RUNTIME)) {
dev_err(dev, "could not devlink wcd and rx\n"); dev_err(dev, "could not devlink wcd and rx\n");
return -EINVAL; ret = -EINVAL;
goto err_remove_tx_link;
} }
wcd938x->regmap = dev_get_regmap(&wcd938x->tx_sdw_dev->dev, NULL); wcd938x->regmap = dev_get_regmap(&wcd938x->tx_sdw_dev->dev, NULL);
if (!wcd938x->regmap) { if (!wcd938x->regmap) {
dev_err(dev, "could not get TX device regmap\n"); dev_err(dev, "could not get TX device regmap\n");
return -EINVAL; ret = -EINVAL;
goto err_remove_rx_link;
} }
ret = wcd938x_irq_init(wcd938x, dev); ret = wcd938x_irq_init(wcd938x, dev);
if (ret) { if (ret) {
dev_err(dev, "%s: IRQ init failed: %d\n", __func__, ret); dev_err(dev, "%s: IRQ init failed: %d\n", __func__, ret);
return ret; goto err_remove_rx_link;
} }
wcd938x->sdw_priv[AIF1_PB]->slave_irq = wcd938x->virq; wcd938x->sdw_priv[AIF1_PB]->slave_irq = wcd938x->virq;
...@@ -3491,27 +3495,45 @@ static int wcd938x_bind(struct device *dev) ...@@ -3491,27 +3495,45 @@ static int wcd938x_bind(struct device *dev)
ret = wcd938x_set_micbias_data(wcd938x); ret = wcd938x_set_micbias_data(wcd938x);
if (ret < 0) { if (ret < 0) {
dev_err(dev, "%s: bad micbias pdata\n", __func__); dev_err(dev, "%s: bad micbias pdata\n", __func__);
return ret; goto err_remove_rx_link;
} }
ret = snd_soc_register_component(dev, &soc_codec_dev_wcd938x, ret = snd_soc_register_component(dev, &soc_codec_dev_wcd938x,
wcd938x_dais, ARRAY_SIZE(wcd938x_dais)); wcd938x_dais, ARRAY_SIZE(wcd938x_dais));
if (ret) if (ret) {
dev_err(dev, "%s: Codec registration failed\n", dev_err(dev, "%s: Codec registration failed\n",
__func__); __func__);
goto err_remove_rx_link;
}
return ret; return 0;
err_remove_rx_link:
device_link_remove(dev, wcd938x->rxdev);
err_remove_tx_link:
device_link_remove(dev, wcd938x->txdev);
err_remove_rxtx_link:
device_link_remove(wcd938x->rxdev, wcd938x->txdev);
err_put_txdev:
put_device(wcd938x->txdev);
err_put_rxdev:
put_device(wcd938x->rxdev);
err_unbind:
component_unbind_all(dev, wcd938x);
return ret;
} }
static void wcd938x_unbind(struct device *dev) static void wcd938x_unbind(struct device *dev)
{ {
struct wcd938x_priv *wcd938x = dev_get_drvdata(dev); struct wcd938x_priv *wcd938x = dev_get_drvdata(dev);
snd_soc_unregister_component(dev);
device_link_remove(dev, wcd938x->txdev); device_link_remove(dev, wcd938x->txdev);
device_link_remove(dev, wcd938x->rxdev); device_link_remove(dev, wcd938x->rxdev);
device_link_remove(wcd938x->rxdev, wcd938x->txdev); device_link_remove(wcd938x->rxdev, wcd938x->txdev);
snd_soc_unregister_component(dev); put_device(wcd938x->txdev);
put_device(wcd938x->rxdev);
component_unbind_all(dev, wcd938x); component_unbind_all(dev, wcd938x);
} }
...@@ -3572,13 +3594,13 @@ static int wcd938x_probe(struct platform_device *pdev) ...@@ -3572,13 +3594,13 @@ static int wcd938x_probe(struct platform_device *pdev)
ret = wcd938x_add_slave_components(wcd938x, dev, &match); ret = wcd938x_add_slave_components(wcd938x, dev, &match);
if (ret) if (ret)
return ret; goto err_disable_regulators;
wcd938x_reset(wcd938x); wcd938x_reset(wcd938x);
ret = component_master_add_with_match(dev, &wcd938x_comp_ops, match); ret = component_master_add_with_match(dev, &wcd938x_comp_ops, match);
if (ret) if (ret)
return ret; goto err_disable_regulators;
pm_runtime_set_autosuspend_delay(dev, 1000); pm_runtime_set_autosuspend_delay(dev, 1000);
pm_runtime_use_autosuspend(dev); pm_runtime_use_autosuspend(dev);
...@@ -3588,11 +3610,27 @@ static int wcd938x_probe(struct platform_device *pdev) ...@@ -3588,11 +3610,27 @@ static int wcd938x_probe(struct platform_device *pdev)
pm_runtime_idle(dev); pm_runtime_idle(dev);
return 0; return 0;
err_disable_regulators:
regulator_bulk_disable(WCD938X_MAX_SUPPLY, wcd938x->supplies);
regulator_bulk_free(WCD938X_MAX_SUPPLY, wcd938x->supplies);
return ret;
} }
static void wcd938x_remove(struct platform_device *pdev) static void wcd938x_remove(struct platform_device *pdev)
{ {
component_master_del(&pdev->dev, &wcd938x_comp_ops); struct device *dev = &pdev->dev;
struct wcd938x_priv *wcd938x = dev_get_drvdata(dev);
component_master_del(dev, &wcd938x_comp_ops);
pm_runtime_disable(dev);
pm_runtime_set_suspended(dev);
pm_runtime_dont_use_autosuspend(dev);
regulator_bulk_disable(WCD938X_MAX_SUPPLY, wcd938x->supplies);
regulator_bulk_free(WCD938X_MAX_SUPPLY, wcd938x->supplies);
} }
#if defined(CONFIG_OF) #if defined(CONFIG_OF)
......
...@@ -773,7 +773,7 @@ static int pxa_ssp_probe(struct snd_soc_dai *dai) ...@@ -773,7 +773,7 @@ static int pxa_ssp_probe(struct snd_soc_dai *dai)
if (IS_ERR(priv->extclk)) { if (IS_ERR(priv->extclk)) {
ret = PTR_ERR(priv->extclk); ret = PTR_ERR(priv->extclk);
if (ret == -EPROBE_DEFER) if (ret == -EPROBE_DEFER)
return ret; goto err_priv;
priv->extclk = NULL; priv->extclk = NULL;
} }
......
...@@ -242,6 +242,7 @@ int snd_soc_component_notify_control(struct snd_soc_component *component, ...@@ -242,6 +242,7 @@ int snd_soc_component_notify_control(struct snd_soc_component *component,
char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
struct snd_kcontrol *kctl; struct snd_kcontrol *kctl;
/* When updating, change also snd_soc_dapm_widget_name_cmp() */
if (component->name_prefix) if (component->name_prefix)
snprintf(name, ARRAY_SIZE(name), "%s %s", component->name_prefix, ctl); snprintf(name, ARRAY_SIZE(name), "%s %s", component->name_prefix, ctl);
else else
......
...@@ -1347,7 +1347,7 @@ static int soc_init_pcm_runtime(struct snd_soc_card *card, ...@@ -1347,7 +1347,7 @@ static int soc_init_pcm_runtime(struct snd_soc_card *card,
snd_soc_runtime_get_dai_fmt(rtd); snd_soc_runtime_get_dai_fmt(rtd);
ret = snd_soc_runtime_set_dai_fmt(rtd, dai_link->dai_fmt); ret = snd_soc_runtime_set_dai_fmt(rtd, dai_link->dai_fmt);
if (ret) if (ret)
return ret; goto err;
/* add DPCM sysfs entries */ /* add DPCM sysfs entries */
soc_dpcm_debugfs_add(rtd); soc_dpcm_debugfs_add(rtd);
...@@ -1372,17 +1372,26 @@ static int soc_init_pcm_runtime(struct snd_soc_card *card, ...@@ -1372,17 +1372,26 @@ static int soc_init_pcm_runtime(struct snd_soc_card *card,
/* create compress_device if possible */ /* create compress_device if possible */
ret = snd_soc_dai_compress_new(cpu_dai, rtd, num); ret = snd_soc_dai_compress_new(cpu_dai, rtd, num);
if (ret != -ENOTSUPP) if (ret != -ENOTSUPP)
return ret; goto err;
/* create the pcm */ /* create the pcm */
ret = soc_new_pcm(rtd, num); ret = soc_new_pcm(rtd, num);
if (ret < 0) { if (ret < 0) {
dev_err(card->dev, "ASoC: can't create pcm %s :%d\n", dev_err(card->dev, "ASoC: can't create pcm %s :%d\n",
dai_link->stream_name, ret); dai_link->stream_name, ret);
return ret; goto err;
} }
return snd_soc_pcm_dai_new(rtd); ret = snd_soc_pcm_dai_new(rtd);
if (ret < 0)
goto err;
rtd->initialized = true;
return 0;
err:
snd_soc_link_exit(rtd);
return ret;
} }
static void soc_set_name_prefix(struct snd_soc_card *card, static void soc_set_name_prefix(struct snd_soc_card *card,
...@@ -1445,8 +1454,8 @@ static int soc_probe_component(struct snd_soc_card *card, ...@@ -1445,8 +1454,8 @@ static int soc_probe_component(struct snd_soc_card *card,
if (component->card) { if (component->card) {
if (component->card != card) { if (component->card != card) {
dev_err(component->dev, dev_err(component->dev,
"Trying to bind component to card \"%s\" but is already bound to card \"%s\"\n", "Trying to bind component \"%s\" to card \"%s\" but is already bound to card \"%s\"\n",
card->name, component->card->name); component->name, card->name, component->card->name);
return -ENODEV; return -ENODEV;
} }
return 0; return 0;
...@@ -1980,7 +1989,8 @@ static void soc_cleanup_card_resources(struct snd_soc_card *card) ...@@ -1980,7 +1989,8 @@ static void soc_cleanup_card_resources(struct snd_soc_card *card)
/* release machine specific resources */ /* release machine specific resources */
for_each_card_rtds(card, rtd) for_each_card_rtds(card, rtd)
snd_soc_link_exit(rtd); if (rtd->initialized)
snd_soc_link_exit(rtd);
/* remove and free each DAI */ /* remove and free each DAI */
soc_remove_link_dais(card); soc_remove_link_dais(card);
soc_remove_link_components(card); soc_remove_link_components(card);
......
...@@ -2728,6 +2728,18 @@ int snd_soc_dapm_update_dai(struct snd_pcm_substream *substream, ...@@ -2728,6 +2728,18 @@ int snd_soc_dapm_update_dai(struct snd_pcm_substream *substream,
} }
EXPORT_SYMBOL_GPL(snd_soc_dapm_update_dai); EXPORT_SYMBOL_GPL(snd_soc_dapm_update_dai);
int snd_soc_dapm_widget_name_cmp(struct snd_soc_dapm_widget *widget, const char *s)
{
struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm);
const char *wname = widget->name;
if (component->name_prefix)
wname += strlen(component->name_prefix) + 1; /* plus space */
return strcmp(wname, s);
}
EXPORT_SYMBOL_GPL(snd_soc_dapm_widget_name_cmp);
/* /*
* dapm_update_widget_flags() - Re-compute widget sink and source flags * dapm_update_widget_flags() - Re-compute widget sink and source flags
* @w: The widget for which to update the flags * @w: The widget for which to update the flags
......
...@@ -35,7 +35,6 @@ static const struct sof_amd_acp_desc rembrandt_chip_info = { ...@@ -35,7 +35,6 @@ static const struct sof_amd_acp_desc rembrandt_chip_info = {
.dsp_intr_base = ACP6X_DSP_SW_INTR_BASE, .dsp_intr_base = ACP6X_DSP_SW_INTR_BASE,
.sram_pte_offset = ACP6X_SRAM_PTE_OFFSET, .sram_pte_offset = ACP6X_SRAM_PTE_OFFSET,
.hw_semaphore_offset = ACP6X_AXI2DAGB_SEM_0, .hw_semaphore_offset = ACP6X_AXI2DAGB_SEM_0,
.acp_clkmux_sel = ACP6X_CLKMUX_SEL,
.fusion_dsp_offset = ACP6X_DSP_FUSION_RUNSTALL, .fusion_dsp_offset = ACP6X_DSP_FUSION_RUNSTALL,
.probe_reg_offset = ACP6X_FUTURE_REG_ACLK_0, .probe_reg_offset = ACP6X_FUTURE_REG_ACLK_0,
}; };
......
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