soc: qcom: geni-se: Add resources activation/deactivation helpers

The GENI SE protocol drivers (I2C, SPI, UART) implement similar resource
activation/deactivation sequences independently, leading to code
duplication.

Introduce geni_se_resources_activate()/geni_se_resources_deactivate() to
power on/off resources.The activate function enables ICC, clocks, and TLMM
whereas the deactivate function disables resources in reverse order
including OPP rate reset, clocks, ICC and TLMM.

Signed-off-by: Praveen Talari <praveen.talari@oss.qualcomm.com>
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Tested-by: Mattijs Korpershoek <mkorpershoek@kernel.org>
Link: https://lore.kernel.org/r/20260227061544.1785978-6-praveen.talari@oss.qualcomm.com
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
This commit is contained in:
Praveen Talari
2026-02-27 11:45:36 +05:30
committed by Bjorn Andersson
parent e5f54cda9d
commit 8f4ce470ff
2 changed files with 74 additions and 0 deletions

View File

@@ -1025,6 +1025,76 @@ int geni_icc_disable(struct geni_se *se)
}
EXPORT_SYMBOL_GPL(geni_icc_disable);
/**
* geni_se_resources_deactivate() - Deactivate GENI SE device resources
* @se: Pointer to the geni_se structure
*
* Deactivates device resources for power saving: OPP rate to 0, pin control
* to sleep state, turns off clocks, and disables interconnect. Skips ACPI devices.
*
* Return: 0 on success, negative error code on failure
*/
int geni_se_resources_deactivate(struct geni_se *se)
{
int ret;
if (has_acpi_companion(se->dev))
return 0;
if (se->has_opp)
dev_pm_opp_set_rate(se->dev, 0);
ret = pinctrl_pm_select_sleep_state(se->dev);
if (ret)
return ret;
geni_se_clks_off(se);
return geni_icc_disable(se);
}
EXPORT_SYMBOL_GPL(geni_se_resources_deactivate);
/**
* geni_se_resources_activate() - Activate GENI SE device resources
* @se: Pointer to the geni_se structure
*
* Activates device resources for operation: enables interconnect, prepares clocks,
* and sets pin control to default state. Includes error cleanup. Skips ACPI devices.
*
* Unlike geni_se_resources_deactivate(), this function doesn't alter the
* connected genpds' performance states, which must be additionally handled.
*
* Return: 0 on success, negative error code on failure
*/
int geni_se_resources_activate(struct geni_se *se)
{
int ret;
if (has_acpi_companion(se->dev))
return 0;
ret = geni_icc_enable(se);
if (ret)
return ret;
ret = geni_se_clks_on(se);
if (ret)
goto out_icc_disable;
ret = pinctrl_pm_select_default_state(se->dev);
if (ret) {
geni_se_clks_off(se);
goto out_icc_disable;
}
return 0;
out_icc_disable:
geni_icc_disable(se);
return ret;
}
EXPORT_SYMBOL_GPL(geni_se_resources_activate);
/**
* geni_se_resources_init() - Initialize resources for a GENI SE device.
* @se: Pointer to the geni_se structure representing the GENI SE device.

View File

@@ -541,6 +541,10 @@ int geni_icc_disable(struct geni_se *se);
int geni_se_resources_init(struct geni_se *se);
int geni_se_resources_activate(struct geni_se *se);
int geni_se_resources_deactivate(struct geni_se *se);
int geni_load_se_firmware(struct geni_se *se, enum geni_se_protocol_type protocol);
#endif
#endif