diff options
Diffstat (limited to 'drivers/spi/spi-imx.c')
-rw-r--r-- | drivers/spi/spi-imx.c | 35 |
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 | ||
752 | static int | ||
753 | spi_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 | |||
771 | static int | ||
772 | spi_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 | |||
752 | static int spi_imx_probe(struct platform_device *pdev) | 781 | static 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 | ||
877 | out_clk_put: | 910 | out_clk_put: |