]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
soc: qcom: geni-se: Add resources activation/deactivation helpers
authorPraveen Talari <praveen.talari@oss.qualcomm.com>
Fri, 27 Feb 2026 06:15:36 +0000 (11:45 +0530)
committerBjorn Andersson <andersson@kernel.org>
Fri, 22 May 2026 02:56:38 +0000 (21:56 -0500)
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>
drivers/soc/qcom/qcom-geni-se.c
include/linux/soc/qcom/geni-se.h

index 2e41595ff91248ef0918720f812f356001fbe97a..6e58568701b0a35232a0fabec70f224c28bf4f38 100644 (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.
index c182dd0f0bded4483141d6166590ccef514e657f..36a68149345cf33736444776e0fa7e43dca34f49 100644 (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