Lines Matching refs:vhub
3 * aspeed-vhub -- Driver for Aspeed SoC "vHub" USB gadget
32 #include "vhub.h"
186 if (ep->vhub->wakeup_en)
203 if (ep->vhub->ep1_stalled)
221 ep->vhub->wakeup_en = is_set;
228 val = readl(ep->vhub->regs + AST_VHUB_CTRL);
231 writel(val, ep->vhub->regs + AST_VHUB_CTRL);
260 ep->vhub->ep1_stalled = is_set;
261 reg = readl(ep->vhub->regs + AST_VHUB_EP1_CTRL);
268 writel(reg, ep->vhub->regs + AST_VHUB_EP1_CTRL);
277 struct ast_vhub *vhub = ep->vhub;
293 memcpy(ep->buf, &vhub->vhub_dev_desc, dsize);
294 BUILD_BUG_ON(dsize > sizeof(vhub->vhub_dev_desc));
300 memcpy(ep->buf, &vhub->vhub_conf_desc, dsize);
302 BUILD_BUG_ON(dsize > sizeof(vhub->vhub_conf_desc));
307 memcpy(ep->buf, &vhub->vhub_hub_desc, dsize);
308 BUILD_BUG_ON(dsize > sizeof(vhub->vhub_hub_desc));
312 dsize = sizeof(vhub->vhub_qual_desc);
313 memcpy(ep->buf, &vhub->vhub_qual_desc, dsize);
333 static int ast_vhub_collect_languages(struct ast_vhub *vhub, void *buf,
344 list_for_each_entry(container, &vhub->vhub_str_desc, list) {
359 static struct usb_gadget_strings *ast_vhub_lookup_string(struct ast_vhub *vhub,
365 list_for_each_entry(container, &vhub->vhub_str_desc, list) {
380 struct ast_vhub *vhub = ep->vhub;
384 rc = ast_vhub_collect_languages(vhub, buf, sizeof(buf));
386 lang_str = ast_vhub_lookup_string(vhub, lang_id);
404 struct ast_vhub *vhub = ep->vhub;
412 if (vhub->speed == USB_SPEED_UNKNOWN) {
413 u32 ustat = readl(vhub->regs + AST_VHUB_USBSTS);
415 vhub->speed = USB_SPEED_HIGH;
417 vhub->speed = USB_SPEED_FULL;
418 UDCDBG(vhub, "USB status=%08x speed=%s\n", ustat,
419 vhub->speed == USB_SPEED_HIGH ? "high" : "full");
426 writel(wValue, vhub->regs + AST_VHUB_CONF);
481 static void ast_vhub_update_hub_ep1(struct ast_vhub *vhub,
485 u32 reg = readl(vhub->regs + AST_VHUB_EP1_STS_CHG);
487 if (vhub->ports[port].change)
491 writel(reg, vhub->regs + AST_VHUB_EP1_STS_CHG);
494 static void ast_vhub_change_port_stat(struct ast_vhub *vhub,
500 struct ast_vhub_port *p = &vhub->ports[port];
529 ast_vhub_update_hub_ep1(vhub, port);
533 static void ast_vhub_send_host_wakeup(struct ast_vhub *vhub)
535 u32 reg = readl(vhub->regs + AST_VHUB_CTRL);
536 UDCDBG(vhub, "Waking up host !\n");
538 writel(reg, vhub->regs + AST_VHUB_CTRL);
541 void ast_vhub_device_connect(struct ast_vhub *vhub,
545 ast_vhub_change_port_stat(vhub, port, 0,
548 ast_vhub_change_port_stat(vhub, port,
557 if (vhub->wakeup_en)
558 ast_vhub_send_host_wakeup(vhub);
563 struct ast_vhub *vhub = container_of(work,
574 spin_lock_irqsave(&vhub->lock, flags);
575 for (i = 0; i < vhub->max_ports; i++) {
576 struct ast_vhub_port *p = &vhub->ports[i];
580 ast_vhub_change_port_stat(vhub, i,
585 ast_vhub_send_host_wakeup(vhub);
586 spin_unlock_irqrestore(&vhub->lock, flags);
589 void ast_vhub_hub_wake_all(struct ast_vhub *vhub)
596 schedule_work(&vhub->wake_work);
599 static void ast_vhub_port_reset(struct ast_vhub *vhub, u8 port)
601 struct ast_vhub_port *p = &vhub->ports[port];
605 ast_vhub_change_port_stat(vhub, port,
622 if (speed == USB_SPEED_UNKNOWN || speed > vhub->speed)
623 speed = vhub->speed;
640 UDCDBG(vhub, "Unsupported speed %d when"
649 ast_vhub_change_port_stat(vhub, port, clr, set, true);
655 struct ast_vhub *vhub = ep->vhub;
658 if (port == 0 || port > vhub->max_ports)
661 p = &vhub->ports[port];
667 ast_vhub_change_port_stat(vhub, port,
674 ast_vhub_port_reset(vhub, port);
684 ast_vhub_update_hub_ep1(vhub, port);
698 struct ast_vhub *vhub = ep->vhub;
701 if (port == 0 || port > vhub->max_ports)
704 p = &vhub->ports[port];
708 ast_vhub_change_port_stat(vhub, port,
717 ast_vhub_change_port_stat(vhub, port,
735 ast_vhub_update_hub_ep1(vhub, port);
744 struct ast_vhub *vhub = ep->vhub;
747 if (port == 0 || port > vhub->max_ports)
751 stat = vhub->ports[port].status;
752 chg = vhub->ports[port].change;
813 void ast_vhub_hub_suspend(struct ast_vhub *vhub)
817 UDCDBG(vhub, "USB bus suspend\n");
819 if (vhub->suspended)
822 vhub->suspended = true;
828 for (i = 0; i < vhub->max_ports; i++) {
829 struct ast_vhub_port *p = &vhub->ports[i];
836 void ast_vhub_hub_resume(struct ast_vhub *vhub)
840 UDCDBG(vhub, "USB bus resume\n");
842 if (!vhub->suspended)
845 vhub->suspended = false;
851 for (i = 0; i < vhub->max_ports; i++) {
852 struct ast_vhub_port *p = &vhub->ports[i];
859 void ast_vhub_hub_reset(struct ast_vhub *vhub)
863 UDCDBG(vhub, "USB bus reset\n");
869 if (vhub->speed == USB_SPEED_UNKNOWN)
873 vhub->suspended = false;
876 vhub->speed = USB_SPEED_UNKNOWN;
879 vhub->wakeup_en = false;
885 for (i = 0; i < vhub->max_ports; i++) {
886 struct ast_vhub_port *p = &vhub->ports[i];
897 writel(0, vhub->regs + AST_VHUB_CONF);
898 writel(0, vhub->regs + AST_VHUB_EP0_CTRL);
901 vhub->regs + AST_VHUB_EP1_CTRL);
902 writel(0, vhub->regs + AST_VHUB_EP1_STS_CHG);
905 static void ast_vhub_of_parse_dev_desc(struct ast_vhub *vhub,
911 if (!of_property_read_u32(vhub_np, "vhub-vendor-id", &data)) {
913 vhub->vhub_dev_desc.idVendor = cpu_to_le16(id);
915 if (!of_property_read_u32(vhub_np, "vhub-product-id", &data)) {
917 vhub->vhub_dev_desc.idProduct = cpu_to_le16(id);
919 if (!of_property_read_u32(vhub_np, "vhub-device-revision", &data)) {
921 vhub->vhub_dev_desc.bcdDevice = cpu_to_le16(id);
925 static void ast_vhub_fixup_usb1_dev_desc(struct ast_vhub *vhub)
927 vhub->vhub_dev_desc.bcdUSB = cpu_to_le16(0x0100);
928 vhub->vhub_dev_desc.bDeviceProtocol = 0;
932 ast_vhub_str_container_alloc(struct ast_vhub *vhub)
942 container = devm_kzalloc(&vhub->pdev->dev, size, GFP_KERNEL);
968 static int ast_vhub_str_alloc_add(struct ast_vhub *vhub,
974 container = ast_vhub_str_container_alloc(vhub);
980 list_add_tail(&container->list, &vhub->vhub_str_desc);
995 static int ast_vhub_of_parse_str_desc(struct ast_vhub *vhub,
1027 ret = ast_vhub_str_alloc_add(vhub, &lang_str);
1037 static int ast_vhub_init_desc(struct ast_vhub *vhub)
1041 const struct device_node *vhub_np = vhub->pdev->dev.of_node;
1043 /* Initialize vhub Device Descriptor. */
1044 memcpy(&vhub->vhub_dev_desc, &ast_vhub_dev_desc,
1045 sizeof(vhub->vhub_dev_desc));
1046 ast_vhub_of_parse_dev_desc(vhub, vhub_np);
1047 if (vhub->force_usb1)
1048 ast_vhub_fixup_usb1_dev_desc(vhub);
1050 /* Initialize vhub Configuration Descriptor. */
1051 memcpy(&vhub->vhub_conf_desc, &ast_vhub_conf_desc,
1052 sizeof(vhub->vhub_conf_desc));
1054 /* Initialize vhub Hub Descriptor. */
1055 memcpy(&vhub->vhub_hub_desc, &ast_vhub_hub_desc,
1056 sizeof(vhub->vhub_hub_desc));
1057 vhub->vhub_hub_desc.bNbrPorts = vhub->max_ports;
1059 /* Initialize vhub String Descriptors. */
1060 INIT_LIST_HEAD(&vhub->vhub_str_desc);
1061 desc_np = of_get_child_by_name(vhub_np, "vhub-strings");
1063 ret = ast_vhub_of_parse_str_desc(vhub, desc_np);
1067 ret = ast_vhub_str_alloc_add(vhub, &ast_vhub_strings);
1069 /* Initialize vhub Qualifier Descriptor. */
1070 memcpy(&vhub->vhub_qual_desc, &ast_vhub_qual_desc,
1071 sizeof(vhub->vhub_qual_desc));
1076 int ast_vhub_init_hub(struct ast_vhub *vhub)
1078 vhub->speed = USB_SPEED_UNKNOWN;
1079 INIT_WORK(&vhub->wake_work, ast_vhub_wake_work);
1081 return ast_vhub_init_desc(vhub);