diff options
author | qctecmdr <qctecmdr@localhost> | 2020-01-03 06:21:28 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2020-01-03 06:21:27 -0800 |
commit | 187e3e92473c5d4c3e7fe3b0b43e1b037567166b (patch) | |
tree | 8a4e7b68799cf450f77b4833f2e333b89f96f973 | |
parent | 61a329517d3c1b049f9ab009c4d2135046d9f417 (diff) | |
parent | f489ec911e14ec76e984242a7924cbd89fa5d0f0 (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.c | 1 | ||||
-rw-r--r-- | drivers/bus/mhi/core/mhi_internal.h | 2 | ||||
-rw-r--r-- | drivers/bus/mhi/core/mhi_pm.c | 33 |
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); |