[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