summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShengjiu Wang <shengjiu.wang@freescale.com>2017-07-05 15:29:40 +0800
committerDong Aisheng <aisheng.dong@nxp.com>2019-11-25 15:48:28 +0800
commit9fb7266cc7b7a505010902a430e02a1a75ad2775 (patch)
treed7f3dc77a60f929d5734addf23b421d8099b0ee1
parentadd402988943c9755a90d60453b1c106c8617174 (diff)
MLK-13945-3: ASoC: fsl_asrc: support two asrc devices
In imx8qm, there is two asrc devices, so using global structure "miscdevice" will cause error. Each instance should have their own structure. Signed-off-by: Shengjiu Wang <shengjiu.wang@freescale.com> Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com>
-rw-r--r--sound/soc/fsl/fsl_asrc.c8
-rw-r--r--sound/soc/fsl/fsl_asrc.h3
-rw-r--r--sound/soc/fsl/fsl_asrc_m2m.c29
3 files changed, 26 insertions, 14 deletions
diff --git a/sound/soc/fsl/fsl_asrc.c b/sound/soc/fsl/fsl_asrc.c
index d4a57303b57b..71ec8594e599 100644
--- a/sound/soc/fsl/fsl_asrc.c
+++ b/sound/soc/fsl/fsl_asrc.c
@@ -993,18 +993,26 @@ static int fsl_asrc_probe(struct platform_device *pdev)
if (of_device_is_compatible(np, "fsl,imx35-asrc")) {
asrc_priv->channel_bits = 3;
+ strncpy(asrc_priv->name, "mxc_asrc",
+ sizeof(asrc_priv->name) - 1);
clk_map[IN] = input_clk_map_imx35;
clk_map[OUT] = output_clk_map_imx35;
} else if (of_device_is_compatible(np, "fsl,imx53-asrc")) {
asrc_priv->channel_bits = 4;
+ strncpy(asrc_priv->name, "mxc_asrc",
+ sizeof(asrc_priv->name) - 1);
clk_map[IN] = input_clk_map_imx53;
clk_map[OUT] = output_clk_map_imx53;
} else if (of_device_is_compatible(np, "fsl,imx8qm-asrc0")) {
asrc_priv->channel_bits = 4;
+ strncpy(asrc_priv->name, "mxc_asrc",
+ sizeof(asrc_priv->name) - 1);
clk_map[IN] = input_clk_map_imx8_0;
clk_map[OUT] = output_clk_map_imx8_0;
} else if (of_device_is_compatible(np, "fsl,imx8qm-asrc1")) {
asrc_priv->channel_bits = 4;
+ strncpy(asrc_priv->name, "mxc_asrc1",
+ sizeof(asrc_priv->name) - 1);
clk_map[IN] = input_clk_map_imx8_1;
clk_map[OUT] = output_clk_map_imx8_1;
}
diff --git a/sound/soc/fsl/fsl_asrc.h b/sound/soc/fsl/fsl_asrc.h
index 8acc68af90c4..3dec3abc5fec 100644
--- a/sound/soc/fsl/fsl_asrc.h
+++ b/sound/soc/fsl/fsl_asrc.h
@@ -11,6 +11,7 @@
#define _FSL_ASRC_H
#include <uapi/linux/mxc_asrc.h>
+#include <linux/miscdevice.h>
#define IN 0
#define OUT 1
@@ -358,6 +359,7 @@ struct fsl_asrc {
spinlock_t lock;
struct fsl_asrc_pair *pair[ASRC_PAIR_MAX_NUM];
+ struct miscdevice asrc_miscdev;
unsigned int channel_bits;
unsigned int channel_avail;
unsigned int pair_streams;
@@ -366,6 +368,7 @@ struct fsl_asrc {
int asrc_width;
u32 regcache_cfg;
+ char name[20];
};
#define DRV_NAME "fsl-asrc-dai"
diff --git a/sound/soc/fsl/fsl_asrc_m2m.c b/sound/soc/fsl/fsl_asrc_m2m.c
index 3e5431eec7d9..14877b43c4e1 100644
--- a/sound/soc/fsl/fsl_asrc_m2m.c
+++ b/sound/soc/fsl/fsl_asrc_m2m.c
@@ -29,11 +29,6 @@ struct fsl_asrc_m2m {
spinlock_t lock;
};
-static struct miscdevice asrc_miscdev = {
- .name = "mxc_asrc",
- .minor = MISC_DYNAMIC_MINOR,
-};
-
static void fsl_asrc_get_status(struct fsl_asrc_pair *pair,
struct asrc_status_flags *flags)
{
@@ -766,7 +761,8 @@ static long fsl_asrc_ioctl_flush(struct fsl_asrc_pair *pair, void __user *user)
static long fsl_asrc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
- struct fsl_asrc_pair *pair = file->private_data;
+ struct miscdevice *asrc_miscdev = file->private_data;
+ struct fsl_asrc_pair *pair = dev_get_drvdata(asrc_miscdev->this_device);
struct fsl_asrc *asrc_priv = pair->asrc_priv;
void __user *user = (void __user *)arg;
long ret = 0;
@@ -806,7 +802,8 @@ static long fsl_asrc_ioctl(struct file *file, unsigned int cmd, unsigned long ar
static int fsl_asrc_open(struct inode *inode, struct file *file)
{
- struct fsl_asrc *asrc_priv = dev_get_drvdata(asrc_miscdev.this_device);
+ struct miscdevice *asrc_miscdev = file->private_data;
+ struct fsl_asrc *asrc_priv = dev_get_drvdata(asrc_miscdev->parent);
struct device *dev = &asrc_priv->pdev->dev;
struct fsl_asrc_pair *pair;
struct fsl_asrc_m2m *m2m;
@@ -836,7 +833,7 @@ static int fsl_asrc_open(struct inode *inode, struct file *file)
spin_lock_init(&m2m->lock);
- file->private_data = pair;
+ dev_set_drvdata(asrc_miscdev->this_device, pair);
pm_runtime_get_sync(dev);
@@ -849,7 +846,8 @@ out:
static int fsl_asrc_close(struct inode *inode, struct file *file)
{
- struct fsl_asrc_pair *pair = file->private_data;
+ struct miscdevice *asrc_miscdev = file->private_data;
+ struct fsl_asrc_pair *pair = dev_get_drvdata(asrc_miscdev->this_device);
struct fsl_asrc_m2m *m2m = pair->private;
struct fsl_asrc *asrc_priv = pair->asrc_priv;
struct device *dev = &asrc_priv->pdev->dev;
@@ -887,7 +885,6 @@ static int fsl_asrc_close(struct inode *inode, struct file *file)
kfree(m2m);
kfree(pair);
spin_unlock_irqrestore(&asrc_priv->lock, lock_flags);
- file->private_data = NULL;
pm_runtime_put_sync(dev);
@@ -906,20 +903,24 @@ static int fsl_asrc_m2m_init(struct fsl_asrc *asrc_priv)
struct device *dev = &asrc_priv->pdev->dev;
int ret;
- asrc_miscdev.fops = &asrc_fops,
- ret = misc_register(&asrc_miscdev);
+ asrc_priv->asrc_miscdev.fops = &asrc_fops;
+ asrc_priv->asrc_miscdev.parent = dev;
+ asrc_priv->asrc_miscdev.name = asrc_priv->name;
+ asrc_priv->asrc_miscdev.minor = MISC_DYNAMIC_MINOR;
+ ret = misc_register(&asrc_priv->asrc_miscdev);
if (ret) {
dev_err(dev, "failed to register char device %d\n", ret);
return ret;
}
- dev_set_drvdata(asrc_miscdev.this_device, asrc_priv);
return 0;
}
static int fsl_asrc_m2m_remove(struct platform_device *pdev)
{
- misc_deregister(&asrc_miscdev);
+ struct fsl_asrc *asrc_priv = dev_get_drvdata(&pdev->dev);
+
+ misc_deregister(&asrc_priv->asrc_miscdev);
return 0;
}