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

Commit 187e3e92 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "mhi: core: handle disable transitions in EE state worker"

parents 61a32951 f489ec91
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ const char * const mhi_state_tran_str[MHI_ST_TRANSITION_MAX] = {
	[MHI_ST_TRANSITION_READY] = "READY",
	[MHI_ST_TRANSITION_SBL] = "SBL",
	[MHI_ST_TRANSITION_MISSION_MODE] = "MISSION MODE",
	[MHI_ST_TRANSITION_DISABLE] = "DISABLE",
};

const char * const mhi_state_str[MHI_STATE_MAX] = {
+2 −0
Original line number Diff line number Diff line
@@ -439,6 +439,7 @@ enum MHI_ST_TRANSITION {
	MHI_ST_TRANSITION_READY,
	MHI_ST_TRANSITION_SBL,
	MHI_ST_TRANSITION_MISSION_MODE,
	MHI_ST_TRANSITION_DISABLE,
	MHI_ST_TRANSITION_MAX,
};

@@ -592,6 +593,7 @@ struct mhi_pm_transitions {
struct state_transition {
	struct list_head node;
	enum MHI_ST_TRANSITION state;
	enum MHI_PM_STATE pm_state;
};

struct mhi_ctxt {
+30 −3
Original line number Diff line number Diff line
@@ -641,7 +641,6 @@ static void mhi_pm_disable_transition(struct mhi_controller *mhi_cntrl,

	MHI_LOG("Waiting for all pending threads to complete\n");
	wake_up_all(&mhi_cntrl->state_event);
	flush_work(&mhi_cntrl->st_worker);
	flush_work(&mhi_cntrl->fw_worker);
	flush_work(&mhi_cntrl->low_priority_worker);

@@ -736,6 +735,27 @@ int mhi_debugfs_trigger_reset(void *data, u64 val)
	return 0;
}

/* queue disable transition work item */
static int mhi_queue_disable_transition(struct mhi_controller *mhi_cntrl,
				 enum MHI_PM_STATE pm_state)
{
	struct state_transition *item = kmalloc(sizeof(*item), GFP_ATOMIC);
	unsigned long flags;

	if (!item)
		return -ENOMEM;

	item->pm_state = pm_state;
	item->state = MHI_ST_TRANSITION_DISABLE;
	spin_lock_irqsave(&mhi_cntrl->transition_lock, flags);
	list_add_tail(&item->node, &mhi_cntrl->transition_list);
	spin_unlock_irqrestore(&mhi_cntrl->transition_lock, flags);

	schedule_work(&mhi_cntrl->st_worker);

	return 0;
}

/* queue a new work item and scheduler work */
int mhi_queue_state_transition(struct mhi_controller *mhi_cntrl,
			       enum MHI_ST_TRANSITION state)
@@ -802,7 +822,7 @@ void mhi_pm_sys_err_worker(struct work_struct *work)
		to_mhi_pm_state_str(mhi_cntrl->pm_state),
		TO_MHI_STATE_STR(mhi_cntrl->dev_state));

	mhi_pm_disable_transition(mhi_cntrl, MHI_PM_SYS_ERR_PROCESS);
	mhi_queue_disable_transition(mhi_cntrl, MHI_PM_SYS_ERR_PROCESS);
}

void mhi_pm_st_worker(struct work_struct *work)
@@ -843,6 +863,9 @@ void mhi_pm_st_worker(struct work_struct *work)
		case MHI_ST_TRANSITION_READY:
			mhi_ready_state_transition(mhi_cntrl);
			break;
		case MHI_ST_TRANSITION_DISABLE:
			mhi_pm_disable_transition(mhi_cntrl, itr->pm_state);
			break;
		default:
			break;
		}
@@ -1016,7 +1039,11 @@ void mhi_power_down(struct mhi_controller *mhi_cntrl, bool graceful)

		transition_state = MHI_PM_SHUTDOWN_NO_ACCESS;
	}
	mhi_pm_disable_transition(mhi_cntrl, transition_state);

	mhi_queue_disable_transition(mhi_cntrl, transition_state);

	MHI_LOG("Wait for shutdown to complete\n");
	flush_work(&mhi_cntrl->st_worker);

	mhi_deinit_debugfs(mhi_cntrl);