Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
otg_fsm.h
Go to the documentation of this file.
1 /* Copyright (C) 2007,2008 Freescale Semiconductor, Inc.
2  *
3  * This program is free software; you can redistribute it and/or modify it
4  * under the terms of the GNU General Public License as published by the
5  * Free Software Foundation; either version 2 of the License, or (at your
6  * option) any later version.
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  * General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License along
14  * with this program; if not, write to the Free Software Foundation, Inc.,
15  * 675 Mass Ave, Cambridge, MA 02139, USA.
16  */
17 
18 #undef DEBUG
19 #undef VERBOSE
20 
21 #ifdef DEBUG
22 #define DBG(fmt, args...) printk(KERN_DEBUG "[%s] " fmt , \
23  __func__, ## args)
24 #else
25 #define DBG(fmt, args...) do {} while (0)
26 #endif
27 
28 #ifdef VERBOSE
29 #define VDBG DBG
30 #else
31 #define VDBG(stuff...) do {} while (0)
32 #endif
33 
34 #ifdef VERBOSE
35 #define MPC_LOC printk("Current Location [%s]:[%d]\n", __FILE__, __LINE__)
36 #else
37 #define MPC_LOC do {} while (0)
38 #endif
39 
40 #define PROTO_UNDEF (0)
41 #define PROTO_HOST (1)
42 #define PROTO_GADGET (2)
43 
44 /* OTG state machine according to the OTG spec */
45 struct otg_fsm {
46  /* Input */
49  int a_conn;
51  int a_srp_det;
55  int b_conn;
56  int b_se0_srp;
59  int id;
60 
61  /* Internal variables */
65 
66  /* Timeout indicator for timers */
71 
72  /* Informative variables */
74  int a_bus_req;
75  int a_clr_err;
77  int b_bus_req;
78 
79  /* Output */
80  int drv_vbus;
81  int loc_conn;
82  int loc_sof;
83 
84  struct otg_fsm_ops *ops;
85  struct usb_otg *otg;
86 
87  /* Current usb protocol used: 0:undefine; 1:host; 2:client */
88  int protocol;
90 };
91 
92 struct otg_fsm_ops {
93  void (*chrg_vbus)(int on);
94  void (*drv_vbus)(int on);
95  void (*loc_conn)(int on);
96  void (*loc_sof)(int on);
98  void (*add_timer)(void *timer);
99  void (*del_timer)(void *timer);
100  int (*start_host)(struct otg_fsm *fsm, int on);
101  int (*start_gadget)(struct otg_fsm *fsm, int on);
102 };
103 
104 
105 static inline void otg_chrg_vbus(struct otg_fsm *fsm, int on)
106 {
107  fsm->ops->chrg_vbus(on);
108 }
109 
110 static inline void otg_drv_vbus(struct otg_fsm *fsm, int on)
111 {
112  if (fsm->drv_vbus != on) {
113  fsm->drv_vbus = on;
114  fsm->ops->drv_vbus(on);
115  }
116 }
117 
118 static inline void otg_loc_conn(struct otg_fsm *fsm, int on)
119 {
120  if (fsm->loc_conn != on) {
121  fsm->loc_conn = on;
122  fsm->ops->loc_conn(on);
123  }
124 }
125 
126 static inline void otg_loc_sof(struct otg_fsm *fsm, int on)
127 {
128  if (fsm->loc_sof != on) {
129  fsm->loc_sof = on;
130  fsm->ops->loc_sof(on);
131  }
132 }
133 
134 static inline void otg_start_pulse(struct otg_fsm *fsm)
135 {
136  fsm->ops->start_pulse();
137 }
138 
139 static inline void otg_add_timer(struct otg_fsm *fsm, void *timer)
140 {
141  fsm->ops->add_timer(timer);
142 }
143 
144 static inline void otg_del_timer(struct otg_fsm *fsm, void *timer)
145 {
146  fsm->ops->del_timer(timer);
147 }
148 
149 int otg_statemachine(struct otg_fsm *fsm);
150 
151 /* Defined by device specific driver, for different timer implementation */