Merge branch 'asoc-5.1' into asoc-5.2
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
@@ -37,6 +38,8 @@ struct stm32_adfsdm_priv {
|
||||
/* PCM buffer */
|
||||
unsigned char *pcm_buff;
|
||||
unsigned int pos;
|
||||
|
||||
struct mutex lock; /* protect against race condition on iio state */
|
||||
};
|
||||
|
||||
static const struct snd_pcm_hardware stm32_adfsdm_pcm_hw = {
|
||||
@@ -62,10 +65,12 @@ static void stm32_adfsdm_shutdown(struct snd_pcm_substream *substream,
|
||||
{
|
||||
struct stm32_adfsdm_priv *priv = snd_soc_dai_get_drvdata(dai);
|
||||
|
||||
mutex_lock(&priv->lock);
|
||||
if (priv->iio_active) {
|
||||
iio_channel_stop_all_cb(priv->iio_cb);
|
||||
priv->iio_active = false;
|
||||
}
|
||||
mutex_unlock(&priv->lock);
|
||||
}
|
||||
|
||||
static int stm32_adfsdm_dai_prepare(struct snd_pcm_substream *substream,
|
||||
@@ -74,13 +79,19 @@ static int stm32_adfsdm_dai_prepare(struct snd_pcm_substream *substream,
|
||||
struct stm32_adfsdm_priv *priv = snd_soc_dai_get_drvdata(dai);
|
||||
int ret;
|
||||
|
||||
mutex_lock(&priv->lock);
|
||||
if (priv->iio_active) {
|
||||
iio_channel_stop_all_cb(priv->iio_cb);
|
||||
priv->iio_active = false;
|
||||
}
|
||||
|
||||
ret = iio_write_channel_attribute(priv->iio_ch,
|
||||
substream->runtime->rate, 0,
|
||||
IIO_CHAN_INFO_SAMP_FREQ);
|
||||
if (ret < 0) {
|
||||
dev_err(dai->dev, "%s: Failed to set %d sampling rate\n",
|
||||
__func__, substream->runtime->rate);
|
||||
return ret;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!priv->iio_active) {
|
||||
@@ -92,6 +103,9 @@ static int stm32_adfsdm_dai_prepare(struct snd_pcm_substream *substream,
|
||||
__func__, ret);
|
||||
}
|
||||
|
||||
out:
|
||||
mutex_unlock(&priv->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -291,6 +305,7 @@ MODULE_DEVICE_TABLE(of, stm32_adfsdm_of_match);
|
||||
static int stm32_adfsdm_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct stm32_adfsdm_priv *priv;
|
||||
struct snd_soc_component *component;
|
||||
int ret;
|
||||
|
||||
priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
|
||||
@@ -299,6 +314,7 @@ static int stm32_adfsdm_probe(struct platform_device *pdev)
|
||||
|
||||
priv->dev = &pdev->dev;
|
||||
priv->dai_drv = stm32_adfsdm_dai;
|
||||
mutex_init(&priv->lock);
|
||||
|
||||
dev_set_drvdata(&pdev->dev, priv);
|
||||
|
||||
@@ -317,9 +333,15 @@ static int stm32_adfsdm_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(priv->iio_cb))
|
||||
return PTR_ERR(priv->iio_cb);
|
||||
|
||||
ret = devm_snd_soc_register_component(&pdev->dev,
|
||||
&stm32_adfsdm_soc_platform,
|
||||
NULL, 0);
|
||||
component = devm_kzalloc(&pdev->dev, sizeof(*component), GFP_KERNEL);
|
||||
if (!component)
|
||||
return -ENOMEM;
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
component->debugfs_prefix = "pcm";
|
||||
#endif
|
||||
|
||||
ret = snd_soc_add_component(&pdev->dev, component,
|
||||
&stm32_adfsdm_soc_platform, NULL, 0);
|
||||
if (ret < 0)
|
||||
dev_err(&pdev->dev, "%s: Failed to register PCM platform\n",
|
||||
__func__);
|
||||
@@ -327,12 +349,20 @@ static int stm32_adfsdm_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int stm32_adfsdm_remove(struct platform_device *pdev)
|
||||
{
|
||||
snd_soc_unregister_component(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver stm32_adfsdm_driver = {
|
||||
.driver = {
|
||||
.name = STM32_ADFSDM_DRV_NAME,
|
||||
.of_match_table = stm32_adfsdm_of_match,
|
||||
},
|
||||
.probe = stm32_adfsdm_probe,
|
||||
.remove = stm32_adfsdm_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(stm32_adfsdm_driver);
|
||||
|
Reference in New Issue
Block a user