2 * ci.h - common structures, functions, and macros of the ChipIdea driver
4 * Copyright (C) 2008 Chipidea - MIPS Technologies, Inc. All rights reserved.
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.
13 #ifndef __DRIVERS_USB_CHIPIDEA_CI_H
14 #define __DRIVERS_USB_CHIPIDEA_CI_H
16 #include <linux/list.h>
17 #include <linux/usb/gadget.h>
19 /******************************************************************************
21 *****************************************************************************/
22 #define DMA_ADDR_INVALID (~(dma_addr_t)0)
23 #define CI13XXX_PAGE_SIZE 4096ul /* page size for TD's */
26 /******************************************************************************
28 *****************************************************************************/
29 /* Extension of usb_ep */
37 struct list_head queue;
38 struct ci13xxx_qh *ptr;
43 /* global resources */
46 struct device *device;
47 struct dma_pool *td_pool;
51 unsigned lpm; /* is LPM? */
52 void __iomem *abs; /* bus map offset */
53 void __iomem *cap; /* bus map offset + CAP offset */
54 void __iomem *op; /* bus map offset + OP offset */
55 size_t size; /* bank size */
56 void __iomem **regmap;
59 /* CI13XXX UDC descriptor & global resources */
61 spinlock_t lock; /* ctrl register bank access */
62 void __iomem *regs; /* registers address space */
64 struct dma_pool *qh_pool; /* DMA pool for queue heads */
65 struct dma_pool *td_pool; /* DMA pool for transfer descs */
66 struct usb_request *status; /* ep0 status request */
69 struct usb_gadget gadget; /* USB slave device */
70 struct ci13xxx_ep ci13xxx_ep[ENDPT_MAX]; /* extended endpts */
71 u32 ep0_dir; /* ep0 direction */
72 struct ci13xxx_ep *ep0out, *ep0in;
73 unsigned hw_ep_max; /* number of hw endpoints */
77 u8 remote_wakeup; /* Is remote wakeup feature
78 enabled by the host? */
79 u8 suspended; /* suspended by the host */
80 u8 test_mode; /* the selected test mode */
82 struct hw_bank hw_bank;
84 struct usb_gadget_driver *driver; /* 3rd party gadget driver */
85 struct ci13xxx_udc_driver *udc_driver; /* device controller driver */
86 int vbus_active; /* is VBUS active */
87 struct usb_phy *transceiver; /* Transceiver struct */
90 /******************************************************************************
92 *****************************************************************************/
96 /* register indices */
102 CAP_LAST = CAP_TESTMODE,
117 /* endptctrl1..15 follow */
118 OP_LAST = OP_ENDPTCTRL + ENDPT_MAX / 2,
123 * ffs_nr: find first (least significant) bit set
124 * @x: the word to search
126 * This function returns bit number (instead of position)
128 static inline int ffs_nr(u32 x)
136 * hw_read: reads from a hw register
137 * @reg: register index
138 * @mask: bitfield mask
140 * This function returns register contents
142 static inline u32 hw_read(struct ci13xxx *udc, enum ci13xxx_regs reg, u32 mask)
144 return ioread32(udc->hw_bank.regmap[reg]) & mask;
148 * hw_write: writes to a hw register
149 * @reg: register index
150 * @mask: bitfield mask
153 static inline void hw_write(struct ci13xxx *udc, enum ci13xxx_regs reg,
157 data = (ioread32(udc->hw_bank.regmap[reg]) & ~mask)
160 iowrite32(data, udc->hw_bank.regmap[reg]);
164 * hw_test_and_clear: tests & clears a hw register
165 * @reg: register index
166 * @mask: bitfield mask
168 * This function returns register contents
170 static inline u32 hw_test_and_clear(struct ci13xxx *udc, enum ci13xxx_regs reg,
173 u32 val = ioread32(udc->hw_bank.regmap[reg]) & mask;
175 iowrite32(val, udc->hw_bank.regmap[reg]);
180 * hw_test_and_write: tests & writes a hw register
181 * @reg: register index
182 * @mask: bitfield mask
185 * This function returns register contents
187 static inline u32 hw_test_and_write(struct ci13xxx *udc, enum ci13xxx_regs reg,
190 u32 val = hw_read(udc, reg, ~0);
192 hw_write(udc, reg, mask, data);
193 return (val & mask) >> ffs_nr(mask);
196 int hw_device_init(struct ci13xxx *udc, void __iomem *base,
197 uintptr_t cap_offset);
198 int hw_device_reset(struct ci13xxx *ci);
200 int hw_port_test_set(struct ci13xxx *ci, u8 mode);
202 u8 hw_port_test_get(struct ci13xxx *ci);
204 #endif /* __DRIVERS_USB_CHIPIDEA_CI_H */