Lines Matching refs:d

37 void ast_vhub_dev_irq(struct ast_vhub_dev *d)  in ast_vhub_dev_irq()  argument
39 u32 istat = readl(d->regs + AST_VHUB_DEV_ISR); in ast_vhub_dev_irq()
41 writel(istat, d->regs + AST_VHUB_DEV_ISR); in ast_vhub_dev_irq()
44 ast_vhub_ep0_handle_ack(&d->ep0, true); in ast_vhub_dev_irq()
46 ast_vhub_ep0_handle_ack(&d->ep0, false); in ast_vhub_dev_irq()
48 ast_vhub_ep0_handle_setup(&d->ep0); in ast_vhub_dev_irq()
51 static void ast_vhub_dev_enable(struct ast_vhub_dev *d) in ast_vhub_dev_enable() argument
55 if (d->enabled) in ast_vhub_dev_enable()
63 if (d->gadget.speed == USB_SPEED_HIGH) in ast_vhub_dev_enable()
65 writel(reg, d->regs + AST_VHUB_DEV_EN_CTRL); in ast_vhub_dev_enable()
68 hmsk = VHUB_IRQ_DEVICE1 << d->index; in ast_vhub_dev_enable()
69 reg = readl(d->vhub->regs + AST_VHUB_IER); in ast_vhub_dev_enable()
71 writel(reg, d->vhub->regs + AST_VHUB_IER); in ast_vhub_dev_enable()
74 writel(d->ep0.buf_dma, d->regs + AST_VHUB_DEV_EP0_DATA); in ast_vhub_dev_enable()
76 d->enabled = true; in ast_vhub_dev_enable()
79 static void ast_vhub_dev_disable(struct ast_vhub_dev *d) in ast_vhub_dev_disable() argument
83 if (!d->enabled) in ast_vhub_dev_disable()
87 hmsk = VHUB_IRQ_DEVICE1 << d->index; in ast_vhub_dev_disable()
88 reg = readl(d->vhub->regs + AST_VHUB_IER); in ast_vhub_dev_disable()
90 writel(reg, d->vhub->regs + AST_VHUB_IER); in ast_vhub_dev_disable()
93 writel(0, d->regs + AST_VHUB_DEV_EN_CTRL); in ast_vhub_dev_disable()
94 d->gadget.speed = USB_SPEED_UNKNOWN; in ast_vhub_dev_disable()
95 d->enabled = false; in ast_vhub_dev_disable()
96 d->suspended = false; in ast_vhub_dev_disable()
99 static int ast_vhub_dev_feature(struct ast_vhub_dev *d, in ast_vhub_dev_feature() argument
103 DDBG(d, "%s_FEATURE(dev val=%02x)\n", in ast_vhub_dev_feature()
109 d->wakeup_en = is_set; in ast_vhub_dev_feature()
114 static int ast_vhub_ep_feature(struct ast_vhub_dev *d, in ast_vhub_ep_feature() argument
121 DDBG(d, "%s_FEATURE(ep%d val=%02x)\n", in ast_vhub_ep_feature()
125 if (ep_num >= AST_VHUB_NUM_GEN_EPs || !d->epns[ep_num - 1]) in ast_vhub_ep_feature()
130 ep = d->epns[ep_num - 1]; in ast_vhub_ep_feature()
138 DDBG(d, "%s stall on EP %d\n", in ast_vhub_ep_feature()
146 static int ast_vhub_dev_status(struct ast_vhub_dev *d, in ast_vhub_dev_status() argument
151 DDBG(d, "GET_STATUS(dev)\n"); in ast_vhub_dev_status()
153 st0 = d->gadget.is_selfpowered << USB_DEVICE_SELF_POWERED; in ast_vhub_dev_status()
154 if (d->wakeup_en) in ast_vhub_dev_status()
157 return ast_vhub_simple_reply(&d->ep0, st0, 0); in ast_vhub_dev_status()
160 static int ast_vhub_ep_status(struct ast_vhub_dev *d, in ast_vhub_ep_status() argument
167 DDBG(d, "GET_STATUS(ep%d)\n", ep_num); in ast_vhub_ep_status()
172 ep = d->epns[ep_num - 1]; in ast_vhub_ep_status()
182 return ast_vhub_simple_reply(&d->ep0, st0, 0); in ast_vhub_ep_status()
185 static void ast_vhub_dev_set_address(struct ast_vhub_dev *d, u8 addr) in ast_vhub_dev_set_address() argument
189 DDBG(d, "SET_ADDRESS: Got address %x\n", addr); in ast_vhub_dev_set_address()
191 reg = readl(d->regs + AST_VHUB_DEV_EN_CTRL); in ast_vhub_dev_set_address()
194 writel(reg, d->regs + AST_VHUB_DEV_EN_CTRL); in ast_vhub_dev_set_address()
200 struct ast_vhub_dev *d = ep->dev; in ast_vhub_std_dev_request() local
204 if (!d->driver || !d->enabled || d->suspended) { in ast_vhub_std_dev_request()
208 d->driver, d->enabled, d->suspended); in ast_vhub_std_dev_request()
213 if (d->gadget.speed == USB_SPEED_UNKNOWN) { in ast_vhub_std_dev_request()
214 d->gadget.speed = ep->vhub->speed; in ast_vhub_std_dev_request()
215 if (d->gadget.speed > d->driver->max_speed) in ast_vhub_std_dev_request()
216 d->gadget.speed = d->driver->max_speed; in ast_vhub_std_dev_request()
217 DDBG(d, "fist packet, captured speed %d\n", in ast_vhub_std_dev_request()
218 d->gadget.speed); in ast_vhub_std_dev_request()
227 ast_vhub_dev_set_address(d, wValue); in ast_vhub_std_dev_request()
232 return ast_vhub_dev_status(d, wIndex, wValue); in ast_vhub_std_dev_request()
236 return ast_vhub_ep_status(d, wIndex, wValue); in ast_vhub_std_dev_request()
240 return ast_vhub_dev_feature(d, wIndex, wValue, true); in ast_vhub_std_dev_request()
242 return ast_vhub_dev_feature(d, wIndex, wValue, false); in ast_vhub_std_dev_request()
244 return ast_vhub_ep_feature(d, wIndex, wValue, true); in ast_vhub_std_dev_request()
246 return ast_vhub_ep_feature(d, wIndex, wValue, false); in ast_vhub_std_dev_request()
253 struct ast_vhub_dev *d = to_ast_dev(gadget); in ast_vhub_udc_wakeup() local
257 spin_lock_irqsave(&d->vhub->lock, flags); in ast_vhub_udc_wakeup()
258 if (!d->wakeup_en) in ast_vhub_udc_wakeup()
261 DDBG(d, "Device initiated wakeup\n"); in ast_vhub_udc_wakeup()
264 ast_vhub_hub_wake_all(d->vhub); in ast_vhub_udc_wakeup()
267 spin_unlock_irqrestore(&d->vhub->lock, flags); in ast_vhub_udc_wakeup()
273 struct ast_vhub_dev *d = to_ast_dev(gadget); in ast_vhub_udc_get_frame() local
275 return (readl(d->vhub->regs + AST_VHUB_USBSTS) >> 16) & 0x7ff; in ast_vhub_udc_get_frame()
278 static void ast_vhub_dev_nuke(struct ast_vhub_dev *d) in ast_vhub_dev_nuke() argument
283 if (!d->epns[i]) in ast_vhub_dev_nuke()
285 ast_vhub_nuke(d->epns[i], -ESHUTDOWN); in ast_vhub_dev_nuke()
291 struct ast_vhub_dev *d = to_ast_dev(gadget); in ast_vhub_udc_pullup() local
294 spin_lock_irqsave(&d->vhub->lock, flags); in ast_vhub_udc_pullup()
296 DDBG(d, "pullup(%d)\n", on); in ast_vhub_udc_pullup()
299 ast_vhub_device_connect(d->vhub, d->index, on); in ast_vhub_udc_pullup()
305 if (d->enabled) { in ast_vhub_udc_pullup()
306 ast_vhub_dev_nuke(d); in ast_vhub_udc_pullup()
307 ast_vhub_dev_disable(d); in ast_vhub_udc_pullup()
310 spin_unlock_irqrestore(&d->vhub->lock, flags); in ast_vhub_udc_pullup()
318 struct ast_vhub_dev *d = to_ast_dev(gadget); in ast_vhub_udc_start() local
321 spin_lock_irqsave(&d->vhub->lock, flags); in ast_vhub_udc_start()
323 DDBG(d, "start\n"); in ast_vhub_udc_start()
326 d->driver = driver; in ast_vhub_udc_start()
327 d->gadget.is_selfpowered = 1; in ast_vhub_udc_start()
329 spin_unlock_irqrestore(&d->vhub->lock, flags); in ast_vhub_udc_start()
338 struct ast_vhub_dev *d = to_ast_dev(gadget); in ast_vhub_udc_match_ep() local
343 DDBG(d, "Match EP type %d\n", usb_endpoint_type(desc)); in ast_vhub_udc_match_ep()
353 DDBG(d, " -> using existing EP%d\n", in ast_vhub_udc_match_ep()
400 if (d->epns[i] == NULL) in ast_vhub_udc_match_ep()
410 ep = ast_vhub_alloc_epn(d, addr); in ast_vhub_udc_match_ep()
413 DDBG(d, "Allocated epn#%d for port EP%d\n", in ast_vhub_udc_match_ep()
421 struct ast_vhub_dev *d = to_ast_dev(gadget); in ast_vhub_udc_stop() local
424 spin_lock_irqsave(&d->vhub->lock, flags); in ast_vhub_udc_stop()
426 DDBG(d, "stop\n"); in ast_vhub_udc_stop()
428 d->driver = NULL; in ast_vhub_udc_stop()
429 d->gadget.speed = USB_SPEED_UNKNOWN; in ast_vhub_udc_stop()
431 ast_vhub_dev_nuke(d); in ast_vhub_udc_stop()
433 if (d->enabled) in ast_vhub_udc_stop()
434 ast_vhub_dev_disable(d); in ast_vhub_udc_stop()
436 spin_unlock_irqrestore(&d->vhub->lock, flags); in ast_vhub_udc_stop()
450 void ast_vhub_dev_suspend(struct ast_vhub_dev *d) in ast_vhub_dev_suspend() argument
452 d->suspended = true; in ast_vhub_dev_suspend()
453 if (d->driver) { in ast_vhub_dev_suspend()
454 spin_unlock(&d->vhub->lock); in ast_vhub_dev_suspend()
455 d->driver->suspend(&d->gadget); in ast_vhub_dev_suspend()
456 spin_lock(&d->vhub->lock); in ast_vhub_dev_suspend()
460 void ast_vhub_dev_resume(struct ast_vhub_dev *d) in ast_vhub_dev_resume() argument
462 d->suspended = false; in ast_vhub_dev_resume()
463 if (d->driver) { in ast_vhub_dev_resume()
464 spin_unlock(&d->vhub->lock); in ast_vhub_dev_resume()
465 d->driver->resume(&d->gadget); in ast_vhub_dev_resume()
466 spin_lock(&d->vhub->lock); in ast_vhub_dev_resume()
470 void ast_vhub_dev_reset(struct ast_vhub_dev *d) in ast_vhub_dev_reset() argument
479 if (d->gadget.speed == USB_SPEED_UNKNOWN && !d->enabled) { in ast_vhub_dev_reset()
480 DDBG(d, "Reset at unknown speed of disabled device, enabling...\n"); in ast_vhub_dev_reset()
481 ast_vhub_dev_enable(d); in ast_vhub_dev_reset()
482 d->suspended = false; in ast_vhub_dev_reset()
484 if (d->gadget.speed != USB_SPEED_UNKNOWN && d->driver) { in ast_vhub_dev_reset()
487 DDBG(d, "Reset at known speed of bound device, resetting...\n"); in ast_vhub_dev_reset()
488 spin_unlock(&d->vhub->lock); in ast_vhub_dev_reset()
489 d->driver->reset(&d->gadget); in ast_vhub_dev_reset()
490 spin_lock(&d->vhub->lock); in ast_vhub_dev_reset()
496 ast_vhub_dev_disable(d); in ast_vhub_dev_reset()
497 ast_vhub_dev_enable(d); in ast_vhub_dev_reset()
501 struct ast_vhub_ep *ep = d->epns[i]; in ast_vhub_dev_reset()
510 d->wakeup_en = false; in ast_vhub_dev_reset()
511 d->suspended = false; in ast_vhub_dev_reset()
515 void ast_vhub_del_dev(struct ast_vhub_dev *d) in ast_vhub_del_dev() argument
519 spin_lock_irqsave(&d->vhub->lock, flags); in ast_vhub_del_dev()
520 if (!d->registered) { in ast_vhub_del_dev()
521 spin_unlock_irqrestore(&d->vhub->lock, flags); in ast_vhub_del_dev()
524 d->registered = false; in ast_vhub_del_dev()
525 spin_unlock_irqrestore(&d->vhub->lock, flags); in ast_vhub_del_dev()
527 usb_del_gadget_udc(&d->gadget); in ast_vhub_del_dev()
528 device_unregister(d->port_dev); in ast_vhub_del_dev()
538 struct ast_vhub_dev *d = &vhub->ports[idx].dev; in ast_vhub_init_dev() local
542 d->vhub = vhub; in ast_vhub_init_dev()
543 d->index = idx; in ast_vhub_init_dev()
544 d->name = devm_kasprintf(parent, GFP_KERNEL, "port%d", idx+1); in ast_vhub_init_dev()
545 d->regs = vhub->regs + 0x100 + 0x10 * idx; in ast_vhub_init_dev()
547 ast_vhub_init_ep0(vhub, &d->ep0, d); in ast_vhub_init_dev()
554 d->port_dev = kzalloc(sizeof(struct device), GFP_KERNEL); in ast_vhub_init_dev()
555 if (!d->port_dev) in ast_vhub_init_dev()
557 device_initialize(d->port_dev); in ast_vhub_init_dev()
558 d->port_dev->release = ast_vhub_dev_release; in ast_vhub_init_dev()
559 d->port_dev->parent = parent; in ast_vhub_init_dev()
560 dev_set_name(d->port_dev, "%s:p%d", dev_name(parent), idx + 1); in ast_vhub_init_dev()
561 rc = device_add(d->port_dev); in ast_vhub_init_dev()
566 INIT_LIST_HEAD(&d->gadget.ep_list); in ast_vhub_init_dev()
567 d->gadget.ops = &ast_vhub_udc_ops; in ast_vhub_init_dev()
568 d->gadget.ep0 = &d->ep0.ep; in ast_vhub_init_dev()
569 d->gadget.name = KBUILD_MODNAME; in ast_vhub_init_dev()
571 d->gadget.max_speed = USB_SPEED_FULL; in ast_vhub_init_dev()
573 d->gadget.max_speed = USB_SPEED_HIGH; in ast_vhub_init_dev()
574 d->gadget.speed = USB_SPEED_UNKNOWN; in ast_vhub_init_dev()
575 d->gadget.dev.of_node = vhub->pdev->dev.of_node; in ast_vhub_init_dev()
577 rc = usb_add_gadget_udc(d->port_dev, &d->gadget); in ast_vhub_init_dev()
580 d->registered = true; in ast_vhub_init_dev()
584 device_del(d->port_dev); in ast_vhub_init_dev()
586 put_device(d->port_dev); in ast_vhub_init_dev()