aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-imx.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/spi/spi-imx.c')
-rw-r--r--drivers/spi/spi-imx.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index 15323d8bd9cf..b80f2f70fef7 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -749,6 +749,35 @@ static void spi_imx_cleanup(struct spi_device *spi)
749{ 749{
750} 750}
751 751
752static int
753spi_imx_prepare_message(struct spi_master *master, struct spi_message *msg)
754{
755 struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
756 int ret;
757
758 ret = clk_enable(spi_imx->clk_per);
759 if (ret)
760 return ret;
761
762 ret = clk_enable(spi_imx->clk_ipg);
763 if (ret) {
764 clk_disable(spi_imx->clk_per);
765 return ret;
766 }
767
768 return 0;
769}
770
771static int
772spi_imx_unprepare_message(struct spi_master *master, struct spi_message *msg)
773{
774 struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
775
776 clk_disable(spi_imx->clk_ipg);
777 clk_disable(spi_imx->clk_per);
778 return 0;
779}
780
752static int spi_imx_probe(struct platform_device *pdev) 781static int spi_imx_probe(struct platform_device *pdev)
753{ 782{
754 struct device_node *np = pdev->dev.of_node; 783 struct device_node *np = pdev->dev.of_node;
@@ -786,7 +815,7 @@ static int spi_imx_probe(struct platform_device *pdev)
786 master->num_chipselect = num_cs; 815 master->num_chipselect = num_cs;
787 816
788 spi_imx = spi_master_get_devdata(master); 817 spi_imx = spi_master_get_devdata(master);
789 spi_imx->bitbang.master = spi_master_get(master); 818 spi_imx->bitbang.master = master;
790 819
791 for (i = 0; i < master->num_chipselect; i++) { 820 for (i = 0; i < master->num_chipselect; i++) {
792 int cs_gpio = of_get_named_gpio(np, "cs-gpios", i); 821 int cs_gpio = of_get_named_gpio(np, "cs-gpios", i);
@@ -810,6 +839,8 @@ static int spi_imx_probe(struct platform_device *pdev)
810 spi_imx->bitbang.txrx_bufs = spi_imx_transfer; 839 spi_imx->bitbang.txrx_bufs = spi_imx_transfer;
811 spi_imx->bitbang.master->setup = spi_imx_setup; 840 spi_imx->bitbang.master->setup = spi_imx_setup;
812 spi_imx->bitbang.master->cleanup = spi_imx_cleanup; 841 spi_imx->bitbang.master->cleanup = spi_imx_cleanup;
842 spi_imx->bitbang.master->prepare_message = spi_imx_prepare_message;
843 spi_imx->bitbang.master->unprepare_message = spi_imx_unprepare_message;
813 spi_imx->bitbang.master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH; 844 spi_imx->bitbang.master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
814 845
815 init_completion(&spi_imx->xfer_done); 846 init_completion(&spi_imx->xfer_done);
@@ -872,6 +903,8 @@ static int spi_imx_probe(struct platform_device *pdev)
872 903
873 dev_info(&pdev->dev, "probed\n"); 904 dev_info(&pdev->dev, "probed\n");
874 905
906 clk_disable(spi_imx->clk_ipg);
907 clk_disable(spi_imx->clk_per);
875 return ret; 908 return ret;
876 909
877out_clk_put: 910out_clk_put: