Skip to contentSkip to conversation

i2c/designware: enable i2c controller to suspend/resume asynchronously

PATCH In review Fu, Zhonghui 3 participants 5 messages Dec 24, 2015 – Jan 15, 2016

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 i2c/designware: enable i2c controller to suspend/resume asynchronously

Now, PM core supports asynchronous suspend/resume mode for devices during system suspend/resume, and the power state transition of one device may be completed in separate kernel thread. PM core ensures all power state transition dependency between devices. This patch enables designware i2c controllers to suspend/resume asynchronously. This will take advantage of multicore and improve system suspend/resume speed. After enabling all i2c devices, i2c adapters and i2c controllers on ASUS T100TA tablet, the system suspend-to-idle time is reduced to about 510ms from 750ms, and the system resume time is reduced to about 790ms from 900ms.

---
 drivers/i2c/busses/i2c-designware-platdrv.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
drivers/i2c/busses/i2c-designware-platdrv.c +1 -0
index 6b00061..395130b 100644
@@ -230,6 +230,7 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
 	}
 
 	adap = &dev->adapter;
+	device_enable_async_suspend(&pdev->dev);
 	adap->owner = THIS_MODULE;
 	adap->class = I2C_CLASS_DEPRECATED;
 	ACPI_COMPANION_SET(&adap->dev, ACPI_COMPANION(&pdev->dev));

-- 1.7.1

#1 lore raw

Hi

Quoted 11 lines · Zhonghui

Now, PM core supports asynchronous suspend/resume mode for devices during system suspend/resume, and the power state transition of one device may be completed in separate kernel thread. PM core ensures all power state transition dependency between devices. This patch enables designware i2c controllers to suspend/resume asynchronously. This will take advantage of multicore and improve system suspend/resume speed. After enabling all i2c devices, i2c adapters and i2c controllers on ASUS T100TA tablet, the system suspend-to-idle time is reduced to about 510ms from 750ms, and the system resume time is reduced to about 790ms from 900ms.

Nice reduction :-)

drivers/i2c/busses/i2c-designware-platdrv.c static int dw_i2c_plat_probe(struct platform_device *pdev) · line 236

Quoted 12 lines
drivers/i2c/busses/i2c-designware-platdrv.c +1 -0
index 6b00061..395130b 100644
@@ -230,6 +230,7 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
  	}
 
  	adap = &dev->adapter;
+	device_enable_async_suspend(&pdev->dev);
  	adap->owner = THIS_MODULE;
  	adap->class = I2C_CLASS_DEPRECATED;
  	ACPI_COMPANION_SET(&adap->dev, ACPI_COMPANION(&pdev->dev));

Does device_enable_async_suspend() need to be called before enabling runtime PM? I suppose not since there appears to have also related sysfs node for toggling it runtime.

I'm thinking if you could move the device_enable_async_suspend() call into drivers/i2c/busses/i2c-designware-core.c: i2c_dw_probe() and then also PCI enumerated adapter could take advantage of it.

Signature · 1 line
Jarkko
#2 lore raw
Quoted 42 lines · Jarkko Nikula

Hi

Quoted 7 lines · Zhonghui

Now, PM core supports asynchronous suspend/resume mode for devices during system suspend/resume, and the power state transition of one device may be completed in separate kernel thread. PM core ensures all power state transition dependency between devices. This patch enables designware i2c controllers to suspend/resume asynchronously.
This will take advantage of multicore and improve system

Quoted 9 lines

suspend/resume
speed. After enabling all i2c devices, i2c adapters and i2c controllers
on ASUS T100TA tablet, the system suspend-to-idle time is reduced to
about 510ms from 750ms, and the system resume time is reduced to about
790ms from 900ms.

Nice reduction :-)

Quoted 13 lines
drivers/i2c/busses/i2c-designware-platdrv.c +1 -0
index 6b00061..395130b 100644
@@ -230,6 +230,7 @@ static int dw_i2c_plat_probe(struct
 platform_device *pdev)
   	}
 
   	adap = &dev->adapter;
+	device_enable_async_suspend(&pdev->dev);
   	adap->owner = THIS_MODULE;
   	adap->class = I2C_CLASS_DEPRECATED;
Quoted 2 lines

   ACPI_COMPANION_SET(&adap->dev, ACPI_COMPANION(&pdev-

Quoted 1 line

dev));

Does device_enable_async_suspend() need to be called before enabling runtime PM? I suppose not since there appears to have also related sysfs
node for toggling it runtime.

Quoted 4 lines

I'm thinking if you could move the device_enable_async_suspend() call into drivers/i2c/busses/i2c-designware-core.c: i2c_dw_probe() and then
also PCI enumerated adapter could take advantage of it.

I concern about Intel BayTrail-T / Braswell / CherryTrail cases, since we have non-trivial PM for LPSS there. Zhonghui, have you a chance to stress test this on platforms based on mentioned SoCs?

Signature · 2 lines
Andy Shevchenko <[email protected]>
Intel Finland Oy
#4 lore raw
In reply to Jarkko Nikula
Quoted 31 lines · Jarkko Nikula

Hi

Quoted 11 lines · Zhonghui

Now, PM core supports asynchronous suspend/resume mode for devices during system suspend/resume, and the power state transition of one device may be completed in separate kernel thread. PM core ensures all power state transition dependency between devices. This patch enables designware i2c controllers to suspend/resume asynchronously. This will take advantage of multicore and improve system suspend/resume speed. After enabling all i2c devices, i2c adapters and i2c controllers on ASUS T100TA tablet, the system suspend-to-idle time is reduced to about 510ms from 750ms, and the system resume time is reduced to about 790ms from 900ms.

Nice reduction :-)

drivers/i2c/busses/i2c-designware-platdrv.c static int dw_i2c_plat_probe(struct platform_device *pdev) · line 236

Quoted 12 lines
drivers/i2c/busses/i2c-designware-platdrv.c +1 -0
index 6b00061..395130b 100644
@@ -230,6 +230,7 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
      }
 
      adap = &dev->adapter;
+    device_enable_async_suspend(&pdev->dev);
      adap->owner = THIS_MODULE;
      adap->class = I2C_CLASS_DEPRECATED;
      ACPI_COMPANION_SET(&adap->dev, ACPI_COMPANION(&pdev->dev));

Does device_enable_async_suspend() need to be called before enabling runtime PM? I suppose not since there appears to have also related sysfs node for toggling it runtime.

Quoted 1 line

I'm thinking if you could move the device_enable_async_suspend() call into drivers/i2c/busses/i2c-designware-core.c: i2c_dw_probe() and then also PCI enumerated adapter could take advantage of it.

Because of long leave, so sorry for late reply.

Your proposal is right. I have submitted a new patch according to your comments - "[PATCH v2] i2c/designware: enable i2c controller to suspend/resume asynchronously".

Thanks,
Zhonghui

#3 lore raw
In reply to Andy Shevchenko
Quoted 42 lines · Andy Shevchenko
Quoted 41 lines · Jarkko Nikula

Hi

Quoted 7 lines · Zhonghui

Now, PM core supports asynchronous suspend/resume mode for devices during system suspend/resume, and the power state transition of one device may be completed in separate kernel thread. PM core ensures all power state transition dependency between devices. This patch enables designware i2c controllers to suspend/resume asynchronously.
This will take advantage of multicore and improve system

Quoted 9 lines

suspend/resume
speed. After enabling all i2c devices, i2c adapters and i2c controllers
on ASUS T100TA tablet, the system suspend-to-idle time is reduced to
about 510ms from 750ms, and the system resume time is reduced to about
790ms from 900ms.

Nice reduction :-)

Quoted 13 lines
drivers/i2c/busses/i2c-designware-platdrv.c +1 -0
index 6b00061..395130b 100644
@@ -230,6 +230,7 @@ static int dw_i2c_plat_probe(struct
 platform_device *pdev)
  	}
 
  	adap = &dev->adapter;
+	device_enable_async_suspend(&pdev->dev);
  	adap->owner = THIS_MODULE;
  	adap->class = I2C_CLASS_DEPRECATED;
Quoted 2 lines

ACPI_COMPANION_SET(&adap->dev, ACPI_COMPANION(&pdev-

Quoted 1 line

dev));

Does device_enable_async_suspend() need to be called before enabling runtime PM? I suppose not since there appears to have also related sysfs
node for toggling it runtime.

Quoted 7 lines
Quoted 4 lines

I'm thinking if you could move the device_enable_async_suspend() call into drivers/i2c/busses/i2c-designware-core.c: i2c_dw_probe() and then
also PCI enumerated adapter could take advantage of it.

I concern about Intel BayTrail-T / Braswell / CherryTrail cases, since we have non-trivial PM for LPSS there. Zhonghui, have you a chance to stress test this on platforms based on mentioned SoCs?

Because of long leave, so sorry for late reply.

I understand what you said, if enable all LPSS devices suspend/resume asynchronously, the system can't resume sometimes on ASUS T100TA(BayTrail-T SoC). But, I have verified that the system can resume normally every time if enable only i2c controller async mode and let other LPSS devices in sync mode on ASUS T100TA. I have no Braswell and cherryTrail platforms, so no verification test on them.

I have submitted a new version of this patch to move the device_enable_async_suspend() call into i2c_dw_proble() function - "[PATCH v2] i2c/designware: enable i2c controller to suspend/resume asynchronously".

Thanks,
Zhonghui

Quoted 2 lines