Merge "disp: msm: dsi: send panel dead for overflow/underflow interrupt"
This commit is contained in:

gecommit door
Gerrit - the friendly Code Review server

commit
4fc37c070b
@@ -2715,6 +2715,7 @@ static void dsi_ctrl_handle_error_status(struct dsi_ctrl *dsi_ctrl,
|
||||
struct dsi_event_cb_info cb_info;
|
||||
struct dsi_display *display;
|
||||
bool skip_irq_enable = false;
|
||||
bool is_spurious_interrupt = false;
|
||||
|
||||
cb_info = dsi_ctrl->irq_info.irq_err_cb;
|
||||
|
||||
@@ -2727,6 +2728,10 @@ static void dsi_ctrl_handle_error_status(struct dsi_ctrl *dsi_ctrl,
|
||||
dsi_ctrl->hw.ops.clear_error_status(&dsi_ctrl->hw,
|
||||
error);
|
||||
|
||||
/* check for spurious interrupts */
|
||||
if (dsi_ctrl_check_for_spurious_error_interrupts(dsi_ctrl))
|
||||
is_spurious_interrupt = true;
|
||||
|
||||
/* DTLN PHY error */
|
||||
if (error & 0x3000E00)
|
||||
pr_err_ratelimited("[%s] dsi PHY contention error: 0x%lx\n",
|
||||
@@ -2760,12 +2765,12 @@ static void dsi_ctrl_handle_error_status(struct dsi_ctrl *dsi_ctrl,
|
||||
/* no need to report FIFO overflow if already masked */
|
||||
if (cb_info.event_cb && !(mask & 0xf0000)) {
|
||||
cb_info.event_idx = DSI_FIFO_OVERFLOW;
|
||||
display = cb_info.event_usr_ptr;
|
||||
display->is_spurious_interrupt = is_spurious_interrupt;
|
||||
(void)cb_info.event_cb(cb_info.event_usr_ptr,
|
||||
cb_info.event_idx,
|
||||
dsi_ctrl->cell_index,
|
||||
0, 0, 0, 0);
|
||||
display = cb_info.event_usr_ptr;
|
||||
dsi_display_report_dead(display);
|
||||
skip_irq_enable = true;
|
||||
}
|
||||
}
|
||||
@@ -2774,12 +2779,12 @@ static void dsi_ctrl_handle_error_status(struct dsi_ctrl *dsi_ctrl,
|
||||
if (error & 0xF00000) {
|
||||
if (cb_info.event_cb) {
|
||||
cb_info.event_idx = DSI_FIFO_UNDERFLOW;
|
||||
display = cb_info.event_usr_ptr;
|
||||
display->is_spurious_interrupt = is_spurious_interrupt;
|
||||
(void)cb_info.event_cb(cb_info.event_usr_ptr,
|
||||
cb_info.event_idx,
|
||||
dsi_ctrl->cell_index,
|
||||
0, 0, 0, 0);
|
||||
display = cb_info.event_usr_ptr;
|
||||
dsi_display_report_dead(display);
|
||||
skip_irq_enable = true;
|
||||
}
|
||||
}
|
||||
@@ -2799,8 +2804,7 @@ static void dsi_ctrl_handle_error_status(struct dsi_ctrl *dsi_ctrl,
|
||||
* case and prevent us from re enabling interrupts until a full ESD
|
||||
* recovery is completed.
|
||||
*/
|
||||
if (dsi_ctrl_check_for_spurious_error_interrupts(dsi_ctrl) &&
|
||||
dsi_ctrl->esd_check_underway) {
|
||||
if (is_spurious_interrupt && dsi_ctrl->esd_check_underway) {
|
||||
dsi_ctrl->hw.ops.soft_reset(&dsi_ctrl->hw);
|
||||
return;
|
||||
}
|
||||
|
@@ -8043,6 +8043,11 @@ static void dsi_display_handle_fifo_underflow(struct work_struct *work)
|
||||
SDE_EVT32(SDE_EVTLOG_FUNC_EXIT);
|
||||
|
||||
mutex_unlock(&display->display_lock);
|
||||
|
||||
if (display->is_spurious_interrupt) {
|
||||
dsi_display_report_dead(display);
|
||||
display->is_spurious_interrupt = false;
|
||||
}
|
||||
}
|
||||
|
||||
static void dsi_display_handle_fifo_overflow(struct work_struct *work)
|
||||
@@ -8124,6 +8129,11 @@ end:
|
||||
SDE_EVT32(SDE_EVTLOG_FUNC_EXIT);
|
||||
|
||||
mutex_unlock(&display->display_lock);
|
||||
|
||||
if (display->is_spurious_interrupt) {
|
||||
dsi_display_report_dead(display);
|
||||
display->is_spurious_interrupt = false;
|
||||
}
|
||||
}
|
||||
|
||||
static void dsi_display_handle_lp_rx_timeout(struct work_struct *work)
|
||||
|
@@ -149,6 +149,7 @@ struct dsi_display_ext_bridge {
|
||||
* @sw_te_using_wd: Is software te enabled
|
||||
* @display_lock: Mutex for dsi_display interface.
|
||||
* @disp_te_gpio: GPIO for panel TE interrupt.
|
||||
* @is_spurious_interrupt: bool to specify spurious interrupt.
|
||||
* @is_te_irq_enabled:bool to specify whether TE interrupt is enabled.
|
||||
* @esd_te_gate: completion gate to signal TE interrupt.
|
||||
* @ctrl_count: Number of DSI interfaces required by panel.
|
||||
@@ -215,6 +216,7 @@ struct dsi_display {
|
||||
int disp_te_gpio;
|
||||
bool is_te_irq_enabled;
|
||||
struct completion esd_te_gate;
|
||||
bool is_spurious_interrupt;
|
||||
|
||||
u32 ctrl_count;
|
||||
struct dsi_display_ctrl ctrl[MAX_DSI_CTRLS_PER_DISPLAY];
|
||||
|
Verwijs in nieuw issue
Block a user