xref: /linux/drivers/usb/common/usb-otg-fsm.c (revision e5c86679d5e864947a52fb31e45a425dea3e7fa9)
1 /*
2  * OTG Finite State Machine from OTG spec
3  *
4  * Copyright (C) 2007,2008 Freescale Semiconductor, Inc.
5  *
6  * Author:	Li Yang <LeoLi@freescale.com>
7  *		Jerry Huang <Chang-Ming.Huang@freescale.com>
8  *
9  * This program is free software; you can redistribute  it and/or modify it
10  * under  the terms of  the GNU General  Public License as published by the
11  * Free Software Foundation;  either version 2 of the  License, or (at your
12  * option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful, but
15  * WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * General Public License for more details.
18  *
19  * You should have received a copy of the  GNU General Public License along
20  * with this program; if not, write  to the Free Software Foundation, Inc.,
21  * 675 Mass Ave, Cambridge, MA 02139, USA.
22  */
23 
24 #include <linux/module.h>
25 #include <linux/kernel.h>
26 #include <linux/types.h>
27 #include <linux/mutex.h>
28 #include <linux/delay.h>
29 #include <linux/usb.h>
30 #include <linux/usb/gadget.h>
31 #include <linux/usb/otg.h>
32 #include <linux/usb/otg-fsm.h>
33 
34 /* Change USB protocol when there is a protocol change */
35 static int otg_set_protocol(struct otg_fsm *fsm, int protocol)
36 {
37 	int ret = 0;
38 
39 	if (fsm->protocol != protocol) {
40 		VDBG("Changing role fsm->protocol= %d; new protocol= %d\n",
41 			fsm->protocol, protocol);
42 		/* stop old protocol */
43 		if (fsm->protocol == PROTO_HOST)
44 			ret = otg_start_host(fsm, 0);
45 		else if (fsm->protocol == PROTO_GADGET)
46 			ret = otg_start_gadget(fsm, 0);
47 		if (ret)
48 			return ret;
49 
50 		/* start new protocol */
51 		if (protocol == PROTO_HOST)
52 			ret = otg_start_host(fsm, 1);
53 		else if (protocol == PROTO_GADGET)
54 			ret = otg_start_gadget(fsm, 1);
55 		if (ret)
56 			return ret;
57 
58 		fsm->protocol = protocol;
59 		return 0;
60 	}
61 
62 	return 0;
63 }
64 
65 /* Called when leaving a state.  Do state clean up jobs here */
66 static void otg_leave_state(struct otg_fsm *fsm, enum usb_otg_state old_state)
67 {
68 	switch (old_state) {
69 	case OTG_STATE_B_IDLE:
70 		otg_del_timer(fsm, B_SE0_SRP);
71 		fsm->b_se0_srp = 0;
72 		fsm->adp_sns = 0;
73 		fsm->adp_prb = 0;
74 		break;
75 	case OTG_STATE_B_SRP_INIT:
76 		fsm->data_pulse = 0;
77 		fsm->b_srp_done = 0;
78 		break;
79 	case OTG_STATE_B_PERIPHERAL:
80 		if (fsm->otg->gadget)
81 			fsm->otg->gadget->host_request_flag = 0;
82 		break;
83 	case OTG_STATE_B_WAIT_ACON:
84 		otg_del_timer(fsm, B_ASE0_BRST);
85 		fsm->b_ase0_brst_tmout = 0;
86 		break;
87 	case OTG_STATE_B_HOST:
88 		break;
89 	case OTG_STATE_A_IDLE:
90 		fsm->adp_prb = 0;
91 		break;
92 	case OTG_STATE_A_WAIT_VRISE:
93 		otg_del_timer(fsm, A_WAIT_VRISE);
94 		fsm->a_wait_vrise_tmout = 0;
95 		break;
96 	case OTG_STATE_A_WAIT_BCON:
97 		otg_del_timer(fsm, A_WAIT_BCON);
98 		fsm->a_wait_bcon_tmout = 0;
99 		break;
100 	case OTG_STATE_A_HOST:
101 		otg_del_timer(fsm, A_WAIT_ENUM);
102 		break;
103 	case OTG_STATE_A_SUSPEND:
104 		otg_del_timer(fsm, A_AIDL_BDIS);
105 		fsm->a_aidl_bdis_tmout = 0;
106 		fsm->a_suspend_req_inf = 0;
107 		break;
108 	case OTG_STATE_A_PERIPHERAL:
109 		otg_del_timer(fsm, A_BIDL_ADIS);
110 		fsm->a_bidl_adis_tmout = 0;
111 		if (fsm->otg->gadget)
112 			fsm->otg->gadget->host_request_flag = 0;
113 		break;
114 	case OTG_STATE_A_WAIT_VFALL:
115 		otg_del_timer(fsm, A_WAIT_VFALL);
116 		fsm->a_wait_vfall_tmout = 0;
117 		otg_del_timer(fsm, A_WAIT_VRISE);
118 		break;
119 	case OTG_STATE_A_VBUS_ERR:
120 		break;
121 	default:
122 		break;
123 	}
124 }
125 
126 static void otg_hnp_polling_work(struct work_struct *work)
127 {
128 	struct otg_fsm *fsm = container_of(to_delayed_work(work),
129 				struct otg_fsm, hnp_polling_work);
130 	struct usb_device *udev;
131 	enum usb_otg_state state = fsm->otg->state;
132 	u8 flag;
133 	int retval;
134 
135 	if (state != OTG_STATE_A_HOST && state != OTG_STATE_B_HOST)
136 		return;
137 
138 	udev = usb_hub_find_child(fsm->otg->host->root_hub, 1);
139 	if (!udev) {
140 		dev_err(fsm->otg->host->controller,
141 			"no usb dev connected, can't start HNP polling\n");
142 		return;
143 	}
144 
145 	*fsm->host_req_flag = 0;
146 	/* Get host request flag from connected USB device */
147 	retval = usb_control_msg(udev,
148 				usb_rcvctrlpipe(udev, 0),
149 				USB_REQ_GET_STATUS,
150 				USB_DIR_IN | USB_RECIP_DEVICE,
151 				0,
152 				OTG_STS_SELECTOR,
153 				fsm->host_req_flag,
154 				1,
155 				USB_CTRL_GET_TIMEOUT);
156 	if (retval != 1) {
157 		dev_err(&udev->dev, "Get one byte OTG status failed\n");
158 		return;
159 	}
160 
161 	flag = *fsm->host_req_flag;
162 	if (flag == 0) {
163 		/* Continue HNP polling */
164 		schedule_delayed_work(&fsm->hnp_polling_work,
165 					msecs_to_jiffies(T_HOST_REQ_POLL));
166 		return;
167 	} else if (flag != HOST_REQUEST_FLAG) {
168 		dev_err(&udev->dev, "host request flag %d is invalid\n", flag);
169 		return;
170 	}
171 
172 	/* Host request flag is set */
173 	if (state == OTG_STATE_A_HOST) {
174 		/* Set b_hnp_enable */
175 		if (!fsm->otg->host->b_hnp_enable) {
176 			retval = usb_control_msg(udev,
177 					usb_sndctrlpipe(udev, 0),
178 					USB_REQ_SET_FEATURE, 0,
179 					USB_DEVICE_B_HNP_ENABLE,
180 					0, NULL, 0,
181 					USB_CTRL_SET_TIMEOUT);
182 			if (retval >= 0)
183 				fsm->otg->host->b_hnp_enable = 1;
184 		}
185 		fsm->a_bus_req = 0;
186 	} else if (state == OTG_STATE_B_HOST) {
187 		fsm->b_bus_req = 0;
188 	}
189 
190 	otg_statemachine(fsm);
191 }
192 
193 static void otg_start_hnp_polling(struct otg_fsm *fsm)
194 {
195 	/*
196 	 * The memory of host_req_flag should be allocated by
197 	 * controller driver, otherwise, hnp polling is not started.
198 	 */
199 	if (!fsm->host_req_flag)
200 		return;
201 
202 	INIT_DELAYED_WORK(&fsm->hnp_polling_work, otg_hnp_polling_work);
203 	schedule_delayed_work(&fsm->hnp_polling_work,
204 					msecs_to_jiffies(T_HOST_REQ_POLL));
205 }
206 
207 /* Called when entering a state */
208 static int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state)
209 {
210 	if (fsm->otg->state == new_state)
211 		return 0;
212 	VDBG("Set state: %s\n", usb_otg_state_string(new_state));
213 	otg_leave_state(fsm, fsm->otg->state);
214 	switch (new_state) {
215 	case OTG_STATE_B_IDLE:
216 		otg_drv_vbus(fsm, 0);
217 		otg_chrg_vbus(fsm, 0);
218 		otg_loc_conn(fsm, 0);
219 		otg_loc_sof(fsm, 0);
220 		/*
221 		 * Driver is responsible for starting ADP probing
222 		 * if ADP sensing times out.
223 		 */
224 		otg_start_adp_sns(fsm);
225 		otg_set_protocol(fsm, PROTO_UNDEF);
226 		otg_add_timer(fsm, B_SE0_SRP);
227 		break;
228 	case OTG_STATE_B_SRP_INIT:
229 		otg_start_pulse(fsm);
230 		otg_loc_sof(fsm, 0);
231 		otg_set_protocol(fsm, PROTO_UNDEF);
232 		otg_add_timer(fsm, B_SRP_FAIL);
233 		break;
234 	case OTG_STATE_B_PERIPHERAL:
235 		otg_chrg_vbus(fsm, 0);
236 		otg_loc_sof(fsm, 0);
237 		otg_set_protocol(fsm, PROTO_GADGET);
238 		otg_loc_conn(fsm, 1);
239 		break;
240 	case OTG_STATE_B_WAIT_ACON:
241 		otg_chrg_vbus(fsm, 0);
242 		otg_loc_conn(fsm, 0);
243 		otg_loc_sof(fsm, 0);
244 		otg_set_protocol(fsm, PROTO_HOST);
245 		otg_add_timer(fsm, B_ASE0_BRST);
246 		fsm->a_bus_suspend = 0;
247 		break;
248 	case OTG_STATE_B_HOST:
249 		otg_chrg_vbus(fsm, 0);
250 		otg_loc_conn(fsm, 0);
251 		otg_loc_sof(fsm, 1);
252 		otg_set_protocol(fsm, PROTO_HOST);
253 		usb_bus_start_enum(fsm->otg->host,
254 				fsm->otg->host->otg_port);
255 		otg_start_hnp_polling(fsm);
256 		break;
257 	case OTG_STATE_A_IDLE:
258 		otg_drv_vbus(fsm, 0);
259 		otg_chrg_vbus(fsm, 0);
260 		otg_loc_conn(fsm, 0);
261 		otg_loc_sof(fsm, 0);
262 		otg_start_adp_prb(fsm);
263 		otg_set_protocol(fsm, PROTO_HOST);
264 		break;
265 	case OTG_STATE_A_WAIT_VRISE:
266 		otg_drv_vbus(fsm, 1);
267 		otg_loc_conn(fsm, 0);
268 		otg_loc_sof(fsm, 0);
269 		otg_set_protocol(fsm, PROTO_HOST);
270 		otg_add_timer(fsm, A_WAIT_VRISE);
271 		break;
272 	case OTG_STATE_A_WAIT_BCON:
273 		otg_drv_vbus(fsm, 1);
274 		otg_loc_conn(fsm, 0);
275 		otg_loc_sof(fsm, 0);
276 		otg_set_protocol(fsm, PROTO_HOST);
277 		otg_add_timer(fsm, A_WAIT_BCON);
278 		break;
279 	case OTG_STATE_A_HOST:
280 		otg_drv_vbus(fsm, 1);
281 		otg_loc_conn(fsm, 0);
282 		otg_loc_sof(fsm, 1);
283 		otg_set_protocol(fsm, PROTO_HOST);
284 		/*
285 		 * When HNP is triggered while a_bus_req = 0, a_host will
286 		 * suspend too fast to complete a_set_b_hnp_en
287 		 */
288 		if (!fsm->a_bus_req || fsm->a_suspend_req_inf)
289 			otg_add_timer(fsm, A_WAIT_ENUM);
290 		otg_start_hnp_polling(fsm);
291 		break;
292 	case OTG_STATE_A_SUSPEND:
293 		otg_drv_vbus(fsm, 1);
294 		otg_loc_conn(fsm, 0);
295 		otg_loc_sof(fsm, 0);
296 		otg_set_protocol(fsm, PROTO_HOST);
297 		otg_add_timer(fsm, A_AIDL_BDIS);
298 
299 		break;
300 	case OTG_STATE_A_PERIPHERAL:
301 		otg_loc_sof(fsm, 0);
302 		otg_set_protocol(fsm, PROTO_GADGET);
303 		otg_drv_vbus(fsm, 1);
304 		otg_loc_conn(fsm, 1);
305 		otg_add_timer(fsm, A_BIDL_ADIS);
306 		break;
307 	case OTG_STATE_A_WAIT_VFALL:
308 		otg_drv_vbus(fsm, 0);
309 		otg_loc_conn(fsm, 0);
310 		otg_loc_sof(fsm, 0);
311 		otg_set_protocol(fsm, PROTO_HOST);
312 		otg_add_timer(fsm, A_WAIT_VFALL);
313 		break;
314 	case OTG_STATE_A_VBUS_ERR:
315 		otg_drv_vbus(fsm, 0);
316 		otg_loc_conn(fsm, 0);
317 		otg_loc_sof(fsm, 0);
318 		otg_set_protocol(fsm, PROTO_UNDEF);
319 		break;
320 	default:
321 		break;
322 	}
323 
324 	fsm->otg->state = new_state;
325 	fsm->state_changed = 1;
326 	return 0;
327 }
328 
329 /* State change judgement */
330 int otg_statemachine(struct otg_fsm *fsm)
331 {
332 	enum usb_otg_state state;
333 
334 	mutex_lock(&fsm->lock);
335 
336 	state = fsm->otg->state;
337 	fsm->state_changed = 0;
338 	/* State machine state change judgement */
339 
340 	switch (state) {
341 	case OTG_STATE_UNDEFINED:
342 		VDBG("fsm->id = %d\n", fsm->id);
343 		if (fsm->id)
344 			otg_set_state(fsm, OTG_STATE_B_IDLE);
345 		else
346 			otg_set_state(fsm, OTG_STATE_A_IDLE);
347 		break;
348 	case OTG_STATE_B_IDLE:
349 		if (!fsm->id)
350 			otg_set_state(fsm, OTG_STATE_A_IDLE);
351 		else if (fsm->b_sess_vld && fsm->otg->gadget)
352 			otg_set_state(fsm, OTG_STATE_B_PERIPHERAL);
353 		else if ((fsm->b_bus_req || fsm->adp_change || fsm->power_up) &&
354 				fsm->b_ssend_srp && fsm->b_se0_srp)
355 			otg_set_state(fsm, OTG_STATE_B_SRP_INIT);
356 		break;
357 	case OTG_STATE_B_SRP_INIT:
358 		if (!fsm->id || fsm->b_srp_done)
359 			otg_set_state(fsm, OTG_STATE_B_IDLE);
360 		break;
361 	case OTG_STATE_B_PERIPHERAL:
362 		if (!fsm->id || !fsm->b_sess_vld)
363 			otg_set_state(fsm, OTG_STATE_B_IDLE);
364 		else if (fsm->b_bus_req && fsm->otg->
365 				gadget->b_hnp_enable && fsm->a_bus_suspend)
366 			otg_set_state(fsm, OTG_STATE_B_WAIT_ACON);
367 		break;
368 	case OTG_STATE_B_WAIT_ACON:
369 		if (fsm->a_conn)
370 			otg_set_state(fsm, OTG_STATE_B_HOST);
371 		else if (!fsm->id || !fsm->b_sess_vld)
372 			otg_set_state(fsm, OTG_STATE_B_IDLE);
373 		else if (fsm->a_bus_resume || fsm->b_ase0_brst_tmout) {
374 			fsm->b_ase0_brst_tmout = 0;
375 			otg_set_state(fsm, OTG_STATE_B_PERIPHERAL);
376 		}
377 		break;
378 	case OTG_STATE_B_HOST:
379 		if (!fsm->id || !fsm->b_sess_vld)
380 			otg_set_state(fsm, OTG_STATE_B_IDLE);
381 		else if (!fsm->b_bus_req || !fsm->a_conn || fsm->test_device)
382 			otg_set_state(fsm, OTG_STATE_B_PERIPHERAL);
383 		break;
384 	case OTG_STATE_A_IDLE:
385 		if (fsm->id)
386 			otg_set_state(fsm, OTG_STATE_B_IDLE);
387 		else if (!fsm->a_bus_drop && (fsm->a_bus_req ||
388 			  fsm->a_srp_det || fsm->adp_change || fsm->power_up))
389 			otg_set_state(fsm, OTG_STATE_A_WAIT_VRISE);
390 		break;
391 	case OTG_STATE_A_WAIT_VRISE:
392 		if (fsm->a_vbus_vld)
393 			otg_set_state(fsm, OTG_STATE_A_WAIT_BCON);
394 		else if (fsm->id || fsm->a_bus_drop ||
395 				fsm->a_wait_vrise_tmout)
396 			otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
397 		break;
398 	case OTG_STATE_A_WAIT_BCON:
399 		if (!fsm->a_vbus_vld)
400 			otg_set_state(fsm, OTG_STATE_A_VBUS_ERR);
401 		else if (fsm->b_conn)
402 			otg_set_state(fsm, OTG_STATE_A_HOST);
403 		else if (fsm->id || fsm->a_bus_drop || fsm->a_wait_bcon_tmout)
404 			otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
405 		break;
406 	case OTG_STATE_A_HOST:
407 		if (fsm->id || fsm->a_bus_drop)
408 			otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
409 		else if ((!fsm->a_bus_req || fsm->a_suspend_req_inf) &&
410 				fsm->otg->host->b_hnp_enable)
411 			otg_set_state(fsm, OTG_STATE_A_SUSPEND);
412 		else if (!fsm->b_conn)
413 			otg_set_state(fsm, OTG_STATE_A_WAIT_BCON);
414 		else if (!fsm->a_vbus_vld)
415 			otg_set_state(fsm, OTG_STATE_A_VBUS_ERR);
416 		break;
417 	case OTG_STATE_A_SUSPEND:
418 		if (!fsm->b_conn && fsm->otg->host->b_hnp_enable)
419 			otg_set_state(fsm, OTG_STATE_A_PERIPHERAL);
420 		else if (!fsm->b_conn && !fsm->otg->host->b_hnp_enable)
421 			otg_set_state(fsm, OTG_STATE_A_WAIT_BCON);
422 		else if (fsm->a_bus_req || fsm->b_bus_resume)
423 			otg_set_state(fsm, OTG_STATE_A_HOST);
424 		else if (fsm->id || fsm->a_bus_drop || fsm->a_aidl_bdis_tmout)
425 			otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
426 		else if (!fsm->a_vbus_vld)
427 			otg_set_state(fsm, OTG_STATE_A_VBUS_ERR);
428 		break;
429 	case OTG_STATE_A_PERIPHERAL:
430 		if (fsm->id || fsm->a_bus_drop)
431 			otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
432 		else if (fsm->a_bidl_adis_tmout || fsm->b_bus_suspend)
433 			otg_set_state(fsm, OTG_STATE_A_WAIT_BCON);
434 		else if (!fsm->a_vbus_vld)
435 			otg_set_state(fsm, OTG_STATE_A_VBUS_ERR);
436 		break;
437 	case OTG_STATE_A_WAIT_VFALL:
438 		if (fsm->a_wait_vfall_tmout)
439 			otg_set_state(fsm, OTG_STATE_A_IDLE);
440 		break;
441 	case OTG_STATE_A_VBUS_ERR:
442 		if (fsm->id || fsm->a_bus_drop || fsm->a_clr_err)
443 			otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
444 		break;
445 	default:
446 		break;
447 	}
448 	mutex_unlock(&fsm->lock);
449 
450 	VDBG("quit statemachine, changed = %d\n", fsm->state_changed);
451 	return fsm->state_changed;
452 }
453 EXPORT_SYMBOL_GPL(otg_statemachine);
454 MODULE_LICENSE("GPL");
455