OSDN Git Service

Merge remote-tracking branches 'spi/topic/fsl-dspi', 'spi/topic/imx', 'spi/topic...
[uclinux-h8/linux.git] / drivers / spi / spi-imx.c
index 79ddefe..6f57592 100644 (file)
@@ -1622,6 +1622,11 @@ static int spi_imx_probe(struct platform_device *pdev)
        spi_imx->devtype_data->intctrl(spi_imx, 0);
 
        master->dev.of_node = pdev->dev.of_node;
+       ret = spi_bitbang_start(&spi_imx->bitbang);
+       if (ret) {
+               dev_err(&pdev->dev, "bitbang start failed with %d\n", ret);
+               goto out_clk_put;
+       }
 
        /* Request GPIO CS lines, if any */
        if (!spi_imx->slave_mode && master->cs_gpios) {
@@ -1640,12 +1645,6 @@ static int spi_imx_probe(struct platform_device *pdev)
                }
        }
 
-       ret = spi_bitbang_start(&spi_imx->bitbang);
-       if (ret) {
-               dev_err(&pdev->dev, "bitbang start failed with %d\n", ret);
-               goto out_clk_put;
-       }
-
        dev_info(&pdev->dev, "probed\n");
 
        clk_disable(spi_imx->clk_ipg);
@@ -1668,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);