diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-09-06 05:21:54 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-09-06 05:21:54 -0400 |
| commit | bfa150f37f80fc65ac23dc457faf8eb2cd6232d0 (patch) | |
| tree | db4f11443f9fc72a1fbd57e3fe8e81b97a80a0af /drivers | |
| parent | d8c3916023d438a40cf16b284ee6ae7acab57b64 (diff) | |
| parent | d9707490077bee0c7060ef5665a90656e1078b66 (diff) | |
Merge tag 'fixes-for-v4.19-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-linus
Felipe writes:
usb: fixes for v4.19-rc2
NET2280 got a fix to an old patch attempting to fix locking for gadget
framework callbacks.
DWC2 fixed a bug where driver was attempting to access registers before
clocks were enabled.
DWC3 got a fix for ULPI clock configuration on Baytrail devices.
FOTG210 plugged a memory leak and Renesas USB3 fixed ep0 maxpacket size.
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/usb/dwc2/platform.c | 4 | ||||
| -rw-r--r-- | drivers/usb/dwc3/dwc3-of-simple.c | 10 | ||||
| -rw-r--r-- | drivers/usb/dwc3/dwc3-pci.c | 4 | ||||
| -rw-r--r-- | drivers/usb/gadget/udc/fotg210-udc.c | 15 | ||||
| -rw-r--r-- | drivers/usb/gadget/udc/net2280.c | 16 | ||||
| -rw-r--r-- | drivers/usb/gadget/udc/renesas_usb3.c | 5 |
6 files changed, 36 insertions, 18 deletions
diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c index 9a53a58e676e..577642895b57 100644 --- a/drivers/usb/dwc2/platform.c +++ b/drivers/usb/dwc2/platform.c | |||
| @@ -412,8 +412,6 @@ static int dwc2_driver_probe(struct platform_device *dev) | |||
| 412 | dev_dbg(&dev->dev, "mapped PA %08lx to VA %p\n", | 412 | dev_dbg(&dev->dev, "mapped PA %08lx to VA %p\n", |
| 413 | (unsigned long)res->start, hsotg->regs); | 413 | (unsigned long)res->start, hsotg->regs); |
| 414 | 414 | ||
| 415 | hsotg->needs_byte_swap = dwc2_check_core_endianness(hsotg); | ||
| 416 | |||
| 417 | retval = dwc2_lowlevel_hw_init(hsotg); | 415 | retval = dwc2_lowlevel_hw_init(hsotg); |
| 418 | if (retval) | 416 | if (retval) |
| 419 | return retval; | 417 | return retval; |
| @@ -438,6 +436,8 @@ static int dwc2_driver_probe(struct platform_device *dev) | |||
| 438 | if (retval) | 436 | if (retval) |
| 439 | return retval; | 437 | return retval; |
| 440 | 438 | ||
| 439 | hsotg->needs_byte_swap = dwc2_check_core_endianness(hsotg); | ||
| 440 | |||
| 441 | retval = dwc2_get_dr_mode(hsotg); | 441 | retval = dwc2_get_dr_mode(hsotg); |
| 442 | if (retval) | 442 | if (retval) |
| 443 | goto error; | 443 | goto error; |
diff --git a/drivers/usb/dwc3/dwc3-of-simple.c b/drivers/usb/dwc3/dwc3-of-simple.c index 40bf9e0bbc59..4c2771c5e727 100644 --- a/drivers/usb/dwc3/dwc3-of-simple.c +++ b/drivers/usb/dwc3/dwc3-of-simple.c | |||
| @@ -180,8 +180,7 @@ static int dwc3_of_simple_remove(struct platform_device *pdev) | |||
| 180 | return 0; | 180 | return 0; |
| 181 | } | 181 | } |
| 182 | 182 | ||
| 183 | #ifdef CONFIG_PM | 183 | static int __maybe_unused dwc3_of_simple_runtime_suspend(struct device *dev) |
| 184 | static int dwc3_of_simple_runtime_suspend(struct device *dev) | ||
| 185 | { | 184 | { |
| 186 | struct dwc3_of_simple *simple = dev_get_drvdata(dev); | 185 | struct dwc3_of_simple *simple = dev_get_drvdata(dev); |
| 187 | int i; | 186 | int i; |
| @@ -192,7 +191,7 @@ static int dwc3_of_simple_runtime_suspend(struct device *dev) | |||
| 192 | return 0; | 191 | return 0; |
| 193 | } | 192 | } |
| 194 | 193 | ||
| 195 | static int dwc3_of_simple_runtime_resume(struct device *dev) | 194 | static int __maybe_unused dwc3_of_simple_runtime_resume(struct device *dev) |
| 196 | { | 195 | { |
| 197 | struct dwc3_of_simple *simple = dev_get_drvdata(dev); | 196 | struct dwc3_of_simple *simple = dev_get_drvdata(dev); |
| 198 | int ret; | 197 | int ret; |
| @@ -210,7 +209,7 @@ static int dwc3_of_simple_runtime_resume(struct device *dev) | |||
| 210 | return 0; | 209 | return 0; |
| 211 | } | 210 | } |
| 212 | 211 | ||
| 213 | static int dwc3_of_simple_suspend(struct device *dev) | 212 | static int __maybe_unused dwc3_of_simple_suspend(struct device *dev) |
| 214 | { | 213 | { |
| 215 | struct dwc3_of_simple *simple = dev_get_drvdata(dev); | 214 | struct dwc3_of_simple *simple = dev_get_drvdata(dev); |
| 216 | 215 | ||
| @@ -220,7 +219,7 @@ static int dwc3_of_simple_suspend(struct device *dev) | |||
| 220 | return 0; | 219 | return 0; |
| 221 | } | 220 | } |
| 222 | 221 | ||
| 223 | static int dwc3_of_simple_resume(struct device *dev) | 222 | static int __maybe_unused dwc3_of_simple_resume(struct device *dev) |
| 224 | { | 223 | { |
| 225 | struct dwc3_of_simple *simple = dev_get_drvdata(dev); | 224 | struct dwc3_of_simple *simple = dev_get_drvdata(dev); |
| 226 | 225 | ||
| @@ -229,7 +228,6 @@ static int dwc3_of_simple_resume(struct device *dev) | |||
| 229 | 228 | ||
| 230 | return 0; | 229 | return 0; |
| 231 | } | 230 | } |
| 232 | #endif | ||
| 233 | 231 | ||
| 234 | static const struct dev_pm_ops dwc3_of_simple_dev_pm_ops = { | 232 | static const struct dev_pm_ops dwc3_of_simple_dev_pm_ops = { |
| 235 | SET_SYSTEM_SLEEP_PM_OPS(dwc3_of_simple_suspend, dwc3_of_simple_resume) | 233 | SET_SYSTEM_SLEEP_PM_OPS(dwc3_of_simple_suspend, dwc3_of_simple_resume) |
diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c index 5edd79470368..1286076a8890 100644 --- a/drivers/usb/dwc3/dwc3-pci.c +++ b/drivers/usb/dwc3/dwc3-pci.c | |||
| @@ -85,8 +85,8 @@ static int dwc3_byt_enable_ulpi_refclock(struct pci_dev *pci) | |||
| 85 | u32 value; | 85 | u32 value; |
| 86 | 86 | ||
| 87 | reg = pcim_iomap(pci, GP_RWBAR, 0); | 87 | reg = pcim_iomap(pci, GP_RWBAR, 0); |
| 88 | if (IS_ERR(reg)) | 88 | if (!reg) |
| 89 | return PTR_ERR(reg); | 89 | return -ENOMEM; |
| 90 | 90 | ||
| 91 | value = readl(reg + GP_RWREG1); | 91 | value = readl(reg + GP_RWREG1); |
| 92 | if (!(value & GP_RWREG1_ULPI_REFCLK_DISABLE)) | 92 | if (!(value & GP_RWREG1_ULPI_REFCLK_DISABLE)) |
diff --git a/drivers/usb/gadget/udc/fotg210-udc.c b/drivers/usb/gadget/udc/fotg210-udc.c index 53a48f561458..587c5037ff07 100644 --- a/drivers/usb/gadget/udc/fotg210-udc.c +++ b/drivers/usb/gadget/udc/fotg210-udc.c | |||
| @@ -1063,12 +1063,15 @@ static const struct usb_gadget_ops fotg210_gadget_ops = { | |||
| 1063 | static int fotg210_udc_remove(struct platform_device *pdev) | 1063 | static int fotg210_udc_remove(struct platform_device *pdev) |
| 1064 | { | 1064 | { |
| 1065 | struct fotg210_udc *fotg210 = platform_get_drvdata(pdev); | 1065 | struct fotg210_udc *fotg210 = platform_get_drvdata(pdev); |
| 1066 | int i; | ||
| 1066 | 1067 | ||
| 1067 | usb_del_gadget_udc(&fotg210->gadget); | 1068 | usb_del_gadget_udc(&fotg210->gadget); |
| 1068 | iounmap(fotg210->reg); | 1069 | iounmap(fotg210->reg); |
| 1069 | free_irq(platform_get_irq(pdev, 0), fotg210); | 1070 | free_irq(platform_get_irq(pdev, 0), fotg210); |
| 1070 | 1071 | ||
| 1071 | fotg210_ep_free_request(&fotg210->ep[0]->ep, fotg210->ep0_req); | 1072 | fotg210_ep_free_request(&fotg210->ep[0]->ep, fotg210->ep0_req); |
| 1073 | for (i = 0; i < FOTG210_MAX_NUM_EP; i++) | ||
| 1074 | kfree(fotg210->ep[i]); | ||
| 1072 | kfree(fotg210); | 1075 | kfree(fotg210); |
| 1073 | 1076 | ||
| 1074 | return 0; | 1077 | return 0; |
| @@ -1099,7 +1102,7 @@ static int fotg210_udc_probe(struct platform_device *pdev) | |||
| 1099 | /* initialize udc */ | 1102 | /* initialize udc */ |
| 1100 | fotg210 = kzalloc(sizeof(struct fotg210_udc), GFP_KERNEL); | 1103 | fotg210 = kzalloc(sizeof(struct fotg210_udc), GFP_KERNEL); |
| 1101 | if (fotg210 == NULL) | 1104 | if (fotg210 == NULL) |
| 1102 | goto err_alloc; | 1105 | goto err; |
| 1103 | 1106 | ||
| 1104 | for (i = 0; i < FOTG210_MAX_NUM_EP; i++) { | 1107 | for (i = 0; i < FOTG210_MAX_NUM_EP; i++) { |
| 1105 | _ep[i] = kzalloc(sizeof(struct fotg210_ep), GFP_KERNEL); | 1108 | _ep[i] = kzalloc(sizeof(struct fotg210_ep), GFP_KERNEL); |
| @@ -1111,7 +1114,7 @@ static int fotg210_udc_probe(struct platform_device *pdev) | |||
| 1111 | fotg210->reg = ioremap(res->start, resource_size(res)); | 1114 | fotg210->reg = ioremap(res->start, resource_size(res)); |
| 1112 | if (fotg210->reg == NULL) { | 1115 | if (fotg210->reg == NULL) { |
| 1113 | pr_err("ioremap error.\n"); | 1116 | pr_err("ioremap error.\n"); |
| 1114 | goto err_map; | 1117 | goto err_alloc; |
| 1115 | } | 1118 | } |
| 1116 | 1119 | ||
| 1117 | spin_lock_init(&fotg210->lock); | 1120 | spin_lock_init(&fotg210->lock); |
| @@ -1159,7 +1162,7 @@ static int fotg210_udc_probe(struct platform_device *pdev) | |||
| 1159 | fotg210->ep0_req = fotg210_ep_alloc_request(&fotg210->ep[0]->ep, | 1162 | fotg210->ep0_req = fotg210_ep_alloc_request(&fotg210->ep[0]->ep, |
| 1160 | GFP_KERNEL); | 1163 | GFP_KERNEL); |
| 1161 | if (fotg210->ep0_req == NULL) | 1164 | if (fotg210->ep0_req == NULL) |
| 1162 | goto err_req; | 1165 | goto err_map; |
| 1163 | 1166 | ||
| 1164 | fotg210_init(fotg210); | 1167 | fotg210_init(fotg210); |
| 1165 | 1168 | ||
| @@ -1187,12 +1190,14 @@ err_req: | |||
| 1187 | fotg210_ep_free_request(&fotg210->ep[0]->ep, fotg210->ep0_req); | 1190 | fotg210_ep_free_request(&fotg210->ep[0]->ep, fotg210->ep0_req); |
| 1188 | 1191 | ||
| 1189 | err_map: | 1192 | err_map: |
| 1190 | if (fotg210->reg) | 1193 | iounmap(fotg210->reg); |
| 1191 | iounmap(fotg210->reg); | ||
| 1192 | 1194 | ||
| 1193 | err_alloc: | 1195 | err_alloc: |
| 1196 | for (i = 0; i < FOTG210_MAX_NUM_EP; i++) | ||
| 1197 | kfree(fotg210->ep[i]); | ||
| 1194 | kfree(fotg210); | 1198 | kfree(fotg210); |
| 1195 | 1199 | ||
| 1200 | err: | ||
| 1196 | return ret; | 1201 | return ret; |
| 1197 | } | 1202 | } |
| 1198 | 1203 | ||
diff --git a/drivers/usb/gadget/udc/net2280.c b/drivers/usb/gadget/udc/net2280.c index 318246d8b2e2..b02ab2a8d927 100644 --- a/drivers/usb/gadget/udc/net2280.c +++ b/drivers/usb/gadget/udc/net2280.c | |||
| @@ -1545,11 +1545,14 @@ static int net2280_pullup(struct usb_gadget *_gadget, int is_on) | |||
| 1545 | writel(tmp | BIT(USB_DETECT_ENABLE), &dev->usb->usbctl); | 1545 | writel(tmp | BIT(USB_DETECT_ENABLE), &dev->usb->usbctl); |
| 1546 | } else { | 1546 | } else { |
| 1547 | writel(tmp & ~BIT(USB_DETECT_ENABLE), &dev->usb->usbctl); | 1547 | writel(tmp & ~BIT(USB_DETECT_ENABLE), &dev->usb->usbctl); |
| 1548 | stop_activity(dev, dev->driver); | 1548 | stop_activity(dev, NULL); |
| 1549 | } | 1549 | } |
| 1550 | 1550 | ||
| 1551 | spin_unlock_irqrestore(&dev->lock, flags); | 1551 | spin_unlock_irqrestore(&dev->lock, flags); |
| 1552 | 1552 | ||
| 1553 | if (!is_on && dev->driver) | ||
| 1554 | dev->driver->disconnect(&dev->gadget); | ||
| 1555 | |||
| 1553 | return 0; | 1556 | return 0; |
| 1554 | } | 1557 | } |
| 1555 | 1558 | ||
| @@ -2466,8 +2469,11 @@ static void stop_activity(struct net2280 *dev, struct usb_gadget_driver *driver) | |||
| 2466 | nuke(&dev->ep[i]); | 2469 | nuke(&dev->ep[i]); |
| 2467 | 2470 | ||
| 2468 | /* report disconnect; the driver is already quiesced */ | 2471 | /* report disconnect; the driver is already quiesced */ |
| 2469 | if (driver) | 2472 | if (driver) { |
| 2473 | spin_unlock(&dev->lock); | ||
| 2470 | driver->disconnect(&dev->gadget); | 2474 | driver->disconnect(&dev->gadget); |
| 2475 | spin_lock(&dev->lock); | ||
| 2476 | } | ||
| 2471 | 2477 | ||
| 2472 | usb_reinit(dev); | 2478 | usb_reinit(dev); |
| 2473 | } | 2479 | } |
| @@ -3341,6 +3347,8 @@ next_endpoints: | |||
| 3341 | BIT(PCI_RETRY_ABORT_INTERRUPT)) | 3347 | BIT(PCI_RETRY_ABORT_INTERRUPT)) |
| 3342 | 3348 | ||
| 3343 | static void handle_stat1_irqs(struct net2280 *dev, u32 stat) | 3349 | static void handle_stat1_irqs(struct net2280 *dev, u32 stat) |
| 3350 | __releases(dev->lock) | ||
| 3351 | __acquires(dev->lock) | ||
| 3344 | { | 3352 | { |
| 3345 | struct net2280_ep *ep; | 3353 | struct net2280_ep *ep; |
| 3346 | u32 tmp, num, mask, scratch; | 3354 | u32 tmp, num, mask, scratch; |
| @@ -3381,12 +3389,14 @@ static void handle_stat1_irqs(struct net2280 *dev, u32 stat) | |||
| 3381 | if (disconnect || reset) { | 3389 | if (disconnect || reset) { |
| 3382 | stop_activity(dev, dev->driver); | 3390 | stop_activity(dev, dev->driver); |
| 3383 | ep0_start(dev); | 3391 | ep0_start(dev); |
| 3392 | spin_unlock(&dev->lock); | ||
| 3384 | if (reset) | 3393 | if (reset) |
| 3385 | usb_gadget_udc_reset | 3394 | usb_gadget_udc_reset |
| 3386 | (&dev->gadget, dev->driver); | 3395 | (&dev->gadget, dev->driver); |
| 3387 | else | 3396 | else |
| 3388 | (dev->driver->disconnect) | 3397 | (dev->driver->disconnect) |
| 3389 | (&dev->gadget); | 3398 | (&dev->gadget); |
| 3399 | spin_lock(&dev->lock); | ||
| 3390 | return; | 3400 | return; |
| 3391 | } | 3401 | } |
| 3392 | } | 3402 | } |
| @@ -3405,6 +3415,7 @@ static void handle_stat1_irqs(struct net2280 *dev, u32 stat) | |||
| 3405 | tmp = BIT(SUSPEND_REQUEST_CHANGE_INTERRUPT); | 3415 | tmp = BIT(SUSPEND_REQUEST_CHANGE_INTERRUPT); |
| 3406 | if (stat & tmp) { | 3416 | if (stat & tmp) { |
| 3407 | writel(tmp, &dev->regs->irqstat1); | 3417 | writel(tmp, &dev->regs->irqstat1); |
| 3418 | spin_unlock(&dev->lock); | ||
| 3408 | if (stat & BIT(SUSPEND_REQUEST_INTERRUPT)) { | 3419 | if (stat & BIT(SUSPEND_REQUEST_INTERRUPT)) { |
| 3409 | if (dev->driver->suspend) | 3420 | if (dev->driver->suspend) |
| 3410 | dev->driver->suspend(&dev->gadget); | 3421 | dev->driver->suspend(&dev->gadget); |
| @@ -3415,6 +3426,7 @@ static void handle_stat1_irqs(struct net2280 *dev, u32 stat) | |||
| 3415 | dev->driver->resume(&dev->gadget); | 3426 | dev->driver->resume(&dev->gadget); |
| 3416 | /* at high speed, note erratum 0133 */ | 3427 | /* at high speed, note erratum 0133 */ |
| 3417 | } | 3428 | } |
| 3429 | spin_lock(&dev->lock); | ||
| 3418 | stat &= ~tmp; | 3430 | stat &= ~tmp; |
| 3419 | } | 3431 | } |
| 3420 | 3432 | ||
diff --git a/drivers/usb/gadget/udc/renesas_usb3.c b/drivers/usb/gadget/udc/renesas_usb3.c index 1f879b3f2c96..e1656f361e08 100644 --- a/drivers/usb/gadget/udc/renesas_usb3.c +++ b/drivers/usb/gadget/udc/renesas_usb3.c | |||
| @@ -812,12 +812,15 @@ static void usb3_irq_epc_int_1_speed(struct renesas_usb3 *usb3) | |||
| 812 | switch (speed) { | 812 | switch (speed) { |
| 813 | case USB_STA_SPEED_SS: | 813 | case USB_STA_SPEED_SS: |
| 814 | usb3->gadget.speed = USB_SPEED_SUPER; | 814 | usb3->gadget.speed = USB_SPEED_SUPER; |
| 815 | usb3->gadget.ep0->maxpacket = USB3_EP0_SS_MAX_PACKET_SIZE; | ||
| 815 | break; | 816 | break; |
| 816 | case USB_STA_SPEED_HS: | 817 | case USB_STA_SPEED_HS: |
| 817 | usb3->gadget.speed = USB_SPEED_HIGH; | 818 | usb3->gadget.speed = USB_SPEED_HIGH; |
| 819 | usb3->gadget.ep0->maxpacket = USB3_EP0_HSFS_MAX_PACKET_SIZE; | ||
| 818 | break; | 820 | break; |
| 819 | case USB_STA_SPEED_FS: | 821 | case USB_STA_SPEED_FS: |
| 820 | usb3->gadget.speed = USB_SPEED_FULL; | 822 | usb3->gadget.speed = USB_SPEED_FULL; |
| 823 | usb3->gadget.ep0->maxpacket = USB3_EP0_HSFS_MAX_PACKET_SIZE; | ||
| 821 | break; | 824 | break; |
| 822 | default: | 825 | default: |
| 823 | usb3->gadget.speed = USB_SPEED_UNKNOWN; | 826 | usb3->gadget.speed = USB_SPEED_UNKNOWN; |
| @@ -2513,7 +2516,7 @@ static int renesas_usb3_init_ep(struct renesas_usb3 *usb3, struct device *dev, | |||
| 2513 | /* for control pipe */ | 2516 | /* for control pipe */ |
| 2514 | usb3->gadget.ep0 = &usb3_ep->ep; | 2517 | usb3->gadget.ep0 = &usb3_ep->ep; |
| 2515 | usb_ep_set_maxpacket_limit(&usb3_ep->ep, | 2518 | usb_ep_set_maxpacket_limit(&usb3_ep->ep, |
| 2516 | USB3_EP0_HSFS_MAX_PACKET_SIZE); | 2519 | USB3_EP0_SS_MAX_PACKET_SIZE); |
| 2517 | usb3_ep->ep.caps.type_control = true; | 2520 | usb3_ep->ep.caps.type_control = true; |
| 2518 | usb3_ep->ep.caps.dir_in = true; | 2521 | usb3_ep->ep.caps.dir_in = true; |
| 2519 | usb3_ep->ep.caps.dir_out = true; | 2522 | usb3_ep->ep.caps.dir_out = true; |
