@@ -1391,6 +1391,38 @@ static int intel_start_bus_after_clock_stop(struct sdw_intel *sdw)
13911391 return 0 ;
13921392}
13931393
1394+ static int intel_stop_bus (struct sdw_intel * sdw , bool clock_stop )
1395+ {
1396+ struct device * dev = sdw -> cdns .dev ;
1397+ struct sdw_cdns * cdns = & sdw -> cdns ;
1398+ bool wake_enable = false;
1399+ int ret ;
1400+
1401+ if (clock_stop ) {
1402+ ret = sdw_cdns_clock_stop (cdns , true);
1403+ if (ret < 0 )
1404+ dev_err (dev , "%s: cannot stop clock: %d\n" , __func__ , ret );
1405+ else
1406+ wake_enable = true;
1407+ }
1408+
1409+ ret = sdw_cdns_enable_interrupt (cdns , false);
1410+ if (ret < 0 ) {
1411+ dev_err (dev , "%s: cannot disable interrupts: %d\n" , __func__ , ret );
1412+ return ret ;
1413+ }
1414+
1415+ ret = intel_link_power_down (sdw );
1416+ if (ret ) {
1417+ dev_err (dev , "%s: Link power down failed: %d\n" , __func__ , ret );
1418+ return ret ;
1419+ }
1420+
1421+ intel_shim_wake (sdw , wake_enable );
1422+
1423+ return 0 ;
1424+ }
1425+
13941426static int sdw_master_read_intel_prop (struct sdw_bus * bus )
13951427{
13961428 struct sdw_master_prop * prop = & bus -> prop ;
@@ -1790,20 +1822,12 @@ static int __maybe_unused intel_suspend(struct device *dev)
17901822 return 0 ;
17911823 }
17921824
1793- ret = sdw_cdns_enable_interrupt ( cdns , false);
1825+ ret = intel_stop_bus ( sdw , false);
17941826 if (ret < 0 ) {
1795- dev_err (dev , "cannot disable interrupts on suspend \n" );
1827+ dev_err (dev , "%s: cannot stop bus: %d \n" , __func__ , ret );
17961828 return ret ;
17971829 }
17981830
1799- ret = intel_link_power_down (sdw );
1800- if (ret ) {
1801- dev_err (dev , "Link power down failed: %d\n" , ret );
1802- return ret ;
1803- }
1804-
1805- intel_shim_wake (sdw , false);
1806-
18071831 return 0 ;
18081832}
18091833
@@ -1824,44 +1848,19 @@ static int __maybe_unused intel_suspend_runtime(struct device *dev)
18241848 clock_stop_quirks = sdw -> link_res -> clock_stop_quirks ;
18251849
18261850 if (clock_stop_quirks & SDW_INTEL_CLK_STOP_TEARDOWN ) {
1827-
1828- ret = sdw_cdns_enable_interrupt (cdns , false);
1851+ ret = intel_stop_bus (sdw , false);
18291852 if (ret < 0 ) {
1830- dev_err (dev , "cannot disable interrupts on suspend\n" );
1831- return ret ;
1832- }
1833-
1834- ret = intel_link_power_down (sdw );
1835- if (ret ) {
1836- dev_err (dev , "Link power down failed: %d\n" , ret );
1853+ dev_err (dev , "%s: cannot stop bus during teardown: %d\n" ,
1854+ __func__ , ret );
18371855 return ret ;
18381856 }
1839-
1840- intel_shim_wake (sdw , false);
1841-
1842- } else if (clock_stop_quirks & SDW_INTEL_CLK_STOP_BUS_RESET ||
1843- !clock_stop_quirks ) {
1844- bool wake_enable = true;
1845-
1846- ret = sdw_cdns_clock_stop (cdns , true);
1847- if (ret < 0 ) {
1848- dev_err (dev , "cannot enable clock stop on suspend\n" );
1849- wake_enable = false;
1850- }
1851-
1852- ret = sdw_cdns_enable_interrupt (cdns , false);
1857+ } else if (clock_stop_quirks & SDW_INTEL_CLK_STOP_BUS_RESET || !clock_stop_quirks ) {
1858+ ret = intel_stop_bus (sdw , true);
18531859 if (ret < 0 ) {
1854- dev_err (dev , "cannot disable interrupts on suspend\n" );
1855- return ret ;
1856- }
1857-
1858- ret = intel_link_power_down (sdw );
1859- if (ret ) {
1860- dev_err (dev , "Link power down failed: %d\n" , ret );
1860+ dev_err (dev , "%s: cannot stop bus during clock_stop: %d\n" ,
1861+ __func__ , ret );
18611862 return ret ;
18621863 }
1863-
1864- intel_shim_wake (sdw , wake_enable );
18651864 } else {
18661865 dev_err (dev , "%s clock_stop_quirks %x unsupported\n" ,
18671866 __func__ , clock_stop_quirks );
0 commit comments