diff options
Diffstat (limited to 'drivers/usb/gadget/udc')
| -rw-r--r-- | drivers/usb/gadget/udc/atmel_usba_udc.c | 6 | ||||
| -rw-r--r-- | drivers/usb/gadget/udc/bdc/bdc_ep.c | 2 | ||||
| -rw-r--r-- | drivers/usb/gadget/udc/fotg210-udc.c | 3 | ||||
| -rw-r--r-- | drivers/usb/gadget/udc/mv_udc_core.c | 2 | ||||
| -rw-r--r-- | drivers/usb/gadget/udc/net2280.c | 140 | ||||
| -rw-r--r-- | drivers/usb/gadget/udc/s3c2410_udc.c | 28 | ||||
| -rw-r--r-- | drivers/usb/gadget/udc/udc-core.c | 15 |
7 files changed, 136 insertions, 60 deletions
diff --git a/drivers/usb/gadget/udc/atmel_usba_udc.c b/drivers/usb/gadget/udc/atmel_usba_udc.c index 351d48550c33..4095cce05e6a 100644 --- a/drivers/usb/gadget/udc/atmel_usba_udc.c +++ b/drivers/usb/gadget/udc/atmel_usba_udc.c | |||
| @@ -704,8 +704,8 @@ static int queue_dma(struct usba_udc *udc, struct usba_ep *ep, | |||
| 704 | unsigned long flags; | 704 | unsigned long flags; |
| 705 | int ret; | 705 | int ret; |
| 706 | 706 | ||
| 707 | DBG(DBG_DMA, "%s: req l/%u d/%08x %c%c%c\n", | 707 | DBG(DBG_DMA, "%s: req l/%u d/%pad %c%c%c\n", |
| 708 | ep->ep.name, req->req.length, req->req.dma, | 708 | ep->ep.name, req->req.length, &req->req.dma, |
| 709 | req->req.zero ? 'Z' : 'z', | 709 | req->req.zero ? 'Z' : 'z', |
| 710 | req->req.short_not_ok ? 'S' : 's', | 710 | req->req.short_not_ok ? 'S' : 's', |
| 711 | req->req.no_interrupt ? 'I' : 'i'); | 711 | req->req.no_interrupt ? 'I' : 'i'); |
| @@ -2203,7 +2203,7 @@ static int usba_udc_remove(struct platform_device *pdev) | |||
| 2203 | return 0; | 2203 | return 0; |
| 2204 | } | 2204 | } |
| 2205 | 2205 | ||
| 2206 | #ifdef CONFIG_PM | 2206 | #ifdef CONFIG_PM_SLEEP |
| 2207 | static int usba_udc_suspend(struct device *dev) | 2207 | static int usba_udc_suspend(struct device *dev) |
| 2208 | { | 2208 | { |
| 2209 | struct usba_udc *udc = dev_get_drvdata(dev); | 2209 | struct usba_udc *udc = dev_get_drvdata(dev); |
diff --git a/drivers/usb/gadget/udc/bdc/bdc_ep.c b/drivers/usb/gadget/udc/bdc/bdc_ep.c index b04980cf6dc4..1efa61265d8d 100644 --- a/drivers/usb/gadget/udc/bdc/bdc_ep.c +++ b/drivers/usb/gadget/udc/bdc/bdc_ep.c | |||
| @@ -779,7 +779,7 @@ static int ep_dequeue(struct bdc_ep *ep, struct bdc_req *req) | |||
| 779 | /* The current hw dequeue pointer */ | 779 | /* The current hw dequeue pointer */ |
| 780 | tmp_32 = bdc_readl(bdc->regs, BDC_EPSTS0(0)); | 780 | tmp_32 = bdc_readl(bdc->regs, BDC_EPSTS0(0)); |
| 781 | deq_ptr_64 = tmp_32; | 781 | deq_ptr_64 = tmp_32; |
| 782 | tmp_32 = bdc_readl(bdc->regs, BDC_EPSTS0(1)); | 782 | tmp_32 = bdc_readl(bdc->regs, BDC_EPSTS1(0)); |
| 783 | deq_ptr_64 |= ((u64)tmp_32 << 32); | 783 | deq_ptr_64 |= ((u64)tmp_32 << 32); |
| 784 | 784 | ||
| 785 | /* we have the dma addr of next bd that will be fetched by hardware */ | 785 | /* we have the dma addr of next bd that will be fetched by hardware */ |
diff --git a/drivers/usb/gadget/udc/fotg210-udc.c b/drivers/usb/gadget/udc/fotg210-udc.c index e547ea7f56b1..1137e3384218 100644 --- a/drivers/usb/gadget/udc/fotg210-udc.c +++ b/drivers/usb/gadget/udc/fotg210-udc.c | |||
| @@ -1171,7 +1171,7 @@ static int fotg210_udc_probe(struct platform_device *pdev) | |||
| 1171 | udc_name, fotg210); | 1171 | udc_name, fotg210); |
| 1172 | if (ret < 0) { | 1172 | if (ret < 0) { |
| 1173 | pr_err("request_irq error (%d)\n", ret); | 1173 | pr_err("request_irq error (%d)\n", ret); |
| 1174 | goto err_irq; | 1174 | goto err_req; |
| 1175 | } | 1175 | } |
| 1176 | 1176 | ||
| 1177 | ret = usb_add_gadget_udc(&pdev->dev, &fotg210->gadget); | 1177 | ret = usb_add_gadget_udc(&pdev->dev, &fotg210->gadget); |
| @@ -1183,7 +1183,6 @@ static int fotg210_udc_probe(struct platform_device *pdev) | |||
| 1183 | return 0; | 1183 | return 0; |
| 1184 | 1184 | ||
| 1185 | err_add_udc: | 1185 | err_add_udc: |
| 1186 | err_irq: | ||
| 1187 | free_irq(ires->start, fotg210); | 1186 | free_irq(ires->start, fotg210); |
| 1188 | 1187 | ||
| 1189 | err_req: | 1188 | err_req: |
diff --git a/drivers/usb/gadget/udc/mv_udc_core.c b/drivers/usb/gadget/udc/mv_udc_core.c index d32160d6463f..5da37c957b53 100644 --- a/drivers/usb/gadget/udc/mv_udc_core.c +++ b/drivers/usb/gadget/udc/mv_udc_core.c | |||
| @@ -2167,7 +2167,7 @@ static int mv_udc_probe(struct platform_device *pdev) | |||
| 2167 | return -ENODEV; | 2167 | return -ENODEV; |
| 2168 | } | 2168 | } |
| 2169 | 2169 | ||
| 2170 | udc->phy_regs = ioremap(r->start, resource_size(r)); | 2170 | udc->phy_regs = devm_ioremap(&pdev->dev, r->start, resource_size(r)); |
| 2171 | if (udc->phy_regs == NULL) { | 2171 | if (udc->phy_regs == NULL) { |
| 2172 | dev_err(&pdev->dev, "failed to map phy I/O memory\n"); | 2172 | dev_err(&pdev->dev, "failed to map phy I/O memory\n"); |
| 2173 | return -EBUSY; | 2173 | return -EBUSY; |
diff --git a/drivers/usb/gadget/udc/net2280.c b/drivers/usb/gadget/udc/net2280.c index 9871b90195ad..2bee912ca65b 100644 --- a/drivers/usb/gadget/udc/net2280.c +++ b/drivers/usb/gadget/udc/net2280.c | |||
| @@ -123,6 +123,11 @@ static char *type_string(u8 bmAttributes) | |||
| 123 | #define valid_bit cpu_to_le32(BIT(VALID_BIT)) | 123 | #define valid_bit cpu_to_le32(BIT(VALID_BIT)) |
| 124 | #define dma_done_ie cpu_to_le32(BIT(DMA_DONE_INTERRUPT_ENABLE)) | 124 | #define dma_done_ie cpu_to_le32(BIT(DMA_DONE_INTERRUPT_ENABLE)) |
| 125 | 125 | ||
| 126 | static void ep_clear_seqnum(struct net2280_ep *ep); | ||
| 127 | static void stop_activity(struct net2280 *dev, | ||
| 128 | struct usb_gadget_driver *driver); | ||
| 129 | static void ep0_start(struct net2280 *dev); | ||
| 130 | |||
| 126 | /*-------------------------------------------------------------------------*/ | 131 | /*-------------------------------------------------------------------------*/ |
| 127 | static inline void enable_pciirqenb(struct net2280_ep *ep) | 132 | static inline void enable_pciirqenb(struct net2280_ep *ep) |
| 128 | { | 133 | { |
| @@ -142,7 +147,9 @@ net2280_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | |||
| 142 | { | 147 | { |
| 143 | struct net2280 *dev; | 148 | struct net2280 *dev; |
| 144 | struct net2280_ep *ep; | 149 | struct net2280_ep *ep; |
| 145 | u32 max, tmp; | 150 | u32 max; |
| 151 | u32 tmp = 0; | ||
| 152 | u32 type; | ||
| 146 | unsigned long flags; | 153 | unsigned long flags; |
| 147 | static const u32 ep_key[9] = { 1, 0, 1, 0, 1, 1, 0, 1, 0 }; | 154 | static const u32 ep_key[9] = { 1, 0, 1, 0, 1, 1, 0, 1, 0 }; |
| 148 | int ret = 0; | 155 | int ret = 0; |
| @@ -198,15 +205,29 @@ net2280_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | |||
| 198 | 205 | ||
| 199 | /* set type, direction, address; reset fifo counters */ | 206 | /* set type, direction, address; reset fifo counters */ |
| 200 | writel(BIT(FIFO_FLUSH), &ep->regs->ep_stat); | 207 | writel(BIT(FIFO_FLUSH), &ep->regs->ep_stat); |
| 201 | tmp = (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK); | 208 | |
| 202 | if (tmp == USB_ENDPOINT_XFER_INT) { | 209 | if ((dev->quirks & PLX_SUPERSPEED) && dev->enhanced_mode) { |
| 210 | tmp = readl(&ep->cfg->ep_cfg); | ||
| 211 | /* If USB ep number doesn't match hardware ep number */ | ||
| 212 | if ((tmp & 0xf) != usb_endpoint_num(desc)) { | ||
| 213 | ret = -EINVAL; | ||
| 214 | spin_unlock_irqrestore(&dev->lock, flags); | ||
| 215 | goto print_err; | ||
| 216 | } | ||
| 217 | if (ep->is_in) | ||
| 218 | tmp &= ~USB3380_EP_CFG_MASK_IN; | ||
| 219 | else | ||
| 220 | tmp &= ~USB3380_EP_CFG_MASK_OUT; | ||
| 221 | } | ||
| 222 | type = (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK); | ||
| 223 | if (type == USB_ENDPOINT_XFER_INT) { | ||
| 203 | /* erratum 0105 workaround prevents hs NYET */ | 224 | /* erratum 0105 workaround prevents hs NYET */ |
| 204 | if (dev->chiprev == 0100 && | 225 | if (dev->chiprev == 0100 && |
| 205 | dev->gadget.speed == USB_SPEED_HIGH && | 226 | dev->gadget.speed == USB_SPEED_HIGH && |
| 206 | !(desc->bEndpointAddress & USB_DIR_IN)) | 227 | !(desc->bEndpointAddress & USB_DIR_IN)) |
| 207 | writel(BIT(CLEAR_NAK_OUT_PACKETS_MODE), | 228 | writel(BIT(CLEAR_NAK_OUT_PACKETS_MODE), |
| 208 | &ep->regs->ep_rsp); | 229 | &ep->regs->ep_rsp); |
| 209 | } else if (tmp == USB_ENDPOINT_XFER_BULK) { | 230 | } else if (type == USB_ENDPOINT_XFER_BULK) { |
| 210 | /* catch some particularly blatant driver bugs */ | 231 | /* catch some particularly blatant driver bugs */ |
| 211 | if ((dev->gadget.speed == USB_SPEED_SUPER && max != 1024) || | 232 | if ((dev->gadget.speed == USB_SPEED_SUPER && max != 1024) || |
| 212 | (dev->gadget.speed == USB_SPEED_HIGH && max != 512) || | 233 | (dev->gadget.speed == USB_SPEED_HIGH && max != 512) || |
| @@ -216,10 +237,10 @@ net2280_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | |||
| 216 | goto print_err; | 237 | goto print_err; |
| 217 | } | 238 | } |
| 218 | } | 239 | } |
| 219 | ep->is_iso = (tmp == USB_ENDPOINT_XFER_ISOC); | 240 | ep->is_iso = (type == USB_ENDPOINT_XFER_ISOC); |
| 220 | /* Enable this endpoint */ | 241 | /* Enable this endpoint */ |
| 221 | if (dev->quirks & PLX_LEGACY) { | 242 | if (dev->quirks & PLX_LEGACY) { |
| 222 | tmp <<= ENDPOINT_TYPE; | 243 | tmp |= type << ENDPOINT_TYPE; |
| 223 | tmp |= desc->bEndpointAddress; | 244 | tmp |= desc->bEndpointAddress; |
| 224 | /* default full fifo lines */ | 245 | /* default full fifo lines */ |
| 225 | tmp |= (4 << ENDPOINT_BYTE_COUNT); | 246 | tmp |= (4 << ENDPOINT_BYTE_COUNT); |
| @@ -228,17 +249,17 @@ net2280_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | |||
| 228 | } else { | 249 | } else { |
| 229 | /* In Legacy mode, only OUT endpoints are used */ | 250 | /* In Legacy mode, only OUT endpoints are used */ |
| 230 | if (dev->enhanced_mode && ep->is_in) { | 251 | if (dev->enhanced_mode && ep->is_in) { |
| 231 | tmp <<= IN_ENDPOINT_TYPE; | 252 | tmp |= type << IN_ENDPOINT_TYPE; |
| 232 | tmp |= BIT(IN_ENDPOINT_ENABLE); | 253 | tmp |= BIT(IN_ENDPOINT_ENABLE); |
| 233 | /* Not applicable to Legacy */ | ||
| 234 | tmp |= BIT(ENDPOINT_DIRECTION); | ||
| 235 | } else { | 254 | } else { |
| 236 | tmp <<= OUT_ENDPOINT_TYPE; | 255 | tmp |= type << OUT_ENDPOINT_TYPE; |
| 237 | tmp |= BIT(OUT_ENDPOINT_ENABLE); | 256 | tmp |= BIT(OUT_ENDPOINT_ENABLE); |
| 238 | tmp |= (ep->is_in << ENDPOINT_DIRECTION); | 257 | tmp |= (ep->is_in << ENDPOINT_DIRECTION); |
| 239 | } | 258 | } |
| 240 | 259 | ||
| 241 | tmp |= usb_endpoint_num(desc); | 260 | tmp |= (4 << ENDPOINT_BYTE_COUNT); |
| 261 | if (!dev->enhanced_mode) | ||
| 262 | tmp |= usb_endpoint_num(desc); | ||
| 242 | tmp |= (ep->ep.maxburst << MAX_BURST_SIZE); | 263 | tmp |= (ep->ep.maxburst << MAX_BURST_SIZE); |
| 243 | } | 264 | } |
| 244 | 265 | ||
| @@ -256,6 +277,8 @@ net2280_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | |||
| 256 | BIT(CLEAR_NAK_OUT_PACKETS_MODE), &ep->regs->ep_rsp); | 277 | BIT(CLEAR_NAK_OUT_PACKETS_MODE), &ep->regs->ep_rsp); |
| 257 | } | 278 | } |
| 258 | 279 | ||
| 280 | if (dev->quirks & PLX_SUPERSPEED) | ||
| 281 | ep_clear_seqnum(ep); | ||
| 259 | writel(tmp, &ep->cfg->ep_cfg); | 282 | writel(tmp, &ep->cfg->ep_cfg); |
| 260 | 283 | ||
| 261 | /* enable irqs */ | 284 | /* enable irqs */ |
| @@ -441,6 +464,13 @@ static void ep_reset_338x(struct net2280_regs __iomem *regs, | |||
| 441 | BIT(DATA_PACKET_TRANSMITTED_INTERRUPT) | | 464 | BIT(DATA_PACKET_TRANSMITTED_INTERRUPT) | |
| 442 | BIT(DATA_OUT_PING_TOKEN_INTERRUPT) | | 465 | BIT(DATA_OUT_PING_TOKEN_INTERRUPT) | |
| 443 | BIT(DATA_IN_TOKEN_INTERRUPT), &ep->regs->ep_stat); | 466 | BIT(DATA_IN_TOKEN_INTERRUPT), &ep->regs->ep_stat); |
| 467 | |||
| 468 | tmp = readl(&ep->cfg->ep_cfg); | ||
| 469 | if (ep->is_in) | ||
| 470 | tmp &= ~USB3380_EP_CFG_MASK_IN; | ||
| 471 | else | ||
| 472 | tmp &= ~USB3380_EP_CFG_MASK_OUT; | ||
| 473 | writel(tmp, &ep->cfg->ep_cfg); | ||
| 444 | } | 474 | } |
| 445 | 475 | ||
| 446 | static void nuke(struct net2280_ep *); | 476 | static void nuke(struct net2280_ep *); |
| @@ -1468,11 +1498,14 @@ static int net2280_pullup(struct usb_gadget *_gadget, int is_on) | |||
| 1468 | spin_lock_irqsave(&dev->lock, flags); | 1498 | spin_lock_irqsave(&dev->lock, flags); |
| 1469 | tmp = readl(&dev->usb->usbctl); | 1499 | tmp = readl(&dev->usb->usbctl); |
| 1470 | dev->softconnect = (is_on != 0); | 1500 | dev->softconnect = (is_on != 0); |
| 1471 | if (is_on) | 1501 | if (is_on) { |
| 1472 | tmp |= BIT(USB_DETECT_ENABLE); | 1502 | ep0_start(dev); |
| 1473 | else | 1503 | writel(tmp | BIT(USB_DETECT_ENABLE), &dev->usb->usbctl); |
| 1474 | tmp &= ~BIT(USB_DETECT_ENABLE); | 1504 | } else { |
| 1475 | writel(tmp, &dev->usb->usbctl); | 1505 | writel(tmp & ~BIT(USB_DETECT_ENABLE), &dev->usb->usbctl); |
| 1506 | stop_activity(dev, dev->driver); | ||
| 1507 | } | ||
| 1508 | |||
| 1476 | spin_unlock_irqrestore(&dev->lock, flags); | 1509 | spin_unlock_irqrestore(&dev->lock, flags); |
| 1477 | 1510 | ||
| 1478 | return 0; | 1511 | return 0; |
| @@ -1860,8 +1893,8 @@ static void defect7374_enable_data_eps_zero(struct net2280 *dev) | |||
| 1860 | tmp = ((0 << ENDPOINT_NUMBER) | BIT(ENDPOINT_DIRECTION) | | 1893 | tmp = ((0 << ENDPOINT_NUMBER) | BIT(ENDPOINT_DIRECTION) | |
| 1861 | (2 << OUT_ENDPOINT_TYPE) | (2 << IN_ENDPOINT_TYPE) | | 1894 | (2 << OUT_ENDPOINT_TYPE) | (2 << IN_ENDPOINT_TYPE) | |
| 1862 | ((dev->enhanced_mode) ? | 1895 | ((dev->enhanced_mode) ? |
| 1863 | BIT(OUT_ENDPOINT_ENABLE) : BIT(ENDPOINT_ENABLE)) | | 1896 | BIT(OUT_ENDPOINT_ENABLE) | BIT(IN_ENDPOINT_ENABLE) : |
| 1864 | BIT(IN_ENDPOINT_ENABLE)); | 1897 | BIT(ENDPOINT_ENABLE))); |
| 1865 | 1898 | ||
| 1866 | for (i = 1; i < 5; i++) | 1899 | for (i = 1; i < 5; i++) |
| 1867 | writel(tmp, &dev->ep[i].cfg->ep_cfg); | 1900 | writel(tmp, &dev->ep[i].cfg->ep_cfg); |
| @@ -1975,9 +2008,15 @@ static void usb_reset_338x(struct net2280 *dev) | |||
| 1975 | /* clear old dma and irq state */ | 2008 | /* clear old dma and irq state */ |
| 1976 | for (tmp = 0; tmp < 4; tmp++) { | 2009 | for (tmp = 0; tmp < 4; tmp++) { |
| 1977 | struct net2280_ep *ep = &dev->ep[tmp + 1]; | 2010 | struct net2280_ep *ep = &dev->ep[tmp + 1]; |
| 2011 | struct net2280_dma_regs __iomem *dma; | ||
| 1978 | 2012 | ||
| 1979 | if (ep->dma) | 2013 | if (ep->dma) { |
| 1980 | abort_dma(ep); | 2014 | abort_dma(ep); |
| 2015 | } else { | ||
| 2016 | dma = &dev->dma[tmp]; | ||
| 2017 | writel(BIT(DMA_ABORT), &dma->dmastat); | ||
| 2018 | writel(0, &dma->dmactl); | ||
| 2019 | } | ||
| 1981 | } | 2020 | } |
| 1982 | 2021 | ||
| 1983 | writel(~0, &dev->regs->irqstat0), writel(~0, &dev->regs->irqstat1); | 2022 | writel(~0, &dev->regs->irqstat0), writel(~0, &dev->regs->irqstat1); |
| @@ -2065,6 +2104,12 @@ static void usb_reinit_338x(struct net2280 *dev) | |||
| 2065 | 2104 | ||
| 2066 | if (dev->enhanced_mode) { | 2105 | if (dev->enhanced_mode) { |
| 2067 | ep->cfg = &dev->epregs[ne[i]]; | 2106 | ep->cfg = &dev->epregs[ne[i]]; |
| 2107 | /* | ||
| 2108 | * Set USB endpoint number, hardware allows same number | ||
| 2109 | * in both directions. | ||
| 2110 | */ | ||
| 2111 | if (i > 0 && i < 5) | ||
| 2112 | writel(ne[i], &ep->cfg->ep_cfg); | ||
| 2068 | ep->regs = (struct net2280_ep_regs __iomem *) | 2113 | ep->regs = (struct net2280_ep_regs __iomem *) |
| 2069 | (((void __iomem *)&dev->epregs[ne[i]]) + | 2114 | (((void __iomem *)&dev->epregs[ne[i]]) + |
| 2070 | ep_reg_addr[i]); | 2115 | ep_reg_addr[i]); |
| @@ -2874,6 +2919,26 @@ next_endpoints3: | |||
| 2874 | return; | 2919 | return; |
| 2875 | } | 2920 | } |
| 2876 | 2921 | ||
| 2922 | static void usb338x_handle_ep_intr(struct net2280 *dev, u32 stat0) | ||
| 2923 | { | ||
| 2924 | u32 index; | ||
| 2925 | u32 bit; | ||
| 2926 | |||
| 2927 | for (index = 0; index < ARRAY_SIZE(ep_bit); index++) { | ||
| 2928 | bit = BIT(ep_bit[index]); | ||
| 2929 | |||
| 2930 | if (!stat0) | ||
| 2931 | break; | ||
| 2932 | |||
| 2933 | if (!(stat0 & bit)) | ||
| 2934 | continue; | ||
| 2935 | |||
| 2936 | stat0 &= ~bit; | ||
| 2937 | |||
| 2938 | handle_ep_small(&dev->ep[index]); | ||
| 2939 | } | ||
| 2940 | } | ||
| 2941 | |||
| 2877 | static void handle_stat0_irqs(struct net2280 *dev, u32 stat) | 2942 | static void handle_stat0_irqs(struct net2280 *dev, u32 stat) |
| 2878 | { | 2943 | { |
| 2879 | struct net2280_ep *ep; | 2944 | struct net2280_ep *ep; |
| @@ -3098,20 +3163,31 @@ do_stall: | |||
| 3098 | #undef w_length | 3163 | #undef w_length |
| 3099 | 3164 | ||
| 3100 | next_endpoints: | 3165 | next_endpoints: |
| 3101 | /* endpoint data irq ? */ | 3166 | if ((dev->quirks & PLX_SUPERSPEED) && dev->enhanced_mode) { |
| 3102 | scratch = stat & 0x7f; | 3167 | u32 mask = (BIT(ENDPOINT_0_INTERRUPT) | |
| 3103 | stat &= ~0x7f; | 3168 | USB3380_IRQSTAT0_EP_INTR_MASK_IN | |
| 3104 | for (num = 0; scratch; num++) { | 3169 | USB3380_IRQSTAT0_EP_INTR_MASK_OUT); |
| 3105 | u32 t; | 3170 | |
| 3106 | 3171 | if (stat & mask) { | |
| 3107 | /* do this endpoint's FIFO and queue need tending? */ | 3172 | usb338x_handle_ep_intr(dev, stat & mask); |
| 3108 | t = BIT(num); | 3173 | stat &= ~mask; |
| 3109 | if ((scratch & t) == 0) | 3174 | } |
| 3110 | continue; | 3175 | } else { |
| 3111 | scratch ^= t; | 3176 | /* endpoint data irq ? */ |
| 3177 | scratch = stat & 0x7f; | ||
| 3178 | stat &= ~0x7f; | ||
| 3179 | for (num = 0; scratch; num++) { | ||
| 3180 | u32 t; | ||
| 3181 | |||
| 3182 | /* do this endpoint's FIFO and queue need tending? */ | ||
| 3183 | t = BIT(num); | ||
| 3184 | if ((scratch & t) == 0) | ||
| 3185 | continue; | ||
| 3186 | scratch ^= t; | ||
| 3112 | 3187 | ||
| 3113 | ep = &dev->ep[num]; | 3188 | ep = &dev->ep[num]; |
| 3114 | handle_ep_small(ep); | 3189 | handle_ep_small(ep); |
| 3190 | } | ||
| 3115 | } | 3191 | } |
| 3116 | 3192 | ||
| 3117 | if (stat) | 3193 | if (stat) |
diff --git a/drivers/usb/gadget/udc/s3c2410_udc.c b/drivers/usb/gadget/udc/s3c2410_udc.c index 99fd9a5667df..5d9aa81969b4 100644 --- a/drivers/usb/gadget/udc/s3c2410_udc.c +++ b/drivers/usb/gadget/udc/s3c2410_udc.c | |||
| @@ -92,40 +92,38 @@ static struct s3c2410_udc_mach_info *udc_info; | |||
| 92 | 92 | ||
| 93 | static uint32_t s3c2410_ticks = 0; | 93 | static uint32_t s3c2410_ticks = 0; |
| 94 | 94 | ||
| 95 | static int dprintk(int level, const char *fmt, ...) | 95 | __printf(2, 3) |
| 96 | static void dprintk(int level, const char *fmt, ...) | ||
| 96 | { | 97 | { |
| 97 | static char printk_buf[1024]; | ||
| 98 | static long prevticks; | 98 | static long prevticks; |
| 99 | static int invocation; | 99 | static int invocation; |
| 100 | struct va_format vaf; | ||
| 100 | va_list args; | 101 | va_list args; |
| 101 | int len; | ||
| 102 | 102 | ||
| 103 | if (level > USB_S3C2410_DEBUG_LEVEL) | 103 | if (level > USB_S3C2410_DEBUG_LEVEL) |
| 104 | return 0; | 104 | return; |
| 105 | |||
| 106 | va_start(args, fmt); | ||
| 107 | |||
| 108 | vaf.fmt = fmt; | ||
| 109 | vaf.va = &args; | ||
| 105 | 110 | ||
| 106 | if (s3c2410_ticks != prevticks) { | 111 | if (s3c2410_ticks != prevticks) { |
| 107 | prevticks = s3c2410_ticks; | 112 | prevticks = s3c2410_ticks; |
| 108 | invocation = 0; | 113 | invocation = 0; |
| 109 | } | 114 | } |
| 110 | 115 | ||
| 111 | len = scnprintf(printk_buf, | 116 | pr_debug("%1lu.%02d USB: %pV", prevticks, invocation++, &vaf); |
| 112 | sizeof(printk_buf), "%1lu.%02d USB: ", | ||
| 113 | prevticks, invocation++); | ||
| 114 | 117 | ||
| 115 | va_start(args, fmt); | ||
| 116 | len = vscnprintf(printk_buf+len, | ||
| 117 | sizeof(printk_buf)-len, fmt, args); | ||
| 118 | va_end(args); | 118 | va_end(args); |
| 119 | |||
| 120 | pr_debug("%s", printk_buf); | ||
| 121 | return len; | ||
| 122 | } | 119 | } |
| 123 | #else | 120 | #else |
| 124 | static int dprintk(int level, const char *fmt, ...) | 121 | __printf(2, 3) |
| 122 | static void dprintk(int level, const char *fmt, ...) | ||
| 125 | { | 123 | { |
| 126 | return 0; | ||
| 127 | } | 124 | } |
| 128 | #endif | 125 | #endif |
| 126 | |||
| 129 | static int s3c2410_udc_debugfs_seq_show(struct seq_file *m, void *p) | 127 | static int s3c2410_udc_debugfs_seq_show(struct seq_file *m, void *p) |
| 130 | { | 128 | { |
| 131 | u32 addr_reg, pwr_reg, ep_int_reg, usb_int_reg; | 129 | u32 addr_reg, pwr_reg, ep_int_reg, usb_int_reg; |
diff --git a/drivers/usb/gadget/udc/udc-core.c b/drivers/usb/gadget/udc/udc-core.c index d69c35558f68..89ed5e71a199 100644 --- a/drivers/usb/gadget/udc/udc-core.c +++ b/drivers/usb/gadget/udc/udc-core.c | |||
| @@ -60,13 +60,15 @@ static DEFINE_MUTEX(udc_lock); | |||
| 60 | int usb_gadget_map_request(struct usb_gadget *gadget, | 60 | int usb_gadget_map_request(struct usb_gadget *gadget, |
| 61 | struct usb_request *req, int is_in) | 61 | struct usb_request *req, int is_in) |
| 62 | { | 62 | { |
| 63 | struct device *dev = gadget->dev.parent; | ||
| 64 | |||
| 63 | if (req->length == 0) | 65 | if (req->length == 0) |
| 64 | return 0; | 66 | return 0; |
| 65 | 67 | ||
| 66 | if (req->num_sgs) { | 68 | if (req->num_sgs) { |
| 67 | int mapped; | 69 | int mapped; |
| 68 | 70 | ||
| 69 | mapped = dma_map_sg(&gadget->dev, req->sg, req->num_sgs, | 71 | mapped = dma_map_sg(dev, req->sg, req->num_sgs, |
| 70 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | 72 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); |
| 71 | if (mapped == 0) { | 73 | if (mapped == 0) { |
| 72 | dev_err(&gadget->dev, "failed to map SGs\n"); | 74 | dev_err(&gadget->dev, "failed to map SGs\n"); |
| @@ -75,11 +77,11 @@ int usb_gadget_map_request(struct usb_gadget *gadget, | |||
| 75 | 77 | ||
| 76 | req->num_mapped_sgs = mapped; | 78 | req->num_mapped_sgs = mapped; |
| 77 | } else { | 79 | } else { |
| 78 | req->dma = dma_map_single(&gadget->dev, req->buf, req->length, | 80 | req->dma = dma_map_single(dev, req->buf, req->length, |
| 79 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | 81 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); |
| 80 | 82 | ||
| 81 | if (dma_mapping_error(&gadget->dev, req->dma)) { | 83 | if (dma_mapping_error(dev, req->dma)) { |
| 82 | dev_err(&gadget->dev, "failed to map buffer\n"); | 84 | dev_err(dev, "failed to map buffer\n"); |
| 83 | return -EFAULT; | 85 | return -EFAULT; |
| 84 | } | 86 | } |
| 85 | } | 87 | } |
| @@ -95,12 +97,12 @@ void usb_gadget_unmap_request(struct usb_gadget *gadget, | |||
| 95 | return; | 97 | return; |
| 96 | 98 | ||
| 97 | if (req->num_mapped_sgs) { | 99 | if (req->num_mapped_sgs) { |
| 98 | dma_unmap_sg(&gadget->dev, req->sg, req->num_mapped_sgs, | 100 | dma_unmap_sg(gadget->dev.parent, req->sg, req->num_mapped_sgs, |
| 99 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | 101 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); |
| 100 | 102 | ||
| 101 | req->num_mapped_sgs = 0; | 103 | req->num_mapped_sgs = 0; |
| 102 | } else { | 104 | } else { |
| 103 | dma_unmap_single(&gadget->dev, req->dma, req->length, | 105 | dma_unmap_single(gadget->dev.parent, req->dma, req->length, |
| 104 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | 106 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); |
| 105 | } | 107 | } |
| 106 | } | 108 | } |
| @@ -321,6 +323,7 @@ err4: | |||
| 321 | 323 | ||
| 322 | err3: | 324 | err3: |
| 323 | put_device(&udc->dev); | 325 | put_device(&udc->dev); |
| 326 | device_del(&gadget->dev); | ||
| 324 | 327 | ||
| 325 | err2: | 328 | err2: |
| 326 | put_device(&gadget->dev); | 329 | put_device(&gadget->dev); |
