Lines Matching defs:udc
182 struct ast_udc_dev *udc;
248 dev_dbg(&(e)->udc->pdev->dev, "%s():%s " fmt, __func__, \
269 #define ast_udc_read(udc, offset) \
270 readl((udc)->reg + (offset))
271 #define ast_udc_write(udc, val, offset) \
272 writel((val), (udc)->reg + (offset))
284 struct ast_udc_dev *udc = ep->udc;
300 spin_unlock(&udc->lock);
302 spin_lock(&udc->lock);
329 static void ast_udc_stop_activity(struct ast_udc_dev *udc)
335 ep = &udc->ep[i];
346 struct ast_udc_dev *udc = ep->udc;
359 if (!udc->driver) {
366 spin_lock_irqsave(&udc->lock, flags);
399 ep->desc_mode = udc->desc_mode && ep->descs_dma && ep->dir_in;
418 ast_udc_write(udc, EP_TOGGLE_SET_EPNUM(epnum), AST_VHUB_EP_DATA);
425 spin_unlock_irqrestore(&udc->lock, flags);
433 struct ast_udc_dev *udc = ep->udc;
436 spin_lock_irqsave(&udc->lock, flags);
444 spin_unlock_irqrestore(&udc->lock, flags);
477 struct ast_udc_dev *udc = ep->udc;
478 struct device *dev = &udc->pdev->dev;
585 struct ast_udc_dev *udc = ep->udc;
592 ast_udc_write(udc, req->req.dma + req->req.actual,
597 SETUP_DBG(udc, "IN: %s:0x%x, %s:0x%x, %s:%d (%d/%d), %s:%d\n",
605 ast_udc_write(udc, EP0_TX_LEN(tx_len), AST_UDC_EP0_CTRL);
606 ast_udc_write(udc, EP0_TX_LEN(tx_len) | EP0_TX_BUFF_RDY,
611 SETUP_DBG(udc, "OUT: %s:%x, %s:%x, %s:(%d/%d), %s:%d\n",
619 ast_udc_write(udc, EP0_TX_BUFF_RDY, AST_UDC_EP0_CTRL);
622 ast_udc_write(udc, EP0_RX_BUFF_RDY, AST_UDC_EP0_CTRL);
631 struct ast_udc_dev *udc = ep->udc;
632 struct device *dev = &udc->pdev->dev;
646 spin_lock_irqsave(&udc->lock, flags);
654 rc = usb_gadget_map_request(&udc->gadget, &req->req, ep->dir_in);
686 spin_unlock_irqrestore(&udc->lock, flags);
694 struct ast_udc_dev *udc = ep->udc;
699 spin_lock_irqsave(&udc->lock, flags);
715 spin_unlock_irqrestore(&udc->lock, flags);
723 struct ast_udc_dev *udc = ep->udc;
730 spin_lock_irqsave(&udc->lock, flags);
736 ctrl = ast_udc_read(udc, AST_UDC_EP0_CTRL);
742 ast_udc_write(udc, ctrl, AST_UDC_EP0_CTRL);
746 ctrl = ast_udc_read(udc, AST_UDC_EP_CONFIG);
758 spin_unlock_irqrestore(&udc->lock, flags);
774 static void ast_udc_ep0_rx(struct ast_udc_dev *udc)
776 ast_udc_write(udc, udc->ep0_buf_dma, AST_UDC_EP0_DATA_BUFF);
777 ast_udc_write(udc, EP0_RX_BUFF_RDY, AST_UDC_EP0_CTRL);
780 static void ast_udc_ep0_tx(struct ast_udc_dev *udc)
782 ast_udc_write(udc, udc->ep0_buf_dma, AST_UDC_EP0_DATA_BUFF);
783 ast_udc_write(udc, EP0_TX_BUFF_RDY, AST_UDC_EP0_CTRL);
786 static void ast_udc_ep0_out(struct ast_udc_dev *udc)
788 struct device *dev = &udc->pdev->dev;
789 struct ast_udc_ep *ep = &udc->ep[0];
798 rx_len = EP0_GET_RX_LEN(ast_udc_read(udc, AST_UDC_EP0_CTRL));
801 SETUP_DBG(udc, "req %p (%d/%d)\n", req,
806 ast_udc_ep0_tx(udc);
815 ast_udc_ep0_tx(udc);
827 static void ast_udc_ep0_in(struct ast_udc_dev *udc)
829 struct ast_udc_ep *ep = &udc->ep[0];
833 if (udc->is_control_tx) {
834 ast_udc_ep0_rx(udc);
835 udc->is_control_tx = 0;
843 SETUP_DBG(udc, "req %p (%d/%d)\n", req,
848 ast_udc_ep0_rx(udc);
859 static void ast_udc_epn_handle(struct ast_udc_dev *udc, u16 ep_num)
861 struct ast_udc_ep *ep = &udc->ep[ep_num];
898 static void ast_udc_epn_handle_desc(struct ast_udc_dev *udc, u16 ep_num)
900 struct ast_udc_ep *ep = &udc->ep[ep_num];
901 struct device *dev = &udc->pdev->dev;
979 static void ast_udc_ep0_data_tx(struct ast_udc_dev *udc, u8 *tx_data, u32 len)
982 memcpy(udc->ep0_buf, tx_data, len);
984 ast_udc_write(udc, udc->ep0_buf_dma, AST_UDC_EP0_DATA_BUFF);
985 ast_udc_write(udc, EP0_TX_LEN(len), AST_UDC_EP0_CTRL);
986 ast_udc_write(udc, EP0_TX_LEN(len) | EP0_TX_BUFF_RDY,
988 udc->is_control_tx = 1;
991 ast_udc_write(udc, EP0_TX_BUFF_RDY, AST_UDC_EP0_CTRL);
994 static void ast_udc_getstatus(struct ast_udc_dev *udc)
1001 memcpy_fromio(&crq, udc->creq, sizeof(crq));
1012 status = udc->ep[epnum].stopped;
1018 ep = &udc->ep[epnum];
1020 ast_udc_ep0_data_tx(udc, (u8 *)&status, sizeof(status));
1026 ast_udc_write(udc, ast_udc_read(udc, AST_UDC_EP0_CTRL) | EP0_STALL,
1030 static void ast_udc_ep0_handle_setup(struct ast_udc_dev *udc)
1032 struct ast_udc_ep *ep = &udc->ep[0];
1039 memcpy_fromio(&crq, udc->creq, sizeof(crq));
1041 SETUP_DBG(udc, "SETUP packet: %02x/%02x/%04x/%04x/%04x\n",
1049 list_for_each_entry(req, &udc->ep[0].queue, queue) {
1055 ast_udc_nuke(&udc->ep[0], -ETIMEDOUT);
1057 udc->ep[0].dir_in = crq.bRequestType & USB_DIR_IN;
1062 if (ast_udc_read(udc, AST_UDC_STS) & UDC_STS_HIGHSPEED)
1063 udc->gadget.speed = USB_SPEED_HIGH;
1065 udc->gadget.speed = USB_SPEED_FULL;
1067 SETUP_DBG(udc, "set addr: 0x%x\n", crq.wValue);
1068 reg = ast_udc_read(udc, AST_UDC_CONFIG);
1071 ast_udc_write(udc, reg, AST_UDC_CONFIG);
1075 SETUP_DBG(udc, "ep0: CLEAR FEATURE\n");
1079 SETUP_DBG(udc, "ep0: SET FEATURE\n");
1083 ast_udc_getstatus(udc);
1093 if (udc->driver) {
1094 SETUP_DBG(udc, "Forwarding %s to gadget...\n",
1095 udc->gadget.name);
1097 spin_unlock(&udc->lock);
1098 rc = udc->driver->setup(&udc->gadget, &crq);
1099 spin_lock(&udc->lock);
1102 SETUP_DBG(udc, "No gadget for request !\n");
1109 SETUP_DBG(udc, "Stalling, rc:0x%x\n", rc);
1110 ast_udc_write(udc, ast_udc_read(udc, AST_UDC_EP0_CTRL) | EP0_STALL,
1115 SETUP_DBG(udc, "ep0: Sending IN status without data\n");
1116 ast_udc_write(udc, EP0_TX_BUFF_RDY, AST_UDC_EP0_CTRL);
1121 struct ast_udc_dev *udc = (struct ast_udc_dev *)data;
1126 spin_lock(&udc->lock);
1128 isr = ast_udc_read(udc, AST_UDC_ISR);
1133 ast_udc_write(udc, isr, AST_UDC_ISR);
1136 ISR_DBG(udc, "UDC_IRQ_BUS_RESET\n");
1137 udc->gadget.speed = USB_SPEED_UNKNOWN;
1139 ep = &udc->ep[1];
1143 if (udc->driver && udc->driver->reset) {
1144 spin_unlock(&udc->lock);
1145 udc->driver->reset(&udc->gadget);
1146 spin_lock(&udc->lock);
1151 ISR_DBG(udc, "UDC_IRQ_BUS_SUSPEND\n");
1152 udc->suspended_from = udc->gadget.state;
1153 usb_gadget_set_state(&udc->gadget, USB_STATE_SUSPENDED);
1155 if (udc->driver && udc->driver->suspend) {
1156 spin_unlock(&udc->lock);
1157 udc->driver->suspend(&udc->gadget);
1158 spin_lock(&udc->lock);
1163 ISR_DBG(udc, "UDC_IRQ_BUS_RESUME\n");
1164 usb_gadget_set_state(&udc->gadget, udc->suspended_from);
1166 if (udc->driver && udc->driver->resume) {
1167 spin_unlock(&udc->lock);
1168 udc->driver->resume(&udc->gadget);
1169 spin_lock(&udc->lock);
1174 ISR_DBG(udc, "UDC_IRQ_EP0_IN_ACK_STALL\n");
1175 ast_udc_ep0_in(udc);
1179 ISR_DBG(udc, "UDC_IRQ_EP0_OUT_ACK_STALL\n");
1180 ast_udc_ep0_out(udc);
1184 ISR_DBG(udc, "UDC_IRQ_EP0_SETUP\n");
1185 ast_udc_ep0_handle_setup(udc);
1189 ISR_DBG(udc, "UDC_IRQ_EP_POOL_ACK_STALL\n");
1190 ep_isr = ast_udc_read(udc, AST_UDC_EP_ACK_ISR);
1193 ast_udc_write(udc, ep_isr, AST_UDC_EP_ACK_ISR);
1198 ep = &udc->ep[i + 1];
1200 ast_udc_epn_handle_desc(udc, i + 1);
1202 ast_udc_epn_handle(udc, i + 1);
1208 spin_unlock(&udc->lock);
1214 struct ast_udc_dev *udc = to_ast_dev(gadget);
1216 return (ast_udc_read(udc, AST_UDC_STS) >> 16) & 0x7ff;
1221 struct ast_udc_dev *udc = container_of(work, struct ast_udc_dev,
1226 spin_lock_irqsave(&udc->lock, flags);
1228 UDC_DBG(udc, "Wakeup Host !\n");
1229 ctrl = ast_udc_read(udc, AST_UDC_FUNC_CTRL);
1230 ast_udc_write(udc, ctrl | USB_REMOTE_WAKEUP_EN, AST_UDC_FUNC_CTRL);
1232 spin_unlock_irqrestore(&udc->lock, flags);
1235 static void ast_udc_wakeup_all(struct ast_udc_dev *udc)
1242 schedule_work(&udc->wake_work);
1247 struct ast_udc_dev *udc = to_ast_dev(gadget);
1251 spin_lock_irqsave(&udc->lock, flags);
1253 if (!udc->wakeup_en) {
1254 UDC_DBG(udc, "Remote Wakeup is disabled\n");
1259 UDC_DBG(udc, "Device initiated wakeup\n");
1260 ast_udc_wakeup_all(udc);
1263 spin_unlock_irqrestore(&udc->lock, flags);
1272 struct ast_udc_dev *udc = to_ast_dev(gadget);
1276 spin_lock_irqsave(&udc->lock, flags);
1278 UDC_DBG(udc, "is_on: %d\n", is_on);
1280 ctrl = ast_udc_read(udc, AST_UDC_FUNC_CTRL) | USB_UPSTREAM_EN;
1282 ctrl = ast_udc_read(udc, AST_UDC_FUNC_CTRL) & ~USB_UPSTREAM_EN;
1284 ast_udc_write(udc, ctrl, AST_UDC_FUNC_CTRL);
1286 spin_unlock_irqrestore(&udc->lock, flags);
1294 struct ast_udc_dev *udc = to_ast_dev(gadget);
1299 spin_lock_irqsave(&udc->lock, flags);
1301 UDC_DBG(udc, "\n");
1302 udc->driver = driver;
1303 udc->gadget.dev.of_node = udc->pdev->dev.of_node;
1306 ep = &udc->ep[i];
1310 spin_unlock_irqrestore(&udc->lock, flags);
1317 struct ast_udc_dev *udc = to_ast_dev(gadget);
1321 spin_lock_irqsave(&udc->lock, flags);
1323 UDC_DBG(udc, "\n");
1324 ctrl = ast_udc_read(udc, AST_UDC_FUNC_CTRL) & ~USB_UPSTREAM_EN;
1325 ast_udc_write(udc, ctrl, AST_UDC_FUNC_CTRL);
1327 udc->gadget.speed = USB_SPEED_UNKNOWN;
1328 udc->driver = NULL;
1330 ast_udc_stop_activity(udc);
1331 usb_gadget_set_state(&udc->gadget, USB_STATE_NOTATTACHED);
1333 spin_unlock_irqrestore(&udc->lock, flags);
1351 static void ast_udc_init_ep(struct ast_udc_dev *udc)
1357 ep = &udc->ep[i];
1370 ep->udc = udc;
1380 ep->ep_reg = udc->reg + AST_UDC_EP_BASE +
1383 ep->epn_buf = udc->ep0_buf + (i * AST_UDC_EP_DMA_SIZE);
1384 ep->epn_buf_dma = udc->ep0_buf_dma + (i * AST_UDC_EP_DMA_SIZE);
1391 list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list);
1395 static void ast_udc_init_dev(struct ast_udc_dev *udc)
1397 INIT_WORK(&udc->wake_work, ast_udc_wake_work);
1400 static void ast_udc_init_hw(struct ast_udc_dev *udc)
1406 ast_udc_write(udc, ctrl, AST_UDC_FUNC_CTRL);
1409 ast_udc_write(udc, 0, AST_UDC_DEV_RESET);
1414 ast_udc_write(udc, ctrl, AST_UDC_FUNC_CTRL);
1418 ast_udc_write(udc, 0, AST_UDC_IER);
1419 ast_udc_write(udc, UDC_IRQ_ACK_ALL, AST_UDC_ISR);
1426 ast_udc_write(udc, ctrl, AST_UDC_IER);
1429 ast_udc_write(udc, UDC_IRQ_EP_ACK_ALL, AST_UDC_EP_ACK_IER);
1430 ast_udc_write(udc, UDC_IRQ_EP_ACK_ALL, AST_UDC_EP_ACK_ISR);
1432 ast_udc_write(udc, 0, AST_UDC_EP0_CTRL);
1437 struct ast_udc_dev *udc = platform_get_drvdata(pdev);
1441 usb_del_gadget_udc(&udc->gadget);
1442 if (udc->driver)
1445 spin_lock_irqsave(&udc->lock, flags);
1448 ctrl = ast_udc_read(udc, AST_UDC_FUNC_CTRL) & ~USB_UPSTREAM_EN;
1449 ast_udc_write(udc, ctrl, AST_UDC_FUNC_CTRL);
1451 clk_disable_unprepare(udc->clk);
1453 spin_unlock_irqrestore(&udc->lock, flags);
1455 if (udc->ep0_buf)
1458 udc->ep0_buf,
1459 udc->ep0_buf_dma);
1461 udc->ep0_buf = NULL;
1470 struct ast_udc_dev *udc;
1473 udc = devm_kzalloc(&pdev->dev, sizeof(struct ast_udc_dev), GFP_KERNEL);
1474 if (!udc)
1477 udc->gadget.dev.parent = dev;
1478 udc->pdev = pdev;
1479 spin_lock_init(&udc->lock);
1481 udc->gadget.ops = &ast_udc_ops;
1482 udc->gadget.ep0 = &udc->ep[0].ep;
1483 udc->gadget.name = "aspeed-udc";
1484 udc->gadget.dev.init_name = "gadget";
1486 udc->reg = devm_platform_ioremap_resource(pdev, 0);
1487 if (IS_ERR(udc->reg)) {
1489 return PTR_ERR(udc->reg);
1492 platform_set_drvdata(pdev, udc);
1494 udc->clk = devm_clk_get(&pdev->dev, NULL);
1495 if (IS_ERR(udc->clk)) {
1496 rc = PTR_ERR(udc->clk);
1499 rc = clk_prepare_enable(udc->clk);
1508 udc->force_usb1 = true;
1513 udc->ep0_buf = dma_alloc_coherent(&pdev->dev,
1516 &udc->ep0_buf_dma, GFP_KERNEL);
1518 udc->gadget.speed = USB_SPEED_UNKNOWN;
1519 udc->gadget.max_speed = USB_SPEED_HIGH;
1520 udc->creq = udc->reg + AST_UDC_SETUP0;
1526 udc->desc_mode = AST_UDC_DESC_MODE;
1528 dev_info(&pdev->dev, "DMA %s\n", udc->desc_mode ?
1531 INIT_LIST_HEAD(&udc->gadget.ep_list);
1532 INIT_LIST_HEAD(&udc->gadget.ep0->ep_list);
1534 /* Initialized udc ep */
1535 ast_udc_init_ep(udc);
1537 /* Initialized udc device */
1538 ast_udc_init_dev(udc);
1540 /* Initialized udc hardware */
1541 ast_udc_init_hw(udc);
1544 udc->irq = platform_get_irq(pdev, 0);
1545 if (udc->irq < 0) {
1546 rc = udc->irq;
1550 rc = devm_request_irq(&pdev->dev, udc->irq, ast_udc_isr, 0,
1551 KBUILD_MODNAME, udc);
1557 rc = usb_add_gadget_udc(&pdev->dev, &udc->gadget);
1559 dev_err(&pdev->dev, "Failed to add gadget udc\n");
1563 dev_info(&pdev->dev, "Initialized udc in USB%s mode\n",
1564 udc->force_usb1 ? "1" : "2");
1569 dev_err(&pdev->dev, "Failed to udc probe, rc:0x%x\n", rc);
1576 { .compatible = "aspeed,ast2600-udc", },