Lines Matching full:vhub
3 * aspeed-vhub -- Driver for Aspeed SoC "vHub" USB gadget
32 #include "vhub.h"
174 if (ep->vhub->wakeup_en) in ast_vhub_hub_dev_status()
191 if (ep->vhub->ep1_stalled) in ast_vhub_hub_ep_status()
209 ep->vhub->wakeup_en = is_set; in ast_vhub_hub_dev_feature()
237 ep->vhub->ep1_stalled = is_set; in ast_vhub_hub_ep_feature()
238 reg = readl(ep->vhub->regs + AST_VHUB_EP1_CTRL); in ast_vhub_hub_ep_feature()
245 writel(reg, ep->vhub->regs + AST_VHUB_EP1_CTRL); in ast_vhub_hub_ep_feature()
254 struct ast_vhub *vhub = ep->vhub; in ast_vhub_rep_desc() local
270 memcpy(ep->buf, &vhub->vhub_dev_desc, dsize); in ast_vhub_rep_desc()
271 BUILD_BUG_ON(dsize > sizeof(vhub->vhub_dev_desc)); in ast_vhub_rep_desc()
276 memcpy(ep->buf, &vhub->vhub_conf_desc, dsize); in ast_vhub_rep_desc()
277 BUILD_BUG_ON(dsize > sizeof(vhub->vhub_conf_desc)); in ast_vhub_rep_desc()
282 memcpy(ep->buf, &vhub->vhub_hub_desc, dsize); in ast_vhub_rep_desc()
283 BUILD_BUG_ON(dsize > sizeof(vhub->vhub_hub_desc)); in ast_vhub_rep_desc()
304 static int ast_vhub_collect_languages(struct ast_vhub *vhub, void *buf, in ast_vhub_collect_languages() argument
315 list_for_each_entry(container, &vhub->vhub_str_desc, list) { in ast_vhub_collect_languages()
330 static struct usb_gadget_strings *ast_vhub_lookup_string(struct ast_vhub *vhub, in ast_vhub_lookup_string() argument
336 list_for_each_entry(container, &vhub->vhub_str_desc, list) { in ast_vhub_lookup_string()
351 struct ast_vhub *vhub = ep->vhub; in ast_vhub_rep_string() local
355 rc = ast_vhub_collect_languages(vhub, buf, sizeof(buf)); in ast_vhub_rep_string()
357 lang_str = ast_vhub_lookup_string(vhub, lang_id); in ast_vhub_rep_string()
375 struct ast_vhub *vhub = ep->vhub; in ast_vhub_std_hub_request() local
383 if (vhub->speed == USB_SPEED_UNKNOWN) { in ast_vhub_std_hub_request()
384 u32 ustat = readl(vhub->regs + AST_VHUB_USBSTS); in ast_vhub_std_hub_request()
386 vhub->speed = USB_SPEED_HIGH; in ast_vhub_std_hub_request()
388 vhub->speed = USB_SPEED_FULL; in ast_vhub_std_hub_request()
389 UDCDBG(vhub, "USB status=%08x speed=%s\n", ustat, in ast_vhub_std_hub_request()
390 vhub->speed == USB_SPEED_HIGH ? "high" : "full"); in ast_vhub_std_hub_request()
397 writel(wValue, vhub->regs + AST_VHUB_CONF); in ast_vhub_std_hub_request()
450 static void ast_vhub_update_hub_ep1(struct ast_vhub *vhub, in ast_vhub_update_hub_ep1() argument
454 u32 reg = readl(vhub->regs + AST_VHUB_EP1_STS_CHG); in ast_vhub_update_hub_ep1()
456 if (vhub->ports[port].change) in ast_vhub_update_hub_ep1()
460 writel(reg, vhub->regs + AST_VHUB_EP1_STS_CHG); in ast_vhub_update_hub_ep1()
463 static void ast_vhub_change_port_stat(struct ast_vhub *vhub, in ast_vhub_change_port_stat() argument
469 struct ast_vhub_port *p = &vhub->ports[port]; in ast_vhub_change_port_stat()
498 ast_vhub_update_hub_ep1(vhub, port); in ast_vhub_change_port_stat()
502 static void ast_vhub_send_host_wakeup(struct ast_vhub *vhub) in ast_vhub_send_host_wakeup() argument
504 u32 reg = readl(vhub->regs + AST_VHUB_CTRL); in ast_vhub_send_host_wakeup()
505 UDCDBG(vhub, "Waking up host !\n"); in ast_vhub_send_host_wakeup()
507 writel(reg, vhub->regs + AST_VHUB_CTRL); in ast_vhub_send_host_wakeup()
510 void ast_vhub_device_connect(struct ast_vhub *vhub, in ast_vhub_device_connect() argument
514 ast_vhub_change_port_stat(vhub, port, 0, in ast_vhub_device_connect()
517 ast_vhub_change_port_stat(vhub, port, in ast_vhub_device_connect()
526 if (vhub->wakeup_en) in ast_vhub_device_connect()
527 ast_vhub_send_host_wakeup(vhub); in ast_vhub_device_connect()
532 struct ast_vhub *vhub = container_of(work, in ast_vhub_wake_work() local
543 spin_lock_irqsave(&vhub->lock, flags); in ast_vhub_wake_work()
544 for (i = 0; i < vhub->max_ports; i++) { in ast_vhub_wake_work()
545 struct ast_vhub_port *p = &vhub->ports[i]; in ast_vhub_wake_work()
549 ast_vhub_change_port_stat(vhub, i, in ast_vhub_wake_work()
554 ast_vhub_send_host_wakeup(vhub); in ast_vhub_wake_work()
555 spin_unlock_irqrestore(&vhub->lock, flags); in ast_vhub_wake_work()
558 void ast_vhub_hub_wake_all(struct ast_vhub *vhub) in ast_vhub_hub_wake_all() argument
565 schedule_work(&vhub->wake_work); in ast_vhub_hub_wake_all()
568 static void ast_vhub_port_reset(struct ast_vhub *vhub, u8 port) in ast_vhub_port_reset() argument
570 struct ast_vhub_port *p = &vhub->ports[port]; in ast_vhub_port_reset()
574 ast_vhub_change_port_stat(vhub, port, in ast_vhub_port_reset()
591 if (speed == USB_SPEED_UNKNOWN || speed > vhub->speed) in ast_vhub_port_reset()
592 speed = vhub->speed; in ast_vhub_port_reset()
609 UDCDBG(vhub, "Unsupported speed %d when" in ast_vhub_port_reset()
618 ast_vhub_change_port_stat(vhub, port, clr, set, true); in ast_vhub_port_reset()
624 struct ast_vhub *vhub = ep->vhub; in ast_vhub_set_port_feature() local
627 if (port == 0 || port > vhub->max_ports) in ast_vhub_set_port_feature()
630 p = &vhub->ports[port]; in ast_vhub_set_port_feature()
636 ast_vhub_change_port_stat(vhub, port, in ast_vhub_set_port_feature()
643 ast_vhub_port_reset(vhub, port); in ast_vhub_set_port_feature()
653 ast_vhub_update_hub_ep1(vhub, port); in ast_vhub_set_port_feature()
667 struct ast_vhub *vhub = ep->vhub; in ast_vhub_clr_port_feature() local
670 if (port == 0 || port > vhub->max_ports) in ast_vhub_clr_port_feature()
673 p = &vhub->ports[port]; in ast_vhub_clr_port_feature()
677 ast_vhub_change_port_stat(vhub, port, in ast_vhub_clr_port_feature()
686 ast_vhub_change_port_stat(vhub, port, in ast_vhub_clr_port_feature()
704 ast_vhub_update_hub_ep1(vhub, port); in ast_vhub_clr_port_feature()
713 struct ast_vhub *vhub = ep->vhub; in ast_vhub_get_port_stat() local
716 if (port == 0 || port > vhub->max_ports) in ast_vhub_get_port_stat()
720 stat = vhub->ports[port].status; in ast_vhub_get_port_stat()
721 chg = vhub->ports[port].change; in ast_vhub_get_port_stat()
782 void ast_vhub_hub_suspend(struct ast_vhub *vhub) in ast_vhub_hub_suspend() argument
786 UDCDBG(vhub, "USB bus suspend\n"); in ast_vhub_hub_suspend()
788 if (vhub->suspended) in ast_vhub_hub_suspend()
791 vhub->suspended = true; in ast_vhub_hub_suspend()
797 for (i = 0; i < vhub->max_ports; i++) { in ast_vhub_hub_suspend()
798 struct ast_vhub_port *p = &vhub->ports[i]; in ast_vhub_hub_suspend()
805 void ast_vhub_hub_resume(struct ast_vhub *vhub) in ast_vhub_hub_resume() argument
809 UDCDBG(vhub, "USB bus resume\n"); in ast_vhub_hub_resume()
811 if (!vhub->suspended) in ast_vhub_hub_resume()
814 vhub->suspended = false; in ast_vhub_hub_resume()
820 for (i = 0; i < vhub->max_ports; i++) { in ast_vhub_hub_resume()
821 struct ast_vhub_port *p = &vhub->ports[i]; in ast_vhub_hub_resume()
828 void ast_vhub_hub_reset(struct ast_vhub *vhub) in ast_vhub_hub_reset() argument
832 UDCDBG(vhub, "USB bus reset\n"); in ast_vhub_hub_reset()
838 if (vhub->speed == USB_SPEED_UNKNOWN) in ast_vhub_hub_reset()
842 vhub->suspended = false; in ast_vhub_hub_reset()
845 vhub->speed = USB_SPEED_UNKNOWN; in ast_vhub_hub_reset()
848 vhub->wakeup_en = false; in ast_vhub_hub_reset()
854 for (i = 0; i < vhub->max_ports; i++) { in ast_vhub_hub_reset()
855 struct ast_vhub_port *p = &vhub->ports[i]; in ast_vhub_hub_reset()
866 writel(0, vhub->regs + AST_VHUB_CONF); in ast_vhub_hub_reset()
867 writel(0, vhub->regs + AST_VHUB_EP0_CTRL); in ast_vhub_hub_reset()
870 vhub->regs + AST_VHUB_EP1_CTRL); in ast_vhub_hub_reset()
871 writel(0, vhub->regs + AST_VHUB_EP1_STS_CHG); in ast_vhub_hub_reset()
874 static void ast_vhub_of_parse_dev_desc(struct ast_vhub *vhub, in ast_vhub_of_parse_dev_desc() argument
880 if (!of_property_read_u32(vhub_np, "vhub-vendor-id", &data)) { in ast_vhub_of_parse_dev_desc()
882 vhub->vhub_dev_desc.idVendor = cpu_to_le16(id); in ast_vhub_of_parse_dev_desc()
884 if (!of_property_read_u32(vhub_np, "vhub-product-id", &data)) { in ast_vhub_of_parse_dev_desc()
886 vhub->vhub_dev_desc.idProduct = cpu_to_le16(id); in ast_vhub_of_parse_dev_desc()
888 if (!of_property_read_u32(vhub_np, "vhub-device-revision", &data)) { in ast_vhub_of_parse_dev_desc()
890 vhub->vhub_dev_desc.bcdDevice = cpu_to_le16(id); in ast_vhub_of_parse_dev_desc()
894 static void ast_vhub_fixup_usb1_dev_desc(struct ast_vhub *vhub) in ast_vhub_fixup_usb1_dev_desc() argument
896 vhub->vhub_dev_desc.bcdUSB = cpu_to_le16(0x0100); in ast_vhub_fixup_usb1_dev_desc()
897 vhub->vhub_dev_desc.bDeviceProtocol = 0; in ast_vhub_fixup_usb1_dev_desc()
901 ast_vhub_str_container_alloc(struct ast_vhub *vhub) in ast_vhub_str_container_alloc() argument
911 container = devm_kzalloc(&vhub->pdev->dev, size, GFP_KERNEL); in ast_vhub_str_container_alloc()
937 static int ast_vhub_str_alloc_add(struct ast_vhub *vhub, in ast_vhub_str_alloc_add() argument
943 container = ast_vhub_str_container_alloc(vhub); in ast_vhub_str_alloc_add()
949 list_add_tail(&container->list, &vhub->vhub_str_desc); in ast_vhub_str_alloc_add()
964 static int ast_vhub_of_parse_str_desc(struct ast_vhub *vhub, in ast_vhub_of_parse_str_desc() argument
996 ret = ast_vhub_str_alloc_add(vhub, &lang_str); in ast_vhub_of_parse_str_desc()
1006 static int ast_vhub_init_desc(struct ast_vhub *vhub) in ast_vhub_init_desc() argument
1010 const struct device_node *vhub_np = vhub->pdev->dev.of_node; in ast_vhub_init_desc()
1012 /* Initialize vhub Device Descriptor. */ in ast_vhub_init_desc()
1013 memcpy(&vhub->vhub_dev_desc, &ast_vhub_dev_desc, in ast_vhub_init_desc()
1014 sizeof(vhub->vhub_dev_desc)); in ast_vhub_init_desc()
1015 ast_vhub_of_parse_dev_desc(vhub, vhub_np); in ast_vhub_init_desc()
1016 if (vhub->force_usb1) in ast_vhub_init_desc()
1017 ast_vhub_fixup_usb1_dev_desc(vhub); in ast_vhub_init_desc()
1019 /* Initialize vhub Configuration Descriptor. */ in ast_vhub_init_desc()
1020 memcpy(&vhub->vhub_conf_desc, &ast_vhub_conf_desc, in ast_vhub_init_desc()
1021 sizeof(vhub->vhub_conf_desc)); in ast_vhub_init_desc()
1023 /* Initialize vhub Hub Descriptor. */ in ast_vhub_init_desc()
1024 memcpy(&vhub->vhub_hub_desc, &ast_vhub_hub_desc, in ast_vhub_init_desc()
1025 sizeof(vhub->vhub_hub_desc)); in ast_vhub_init_desc()
1026 vhub->vhub_hub_desc.bNbrPorts = vhub->max_ports; in ast_vhub_init_desc()
1028 /* Initialize vhub String Descriptors. */ in ast_vhub_init_desc()
1029 INIT_LIST_HEAD(&vhub->vhub_str_desc); in ast_vhub_init_desc()
1030 desc_np = of_get_child_by_name(vhub_np, "vhub-strings"); in ast_vhub_init_desc()
1032 ret = ast_vhub_of_parse_str_desc(vhub, desc_np); in ast_vhub_init_desc()
1034 ret = ast_vhub_str_alloc_add(vhub, &ast_vhub_strings); in ast_vhub_init_desc()
1039 int ast_vhub_init_hub(struct ast_vhub *vhub) in ast_vhub_init_hub() argument
1041 vhub->speed = USB_SPEED_UNKNOWN; in ast_vhub_init_hub()
1042 INIT_WORK(&vhub->wake_work, ast_vhub_wake_work); in ast_vhub_init_hub()
1044 return ast_vhub_init_desc(vhub); in ast_vhub_init_hub()