]> Git Repo - linux.git/blobdiff - drivers/spi/spi-imx.c
Merge remote-tracking branches 'spi/topic/fsl-dspi', 'spi/topic/imx', 'spi/topic...
[linux.git] / drivers / spi / spi-imx.c
index 301cdb721badcabce4c74084026518aa20c08db0..6f57592a7f95ad0980362dd69840d72846cbad77 100644 (file)
@@ -1523,16 +1523,25 @@ static int spi_imx_probe(struct platform_device *pdev)
 
        spi_imx->devtype_data = devtype_data;
 
+       /* Get number of chip selects, either platform data or OF */
        if (mxc_platform_info) {
                master->num_chipselect = mxc_platform_info->num_chipselect;
-               master->cs_gpios = devm_kzalloc(&master->dev,
-                       sizeof(int) * master->num_chipselect, GFP_KERNEL);
-               if (!master->cs_gpios)
-                       return -ENOMEM;
+               if (mxc_platform_info->chipselect) {
+                       master->cs_gpios = devm_kzalloc(&master->dev,
+                               sizeof(int) * master->num_chipselect, GFP_KERNEL);
+                       if (!master->cs_gpios)
+                               return -ENOMEM;
+
+                       for (i = 0; i < master->num_chipselect; i++)
+                               master->cs_gpios[i] = mxc_platform_info->chipselect[i];
+               }
+       } else {
+               u32 num_cs;
 
-               for (i = 0; i < master->num_chipselect; i++)
-                       master->cs_gpios[i] = mxc_platform_info->chipselect[i];
-       }
+               if (!of_property_read_u32(np, "num-cs", &num_cs))
+                       master->num_chipselect = num_cs;
+               /* If not preset, default value of 1 is used */
+       }
 
        spi_imx->bitbang.chipselect = spi_imx_chipselect;
        spi_imx->bitbang.setup_transfer = spi_imx_setupxfer;
@@ -1619,13 +1628,8 @@ static int spi_imx_probe(struct platform_device *pdev)
                goto out_clk_put;
        }
 
-       if (!spi_imx->slave_mode) {
-               if (!master->cs_gpios) {
-                       dev_err(&pdev->dev, "No CS GPIOs available\n");
-                       ret = -EINVAL;
-                       goto out_clk_put;
-               }
-
+       /* Request GPIO CS lines, if any */
+       if (!spi_imx->slave_mode && master->cs_gpios) {
                for (i = 0; i < master->num_chipselect; i++) {
                        if (!gpio_is_valid(master->cs_gpios[i]))
                                continue;
@@ -1663,12 +1667,23 @@ static int spi_imx_remove(struct platform_device *pdev)
 {
        struct spi_master *master = platform_get_drvdata(pdev);
        struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
+       int ret;
 
        spi_bitbang_stop(&spi_imx->bitbang);
 
+       ret = clk_enable(spi_imx->clk_per);
+       if (ret)
+               return ret;
+
+       ret = clk_enable(spi_imx->clk_ipg);
+       if (ret) {
+               clk_disable(spi_imx->clk_per);
+               return ret;
+       }
+
        writel(0, spi_imx->base + MXC_CSPICTRL);
-       clk_unprepare(spi_imx->clk_ipg);
-       clk_unprepare(spi_imx->clk_per);
+       clk_disable_unprepare(spi_imx->clk_ipg);
+       clk_disable_unprepare(spi_imx->clk_per);
        spi_imx_sdma_exit(spi_imx);
        spi_master_put(master);
 
This page took 0.033063 seconds and 4 git commands to generate.