13
13
#include <linux/irq.h>
14
14
#include <linux/kernel.h>
15
15
#include <linux/module.h>
16
+ #include <linux/pinctrl/consumer.h>
16
17
#include <linux/platform_device.h>
18
+ #include <linux/pm_runtime.h>
17
19
#include <linux/slab.h>
18
20
#include <linux/spi/spi.h>
19
21
#include <linux/spi/spi_bitbang.h>
@@ -30,6 +32,8 @@ static bool use_dma = true;
30
32
module_param (use_dma , bool , 0644 );
31
33
MODULE_PARM_DESC (use_dma , "Enable usage of DMA when available (default)" );
32
34
35
+ #define MXC_RPM_TIMEOUT 2000 /* 2000ms */
36
+
33
37
#define MXC_CSPIRXDATA 0x00
34
38
#define MXC_CSPITXDATA 0x04
35
39
#define MXC_CSPICTRL 0x08
@@ -1530,20 +1534,16 @@ spi_imx_prepare_message(struct spi_master *master, struct spi_message *msg)
1530
1534
struct spi_imx_data * spi_imx = spi_master_get_devdata (master );
1531
1535
int ret ;
1532
1536
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" );
1540
1540
return ret ;
1541
1541
}
1542
1542
1543
1543
ret = spi_imx -> devtype_data -> prepare_message (spi_imx , msg );
1544
1544
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 );
1547
1547
}
1548
1548
1549
1549
return ret ;
@@ -1554,8 +1554,8 @@ spi_imx_unprepare_message(struct spi_master *master, struct spi_message *msg)
1554
1554
{
1555
1555
struct spi_imx_data * spi_imx = spi_master_get_devdata (master );
1556
1556
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 );
1559
1559
return 0 ;
1560
1560
}
1561
1561
@@ -1674,13 +1674,15 @@ static int spi_imx_probe(struct platform_device *pdev)
1674
1674
goto out_master_put ;
1675
1675
}
1676
1676
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 ) ;
1680
1680
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
+ }
1684
1686
1685
1687
spi_imx -> spi_clk = clk_get_rate (spi_imx -> clk_per );
1686
1688
/*
@@ -1690,7 +1692,7 @@ static int spi_imx_probe(struct platform_device *pdev)
1690
1692
if (spi_imx -> devtype_data -> has_dmamode ) {
1691
1693
ret = spi_imx_sdma_init (& pdev -> dev , spi_imx , master );
1692
1694
if (ret == - EPROBE_DEFER )
1693
- goto out_clk_put ;
1695
+ goto out_runtime_pm_put ;
1694
1696
1695
1697
if (ret < 0 )
1696
1698
dev_err (& pdev -> dev , "dma setup error %d, use pio\n" ,
@@ -1705,19 +1707,20 @@ static int spi_imx_probe(struct platform_device *pdev)
1705
1707
ret = spi_bitbang_start (& spi_imx -> bitbang );
1706
1708
if (ret ) {
1707
1709
dev_err (& pdev -> dev , "bitbang start failed with %d\n" , ret );
1708
- goto out_clk_put ;
1710
+ goto out_runtime_pm_put ;
1709
1711
}
1710
1712
1711
1713
dev_info (& pdev -> dev , "probed\n" );
1712
1714
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
+
1715
1718
return ret ;
1716
1719
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 );
1721
1724
out_master_put :
1722
1725
spi_master_put (master );
1723
1726
@@ -1732,30 +1735,82 @@ static int spi_imx_remove(struct platform_device *pdev)
1732
1735
1733
1736
spi_bitbang_stop (& spi_imx -> bitbang );
1734
1737
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 );
1736
1765
if (ret )
1737
1766
return ret ;
1738
1767
1739
- ret = clk_enable (spi_imx -> clk_ipg );
1768
+ ret = clk_prepare_enable (spi_imx -> clk_ipg );
1740
1769
if (ret ) {
1741
- clk_disable (spi_imx -> clk_per );
1770
+ clk_disable_unprepare (spi_imx -> clk_per );
1742
1771
return ret ;
1743
1772
}
1744
1773
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
+
1747
1784
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
+ }
1750
1789
1790
+ static int __maybe_unused spi_imx_suspend (struct device * dev )
1791
+ {
1792
+ pinctrl_pm_select_sleep_state (dev );
1751
1793
return 0 ;
1752
1794
}
1753
1795
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
+
1754
1808
static struct platform_driver spi_imx_driver = {
1755
1809
.driver = {
1756
1810
.name = DRIVER_NAME ,
1757
1811
.of_match_table = spi_imx_dt_ids ,
1758
- },
1812
+ .pm = & imx_spi_pm ,
1813
+ },
1759
1814
.id_table = spi_imx_devtype ,
1760
1815
.probe = spi_imx_probe ,
1761
1816
.remove = spi_imx_remove ,
0 commit comments