Peter Chen <peter.chen@xxxxxxxxxxxxx> writes: > I can use this API, how can this API consolidate both of the case > (<OTGSC_BSV and >OTGSC_AVV)? Ok, then how about static int hw_wait_reg(struct ci13xxx *ci, enum ci13xxx_regs reg, u32 mask, u32 value, unsigned long timeout) { unsigned long elapse = jiffies + timeout; while (hw_read(ci, reg, mask) != value) { if (time_after(jiffies, elapse)) { dev_err(ci->dev, "timeout waiting for %08x in %d\n", mask, reg); return -ETIMEDOUT; } msleep(20); } return 0; } with that: ret = hw_wait_reg(ci, OP_OTGSC, OTGSC_BSV, 0, CI_VBUS_STABLE_TIMEOUT); if (ret) { /* go idle */ } ... ret = hw_wait_reg(ci, OP_OTGSC, OTGSC_AVV, OTGSC_AVV, CI_VBUS_STABLE_TIMEOUT); should do the trick. Regards, -- Alex -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html