diff options
| -rw-r--r-- | drivers/usb/host/ehci.h | 138 | ||||
| -rw-r--r-- | include/linux/usb/ehci_def.h | 160 |
2 files changed, 161 insertions, 137 deletions
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index 5799298364fb..b697a13364ec 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h | |||
| @@ -210,143 +210,7 @@ timer_action (struct ehci_hcd *ehci, enum ehci_timer_action action) | |||
| 210 | 210 | ||
| 211 | /*-------------------------------------------------------------------------*/ | 211 | /*-------------------------------------------------------------------------*/ |
| 212 | 212 | ||
| 213 | /* EHCI register interface, corresponds to EHCI Revision 0.95 specification */ | 213 | #include <linux/usb/ehci_def.h> |
| 214 | |||
| 215 | /* Section 2.2 Host Controller Capability Registers */ | ||
| 216 | struct ehci_caps { | ||
| 217 | /* these fields are specified as 8 and 16 bit registers, | ||
| 218 | * but some hosts can't perform 8 or 16 bit PCI accesses. | ||
| 219 | */ | ||
| 220 | u32 hc_capbase; | ||
| 221 | #define HC_LENGTH(p) (((p)>>00)&0x00ff) /* bits 7:0 */ | ||
| 222 | #define HC_VERSION(p) (((p)>>16)&0xffff) /* bits 31:16 */ | ||
| 223 | u32 hcs_params; /* HCSPARAMS - offset 0x4 */ | ||
| 224 | #define HCS_DEBUG_PORT(p) (((p)>>20)&0xf) /* bits 23:20, debug port? */ | ||
| 225 | #define HCS_INDICATOR(p) ((p)&(1 << 16)) /* true: has port indicators */ | ||
| 226 | #define HCS_N_CC(p) (((p)>>12)&0xf) /* bits 15:12, #companion HCs */ | ||
| 227 | #define HCS_N_PCC(p) (((p)>>8)&0xf) /* bits 11:8, ports per CC */ | ||
| 228 | #define HCS_PORTROUTED(p) ((p)&(1 << 7)) /* true: port routing */ | ||
| 229 | #define HCS_PPC(p) ((p)&(1 << 4)) /* true: port power control */ | ||
| 230 | #define HCS_N_PORTS(p) (((p)>>0)&0xf) /* bits 3:0, ports on HC */ | ||
| 231 | |||
| 232 | u32 hcc_params; /* HCCPARAMS - offset 0x8 */ | ||
| 233 | #define HCC_EXT_CAPS(p) (((p)>>8)&0xff) /* for pci extended caps */ | ||
| 234 | #define HCC_ISOC_CACHE(p) ((p)&(1 << 7)) /* true: can cache isoc frame */ | ||
| 235 | #define HCC_ISOC_THRES(p) (((p)>>4)&0x7) /* bits 6:4, uframes cached */ | ||
| 236 | #define HCC_CANPARK(p) ((p)&(1 << 2)) /* true: can park on async qh */ | ||
| 237 | #define HCC_PGM_FRAMELISTLEN(p) ((p)&(1 << 1)) /* true: periodic_size changes*/ | ||
| 238 | #define HCC_64BIT_ADDR(p) ((p)&(1)) /* true: can use 64-bit addr */ | ||
| 239 | u8 portroute [8]; /* nibbles for routing - offset 0xC */ | ||
| 240 | } __attribute__ ((packed)); | ||
| 241 | |||
| 242 | |||
| 243 | /* Section 2.3 Host Controller Operational Registers */ | ||
| 244 | struct ehci_regs { | ||
| 245 | |||
| 246 | /* USBCMD: offset 0x00 */ | ||
| 247 | u32 command; | ||
| 248 | /* 23:16 is r/w intr rate, in microframes; default "8" == 1/msec */ | ||
| 249 | #define CMD_PARK (1<<11) /* enable "park" on async qh */ | ||
| 250 | #define CMD_PARK_CNT(c) (((c)>>8)&3) /* how many transfers to park for */ | ||
| 251 | #define CMD_LRESET (1<<7) /* partial reset (no ports, etc) */ | ||
| 252 | #define CMD_IAAD (1<<6) /* "doorbell" interrupt async advance */ | ||
| 253 | #define CMD_ASE (1<<5) /* async schedule enable */ | ||
| 254 | #define CMD_PSE (1<<4) /* periodic schedule enable */ | ||
| 255 | /* 3:2 is periodic frame list size */ | ||
| 256 | #define CMD_RESET (1<<1) /* reset HC not bus */ | ||
| 257 | #define CMD_RUN (1<<0) /* start/stop HC */ | ||
| 258 | |||
| 259 | /* USBSTS: offset 0x04 */ | ||
| 260 | u32 status; | ||
| 261 | #define STS_ASS (1<<15) /* Async Schedule Status */ | ||
| 262 | #define STS_PSS (1<<14) /* Periodic Schedule Status */ | ||
| 263 | #define STS_RECL (1<<13) /* Reclamation */ | ||
| 264 | #define STS_HALT (1<<12) /* Not running (any reason) */ | ||
| 265 | /* some bits reserved */ | ||
| 266 | /* these STS_* flags are also intr_enable bits (USBINTR) */ | ||
| 267 | #define STS_IAA (1<<5) /* Interrupted on async advance */ | ||
| 268 | #define STS_FATAL (1<<4) /* such as some PCI access errors */ | ||
| 269 | #define STS_FLR (1<<3) /* frame list rolled over */ | ||
| 270 | #define STS_PCD (1<<2) /* port change detect */ | ||
| 271 | #define STS_ERR (1<<1) /* "error" completion (overflow, ...) */ | ||
| 272 | #define STS_INT (1<<0) /* "normal" completion (short, ...) */ | ||
| 273 | |||
| 274 | /* USBINTR: offset 0x08 */ | ||
| 275 | u32 intr_enable; | ||
| 276 | |||
| 277 | /* FRINDEX: offset 0x0C */ | ||
| 278 | u32 frame_index; /* current microframe number */ | ||
| 279 | /* CTRLDSSEGMENT: offset 0x10 */ | ||
| 280 | u32 segment; /* address bits 63:32 if needed */ | ||
| 281 | /* PERIODICLISTBASE: offset 0x14 */ | ||
| 282 | u32 frame_list; /* points to periodic list */ | ||
| 283 | /* ASYNCLISTADDR: offset 0x18 */ | ||
| 284 | u32 async_next; /* address of next async queue head */ | ||
| 285 | |||
| 286 | u32 reserved [9]; | ||
| 287 | |||
| 288 | /* CONFIGFLAG: offset 0x40 */ | ||
| 289 | u32 configured_flag; | ||
| 290 | #define FLAG_CF (1<<0) /* true: we'll support "high speed" */ | ||
| 291 | |||
| 292 | /* PORTSC: offset 0x44 */ | ||
| 293 | u32 port_status [0]; /* up to N_PORTS */ | ||
| 294 | /* 31:23 reserved */ | ||
| 295 | #define PORT_WKOC_E (1<<22) /* wake on overcurrent (enable) */ | ||
| 296 | #define PORT_WKDISC_E (1<<21) /* wake on disconnect (enable) */ | ||
| 297 | #define PORT_WKCONN_E (1<<20) /* wake on connect (enable) */ | ||
| 298 | /* 19:16 for port testing */ | ||
| 299 | #define PORT_LED_OFF (0<<14) | ||
| 300 | #define PORT_LED_AMBER (1<<14) | ||
| 301 | #define PORT_LED_GREEN (2<<14) | ||
| 302 | #define PORT_LED_MASK (3<<14) | ||
| 303 | #define PORT_OWNER (1<<13) /* true: companion hc owns this port */ | ||
| 304 | #define PORT_POWER (1<<12) /* true: has power (see PPC) */ | ||
| 305 | #define PORT_USB11(x) (((x)&(3<<10))==(1<<10)) /* USB 1.1 device */ | ||
| 306 | /* 11:10 for detecting lowspeed devices (reset vs release ownership) */ | ||
| 307 | /* 9 reserved */ | ||
| 308 | #define PORT_RESET (1<<8) /* reset port */ | ||
| 309 | #define PORT_SUSPEND (1<<7) /* suspend port */ | ||
| 310 | #define PORT_RESUME (1<<6) /* resume it */ | ||
| 311 | #define PORT_OCC (1<<5) /* over current change */ | ||
| 312 | #define PORT_OC (1<<4) /* over current active */ | ||
| 313 | #define PORT_PEC (1<<3) /* port enable change */ | ||
| 314 | #define PORT_PE (1<<2) /* port enable */ | ||
| 315 | #define PORT_CSC (1<<1) /* connect status change */ | ||
| 316 | #define PORT_CONNECT (1<<0) /* device connected */ | ||
| 317 | #define PORT_RWC_BITS (PORT_CSC | PORT_PEC | PORT_OCC) | ||
| 318 | } __attribute__ ((packed)); | ||
| 319 | |||
| 320 | #define USBMODE 0x68 /* USB Device mode */ | ||
| 321 | #define USBMODE_SDIS (1<<3) /* Stream disable */ | ||
| 322 | #define USBMODE_BE (1<<2) /* BE/LE endianness select */ | ||
| 323 | #define USBMODE_CM_HC (3<<0) /* host controller mode */ | ||
| 324 | #define USBMODE_CM_IDLE (0<<0) /* idle state */ | ||
| 325 | |||
| 326 | /* Appendix C, Debug port ... intended for use with special "debug devices" | ||
| 327 | * that can help if there's no serial console. (nonstandard enumeration.) | ||
| 328 | */ | ||
| 329 | struct ehci_dbg_port { | ||
| 330 | u32 control; | ||
| 331 | #define DBGP_OWNER (1<<30) | ||
| 332 | #define DBGP_ENABLED (1<<28) | ||
| 333 | #define DBGP_DONE (1<<16) | ||
| 334 | #define DBGP_INUSE (1<<10) | ||
| 335 | #define DBGP_ERRCODE(x) (((x)>>7)&0x07) | ||
| 336 | # define DBGP_ERR_BAD 1 | ||
| 337 | # define DBGP_ERR_SIGNAL 2 | ||
| 338 | #define DBGP_ERROR (1<<6) | ||
| 339 | #define DBGP_GO (1<<5) | ||
| 340 | #define DBGP_OUT (1<<4) | ||
| 341 | #define DBGP_LEN(x) (((x)>>0)&0x0f) | ||
| 342 | u32 pids; | ||
| 343 | #define DBGP_PID_GET(x) (((x)>>16)&0xff) | ||
| 344 | #define DBGP_PID_SET(data,tok) (((data)<<8)|(tok)) | ||
| 345 | u32 data03; | ||
| 346 | u32 data47; | ||
| 347 | u32 address; | ||
| 348 | #define DBGP_EPADDR(dev,ep) (((dev)<<8)|(ep)) | ||
| 349 | } __attribute__ ((packed)); | ||
| 350 | 214 | ||
| 351 | /*-------------------------------------------------------------------------*/ | 215 | /*-------------------------------------------------------------------------*/ |
| 352 | 216 | ||
diff --git a/include/linux/usb/ehci_def.h b/include/linux/usb/ehci_def.h new file mode 100644 index 000000000000..5b88e36c9103 --- /dev/null +++ b/include/linux/usb/ehci_def.h | |||
| @@ -0,0 +1,160 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2001-2002 by David Brownell | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify it | ||
| 5 | * under the terms of the GNU General Public License as published by the | ||
| 6 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 7 | * option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, but | ||
| 10 | * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | ||
| 11 | * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
| 12 | * for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software Foundation, | ||
| 16 | * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 17 | */ | ||
| 18 | |||
| 19 | #ifndef __LINUX_USB_EHCI_DEF_H | ||
| 20 | #define __LINUX_USB_EHCI_DEF_H | ||
| 21 | |||
| 22 | /* EHCI register interface, corresponds to EHCI Revision 0.95 specification */ | ||
| 23 | |||
| 24 | /* Section 2.2 Host Controller Capability Registers */ | ||
| 25 | struct ehci_caps { | ||
| 26 | /* these fields are specified as 8 and 16 bit registers, | ||
| 27 | * but some hosts can't perform 8 or 16 bit PCI accesses. | ||
| 28 | */ | ||
| 29 | u32 hc_capbase; | ||
| 30 | #define HC_LENGTH(p) (((p)>>00)&0x00ff) /* bits 7:0 */ | ||
| 31 | #define HC_VERSION(p) (((p)>>16)&0xffff) /* bits 31:16 */ | ||
| 32 | u32 hcs_params; /* HCSPARAMS - offset 0x4 */ | ||
| 33 | #define HCS_DEBUG_PORT(p) (((p)>>20)&0xf) /* bits 23:20, debug port? */ | ||
| 34 | #define HCS_INDICATOR(p) ((p)&(1 << 16)) /* true: has port indicators */ | ||
| 35 | #define HCS_N_CC(p) (((p)>>12)&0xf) /* bits 15:12, #companion HCs */ | ||
| 36 | #define HCS_N_PCC(p) (((p)>>8)&0xf) /* bits 11:8, ports per CC */ | ||
| 37 | #define HCS_PORTROUTED(p) ((p)&(1 << 7)) /* true: port routing */ | ||
| 38 | #define HCS_PPC(p) ((p)&(1 << 4)) /* true: port power control */ | ||
| 39 | #define HCS_N_PORTS(p) (((p)>>0)&0xf) /* bits 3:0, ports on HC */ | ||
| 40 | |||
| 41 | u32 hcc_params; /* HCCPARAMS - offset 0x8 */ | ||
| 42 | #define HCC_EXT_CAPS(p) (((p)>>8)&0xff) /* for pci extended caps */ | ||
| 43 | #define HCC_ISOC_CACHE(p) ((p)&(1 << 7)) /* true: can cache isoc frame */ | ||
| 44 | #define HCC_ISOC_THRES(p) (((p)>>4)&0x7) /* bits 6:4, uframes cached */ | ||
| 45 | #define HCC_CANPARK(p) ((p)&(1 << 2)) /* true: can park on async qh */ | ||
| 46 | #define HCC_PGM_FRAMELISTLEN(p) ((p)&(1 << 1)) /* true: periodic_size changes*/ | ||
| 47 | #define HCC_64BIT_ADDR(p) ((p)&(1)) /* true: can use 64-bit addr */ | ||
| 48 | u8 portroute [8]; /* nibbles for routing - offset 0xC */ | ||
| 49 | } __attribute__ ((packed)); | ||
| 50 | |||
| 51 | |||
| 52 | /* Section 2.3 Host Controller Operational Registers */ | ||
| 53 | struct ehci_regs { | ||
| 54 | |||
| 55 | /* USBCMD: offset 0x00 */ | ||
| 56 | u32 command; | ||
| 57 | /* 23:16 is r/w intr rate, in microframes; default "8" == 1/msec */ | ||
| 58 | #define CMD_PARK (1<<11) /* enable "park" on async qh */ | ||
| 59 | #define CMD_PARK_CNT(c) (((c)>>8)&3) /* how many transfers to park for */ | ||
| 60 | #define CMD_LRESET (1<<7) /* partial reset (no ports, etc) */ | ||
| 61 | #define CMD_IAAD (1<<6) /* "doorbell" interrupt async advance */ | ||
| 62 | #define CMD_ASE (1<<5) /* async schedule enable */ | ||
| 63 | #define CMD_PSE (1<<4) /* periodic schedule enable */ | ||
| 64 | /* 3:2 is periodic frame list size */ | ||
| 65 | #define CMD_RESET (1<<1) /* reset HC not bus */ | ||
| 66 | #define CMD_RUN (1<<0) /* start/stop HC */ | ||
| 67 | |||
| 68 | /* USBSTS: offset 0x04 */ | ||
| 69 | u32 status; | ||
| 70 | #define STS_ASS (1<<15) /* Async Schedule Status */ | ||
| 71 | #define STS_PSS (1<<14) /* Periodic Schedule Status */ | ||
| 72 | #define STS_RECL (1<<13) /* Reclamation */ | ||
| 73 | #define STS_HALT (1<<12) /* Not running (any reason) */ | ||
| 74 | /* some bits reserved */ | ||
| 75 | /* these STS_* flags are also intr_enable bits (USBINTR) */ | ||
| 76 | #define STS_IAA (1<<5) /* Interrupted on async advance */ | ||
| 77 | #define STS_FATAL (1<<4) /* such as some PCI access errors */ | ||
| 78 | #define STS_FLR (1<<3) /* frame list rolled over */ | ||
| 79 | #define STS_PCD (1<<2) /* port change detect */ | ||
| 80 | #define STS_ERR (1<<1) /* "error" completion (overflow, ...) */ | ||
| 81 | #define STS_INT (1<<0) /* "normal" completion (short, ...) */ | ||
| 82 | |||
| 83 | /* USBINTR: offset 0x08 */ | ||
| 84 | u32 intr_enable; | ||
| 85 | |||
| 86 | /* FRINDEX: offset 0x0C */ | ||
| 87 | u32 frame_index; /* current microframe number */ | ||
| 88 | /* CTRLDSSEGMENT: offset 0x10 */ | ||
| 89 | u32 segment; /* address bits 63:32 if needed */ | ||
| 90 | /* PERIODICLISTBASE: offset 0x14 */ | ||
| 91 | u32 frame_list; /* points to periodic list */ | ||
| 92 | /* ASYNCLISTADDR: offset 0x18 */ | ||
| 93 | u32 async_next; /* address of next async queue head */ | ||
| 94 | |||
| 95 | u32 reserved [9]; | ||
| 96 | |||
| 97 | /* CONFIGFLAG: offset 0x40 */ | ||
| 98 | u32 configured_flag; | ||
| 99 | #define FLAG_CF (1<<0) /* true: we'll support "high speed" */ | ||
| 100 | |||
| 101 | /* PORTSC: offset 0x44 */ | ||
| 102 | u32 port_status [0]; /* up to N_PORTS */ | ||
| 103 | /* 31:23 reserved */ | ||
| 104 | #define PORT_WKOC_E (1<<22) /* wake on overcurrent (enable) */ | ||
| 105 | #define PORT_WKDISC_E (1<<21) /* wake on disconnect (enable) */ | ||
| 106 | #define PORT_WKCONN_E (1<<20) /* wake on connect (enable) */ | ||
| 107 | /* 19:16 for port testing */ | ||
| 108 | #define PORT_LED_OFF (0<<14) | ||
| 109 | #define PORT_LED_AMBER (1<<14) | ||
| 110 | #define PORT_LED_GREEN (2<<14) | ||
| 111 | #define PORT_LED_MASK (3<<14) | ||
| 112 | #define PORT_OWNER (1<<13) /* true: companion hc owns this port */ | ||
| 113 | #define PORT_POWER (1<<12) /* true: has power (see PPC) */ | ||
| 114 | #define PORT_USB11(x) (((x)&(3<<10)) == (1<<10)) /* USB 1.1 device */ | ||
| 115 | /* 11:10 for detecting lowspeed devices (reset vs release ownership) */ | ||
| 116 | /* 9 reserved */ | ||
| 117 | #define PORT_RESET (1<<8) /* reset port */ | ||
| 118 | #define PORT_SUSPEND (1<<7) /* suspend port */ | ||
| 119 | #define PORT_RESUME (1<<6) /* resume it */ | ||
| 120 | #define PORT_OCC (1<<5) /* over current change */ | ||
| 121 | #define PORT_OC (1<<4) /* over current active */ | ||
| 122 | #define PORT_PEC (1<<3) /* port enable change */ | ||
| 123 | #define PORT_PE (1<<2) /* port enable */ | ||
| 124 | #define PORT_CSC (1<<1) /* connect status change */ | ||
| 125 | #define PORT_CONNECT (1<<0) /* device connected */ | ||
| 126 | #define PORT_RWC_BITS (PORT_CSC | PORT_PEC | PORT_OCC) | ||
| 127 | } __attribute__ ((packed)); | ||
| 128 | |||
| 129 | #define USBMODE 0x68 /* USB Device mode */ | ||
| 130 | #define USBMODE_SDIS (1<<3) /* Stream disable */ | ||
| 131 | #define USBMODE_BE (1<<2) /* BE/LE endianness select */ | ||
| 132 | #define USBMODE_CM_HC (3<<0) /* host controller mode */ | ||
| 133 | #define USBMODE_CM_IDLE (0<<0) /* idle state */ | ||
| 134 | |||
| 135 | /* Appendix C, Debug port ... intended for use with special "debug devices" | ||
| 136 | * that can help if there's no serial console. (nonstandard enumeration.) | ||
| 137 | */ | ||
| 138 | struct ehci_dbg_port { | ||
| 139 | u32 control; | ||
| 140 | #define DBGP_OWNER (1<<30) | ||
| 141 | #define DBGP_ENABLED (1<<28) | ||
| 142 | #define DBGP_DONE (1<<16) | ||
| 143 | #define DBGP_INUSE (1<<10) | ||
| 144 | #define DBGP_ERRCODE(x) (((x)>>7)&0x07) | ||
| 145 | # define DBGP_ERR_BAD 1 | ||
| 146 | # define DBGP_ERR_SIGNAL 2 | ||
| 147 | #define DBGP_ERROR (1<<6) | ||
| 148 | #define DBGP_GO (1<<5) | ||
| 149 | #define DBGP_OUT (1<<4) | ||
| 150 | #define DBGP_LEN(x) (((x)>>0)&0x0f) | ||
| 151 | u32 pids; | ||
| 152 | #define DBGP_PID_GET(x) (((x)>>16)&0xff) | ||
| 153 | #define DBGP_PID_SET(data, tok) (((data)<<8)|(tok)) | ||
| 154 | u32 data03; | ||
| 155 | u32 data47; | ||
| 156 | u32 address; | ||
| 157 | #define DBGP_EPADDR(dev, ep) (((dev)<<8)|(ep)) | ||
| 158 | } __attribute__ ((packed)); | ||
| 159 | |||
| 160 | #endif /* __LINUX_USB_EHCI_DEF_H */ | ||
