Lines Matching refs:fsm

29 static int otg_set_protocol(struct otg_fsm *fsm, int protocol)  in otg_set_protocol()  argument
33 if (fsm->protocol != protocol) { in otg_set_protocol()
35 fsm->protocol, protocol); in otg_set_protocol()
37 if (fsm->protocol == PROTO_HOST) in otg_set_protocol()
38 ret = otg_start_host(fsm, 0); in otg_set_protocol()
39 else if (fsm->protocol == PROTO_GADGET) in otg_set_protocol()
40 ret = otg_start_gadget(fsm, 0); in otg_set_protocol()
46 ret = otg_start_host(fsm, 1); in otg_set_protocol()
48 ret = otg_start_gadget(fsm, 1); in otg_set_protocol()
52 fsm->protocol = protocol; in otg_set_protocol()
60 static void otg_leave_state(struct otg_fsm *fsm, enum usb_otg_state old_state) in otg_leave_state() argument
64 otg_del_timer(fsm, B_SE0_SRP); in otg_leave_state()
65 fsm->b_se0_srp = 0; in otg_leave_state()
66 fsm->adp_sns = 0; in otg_leave_state()
67 fsm->adp_prb = 0; in otg_leave_state()
70 fsm->data_pulse = 0; in otg_leave_state()
71 fsm->b_srp_done = 0; in otg_leave_state()
74 if (fsm->otg->gadget) in otg_leave_state()
75 fsm->otg->gadget->host_request_flag = 0; in otg_leave_state()
78 otg_del_timer(fsm, B_ASE0_BRST); in otg_leave_state()
79 fsm->b_ase0_brst_tmout = 0; in otg_leave_state()
84 fsm->adp_prb = 0; in otg_leave_state()
87 otg_del_timer(fsm, A_WAIT_VRISE); in otg_leave_state()
88 fsm->a_wait_vrise_tmout = 0; in otg_leave_state()
91 otg_del_timer(fsm, A_WAIT_BCON); in otg_leave_state()
92 fsm->a_wait_bcon_tmout = 0; in otg_leave_state()
95 otg_del_timer(fsm, A_WAIT_ENUM); in otg_leave_state()
98 otg_del_timer(fsm, A_AIDL_BDIS); in otg_leave_state()
99 fsm->a_aidl_bdis_tmout = 0; in otg_leave_state()
100 fsm->a_suspend_req_inf = 0; in otg_leave_state()
103 otg_del_timer(fsm, A_BIDL_ADIS); in otg_leave_state()
104 fsm->a_bidl_adis_tmout = 0; in otg_leave_state()
105 if (fsm->otg->gadget) in otg_leave_state()
106 fsm->otg->gadget->host_request_flag = 0; in otg_leave_state()
109 otg_del_timer(fsm, A_WAIT_VFALL); in otg_leave_state()
110 fsm->a_wait_vfall_tmout = 0; in otg_leave_state()
111 otg_del_timer(fsm, A_WAIT_VRISE); in otg_leave_state()
122 struct otg_fsm *fsm = container_of(to_delayed_work(work), in otg_hnp_polling_work() local
125 enum usb_otg_state state = fsm->otg->state; in otg_hnp_polling_work()
132 udev = usb_hub_find_child(fsm->otg->host->root_hub, 1); in otg_hnp_polling_work()
134 dev_err(fsm->otg->host->controller, in otg_hnp_polling_work()
139 *fsm->host_req_flag = 0; in otg_hnp_polling_work()
147 fsm->host_req_flag, in otg_hnp_polling_work()
155 flag = *fsm->host_req_flag; in otg_hnp_polling_work()
158 schedule_delayed_work(&fsm->hnp_polling_work, in otg_hnp_polling_work()
169 if (!fsm->otg->host->b_hnp_enable) { in otg_hnp_polling_work()
177 fsm->otg->host->b_hnp_enable = 1; in otg_hnp_polling_work()
179 fsm->a_bus_req = 0; in otg_hnp_polling_work()
181 fsm->b_bus_req = 0; in otg_hnp_polling_work()
184 otg_statemachine(fsm); in otg_hnp_polling_work()
187 static void otg_start_hnp_polling(struct otg_fsm *fsm) in otg_start_hnp_polling() argument
193 if (!fsm->host_req_flag) in otg_start_hnp_polling()
196 if (!fsm->hnp_work_inited) { in otg_start_hnp_polling()
197 INIT_DELAYED_WORK(&fsm->hnp_polling_work, otg_hnp_polling_work); in otg_start_hnp_polling()
198 fsm->hnp_work_inited = true; in otg_start_hnp_polling()
201 schedule_delayed_work(&fsm->hnp_polling_work, in otg_start_hnp_polling()
206 static int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state) in otg_set_state() argument
208 if (fsm->otg->state == new_state) in otg_set_state()
211 otg_leave_state(fsm, fsm->otg->state); in otg_set_state()
214 otg_drv_vbus(fsm, 0); in otg_set_state()
215 otg_chrg_vbus(fsm, 0); in otg_set_state()
216 otg_loc_conn(fsm, 0); in otg_set_state()
217 otg_loc_sof(fsm, 0); in otg_set_state()
222 otg_start_adp_sns(fsm); in otg_set_state()
223 otg_set_protocol(fsm, PROTO_UNDEF); in otg_set_state()
224 otg_add_timer(fsm, B_SE0_SRP); in otg_set_state()
227 otg_start_pulse(fsm); in otg_set_state()
228 otg_loc_sof(fsm, 0); in otg_set_state()
229 otg_set_protocol(fsm, PROTO_UNDEF); in otg_set_state()
230 otg_add_timer(fsm, B_SRP_FAIL); in otg_set_state()
233 otg_chrg_vbus(fsm, 0); in otg_set_state()
234 otg_loc_sof(fsm, 0); in otg_set_state()
235 otg_set_protocol(fsm, PROTO_GADGET); in otg_set_state()
236 otg_loc_conn(fsm, 1); in otg_set_state()
239 otg_chrg_vbus(fsm, 0); in otg_set_state()
240 otg_loc_conn(fsm, 0); in otg_set_state()
241 otg_loc_sof(fsm, 0); in otg_set_state()
242 otg_set_protocol(fsm, PROTO_HOST); in otg_set_state()
243 otg_add_timer(fsm, B_ASE0_BRST); in otg_set_state()
244 fsm->a_bus_suspend = 0; in otg_set_state()
247 otg_chrg_vbus(fsm, 0); in otg_set_state()
248 otg_loc_conn(fsm, 0); in otg_set_state()
249 otg_loc_sof(fsm, 1); in otg_set_state()
250 otg_set_protocol(fsm, PROTO_HOST); in otg_set_state()
251 usb_bus_start_enum(fsm->otg->host, in otg_set_state()
252 fsm->otg->host->otg_port); in otg_set_state()
253 otg_start_hnp_polling(fsm); in otg_set_state()
256 otg_drv_vbus(fsm, 0); in otg_set_state()
257 otg_chrg_vbus(fsm, 0); in otg_set_state()
258 otg_loc_conn(fsm, 0); in otg_set_state()
259 otg_loc_sof(fsm, 0); in otg_set_state()
260 otg_start_adp_prb(fsm); in otg_set_state()
261 otg_set_protocol(fsm, PROTO_HOST); in otg_set_state()
264 otg_drv_vbus(fsm, 1); in otg_set_state()
265 otg_loc_conn(fsm, 0); in otg_set_state()
266 otg_loc_sof(fsm, 0); in otg_set_state()
267 otg_set_protocol(fsm, PROTO_HOST); in otg_set_state()
268 otg_add_timer(fsm, A_WAIT_VRISE); in otg_set_state()
271 otg_drv_vbus(fsm, 1); in otg_set_state()
272 otg_loc_conn(fsm, 0); in otg_set_state()
273 otg_loc_sof(fsm, 0); in otg_set_state()
274 otg_set_protocol(fsm, PROTO_HOST); in otg_set_state()
275 otg_add_timer(fsm, A_WAIT_BCON); in otg_set_state()
278 otg_drv_vbus(fsm, 1); in otg_set_state()
279 otg_loc_conn(fsm, 0); in otg_set_state()
280 otg_loc_sof(fsm, 1); in otg_set_state()
281 otg_set_protocol(fsm, PROTO_HOST); in otg_set_state()
286 if (!fsm->a_bus_req || fsm->a_suspend_req_inf) in otg_set_state()
287 otg_add_timer(fsm, A_WAIT_ENUM); in otg_set_state()
288 otg_start_hnp_polling(fsm); in otg_set_state()
291 otg_drv_vbus(fsm, 1); in otg_set_state()
292 otg_loc_conn(fsm, 0); in otg_set_state()
293 otg_loc_sof(fsm, 0); in otg_set_state()
294 otg_set_protocol(fsm, PROTO_HOST); in otg_set_state()
295 otg_add_timer(fsm, A_AIDL_BDIS); in otg_set_state()
299 otg_loc_sof(fsm, 0); in otg_set_state()
300 otg_set_protocol(fsm, PROTO_GADGET); in otg_set_state()
301 otg_drv_vbus(fsm, 1); in otg_set_state()
302 otg_loc_conn(fsm, 1); in otg_set_state()
303 otg_add_timer(fsm, A_BIDL_ADIS); in otg_set_state()
306 otg_drv_vbus(fsm, 0); in otg_set_state()
307 otg_loc_conn(fsm, 0); in otg_set_state()
308 otg_loc_sof(fsm, 0); in otg_set_state()
309 otg_set_protocol(fsm, PROTO_HOST); in otg_set_state()
310 otg_add_timer(fsm, A_WAIT_VFALL); in otg_set_state()
313 otg_drv_vbus(fsm, 0); in otg_set_state()
314 otg_loc_conn(fsm, 0); in otg_set_state()
315 otg_loc_sof(fsm, 0); in otg_set_state()
316 otg_set_protocol(fsm, PROTO_UNDEF); in otg_set_state()
322 fsm->otg->state = new_state; in otg_set_state()
323 fsm->state_changed = 1; in otg_set_state()
328 int otg_statemachine(struct otg_fsm *fsm) in otg_statemachine() argument
332 mutex_lock(&fsm->lock); in otg_statemachine()
334 state = fsm->otg->state; in otg_statemachine()
335 fsm->state_changed = 0; in otg_statemachine()
340 VDBG("fsm->id = %d\n", fsm->id); in otg_statemachine()
341 if (fsm->id) in otg_statemachine()
342 otg_set_state(fsm, OTG_STATE_B_IDLE); in otg_statemachine()
344 otg_set_state(fsm, OTG_STATE_A_IDLE); in otg_statemachine()
347 if (!fsm->id) in otg_statemachine()
348 otg_set_state(fsm, OTG_STATE_A_IDLE); in otg_statemachine()
349 else if (fsm->b_sess_vld && fsm->otg->gadget) in otg_statemachine()
350 otg_set_state(fsm, OTG_STATE_B_PERIPHERAL); in otg_statemachine()
351 else if ((fsm->b_bus_req || fsm->adp_change || fsm->power_up) && in otg_statemachine()
352 fsm->b_ssend_srp && fsm->b_se0_srp) in otg_statemachine()
353 otg_set_state(fsm, OTG_STATE_B_SRP_INIT); in otg_statemachine()
356 if (!fsm->id || fsm->b_srp_done) in otg_statemachine()
357 otg_set_state(fsm, OTG_STATE_B_IDLE); in otg_statemachine()
360 if (!fsm->id || !fsm->b_sess_vld) in otg_statemachine()
361 otg_set_state(fsm, OTG_STATE_B_IDLE); in otg_statemachine()
362 else if (fsm->b_bus_req && fsm->otg-> in otg_statemachine()
363 gadget->b_hnp_enable && fsm->a_bus_suspend) in otg_statemachine()
364 otg_set_state(fsm, OTG_STATE_B_WAIT_ACON); in otg_statemachine()
367 if (fsm->a_conn) in otg_statemachine()
368 otg_set_state(fsm, OTG_STATE_B_HOST); in otg_statemachine()
369 else if (!fsm->id || !fsm->b_sess_vld) in otg_statemachine()
370 otg_set_state(fsm, OTG_STATE_B_IDLE); in otg_statemachine()
371 else if (fsm->a_bus_resume || fsm->b_ase0_brst_tmout) { in otg_statemachine()
372 fsm->b_ase0_brst_tmout = 0; in otg_statemachine()
373 otg_set_state(fsm, OTG_STATE_B_PERIPHERAL); in otg_statemachine()
377 if (!fsm->id || !fsm->b_sess_vld) in otg_statemachine()
378 otg_set_state(fsm, OTG_STATE_B_IDLE); in otg_statemachine()
379 else if (!fsm->b_bus_req || !fsm->a_conn || fsm->test_device) in otg_statemachine()
380 otg_set_state(fsm, OTG_STATE_B_PERIPHERAL); in otg_statemachine()
383 if (fsm->id) in otg_statemachine()
384 otg_set_state(fsm, OTG_STATE_B_IDLE); in otg_statemachine()
385 else if (!fsm->a_bus_drop && (fsm->a_bus_req || in otg_statemachine()
386 fsm->a_srp_det || fsm->adp_change || fsm->power_up)) in otg_statemachine()
387 otg_set_state(fsm, OTG_STATE_A_WAIT_VRISE); in otg_statemachine()
390 if (fsm->a_vbus_vld) in otg_statemachine()
391 otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); in otg_statemachine()
392 else if (fsm->id || fsm->a_bus_drop || in otg_statemachine()
393 fsm->a_wait_vrise_tmout) in otg_statemachine()
394 otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); in otg_statemachine()
397 if (!fsm->a_vbus_vld) in otg_statemachine()
398 otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); in otg_statemachine()
399 else if (fsm->b_conn) in otg_statemachine()
400 otg_set_state(fsm, OTG_STATE_A_HOST); in otg_statemachine()
401 else if (fsm->id || fsm->a_bus_drop || fsm->a_wait_bcon_tmout) in otg_statemachine()
402 otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); in otg_statemachine()
405 if (fsm->id || fsm->a_bus_drop) in otg_statemachine()
406 otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); in otg_statemachine()
407 else if ((!fsm->a_bus_req || fsm->a_suspend_req_inf) && in otg_statemachine()
408 fsm->otg->host->b_hnp_enable) in otg_statemachine()
409 otg_set_state(fsm, OTG_STATE_A_SUSPEND); in otg_statemachine()
410 else if (!fsm->b_conn) in otg_statemachine()
411 otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); in otg_statemachine()
412 else if (!fsm->a_vbus_vld) in otg_statemachine()
413 otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); in otg_statemachine()
416 if (!fsm->b_conn && fsm->otg->host->b_hnp_enable) in otg_statemachine()
417 otg_set_state(fsm, OTG_STATE_A_PERIPHERAL); in otg_statemachine()
418 else if (!fsm->b_conn && !fsm->otg->host->b_hnp_enable) in otg_statemachine()
419 otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); in otg_statemachine()
420 else if (fsm->a_bus_req || fsm->b_bus_resume) in otg_statemachine()
421 otg_set_state(fsm, OTG_STATE_A_HOST); in otg_statemachine()
422 else if (fsm->id || fsm->a_bus_drop || fsm->a_aidl_bdis_tmout) in otg_statemachine()
423 otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); in otg_statemachine()
424 else if (!fsm->a_vbus_vld) in otg_statemachine()
425 otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); in otg_statemachine()
428 if (fsm->id || fsm->a_bus_drop) in otg_statemachine()
429 otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); in otg_statemachine()
430 else if (fsm->a_bidl_adis_tmout || fsm->b_bus_suspend) in otg_statemachine()
431 otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); in otg_statemachine()
432 else if (!fsm->a_vbus_vld) in otg_statemachine()
433 otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); in otg_statemachine()
436 if (fsm->a_wait_vfall_tmout) in otg_statemachine()
437 otg_set_state(fsm, OTG_STATE_A_IDLE); in otg_statemachine()
440 if (fsm->id || fsm->a_bus_drop || fsm->a_clr_err) in otg_statemachine()
441 otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); in otg_statemachine()
446 mutex_unlock(&fsm->lock); in otg_statemachine()
448 VDBG("quit statemachine, changed = %d\n", fsm->state_changed); in otg_statemachine()
449 return fsm->state_changed; in otg_statemachine()