Loading drivers/bus/mhi/core/mhi_init.c +1 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,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] = { Loading drivers/bus/mhi/core/mhi_internal.h +2 −0 Original line number Diff line number Diff line Loading @@ -429,6 +429,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, }; Loading Loading @@ -586,6 +587,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 { Loading drivers/bus/mhi/core/mhi_pm.c +30 −3 Original line number Diff line number Diff line Loading @@ -635,7 +635,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); Loading Loading @@ -730,6 +729,27 @@ int mhi_debugfs_trigger_reset(void *data, u64 val) return 0; } /* queue disable transition work item */ 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) Loading Loading @@ -798,7 +818,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) Loading Loading @@ -839,6 +859,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; } Loading Loading @@ -1015,7 +1038,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); Loading Loading
drivers/bus/mhi/core/mhi_init.c +1 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,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] = { Loading
drivers/bus/mhi/core/mhi_internal.h +2 −0 Original line number Diff line number Diff line Loading @@ -429,6 +429,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, }; Loading Loading @@ -586,6 +587,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 { Loading
drivers/bus/mhi/core/mhi_pm.c +30 −3 Original line number Diff line number Diff line Loading @@ -635,7 +635,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); Loading Loading @@ -730,6 +729,27 @@ int mhi_debugfs_trigger_reset(void *data, u64 val) return 0; } /* queue disable transition work item */ 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) Loading Loading @@ -798,7 +818,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) Loading Loading @@ -839,6 +859,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; } Loading Loading @@ -1015,7 +1038,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); Loading