remoteproc: sysmon: Add notifications for events
authorSiddharth Gupta <sidgup@codeaurora.org>
Wed, 8 Apr 2020 23:36:39 +0000 (16:36 -0700)
committerBjorn Andersson <bjorn.andersson@linaro.org>
Mon, 20 Apr 2020 07:06:22 +0000 (00:06 -0700)
Add notification for other stages of remoteproc boot and shutdown. This
includes adding callback functions for the prepare and unprepare events,
and fleshing out the callback function for start.

Acked-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: Siddharth Gupta <sidgup@codeaurora.org>
Link: https://lore.kernel.org/r/1586389003-26675-3-git-send-email-sidgup@codeaurora.org
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
drivers/remoteproc/qcom_sysmon.c

index 1366050..851664e 100644 (file)
@@ -439,8 +439,31 @@ static const struct qmi_ops ssctl_ops = {
        .del_server = ssctl_del_server,
 };
 
+static int sysmon_prepare(struct rproc_subdev *subdev)
+{
+       struct qcom_sysmon *sysmon = container_of(subdev, struct qcom_sysmon,
+                                                 subdev);
+       struct sysmon_event event = {
+               .subsys_name = sysmon->name,
+               .ssr_event = SSCTL_SSR_EVENT_BEFORE_POWERUP
+       };
+
+       blocking_notifier_call_chain(&sysmon_notifiers, 0, (void *)&event);
+
+       return 0;
+}
+
 static int sysmon_start(struct rproc_subdev *subdev)
 {
+       struct qcom_sysmon *sysmon = container_of(subdev, struct qcom_sysmon,
+                                                 subdev);
+       struct sysmon_event event = {
+               .subsys_name = sysmon->name,
+               .ssr_event = SSCTL_SSR_EVENT_AFTER_POWERUP
+       };
+
+       blocking_notifier_call_chain(&sysmon_notifiers, 0, (void *)&event);
+
        return 0;
 }
 
@@ -464,6 +487,18 @@ static void sysmon_stop(struct rproc_subdev *subdev, bool crashed)
                sysmon_request_shutdown(sysmon);
 }
 
+static void sysmon_unprepare(struct rproc_subdev *subdev)
+{
+       struct qcom_sysmon *sysmon = container_of(subdev, struct qcom_sysmon,
+                                                 subdev);
+       struct sysmon_event event = {
+               .subsys_name = sysmon->name,
+               .ssr_event = SSCTL_SSR_EVENT_AFTER_SHUTDOWN
+       };
+
+       blocking_notifier_call_chain(&sysmon_notifiers, 0, (void *)&event);
+}
+
 /**
  * sysmon_notify() - notify sysmon target of another's SSR
  * @nb:                notifier_block associated with sysmon instance
@@ -563,8 +598,10 @@ struct qcom_sysmon *qcom_add_sysmon_subdev(struct rproc *rproc,
 
        qmi_add_lookup(&sysmon->qmi, 43, 0, 0);
 
+       sysmon->subdev.prepare = sysmon_prepare;
        sysmon->subdev.start = sysmon_start;
        sysmon->subdev.stop = sysmon_stop;
+       sysmon->subdev.unprepare = sysmon_unprepare;
 
        rproc_add_subdev(rproc, &sysmon->subdev);