vhub.h (17842B)
1/* SPDX-License-Identifier: GPL-2.0+ */ 2#ifndef __ASPEED_VHUB_H 3#define __ASPEED_VHUB_H 4 5#include <linux/usb.h> 6#include <linux/usb/ch11.h> 7 8/***************************** 9 * * 10 * VHUB register definitions * 11 * * 12 *****************************/ 13 14#define AST_VHUB_CTRL 0x00 /* Root Function Control & Status Register */ 15#define AST_VHUB_CONF 0x04 /* Root Configuration Setting Register */ 16#define AST_VHUB_IER 0x08 /* Interrupt Ctrl Register */ 17#define AST_VHUB_ISR 0x0C /* Interrupt Status Register */ 18#define AST_VHUB_EP_ACK_IER 0x10 /* Programmable Endpoint Pool ACK Interrupt Enable Register */ 19#define AST_VHUB_EP_NACK_IER 0x14 /* Programmable Endpoint Pool NACK Interrupt Enable Register */ 20#define AST_VHUB_EP_ACK_ISR 0x18 /* Programmable Endpoint Pool ACK Interrupt Status Register */ 21#define AST_VHUB_EP_NACK_ISR 0x1C /* Programmable Endpoint Pool NACK Interrupt Status Register */ 22#define AST_VHUB_SW_RESET 0x20 /* Device Controller Soft Reset Enable Register */ 23#define AST_VHUB_USBSTS 0x24 /* USB Status Register */ 24#define AST_VHUB_EP_TOGGLE 0x28 /* Programmable Endpoint Pool Data Toggle Value Set */ 25#define AST_VHUB_ISO_FAIL_ACC 0x2C /* Isochronous Transaction Fail Accumulator */ 26#define AST_VHUB_EP0_CTRL 0x30 /* Endpoint 0 Contrl/Status Register */ 27#define AST_VHUB_EP0_DATA 0x34 /* Base Address of Endpoint 0 In/OUT Data Buffer Register */ 28#define AST_VHUB_EP1_CTRL 0x38 /* Endpoint 1 Contrl/Status Register */ 29#define AST_VHUB_EP1_STS_CHG 0x3C /* Endpoint 1 Status Change Bitmap Data */ 30#define AST_VHUB_SETUP0 0x80 /* Root Device Setup Data Buffer0 */ 31#define AST_VHUB_SETUP1 0x84 /* Root Device Setup Data Buffer1 */ 32 33/* Main control reg */ 34#define VHUB_CTRL_PHY_CLK (1 << 31) 35#define VHUB_CTRL_PHY_LOOP_TEST (1 << 25) 36#define VHUB_CTRL_DN_PWN (1 << 24) 37#define VHUB_CTRL_DP_PWN (1 << 23) 38#define VHUB_CTRL_LONG_DESC (1 << 18) 39#define VHUB_CTRL_ISO_RSP_CTRL (1 << 17) 40#define VHUB_CTRL_SPLIT_IN (1 << 16) 41#define VHUB_CTRL_LOOP_T_RESULT (1 << 15) 42#define VHUB_CTRL_LOOP_T_STS (1 << 14) 43#define VHUB_CTRL_PHY_BIST_RESULT (1 << 13) 44#define VHUB_CTRL_PHY_BIST_CTRL (1 << 12) 45#define VHUB_CTRL_PHY_RESET_DIS (1 << 11) 46#define VHUB_CTRL_SET_TEST_MODE(x) ((x) << 8) 47#define VHUB_CTRL_MANUAL_REMOTE_WAKEUP (1 << 4) 48#define VHUB_CTRL_AUTO_REMOTE_WAKEUP (1 << 3) 49#define VHUB_CTRL_CLK_STOP_SUSPEND (1 << 2) 50#define VHUB_CTRL_FULL_SPEED_ONLY (1 << 1) 51#define VHUB_CTRL_UPSTREAM_CONNECT (1 << 0) 52 53/* IER & ISR */ 54#define VHUB_IRQ_DEV1_BIT 9 55#define VHUB_IRQ_USB_CMD_DEADLOCK (1 << 18) 56#define VHUB_IRQ_EP_POOL_NAK (1 << 17) 57#define VHUB_IRQ_EP_POOL_ACK_STALL (1 << 16) 58#define VHUB_IRQ_DEVICE1 (1 << (VHUB_IRQ_DEV1_BIT)) 59#define VHUB_IRQ_BUS_RESUME (1 << 8) 60#define VHUB_IRQ_BUS_SUSPEND (1 << 7) 61#define VHUB_IRQ_BUS_RESET (1 << 6) 62#define VHUB_IRQ_HUB_EP1_IN_DATA_ACK (1 << 5) 63#define VHUB_IRQ_HUB_EP0_IN_DATA_NAK (1 << 4) 64#define VHUB_IRQ_HUB_EP0_IN_ACK_STALL (1 << 3) 65#define VHUB_IRQ_HUB_EP0_OUT_NAK (1 << 2) 66#define VHUB_IRQ_HUB_EP0_OUT_ACK_STALL (1 << 1) 67#define VHUB_IRQ_HUB_EP0_SETUP (1 << 0) 68#define VHUB_IRQ_ACK_ALL 0x1ff 69 70/* Downstream device IRQ mask. */ 71#define VHUB_DEV_IRQ(n) (VHUB_IRQ_DEVICE1 << (n)) 72 73/* SW reset reg */ 74#define VHUB_SW_RESET_EP_POOL (1 << 9) 75#define VHUB_SW_RESET_DMA_CONTROLLER (1 << 8) 76#define VHUB_SW_RESET_DEVICE5 (1 << 5) 77#define VHUB_SW_RESET_DEVICE4 (1 << 4) 78#define VHUB_SW_RESET_DEVICE3 (1 << 3) 79#define VHUB_SW_RESET_DEVICE2 (1 << 2) 80#define VHUB_SW_RESET_DEVICE1 (1 << 1) 81#define VHUB_SW_RESET_ROOT_HUB (1 << 0) 82 83/* EP ACK/NACK IRQ masks */ 84#define VHUB_EP_IRQ(n) (1 << (n)) 85 86/* USB status reg */ 87#define VHUB_USBSTS_HISPEED (1 << 27) 88 89/* EP toggle */ 90#define VHUB_EP_TOGGLE_VALUE (1 << 8) 91#define VHUB_EP_TOGGLE_SET_EPNUM(x) ((x) & 0x1f) 92 93/* HUB EP0 control */ 94#define VHUB_EP0_CTRL_STALL (1 << 0) 95#define VHUB_EP0_TX_BUFF_RDY (1 << 1) 96#define VHUB_EP0_RX_BUFF_RDY (1 << 2) 97#define VHUB_EP0_RX_LEN(x) (((x) >> 16) & 0x7f) 98#define VHUB_EP0_SET_TX_LEN(x) (((x) & 0x7f) << 8) 99 100/* HUB EP1 control */ 101#define VHUB_EP1_CTRL_RESET_TOGGLE (1 << 2) 102#define VHUB_EP1_CTRL_STALL (1 << 1) 103#define VHUB_EP1_CTRL_ENABLE (1 << 0) 104 105/*********************************** 106 * * 107 * per-device register definitions * 108 * * 109 ***********************************/ 110#define AST_VHUB_DEV_EN_CTRL 0x00 111#define AST_VHUB_DEV_ISR 0x04 112#define AST_VHUB_DEV_EP0_CTRL 0x08 113#define AST_VHUB_DEV_EP0_DATA 0x0c 114 115/* Device enable control */ 116#define VHUB_DEV_EN_SET_ADDR(x) ((x) << 8) 117#define VHUB_DEV_EN_ADDR_MASK ((0xff) << 8) 118#define VHUB_DEV_EN_EP0_NAK_IRQEN (1 << 6) 119#define VHUB_DEV_EN_EP0_IN_ACK_IRQEN (1 << 5) 120#define VHUB_DEV_EN_EP0_OUT_NAK_IRQEN (1 << 4) 121#define VHUB_DEV_EN_EP0_OUT_ACK_IRQEN (1 << 3) 122#define VHUB_DEV_EN_EP0_SETUP_IRQEN (1 << 2) 123#define VHUB_DEV_EN_SPEED_SEL_HIGH (1 << 1) 124#define VHUB_DEV_EN_ENABLE_PORT (1 << 0) 125 126/* Interrupt status */ 127#define VHUV_DEV_IRQ_EP0_IN_DATA_NACK (1 << 4) 128#define VHUV_DEV_IRQ_EP0_IN_ACK_STALL (1 << 3) 129#define VHUV_DEV_IRQ_EP0_OUT_DATA_NACK (1 << 2) 130#define VHUV_DEV_IRQ_EP0_OUT_ACK_STALL (1 << 1) 131#define VHUV_DEV_IRQ_EP0_SETUP (1 << 0) 132 133/* Control bits. 134 * 135 * Note: The driver relies on the bulk of those bits 136 * matching corresponding vHub EP0 control bits 137 */ 138#define VHUB_DEV_EP0_CTRL_STALL VHUB_EP0_CTRL_STALL 139#define VHUB_DEV_EP0_TX_BUFF_RDY VHUB_EP0_TX_BUFF_RDY 140#define VHUB_DEV_EP0_RX_BUFF_RDY VHUB_EP0_RX_BUFF_RDY 141#define VHUB_DEV_EP0_RX_LEN(x) VHUB_EP0_RX_LEN(x) 142#define VHUB_DEV_EP0_SET_TX_LEN(x) VHUB_EP0_SET_TX_LEN(x) 143 144/************************************* 145 * * 146 * per-endpoint register definitions * 147 * * 148 *************************************/ 149 150#define AST_VHUB_EP_CONFIG 0x00 151#define AST_VHUB_EP_DMA_CTLSTAT 0x04 152#define AST_VHUB_EP_DESC_BASE 0x08 153#define AST_VHUB_EP_DESC_STATUS 0x0C 154 155/* EP config reg */ 156#define VHUB_EP_CFG_SET_MAX_PKT(x) (((x) & 0x3ff) << 16) 157#define VHUB_EP_CFG_AUTO_DATA_DISABLE (1 << 13) 158#define VHUB_EP_CFG_STALL_CTRL (1 << 12) 159#define VHUB_EP_CFG_SET_EP_NUM(x) (((x) & 0xf) << 8) 160#define VHUB_EP_CFG_SET_TYPE(x) ((x) << 5) 161#define EP_TYPE_OFF 0 162#define EP_TYPE_BULK 1 163#define EP_TYPE_INT 2 164#define EP_TYPE_ISO 3 165#define VHUB_EP_CFG_DIR_OUT (1 << 4) 166#define VHUB_EP_CFG_SET_DEV(x) ((x) << 1) 167#define VHUB_EP_CFG_ENABLE (1 << 0) 168 169/* EP DMA control */ 170#define VHUB_EP_DMA_PROC_STATUS(x) (((x) >> 4) & 0xf) 171#define EP_DMA_PROC_RX_IDLE 0 172#define EP_DMA_PROC_TX_IDLE 8 173#define VHUB_EP_DMA_IN_LONG_MODE (1 << 3) 174#define VHUB_EP_DMA_OUT_CONTIG_MODE (1 << 3) 175#define VHUB_EP_DMA_CTRL_RESET (1 << 2) 176#define VHUB_EP_DMA_SINGLE_STAGE (1 << 1) 177#define VHUB_EP_DMA_DESC_MODE (1 << 0) 178 179/* EP DMA status */ 180#define VHUB_EP_DMA_SET_TX_SIZE(x) ((x) << 16) 181#define VHUB_EP_DMA_TX_SIZE(x) (((x) >> 16) & 0x7ff) 182#define VHUB_EP_DMA_RPTR(x) (((x) >> 8) & 0xff) 183#define VHUB_EP_DMA_SET_RPTR(x) (((x) & 0xff) << 8) 184#define VHUB_EP_DMA_SET_CPU_WPTR(x) (x) 185#define VHUB_EP_DMA_SINGLE_KICK (1 << 0) /* WPTR = 1 for single mode */ 186 187/******************************* 188 * * 189 * DMA descriptors definitions * 190 * * 191 *******************************/ 192 193/* Desc W1 IN */ 194#define VHUB_DSC1_IN_INTERRUPT (1 << 31) 195#define VHUB_DSC1_IN_SPID_DATA0 (0 << 14) 196#define VHUB_DSC1_IN_SPID_DATA2 (1 << 14) 197#define VHUB_DSC1_IN_SPID_DATA1 (2 << 14) 198#define VHUB_DSC1_IN_SPID_MDATA (3 << 14) 199#define VHUB_DSC1_IN_SET_LEN(x) ((x) & 0xfff) 200#define VHUB_DSC1_IN_LEN(x) ((x) & 0xfff) 201 202/**************************************** 203 * * 204 * Data structures and misc definitions * 205 * * 206 ****************************************/ 207 208/* 209 * AST_VHUB_NUM_GEN_EPs and AST_VHUB_NUM_PORTS are kept to avoid breaking 210 * existing AST2400/AST2500 platforms. AST2600 and future vhub revisions 211 * should define number of downstream ports and endpoints in device tree. 212 */ 213#define AST_VHUB_NUM_GEN_EPs 15 /* Generic non-0 EPs */ 214#define AST_VHUB_NUM_PORTS 5 /* vHub ports */ 215#define AST_VHUB_EP0_MAX_PACKET 64 /* EP0's max packet size */ 216#define AST_VHUB_EPn_MAX_PACKET 1024 /* Generic EPs max packet size */ 217#define AST_VHUB_DESCS_COUNT 256 /* Use 256 descriptor mode (valid 218 * values are 256 and 32) 219 */ 220 221struct ast_vhub; 222struct ast_vhub_dev; 223 224/* 225 * DMA descriptor (generic EPs only, currently only used 226 * for IN endpoints 227 */ 228struct ast_vhub_desc { 229 __le32 w0; 230 __le32 w1; 231}; 232 233/* A transfer request, either core-originated or internal */ 234struct ast_vhub_req { 235 struct usb_request req; 236 struct list_head queue; 237 238 /* Actual count written to descriptors (desc mode only) */ 239 unsigned int act_count; 240 241 /* 242 * Desc number of the final packet or -1. For non-desc 243 * mode (or ep0), any >= 0 value means "last packet" 244 */ 245 int last_desc; 246 247 /* Request active (pending DMAs) */ 248 bool active : 1; 249 250 /* Internal request (don't call back core) */ 251 bool internal : 1; 252}; 253#define to_ast_req(__ureq) container_of(__ureq, struct ast_vhub_req, req) 254 255/* Current state of an EP0 */ 256enum ep0_state { 257 ep0_state_token, 258 ep0_state_data, 259 ep0_state_status, 260 ep0_state_stall, 261}; 262 263/* 264 * An endpoint, either generic, ep0, actual gadget EP 265 * or internal use vhub EP0. vhub EP1 doesn't have an 266 * associated structure as it's mostly HW managed. 267 */ 268struct ast_vhub_ep { 269 struct usb_ep ep; 270 271 /* Request queue */ 272 struct list_head queue; 273 274 /* EP index in the device, 0 means this is an EP0 */ 275 unsigned int d_idx; 276 277 /* Dev pointer or NULL for vHub EP0 */ 278 struct ast_vhub_dev *dev; 279 280 /* vHub itself */ 281 struct ast_vhub *vhub; 282 283 /* 284 * DMA buffer for EP0, fallback DMA buffer for misaligned 285 * OUT transfers for generic EPs 286 */ 287 void *buf; 288 dma_addr_t buf_dma; 289 290 /* The rest depends on the EP type */ 291 union { 292 /* EP0 (either device or vhub) */ 293 struct { 294 /* 295 * EP0 registers are "similar" for 296 * vHub and devices but located in 297 * different places. 298 */ 299 void __iomem *ctlstat; 300 void __iomem *setup; 301 302 /* Current state & direction */ 303 enum ep0_state state; 304 bool dir_in; 305 306 /* Internal use request */ 307 struct ast_vhub_req req; 308 } ep0; 309 310 /* Generic endpoint (aka EPn) */ 311 struct { 312 /* Registers */ 313 void __iomem *regs; 314 315 /* Index in global pool (zero-based) */ 316 unsigned int g_idx; 317 318 /* DMA Descriptors */ 319 struct ast_vhub_desc *descs; 320 dma_addr_t descs_dma; 321 unsigned int d_next; 322 unsigned int d_last; 323 unsigned int dma_conf; 324 325 /* Max chunk size for IN EPs */ 326 unsigned int chunk_max; 327 328 /* State flags */ 329 bool is_in : 1; 330 bool is_iso : 1; 331 bool stalled : 1; 332 bool wedged : 1; 333 bool enabled : 1; 334 bool desc_mode : 1; 335 } epn; 336 }; 337}; 338#define to_ast_ep(__uep) container_of(__uep, struct ast_vhub_ep, ep) 339 340/* A device attached to a vHub port */ 341struct ast_vhub_dev { 342 struct ast_vhub *vhub; 343 void __iomem *regs; 344 345 /* Device index (zero-based) and name string */ 346 unsigned int index; 347 const char *name; 348 349 /* sysfs enclosure for the gadget gunk */ 350 struct device *port_dev; 351 352 /* Link to gadget core */ 353 struct usb_gadget gadget; 354 struct usb_gadget_driver *driver; 355 bool registered : 1; 356 bool wakeup_en : 1; 357 bool enabled : 1; 358 359 /* Endpoint structures */ 360 struct ast_vhub_ep ep0; 361 struct ast_vhub_ep **epns; 362 u32 max_epns; 363 364}; 365#define to_ast_dev(__g) container_of(__g, struct ast_vhub_dev, gadget) 366 367/* Per vhub port stateinfo structure */ 368struct ast_vhub_port { 369 /* Port status & status change registers */ 370 u16 status; 371 u16 change; 372 373 /* Associated device slot */ 374 struct ast_vhub_dev dev; 375}; 376 377struct ast_vhub_full_cdesc { 378 struct usb_config_descriptor cfg; 379 struct usb_interface_descriptor intf; 380 struct usb_endpoint_descriptor ep; 381} __packed; 382 383/* Global vhub structure */ 384struct ast_vhub { 385 struct platform_device *pdev; 386 void __iomem *regs; 387 int irq; 388 spinlock_t lock; 389 struct work_struct wake_work; 390 struct clk *clk; 391 392 /* EP0 DMA buffers allocated in one chunk */ 393 void *ep0_bufs; 394 dma_addr_t ep0_bufs_dma; 395 396 /* EP0 of the vhub itself */ 397 struct ast_vhub_ep ep0; 398 399 /* State of vhub ep1 */ 400 bool ep1_stalled : 1; 401 402 /* Per-port info */ 403 struct ast_vhub_port *ports; 404 u32 max_ports; 405 u32 port_irq_mask; 406 407 /* Generic EP data structures */ 408 struct ast_vhub_ep *epns; 409 u32 max_epns; 410 411 /* Upstream bus is suspended ? */ 412 bool suspended : 1; 413 414 /* Hub itself can signal remote wakeup */ 415 bool wakeup_en : 1; 416 417 /* Force full speed only */ 418 bool force_usb1 : 1; 419 420 /* Upstream bus speed captured at bus reset */ 421 unsigned int speed; 422 423 /* Standard USB Descriptors of the vhub. */ 424 struct usb_device_descriptor vhub_dev_desc; 425 struct ast_vhub_full_cdesc vhub_conf_desc; 426 struct usb_hub_descriptor vhub_hub_desc; 427 struct list_head vhub_str_desc; 428 struct usb_qualifier_descriptor vhub_qual_desc; 429}; 430 431/* Standard request handlers result codes */ 432enum std_req_rc { 433 std_req_stall = -1, /* Stall requested */ 434 std_req_complete = 0, /* Request completed with no data */ 435 std_req_data = 1, /* Request completed with data */ 436 std_req_driver = 2, /* Pass to driver pls */ 437}; 438 439#ifdef CONFIG_USB_GADGET_VERBOSE 440#define UDCVDBG(u, fmt...) dev_dbg(&(u)->pdev->dev, fmt) 441 442#define EPVDBG(ep, fmt, ...) do { \ 443 dev_dbg(&(ep)->vhub->pdev->dev, \ 444 "%s:EP%d " fmt, \ 445 (ep)->dev ? (ep)->dev->name : "hub", \ 446 (ep)->d_idx, ##__VA_ARGS__); \ 447 } while(0) 448 449#define DVDBG(d, fmt, ...) do { \ 450 dev_dbg(&(d)->vhub->pdev->dev, \ 451 "%s " fmt, (d)->name, \ 452 ##__VA_ARGS__); \ 453 } while(0) 454 455#else 456#define UDCVDBG(u, fmt...) do { } while(0) 457#define EPVDBG(ep, fmt, ...) do { } while(0) 458#define DVDBG(d, fmt, ...) do { } while(0) 459#endif 460 461#ifdef CONFIG_USB_GADGET_DEBUG 462#define UDCDBG(u, fmt...) dev_dbg(&(u)->pdev->dev, fmt) 463 464#define EPDBG(ep, fmt, ...) do { \ 465 dev_dbg(&(ep)->vhub->pdev->dev, \ 466 "%s:EP%d " fmt, \ 467 (ep)->dev ? (ep)->dev->name : "hub", \ 468 (ep)->d_idx, ##__VA_ARGS__); \ 469 } while(0) 470 471#define DDBG(d, fmt, ...) do { \ 472 dev_dbg(&(d)->vhub->pdev->dev, \ 473 "%s " fmt, (d)->name, \ 474 ##__VA_ARGS__); \ 475 } while(0) 476#else 477#define UDCDBG(u, fmt...) do { } while(0) 478#define EPDBG(ep, fmt, ...) do { } while(0) 479#define DDBG(d, fmt, ...) do { } while(0) 480#endif 481 482static inline void vhub_dma_workaround(void *addr) 483{ 484 /* 485 * This works around a confirmed HW issue with the Aspeed chip. 486 * 487 * The core uses a different bus to memory than the AHB going to 488 * the USB device controller. Due to the latter having a higher 489 * priority than the core for arbitration on that bus, it's 490 * possible for an MMIO to the device, followed by a DMA by the 491 * device from memory to all be performed and services before 492 * a previous store to memory gets completed. 493 * 494 * This the following scenario can happen: 495 * 496 * - Driver writes to a DMA descriptor (Mbus) 497 * - Driver writes to the MMIO register to start the DMA (AHB) 498 * - The gadget sees the second write and sends a read of the 499 * descriptor to the memory controller (Mbus) 500 * - The gadget hits memory before the descriptor write 501 * causing it to read an obsolete value. 502 * 503 * Thankfully the problem is limited to the USB gadget device, other 504 * masters in the SoC all have a lower priority than the core, thus 505 * ensuring that the store by the core arrives first. 506 * 507 * The workaround consists of using a dummy read of the memory before 508 * doing the MMIO writes. This will ensure that the previous writes 509 * have been "pushed out". 510 */ 511 mb(); 512 (void)__raw_readl((void __iomem *)addr); 513} 514 515/* core.c */ 516void ast_vhub_done(struct ast_vhub_ep *ep, struct ast_vhub_req *req, 517 int status); 518void ast_vhub_nuke(struct ast_vhub_ep *ep, int status); 519struct usb_request *ast_vhub_alloc_request(struct usb_ep *u_ep, 520 gfp_t gfp_flags); 521void ast_vhub_free_request(struct usb_ep *u_ep, struct usb_request *u_req); 522void ast_vhub_init_hw(struct ast_vhub *vhub); 523 524/* ep0.c */ 525void ast_vhub_ep0_handle_ack(struct ast_vhub_ep *ep, bool in_ack); 526void ast_vhub_ep0_handle_setup(struct ast_vhub_ep *ep); 527void ast_vhub_reset_ep0(struct ast_vhub_dev *dev); 528void ast_vhub_init_ep0(struct ast_vhub *vhub, struct ast_vhub_ep *ep, 529 struct ast_vhub_dev *dev); 530int ast_vhub_reply(struct ast_vhub_ep *ep, char *ptr, int len); 531int __ast_vhub_simple_reply(struct ast_vhub_ep *ep, int len, ...); 532#define ast_vhub_simple_reply(udc, ...) \ 533 __ast_vhub_simple_reply((udc), \ 534 sizeof((u8[]) { __VA_ARGS__ })/sizeof(u8), \ 535 __VA_ARGS__) 536 537/* hub.c */ 538int ast_vhub_init_hub(struct ast_vhub *vhub); 539enum std_req_rc ast_vhub_std_hub_request(struct ast_vhub_ep *ep, 540 struct usb_ctrlrequest *crq); 541enum std_req_rc ast_vhub_class_hub_request(struct ast_vhub_ep *ep, 542 struct usb_ctrlrequest *crq); 543void ast_vhub_device_connect(struct ast_vhub *vhub, unsigned int port, 544 bool on); 545void ast_vhub_hub_suspend(struct ast_vhub *vhub); 546void ast_vhub_hub_resume(struct ast_vhub *vhub); 547void ast_vhub_hub_reset(struct ast_vhub *vhub); 548void ast_vhub_hub_wake_all(struct ast_vhub *vhub); 549 550/* dev.c */ 551int ast_vhub_init_dev(struct ast_vhub *vhub, unsigned int idx); 552void ast_vhub_del_dev(struct ast_vhub_dev *d); 553void ast_vhub_dev_irq(struct ast_vhub_dev *d); 554int ast_vhub_std_dev_request(struct ast_vhub_ep *ep, 555 struct usb_ctrlrequest *crq); 556 557/* epn.c */ 558void ast_vhub_epn_ack_irq(struct ast_vhub_ep *ep); 559void ast_vhub_update_epn_stall(struct ast_vhub_ep *ep); 560struct ast_vhub_ep *ast_vhub_alloc_epn(struct ast_vhub_dev *d, u8 addr); 561void ast_vhub_dev_suspend(struct ast_vhub_dev *d); 562void ast_vhub_dev_resume(struct ast_vhub_dev *d); 563void ast_vhub_dev_reset(struct ast_vhub_dev *d); 564 565#endif /* __ASPEED_VHUB_H */