diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index 1d686292b9..33dbd494d1 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -998,13 +998,17 @@ static int dsi_display_ctrl_get_host_init_state(struct dsi_display *dsi_display, { struct dsi_display_ctrl *ctrl; int i, rc = -EINVAL; + bool final_state = true; display_for_each_ctrl(i, dsi_display) { + bool ctrl_state = false; ctrl = &dsi_display->ctrl[i]; - rc = dsi_ctrl_get_host_engine_init_state(ctrl->ctrl, state); - if (rc) + rc = dsi_ctrl_get_host_engine_init_state(ctrl->ctrl, &ctrl_state); + final_state &= ctrl_state; + if ((rc) || !(final_state)) break; } + *state = final_state; return rc; } @@ -1201,6 +1205,16 @@ int dsi_display_cmd_receive(void *display, const char *cmd_buf, } rc = dsi_display_ctrl_get_host_init_state(dsi_display, &state); + + /** + * Handle scenario where a command transfer is initiated through + * sysfs interface when device is in suspend state. + */ + if (!rc && !state) { + pr_warn_ratelimited("Command xfer attempted while device is in suspend state\n"); + rc = -EPERM; + goto end; + } if (rc || !state) { DSI_ERR("[DSI] Invalid host state = %d rc = %d\n", state, rc);