Re: [PATCH] PCI: qcom: Prevent GDSC power down on suspend
From: Jagadeesh Kona
Date: Fri Sep 25 2026 - 01:00:14 EST
On 2/18/2026 6:03 PM, Manivannan Sadhasivam wrote:
> On Wed, Jan 28, 2026 at 08:13:48AM -0600, Bjorn Andersson wrote:
>> On Wed, Jan 28, 2026 at 05:52:42PM +0530, Krishna Chaitanya Chundru wrote:
>>> Currently, the driver expects the devices to remain in D0 across system
>>> suspend, but the genpd framework may still power down the associated
>>> GDSC during suspend. When that happens, the PCIe link goes down and
>>> cannot be recovered on resume.
>>>
>>
>> The GDSC is a child of CX, so by keeping it always-on, you effectively
>> put an always-on vote on CX, forever preventing CXPC.
>>
>> In fact, this is one of the reasons why the PCIe GDSCs on most targets
>> is marked PWRSTS_RET_ON (in the clock driver) so that the "off state"
>> doesn't actually turn off the GDSC, but it relinquishes the inherited
>> vote on CX.
>>
>
Hi Bjorn,
USB host-mode and PCIe non-D3cold use cases require their respective GDSCs
to remain enabled during system suspend. This requirement exists on multiple
targets and is expected to apply to additional targets as well.
The affected GDSCs currently use PWRSTS_RET_ON flag. However, this prevents
the GDSC driver from disabling the GDSC hardware after the first enable, even
when all consumers have become inactive. As a result, the GDSC remains powered
ON unnecessarily.
We propose using the GenPD synced_poweroff flag instead. When synced_poweroff
is set, the GDSC can be disabled during suspend. When it is not set, the GDSC
remains enabled to support consumers that require it across suspend. Consumer
drivers can set this flag using dev_pm_genpd_synced_poweroff() based on their
usecase.
For the affected USB and PCIe GDSCs, this could be implemented using a poweroff
callback as below in gdsc driver:
int gdsc_synced_poweroff_disable(struct generic_pm_domain *domain)
{
struct gdsc *sc = domain_to_gdsc(domain);
/* Disable GDSC when synced_poweroff is set */
if (domain->synced_poweroff)
return gdsc_toggle_logic(sc, GDSC_OFF, false);
/* Dont disable GDSC in HW when synced_poweroff is not set */
if (sc->rsupply)
return regulator_disable(sc->rsupply);
return 0;
}
This would allow the GDSC to remain enabled only when required, while permitting
it to be powered down for other use cases.
Please let us know your comments and suggestions on this approach.
Thanks,
Jagadeesh