mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 02:17:36 -04:00
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:
committed by
Bjorn Andersson
parent
e5f54cda9d
commit
8f4ce470ff
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user