Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 35fa1609 authored by Arun KS's avatar Arun KS Committed by Raghavendra Rao Ananta
Browse files

esoc: Add provision to handle shutdown request in userspace



In certain scenarios, modem shutdown requests are handled in
userspace. Enhance request engine of esoc driver to send
shutdown requests to userspace.

Also, during a shutdown, avoid setting status to 0, if line is
not a power source. There can be multiple mdms monitoring status
line. This can otherwise be misinterpreted as an unexpected reset
by other mdms.

Change-Id: I9c20a86e76f892cc61dbfb814202b26e5cce3e96
Signed-off-by: default avatarArun KS <arunks@codeaurora.org>
Signed-off-by: default avatarSrivatsa Vaddagiri <vatsa@codeaurora.org>
parent 39c69e2f
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -110,6 +110,10 @@ Optional driver parameters:
			   on behalf of the subsystem driver.
- qcom,mdm-link-info: a string indicating additional info about the physical link.
			For example: "devID_domain.bus.slot" in case of PCIe.
- qcom,mdm-auto-boot: Boolean. To indicate this instance of esoc boots independently.
- qcom,mdm-statusline-not-a-powersource: Boolean. If set, status line to esoc device is not a
		power source.
- qcom,mdm-userspace-handle-shutdown: Boolean. If set, userspace handles shutdown requests.

Example:
	mdm0: qcom,mdm0 {
+15 −8
Original line number Diff line number Diff line
@@ -211,13 +211,17 @@ static int mdm_cmd_exe(enum esoc_cmd cmd, struct esoc_clink *esoc)
		if (esoc->primary)
			break;
		graceful_shutdown = true;
		if (!esoc->userspace_handle_shutdown) {
			ret = sysmon_send_shutdown(&esoc->subsys);
			if (ret) {
			dev_err(mdm->dev, "sysmon shutdown fail, ret = %d\n",
									ret);
				dev_err(mdm->dev,
				 "sysmon shutdown fail, ret = %d\n", ret);
				graceful_shutdown = false;
				goto force_poff;
			}
		} else {
			esoc_clink_queue_request(ESOC_REQ_SEND_SHUTDOWN, esoc);
		}
		dev_dbg(mdm->dev, "Waiting for status gpio go low\n");
		status_down = false;
		end_time = jiffies + msecs_to_jiffies(10000);
@@ -252,8 +256,11 @@ static int mdm_cmd_exe(enum esoc_cmd cmd, struct esoc_clink *esoc)
		/*
		 * Force a shutdown of the mdm. This is required in order
		 * to prevent the mdm from immediately powering back on
		 * after the shutdown
		 * after the shutdown. Avoid setting status to 0, if line is
		 * monitored by multiple mdms(might be wrongly interpreted as
		 * a primary crash).
		 */
		if (esoc->statusline_not_a_powersource == false)
			gpio_set_value(MDM_GPIO(mdm, AP2MDM_STATUS), 0);
		esoc_clink_queue_request(ESOC_REQ_SHUTDOWN, esoc);
		mdm_power_down(mdm);
+5 −0
Original line number Diff line number Diff line
@@ -63,6 +63,9 @@ struct esoc_eng {
 * @auto_boot: boots independently.
 * @primary: primary esoc controls(reset/poweroff) all secondary
 *	 esocs, but not	otherway around.
 * @statusline_not_a_powersource: True if status line to esoc is not a
 *				power source.
 * @userspace_handle_shutdown: True if user space handles shutdown requests.
 */
struct esoc_clink {
	const char *name;
@@ -84,6 +87,8 @@ struct esoc_clink {
	struct device_node *np;
	bool auto_boot;
	bool primary;
	bool statusline_not_a_powersource;
	bool userspace_handle_shutdown;
};

/**
+2 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#define HSIC		"HSIC"
#define HSICPCIe	"HSIC+PCIe"
#define PCIe		"PCIe"
#define ESOC_REQ_SEND_SHUTDOWN	ESOC_REQ_SEND_SHUTDOWN

enum esoc_evt {
	ESOC_RUN_STATE = 0x1,
@@ -58,6 +59,7 @@ enum esoc_req {
	ESOC_REQ_IMG = 1,
	ESOC_REQ_DEBUG,
	ESOC_REQ_SHUTDOWN,
	ESOC_REQ_SEND_SHUTDOWN,
};

#ifdef __KERNEL__