Lines Matching refs:vhub

3  * aspeed-vhub -- Driver for Aspeed SoC "vHub" USB gadget
31 #include "vhub.h"
185 if (ep->vhub->wakeup_en)
202 if (ep->vhub->ep1_stalled)
220 ep->vhub->wakeup_en = is_set;
227 val = readl(ep->vhub->regs + AST_VHUB_CTRL);
230 writel(val, ep->vhub->regs + AST_VHUB_CTRL);
259 ep->vhub->ep1_stalled = is_set;
260 reg = readl(ep->vhub->regs + AST_VHUB_EP1_CTRL);
267 writel(reg, ep->vhub->regs + AST_VHUB_EP1_CTRL);
276 struct ast_vhub *vhub = ep->vhub;
292 memcpy(ep->buf, &vhub->vhub_dev_desc, dsize);
293 BUILD_BUG_ON(dsize > sizeof(vhub->vhub_dev_desc));
299 memcpy(ep->buf, &vhub->vhub_conf_desc, dsize);
301 BUILD_BUG_ON(dsize > sizeof(vhub->vhub_conf_desc));
306 memcpy(ep->buf, &vhub->vhub_hub_desc, dsize);
307 BUILD_BUG_ON(dsize > sizeof(vhub->vhub_hub_desc));
311 dsize = sizeof(vhub->vhub_qual_desc);
312 memcpy(ep->buf, &vhub->vhub_qual_desc, dsize);
332 static int ast_vhub_collect_languages(struct ast_vhub *vhub, void *buf,
343 list_for_each_entry(container, &vhub->vhub_str_desc, list) {
358 static struct usb_gadget_strings *ast_vhub_lookup_string(struct ast_vhub *vhub,
364 list_for_each_entry(container, &vhub->vhub_str_desc, list) {
379 struct ast_vhub *vhub = ep->vhub;
383 rc = ast_vhub_collect_languages(vhub, buf, sizeof(buf));
385 lang_str = ast_vhub_lookup_string(vhub, lang_id);
403 struct ast_vhub *vhub = ep->vhub;
411 if (vhub->speed == USB_SPEED_UNKNOWN) {
412 u32 ustat = readl(vhub->regs + AST_VHUB_USBSTS);
414 vhub->speed = USB_SPEED_HIGH;
416 vhub->speed = USB_SPEED_FULL;
417 UDCDBG(vhub, "USB status=%08x speed=%s\n", ustat,
418 vhub->speed == USB_SPEED_HIGH ? "high" : "full");
425 writel(wValue, vhub->regs + AST_VHUB_CONF);
480 static void ast_vhub_update_hub_ep1(struct ast_vhub *vhub,
484 u32 reg = readl(vhub->regs + AST_VHUB_EP1_STS_CHG);
486 if (vhub->ports[port].change)
490 writel(reg, vhub->regs + AST_VHUB_EP1_STS_CHG);
493 static void ast_vhub_change_port_stat(struct ast_vhub *vhub,
499 struct ast_vhub_port *p = &vhub->ports[port];
528 ast_vhub_update_hub_ep1(vhub, port);
532 static void ast_vhub_send_host_wakeup(struct ast_vhub *vhub)
534 u32 reg = readl(vhub->regs + AST_VHUB_CTRL);
535 UDCDBG(vhub, "Waking up host !\n");
537 writel(reg, vhub->regs + AST_VHUB_CTRL);
540 void ast_vhub_device_connect(struct ast_vhub *vhub,
544 ast_vhub_change_port_stat(vhub, port, 0,
547 ast_vhub_change_port_stat(vhub, port,
556 if (vhub->wakeup_en)
557 ast_vhub_send_host_wakeup(vhub);
562 struct ast_vhub *vhub = container_of(work,
573 spin_lock_irqsave(&vhub->lock, flags);
574 for (i = 0; i < vhub->max_ports; i++) {
575 struct ast_vhub_port *p = &vhub->ports[i];
579 ast_vhub_change_port_stat(vhub, i,
584 ast_vhub_send_host_wakeup(vhub);
585 spin_unlock_irqrestore(&vhub->lock, flags);
588 void ast_vhub_hub_wake_all(struct ast_vhub *vhub)
595 schedule_work(&vhub->wake_work);
598 static void ast_vhub_port_reset(struct ast_vhub *vhub, u8 port)
600 struct ast_vhub_port *p = &vhub->ports[port];
604 ast_vhub_change_port_stat(vhub, port,
621 if (speed == USB_SPEED_UNKNOWN || speed > vhub->speed)
622 speed = vhub->speed;
639 UDCDBG(vhub, "Unsupported speed %d when"
648 ast_vhub_change_port_stat(vhub, port, clr, set, true);
654 struct ast_vhub *vhub = ep->vhub;
657 if (port == 0 || port > vhub->max_ports)
660 p = &vhub->ports[port];
666 ast_vhub_change_port_stat(vhub, port,
673 ast_vhub_port_reset(vhub, port);
683 ast_vhub_update_hub_ep1(vhub, port);
697 struct ast_vhub *vhub = ep->vhub;
700 if (port == 0 || port > vhub->max_ports)
703 p = &vhub->ports[port];
707 ast_vhub_change_port_stat(vhub, port,
716 ast_vhub_change_port_stat(vhub, port,
734 ast_vhub_update_hub_ep1(vhub, port);
743 struct ast_vhub *vhub = ep->vhub;
746 if (port == 0 || port > vhub->max_ports)
750 stat = vhub->ports[port].status;
751 chg = vhub->ports[port].change;
812 void ast_vhub_hub_suspend(struct ast_vhub *vhub)
816 UDCDBG(vhub, "USB bus suspend\n");
818 if (vhub->suspended)
821 vhub->suspended = true;
827 for (i = 0; i < vhub->max_ports; i++) {
828 struct ast_vhub_port *p = &vhub->ports[i];
835 void ast_vhub_hub_resume(struct ast_vhub *vhub)
839 UDCDBG(vhub, "USB bus resume\n");
841 if (!vhub->suspended)
844 vhub->suspended = false;
850 for (i = 0; i < vhub->max_ports; i++) {
851 struct ast_vhub_port *p = &vhub->ports[i];
858 void ast_vhub_hub_reset(struct ast_vhub *vhub)
862 UDCDBG(vhub, "USB bus reset\n");
868 if (vhub->speed == USB_SPEED_UNKNOWN)
872 vhub->suspended = false;
875 vhub->speed = USB_SPEED_UNKNOWN;
878 vhub->wakeup_en = false;
884 for (i = 0; i < vhub->max_ports; i++) {
885 struct ast_vhub_port *p = &vhub->ports[i];
896 writel(0, vhub->regs + AST_VHUB_CONF);
897 writel(0, vhub->regs + AST_VHUB_EP0_CTRL);
900 vhub->regs + AST_VHUB_EP1_CTRL);
901 writel(0, vhub->regs + AST_VHUB_EP1_STS_CHG);
904 static void ast_vhub_of_parse_dev_desc(struct ast_vhub *vhub,
910 if (!of_property_read_u32(vhub_np, "vhub-vendor-id", &data)) {
912 vhub->vhub_dev_desc.idVendor = cpu_to_le16(id);
914 if (!of_property_read_u32(vhub_np, "vhub-product-id", &data)) {
916 vhub->vhub_dev_desc.idProduct = cpu_to_le16(id);
918 if (!of_property_read_u32(vhub_np, "vhub-device-revision", &data)) {
920 vhub->vhub_dev_desc.bcdDevice = cpu_to_le16(id);
924 static void ast_vhub_fixup_usb1_dev_desc(struct ast_vhub *vhub)
926 vhub->vhub_dev_desc.bcdUSB = cpu_to_le16(0x0100);
927 vhub->vhub_dev_desc.bDeviceProtocol = 0;
931 ast_vhub_str_container_alloc(struct ast_vhub *vhub)
941 container = devm_kzalloc(&vhub->pdev->dev, size, GFP_KERNEL);
967 static int ast_vhub_str_alloc_add(struct ast_vhub *vhub,
973 container = ast_vhub_str_container_alloc(vhub);
979 list_add_tail(&container->list, &vhub->vhub_str_desc);
994 static int ast_vhub_of_parse_str_desc(struct ast_vhub *vhub,
1026 ret = ast_vhub_str_alloc_add(vhub, &lang_str);
1036 static int ast_vhub_init_desc(struct ast_vhub *vhub)
1040 const struct device_node *vhub_np = vhub->pdev->dev.of_node;
1042 /* Initialize vhub Device Descriptor. */
1043 memcpy(&vhub->vhub_dev_desc, &ast_vhub_dev_desc,
1044 sizeof(vhub->vhub_dev_desc));
1045 ast_vhub_of_parse_dev_desc(vhub, vhub_np);
1046 if (vhub->force_usb1)
1047 ast_vhub_fixup_usb1_dev_desc(vhub);
1049 /* Initialize vhub Configuration Descriptor. */
1050 memcpy(&vhub->vhub_conf_desc, &ast_vhub_conf_desc,
1051 sizeof(vhub->vhub_conf_desc));
1053 /* Initialize vhub Hub Descriptor. */
1054 memcpy(&vhub->vhub_hub_desc, &ast_vhub_hub_desc,
1055 sizeof(vhub->vhub_hub_desc));
1056 vhub->vhub_hub_desc.bNbrPorts = vhub->max_ports;
1058 /* Initialize vhub String Descriptors. */
1059 INIT_LIST_HEAD(&vhub->vhub_str_desc);
1060 desc_np = of_get_child_by_name(vhub_np, "vhub-strings");
1062 ret = ast_vhub_of_parse_str_desc(vhub, desc_np);
1066 ret = ast_vhub_str_alloc_add(vhub, &ast_vhub_strings);
1068 /* Initialize vhub Qualifier Descriptor. */
1069 memcpy(&vhub->vhub_qual_desc, &ast_vhub_qual_desc,
1070 sizeof(vhub->vhub_qual_desc));
1075 int ast_vhub_init_hub(struct ast_vhub *vhub)
1077 vhub->speed = USB_SPEED_UNKNOWN;
1078 INIT_WORK(&vhub->wake_work, ast_vhub_wake_work);
1080 return ast_vhub_init_desc(vhub);