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.
This commit is contained in:
commit
3c716e7f8a
@ -82,7 +82,7 @@ properties:
|
||||
description:
|
||||
Current at which the headset micbias sense clamp will engage, 0 to
|
||||
disable.
|
||||
enum: [ 0, 14, 23, 41, 50, 60, 68, 86, 95 ]
|
||||
enum: [ 0, 14, 24, 43, 52, 61, 71, 90, 99 ]
|
||||
default: 14
|
||||
|
||||
cirrus,bias-ramp-ms:
|
||||
|
@ -56,6 +56,9 @@ properties:
|
||||
- const: clkext3
|
||||
minItems: 2
|
||||
|
||||
"#sound-dai-cells":
|
||||
const: 0
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
@ -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,
|
||||
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 */
|
||||
int snd_soc_dapm_new_widgets(struct snd_soc_card *card);
|
||||
|
@ -1134,6 +1134,8 @@ struct snd_soc_pcm_runtime {
|
||||
unsigned int pop_wait:1;
|
||||
unsigned int fe_compr:1; /* for Dynamic PCM */
|
||||
|
||||
bool initialized;
|
||||
|
||||
int num_components;
|
||||
struct snd_soc_component *components[]; /* CPU/Codec/Platform */
|
||||
};
|
||||
|
@ -241,6 +241,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
|
||||
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,
|
||||
.matches = {
|
||||
|
@ -706,7 +706,7 @@ static void cs35l56_patch(struct cs35l56_private *cs35l56)
|
||||
|
||||
mutex_lock(&cs35l56->base.irq_lock);
|
||||
|
||||
init_completion(&cs35l56->init_completion);
|
||||
reinit_completion(&cs35l56->init_completion);
|
||||
|
||||
cs35l56->soft_resetting = true;
|
||||
cs35l56_system_reset(&cs35l56->base, !!cs35l56->sdw_peripheral);
|
||||
@ -1197,6 +1197,12 @@ post_soft_reset:
|
||||
/* Registers could be dirty after soft reset or SoundWire enumeration */
|
||||
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;
|
||||
complete(&cs35l56->init_completion);
|
||||
|
||||
|
@ -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_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,
|
||||
|
@ -531,7 +531,10 @@ static int hdmi_codec_fill_codec_params(struct snd_soc_dai *dai,
|
||||
hp->sample_rate = sample_rate;
|
||||
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;
|
||||
}
|
||||
|
@ -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 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_cfg1 = CDC_WSA_RX0_RX_PATH_CFG1;
|
||||
reg = CDC_WSA_RX0_RX_PATH_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_cfg1 = CDC_WSA_RX1_RX_PATH_CFG1;
|
||||
reg = CDC_WSA_RX1_RX_PATH_CTL;
|
||||
|
@ -157,11 +157,6 @@ static int rt5682_i2c_probe(struct i2c_client *i2c)
|
||||
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),
|
||||
rt5682->supplies);
|
||||
if (ret) {
|
||||
@ -169,6 +164,11 @@ static int rt5682_i2c_probe(struct i2c_client *i2c)
|
||||
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);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -293,7 +293,7 @@
|
||||
#define ADC3XXX_BYPASS_RPGA 0x80
|
||||
|
||||
/* MICBIAS control bits */
|
||||
#define ADC3XXX_MICBIAS_MASK 0x2
|
||||
#define ADC3XXX_MICBIAS_MASK 0x3
|
||||
#define ADC3XXX_MICBIAS1_SHIFT 5
|
||||
#define ADC3XXX_MICBIAS2_SHIFT 3
|
||||
|
||||
@ -1099,7 +1099,7 @@ static int adc3xxx_parse_dt_micbias(struct adc3xxx *adc3xxx,
|
||||
unsigned int 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);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -1278,7 +1278,31 @@ static int wcd9380_probe(struct sdw_slave *pdev,
|
||||
pm_runtime_set_active(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[] = {
|
||||
@ -1320,6 +1344,7 @@ static const struct dev_pm_ops wcd938x_sdw_pm_ops = {
|
||||
|
||||
static struct sdw_driver wcd9380_codec_driver = {
|
||||
.probe = wcd9380_probe,
|
||||
.remove = wcd9380_remove,
|
||||
.ops = &wcd9380_slave_ops,
|
||||
.id_table = wcd9380_slave_id,
|
||||
.driver = {
|
||||
|
@ -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");
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
wcd938x_dt_parse_micbias_info(dev, wcd938x);
|
||||
|
||||
@ -3435,7 +3437,8 @@ static int wcd938x_bind(struct device *dev)
|
||||
wcd938x->rxdev = wcd938x_sdw_device_get(wcd938x->rxnode);
|
||||
if (!wcd938x->rxdev) {
|
||||
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]->wcd938x = wcd938x;
|
||||
@ -3443,46 +3446,47 @@ static int wcd938x_bind(struct device *dev)
|
||||
wcd938x->txdev = wcd938x_sdw_device_get(wcd938x->txnode);
|
||||
if (!wcd938x->txdev) {
|
||||
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]->wcd938x = wcd938x;
|
||||
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.
|
||||
* expicilty add the dependency link */
|
||||
if (!device_link_add(wcd938x->rxdev, wcd938x->txdev, DL_FLAG_STATELESS |
|
||||
DL_FLAG_PM_RUNTIME)) {
|
||||
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 |
|
||||
DL_FLAG_PM_RUNTIME)) {
|
||||
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 |
|
||||
DL_FLAG_PM_RUNTIME)) {
|
||||
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);
|
||||
if (!wcd938x->regmap) {
|
||||
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);
|
||||
if (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;
|
||||
@ -3491,27 +3495,45 @@ static int wcd938x_bind(struct device *dev)
|
||||
ret = wcd938x_set_micbias_data(wcd938x);
|
||||
if (ret < 0) {
|
||||
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,
|
||||
wcd938x_dais, ARRAY_SIZE(wcd938x_dais));
|
||||
if (ret)
|
||||
if (ret) {
|
||||
dev_err(dev, "%s: Codec registration failed\n",
|
||||
__func__);
|
||||
goto err_remove_rx_link;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
struct wcd938x_priv *wcd938x = dev_get_drvdata(dev);
|
||||
|
||||
snd_soc_unregister_component(dev);
|
||||
device_link_remove(dev, wcd938x->txdev);
|
||||
device_link_remove(dev, wcd938x->rxdev);
|
||||
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);
|
||||
}
|
||||
|
||||
@ -3572,13 +3594,13 @@ static int wcd938x_probe(struct platform_device *pdev)
|
||||
|
||||
ret = wcd938x_add_slave_components(wcd938x, dev, &match);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_disable_regulators;
|
||||
|
||||
wcd938x_reset(wcd938x);
|
||||
|
||||
ret = component_master_add_with_match(dev, &wcd938x_comp_ops, match);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_disable_regulators;
|
||||
|
||||
pm_runtime_set_autosuspend_delay(dev, 1000);
|
||||
pm_runtime_use_autosuspend(dev);
|
||||
@ -3588,11 +3610,27 @@ static int wcd938x_probe(struct platform_device *pdev)
|
||||
pm_runtime_idle(dev);
|
||||
|
||||
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)
|
||||
{
|
||||
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)
|
||||
|
@ -773,7 +773,7 @@ static int pxa_ssp_probe(struct snd_soc_dai *dai)
|
||||
if (IS_ERR(priv->extclk)) {
|
||||
ret = PTR_ERR(priv->extclk);
|
||||
if (ret == -EPROBE_DEFER)
|
||||
return ret;
|
||||
goto err_priv;
|
||||
|
||||
priv->extclk = NULL;
|
||||
}
|
||||
|
@ -242,6 +242,7 @@ int snd_soc_component_notify_control(struct snd_soc_component *component,
|
||||
char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
|
||||
struct snd_kcontrol *kctl;
|
||||
|
||||
/* When updating, change also snd_soc_dapm_widget_name_cmp() */
|
||||
if (component->name_prefix)
|
||||
snprintf(name, ARRAY_SIZE(name), "%s %s", component->name_prefix, ctl);
|
||||
else
|
||||
|
@ -1347,7 +1347,7 @@ static int soc_init_pcm_runtime(struct snd_soc_card *card,
|
||||
snd_soc_runtime_get_dai_fmt(rtd);
|
||||
ret = snd_soc_runtime_set_dai_fmt(rtd, dai_link->dai_fmt);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err;
|
||||
|
||||
/* add DPCM sysfs entries */
|
||||
soc_dpcm_debugfs_add(rtd);
|
||||
@ -1372,17 +1372,26 @@ static int soc_init_pcm_runtime(struct snd_soc_card *card,
|
||||
/* create compress_device if possible */
|
||||
ret = snd_soc_dai_compress_new(cpu_dai, rtd, num);
|
||||
if (ret != -ENOTSUPP)
|
||||
return ret;
|
||||
goto err;
|
||||
|
||||
/* create the pcm */
|
||||
ret = soc_new_pcm(rtd, num);
|
||||
if (ret < 0) {
|
||||
dev_err(card->dev, "ASoC: can't create pcm %s :%d\n",
|
||||
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,
|
||||
@ -1445,8 +1454,8 @@ static int soc_probe_component(struct snd_soc_card *card,
|
||||
if (component->card) {
|
||||
if (component->card != card) {
|
||||
dev_err(component->dev,
|
||||
"Trying to bind component to card \"%s\" but is already bound to card \"%s\"\n",
|
||||
card->name, component->card->name);
|
||||
"Trying to bind component \"%s\" to card \"%s\" but is already bound to card \"%s\"\n",
|
||||
component->name, card->name, component->card->name);
|
||||
return -ENODEV;
|
||||
}
|
||||
return 0;
|
||||
@ -1980,6 +1989,7 @@ static void soc_cleanup_card_resources(struct snd_soc_card *card)
|
||||
|
||||
/* release machine specific resources */
|
||||
for_each_card_rtds(card, rtd)
|
||||
if (rtd->initialized)
|
||||
snd_soc_link_exit(rtd);
|
||||
/* remove and free each DAI */
|
||||
soc_remove_link_dais(card);
|
||||
|
@ -2728,6 +2728,18 @@ int snd_soc_dapm_update_dai(struct snd_pcm_substream *substream,
|
||||
}
|
||||
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
|
||||
* @w: The widget for which to update the flags
|
||||
|
@ -35,7 +35,6 @@ static const struct sof_amd_acp_desc rembrandt_chip_info = {
|
||||
.dsp_intr_base = ACP6X_DSP_SW_INTR_BASE,
|
||||
.sram_pte_offset = ACP6X_SRAM_PTE_OFFSET,
|
||||
.hw_semaphore_offset = ACP6X_AXI2DAGB_SEM_0,
|
||||
.acp_clkmux_sel = ACP6X_CLKMUX_SEL,
|
||||
.fusion_dsp_offset = ACP6X_DSP_FUSION_RUNSTALL,
|
||||
.probe_reg_offset = ACP6X_FUTURE_REG_ACLK_0,
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user