ASoC: p1022ds: fix incorrect referencing of device tree properties
Timur Tabi [Wed, 8 Jun 2011 20:02:55 +0000 (15:02 -0500)]
Device tree integer properties are encoded in big-endian format, but some of
the Freescale ASoC drivers were assuming that the host is in big-endian format
as well.  Although this is true, it's better to use endian-safe accessors.

Also add a check for a failed ioremap() call in the SSI driver.

Signed-off-by: Timur Tabi <timur@freescale.com>
Acked-by: Liam Girdwood <lrg@ti.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>

sound/soc/fsl/fsl_dma.c
sound/soc/fsl/fsl_ssi.c
sound/soc/fsl/mpc8610_hpcd.c
sound/soc/fsl/p1022_ds.c

index 50b5df8..3872598 100644 (file)
@@ -940,7 +940,7 @@ static int __devinit fsl_soc_dma_probe(struct platform_device *pdev)
 
        iprop = of_get_property(ssi_np, "fsl,fifo-depth", NULL);
        if (iprop)
-               dma->ssi_fifo_depth = *iprop;
+               dma->ssi_fifo_depth = be32_to_cpup(iprop);
        else
                 /* Older 8610 DTs didn't have the fifo-depth property */
                dma->ssi_fifo_depth = 8;
index 313e0cc..d48afea 100644 (file)
@@ -678,7 +678,12 @@ static int __devinit fsl_ssi_probe(struct platform_device *pdev)
                kfree(ssi_private);
                return ret;
        }
-       ssi_private->ssi = ioremap(res.start, 1 + res.end - res.start);
+       ssi_private->ssi = of_iomap(np, 0);
+       if (!ssi_private->ssi) {
+               dev_err(&pdev->dev, "could not map device resources\n");
+               kfree(ssi_private);
+               return -ENOMEM;
+       }
        ssi_private->ssi_phys = res.start;
        ssi_private->irq = irq_of_parse_and_map(np, 0);
 
@@ -691,7 +696,7 @@ static int __devinit fsl_ssi_probe(struct platform_device *pdev)
        /* Determine the FIFO depth. */
        iprop = of_get_property(np, "fsl,fifo-depth", NULL);
        if (iprop)
-               ssi_private->fifo_depth = *iprop;
+               ssi_private->fifo_depth = be32_to_cpup(iprop);
        else
                 /* Older 8610 DTs didn't have the fifo-depth property */
                ssi_private->fifo_depth = 8;
index c16c6b2..a192979 100644 (file)
@@ -233,7 +233,7 @@ static int get_parent_cell_index(struct device_node *np)
        if (!iprop)
                return -1;
 
-       return *iprop;
+       return be32_to_cpup(iprop);
 }
 
 /**
@@ -258,7 +258,7 @@ static int codec_node_dev_name(struct device_node *np, char *buf, size_t len)
        if (!iprop)
                return -EINVAL;
 
-       addr = *iprop;
+       addr = be32_to_cpup(iprop);
 
        bus = get_parent_cell_index(np);
        if (bus < 0)
@@ -305,7 +305,7 @@ static int get_dma_channel(struct device_node *ssi_np,
                return -EINVAL;
        }
 
-       *dma_channel_id = *iprop;
+       *dma_channel_id = be32_to_cpup(iprop);
        *dma_id = get_parent_cell_index(dma_channel_np);
        of_node_put(dma_channel_np);
 
@@ -379,7 +379,7 @@ static int mpc8610_hpcd_probe(struct platform_device *pdev)
                ret = -EINVAL;
                goto error;
        }
-       machine_data->ssi_id = *iprop;
+       machine_data->ssi_id = be32_to_cpup(iprop);
 
        /* Get the serial format and clock direction. */
        sprop = of_get_property(np, "fsl,mode", NULL);
@@ -405,7 +405,7 @@ static int mpc8610_hpcd_probe(struct platform_device *pdev)
                        ret = -EINVAL;
                        goto error;
                }
-               machine_data->clk_frequency = *iprop;
+               machine_data->clk_frequency = be32_to_cpup(iprop);
        } else if (strcasecmp(sprop, "i2s-master") == 0) {
                machine_data->dai_format = SND_SOC_DAIFMT_I2S;
                machine_data->codec_clk_direction = SND_SOC_CLOCK_IN;
index 66e0b68..8fa4d5f 100644 (file)
@@ -232,7 +232,7 @@ static int get_parent_cell_index(struct device_node *np)
 
        iprop = of_get_property(parent, "cell-index", NULL);
        if (iprop)
-               ret = *iprop;
+               ret = be32_to_cpup(iprop);
 
        of_node_put(parent);
 
@@ -261,7 +261,7 @@ static int codec_node_dev_name(struct device_node *np, char *buf, size_t len)
        if (!iprop)
                return -EINVAL;
 
-       addr = *iprop;
+       addr = be32_to_cpup(iprop);
 
        bus = get_parent_cell_index(np);
        if (bus < 0)
@@ -308,7 +308,7 @@ static int get_dma_channel(struct device_node *ssi_np,
                return -EINVAL;
        }
 
-       *dma_channel_id = *iprop;
+       *dma_channel_id = be32_to_cpup(iprop);
        *dma_id = get_parent_cell_index(dma_channel_np);
        of_node_put(dma_channel_np);
 
@@ -379,7 +379,7 @@ static int p1022_ds_probe(struct platform_device *pdev)
                ret = -EINVAL;
                goto error;
        }
-       mdata->ssi_id = *iprop;
+       mdata->ssi_id = be32_to_cpup(iprop);
 
        /* Get the serial format and clock direction. */
        sprop = of_get_property(np, "fsl,mode", NULL);
@@ -405,7 +405,7 @@ static int p1022_ds_probe(struct platform_device *pdev)
                        ret = -EINVAL;
                        goto error;
                }
-               mdata->clk_frequency = *iprop;
+               mdata->clk_frequency = be32_to_cpup(iprop);
        } else if (strcasecmp(sprop, "i2s-master") == 0) {
                mdata->dai_format = SND_SOC_DAIFMT_I2S;
                mdata->codec_clk_direction = SND_SOC_CLOCK_IN;