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