static ssize_t set_a_bus_req(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct ci_hdrc *ci = dev_get_drvdata(dev); if (count > 2) return -1; mutex_lock(&ci->fsm.lock); if (buf[0] == '0') { ci->fsm.a_bus_req = 0; } else if (buf[0] == '1') { /* If a_bus_drop is TRUE, a_bus_req can't be set */ if (ci->fsm.a_bus_drop) { mutex_unlock(&ci->fsm.lock); return count; } ci->fsm.a_bus_req = 1; } ci_otg_queue_work(ci); mutex_unlock(&ci->fsm.lock); return count; }
static ssize_t set_a_clr_err(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct ci_hdrc *ci = dev_get_drvdata(dev); if (count > 2) return -1; mutex_lock(&ci->fsm.lock); if (buf[0] == '1') ci->fsm.a_clr_err = 1; ci_otg_queue_work(ci); mutex_unlock(&ci->fsm.lock); return count; }
static void ci_handle_vbus_glitch(struct ci_hdrc *ci) { bool valid_vbus_change = false; if (hw_read_otgsc(ci, OTGSC_BSV)) { if (!ci_is_vbus_glitch(ci)) { if (ci_otg_is_fsm_mode(ci)) { ci->fsm.b_sess_vld = 1; ci->fsm.b_ssend_srp = 0; otg_del_timer(&ci->fsm, B_SSEND_SRP); otg_del_timer(&ci->fsm, B_SRP_FAIL); } valid_vbus_change = true; } } else { if (ci->vbus_active && !ci_otg_is_fsm_mode(ci)) valid_vbus_change = true; } if (valid_vbus_change) { ci->b_sess_valid_event = true; ci_otg_queue_work(ci); } }