Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ci.h
Go to the documentation of this file.
1 /*
2  * ci.h - common structures, functions, and macros of the ChipIdea driver
3  *
4  * Copyright (C) 2008 Chipidea - MIPS Technologies, Inc. All rights reserved.
5  *
6  * Author: David Lopo
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  */
12 
13 #ifndef __DRIVERS_USB_CHIPIDEA_CI_H
14 #define __DRIVERS_USB_CHIPIDEA_CI_H
15 
16 #include <linux/list.h>
17 #include <linux/irqreturn.h>
18 #include <linux/usb.h>
19 #include <linux/usb/gadget.h>
20 
21 /******************************************************************************
22  * DEFINE
23  *****************************************************************************/
24 #define CI13XXX_PAGE_SIZE 4096ul /* page size for TD's */
25 #define ENDPT_MAX 32
26 
27 /******************************************************************************
28  * STRUCTURES
29  *****************************************************************************/
43 struct ci13xxx_ep {
44  struct usb_ep ep;
48  char name[16];
49  struct {
50  struct list_head queue;
51  struct ci13xxx_qh *ptr;
53  } qh;
54  int wedge;
55 
56  /* global resources */
57  struct ci13xxx *ci;
59  struct dma_pool *td_pool;
60 };
61 
62 enum ci_role {
66 };
67 
76  int (*start)(struct ci13xxx *);
77  void (*stop)(struct ci13xxx *);
78  irqreturn_t (*irq)(struct ci13xxx *);
79  const char *name;
80 };
81 
92 struct hw_bank {
93  unsigned lpm;
95  void __iomem *abs;
96  void __iomem *cap;
97  void __iomem *op;
98  size_t size;
99  void __iomem **regmap;
100 };
101 
133 struct ci13xxx {
134  struct device *dev;
136  struct hw_bank hw_bank;
137  int irq;
139  enum ci_role role;
140  bool is_otg;
144 
145  struct dma_pool *qh_pool;
146  struct dma_pool *td_pool;
147 
150  unsigned hw_ep_max;
154 
156  bool setaddr;
161 
164  /* FIXME: some day, we'll not use global phy */
167  struct usb_hcd *hcd;
168 };
169 
170 static inline struct ci_role_driver *ci_role(struct ci13xxx *ci)
171 {
172  BUG_ON(ci->role >= CI_ROLE_END || !ci->roles[ci->role]);
173  return ci->roles[ci->role];
174 }
175 
176 static inline int ci_role_start(struct ci13xxx *ci, enum ci_role role)
177 {
178  int ret;
179 
180  if (role >= CI_ROLE_END)
181  return -EINVAL;
182 
183  if (!ci->roles[role])
184  return -ENXIO;
185 
186  ret = ci->roles[role]->start(ci);
187  if (!ret)
188  ci->role = role;
189  return ret;
190 }
191 
192 static inline void ci_role_stop(struct ci13xxx *ci)
193 {
194  enum ci_role role = ci->role;
195 
196  if (role == CI_ROLE_END)
197  return;
198 
199  ci->role = CI_ROLE_END;
200 
201  ci->roles[role]->stop(ci);
202 }
203 
204 /******************************************************************************
205  * REGISTERS
206  *****************************************************************************/
207 /* register size */
208 #define REG_BITS (32)
209 
210 /* register indices */
232  /* endptctrl1..15 follow */
234 };
235 
242 static inline int ffs_nr(u32 x)
243 {
244  int n = ffs(x);
245 
246  return n ? n-1 : 32;
247 }
248 
256 static inline u32 hw_read(struct ci13xxx *ci, enum ci13xxx_regs reg, u32 mask)
257 {
258  return ioread32(ci->hw_bank.regmap[reg]) & mask;
259 }
260 
267 static inline void hw_write(struct ci13xxx *ci, enum ci13xxx_regs reg,
268  u32 mask, u32 data)
269 {
270  if (~mask)
271  data = (ioread32(ci->hw_bank.regmap[reg]) & ~mask)
272  | (data & mask);
273 
274  iowrite32(data, ci->hw_bank.regmap[reg]);
275 }
276 
284 static inline u32 hw_test_and_clear(struct ci13xxx *ci, enum ci13xxx_regs reg,
285  u32 mask)
286 {
287  u32 val = ioread32(ci->hw_bank.regmap[reg]) & mask;
288 
289  iowrite32(val, ci->hw_bank.regmap[reg]);
290  return val;
291 }
292 
301 static inline u32 hw_test_and_write(struct ci13xxx *ci, enum ci13xxx_regs reg,
302  u32 mask, u32 data)
303 {
304  u32 val = hw_read(ci, reg, ~0);
305 
306  hw_write(ci, reg, mask, data);
307  return (val & mask) >> ffs_nr(mask);
308 }
309 
310 int hw_device_reset(struct ci13xxx *ci, u32 mode);
311 
312 int hw_port_test_set(struct ci13xxx *ci, u8 mode);
313 
314 u8 hw_port_test_get(struct ci13xxx *ci);
315 
316 #endif /* __DRIVERS_USB_CHIPIDEA_CI_H */