aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorqctecmdr <qctecmdr@localhost>2020-01-03 06:21:28 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2020-01-03 06:21:27 -0800
commit187e3e92473c5d4c3e7fe3b0b43e1b037567166b (patch)
tree8a4e7b68799cf450f77b4833f2e333b89f96f973
parent61a329517d3c1b049f9ab009c4d2135046d9f417 (diff)
parentf489ec911e14ec76e984242a7924cbd89fa5d0f0 (diff)
Merge "mhi: core: handle disable transitions in EE state worker"LE.UM.3.2.3-19500-SA2150p
-rw-r--r--drivers/bus/mhi/core/mhi_init.c1
-rw-r--r--drivers/bus/mhi/core/mhi_internal.h2
-rw-r--r--drivers/bus/mhi/core/mhi_pm.c33
3 files changed, 33 insertions, 3 deletions
diff --git a/drivers/bus/mhi/core/mhi_init.c b/drivers/bus/mhi/core/mhi_init.c
index 00ae042ed158..3601894315cb 100644
--- a/drivers/bus/mhi/core/mhi_init.c
+++ b/drivers/bus/mhi/core/mhi_init.c
@@ -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] = {
diff --git a/drivers/bus/mhi/core/mhi_internal.h b/drivers/bus/mhi/core/mhi_internal.h
index 81877518eb30..0b4b21b592d1 100644
--- a/drivers/bus/mhi/core/mhi_internal.h
+++ b/drivers/bus/mhi/core/mhi_internal.h
@@ -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 {
diff --git a/drivers/bus/mhi/core/mhi_pm.c b/drivers/bus/mhi/core/mhi_pm.c
index 550d6effcac7..31916b727ec7 100644
--- a/drivers/bus/mhi/core/mhi_pm.c
+++ b/drivers/bus/mhi/core/mhi_pm.c
@@ -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);