linux-arm-msm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/2] soc: qcom: pmic_glink: Add support for subsystem restart (SSR)
@ 2025-07-16  0:40 Anjelique Melendez
  2025-07-16  0:40 ` [PATCH v2 1/2] dt-bindings: soc: qcom: qcom,pmic-glink: Add qcom,subsys-restart property Anjelique Melendez
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Anjelique Melendez @ 2025-07-16  0:40 UTC (permalink / raw)
  To: andersson, konradybcio, robh, krzk+dt, conor+dt
  Cc: dmitry.baryshkov, linux-arm-msm, devicetree, linux-kernel

Add support for PMIC Glink subsystem restart (SSR) so that PMIC Glink
clients are aware of when subsytem come up or down. 

Changes since v1:
 - Add "qcom,subsys-restart" dt property to enable SSR
 - Add ssr_name to platform data 
 - link: https://lore.kernel.org/all/20250624225535.2013141-1-anjelique.melendez@oss.qualcomm.com/

Anjelique Melendez (2):
  dt-bindings: soc: qcom: qcom,pmic-glink: Add qcom,subsys-restart
    property
  soc: qcom: pmic_glink: Add support for subsystem restart (SSR)

 .../bindings/soc/qcom/qcom,pmic-glink.yaml    |  4 +
 drivers/soc/qcom/pmic_glink.c                 | 80 ++++++++++++++-----
 2 files changed, 63 insertions(+), 21 deletions(-)

-- 
2.34.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2 1/2] dt-bindings: soc: qcom: qcom,pmic-glink: Add qcom,subsys-restart property
  2025-07-16  0:40 [PATCH v2 0/2] soc: qcom: pmic_glink: Add support for subsystem restart (SSR) Anjelique Melendez
@ 2025-07-16  0:40 ` Anjelique Melendez
  2025-07-16  8:33   ` Krzysztof Kozlowski
  2025-07-20  4:15   ` Bjorn Andersson
  2025-07-16  0:40 ` [PATCH v2 2/2] soc: qcom: pmic_glink: Add support for subsystem restart (SSR) Anjelique Melendez
  2025-07-16  8:36 ` [PATCH v2 0/2] " Krzysztof Kozlowski
  2 siblings, 2 replies; 8+ messages in thread
From: Anjelique Melendez @ 2025-07-16  0:40 UTC (permalink / raw)
  To: andersson, konradybcio, robh, krzk+dt, conor+dt
  Cc: dmitry.baryshkov, linux-arm-msm, devicetree, linux-kernel

Add new "qcom,subsys-restart" property to enable subsystem restart (SSR)
notifications.

Signed-off-by: Anjelique Melendez <anjelique.melendez@oss.qualcomm.com>
---
 .../devicetree/bindings/soc/qcom/qcom,pmic-glink.yaml         | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/Documentation/devicetree/bindings/soc/qcom/qcom,pmic-glink.yaml b/Documentation/devicetree/bindings/soc/qcom/qcom,pmic-glink.yaml
index 4c9e78f29523..90011096894e 100644
--- a/Documentation/devicetree/bindings/soc/qcom/qcom,pmic-glink.yaml
+++ b/Documentation/devicetree/bindings/soc/qcom/qcom,pmic-glink.yaml
@@ -49,6 +49,10 @@ properties:
   '#size-cells':
     const: 0
 
+  qcom,subsys-restart:
+    description: If property is specified subsystem restart (SSR) notifications will be enabled.
+    type: boolean
+
   orientation-gpios:
     description: Array of input gpios for the Type-C connector orientation indication.
       The GPIO indication is used to detect the orientation of the Type-C connector.
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 2/2] soc: qcom: pmic_glink: Add support for subsystem restart (SSR)
  2025-07-16  0:40 [PATCH v2 0/2] soc: qcom: pmic_glink: Add support for subsystem restart (SSR) Anjelique Melendez
  2025-07-16  0:40 ` [PATCH v2 1/2] dt-bindings: soc: qcom: qcom,pmic-glink: Add qcom,subsys-restart property Anjelique Melendez
@ 2025-07-16  0:40 ` Anjelique Melendez
  2025-07-16  8:35   ` Krzysztof Kozlowski
  2025-07-20  4:18   ` Bjorn Andersson
  2025-07-16  8:36 ` [PATCH v2 0/2] " Krzysztof Kozlowski
  2 siblings, 2 replies; 8+ messages in thread
From: Anjelique Melendez @ 2025-07-16  0:40 UTC (permalink / raw)
  To: andersson, konradybcio, robh, krzk+dt, conor+dt
  Cc: dmitry.baryshkov, linux-arm-msm, devicetree, linux-kernel

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=y, Size: 7190 bytes --]

Add support for PMIC Glink clients to receive notificiation when
the subsystem goes down and comes up again.

Signed-off-by: Anjelique Melendez <anjelique.melendez@oss.qualcomm.com>
---
 drivers/soc/qcom/pmic_glink.c | 80 ++++++++++++++++++++++++++---------
 1 file changed, 59 insertions(+), 21 deletions(-)

diff --git a/drivers/soc/qcom/pmic_glink.c b/drivers/soc/qcom/pmic_glink.c
index 0a6d325b195c..3e755073db60 100644
--- a/drivers/soc/qcom/pmic_glink.c
+++ b/drivers/soc/qcom/pmic_glink.c
@@ -2,6 +2,7 @@
 /*
  * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
  * Copyright (c) 2022, Linaro Ltd
+ * ​​​​Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
  */
 #include <linux/auxiliary_bus.h>
 #include <linux/cleanup.h>
@@ -9,6 +10,7 @@
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/platform_device.h>
+#include <linux/remoteproc/qcom_rproc.h>
 #include <linux/rpmsg.h>
 #include <linux/slab.h>
 #include <linux/soc/qcom/pdr.h>
@@ -23,13 +25,18 @@ enum {
 	PMIC_GLINK_CLIENT_UCSI,
 };
 
+struct pmic_glink_data {
+	unsigned long	client_mask;
+	char		*ssr_name;
+};
+
 struct pmic_glink {
 	struct device *dev;
 	struct pdr_handle *pdr;
 
 	struct rpmsg_endpoint *ept;
 
-	unsigned long client_mask;
+	const struct pmic_glink_data *data;
 
 	struct auxiliary_device altmode_aux;
 	struct auxiliary_device ps_aux;
@@ -39,10 +46,14 @@ struct pmic_glink {
 	struct mutex state_lock;
 	unsigned int client_state;
 	unsigned int pdr_state;
+	unsigned int ssr_state;
 
 	/* serializing clients list updates */
 	spinlock_t client_lock;
 	struct list_head clients;
+
+	struct notifier_block ssr_nb;
+	void *ssr_handle;
 };
 
 static struct pmic_glink *__pmic_glink;
@@ -205,10 +216,13 @@ static void pmic_glink_state_notify_clients(struct pmic_glink *pg)
 	unsigned long flags;
 
 	if (pg->client_state != SERVREG_SERVICE_STATE_UP) {
-		if (pg->pdr_state == SERVREG_SERVICE_STATE_UP && pg->ept)
+		if ((pg->pdr_state == SERVREG_SERVICE_STATE_UP ||
+		     pg->ssr_state == QCOM_SSR_AFTER_POWERUP) && pg->ept)
 			new_state = SERVREG_SERVICE_STATE_UP;
 	} else {
-		if (pg->pdr_state == SERVREG_SERVICE_STATE_DOWN || !pg->ept)
+		if (pg->pdr_state == SERVREG_SERVICE_STATE_DOWN ||
+		    pg->ssr_state == QCOM_SSR_BEFORE_SHUTDOWN ||
+		    !pg->ept)
 			new_state = SERVREG_SERVICE_STATE_DOWN;
 	}
 
@@ -231,6 +245,18 @@ static void pmic_glink_pdr_callback(int state, char *svc_path, void *priv)
 	pmic_glink_state_notify_clients(pg);
 }
 
+static int pmic_glink_ssr_callback(struct notifier_block *nb, unsigned long code, void *data)
+{
+	struct pmic_glink *pg = container_of(nb, struct pmic_glink, ssr_nb);
+
+	mutex_lock(&pg->state_lock);
+	pg->ssr_state = code;
+
+	pmic_glink_state_notify_clients(pg);
+	mutex_unlock(&pg->state_lock);
+	return 0;
+}
+
 static int pmic_glink_rpmsg_probe(struct rpmsg_device *rpdev)
 {
 	struct pmic_glink *pg;
@@ -280,7 +306,6 @@ static struct rpmsg_driver pmic_glink_rpmsg_driver = {
 
 static int pmic_glink_probe(struct platform_device *pdev)
 {
-	const unsigned long *match_data;
 	struct pdr_service *service;
 	struct pmic_glink *pg;
 	int ret;
@@ -297,12 +322,10 @@ static int pmic_glink_probe(struct platform_device *pdev)
 	spin_lock_init(&pg->client_lock);
 	mutex_init(&pg->state_lock);
 
-	match_data = (unsigned long *)of_device_get_match_data(&pdev->dev);
-	if (!match_data)
+	pg->data = of_device_get_match_data(&pdev->dev);
+	if (!pg->data)
 		return -EINVAL;
 
-	pg->client_mask = *match_data;
-
 	pg->pdr = pdr_handle_alloc(pmic_glink_pdr_callback, pg);
 	if (IS_ERR(pg->pdr)) {
 		ret = dev_err_probe(&pdev->dev, PTR_ERR(pg->pdr),
@@ -310,17 +333,17 @@ static int pmic_glink_probe(struct platform_device *pdev)
 		return ret;
 	}
 
-	if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_UCSI)) {
+	if (pg->data->client_mask & BIT(PMIC_GLINK_CLIENT_UCSI)) {
 		ret = pmic_glink_add_aux_device(pg, &pg->ucsi_aux, "ucsi");
 		if (ret)
 			goto out_release_pdr_handle;
 	}
-	if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_ALTMODE)) {
+	if (pg->data->client_mask & BIT(PMIC_GLINK_CLIENT_ALTMODE)) {
 		ret = pmic_glink_add_aux_device(pg, &pg->altmode_aux, "altmode");
 		if (ret)
 			goto out_release_ucsi_aux;
 	}
-	if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_BATT)) {
+	if (pg->data->client_mask & BIT(PMIC_GLINK_CLIENT_BATT)) {
 		ret = pmic_glink_add_aux_device(pg, &pg->ps_aux, "power-supply");
 		if (ret)
 			goto out_release_altmode_aux;
@@ -333,6 +356,16 @@ static int pmic_glink_probe(struct platform_device *pdev)
 		goto out_release_aux_devices;
 	}
 
+	if (device_property_present(&pdev->dev, "qcom,subsys-restart")) {
+		pg->ssr_nb.notifier_call = pmic_glink_ssr_callback;
+		pg->ssr_handle = qcom_register_ssr_notifier(pg->data->ssr_name, &pg->ssr_nb);
+		if (IS_ERR(pg->ssr_handle)) {
+			ret = dev_err_probe(&pdev->dev, PTR_ERR(pg->ssr_handle),
+					"failed adding ssr notifier\n");
+			goto out_release_aux_devices;
+		}
+	}
+
 	mutex_lock(&__pmic_glink_lock);
 	__pmic_glink = pg;
 	mutex_unlock(&__pmic_glink_lock);
@@ -340,13 +373,13 @@ static int pmic_glink_probe(struct platform_device *pdev)
 	return 0;
 
 out_release_aux_devices:
-	if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_BATT))
+	if (pg->data->client_mask & BIT(PMIC_GLINK_CLIENT_BATT))
 		pmic_glink_del_aux_device(pg, &pg->ps_aux);
 out_release_altmode_aux:
-	if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_ALTMODE))
+	if (pg->data->client_mask & BIT(PMIC_GLINK_CLIENT_ALTMODE))
 		pmic_glink_del_aux_device(pg, &pg->altmode_aux);
 out_release_ucsi_aux:
-	if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_UCSI))
+	if (pg->data->client_mask & BIT(PMIC_GLINK_CLIENT_UCSI))
 		pmic_glink_del_aux_device(pg, &pg->ucsi_aux);
 out_release_pdr_handle:
 	pdr_handle_release(pg->pdr);
@@ -360,23 +393,28 @@ static void pmic_glink_remove(struct platform_device *pdev)
 
 	pdr_handle_release(pg->pdr);
 
-	if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_BATT))
+	if (pg->ssr_handle)
+		qcom_unregister_ssr_notifier(pg->ssr_handle, &pg->ssr_nb);
+	if (pg->data->client_mask & BIT(PMIC_GLINK_CLIENT_BATT))
 		pmic_glink_del_aux_device(pg, &pg->ps_aux);
-	if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_ALTMODE))
+	if (pg->data->client_mask & BIT(PMIC_GLINK_CLIENT_ALTMODE))
 		pmic_glink_del_aux_device(pg, &pg->altmode_aux);
-	if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_UCSI))
+	if (pg->data->client_mask & BIT(PMIC_GLINK_CLIENT_UCSI))
 		pmic_glink_del_aux_device(pg, &pg->ucsi_aux);
 
 	guard(mutex)(&__pmic_glink_lock);
 	__pmic_glink = NULL;
 }
 
-static const unsigned long pmic_glink_sm8450_client_mask = BIT(PMIC_GLINK_CLIENT_BATT) |
-							   BIT(PMIC_GLINK_CLIENT_ALTMODE) |
-							   BIT(PMIC_GLINK_CLIENT_UCSI);
+static const struct pmic_glink_data pmic_glink_sm8450_data = {
+	.client_mask = BIT(PMIC_GLINK_CLIENT_BATT) |
+		       BIT(PMIC_GLINK_CLIENT_ALTMODE) |
+		       BIT(PMIC_GLINK_CLIENT_UCSI),
+	.ssr_name = "lpass",
+};
 
 static const struct of_device_id pmic_glink_of_match[] = {
-	{ .compatible = "qcom,pmic-glink", .data = &pmic_glink_sm8450_client_mask },
+	{ .compatible = "qcom,pmic-glink", .data = &pmic_glink_sm8450_data },
 	{}
 };
 MODULE_DEVICE_TABLE(of, pmic_glink_of_match);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 1/2] dt-bindings: soc: qcom: qcom,pmic-glink: Add qcom,subsys-restart property
  2025-07-16  0:40 ` [PATCH v2 1/2] dt-bindings: soc: qcom: qcom,pmic-glink: Add qcom,subsys-restart property Anjelique Melendez
@ 2025-07-16  8:33   ` Krzysztof Kozlowski
  2025-07-20  4:15   ` Bjorn Andersson
  1 sibling, 0 replies; 8+ messages in thread
From: Krzysztof Kozlowski @ 2025-07-16  8:33 UTC (permalink / raw)
  To: Anjelique Melendez
  Cc: andersson, konradybcio, robh, krzk+dt, conor+dt, dmitry.baryshkov,
	linux-arm-msm, devicetree, linux-kernel

On Tue, Jul 15, 2025 at 05:40:03PM -0700, Anjelique Melendez wrote:
> Add new "qcom,subsys-restart" property to enable subsystem restart (SSR)
> notifications.
> 
> Signed-off-by: Anjelique Melendez <anjelique.melendez@oss.qualcomm.com>
> ---
>  .../devicetree/bindings/soc/qcom/qcom,pmic-glink.yaml         | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/soc/qcom/qcom,pmic-glink.yaml b/Documentation/devicetree/bindings/soc/qcom/qcom,pmic-glink.yaml
> index 4c9e78f29523..90011096894e 100644
> --- a/Documentation/devicetree/bindings/soc/qcom/qcom,pmic-glink.yaml
> +++ b/Documentation/devicetree/bindings/soc/qcom/qcom,pmic-glink.yaml
> @@ -49,6 +49,10 @@ properties:
>    '#size-cells':
>      const: 0
>  
> +  qcom,subsys-restart:
> +    description: If property is specified subsystem restart (SSR) notifications will be enabled.


Please wrap according to Linux coding style... if this stays, because
this all sounds like Linux notificatons, so an OS property.

The commit msg explains nothing - just repeats this. You need to
describe the hardware and the reasons behind this change - WHY you are
doing things - in terms of hardware.

Best regards,
Krzysztof


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 2/2] soc: qcom: pmic_glink: Add support for subsystem restart (SSR)
  2025-07-16  0:40 ` [PATCH v2 2/2] soc: qcom: pmic_glink: Add support for subsystem restart (SSR) Anjelique Melendez
@ 2025-07-16  8:35   ` Krzysztof Kozlowski
  2025-07-20  4:18   ` Bjorn Andersson
  1 sibling, 0 replies; 8+ messages in thread
From: Krzysztof Kozlowski @ 2025-07-16  8:35 UTC (permalink / raw)
  To: Anjelique Melendez
  Cc: andersson, konradybcio, robh, krzk+dt, conor+dt, dmitry.baryshkov,
	linux-arm-msm, devicetree, linux-kernel

On Tue, Jul 15, 2025 at 05:40:04PM -0700, Anjelique Melendez wrote:
> @@ -333,6 +356,16 @@ static int pmic_glink_probe(struct platform_device *pdev)
>  		goto out_release_aux_devices;
>  	}
>  
> +	if (device_property_present(&pdev->dev, "qcom,subsys-restart")) {
> +		pg->ssr_nb.notifier_call = pmic_glink_ssr_callback;
> +		pg->ssr_handle = qcom_register_ssr_notifier(pg->data->ssr_name, &pg->ssr_nb);

... and that's srcu_notifier_chain_register, so clearly you described
Linux in your bindings which is obvious NAK.

Best regards,
Krzysztof


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 0/2] soc: qcom: pmic_glink: Add support for subsystem restart (SSR)
  2025-07-16  0:40 [PATCH v2 0/2] soc: qcom: pmic_glink: Add support for subsystem restart (SSR) Anjelique Melendez
  2025-07-16  0:40 ` [PATCH v2 1/2] dt-bindings: soc: qcom: qcom,pmic-glink: Add qcom,subsys-restart property Anjelique Melendez
  2025-07-16  0:40 ` [PATCH v2 2/2] soc: qcom: pmic_glink: Add support for subsystem restart (SSR) Anjelique Melendez
@ 2025-07-16  8:36 ` Krzysztof Kozlowski
  2 siblings, 0 replies; 8+ messages in thread
From: Krzysztof Kozlowski @ 2025-07-16  8:36 UTC (permalink / raw)
  To: Anjelique Melendez
  Cc: andersson, konradybcio, robh, krzk+dt, conor+dt, dmitry.baryshkov,
	linux-arm-msm, devicetree, linux-kernel

On Tue, Jul 15, 2025 at 05:40:02PM -0700, Anjelique Melendez wrote:
> Add support for PMIC Glink subsystem restart (SSR) so that PMIC Glink
> clients are aware of when subsytem come up or down. 
> 
> Changes since v1:
>  - Add "qcom,subsys-restart" dt property to enable SSR

Now I noticed that I repeated feedback you received at v1, which you
just ignored, so you ask us to do the thing twice.

That's not the way to go and it is very dissapointing because I value my
time. Address the feedback at v1.

NAK

Best regards,
Krzysztof


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 1/2] dt-bindings: soc: qcom: qcom,pmic-glink: Add qcom,subsys-restart property
  2025-07-16  0:40 ` [PATCH v2 1/2] dt-bindings: soc: qcom: qcom,pmic-glink: Add qcom,subsys-restart property Anjelique Melendez
  2025-07-16  8:33   ` Krzysztof Kozlowski
@ 2025-07-20  4:15   ` Bjorn Andersson
  1 sibling, 0 replies; 8+ messages in thread
From: Bjorn Andersson @ 2025-07-20  4:15 UTC (permalink / raw)
  To: Anjelique Melendez
  Cc: konradybcio, robh, krzk+dt, conor+dt, dmitry.baryshkov,
	linux-arm-msm, devicetree, linux-kernel

On Tue, Jul 15, 2025 at 05:40:03PM -0700, Anjelique Melendez wrote:
> Add new "qcom,subsys-restart" property to enable subsystem restart (SSR)
> notifications.
> 

Please follow
https://docs.kernel.org/process/submitting-patches.html#describe-your-changes
and fully describe what problem your patch is solving.

Most people have no idea what subsystem restart means, and those who do
has to guess what it means for pmic-glink.

> Signed-off-by: Anjelique Melendez <anjelique.melendez@oss.qualcomm.com>
> ---
>  .../devicetree/bindings/soc/qcom/qcom,pmic-glink.yaml         | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/soc/qcom/qcom,pmic-glink.yaml b/Documentation/devicetree/bindings/soc/qcom/qcom,pmic-glink.yaml
> index 4c9e78f29523..90011096894e 100644
> --- a/Documentation/devicetree/bindings/soc/qcom/qcom,pmic-glink.yaml
> +++ b/Documentation/devicetree/bindings/soc/qcom/qcom,pmic-glink.yaml
> @@ -49,6 +49,10 @@ properties:
>    '#size-cells':
>      const: 0
>  
> +  qcom,subsys-restart:

And my guess is unfortunately that this doesn't describe the
hardware/firmware, but that this is configuring the OS behavior.

Please write a commit message that doesn't force me to guess.

Regards,
Bjorn

> +    description: If property is specified subsystem restart (SSR) notifications will be enabled.
> +    type: boolean
> +
>    orientation-gpios:
>      description: Array of input gpios for the Type-C connector orientation indication.
>        The GPIO indication is used to detect the orientation of the Type-C connector.
> -- 
> 2.34.1
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 2/2] soc: qcom: pmic_glink: Add support for subsystem restart (SSR)
  2025-07-16  0:40 ` [PATCH v2 2/2] soc: qcom: pmic_glink: Add support for subsystem restart (SSR) Anjelique Melendez
  2025-07-16  8:35   ` Krzysztof Kozlowski
@ 2025-07-20  4:18   ` Bjorn Andersson
  1 sibling, 0 replies; 8+ messages in thread
From: Bjorn Andersson @ 2025-07-20  4:18 UTC (permalink / raw)
  To: Anjelique Melendez
  Cc: konradybcio, robh, krzk+dt, conor+dt, dmitry.baryshkov,
	linux-arm-msm, devicetree, linux-kernel

On Tue, Jul 15, 2025 at 05:40:04PM -0700, Anjelique Melendez wrote:
> Add support for PMIC Glink clients to receive notificiation when
> the subsystem goes down and comes up again.
> 

When I restart the adsp on my devices, I can see pmic glink reacting to
that (and UCSI oopsing). So please describe what's actually missing in
the current implementation.

Regards,
Bjorn

> Signed-off-by: Anjelique Melendez <anjelique.melendez@oss.qualcomm.com>
> ---
>  drivers/soc/qcom/pmic_glink.c | 80 ++++++++++++++++++++++++++---------
>  1 file changed, 59 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/soc/qcom/pmic_glink.c b/drivers/soc/qcom/pmic_glink.c
> index 0a6d325b195c..3e755073db60 100644
> --- a/drivers/soc/qcom/pmic_glink.c
> +++ b/drivers/soc/qcom/pmic_glink.c
> @@ -2,6 +2,7 @@
>  /*
>   * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
>   * Copyright (c) 2022, Linaro Ltd
> + * ​​​​Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
>   */
>  #include <linux/auxiliary_bus.h>
>  #include <linux/cleanup.h>
> @@ -9,6 +10,7 @@
>  #include <linux/module.h>
>  #include <linux/of.h>
>  #include <linux/platform_device.h>
> +#include <linux/remoteproc/qcom_rproc.h>
>  #include <linux/rpmsg.h>
>  #include <linux/slab.h>
>  #include <linux/soc/qcom/pdr.h>
> @@ -23,13 +25,18 @@ enum {
>  	PMIC_GLINK_CLIENT_UCSI,
>  };
>  
> +struct pmic_glink_data {
> +	unsigned long	client_mask;
> +	char		*ssr_name;
> +};
> +
>  struct pmic_glink {
>  	struct device *dev;
>  	struct pdr_handle *pdr;
>  
>  	struct rpmsg_endpoint *ept;
>  
> -	unsigned long client_mask;
> +	const struct pmic_glink_data *data;
>  
>  	struct auxiliary_device altmode_aux;
>  	struct auxiliary_device ps_aux;
> @@ -39,10 +46,14 @@ struct pmic_glink {
>  	struct mutex state_lock;
>  	unsigned int client_state;
>  	unsigned int pdr_state;
> +	unsigned int ssr_state;
>  
>  	/* serializing clients list updates */
>  	spinlock_t client_lock;
>  	struct list_head clients;
> +
> +	struct notifier_block ssr_nb;
> +	void *ssr_handle;
>  };
>  
>  static struct pmic_glink *__pmic_glink;
> @@ -205,10 +216,13 @@ static void pmic_glink_state_notify_clients(struct pmic_glink *pg)
>  	unsigned long flags;
>  
>  	if (pg->client_state != SERVREG_SERVICE_STATE_UP) {
> -		if (pg->pdr_state == SERVREG_SERVICE_STATE_UP && pg->ept)
> +		if ((pg->pdr_state == SERVREG_SERVICE_STATE_UP ||
> +		     pg->ssr_state == QCOM_SSR_AFTER_POWERUP) && pg->ept)
>  			new_state = SERVREG_SERVICE_STATE_UP;
>  	} else {
> -		if (pg->pdr_state == SERVREG_SERVICE_STATE_DOWN || !pg->ept)
> +		if (pg->pdr_state == SERVREG_SERVICE_STATE_DOWN ||
> +		    pg->ssr_state == QCOM_SSR_BEFORE_SHUTDOWN ||
> +		    !pg->ept)
>  			new_state = SERVREG_SERVICE_STATE_DOWN;
>  	}
>  
> @@ -231,6 +245,18 @@ static void pmic_glink_pdr_callback(int state, char *svc_path, void *priv)
>  	pmic_glink_state_notify_clients(pg);
>  }
>  
> +static int pmic_glink_ssr_callback(struct notifier_block *nb, unsigned long code, void *data)
> +{
> +	struct pmic_glink *pg = container_of(nb, struct pmic_glink, ssr_nb);
> +
> +	mutex_lock(&pg->state_lock);
> +	pg->ssr_state = code;
> +
> +	pmic_glink_state_notify_clients(pg);
> +	mutex_unlock(&pg->state_lock);
> +	return 0;
> +}
> +
>  static int pmic_glink_rpmsg_probe(struct rpmsg_device *rpdev)
>  {
>  	struct pmic_glink *pg;
> @@ -280,7 +306,6 @@ static struct rpmsg_driver pmic_glink_rpmsg_driver = {
>  
>  static int pmic_glink_probe(struct platform_device *pdev)
>  {
> -	const unsigned long *match_data;
>  	struct pdr_service *service;
>  	struct pmic_glink *pg;
>  	int ret;
> @@ -297,12 +322,10 @@ static int pmic_glink_probe(struct platform_device *pdev)
>  	spin_lock_init(&pg->client_lock);
>  	mutex_init(&pg->state_lock);
>  
> -	match_data = (unsigned long *)of_device_get_match_data(&pdev->dev);
> -	if (!match_data)
> +	pg->data = of_device_get_match_data(&pdev->dev);
> +	if (!pg->data)
>  		return -EINVAL;
>  
> -	pg->client_mask = *match_data;
> -
>  	pg->pdr = pdr_handle_alloc(pmic_glink_pdr_callback, pg);
>  	if (IS_ERR(pg->pdr)) {
>  		ret = dev_err_probe(&pdev->dev, PTR_ERR(pg->pdr),
> @@ -310,17 +333,17 @@ static int pmic_glink_probe(struct platform_device *pdev)
>  		return ret;
>  	}
>  
> -	if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_UCSI)) {
> +	if (pg->data->client_mask & BIT(PMIC_GLINK_CLIENT_UCSI)) {
>  		ret = pmic_glink_add_aux_device(pg, &pg->ucsi_aux, "ucsi");
>  		if (ret)
>  			goto out_release_pdr_handle;
>  	}
> -	if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_ALTMODE)) {
> +	if (pg->data->client_mask & BIT(PMIC_GLINK_CLIENT_ALTMODE)) {
>  		ret = pmic_glink_add_aux_device(pg, &pg->altmode_aux, "altmode");
>  		if (ret)
>  			goto out_release_ucsi_aux;
>  	}
> -	if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_BATT)) {
> +	if (pg->data->client_mask & BIT(PMIC_GLINK_CLIENT_BATT)) {
>  		ret = pmic_glink_add_aux_device(pg, &pg->ps_aux, "power-supply");
>  		if (ret)
>  			goto out_release_altmode_aux;
> @@ -333,6 +356,16 @@ static int pmic_glink_probe(struct platform_device *pdev)
>  		goto out_release_aux_devices;
>  	}
>  
> +	if (device_property_present(&pdev->dev, "qcom,subsys-restart")) {
> +		pg->ssr_nb.notifier_call = pmic_glink_ssr_callback;
> +		pg->ssr_handle = qcom_register_ssr_notifier(pg->data->ssr_name, &pg->ssr_nb);
> +		if (IS_ERR(pg->ssr_handle)) {
> +			ret = dev_err_probe(&pdev->dev, PTR_ERR(pg->ssr_handle),
> +					"failed adding ssr notifier\n");
> +			goto out_release_aux_devices;
> +		}
> +	}
> +
>  	mutex_lock(&__pmic_glink_lock);
>  	__pmic_glink = pg;
>  	mutex_unlock(&__pmic_glink_lock);
> @@ -340,13 +373,13 @@ static int pmic_glink_probe(struct platform_device *pdev)
>  	return 0;
>  
>  out_release_aux_devices:
> -	if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_BATT))
> +	if (pg->data->client_mask & BIT(PMIC_GLINK_CLIENT_BATT))
>  		pmic_glink_del_aux_device(pg, &pg->ps_aux);
>  out_release_altmode_aux:
> -	if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_ALTMODE))
> +	if (pg->data->client_mask & BIT(PMIC_GLINK_CLIENT_ALTMODE))
>  		pmic_glink_del_aux_device(pg, &pg->altmode_aux);
>  out_release_ucsi_aux:
> -	if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_UCSI))
> +	if (pg->data->client_mask & BIT(PMIC_GLINK_CLIENT_UCSI))
>  		pmic_glink_del_aux_device(pg, &pg->ucsi_aux);
>  out_release_pdr_handle:
>  	pdr_handle_release(pg->pdr);
> @@ -360,23 +393,28 @@ static void pmic_glink_remove(struct platform_device *pdev)
>  
>  	pdr_handle_release(pg->pdr);
>  
> -	if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_BATT))
> +	if (pg->ssr_handle)
> +		qcom_unregister_ssr_notifier(pg->ssr_handle, &pg->ssr_nb);
> +	if (pg->data->client_mask & BIT(PMIC_GLINK_CLIENT_BATT))
>  		pmic_glink_del_aux_device(pg, &pg->ps_aux);
> -	if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_ALTMODE))
> +	if (pg->data->client_mask & BIT(PMIC_GLINK_CLIENT_ALTMODE))
>  		pmic_glink_del_aux_device(pg, &pg->altmode_aux);
> -	if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_UCSI))
> +	if (pg->data->client_mask & BIT(PMIC_GLINK_CLIENT_UCSI))
>  		pmic_glink_del_aux_device(pg, &pg->ucsi_aux);
>  
>  	guard(mutex)(&__pmic_glink_lock);
>  	__pmic_glink = NULL;
>  }
>  
> -static const unsigned long pmic_glink_sm8450_client_mask = BIT(PMIC_GLINK_CLIENT_BATT) |
> -							   BIT(PMIC_GLINK_CLIENT_ALTMODE) |
> -							   BIT(PMIC_GLINK_CLIENT_UCSI);
> +static const struct pmic_glink_data pmic_glink_sm8450_data = {
> +	.client_mask = BIT(PMIC_GLINK_CLIENT_BATT) |
> +		       BIT(PMIC_GLINK_CLIENT_ALTMODE) |
> +		       BIT(PMIC_GLINK_CLIENT_UCSI),
> +	.ssr_name = "lpass",
> +};
>  
>  static const struct of_device_id pmic_glink_of_match[] = {
> -	{ .compatible = "qcom,pmic-glink", .data = &pmic_glink_sm8450_client_mask },
> +	{ .compatible = "qcom,pmic-glink", .data = &pmic_glink_sm8450_data },
>  	{}
>  };
>  MODULE_DEVICE_TABLE(of, pmic_glink_of_match);
> -- 
> 2.34.1
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2025-07-20  4:18 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-16  0:40 [PATCH v2 0/2] soc: qcom: pmic_glink: Add support for subsystem restart (SSR) Anjelique Melendez
2025-07-16  0:40 ` [PATCH v2 1/2] dt-bindings: soc: qcom: qcom,pmic-glink: Add qcom,subsys-restart property Anjelique Melendez
2025-07-16  8:33   ` Krzysztof Kozlowski
2025-07-20  4:15   ` Bjorn Andersson
2025-07-16  0:40 ` [PATCH v2 2/2] soc: qcom: pmic_glink: Add support for subsystem restart (SSR) Anjelique Melendez
2025-07-16  8:35   ` Krzysztof Kozlowski
2025-07-20  4:18   ` Bjorn Andersson
2025-07-16  8:36 ` [PATCH v2 0/2] " Krzysztof Kozlowski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).