Lines Matching defs:udc

3  * omap_udc.c -- for OMAP full speed udc; most chips support OTG.
149 struct omap_udc *udc;
193 udc = ep->udc;
194 if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN) {
199 spin_lock_irqsave(&udc->lock, flags);
211 omap_writew(udc->clr_halt, UDC_CTRL);
216 list_add(&ep->iso, &udc->iso);
231 spin_unlock_irqrestore(&udc->lock, flags);
249 spin_lock_irqsave(&ep->udc->lock, flags);
258 spin_unlock_irqrestore(&ep->udc->lock, flags);
293 struct omap_udc *udc = ep->udc;
304 usb_gadget_unmap_request(&udc->gadget, &req->req,
316 spin_unlock(&ep->udc->lock);
318 spin_lock(&ep->udc->lock);
636 static void dma_irq(struct omap_udc *udc, u16 irq_src)
644 ep = &udc->ep[16 + UDC_DMA_TX_SRC(dman_stat)];
663 ep = &udc->ep[UDC_DMA_RX_SRC(dman_stat)];
681 ep = &udc->ep[UDC_DMA_RX_SRC(dman_stat)];
870 struct omap_udc *udc;
902 udc = ep->udc;
903 if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN)
907 usb_gadget_map_request(&udc->gadget, &req->req,
913 spin_lock_irqsave(&udc->lock, flags);
929 if (!udc->ep0_pending || !list_empty(&ep->queue)) {
930 spin_unlock_irqrestore(&udc->lock, flags);
935 is_in = udc->ep0_in;
942 if (udc->ep0_set_config) {
946 if (!udc->ep0_reset_config)
963 udc->ep0_pending = 0;
972 if (udc->ep0_setup)
1001 spin_unlock_irqrestore(&udc->lock, flags);
1015 spin_lock_irqsave(&ep->udc->lock, flags);
1025 spin_unlock_irqrestore(&ep->udc->lock, flags);
1039 spin_unlock_irqrestore(&ep->udc->lock, flags);
1051 spin_lock_irqsave(&ep->udc->lock, flags);
1055 if (!ep->udc->ep0_pending)
1058 if (ep->udc->ep0_set_config) {
1063 ep->udc->ep0_pending = 0;
1100 omap_writew(ep->udc->clr_halt, UDC_CTRL);
1112 spin_unlock_irqrestore(&ep->udc->lock, flags);
1141 struct omap_udc *udc;
1145 udc = container_of(gadget, struct omap_udc, gadget);
1147 spin_lock_irqsave(&udc->lock, flags);
1148 if (udc->devstat & UDC_SUS) {
1152 if (udc->devstat & (UDC_B_HNP_ENABLE|UDC_R_WK_OK)) {
1159 } else if (!(udc->devstat & UDC_ATT)) {
1160 if (!IS_ERR_OR_NULL(udc->transceiver))
1161 retval = otg_start_srp(udc->transceiver->otg);
1163 spin_unlock_irqrestore(&udc->lock, flags);
1171 struct omap_udc *udc;
1176 udc = container_of(gadget, struct omap_udc, gadget);
1177 spin_lock_irqsave(&udc->lock, flags);
1184 spin_unlock_irqrestore(&udc->lock, flags);
1189 static int can_pullup(struct omap_udc *udc)
1191 return udc->driver && udc->softconnect && udc->vbus_active;
1194 static void pullup_enable(struct omap_udc *udc)
1201 if (!gadget_is_otg(&udc->gadget) && !cpu_is_omap15xx()) {
1211 static void pullup_disable(struct omap_udc *udc)
1215 if (!gadget_is_otg(&udc->gadget) && !cpu_is_omap15xx()) {
1228 static struct omap_udc *udc;
1232 if (udc == NULL || udc->dc_clk == NULL || udc->hhc_clk == NULL)
1236 clk_enable(udc->dc_clk);
1237 clk_enable(udc->hhc_clk);
1240 clk_disable(udc->hhc_clk);
1241 clk_disable(udc->dc_clk);
1251 struct omap_udc *udc;
1255 udc = container_of(gadget, struct omap_udc, gadget);
1256 spin_lock_irqsave(&udc->lock, flags);
1258 udc->vbus_active = (is_active != 0);
1268 if (udc->dc_clk != NULL && is_active) {
1269 if (!udc->clk_requested) {
1271 udc->clk_requested = 1;
1274 if (can_pullup(udc))
1275 pullup_enable(udc);
1277 pullup_disable(udc);
1278 if (udc->dc_clk != NULL && !is_active) {
1279 if (udc->clk_requested) {
1281 udc->clk_requested = 0;
1284 spin_unlock_irqrestore(&udc->lock, flags);
1290 struct omap_udc *udc;
1292 udc = container_of(gadget, struct omap_udc, gadget);
1293 if (!IS_ERR_OR_NULL(udc->transceiver))
1294 return usb_phy_set_power(udc->transceiver, mA);
1300 struct omap_udc *udc;
1303 udc = container_of(gadget, struct omap_udc, gadget);
1304 spin_lock_irqsave(&udc->lock, flags);
1305 udc->softconnect = (is_on != 0);
1306 if (can_pullup(udc))
1307 pullup_enable(udc);
1309 pullup_disable(udc);
1310 spin_unlock_irqrestore(&udc->lock, flags);
1331 /* dequeue ALL requests; caller holds udc->lock */
1352 /* caller holds udc->lock */
1353 static void udc_quiesce(struct omap_udc *udc)
1357 udc->gadget.speed = USB_SPEED_UNKNOWN;
1358 nuke(&udc->ep[0], -ESHUTDOWN);
1359 list_for_each_entry(ep, &udc->gadget.ep_list, ep.ep_list)
1365 static void update_otg(struct omap_udc *udc)
1369 if (!gadget_is_otg(&udc->gadget))
1377 udc->gadget.b_hnp_enable = !!(devstat & UDC_B_HNP_ENABLE);
1378 udc->gadget.a_hnp_support = !!(devstat & UDC_A_HNP_SUPPORT);
1379 udc->gadget.a_alt_hnp_support = !!(devstat & UDC_A_ALT_HNP_SUPPORT);
1384 if (udc->gadget.b_hnp_enable) {
1394 static void ep0_irq(struct omap_udc *udc, u16 irq_src)
1396 struct omap_ep *ep0 = &udc->ep[0];
1433 if (udc->ep0_in) {
1440 if (!req && udc->ep0_pending) {
1445 udc->ep0_pending = 0;
1470 if (!udc->ep0_in) {
1478 udc->ep0_pending = 0;
1493 udc->ep0_pending = 0;
1537 udc->ep0_in = (u.r.bRequestType & USB_DIR_IN) != 0;
1538 udc->ep0_set_config = 0;
1539 udc->ep0_pending = 1;
1544 /* udc needs to know when ep != 0 is valid */
1549 udc->ep0_set_config = 1;
1550 udc->ep0_reset_config = (w_value == 0);
1553 /* update udc NOW since gadget driver may start
1557 if (udc->ep0_reset_config)
1561 update_otg(udc);
1570 ep = &udc->ep[w_index & 0xf];
1578 omap_writew(udc->clr_halt, UDC_CTRL);
1599 ep = &udc->ep[w_index & 0xf];
1623 udc->ep0_pending = 0;
1635 ep = &udc->ep[w_index & 0xf];
1670 if (!udc->ep0_in && w_length) {
1698 udc->ep0_setup = 1;
1699 spin_unlock(&udc->lock);
1700 status = udc->driver->setup(&udc->gadget, &u.r);
1701 spin_lock(&udc->lock);
1702 udc->ep0_setup = 0;
1709 if (udc->ep0_set_config) {
1710 if (udc->ep0_reset_config)
1716 udc->ep0_pending = 0;
1725 static void devstate_irq(struct omap_udc *udc, u16 irq_src)
1730 change = devstat ^ udc->devstat;
1731 udc->devstat = devstat;
1734 udc_quiesce(udc);
1741 udc->gadget.speed = USB_SPEED_FULL;
1743 if (IS_ERR_OR_NULL(udc->transceiver))
1744 pullup_enable(udc);
1746 } else if (udc->gadget.speed != USB_SPEED_UNKNOWN) {
1747 udc->gadget.speed = USB_SPEED_UNKNOWN;
1748 if (IS_ERR_OR_NULL(udc->transceiver))
1749 pullup_disable(udc);
1751 udc->driver->driver.name);
1752 if (udc->driver->disconnect) {
1753 spin_unlock(&udc->lock);
1754 udc->driver->disconnect(&udc->gadget);
1755 spin_lock(&udc->lock);
1765 udc->gadget.speed = USB_SPEED_FULL;
1767 udc->driver->driver.name);
1776 if (udc->gadget.speed != USB_SPEED_UNKNOWN) {
1780 update_otg(udc);
1782 if (udc->gadget.speed == USB_SPEED_FULL
1783 && udc->driver->suspend) {
1784 spin_unlock(&udc->lock);
1785 udc->driver->suspend(&udc->gadget);
1786 spin_lock(&udc->lock);
1788 if (!IS_ERR_OR_NULL(udc->transceiver))
1790 udc->transceiver, 1);
1793 if (!IS_ERR_OR_NULL(udc->transceiver))
1795 udc->transceiver, 0);
1796 if (udc->gadget.speed == USB_SPEED_FULL
1797 && udc->driver->resume) {
1798 spin_unlock(&udc->lock);
1799 udc->driver->resume(&udc->gadget);
1800 spin_lock(&udc->lock);
1807 update_otg(udc);
1821 struct omap_udc *udc = _udc;
1826 spin_lock_irqsave(&udc->lock, flags);
1853 spin_unlock_irqrestore(&udc->lock, flags);
1868 spin_lock_irqsave(&ep->udc->lock, flags);
1888 spin_unlock_irqrestore(&ep->udc->lock, flags);
1897 struct omap_udc *udc = _dev;
1901 spin_lock_irqsave(&udc->lock, flags);
1910 ep = &udc->ep[epnum];
1946 ep = &udc->ep[16 + epnum];
1965 spin_unlock_irqrestore(&udc->lock, flags);
1972 struct omap_udc *udc = _dev;
1977 spin_lock_irqsave(&udc->lock, flags);
1980 list_for_each_entry(ep, &udc->iso, iso) {
2030 spin_unlock_irqrestore(&udc->lock, flags);
2051 spin_lock_irqsave(&udc->lock, flags);
2053 list_for_each_entry(ep, &udc->gadget.ep_list, ep.ep_list) {
2060 udc->ep0_pending = 0;
2061 udc->ep[0].irqs = 0;
2062 udc->softconnect = 1;
2065 udc->driver = driver;
2066 spin_unlock_irqrestore(&udc->lock, flags);
2068 if (udc->dc_clk != NULL)
2074 if (!IS_ERR_OR_NULL(udc->transceiver)) {
2075 status = otg_set_peripheral(udc->transceiver->otg,
2076 &udc->gadget);
2079 udc->driver = NULL;
2084 if (can_pullup(udc))
2085 pullup_enable(udc);
2087 pullup_disable(udc);
2094 omap_vbus_session(&udc->gadget, 1);
2097 if (udc->dc_clk != NULL)
2107 if (udc->dc_clk != NULL)
2111 omap_vbus_session(&udc->gadget, 0);
2113 if (!IS_ERR_OR_NULL(udc->transceiver))
2114 (void) otg_set_peripheral(udc->transceiver->otg, NULL);
2116 pullup_disable(udc);
2118 spin_lock_irqsave(&udc->lock, flags);
2119 udc_quiesce(udc);
2120 spin_unlock_irqrestore(&udc->lock, flags);
2122 udc->driver = NULL;
2124 if (udc->dc_clk != NULL)
2136 static const char proc_filename[] = "driver/udc";
2300 spin_lock_irqsave(&udc->lock, flags);
2316 udc->driver ? udc->driver->driver.name : "(none)",
2318 udc->transceiver
2319 ? udc->transceiver->label
2346 spin_unlock_irqrestore(&udc->lock, flags);
2423 proc_ep_show(s, &udc->ep[0]);
2425 list_for_each_entry(ep, &udc->gadget.ep_list,
2432 spin_unlock_irqrestore(&udc->lock, flags);
2471 ep = &udc->ep[addr & 0xf];
2562 ep->udc = udc;
2590 list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list);
2597 pullup_disable(udc);
2598 if (!IS_ERR_OR_NULL(udc->transceiver)) {
2599 usb_put_phy(udc->transceiver);
2600 udc->transceiver = NULL;
2604 if (udc->dc_clk) {
2605 if (udc->clk_requested)
2607 clk_unprepare(udc->hhc_clk);
2608 clk_unprepare(udc->dc_clk);
2609 clk_put(udc->hhc_clk);
2610 clk_put(udc->dc_clk);
2612 if (udc->done)
2613 complete(udc->done);
2614 kfree(udc);
2633 udc = kzalloc(sizeof(*udc), GFP_KERNEL);
2634 if (!udc)
2637 spin_lock_init(&udc->lock);
2639 udc->gadget.ops = &omap_gadget_ops;
2640 udc->gadget.ep0 = &udc->ep[0].ep;
2641 INIT_LIST_HEAD(&udc->gadget.ep_list);
2642 INIT_LIST_HEAD(&udc->iso);
2643 udc->gadget.speed = USB_SPEED_UNKNOWN;
2644 udc->gadget.max_speed = USB_SPEED_FULL;
2645 udc->gadget.name = driver_name;
2646 udc->gadget.quirk_ep_out_aligned_size = 1;
2647 udc->transceiver = xceiv;
2652 list_del_init(&udc->ep[0].ep.ep_list);
2861 /* "udc" is now valid */
2862 pullup_disable(udc);
2864 udc->gadget.is_otg = (config->otg != 0);
2869 udc->clr_halt = UDC_RESET_EP | UDC_CLRDATA_TOGGLE;
2871 udc->clr_halt = UDC_RESET_EP;
2875 omap_udc_irq, 0, driver_name, udc);
2884 omap_udc_pio_irq, 0, "omap_udc pio", udc);
2892 omap_udc_iso_irq, 0, "omap_udc iso", udc);
2900 udc->dc_clk = dc_clk;
2901 udc->hhc_clk = hhc_clk;
2907 return usb_add_gadget_udc_release(&pdev->dev, &udc->gadget,
2911 kfree(udc);
2912 udc = NULL;
2935 udc->done = &done;
2937 usb_del_gadget_udc(&udc->gadget);
2967 omap_pullup(&udc->gadget, 0);
2976 omap_pullup(&udc->gadget, 1);
2980 return omap_wakeup(&udc->gadget);