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