diff --git a/drivers/bus/mhi/core/mhi_boot.c b/drivers/bus/mhi/core/mhi_boot.c index fa55209e409d..3f7d2a84748c 100644 --- a/drivers/bus/mhi/core/mhi_boot.c +++ b/drivers/bus/mhi/core/mhi_boot.c @@ -143,6 +143,17 @@ bool mhi_scan_rddm_cookie(struct mhi_controller *mhi_cntrl, u32 cookie) { int ret; u32 val; + int i; + bool result = false; + struct { + char *name; + u32 offset; + } error_reg[] = { + { "ERROR_DBG1", BHI_ERRDBG1 }, + { "ERROR_DBG2", BHI_ERRDBG2 }, + { "ERROR_DBG3", BHI_ERRDBG3 }, + { NULL }, + }; if (!mhi_cntrl->rddm_supported || !cookie) return false; @@ -152,15 +163,23 @@ bool mhi_scan_rddm_cookie(struct mhi_controller *mhi_cntrl, u32 cookie) if (!MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state)) return false; - ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_ERRDBG2, &val); - if (ret) - return false; + /* look for an RDDM cookie match in any of the error debug registers */ + for (i = 0; error_reg[i].name; i++) { + ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->bhi, + error_reg[i].offset, &val); + if (ret) + break; + MHI_CNTRL_LOG("reg:%s value:0x%x\n", error_reg[i].name, val); - MHI_CNTRL_LOG("BHI_ERRDBG2 value:0x%x\n", val); - if (val == cookie) - return true; + if (!(val ^ cookie)) { + MHI_CNTRL_ERR("RDDM cookie found in %s\n", + error_reg[i].name); + return true; + } + } - return false; + MHI_CNTRL_ERR("RDDM cookie not found\n"); + return result; } EXPORT_SYMBOL(mhi_scan_rddm_cookie);