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

Commit 28d8906a authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "esoc: Move polling of the gpio from an interrupt context"

parents 63065961 9c47edde
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -389,7 +389,7 @@ static void mdm_get_restart_reason(struct work_struct *work)
	mdm->get_restart_reason = false;
}

void mdm_wait_for_status_low(struct mdm_ctrl *mdm)
void mdm_wait_for_status_low(struct mdm_ctrl *mdm, bool atomic)
{
	uint64_t timeout;
	uint64_t now;
@@ -410,7 +410,7 @@ void mdm_wait_for_status_low(struct mdm_ctrl *mdm)
	esoc_mdm_log("MDM2AP_STATUS didn't go LOW. Warm-resetting modem\n");
	dev_err(mdm->dev, "MDM2AP status did not go low\n");

	mdm_toggle_soft_reset(mdm, true);
	mdm_toggle_soft_reset(mdm, atomic);
}

static void mdm_notify(enum esoc_notify notify, struct esoc_clink *esoc)
@@ -476,7 +476,7 @@ static void mdm_notify(enum esoc_notify notify, struct esoc_clink *esoc)
		gpio_set_value(MDM_GPIO(mdm, AP2MDM_ERRFATAL), 1);
		if (esoc->primary)
			break;
		mdm_wait_for_status_low(mdm);
		mdm_wait_for_status_low(mdm, true);
		break;
	case ESOC_PRIMARY_REBOOT:
		mdm_disable_irqs(mdm);
+5 −4
Original line number Diff line number Diff line
@@ -86,7 +86,6 @@ static void mdm_handle_clink_evt(enum esoc_evt evt,
					struct esoc_eng *eng)
{
	struct mdm_drv *mdm_drv = to_mdm_drv(eng);
	struct mdm_ctrl *mdm;
	bool unexpected_state = false;

	switch (evt) {
@@ -131,9 +130,6 @@ static void mdm_handle_clink_evt(enum esoc_evt evt,
		if (mdm_drv->mode == CRASH || mdm_drv->mode != RUN)
			return;
		mdm_drv->mode = CRASH;
		mdm = get_esoc_clink_data(mdm_drv->esoc_clink);
		mdm_wait_for_status_low(mdm);
		esoc_mdm_log("Starting SSR work\n");
		queue_work(mdm_drv->mdm_queue, &mdm_drv->ssr_work);
		break;
	case ESOC_REQ_ENG_ON:
@@ -149,6 +145,11 @@ static void mdm_handle_clink_evt(enum esoc_evt evt,
static void mdm_ssr_fn(struct work_struct *work)
{
	struct mdm_drv *mdm_drv = container_of(work, struct mdm_drv, ssr_work);
	struct mdm_ctrl *mdm = get_esoc_clink_data(mdm_drv->esoc_clink);

	mdm_wait_for_status_low(mdm, false);

	esoc_mdm_log("Starting SSR work\n");

	/*
	 * If restarting esoc fails, the SSR framework triggers a kernel panic
+1 −1
Original line number Diff line number Diff line
@@ -119,7 +119,7 @@ struct mdm_ops {
};

void mdm_disable_irqs(struct mdm_ctrl *mdm);
void mdm_wait_for_status_low(struct mdm_ctrl *mdm);
void mdm_wait_for_status_low(struct mdm_ctrl *mdm, bool atomic);

static inline int mdm_toggle_soft_reset(struct mdm_ctrl *mdm, bool atomic)
{