GUI: Fix Tomato RAF theme for all builds. Compilation typo.
[tomato.git] / release / src-rt-6.x.4708 / include / sbusbd.h
blobaffbbd964af32e3157d24a6352d322fdccccb0e3
1 /*
2 * Broadcom SiliconBackplane USB device core support
4 * Copyright (C) 2012, Broadcom Corporation
5 * All Rights Reserved.
6 *
7 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
8 * the contents of this file may not be disclosed to third parties, copied
9 * or duplicated in any form, in whole or in part, without the prior
10 * written permission of Broadcom Corporation.
12 * $Id: sbusbd.h 286759 2011-09-29 01:41:51Z $
15 #ifndef _usbdev_sb_h_
16 #define _usbdev_sb_h_
18 #include <typedefs.h>
19 #include <sbconfig.h>
20 #include <sbhnddma.h>
23 * Control endpoint 0 maps to DMA engine 0
24 * IN endpoints 1-4 map to transmit side of DMA engines 1-4
25 * OUT endpoints 5-8 map to receive side DMA engines 1-4
27 #define DMA_MAX 5
28 #define EP_MAX 9
29 #define EP2DMA(ep) (((ep) < DMA_MAX) ? (ep) : ((ep) - DMA_MAX + 1))
30 #define DMA2EP(i, dir) (((i) == 0) ? 0 : ((dir) == EP_DIR_IN ? (i) : ((i) + DMA_MAX - 1)))
32 /* rev 3 or higher has a dedicated DMA engine for Setup tokens */
33 #define SETUP_DMA 5
34 #define SETUP_DMA_DEPTH 4
36 /* cpp contortions to concatenate w/arg prescan */
37 #ifndef PAD
38 #define _PADLINE(line) pad ## line
39 #define _XSTR(line) _PADLINE(line)
40 #define PAD _XSTR(__LINE__)
41 #endif /* PAD */
43 /* dma64 corerev >= 7 */
44 typedef volatile struct {
45 dma64regs_t dmaxmt; /* dma tx */
46 uint32 PAD[2];
47 dma64regs_t dmarcv; /* dma rx */
48 uint32 PAD[2];
49 } dma64_t;
51 /* Host interface registers */
52 typedef volatile struct {
53 /* Device control */
54 uint32 devcontrol; /* DevControl, 0x000, rev 2 */
55 uint32 devstatus; /* DevStatus, 0x004, rev 2 */
56 uint32 PAD[1];
57 uint32 biststatus; /* BISTStatus, 0x00C, rev 2 */
59 /* USB control */
60 uint32 usbsetting; /* USBSetting, 0x010, rev 2 */
61 uint32 usbframe; /* USBFrame, 0x014, rev 2 */
62 uint32 lpmcontrol; /* LpmRegister, 0x18, rev 9 */
63 uint32 PAD[1];
65 /* 2nd level DMA int status/mask, IntStatus0-4, IntMask0-4 */
66 struct {
67 uint32 status;
68 uint32 mask;
69 } dmaint[DMA_MAX]; /* 0x020 - 0x44, rev 2 */
71 /* Top level interrupt status and mask */
72 uint32 usbintstatus; /* IntStatus, 0x048, rev 2 */
73 uint32 usbintmask; /* IntMask, 0x04C, rev 2 */
75 /* Endpoint status */
76 uint32 epstatus; /* CtrlOutStatus, 0x050, rev 2 */
77 uint32 txfifowtermark; /* bytes threshold before commit tx, POR=0x100 */
79 /* Dedicated 2nd level DMA int status/mask for Setup Data, rev 3 */
80 uint32 sdintstatus; /* IntStatus5, 0x58, rev 3 */
81 uint32 sdintmask; /* IntMask5, 0x5C, rev 3 */
82 uint32 PAD[40];
84 /* Lazy interrupt control, IntRcv0-4Lazy, 0x100-0x110, rev 2 */
85 uint32 intrcvlazy[DMA_MAX];
86 /* Setup token Lazy interrupt control, rev 3 */
87 uint32 sdintrcvlazy; /* IntRcvLazy5 (Setup Data), 0x114, rev 3 */
88 uint32 PAD[50];
90 uint32 clkctlstatus; /* ClockCtlStatus, 0x1E0, rev 3 */
91 uint32 PAD[7];
93 /* DMA engine regs, 0x200-0x29C, rev 2 */
94 dma32regp_t dmaregs[DMA_MAX];
95 dma32diag_t dmafifo; /* fifo diag regs, 0x2A0-0x2AC */
96 uint32 PAD[1];
98 /* Endpoint byte counters, EPByteCount0-8, 0x2B4-0x2D4, rev 2 */
99 uint32 epbytes[EP_MAX];
100 uint32 PAD[2];
102 uint32 hsicphyctrl1; /* HSICPhyCtrl1 0x2e0, rev 10 */
103 uint32 hsicphyctrl2; /* HSICPhyCtrl2 0x2e4, rev 10 */
104 uint32 hsicphystat1; /* HSICPhyStat1 0x2e8, rev 9 */
105 uint32 PAD[9];
106 uint32 utmi_ctl; /* utmi PHY contorol 0x310 */
107 uint32 PAD[3];
108 uint32 mdio_ctl; /* mdio_ctl, 0x320 */
109 uint32 mdio_data; /* mdio_data, 0x324 */
110 uint32 phymiscctl; /* PhyMiscCtl, 0x328, rev 4 */
111 uint32 PAD[5];
113 /* Dedicated Setup Data DMA engine, 0x340-0x35C, rev 3 */
114 dma32regp_t sddmaregs;
115 uint32 PAD[40];
117 /* Core registers */
118 uint32 commandaddr; /* CommmandAddress, 0x400, rev 2 */
119 /* EndPointConfig0-8, 0x404-0x424, rev 2 */
120 uint32 epinfo[EP_MAX];
121 uint32 PAD[54];
124 * dma64 registers, including Setup Data DMA engine, for corerev >= 7
125 * 0ffsets 0x500 to 0x674.
127 dma64_t dma64regs[DMA_MAX + 1];
128 uint32 PAD[544];
131 /* Sonics SiliconBackplane registers */
132 sbconfig_t sbconfig;
133 } usbdev_sb_regs_t;
135 /* Device control bits */
136 #define DC_RS (1L << 0) /* Device Reset */
137 #define DC_PL (1L << 1) /* USB11D: PLL Reset, USB20D PLL Power Down */
138 #define DC_US (1L << 2) /* USB Ready */
139 #define DC_ST (1L << 3) /* Force a Stall on all endpoints */
140 #define DC_RM (1L << 4) /* Resume */
141 #define DC_SD (1L << 5) /* Set Descriptor */
142 #define DC_SC (1L << 6) /* Sync Frame */
143 #define DC_SP (1L << 7) /* Self Power */
144 #define DC_RW (1L << 8) /* Remote Wakeup */
145 #define DC_AR (1L << 9) /* App Reset */
147 /* USB20 device specific bits */
148 #define DC_UP (1L << 10) /* UTMI Power Down */
149 #define DC_AP (1L << 11) /* Analog Power Down */
150 #define DC_PR (1L << 12) /* Phy Reset */
151 #define DC_SS_MASK 0x6000 /* Speed Select bits */
152 #define DC_SS_SHIFT 13
153 #define DC_SS_FS 1 /* Full Speed */
154 #define DC_SS_HS 0 /* High Speed */
155 #define DC_PE (1L << 15) /* Phy Error Detect Enable */
156 #define DC_NZLP_MASK 0x30000 /* Non-zero length Packet Stall */
157 #define DC_NZLP_SHIFT 16
158 #define DC_EH (1L << 18) /* Ep0 Halt Command Stall */
159 #define DC_HSTC_MASK 0x380000 /* HS Timeout Calibration */
160 #define DC_HSTC_SHIFT 19
161 #define DC_FSTC_MASK 0x1c00000 /* FS Timeout Calibration */
162 #define DC_FSTC_SHIFT 22
163 #define DC_DC (1L << 25) /* Soft Disconnect */
164 #define DC_UR (1L << 26) /* UTMI Soft Reset */
165 #define DC_UL (1L << 27) /* App ULPI Select */
166 #define DC_ULD (1L << 28) /* App ULPI DDR Select */
167 #define DC_LPM (1L << 29) /* LPM Enable */
168 #define DC_SS(n) (((uint32)(n) << DC_SS_SHIFT) & DC_SS_MASK)
170 /* Device status bits */
171 #define DS_SP (1L << 0) /* Suspend */
172 #define DS_RS (1L << 1) /* Reset */
173 #define DS_PE (1L << 4) /* Phy Error (USB20D) */
174 #define DS_DS_MASK 0xC /* Device Operating Speed (USB20D) */
175 #define DS_DS_SHIFT 2
176 #define DS_DS_HSCAP_HSMODE 0 /* HS cap, operating in HS mode */
177 #define DS_DS_HSCAP_FSMODE 1 /* HS cap, operating in FS mode */
178 #define DS_DS_FSCAP_FSMODE 3 /* FS cap, operating in FS mode */
179 #define DS_DS_HS (DS_DS_HSCAP_HSMODE << DS_DS_SHIFT)
180 #define DS_PHYMODE_MASK 0x0300
181 #define DS_PHYMODE_SHIFT 8
182 #define DS_PHYMODE_NORMAL 0 /* normal operation */
183 #define DS_PHYMODE_NONDRIVING 1 /* nob-driving */
184 #define DS_PHYMODE_NOSTUFF_NZI 2 /* disable bit stuffing and NZI */
185 #define DS_RWF (1L << 10) /* LPM Device Remote Wakeup Feature rev 9 */
187 /* USB setting bits */
188 #define USB_CF_MASK 0x00f /* Configuration */
189 #define USB_CF_SHIFT 0
190 #define USB_CF(n) (((uint32)(n) << USB_CF_SHIFT) & USB_CF_MASK)
191 #define USB_IF_MASK 0x0f0 /* Interface */
192 #define USB_IF_SHIFT 4
193 #define USB_IF(n) (((uint32)(n) << USB_IF_SHIFT) & USB_IF_MASK)
194 #define USB_AI_MASK 0xf00 /* Alternate Interface */
195 #define USB_AI_SHIFT 8
196 #define USB_AI(n) (((uint32)(n) << USB_AI_SHIFT) & USB_AI_MASK)
197 #define USB_LPM_DATA_MASK 0xffff0000 /* LPM data. rev 9 */
198 #define USB_LPM_DATA_SHIFT 16
199 #define USB_LPM_DATA_HANDSHAKE_MASK 0x60000000 /* LPM Handshake Sent. rev 9 */
200 #define USB_LPM_DATA_HANDSHAKE_SHIFT 29
201 #define USB_LPM_DATA_REMOTEWK_MASK 0x10000000 /* LPM Remote Wakeup Enabled, rev 9 */
202 #define USB_LPM_DATA_REMOTEWK_SHIFT 28
203 #define USB_LPM_DATA_HIRD_MASK 0xf000000 /* LPM HIRD. rev 9 */
204 #define USB_LPM_DATA_HIRD_SHIFT 24
205 #define USB_LPM_DATA_LS_MASK 0xf00000 /* LPM Link State. rev 9 */
206 #define USB_LPM_DATA_LS_SHIFT 20
207 #define USB_LPM_DATA_EP_MASK 0xf0000 /* USB endpoint. rev 9 */
208 #define USB_LPM_DATA_EP_SHIFT 16
210 /* LPM Handshake */
211 #define USB_LPM_HANDSHAKE_ACK 0x2 /* ACK */
212 #define USB_LPM_HANDSHAKE_NAK 0xa /* NAK */
213 #define USB_LPM_HANDSHAKE_STALL 0xe /* STALL */
214 #define USB_LPM_HANDSHAKE_NYET 0x6 /* NYET */
216 /* LPM Link State */
217 #define USB_LPM_L1_SLEEP 0x1 /* L1 Sleep */
219 /* LPM Control bits */
220 #define LC_INT_THRESH 0xf
221 #define LC_DS_THRESH 0xf0
222 #define LC_DS_THRESH_SHIFT 4
223 #define LC_DS_ENAB (1L << 8)
224 #define LC_DOZE_ENAB (1L << 9)
226 /* DMA interrupt bits */
227 #define I_PC (1L << 10) /* descriptor error */
228 #define I_PD (1L << 11) /* data error */
229 #define I_DE (1L << 12) /* Descriptor protocol Error */
230 #define I_RU (1L << 13) /* Receive descriptor Underflow */
231 #define I_RO (1L << 14) /* Receive fifo Overflow */
232 #define I_XU (1L << 15) /* Transmit fifo Underflow */
233 #define I_RI (1L << 16) /* Receive Interrupt */
234 #define I_XI (1L << 24) /* Transmit Interrupt */
235 #define I_ERRORS (I_PC | I_PD | I_DE | I_RU | I_RO | I_XU)
237 /* USB interrupt status and mask bits */
238 #define I_SETUP_MASK 0x0000003f /* Endpoint Setup interrupt (4:0) + Ctrl Req */
239 #define I_SETUP_SHIFT 0
240 #define I_SETUP(n) (1L << ((n) + I_SETUP_SHIFT))
241 #define I_DEV_REQ (1L << 5) /* SetupDataPresent on Setup DMA engine, rev 3 */
242 #define I_LPM_SLEEP (1L << 6) /* LPM Sleep Event, rev 9 */
243 #define I_DATAERR_MASK 0x0003fe00 /* Endpoint Data Error (17:9) */
244 #define I_DATAERR_SHIFT 9
245 #define I_DATAERR(n) (1L << ((n) + I_DATAERR_SHIFT))
246 #define I_SUS_RES (1L << 18) /* Suspend/Resume interrupt */
247 #define I_RESET (1L << 19) /* USB Reset interrupt */
248 #define I_SOF (1L << 20) /* USB Start of Frame interrupt */
249 #define I_CFG (1L << 21) /* Set Configuration interrupt */
250 #define I_DMA_MASK 0x07c00000 /* DMA interrupt pending (26:22) */
251 #define I_DMA_SHIFT 22
252 #define I_DMA(n) (1L << ((n) + I_DMA_SHIFT))
253 #define I_TXDONE_MASK 0xf8000000 /* Transmit complete (31:27) */
254 #define I_TXDONE_SHIFT 27
255 #define I_TXDONE(n) (1L << ((n) + I_TXDONE_SHIFT))
257 /* Interrupt receive lazy */
258 #define IRL_TO_MASK 0x00ffffff /* TimeOut (23:0) */
259 #define IRL_FC_MASK 0xff000000 /* Frame Count (31:24) */
260 #define IRL_FC_SHIFT 24
261 #define IRL_FC(n) (((uint32)(n) << IRL_FC_SHIFT) & IRL_FC_MASK)
263 /* ClkCtlStatus bits defined in sbconfig.h */
264 /* External Resource Requests */
265 #define CCS_USBCLKREQ 0x00000100 /* USB Clock Request */
267 /* External Resource Status */
268 #define CCS_USB_CLK_AVAIL 0x01000000 /* RO: USB Phy clock avail */
270 /* hsicphyctrl1 "PLL lock count" and "PLL reset count" bits */
271 #define HSIC_PULLDISABLE_MASK 0x00020000 /* Pull disable/force_buskeeper_off */
272 #define HSIC_PULLDISABLE_SHIFT 17
273 #define PLL_LOCK_CT_MASK 0x0f000000
274 #define PLL_LOCK_CT_SHIFT 24
275 #define PLL_RESET_CT_MASK 0x30000000
276 #define PLL_RESET_CT_SHIFT 28
278 /* phymiscctrl */
279 #define PMC_PLL_SUSP_EN (1 << 0)
280 #define PMC_PLL_CAL_EN (1 << 1)
282 /* Endpoint status bits */
283 #define EPS_ERROR_MASK 0x0000001f /* Error direction: IN vs. OUT (4:0) */
284 #define EPS_ERROR_SHIFT 0
285 #define EPS_ERROR(n) (1L << ((n) + EPS_ERROR_SHIFT))
286 #define EPS_STALL_MASK 0x00003fe0 /* Stall on endpoint (13:5) */
287 #define EPS_STALL_SHIFT 5
288 #define EPS_STALL(n) (1L << ((n) + EPS_STALL_SHIFT))
289 #define EPS_SETUP_LOST_MASK 0x0007c000 /* Setup Lost (18:14) */
290 #define EPS_SETUP_LOST_SHIFT 14
291 #define EPS_SETUP_LOST(n) (1L << ((n) + EPS_SETUP_LOST_SHIFT))
292 #define EPS_DONE_MASK 0x00f80000 /* Stop NAKing Status IN (23:19) */
293 #define EPS_DONE_SHIFT 19
294 #define EPS_DONE(n) (1L << ((n) + EPS_DONE_SHIFT))
296 /* Endpoint info bits */
297 #define EP_EN_MASK 0x0000000f /* Endpoint Number (logical) */
298 #define EP_EN_SHIFT 0
299 #define EP_EN(n) (((uint32)(n) << EP_EN_SHIFT) & EP_EN_MASK)
300 #define EP_DIR_MASK 0x00000010 /* Endpoint Direction (4) */
301 #define EP_DIR_OUT 0x00000000 /* OUT Endpoint */
302 #define EP_DIR_IN 0x00000010 /* IN Endpoint */
303 #define EP_TYPE_MASK 0x00000060 /* Endpoint Type (6:5) */
304 #define EP_CONTROL 0x00000000 /* Control Endpoint */
305 #define EP_ISO 0x00000020 /* Isochronous Endpoint */
306 #define EP_BULK 0x00000040 /* Bulk Endpoint */
307 #define EP_INTR 0x00000060 /* Interrupt Endpoint */
308 #define EP_CF_MASK 0x00000780 /* Configuration Number (10:7) */
309 #define EP_CF_SHIFT 7
310 #define EP_CF(n) (((uint32)(n) << EP_CF_SHIFT) & EP_CF_MASK)
311 #define EP_IF_MASK 0x00007800 /* Interface Number (14:11) */
312 #define EP_IF_SHIFT 11
313 #define EP_IF(n) (((uint32)(n) << EP_IF_SHIFT) & EP_IF_MASK)
314 #define EP_AI_MASK 0x00078000 /* Alternate Interface Number (18:15) */
315 #define EP_AI_SHIFT 15
316 #define EP_AI(n) (((uint32)(n) << EP_AI_SHIFT) & EP_AI_MASK)
317 #define EP_MPS_MASK 0x1ff80000 /* Maximum Packet Size (28:19) */
318 #define EP_MPS_SHIFT 19
319 #define EP_MPS(n) (((uint32)(n) << EP_MPS_SHIFT) & EP_MPS_MASK)
321 /* AI chips-only: SFLAG originating from dmp regs DmpStatus/iostatus register */
322 #define SFLAG_HSIC 0x00000001 /* set=USB operating in HSIC mode */
324 /* AI chips-only: dmp regs DmpControl/ioctrl register bit definitions */
325 #define DMPIOC_CPULESS 0x00000004 /* set=reset will put core into CPULess mode */
327 /* CPULess mode direct backplane access Setup token bRequest field definitions */
328 #define CPULESS_INCR_ADDR 0x00 /* autoincrement by 1 or 4 bytes, depending on access len */
329 #define CPULESS_FIFO_ADDR 0xff /* fixed, FIFO-mode address access */
331 /* rx header */
332 typedef volatile struct {
333 uint16 len;
334 uint16 flags;
335 } usbdev_sb_rxh_t;
337 /* rx header flags */
338 #define RXF_SETUP 0x0001 /* rev 2 */
339 #define RXF_BAD 0x0002 /* rev 2 */
340 #define SETUP_TAG_SHIFT 2 /* rev 3 */
341 #define SETUP_TAG_MASK 0x000c /* rev 3 */
342 #define EP_ID_SHIFT 4 /* rev 3 */
343 #define EP_ID_MASK 0x00f0 /* rev 3 */
345 #define USB20DREV_IS(var, val) ((var) == (val))
346 #define USB20DREV_GE(var, val) ((var) >= (val))
347 #define USB20DREV_GT(var, val) ((var) > (val))
348 #define USB20DREV_LT(var, val) ((var) < (val))
349 #define USB20DREV_LE(var, val) ((var) <= (val))
351 #define USB20DDMAREG(ch, direction, fifonum) (USB20DREV_LT(ch->rev, 7) ? \
352 ((direction == DMA_TX) ? \
353 (void*)(uintptr)&(ch->regs->dmaregs[fifonum].xmt) : \
354 (void*)(uintptr)&(ch->regs->dmaregs[fifonum].rcv)) : \
355 ((direction == DMA_TX) ? \
356 (void*)(uintptr)&(ch->regs->dma64regs[fifonum].dmaxmt) : \
357 (void*)(uintptr)&(ch->regs->dma64regs[fifonum].dmarcv)))
360 * MDIO Phy Interface
362 #define USB_MDIOCTL_SMSEL_SHIFT 0
363 #define USB_MDIOCTL_SMSEL_CLKEN 1
364 #define USB_MDIOCTL_ID_SHIFT 1
365 #define USB_MDIOCTL_ID_MASK 0x0000003E
367 #define USB_MDIOCTL_WR_SHIFT 6
368 #define USB_MDIOCTL_WR_EN 0x40
369 #define USB_MDIOCTL_RD_SHIFT 7
370 #define USB_MDIOCTL_RD_EN 0x80
371 #define USB_MDIOCTL_REGADDR_SHIFT 8
372 #define USB_MDIOCTL_REGADDR_MASK 0x00001F00
373 #define USB_MDIOCTL_WRDATA_SHIFT 13
374 #define USB_MDIOCTL_WRDATA_MASK 0x1FFFE000
376 #define USB_MDIODAT_RDDATA_SHIFT 0
377 #define USB_MDIODAT_RDDATA_MASK 0x0000FFFF
379 #define USB_MDIO_ADDR_MAX 32
381 /* HSIC Phy Slave */
382 #define HSIC_MDIO_SLAVE_ADDR 0x15
383 #define HSIC_MDIO_REG_PHY_CFG0 0
384 #define HSIC_MDIO_REG_PHY_CFG1 1
385 #define HSIC_MDIO_REG_TST_CTL1 3
386 #define HSIC_MDIO_REG_BERT_CNT 4
387 #define HSIC_MDIO_REG_BERT_SZ 5
388 #define HSIC_MDIO_REG_BERT_CFG0 6
389 #define HSIC_MDIO_REG_BERT_CFG1 7
390 #define HSIC_MDIO_REG_TST_CTL2 8
391 #define HSIC_MDIO_REG_TST_CTL2_XWR_EN 0x40
393 /* HSIC Phy Register Extensions */
394 #define HSIC_MDIO_REGEX_UNUSED 0
395 #define HSIC_MDIO_REGEX_CTL0 1
396 #define HSIC_MDIO_REGEX_CTL0_RST 0
397 #define HSIC_MDIO_REGEX_CTL0_DIS 0x1
398 #define HSIC_MDIO_REGEX_CTL0_EN 0x3
399 #define HSIC_MDIO_REGEX_DIV_R0 2
400 #define HSIC_MDIO_REGEX_DIV_R0_FREQ_MASK 0x000F
401 #define HSIC_MDIO_REGEX_DIV_R1 3
402 #define HSIC_MDIO_REGEX_DIV_R1_FREQ_MASK 0xFFFF
404 #endif /* _usbdev_sb_h_ */