Commit 8e143296 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branch 'asoc/for-5.15' into asoc-linus

parents 5816b3e6 5d03907b
...@@ -34,6 +34,10 @@ properties: ...@@ -34,6 +34,10 @@ properties:
resets: resets:
maxItems: 1 maxItems: 1
AVDD-supply:
description:
Analogue power supply.
required: required:
- "#sound-dai-cells" - "#sound-dai-cells"
- compatible - compatible
...@@ -41,6 +45,7 @@ required: ...@@ -41,6 +45,7 @@ required:
- clocks - clocks
- clock-names - clock-names
- resets - resets
- AVDD-supply
additionalProperties: false additionalProperties: false
...@@ -56,4 +61,5 @@ examples: ...@@ -56,4 +61,5 @@ examples:
clocks = <&clkc CLKID_AUDIO_CODEC>; clocks = <&clkc CLKID_AUDIO_CODEC>;
clock-names = "pclk"; clock-names = "pclk";
resets = <&reset RESET_AUDIO_CODEC>; resets = <&reset RESET_AUDIO_CODEC>;
AVDD-supply = <&vddao_1v8>;
}; };
...@@ -17883,7 +17883,8 @@ M: Olivier Moysan <olivier.moysan@foss.st.com> ...@@ -17883,7 +17883,8 @@ M: Olivier Moysan <olivier.moysan@foss.st.com>
M: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com> M: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com>
L: alsa-devel@alsa-project.org (moderated for non-subscribers) L: alsa-devel@alsa-project.org (moderated for non-subscribers)
S: Maintained S: Maintained
F: Documentation/devicetree/bindings/iio/adc/st,stm32-*.yaml F: Documentation/devicetree/bindings/iio/adc/st,stm32-dfsdm-adc.yaml
F: Documentation/devicetree/bindings/sound/st,stm32-*.yaml
F: sound/soc/stm/ F: sound/soc/stm/
STM32 TIMER/LPTIMER DRIVERS STM32 TIMER/LPTIMER DRIVERS
......
...@@ -1583,6 +1583,7 @@ config SND_SOC_WCD938X_SDW ...@@ -1583,6 +1583,7 @@ config SND_SOC_WCD938X_SDW
tristate "WCD9380/WCD9385 Codec - SDW" tristate "WCD9380/WCD9385 Codec - SDW"
select SND_SOC_WCD938X select SND_SOC_WCD938X
select SND_SOC_WCD_MBHC select SND_SOC_WCD_MBHC
select REGMAP_IRQ
depends on SOUNDWIRE depends on SOUNDWIRE
select REGMAP_SOUNDWIRE select REGMAP_SOUNDWIRE
help help
......
This diff is collapsed.
...@@ -288,6 +288,7 @@ ...@@ -288,6 +288,7 @@
#define CS42L42_IN_ASRC_CLK (CS42L42_PAGE_12 + 0x0A) #define CS42L42_IN_ASRC_CLK (CS42L42_PAGE_12 + 0x0A)
#define CS42L42_CLK_IASRC_SEL_SHIFT 0 #define CS42L42_CLK_IASRC_SEL_SHIFT 0
#define CS42L42_CLK_IASRC_SEL_MASK (1 << CS42L42_CLK_IASRC_SEL_SHIFT) #define CS42L42_CLK_IASRC_SEL_MASK (1 << CS42L42_CLK_IASRC_SEL_SHIFT)
#define CS42L42_CLK_IASRC_SEL_6 0
#define CS42L42_CLK_IASRC_SEL_12 1 #define CS42L42_CLK_IASRC_SEL_12 1
#define CS42L42_OUT_ASRC_CLK (CS42L42_PAGE_12 + 0x0B) #define CS42L42_OUT_ASRC_CLK (CS42L42_PAGE_12 + 0x0B)
...@@ -761,6 +762,7 @@ ...@@ -761,6 +762,7 @@
#define CS42L42_CLOCK_SWITCH_DELAY_US 150 #define CS42L42_CLOCK_SWITCH_DELAY_US 150
#define CS42L42_PLL_LOCK_POLL_US 250 #define CS42L42_PLL_LOCK_POLL_US 250
#define CS42L42_PLL_LOCK_TIMEOUT_US 1250 #define CS42L42_PLL_LOCK_TIMEOUT_US 1250
#define CS42L42_HP_ADC_EN_TIME_US 20000
static const char *const cs42l42_supply_names[CS42L42_NUM_SUPPLIES] = { static const char *const cs42l42_supply_names[CS42L42_NUM_SUPPLIES] = {
"VA", "VA",
...@@ -794,6 +796,7 @@ struct cs42l42_private { ...@@ -794,6 +796,7 @@ struct cs42l42_private {
u8 hs_bias_ramp_time; u8 hs_bias_ramp_time;
u8 hs_bias_sense_en; u8 hs_bias_sense_en;
u8 stream_use; u8 stream_use;
bool hp_adc_up_pending;
}; };
#endif /* __CS42L42_H__ */ #endif /* __CS42L42_H__ */
...@@ -305,12 +305,19 @@ static int cs4341_spi_probe(struct spi_device *spi) ...@@ -305,12 +305,19 @@ static int cs4341_spi_probe(struct spi_device *spi)
return cs4341_probe(&spi->dev); return cs4341_probe(&spi->dev);
} }
static const struct spi_device_id cs4341_spi_ids[] = {
{ "cs4341a" },
{ }
};
MODULE_DEVICE_TABLE(spi, cs4341_spi_ids);
static struct spi_driver cs4341_spi_driver = { static struct spi_driver cs4341_spi_driver = {
.driver = { .driver = {
.name = "cs4341-spi", .name = "cs4341-spi",
.of_match_table = of_match_ptr(cs4341_dt_ids), .of_match_table = of_match_ptr(cs4341_dt_ids),
}, },
.probe = cs4341_spi_probe, .probe = cs4341_spi_probe,
.id_table = cs4341_spi_ids,
}; };
#endif #endif
......
...@@ -867,8 +867,8 @@ static void nau8824_jdet_work(struct work_struct *work) ...@@ -867,8 +867,8 @@ static void nau8824_jdet_work(struct work_struct *work)
struct regmap *regmap = nau8824->regmap; struct regmap *regmap = nau8824->regmap;
int adc_value, event = 0, event_mask = 0; int adc_value, event = 0, event_mask = 0;
snd_soc_dapm_enable_pin(dapm, "MICBIAS"); snd_soc_dapm_force_enable_pin(dapm, "MICBIAS");
snd_soc_dapm_enable_pin(dapm, "SAR"); snd_soc_dapm_force_enable_pin(dapm, "SAR");
snd_soc_dapm_sync(dapm); snd_soc_dapm_sync(dapm);
msleep(100); msleep(100);
......
...@@ -36,6 +36,7 @@ static const struct of_device_id pcm179x_of_match[] = { ...@@ -36,6 +36,7 @@ static const struct of_device_id pcm179x_of_match[] = {
MODULE_DEVICE_TABLE(of, pcm179x_of_match); MODULE_DEVICE_TABLE(of, pcm179x_of_match);
static const struct spi_device_id pcm179x_spi_ids[] = { static const struct spi_device_id pcm179x_spi_ids[] = {
{ "pcm1792a", 0 },
{ "pcm179x", 0 }, { "pcm179x", 0 },
{ }, { },
}; };
......
...@@ -116,6 +116,8 @@ static const struct reg_default pcm512x_reg_defaults[] = { ...@@ -116,6 +116,8 @@ static const struct reg_default pcm512x_reg_defaults[] = {
{ PCM512x_FS_SPEED_MODE, 0x00 }, { PCM512x_FS_SPEED_MODE, 0x00 },
{ PCM512x_IDAC_1, 0x01 }, { PCM512x_IDAC_1, 0x01 },
{ PCM512x_IDAC_2, 0x00 }, { PCM512x_IDAC_2, 0x00 },
{ PCM512x_I2S_1, 0x02 },
{ PCM512x_I2S_2, 0x00 },
}; };
static bool pcm512x_readable(struct device *dev, unsigned int reg) static bool pcm512x_readable(struct device *dev, unsigned int reg)
......
...@@ -4144,10 +4144,10 @@ static int wcd938x_codec_set_jack(struct snd_soc_component *comp, ...@@ -4144,10 +4144,10 @@ static int wcd938x_codec_set_jack(struct snd_soc_component *comp,
{ {
struct wcd938x_priv *wcd = dev_get_drvdata(comp->dev); struct wcd938x_priv *wcd = dev_get_drvdata(comp->dev);
if (!jack) if (jack)
return wcd_mbhc_start(wcd->wcd_mbhc, &wcd->mbhc_cfg, jack); return wcd_mbhc_start(wcd->wcd_mbhc, &wcd->mbhc_cfg, jack);
else
wcd_mbhc_stop(wcd->wcd_mbhc); wcd_mbhc_stop(wcd->wcd_mbhc);
return 0; return 0;
} }
......
...@@ -742,9 +742,16 @@ static int wm8960_configure_clocking(struct snd_soc_component *component) ...@@ -742,9 +742,16 @@ static int wm8960_configure_clocking(struct snd_soc_component *component)
int i, j, k; int i, j, k;
int ret; int ret;
if (!(iface1 & (1<<6))) { /*
dev_dbg(component->dev, * For Slave mode clocking should still be configured,
"Codec is slave mode, no need to configure clock\n"); * so this if statement should be removed, but some platform
* may not work if the sysclk is not configured, to avoid such
* compatible issue, just add '!wm8960->sysclk' condition in
* this if statement.
*/
if (!(iface1 & (1 << 6)) && !wm8960->sysclk) {
dev_warn(component->dev,
"slave mode, but proceeding with no clock configuration\n");
return 0; return 0;
} }
......
...@@ -1073,6 +1073,16 @@ static int fsl_esai_probe(struct platform_device *pdev) ...@@ -1073,6 +1073,16 @@ static int fsl_esai_probe(struct platform_device *pdev)
if (ret < 0) if (ret < 0)
goto err_pm_get_sync; goto err_pm_get_sync;
/*
* Register platform component before registering cpu dai for there
* is not defer probe for platform component in snd_soc_add_pcm_runtime().
*/
ret = imx_pcm_dma_init(pdev, IMX_ESAI_DMABUF_SIZE);
if (ret) {
dev_err(&pdev->dev, "failed to init imx pcm dma: %d\n", ret);
goto err_pm_get_sync;
}
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_esai_component, ret = devm_snd_soc_register_component(&pdev->dev, &fsl_esai_component,
&fsl_esai_dai, 1); &fsl_esai_dai, 1);
if (ret) { if (ret) {
...@@ -1082,12 +1092,6 @@ static int fsl_esai_probe(struct platform_device *pdev) ...@@ -1082,12 +1092,6 @@ static int fsl_esai_probe(struct platform_device *pdev)
INIT_WORK(&esai_priv->work, fsl_esai_hw_reset); INIT_WORK(&esai_priv->work, fsl_esai_hw_reset);
ret = imx_pcm_dma_init(pdev, IMX_ESAI_DMABUF_SIZE);
if (ret) {
dev_err(&pdev->dev, "failed to init imx pcm dma: %d\n", ret);
goto err_pm_get_sync;
}
return ret; return ret;
err_pm_get_sync: err_pm_get_sync:
......
...@@ -737,18 +737,23 @@ static int fsl_micfil_probe(struct platform_device *pdev) ...@@ -737,18 +737,23 @@ static int fsl_micfil_probe(struct platform_device *pdev)
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
regcache_cache_only(micfil->regmap, true); regcache_cache_only(micfil->regmap, true);
/*
* Register platform component before registering cpu dai for there
* is not defer probe for platform component in snd_soc_add_pcm_runtime().
*/
ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
if (ret) {
dev_err(&pdev->dev, "failed to pcm register\n");
return ret;
}
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_micfil_component, ret = devm_snd_soc_register_component(&pdev->dev, &fsl_micfil_component,
&fsl_micfil_dai, 1); &fsl_micfil_dai, 1);
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to register component %s\n", dev_err(&pdev->dev, "failed to register component %s\n",
fsl_micfil_component.name); fsl_micfil_component.name);
return ret;
} }
ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
if (ret)
dev_err(&pdev->dev, "failed to pcm register\n");
return ret; return ret;
} }
......
...@@ -1152,11 +1152,10 @@ static int fsl_sai_probe(struct platform_device *pdev) ...@@ -1152,11 +1152,10 @@ static int fsl_sai_probe(struct platform_device *pdev)
if (ret < 0) if (ret < 0)
goto err_pm_get_sync; goto err_pm_get_sync;
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_component, /*
&sai->cpu_dai_drv, 1); * Register platform component before registering cpu dai for there
if (ret) * is not defer probe for platform component in snd_soc_add_pcm_runtime().
goto err_pm_get_sync; */
if (sai->soc_data->use_imx_pcm) { if (sai->soc_data->use_imx_pcm) {
ret = imx_pcm_dma_init(pdev, IMX_SAI_DMABUF_SIZE); ret = imx_pcm_dma_init(pdev, IMX_SAI_DMABUF_SIZE);
if (ret) if (ret)
...@@ -1167,6 +1166,11 @@ static int fsl_sai_probe(struct platform_device *pdev) ...@@ -1167,6 +1166,11 @@ static int fsl_sai_probe(struct platform_device *pdev)
goto err_pm_get_sync; goto err_pm_get_sync;
} }
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_component,
&sai->cpu_dai_drv, 1);
if (ret)
goto err_pm_get_sync;
return ret; return ret;
err_pm_get_sync: err_pm_get_sync:
......
...@@ -1434,16 +1434,20 @@ static int fsl_spdif_probe(struct platform_device *pdev) ...@@ -1434,16 +1434,20 @@ static int fsl_spdif_probe(struct platform_device *pdev)
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
regcache_cache_only(spdif_priv->regmap, true); regcache_cache_only(spdif_priv->regmap, true);
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_spdif_component, /*
&spdif_priv->cpu_dai_drv, 1); * Register platform component before registering cpu dai for there
* is not defer probe for platform component in snd_soc_add_pcm_runtime().
*/
ret = imx_pcm_dma_init(pdev, IMX_SPDIF_DMABUF_SIZE);
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to register DAI: %d\n", ret); dev_err_probe(&pdev->dev, ret, "imx_pcm_dma_init failed\n");
goto err_pm_disable; goto err_pm_disable;
} }
ret = imx_pcm_dma_init(pdev, IMX_SPDIF_DMABUF_SIZE); ret = devm_snd_soc_register_component(&pdev->dev, &fsl_spdif_component,
&spdif_priv->cpu_dai_drv, 1);
if (ret) { if (ret) {
dev_err_probe(&pdev->dev, ret, "imx_pcm_dma_init failed\n"); dev_err(&pdev->dev, "failed to register DAI: %d\n", ret);
goto err_pm_disable; goto err_pm_disable;
} }
......
...@@ -487,8 +487,9 @@ static int fsl_xcvr_prepare(struct snd_pcm_substream *substream, ...@@ -487,8 +487,9 @@ static int fsl_xcvr_prepare(struct snd_pcm_substream *substream,
return ret; return ret;
} }
/* clear DPATH RESET */ /* set DPATH RESET */
m_ctl |= FSL_XCVR_EXT_CTRL_DPTH_RESET(tx); m_ctl |= FSL_XCVR_EXT_CTRL_DPTH_RESET(tx);
v_ctl |= FSL_XCVR_EXT_CTRL_DPTH_RESET(tx);
ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL, m_ctl, v_ctl); ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL, m_ctl, v_ctl);
if (ret < 0) { if (ret < 0) {
dev_err(dai->dev, "Error while setting EXT_CTRL: %d\n", ret); dev_err(dai->dev, "Error while setting EXT_CTRL: %d\n", ret);
...@@ -590,10 +591,6 @@ static void fsl_xcvr_shutdown(struct snd_pcm_substream *substream, ...@@ -590,10 +591,6 @@ static void fsl_xcvr_shutdown(struct snd_pcm_substream *substream,
val |= FSL_XCVR_EXT_CTRL_CMDC_RESET(tx); val |= FSL_XCVR_EXT_CTRL_CMDC_RESET(tx);
} }
/* set DPATH RESET */
mask |= FSL_XCVR_EXT_CTRL_DPTH_RESET(tx);
val |= FSL_XCVR_EXT_CTRL_DPTH_RESET(tx);
ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL, mask, val); ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL, mask, val);
if (ret < 0) { if (ret < 0) {
dev_err(dai->dev, "Err setting DPATH RESET: %d\n", ret); dev_err(dai->dev, "Err setting DPATH RESET: %d\n", ret);
...@@ -643,6 +640,16 @@ static int fsl_xcvr_trigger(struct snd_pcm_substream *substream, int cmd, ...@@ -643,6 +640,16 @@ static int fsl_xcvr_trigger(struct snd_pcm_substream *substream, int cmd,
dev_err(dai->dev, "Failed to enable DMA: %d\n", ret); dev_err(dai->dev, "Failed to enable DMA: %d\n", ret);
return ret; return ret;
} }
/* clear DPATH RESET */
ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL,
FSL_XCVR_EXT_CTRL_DPTH_RESET(tx),
0);
if (ret < 0) {
dev_err(dai->dev, "Failed to clear DPATH RESET: %d\n", ret);
return ret;
}
break; break;
case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_STOP:
case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_SUSPEND:
...@@ -1215,18 +1222,23 @@ static int fsl_xcvr_probe(struct platform_device *pdev) ...@@ -1215,18 +1222,23 @@ static int fsl_xcvr_probe(struct platform_device *pdev)
pm_runtime_enable(dev); pm_runtime_enable(dev);
regcache_cache_only(xcvr->regmap, true); regcache_cache_only(xcvr->regmap, true);
/*
* Register platform component before registering cpu dai for there
* is not defer probe for platform component in snd_soc_add_pcm_runtime().
*/
ret = devm_snd_dmaengine_pcm_register(dev, NULL, 0);
if (ret) {
dev_err(dev, "failed to pcm register\n");
return ret;
}
ret = devm_snd_soc_register_component(dev, &fsl_xcvr_comp, ret = devm_snd_soc_register_component(dev, &fsl_xcvr_comp,
&fsl_xcvr_dai, 1); &fsl_xcvr_dai, 1);
if (ret) { if (ret) {
dev_err(dev, "failed to register component %s\n", dev_err(dev, "failed to register component %s\n",
fsl_xcvr_comp.name); fsl_xcvr_comp.name);
return ret;
} }
ret = devm_snd_dmaengine_pcm_register(dev, NULL, 0);
if (ret)
dev_err(dev, "failed to pcm register\n");
return ret; return ret;
} }
......
...@@ -456,12 +456,12 @@ static const struct dmi_system_id byt_cht_es8316_quirk_table[] = { ...@@ -456,12 +456,12 @@ static const struct dmi_system_id byt_cht_es8316_quirk_table[] = {
static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev) static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev;
static const char * const mic_name[] = { "in1", "in2" }; static const char * const mic_name[] = { "in1", "in2" };
struct snd_soc_acpi_mach *mach = dev_get_platdata(dev);
struct property_entry props[MAX_NO_PROPS] = {}; struct property_entry props[MAX_NO_PROPS] = {};
struct byt_cht_es8316_private *priv; struct byt_cht_es8316_private *priv;
const struct dmi_system_id *dmi_id; const struct dmi_system_id *dmi_id;
struct device *dev = &pdev->dev;
struct snd_soc_acpi_mach *mach;
struct fwnode_handle *fwnode; struct fwnode_handle *fwnode;
const char *platform_name; const char *platform_name;
struct acpi_device *adev; struct acpi_device *adev;
...@@ -476,7 +476,6 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev) ...@@ -476,7 +476,6 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
if (!priv) if (!priv)
return -ENOMEM; return -ENOMEM;
mach = dev->platform_data;
/* fix index of codec dai */ /* fix index of codec dai */
for (i = 0; i < ARRAY_SIZE(byt_cht_es8316_dais); i++) { for (i = 0; i < ARRAY_SIZE(byt_cht_es8316_dais); i++) {
if (!strcmp(byt_cht_es8316_dais[i].codecs->name, if (!strcmp(byt_cht_es8316_dais[i].codecs->name,
...@@ -494,7 +493,7 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev) ...@@ -494,7 +493,7 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
put_device(&adev->dev); put_device(&adev->dev);
byt_cht_es8316_dais[dai_index].codecs->name = codec_name; byt_cht_es8316_dais[dai_index].codecs->name = codec_name;
} else { } else {
dev_err(&pdev->dev, "Error cannot find '%s' dev\n", mach->id); dev_err(dev, "Error cannot find '%s' dev\n", mach->id);
return -ENXIO; return -ENXIO;
} }
...@@ -533,11 +532,8 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev) ...@@ -533,11 +532,8 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
/* get the clock */ /* get the clock */
priv->mclk = devm_clk_get(dev, "pmc_plt_clk_3"); priv->mclk = devm_clk_get(dev, "pmc_plt_clk_3");
if (IS_ERR(priv->mclk)) { if (IS_ERR(priv->mclk))
ret = PTR_ERR(priv->mclk); return dev_err_probe(dev, PTR_ERR(priv->mclk), "clk_get pmc_plt_clk_3 failed\n");
dev_err(dev, "clk_get pmc_plt_clk_3 failed: %d\n", ret);
return ret;
}
/* get speaker enable GPIO */ /* get speaker enable GPIO */
codec_dev = acpi_get_first_physical_node(adev); codec_dev = acpi_get_first_physical_node(adev);
...@@ -567,22 +563,13 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev) ...@@ -567,22 +563,13 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
devm_acpi_dev_add_driver_gpios(codec_dev, byt_cht_es8316_gpios); devm_acpi_dev_add_driver_gpios(codec_dev, byt_cht_es8316_gpios);
priv->speaker_en_gpio = priv->speaker_en_gpio =
gpiod_get_index(codec_dev, "speaker-enable", 0, gpiod_get_optional(codec_dev, "speaker-enable",
/* see comment in byt_cht_es8316_resume */ /* see comment in byt_cht_es8316_resume() */
GPIOD_OUT_LOW | GPIOD_FLAGS_BIT_NONEXCLUSIVE); GPIOD_OUT_LOW | GPIOD_FLAGS_BIT_NONEXCLUSIVE);
if (IS_ERR(priv->speaker_en_gpio)) { if (IS_ERR(priv->speaker_en_gpio)) {
ret = PTR_ERR(priv->speaker_en_gpio); ret = dev_err_probe(dev, PTR_ERR(priv->speaker_en_gpio),
switch (ret) { "get speaker GPIO failed\n");
case -ENOENT: goto err_put_codec;
priv->speaker_en_gpio = NULL;
break;
default:
dev_err(dev, "get speaker GPIO failed: %d\n", ret);
fallthrough;
case -EPROBE_DEFER:
goto err_put_codec;
}
} }
snprintf(components_string, sizeof(components_string), snprintf(components_string, sizeof(components_string),
...@@ -597,7 +584,7 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev) ...@@ -597,7 +584,7 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
byt_cht_es8316_card.long_name = long_name; byt_cht_es8316_card.long_name = long_name;
#endif #endif
sof_parent = snd_soc_acpi_sof_parent(&pdev->dev); sof_parent = snd_soc_acpi_sof_parent(dev);
/* set card and driver name */ /* set card and driver name */
if (sof_parent) { if (sof_parent) {
......
...@@ -929,6 +929,11 @@ static int create_sdw_dailink(struct snd_soc_card *card, ...@@ -929,6 +929,11 @@ static int create_sdw_dailink(struct snd_soc_card *card,
cpus + *cpu_id, cpu_dai_num, cpus + *cpu_id, cpu_dai_num,
codecs, codec_num, codecs, codec_num,
NULL, &sdw_ops); NULL, &sdw_ops);
/*
* SoundWire DAILINKs use 'stream' functions and Bank Switch operations
* based on wait_for_completion(), tag them as 'nonatomic'.
*/
dai_links[*be_index].nonatomic = true;
ret = set_codec_init_func(card, link, dai_links + (*be_index)++, ret = set_codec_init_func(card, link, dai_links + (*be_index)++,
playback, group_id); playback, group_id);
......
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
config SND_SOC_MEDIATEK config SND_SOC_MEDIATEK
tristate tristate
select REGMAP_MMIO
config SND_SOC_MT2701 config SND_SOC_MT2701
tristate "ASoC support for Mediatek MT2701 chip" tristate "ASoC support for Mediatek MT2701 chip"
...@@ -188,7 +189,9 @@ config SND_SOC_MT8192_MT6359_RT1015_RT5682 ...@@ -188,7 +189,9 @@ config SND_SOC_MT8192_MT6359_RT1015_RT5682
config SND_SOC_MT8195 config SND_SOC_MT8195
tristate "ASoC support for Mediatek MT8195 chip" tristate "ASoC support for Mediatek MT8195 chip"
depends on ARCH_MEDIATEK || COMPILE_TEST depends on ARCH_MEDIATEK || COMPILE_TEST
depends on COMMON_CLK
select SND_SOC_MEDIATEK select SND_SOC_MEDIATEK
select MFD_SYSCON if SND_SOC_MT6359
help help
This adds ASoC platform driver support for Mediatek MT8195 chip This adds ASoC platform driver support for Mediatek MT8195 chip
that can be used with other codecs. that can be used with other codecs.
......
...@@ -334,9 +334,11 @@ int mtk_afe_suspend(struct snd_soc_component *component) ...@@ -334,9 +334,11 @@ int mtk_afe_suspend(struct snd_soc_component *component)
devm_kcalloc(dev, afe->reg_back_up_list_num, devm_kcalloc(dev, afe->reg_back_up_list_num,
sizeof(unsigned int), GFP_KERNEL); sizeof(unsigned int), GFP_KERNEL);
for (i = 0; i < afe->reg_back_up_list_num; i++) if (afe->reg_back_up) {
regmap_read(regmap, afe->reg_back_up_list[i], for (i = 0; i < afe->reg_back_up_list_num; i++)
&afe->reg_back_up[i]); regmap_read(regmap, afe->reg_back_up_list[i],
&afe->reg_back_up[i]);
}
afe->suspended = true; afe->suspended = true;
afe->runtime_suspend(dev); afe->runtime_suspend(dev);
...@@ -356,12 +358,13 @@ int mtk_afe_resume(struct snd_soc_component *component) ...@@ -356,12 +358,13 @@ int mtk_afe_resume(struct snd_soc_component *component)
afe->runtime_resume(dev); afe->runtime_resume(dev);
if (!afe->reg_back_up) if (!afe->reg_back_up) {
dev_dbg(dev, "%s no reg_backup\n", __func__); dev_dbg(dev, "%s no reg_backup\n", __func__);
} else {
for (i = 0; i < afe->reg_back_up_list_num; i++) for (i = 0; i < afe->reg_back_up_list_num; i++)
mtk_regmap_write(regmap, afe->reg_back_up_list[i], mtk_regmap_write(regmap, afe->reg_back_up_list[i],
afe->reg_back_up[i]); afe->reg_back_up[i]);
}
afe->suspended = false; afe->suspended = false;
return 0; return 0;
......
...@@ -424,8 +424,8 @@ static int mt8195_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd) ...@@ -424,8 +424,8 @@ static int mt8195_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd)
return snd_soc_component_set_jack(cmpnt_codec, &priv->hdmi_jack, NULL); return snd_soc_component_set_jack(cmpnt_codec, &priv->hdmi_jack, NULL);
} }
static int mt8195_hdmitx_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, static int mt8195_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
struct snd_pcm_hw_params *params) struct snd_pcm_hw_params *params)
{ {
/* fix BE i2s format to 32bit, clean param mask first */ /* fix BE i2s format to 32bit, clean param mask first */
...@@ -902,7 +902,7 @@ static struct snd_soc_dai_link mt8195_mt6359_rt1019_rt5682_dai_links[] = { ...@@ -902,7 +902,7 @@ static struct snd_soc_dai_link mt8195_mt6359_rt1019_rt5682_dai_links[] = {
.no_pcm = 1, .no_pcm = 1,
.dpcm_playback = 1, .dpcm_playback = 1,
.ops = &mt8195_dptx_ops, .ops = &mt8195_dptx_ops,
.be_hw_params_fixup = mt8195_hdmitx_dptx_hw_params_fixup, .be_hw_params_fixup = mt8195_dptx_hw_params_fixup,
SND_SOC_DAILINK_REG(DPTX_BE), SND_SOC_DAILINK_REG(DPTX_BE),
}, },
[DAI_LINK_ETDM1_IN_BE] = { [DAI_LINK_ETDM1_IN_BE] = {
...@@ -953,7 +953,6 @@ static struct snd_soc_dai_link mt8195_mt6359_rt1019_rt5682_dai_links[] = { ...@@ -953,7 +953,6 @@ static struct snd_soc_dai_link mt8195_mt6359_rt1019_rt5682_dai_links[] = {
SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBS_CFS, SND_SOC_DAIFMT_CBS_CFS,
.dpcm_playback = 1, .dpcm_playback = 1,
.be_hw_params_fixup = mt8195_hdmitx_dptx_hw_params_fixup,
SND_SOC_DAILINK_REG(ETDM3_OUT_BE), SND_SOC_DAILINK_REG(ETDM3_OUT_BE),
}, },
[DAI_LINK_PCM1_BE] = { [DAI_LINK_PCM1_BE] = {
......
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# ROCKCHIP Platform Support # ROCKCHIP Platform Support
snd-soc-rockchip-i2s-objs := rockchip_i2s.o snd-soc-rockchip-i2s-objs := rockchip_i2s.o
snd-soc-rockchip-pcm-objs := rockchip_pcm.o
snd-soc-rockchip-pdm-objs := rockchip_pdm.o snd-soc-rockchip-pdm-objs := rockchip_pdm.o
snd-soc-rockchip-spdif-objs := rockchip_spdif.o snd-soc-rockchip-spdif-objs := rockchip_spdif.o
obj-$(CONFIG_SND_SOC_ROCKCHIP_I2S) += snd-soc-rockchip-i2s.o snd-soc-rockchip-pcm.o obj-$(CONFIG_SND_SOC_ROCKCHIP_I2S) += snd-soc-rockchip-i2s.o
obj-$(CONFIG_SND_SOC_ROCKCHIP_PDM) += snd-soc-rockchip-pdm.o obj-$(CONFIG_SND_SOC_ROCKCHIP_PDM) += snd-soc-rockchip-pdm.o
obj-$(CONFIG_SND_SOC_ROCKCHIP_SPDIF) += snd-soc-rockchip-spdif.o obj-$(CONFIG_SND_SOC_ROCKCHIP_SPDIF) += snd-soc-rockchip-spdif.o
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
#include <sound/dmaengine_pcm.h> #include <sound/dmaengine_pcm.h>
#include "rockchip_i2s.h" #include "rockchip_i2s.h"
#include "rockchip_pcm.h"
#define DRV_NAME "rockchip-i2s" #define DRV_NAME "rockchip-i2s"
...@@ -756,7 +755,7 @@ static int rockchip_i2s_probe(struct platform_device *pdev) ...@@ -756,7 +755,7 @@ static int rockchip_i2s_probe(struct platform_device *pdev)
goto err_suspend; goto err_suspend;
} }
ret = rockchip_pcm_platform_register(&pdev->dev); ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
if (ret) { if (ret) {
dev_err(&pdev->dev, "Could not register PCM\n"); dev_err(&pdev->dev, "Could not register PCM\n");
goto err_suspend; goto err_suspend;
......
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2018 Rockchip Electronics Co. Ltd.
*/
#include <linux/device.h>
#include <linux/init.h>
#include <linux/module.h>
#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/soc.h>
#include <sound/dmaengine_pcm.h>
#include "rockchip_pcm.h"
static const struct snd_pcm_hardware snd_rockchip_hardware = {
.info = SNDRV_PCM_INFO_MMAP |
SNDRV_PCM_INFO_MMAP_VALID |
SNDRV_PCM_INFO_PAUSE |
SNDRV_PCM_INFO_RESUME |
SNDRV_PCM_INFO_INTERLEAVED,
.period_bytes_min = 32,
.period_bytes_max = 8192,
.periods_min = 1,
.periods_max = 52,
.buffer_bytes_max = 64 * 1024,
.fifo_size = 32,
};
static const struct snd_dmaengine_pcm_config rk_dmaengine_pcm_config = {
.pcm_hardware = &snd_rockchip_hardware,
.prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config,
.prealloc_buffer_size = 32 * 1024,
};
int rockchip_pcm_platform_register(struct device *dev)
{
return devm_snd_dmaengine_pcm_register(dev, &rk_dmaengine_pcm_config,
SND_DMAENGINE_PCM_FLAG_COMPAT);
}
EXPORT_SYMBOL_GPL(rockchip_pcm_platform_register);
MODULE_LICENSE("GPL v2");
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2018 Rockchip Electronics Co. Ltd.
*/
#ifndef _ROCKCHIP_PCM_H
#define _ROCKCHIP_PCM_H
int rockchip_pcm_platform_register(struct device *dev);
#endif
...@@ -2599,6 +2599,7 @@ int snd_soc_component_initialize(struct snd_soc_component *component, ...@@ -2599,6 +2599,7 @@ int snd_soc_component_initialize(struct snd_soc_component *component,
INIT_LIST_HEAD(&component->dai_list); INIT_LIST_HEAD(&component->dai_list);
INIT_LIST_HEAD(&component->dobj_list); INIT_LIST_HEAD(&component->dobj_list);
INIT_LIST_HEAD(&component->card_list); INIT_LIST_HEAD(&component->card_list);
INIT_LIST_HEAD(&component->list);
mutex_init(&component->io_mutex); mutex_init(&component->io_mutex);
component->name = fmt_single_name(dev, &component->id); component->name = fmt_single_name(dev, &component->id);
......
...@@ -2561,6 +2561,7 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm, ...@@ -2561,6 +2561,7 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
const char *pin, int status) const char *pin, int status)
{ {
struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true); struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
int ret = 0;
dapm_assert_locked(dapm); dapm_assert_locked(dapm);
...@@ -2573,13 +2574,14 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm, ...@@ -2573,13 +2574,14 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
dapm_mark_dirty(w, "pin configuration"); dapm_mark_dirty(w, "pin configuration");
dapm_widget_invalidate_input_paths(w); dapm_widget_invalidate_input_paths(w);
dapm_widget_invalidate_output_paths(w); dapm_widget_invalidate_output_paths(w);
ret = 1;
} }
w->connected = status; w->connected = status;
if (status == 0) if (status == 0)
w->force = 0; w->force = 0;
return 0; return ret;
} }
/** /**
...@@ -3583,14 +3585,15 @@ int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol, ...@@ -3583,14 +3585,15 @@ int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,
{ {
struct snd_soc_card *card = snd_kcontrol_chip(kcontrol); struct snd_soc_card *card = snd_kcontrol_chip(kcontrol);
const char *pin = (const char *)kcontrol->private_value; const char *pin = (const char *)kcontrol->private_value;
int ret;
if (ucontrol->value.integer.value[0]) if (ucontrol->value.integer.value[0])
snd_soc_dapm_enable_pin(&card->dapm, pin); ret = snd_soc_dapm_enable_pin(&card->dapm, pin);
else else
snd_soc_dapm_disable_pin(&card->dapm, pin); ret = snd_soc_dapm_disable_pin(&card->dapm, pin);
snd_soc_dapm_sync(&card->dapm); snd_soc_dapm_sync(&card->dapm);
return 0; return ret;
} }
EXPORT_SYMBOL_GPL(snd_soc_dapm_put_pin_switch); EXPORT_SYMBOL_GPL(snd_soc_dapm_put_pin_switch);
...@@ -4023,7 +4026,7 @@ static int snd_soc_dapm_dai_link_put(struct snd_kcontrol *kcontrol, ...@@ -4023,7 +4026,7 @@ static int snd_soc_dapm_dai_link_put(struct snd_kcontrol *kcontrol,
rtd->params_select = ucontrol->value.enumerated.item[0]; rtd->params_select = ucontrol->value.enumerated.item[0];
return 0; return 1;
} }
static void static void
......
...@@ -371,7 +371,6 @@ int snd_sof_device_remove(struct device *dev) ...@@ -371,7 +371,6 @@ int snd_sof_device_remove(struct device *dev)
dev_warn(dev, "error: %d failed to prepare DSP for device removal", dev_warn(dev, "error: %d failed to prepare DSP for device removal",
ret); ret);
snd_sof_fw_unload(sdev);
snd_sof_ipc_free(sdev); snd_sof_ipc_free(sdev);
snd_sof_free_debug(sdev); snd_sof_free_debug(sdev);
snd_sof_free_trace(sdev); snd_sof_free_trace(sdev);
...@@ -394,8 +393,7 @@ int snd_sof_device_remove(struct device *dev) ...@@ -394,8 +393,7 @@ int snd_sof_device_remove(struct device *dev)
snd_sof_remove(sdev); snd_sof_remove(sdev);
/* release firmware */ /* release firmware */
release_firmware(pdata->fw); snd_sof_fw_unload(sdev);
pdata->fw = NULL;
return 0; return 0;
} }
......
...@@ -365,7 +365,14 @@ static int imx8_remove(struct snd_sof_dev *sdev) ...@@ -365,7 +365,14 @@ static int imx8_remove(struct snd_sof_dev *sdev)
/* on i.MX8 there is 1 to 1 match between type and BAR idx */ /* on i.MX8 there is 1 to 1 match between type and BAR idx */
static int imx8_get_bar_index(struct snd_sof_dev *sdev, u32 type) static int imx8_get_bar_index(struct snd_sof_dev *sdev, u32 type)
{ {
return type; /* Only IRAM and SRAM bars are valid */
switch (type) {
case SOF_FW_BLK_TYPE_IRAM:
case SOF_FW_BLK_TYPE_SRAM:
return type;
default:
return -EINVAL;
}
} }
static void imx8_ipc_msg_data(struct snd_sof_dev *sdev, static void imx8_ipc_msg_data(struct snd_sof_dev *sdev,
......
...@@ -228,7 +228,14 @@ static int imx8m_remove(struct snd_sof_dev *sdev) ...@@ -228,7 +228,14 @@ static int imx8m_remove(struct snd_sof_dev *sdev)
/* on i.MX8 there is 1 to 1 match between type and BAR idx */ /* on i.MX8 there is 1 to 1 match between type and BAR idx */
static int imx8m_get_bar_index(struct snd_sof_dev *sdev, u32 type) static int imx8m_get_bar_index(struct snd_sof_dev *sdev, u32 type)
{ {
return type; /* Only IRAM and SRAM bars are valid */
switch (type) {
case SOF_FW_BLK_TYPE_IRAM:
case SOF_FW_BLK_TYPE_SRAM:
return type;
default:
return -EINVAL;
}
} }
static void imx8m_ipc_msg_data(struct snd_sof_dev *sdev, static void imx8m_ipc_msg_data(struct snd_sof_dev *sdev,
......
...@@ -729,10 +729,10 @@ int snd_sof_load_firmware_raw(struct snd_sof_dev *sdev) ...@@ -729,10 +729,10 @@ int snd_sof_load_firmware_raw(struct snd_sof_dev *sdev)
ret = request_firmware(&plat_data->fw, fw_filename, sdev->dev); ret = request_firmware(&plat_data->fw, fw_filename, sdev->dev);
if (ret < 0) { if (ret < 0) {
dev_err(sdev->dev, "error: request firmware %s failed err: %d\n",
fw_filename, ret);
dev_err(sdev->dev, dev_err(sdev->dev,
"you may need to download the firmware from https://github.com/thesofproject/sof-bin/\n"); "error: sof firmware file is missing, you might need to\n");
dev_err(sdev->dev,
" download it from https://github.com/thesofproject/sof-bin/\n");
goto err; goto err;
} else { } else {
dev_dbg(sdev->dev, "request_firmware %s successful\n", dev_dbg(sdev->dev, "request_firmware %s successful\n",
...@@ -880,5 +880,7 @@ EXPORT_SYMBOL(snd_sof_run_firmware); ...@@ -880,5 +880,7 @@ EXPORT_SYMBOL(snd_sof_run_firmware);
void snd_sof_fw_unload(struct snd_sof_dev *sdev) void snd_sof_fw_unload(struct snd_sof_dev *sdev)
{ {
/* TODO: support module unloading at runtime */ /* TODO: support module unloading at runtime */
release_firmware(sdev->pdata->fw);
sdev->pdata->fw = NULL;
} }
EXPORT_SYMBOL(snd_sof_fw_unload); EXPORT_SYMBOL(snd_sof_fw_unload);
...@@ -530,7 +530,6 @@ void snd_sof_trace_notify_for_error(struct snd_sof_dev *sdev) ...@@ -530,7 +530,6 @@ void snd_sof_trace_notify_for_error(struct snd_sof_dev *sdev)
return; return;
if (sdev->dtrace_is_enabled) { if (sdev->dtrace_is_enabled) {
dev_err(sdev->dev, "error: waking up any trace sleepers\n");
sdev->dtrace_error = true; sdev->dtrace_error = true;
wake_up(&sdev->trace_sleep); wake_up(&sdev->trace_sleep);
} }
......
...@@ -122,9 +122,9 @@ static void xtensa_stack(struct snd_sof_dev *sdev, void *oops, u32 *stack, ...@@ -122,9 +122,9 @@ static void xtensa_stack(struct snd_sof_dev *sdev, void *oops, u32 *stack,
* 0x0049fbb0: 8000f2d0 0049fc00 6f6c6c61 00632e63 * 0x0049fbb0: 8000f2d0 0049fc00 6f6c6c61 00632e63
*/ */
for (i = 0; i < stack_words; i += 4) { for (i = 0; i < stack_words; i += 4) {
hex_dump_to_buffer(stack + i * 4, 16, 16, 4, hex_dump_to_buffer(stack + i, 16, 16, 4,
buf, sizeof(buf), false); buf, sizeof(buf), false);
dev_err(sdev->dev, "0x%08x: %s\n", stack_ptr + i, buf); dev_err(sdev->dev, "0x%08x: %s\n", stack_ptr + i * 4, buf);
} }
} }
......
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