Lines Matching refs:vhub
3 * aspeed-vhub -- Driver for Aspeed SoC "vHub" USB gadget
37 #include "vhub.h"
179 if (ep->vhub->wakeup_en)
196 if (ep->vhub->ep1_stalled)
214 ep->vhub->wakeup_en = is_set;
242 ep->vhub->ep1_stalled = is_set;
243 reg = readl(ep->vhub->regs + AST_VHUB_EP1_CTRL);
250 writel(reg, ep->vhub->regs + AST_VHUB_EP1_CTRL);
259 struct ast_vhub *vhub = ep->vhub;
275 memcpy(ep->buf, &vhub->vhub_dev_desc, dsize);
276 BUILD_BUG_ON(dsize > sizeof(vhub->vhub_dev_desc));
281 memcpy(ep->buf, &vhub->vhub_conf_desc, dsize);
282 BUILD_BUG_ON(dsize > sizeof(vhub->vhub_conf_desc));
287 memcpy(ep->buf, &vhub->vhub_hub_desc, dsize);
288 BUILD_BUG_ON(dsize > sizeof(vhub->vhub_hub_desc));
309 static int ast_vhub_collect_languages(struct ast_vhub *vhub, void *buf,
320 list_for_each_entry(container, &vhub->vhub_str_desc, list) {
335 static struct usb_gadget_strings *ast_vhub_lookup_string(struct ast_vhub *vhub,
341 list_for_each_entry(container, &vhub->vhub_str_desc, list) {
356 struct ast_vhub *vhub = ep->vhub;
360 rc = ast_vhub_collect_languages(vhub, buf, sizeof(buf));
362 lang_str = ast_vhub_lookup_string(vhub, lang_id);
380 struct ast_vhub *vhub = ep->vhub;
388 if (vhub->speed == USB_SPEED_UNKNOWN) {
389 u32 ustat = readl(vhub->regs + AST_VHUB_USBSTS);
391 vhub->speed = USB_SPEED_HIGH;
393 vhub->speed = USB_SPEED_FULL;
394 UDCDBG(vhub, "USB status=%08x speed=%s\n", ustat,
395 vhub->speed == USB_SPEED_HIGH ? "high" : "full");
402 writel(wValue, vhub->regs + AST_VHUB_CONF);
455 static void ast_vhub_update_hub_ep1(struct ast_vhub *vhub,
459 u32 reg = readl(vhub->regs + AST_VHUB_EP1_STS_CHG);
461 if (vhub->ports[port].change)
465 writel(reg, vhub->regs + AST_VHUB_EP1_STS_CHG);
468 static void ast_vhub_change_port_stat(struct ast_vhub *vhub,
474 struct ast_vhub_port *p = &vhub->ports[port];
503 ast_vhub_update_hub_ep1(vhub, port);
507 static void ast_vhub_send_host_wakeup(struct ast_vhub *vhub)
509 u32 reg = readl(vhub->regs + AST_VHUB_CTRL);
510 UDCDBG(vhub, "Waking up host !\n");
512 writel(reg, vhub->regs + AST_VHUB_CTRL);
515 void ast_vhub_device_connect(struct ast_vhub *vhub,
519 ast_vhub_change_port_stat(vhub, port, 0,
522 ast_vhub_change_port_stat(vhub, port,
531 if (vhub->wakeup_en)
532 ast_vhub_send_host_wakeup(vhub);
537 struct ast_vhub *vhub = container_of(work,
548 spin_lock_irqsave(&vhub->lock, flags);
549 for (i = 0; i < vhub->max_ports; i++) {
550 struct ast_vhub_port *p = &vhub->ports[i];
554 ast_vhub_change_port_stat(vhub, i,
559 ast_vhub_send_host_wakeup(vhub);
560 spin_unlock_irqrestore(&vhub->lock, flags);
563 void ast_vhub_hub_wake_all(struct ast_vhub *vhub)
570 schedule_work(&vhub->wake_work);
573 static void ast_vhub_port_reset(struct ast_vhub *vhub, u8 port)
575 struct ast_vhub_port *p = &vhub->ports[port];
579 ast_vhub_change_port_stat(vhub, port,
596 if (speed == USB_SPEED_UNKNOWN || speed > vhub->speed)
597 speed = vhub->speed;
614 UDCDBG(vhub, "Unsupported speed %d when"
623 ast_vhub_change_port_stat(vhub, port, clr, set, true);
629 struct ast_vhub *vhub = ep->vhub;
632 if (port == 0 || port > vhub->max_ports)
635 p = &vhub->ports[port];
641 ast_vhub_change_port_stat(vhub, port,
648 ast_vhub_port_reset(vhub, port);
658 ast_vhub_update_hub_ep1(vhub, port);
672 struct ast_vhub *vhub = ep->vhub;
675 if (port == 0 || port > vhub->max_ports)
678 p = &vhub->ports[port];
682 ast_vhub_change_port_stat(vhub, port,
691 ast_vhub_change_port_stat(vhub, port,
709 ast_vhub_update_hub_ep1(vhub, port);
718 struct ast_vhub *vhub = ep->vhub;
721 if (port == 0 || port > vhub->max_ports)
725 stat = vhub->ports[port].status;
726 chg = vhub->ports[port].change;
787 void ast_vhub_hub_suspend(struct ast_vhub *vhub)
791 UDCDBG(vhub, "USB bus suspend\n");
793 if (vhub->suspended)
796 vhub->suspended = true;
802 for (i = 0; i < vhub->max_ports; i++) {
803 struct ast_vhub_port *p = &vhub->ports[i];
810 void ast_vhub_hub_resume(struct ast_vhub *vhub)
814 UDCDBG(vhub, "USB bus resume\n");
816 if (!vhub->suspended)
819 vhub->suspended = false;
825 for (i = 0; i < vhub->max_ports; i++) {
826 struct ast_vhub_port *p = &vhub->ports[i];
833 void ast_vhub_hub_reset(struct ast_vhub *vhub)
837 UDCDBG(vhub, "USB bus reset\n");
843 if (vhub->speed == USB_SPEED_UNKNOWN)
847 vhub->suspended = false;
850 vhub->speed = USB_SPEED_UNKNOWN;
853 vhub->wakeup_en = false;
859 for (i = 0; i < vhub->max_ports; i++) {
860 struct ast_vhub_port *p = &vhub->ports[i];
871 writel(0, vhub->regs + AST_VHUB_CONF);
872 writel(0, vhub->regs + AST_VHUB_EP0_CTRL);
875 vhub->regs + AST_VHUB_EP1_CTRL);
876 writel(0, vhub->regs + AST_VHUB_EP1_STS_CHG);
879 static void ast_vhub_of_parse_dev_desc(struct ast_vhub *vhub,
885 if (!of_property_read_u32(vhub_np, "vhub-vendor-id", &data)) {
887 vhub->vhub_dev_desc.idVendor = cpu_to_le16(id);
889 if (!of_property_read_u32(vhub_np, "vhub-product-id", &data)) {
891 vhub->vhub_dev_desc.idProduct = cpu_to_le16(id);
893 if (!of_property_read_u32(vhub_np, "vhub-device-revision", &data)) {
895 vhub->vhub_dev_desc.bcdDevice = cpu_to_le16(id);
899 static void ast_vhub_fixup_usb1_dev_desc(struct ast_vhub *vhub)
901 vhub->vhub_dev_desc.bcdUSB = cpu_to_le16(0x0100);
902 vhub->vhub_dev_desc.bDeviceProtocol = 0;
906 ast_vhub_str_container_alloc(struct ast_vhub *vhub)
916 container = devm_kzalloc(&vhub->pdev->dev, size, GFP_KERNEL);
942 static int ast_vhub_str_alloc_add(struct ast_vhub *vhub,
948 container = ast_vhub_str_container_alloc(vhub);
954 list_add_tail(&container->list, &vhub->vhub_str_desc);
969 static int ast_vhub_of_parse_str_desc(struct ast_vhub *vhub,
1001 ret = ast_vhub_str_alloc_add(vhub, &lang_str);
1011 static int ast_vhub_init_desc(struct ast_vhub *vhub)
1015 const struct device_node *vhub_np = vhub->pdev->dev.of_node;
1017 /* Initialize vhub Device Descriptor. */
1018 memcpy(&vhub->vhub_dev_desc, &ast_vhub_dev_desc,
1019 sizeof(vhub->vhub_dev_desc));
1020 ast_vhub_of_parse_dev_desc(vhub, vhub_np);
1021 if (vhub->force_usb1)
1022 ast_vhub_fixup_usb1_dev_desc(vhub);
1024 /* Initialize vhub Configuration Descriptor. */
1025 memcpy(&vhub->vhub_conf_desc, &ast_vhub_conf_desc,
1026 sizeof(vhub->vhub_conf_desc));
1028 /* Initialize vhub Hub Descriptor. */
1029 memcpy(&vhub->vhub_hub_desc, &ast_vhub_hub_desc,
1030 sizeof(vhub->vhub_hub_desc));
1031 vhub->vhub_hub_desc.bNbrPorts = vhub->max_ports;
1033 /* Initialize vhub String Descriptors. */
1034 INIT_LIST_HEAD(&vhub->vhub_str_desc);
1035 desc_np = of_get_child_by_name(vhub_np, "vhub-strings");
1037 ret = ast_vhub_of_parse_str_desc(vhub, desc_np);
1041 ret = ast_vhub_str_alloc_add(vhub, &ast_vhub_strings);
1046 int ast_vhub_init_hub(struct ast_vhub *vhub)
1048 vhub->speed = USB_SPEED_UNKNOWN;
1049 INIT_WORK(&vhub->wake_work, ast_vhub_wake_work);
1051 return ast_vhub_init_desc(vhub);