1313#include <linux/irq.h>
1414#include <linux/kernel.h>
1515#include <linux/module.h>
16+ #include <linux/pinctrl/consumer.h>
1617#include <linux/platform_device.h>
18+ #include <linux/pm_runtime.h>
1719#include <linux/slab.h>
1820#include <linux/spi/spi.h>
1921#include <linux/spi/spi_bitbang.h>
@@ -30,6 +32,8 @@ static bool use_dma = true;
3032module_param (use_dma , bool , 0644 );
3133MODULE_PARM_DESC (use_dma , "Enable usage of DMA when available (default)" );
3234
35+ #define MXC_RPM_TIMEOUT 2000 /* 2000ms */
36+
3337#define MXC_CSPIRXDATA 0x00
3438#define MXC_CSPITXDATA 0x04
3539#define MXC_CSPICTRL 0x08
@@ -1530,20 +1534,16 @@ spi_imx_prepare_message(struct spi_master *master, struct spi_message *msg)
15301534 struct spi_imx_data * spi_imx = spi_master_get_devdata (master );
15311535 int ret ;
15321536
1533- ret = clk_enable (spi_imx -> clk_per );
1534- if (ret )
1535- return ret ;
1536-
1537- ret = clk_enable (spi_imx -> clk_ipg );
1538- if (ret ) {
1539- clk_disable (spi_imx -> clk_per );
1537+ ret = pm_runtime_get_sync (spi_imx -> dev );
1538+ if (ret < 0 ) {
1539+ dev_err (spi_imx -> dev , "failed to enable clock\n" );
15401540 return ret ;
15411541 }
15421542
15431543 ret = spi_imx -> devtype_data -> prepare_message (spi_imx , msg );
15441544 if (ret ) {
1545- clk_disable (spi_imx -> clk_ipg );
1546- clk_disable (spi_imx -> clk_per );
1545+ pm_runtime_mark_last_busy (spi_imx -> dev );
1546+ pm_runtime_put_autosuspend (spi_imx -> dev );
15471547 }
15481548
15491549 return ret ;
@@ -1554,8 +1554,8 @@ spi_imx_unprepare_message(struct spi_master *master, struct spi_message *msg)
15541554{
15551555 struct spi_imx_data * spi_imx = spi_master_get_devdata (master );
15561556
1557- clk_disable (spi_imx -> clk_ipg );
1558- clk_disable (spi_imx -> clk_per );
1557+ pm_runtime_mark_last_busy (spi_imx -> dev );
1558+ pm_runtime_put_autosuspend (spi_imx -> dev );
15591559 return 0 ;
15601560}
15611561
@@ -1674,13 +1674,15 @@ static int spi_imx_probe(struct platform_device *pdev)
16741674 goto out_master_put ;
16751675 }
16761676
1677- ret = clk_prepare_enable (spi_imx -> clk_per );
1678- if ( ret )
1679- goto out_master_put ;
1677+ pm_runtime_enable (spi_imx -> dev );
1678+ pm_runtime_set_autosuspend_delay ( spi_imx -> dev , MXC_RPM_TIMEOUT );
1679+ pm_runtime_use_autosuspend ( spi_imx -> dev ) ;
16801680
1681- ret = clk_prepare_enable (spi_imx -> clk_ipg );
1682- if (ret )
1683- goto out_put_per ;
1681+ ret = pm_runtime_get_sync (spi_imx -> dev );
1682+ if (ret < 0 ) {
1683+ dev_err (spi_imx -> dev , "failed to enable clock\n" );
1684+ goto out_runtime_pm_put ;
1685+ }
16841686
16851687 spi_imx -> spi_clk = clk_get_rate (spi_imx -> clk_per );
16861688 /*
@@ -1690,7 +1692,7 @@ static int spi_imx_probe(struct platform_device *pdev)
16901692 if (spi_imx -> devtype_data -> has_dmamode ) {
16911693 ret = spi_imx_sdma_init (& pdev -> dev , spi_imx , master );
16921694 if (ret == - EPROBE_DEFER )
1693- goto out_clk_put ;
1695+ goto out_runtime_pm_put ;
16941696
16951697 if (ret < 0 )
16961698 dev_err (& pdev -> dev , "dma setup error %d, use pio\n" ,
@@ -1705,19 +1707,20 @@ static int spi_imx_probe(struct platform_device *pdev)
17051707 ret = spi_bitbang_start (& spi_imx -> bitbang );
17061708 if (ret ) {
17071709 dev_err (& pdev -> dev , "bitbang start failed with %d\n" , ret );
1708- goto out_clk_put ;
1710+ goto out_runtime_pm_put ;
17091711 }
17101712
17111713 dev_info (& pdev -> dev , "probed\n" );
17121714
1713- clk_disable (spi_imx -> clk_ipg );
1714- clk_disable (spi_imx -> clk_per );
1715+ pm_runtime_mark_last_busy (spi_imx -> dev );
1716+ pm_runtime_put_autosuspend (spi_imx -> dev );
1717+
17151718 return ret ;
17161719
1717- out_clk_put :
1718- clk_disable_unprepare (spi_imx -> clk_ipg );
1719- out_put_per :
1720- clk_disable_unprepare (spi_imx -> clk_per );
1720+ out_runtime_pm_put :
1721+ pm_runtime_dont_use_autosuspend (spi_imx -> dev );
1722+ pm_runtime_put_sync ( spi_imx -> dev );
1723+ pm_runtime_disable (spi_imx -> dev );
17211724out_master_put :
17221725 spi_master_put (master );
17231726
@@ -1732,30 +1735,82 @@ static int spi_imx_remove(struct platform_device *pdev)
17321735
17331736 spi_bitbang_stop (& spi_imx -> bitbang );
17341737
1735- ret = clk_enable (spi_imx -> clk_per );
1738+ ret = pm_runtime_get_sync (spi_imx -> dev );
1739+ if (ret < 0 ) {
1740+ dev_err (spi_imx -> dev , "failed to enable clock\n" );
1741+ return ret ;
1742+ }
1743+
1744+ writel (0 , spi_imx -> base + MXC_CSPICTRL );
1745+
1746+ pm_runtime_dont_use_autosuspend (spi_imx -> dev );
1747+ pm_runtime_put_sync (spi_imx -> dev );
1748+ pm_runtime_disable (spi_imx -> dev );
1749+
1750+ spi_imx_sdma_exit (spi_imx );
1751+ spi_master_put (master );
1752+
1753+ return 0 ;
1754+ }
1755+
1756+ static int __maybe_unused spi_imx_runtime_resume (struct device * dev )
1757+ {
1758+ struct spi_master * master = dev_get_drvdata (dev );
1759+ struct spi_imx_data * spi_imx ;
1760+ int ret ;
1761+
1762+ spi_imx = spi_master_get_devdata (master );
1763+
1764+ ret = clk_prepare_enable (spi_imx -> clk_per );
17361765 if (ret )
17371766 return ret ;
17381767
1739- ret = clk_enable (spi_imx -> clk_ipg );
1768+ ret = clk_prepare_enable (spi_imx -> clk_ipg );
17401769 if (ret ) {
1741- clk_disable (spi_imx -> clk_per );
1770+ clk_disable_unprepare (spi_imx -> clk_per );
17421771 return ret ;
17431772 }
17441773
1745- writel (0 , spi_imx -> base + MXC_CSPICTRL );
1746- clk_disable_unprepare (spi_imx -> clk_ipg );
1774+ return 0 ;
1775+ }
1776+
1777+ static int __maybe_unused spi_imx_runtime_suspend (struct device * dev )
1778+ {
1779+ struct spi_master * master = dev_get_drvdata (dev );
1780+ struct spi_imx_data * spi_imx ;
1781+
1782+ spi_imx = spi_master_get_devdata (master );
1783+
17471784 clk_disable_unprepare (spi_imx -> clk_per );
1748- spi_imx_sdma_exit (spi_imx );
1749- spi_master_put (master );
1785+ clk_disable_unprepare (spi_imx -> clk_ipg );
1786+
1787+ return 0 ;
1788+ }
17501789
1790+ static int __maybe_unused spi_imx_suspend (struct device * dev )
1791+ {
1792+ pinctrl_pm_select_sleep_state (dev );
17511793 return 0 ;
17521794}
17531795
1796+ static int __maybe_unused spi_imx_resume (struct device * dev )
1797+ {
1798+ pinctrl_pm_select_default_state (dev );
1799+ return 0 ;
1800+ }
1801+
1802+ static const struct dev_pm_ops imx_spi_pm = {
1803+ SET_RUNTIME_PM_OPS (spi_imx_runtime_suspend ,
1804+ spi_imx_runtime_resume , NULL )
1805+ SET_SYSTEM_SLEEP_PM_OPS (spi_imx_suspend , spi_imx_resume )
1806+ };
1807+
17541808static struct platform_driver spi_imx_driver = {
17551809 .driver = {
17561810 .name = DRIVER_NAME ,
17571811 .of_match_table = spi_imx_dt_ids ,
1758- },
1812+ .pm = & imx_spi_pm ,
1813+ },
17591814 .id_table = spi_imx_devtype ,
17601815 .probe = spi_imx_probe ,
17611816 .remove = spi_imx_remove ,
0 commit comments