|
@@ -749,6 +749,35 @@ static void spi_imx_cleanup(struct spi_device *spi)
|
|
|
{
|
|
|
}
|
|
|
|
|
|
+static int
|
|
|
+spi_imx_prepare_message(struct spi_master *master, struct spi_message *msg)
|
|
|
+{
|
|
|
+ struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int
|
|
|
+spi_imx_unprepare_message(struct spi_master *master, struct spi_message *msg)
|
|
|
+{
|
|
|
+ struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
|
|
|
+
|
|
|
+ clk_disable(spi_imx->clk_ipg);
|
|
|
+ clk_disable(spi_imx->clk_per);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int spi_imx_probe(struct platform_device *pdev)
|
|
|
{
|
|
|
struct device_node *np = pdev->dev.of_node;
|
|
@@ -810,6 +839,8 @@ static int spi_imx_probe(struct platform_device *pdev)
|
|
|
spi_imx->bitbang.txrx_bufs = spi_imx_transfer;
|
|
|
spi_imx->bitbang.master->setup = spi_imx_setup;
|
|
|
spi_imx->bitbang.master->cleanup = spi_imx_cleanup;
|
|
|
+ spi_imx->bitbang.master->prepare_message = spi_imx_prepare_message;
|
|
|
+ spi_imx->bitbang.master->unprepare_message = spi_imx_unprepare_message;
|
|
|
spi_imx->bitbang.master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
|
|
|
|
|
|
init_completion(&spi_imx->xfer_done);
|
|
@@ -872,6 +903,8 @@ static int spi_imx_probe(struct platform_device *pdev)
|
|
|
|
|
|
dev_info(&pdev->dev, "probed\n");
|
|
|
|
|
|
+ clk_disable(spi_imx->clk_ipg);
|
|
|
+ clk_disable(spi_imx->clk_per);
|
|
|
return ret;
|
|
|
|
|
|
out_clk_put:
|