diff mbox

[3/8] ASoC: fsl-ssi: Add imx50-ssi and of_device_id matching

Message ID 1384938262-20554-4-git-send-email-mpa@pengutronix.de (mailing list archive)
State New, archived
Headers show

Commit Message

Markus Pargmann Nov. 20, 2013, 9:04 a.m. UTC
There is a small but significant difference between imx21-ssi and
imx50-ssi and above. imx21-ssi does not allow online reconfiguration of
some registers. They have to be configured at the beginning.

imx50-ssi has to reconfigure the SSI unit while it is running. Otherwise
it would not be possible to have two streams in parallel. The new SDMA
unit in imx50 and above has to be configured before the first DMA
request arrives. Therefor we need to setup TDMAE/RDMAE just before
starting the stream.

This patch introduces distinct imx50-ssi as compatible and adds
of_device_id matching in the probe function.

Signed-off-by: Markus Pargmann <mpa@pengutronix.de>
---
 sound/soc/fsl/fsl_ssi.c | 30 ++++++++++++++++++++++--------
 1 file changed, 22 insertions(+), 8 deletions(-)

Comments

Shawn Guo Nov. 20, 2013, 12:45 p.m. UTC | #1
On Wed, Nov 20, 2013 at 10:04:17AM +0100, Markus Pargmann wrote:
> There is a small but significant difference between imx21-ssi and
> imx50-ssi and above.

Markus,

Sorry, I did not point it out in the last review.  But SoC imx51 came
out earlier than imx50, so I think imx51-ssi should be used instead as
compatible.

Shawn

> imx21-ssi does not allow online reconfiguration of
> some registers. They have to be configured at the beginning.
> 
> imx50-ssi has to reconfigure the SSI unit while it is running. Otherwise
> it would not be possible to have two streams in parallel. The new SDMA
> unit in imx50 and above has to be configured before the first DMA
> request arrives. Therefor we need to setup TDMAE/RDMAE just before
> starting the stream.
> 
> This patch introduces distinct imx50-ssi as compatible and adds
> of_device_id matching in the probe function.
> 
> Signed-off-by: Markus Pargmann <mpa@pengutronix.de>
> ---
>  sound/soc/fsl/fsl_ssi.c | 30 ++++++++++++++++++++++--------
>  1 file changed, 22 insertions(+), 8 deletions(-)
> 
> diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c
> index c2fc031..d493d2d 100644
> --- a/sound/soc/fsl/fsl_ssi.c
> +++ b/sound/soc/fsl/fsl_ssi.c
> @@ -190,6 +190,20 @@ struct fsl_ssi_private {
>  	char name[1];
>  };
>  
> +enum fsl_ssi_type {
> +	FSL_SSI_MCP8610,
> +	FSL_SSI_MX21,
> +	FSL_SSI_MX50,
> +};
> +
> +static const struct of_device_id fsl_ssi_ids[] = {
> +	{ .compatible = "fsl,mpc8610-ssi", .data = (void *) FSL_SSI_MCP8610},
> +	{ .compatible = "fsl,imx50-ssi", .data = (void *) FSL_SSI_MX50},
> +	{ .compatible = "fsl,imx21-ssi", .data = (void *) FSL_SSI_MX21},
> +	{}
> +};
> +MODULE_DEVICE_TABLE(of, fsl_ssi_ids);
> +
>  #if IS_ENABLED(CONFIG_DEBUG_FS)
>  /**
>   * fsl_ssi_isr: SSI interrupt handler
> @@ -925,6 +939,8 @@ static int fsl_ssi_probe(struct platform_device *pdev)
>  	int ret = 0;
>  	struct device_attribute *dev_attr = NULL;
>  	struct device_node *np = pdev->dev.of_node;
> +	const struct of_device_id *of_id;
> +	enum fsl_ssi_type hw_type;
>  	const char *p, *sprop;
>  	const uint32_t *iprop;
>  	struct resource res;
> @@ -939,6 +955,11 @@ static int fsl_ssi_probe(struct platform_device *pdev)
>  	if (!of_device_is_available(np))
>  		return -ENODEV;
>  
> +	of_id = of_match_device(fsl_ssi_ids, &pdev->dev);
> +	if (!of_id)
> +		return -EINVAL;
> +	hw_type = (enum fsl_ssi_type) of_id->data;
> +
>  	/* We only support the SSI in "I2S Slave" mode */
>  	sprop = of_get_property(np, "fsl,mode", NULL);
>  	if (!sprop) {
> @@ -1012,7 +1033,7 @@ static int fsl_ssi_probe(struct platform_device *pdev)
>                  /* Older 8610 DTs didn't have the fifo-depth property */
>  		ssi_private->fifo_depth = 8;
>  
> -	if (of_device_is_compatible(pdev->dev.of_node, "fsl,imx21-ssi")) {
> +	if (hw_type == FSL_SSI_MX21 || hw_type == FSL_SSI_MX50) {
>  		u32 dma_events[2];
>  		ssi_private->ssi_on_imx = true;
>  
> @@ -1207,13 +1228,6 @@ static int fsl_ssi_remove(struct platform_device *pdev)
>  	return 0;
>  }
>  
> -static const struct of_device_id fsl_ssi_ids[] = {
> -	{ .compatible = "fsl,mpc8610-ssi", },
> -	{ .compatible = "fsl,imx21-ssi", },
> -	{}
> -};
> -MODULE_DEVICE_TABLE(of, fsl_ssi_ids);
> -
>  static struct platform_driver fsl_ssi_driver = {
>  	.driver = {
>  		.name = "fsl-ssi-dai",
> -- 
> 1.8.4.2
>
Markus Pargmann Nov. 20, 2013, 1:30 p.m. UTC | #2
Hi Shawn,

On Wed, Nov 20, 2013 at 08:45:01PM +0800, Shawn Guo wrote:
> On Wed, Nov 20, 2013 at 10:04:17AM +0100, Markus Pargmann wrote:
> > There is a small but significant difference between imx21-ssi and
> > imx50-ssi and above.
> 
> Markus,
> 
> Sorry, I did not point it out in the last review.  But SoC imx51 came
> out earlier than imx50, so I think imx51-ssi should be used instead as
> compatible.

Ah, I didn't know imx51 was released earlier. I will replace imx50-ssi
with imx51-ssi.

Thanks,

Markus
diff mbox

Patch

diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c
index c2fc031..d493d2d 100644
--- a/sound/soc/fsl/fsl_ssi.c
+++ b/sound/soc/fsl/fsl_ssi.c
@@ -190,6 +190,20 @@  struct fsl_ssi_private {
 	char name[1];
 };
 
+enum fsl_ssi_type {
+	FSL_SSI_MCP8610,
+	FSL_SSI_MX21,
+	FSL_SSI_MX50,
+};
+
+static const struct of_device_id fsl_ssi_ids[] = {
+	{ .compatible = "fsl,mpc8610-ssi", .data = (void *) FSL_SSI_MCP8610},
+	{ .compatible = "fsl,imx50-ssi", .data = (void *) FSL_SSI_MX50},
+	{ .compatible = "fsl,imx21-ssi", .data = (void *) FSL_SSI_MX21},
+	{}
+};
+MODULE_DEVICE_TABLE(of, fsl_ssi_ids);
+
 #if IS_ENABLED(CONFIG_DEBUG_FS)
 /**
  * fsl_ssi_isr: SSI interrupt handler
@@ -925,6 +939,8 @@  static int fsl_ssi_probe(struct platform_device *pdev)
 	int ret = 0;
 	struct device_attribute *dev_attr = NULL;
 	struct device_node *np = pdev->dev.of_node;
+	const struct of_device_id *of_id;
+	enum fsl_ssi_type hw_type;
 	const char *p, *sprop;
 	const uint32_t *iprop;
 	struct resource res;
@@ -939,6 +955,11 @@  static int fsl_ssi_probe(struct platform_device *pdev)
 	if (!of_device_is_available(np))
 		return -ENODEV;
 
+	of_id = of_match_device(fsl_ssi_ids, &pdev->dev);
+	if (!of_id)
+		return -EINVAL;
+	hw_type = (enum fsl_ssi_type) of_id->data;
+
 	/* We only support the SSI in "I2S Slave" mode */
 	sprop = of_get_property(np, "fsl,mode", NULL);
 	if (!sprop) {
@@ -1012,7 +1033,7 @@  static int fsl_ssi_probe(struct platform_device *pdev)
                 /* Older 8610 DTs didn't have the fifo-depth property */
 		ssi_private->fifo_depth = 8;
 
-	if (of_device_is_compatible(pdev->dev.of_node, "fsl,imx21-ssi")) {
+	if (hw_type == FSL_SSI_MX21 || hw_type == FSL_SSI_MX50) {
 		u32 dma_events[2];
 		ssi_private->ssi_on_imx = true;
 
@@ -1207,13 +1228,6 @@  static int fsl_ssi_remove(struct platform_device *pdev)
 	return 0;
 }
 
-static const struct of_device_id fsl_ssi_ids[] = {
-	{ .compatible = "fsl,mpc8610-ssi", },
-	{ .compatible = "fsl,imx21-ssi", },
-	{}
-};
-MODULE_DEVICE_TABLE(of, fsl_ssi_ids);
-
 static struct platform_driver fsl_ssi_driver = {
 	.driver = {
 		.name = "fsl-ssi-dai",