aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget/udc
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/gadget/udc')
-rw-r--r--drivers/usb/gadget/udc/atmel_usba_udc.c6
-rw-r--r--drivers/usb/gadget/udc/bdc/bdc_ep.c2
-rw-r--r--drivers/usb/gadget/udc/fotg210-udc.c3
-rw-r--r--drivers/usb/gadget/udc/mv_udc_core.c2
-rw-r--r--drivers/usb/gadget/udc/net2280.c140
-rw-r--r--drivers/usb/gadget/udc/s3c2410_udc.c28
-rw-r--r--drivers/usb/gadget/udc/udc-core.c15
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
2207static int usba_udc_suspend(struct device *dev) 2207static 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
1185err_add_udc: 1185err_add_udc:
1186err_irq:
1187 free_irq(ires->start, fotg210); 1186 free_irq(ires->start, fotg210);
1188 1187
1189err_req: 1188err_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
126static void ep_clear_seqnum(struct net2280_ep *ep);
127static void stop_activity(struct net2280 *dev,
128 struct usb_gadget_driver *driver);
129static void ep0_start(struct net2280 *dev);
130
126/*-------------------------------------------------------------------------*/ 131/*-------------------------------------------------------------------------*/
127static inline void enable_pciirqenb(struct net2280_ep *ep) 132static 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
446static void nuke(struct net2280_ep *); 476static 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
2922static 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
2877static void handle_stat0_irqs(struct net2280 *dev, u32 stat) 2942static 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
3100next_endpoints: 3165next_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
93static uint32_t s3c2410_ticks = 0; 93static uint32_t s3c2410_ticks = 0;
94 94
95static int dprintk(int level, const char *fmt, ...) 95__printf(2, 3)
96static 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
124static int dprintk(int level, const char *fmt, ...) 121__printf(2, 3)
122static void dprintk(int level, const char *fmt, ...)
125{ 123{
126 return 0;
127} 124}
128#endif 125#endif
126
129static int s3c2410_udc_debugfs_seq_show(struct seq_file *m, void *p) 127static 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);
60int usb_gadget_map_request(struct usb_gadget *gadget, 60int 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
322err3: 324err3:
323 put_device(&udc->dev); 325 put_device(&udc->dev);
326 device_del(&gadget->dev);
324 327
325err2: 328err2:
326 put_device(&gadget->dev); 329 put_device(&gadget->dev);