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

Shawn Guo shawn.guo at linaro.org
Wed Nov 20 07:45:01 EST 2013


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 at 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
> 




More information about the linux-arm-kernel mailing list