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 */
34static 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
64static int state_changed;
65
66/* Called when leaving a state.  Do state clean up jobs here */
67static void otg_leave_state(struct otg_fsm *fsm, enum usb_otg_state old_state)
68{
69	switch (old_state) {
70	case OTG_STATE_B_IDLE:
71		otg_del_timer(fsm, B_SE0_SRP);
72		fsm->b_se0_srp = 0;
73		fsm->adp_sns = 0;
74		fsm->adp_prb = 0;
75		break;
76	case OTG_STATE_B_SRP_INIT:
77		fsm->data_pulse = 0;
78		fsm->b_srp_done = 0;
79		break;
80	case OTG_STATE_B_PERIPHERAL:
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		break;
111	case OTG_STATE_A_WAIT_VFALL:
112		otg_del_timer(fsm, A_WAIT_VFALL);
113		fsm->a_wait_vfall_tmout = 0;
114		otg_del_timer(fsm, A_WAIT_VRISE);
115		break;
116	case OTG_STATE_A_VBUS_ERR:
117		break;
118	default:
119		break;
120	}
121}
122
123/* Called when entering a state */
124static int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state)
125{
126	state_changed = 1;
127	if (fsm->otg->state == new_state)
128		return 0;
129	VDBG("Set state: %s\n", usb_otg_state_string(new_state));
130	otg_leave_state(fsm, fsm->otg->state);
131	switch (new_state) {
132	case OTG_STATE_B_IDLE:
133		otg_drv_vbus(fsm, 0);
134		otg_chrg_vbus(fsm, 0);
135		otg_loc_conn(fsm, 0);
136		otg_loc_sof(fsm, 0);
137		/*
138		 * Driver is responsible for starting ADP probing
139		 * if ADP sensing times out.
140		 */
141		otg_start_adp_sns(fsm);
142		otg_set_protocol(fsm, PROTO_UNDEF);
143		otg_add_timer(fsm, B_SE0_SRP);
144		break;
145	case OTG_STATE_B_SRP_INIT:
146		otg_start_pulse(fsm);
147		otg_loc_sof(fsm, 0);
148		otg_set_protocol(fsm, PROTO_UNDEF);
149		otg_add_timer(fsm, B_SRP_FAIL);
150		break;
151	case OTG_STATE_B_PERIPHERAL:
152		otg_chrg_vbus(fsm, 0);
153		otg_loc_sof(fsm, 0);
154		otg_set_protocol(fsm, PROTO_GADGET);
155		otg_loc_conn(fsm, 1);
156		break;
157	case OTG_STATE_B_WAIT_ACON:
158		otg_chrg_vbus(fsm, 0);
159		otg_loc_conn(fsm, 0);
160		otg_loc_sof(fsm, 0);
161		otg_set_protocol(fsm, PROTO_HOST);
162		otg_add_timer(fsm, B_ASE0_BRST);
163		fsm->a_bus_suspend = 0;
164		break;
165	case OTG_STATE_B_HOST:
166		otg_chrg_vbus(fsm, 0);
167		otg_loc_conn(fsm, 0);
168		otg_loc_sof(fsm, 1);
169		otg_set_protocol(fsm, PROTO_HOST);
170		usb_bus_start_enum(fsm->otg->host,
171				fsm->otg->host->otg_port);
172		break;
173	case OTG_STATE_A_IDLE:
174		otg_drv_vbus(fsm, 0);
175		otg_chrg_vbus(fsm, 0);
176		otg_loc_conn(fsm, 0);
177		otg_loc_sof(fsm, 0);
178		otg_start_adp_prb(fsm);
179		otg_set_protocol(fsm, PROTO_HOST);
180		break;
181	case OTG_STATE_A_WAIT_VRISE:
182		otg_drv_vbus(fsm, 1);
183		otg_loc_conn(fsm, 0);
184		otg_loc_sof(fsm, 0);
185		otg_set_protocol(fsm, PROTO_HOST);
186		otg_add_timer(fsm, A_WAIT_VRISE);
187		break;
188	case OTG_STATE_A_WAIT_BCON:
189		otg_drv_vbus(fsm, 1);
190		otg_loc_conn(fsm, 0);
191		otg_loc_sof(fsm, 0);
192		otg_set_protocol(fsm, PROTO_HOST);
193		otg_add_timer(fsm, A_WAIT_BCON);
194		break;
195	case OTG_STATE_A_HOST:
196		otg_drv_vbus(fsm, 1);
197		otg_loc_conn(fsm, 0);
198		otg_loc_sof(fsm, 1);
199		otg_set_protocol(fsm, PROTO_HOST);
200		/*
201		 * When HNP is triggered while a_bus_req = 0, a_host will
202		 * suspend too fast to complete a_set_b_hnp_en
203		 */
204		if (!fsm->a_bus_req || fsm->a_suspend_req_inf)
205			otg_add_timer(fsm, A_WAIT_ENUM);
206		break;
207	case OTG_STATE_A_SUSPEND:
208		otg_drv_vbus(fsm, 1);
209		otg_loc_conn(fsm, 0);
210		otg_loc_sof(fsm, 0);
211		otg_set_protocol(fsm, PROTO_HOST);
212		otg_add_timer(fsm, A_AIDL_BDIS);
213
214		break;
215	case OTG_STATE_A_PERIPHERAL:
216		otg_loc_sof(fsm, 0);
217		otg_set_protocol(fsm, PROTO_GADGET);
218		otg_drv_vbus(fsm, 1);
219		otg_loc_conn(fsm, 1);
220		otg_add_timer(fsm, A_BIDL_ADIS);
221		break;
222	case OTG_STATE_A_WAIT_VFALL:
223		otg_drv_vbus(fsm, 0);
224		otg_loc_conn(fsm, 0);
225		otg_loc_sof(fsm, 0);
226		otg_set_protocol(fsm, PROTO_HOST);
227		otg_add_timer(fsm, A_WAIT_VFALL);
228		break;
229	case OTG_STATE_A_VBUS_ERR:
230		otg_drv_vbus(fsm, 0);
231		otg_loc_conn(fsm, 0);
232		otg_loc_sof(fsm, 0);
233		otg_set_protocol(fsm, PROTO_UNDEF);
234		break;
235	default:
236		break;
237	}
238
239	fsm->otg->state = new_state;
240	return 0;
241}
242
243/* State change judgement */
244int otg_statemachine(struct otg_fsm *fsm)
245{
246	enum usb_otg_state state;
247
248	mutex_lock(&fsm->lock);
249
250	state = fsm->otg->state;
251	state_changed = 0;
252	/* State machine state change judgement */
253
254	switch (state) {
255	case OTG_STATE_UNDEFINED:
256		VDBG("fsm->id = %d\n", fsm->id);
257		if (fsm->id)
258			otg_set_state(fsm, OTG_STATE_B_IDLE);
259		else
260			otg_set_state(fsm, OTG_STATE_A_IDLE);
261		break;
262	case OTG_STATE_B_IDLE:
263		if (!fsm->id)
264			otg_set_state(fsm, OTG_STATE_A_IDLE);
265		else if (fsm->b_sess_vld && fsm->otg->gadget)
266			otg_set_state(fsm, OTG_STATE_B_PERIPHERAL);
267		else if ((fsm->b_bus_req || fsm->adp_change || fsm->power_up) &&
268				fsm->b_ssend_srp && fsm->b_se0_srp)
269			otg_set_state(fsm, OTG_STATE_B_SRP_INIT);
270		break;
271	case OTG_STATE_B_SRP_INIT:
272		if (!fsm->id || fsm->b_srp_done)
273			otg_set_state(fsm, OTG_STATE_B_IDLE);
274		break;
275	case OTG_STATE_B_PERIPHERAL:
276		if (!fsm->id || !fsm->b_sess_vld)
277			otg_set_state(fsm, OTG_STATE_B_IDLE);
278		else if (fsm->b_bus_req && fsm->otg->
279				gadget->b_hnp_enable && fsm->a_bus_suspend)
280			otg_set_state(fsm, OTG_STATE_B_WAIT_ACON);
281		break;
282	case OTG_STATE_B_WAIT_ACON:
283		if (fsm->a_conn)
284			otg_set_state(fsm, OTG_STATE_B_HOST);
285		else if (!fsm->id || !fsm->b_sess_vld)
286			otg_set_state(fsm, OTG_STATE_B_IDLE);
287		else if (fsm->a_bus_resume || fsm->b_ase0_brst_tmout) {
288			fsm->b_ase0_brst_tmout = 0;
289			otg_set_state(fsm, OTG_STATE_B_PERIPHERAL);
290		}
291		break;
292	case OTG_STATE_B_HOST:
293		if (!fsm->id || !fsm->b_sess_vld)
294			otg_set_state(fsm, OTG_STATE_B_IDLE);
295		else if (!fsm->b_bus_req || !fsm->a_conn || fsm->test_device)
296			otg_set_state(fsm, OTG_STATE_B_PERIPHERAL);
297		break;
298	case OTG_STATE_A_IDLE:
299		if (fsm->id)
300			otg_set_state(fsm, OTG_STATE_B_IDLE);
301		else if (!fsm->a_bus_drop && (fsm->a_bus_req ||
302			  fsm->a_srp_det || fsm->adp_change || fsm->power_up))
303			otg_set_state(fsm, OTG_STATE_A_WAIT_VRISE);
304		break;
305	case OTG_STATE_A_WAIT_VRISE:
306		if (fsm->a_vbus_vld)
307			otg_set_state(fsm, OTG_STATE_A_WAIT_BCON);
308		else if (fsm->id || fsm->a_bus_drop ||
309				fsm->a_wait_vrise_tmout)
310			otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
311		break;
312	case OTG_STATE_A_WAIT_BCON:
313		if (!fsm->a_vbus_vld)
314			otg_set_state(fsm, OTG_STATE_A_VBUS_ERR);
315		else if (fsm->b_conn)
316			otg_set_state(fsm, OTG_STATE_A_HOST);
317		else if (fsm->id || fsm->a_bus_drop || fsm->a_wait_bcon_tmout)
318			otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
319		break;
320	case OTG_STATE_A_HOST:
321		if (fsm->id || fsm->a_bus_drop)
322			otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
323		else if ((!fsm->a_bus_req || fsm->a_suspend_req_inf) &&
324				fsm->otg->host->b_hnp_enable)
325			otg_set_state(fsm, OTG_STATE_A_SUSPEND);
326		else if (!fsm->b_conn)
327			otg_set_state(fsm, OTG_STATE_A_WAIT_BCON);
328		else if (!fsm->a_vbus_vld)
329			otg_set_state(fsm, OTG_STATE_A_VBUS_ERR);
330		break;
331	case OTG_STATE_A_SUSPEND:
332		if (!fsm->b_conn && fsm->otg->host->b_hnp_enable)
333			otg_set_state(fsm, OTG_STATE_A_PERIPHERAL);
334		else if (!fsm->b_conn && !fsm->otg->host->b_hnp_enable)
335			otg_set_state(fsm, OTG_STATE_A_WAIT_BCON);
336		else if (fsm->a_bus_req || fsm->b_bus_resume)
337			otg_set_state(fsm, OTG_STATE_A_HOST);
338		else if (fsm->id || fsm->a_bus_drop || fsm->a_aidl_bdis_tmout)
339			otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
340		else if (!fsm->a_vbus_vld)
341			otg_set_state(fsm, OTG_STATE_A_VBUS_ERR);
342		break;
343	case OTG_STATE_A_PERIPHERAL:
344		if (fsm->id || fsm->a_bus_drop)
345			otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
346		else if (fsm->a_bidl_adis_tmout || fsm->b_bus_suspend)
347			otg_set_state(fsm, OTG_STATE_A_WAIT_BCON);
348		else if (!fsm->a_vbus_vld)
349			otg_set_state(fsm, OTG_STATE_A_VBUS_ERR);
350		break;
351	case OTG_STATE_A_WAIT_VFALL:
352		if (fsm->a_wait_vfall_tmout)
353			otg_set_state(fsm, OTG_STATE_A_IDLE);
354		break;
355	case OTG_STATE_A_VBUS_ERR:
356		if (fsm->id || fsm->a_bus_drop || fsm->a_clr_err)
357			otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
358		break;
359	default:
360		break;
361	}
362	mutex_unlock(&fsm->lock);
363
364	VDBG("quit statemachine, changed = %d\n", state_changed);
365	return state_changed;
366}
367EXPORT_SYMBOL_GPL(otg_statemachine);
368