mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 00:34:20 +08:00
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. -----BEGIN PGP SIGNATURE----- iQJRBAABCAA7FiEElLzh7wn96CXwjh2IzL64meEamQYFAluQ0IIdHGZlbGlwZS5i YWxiaUBsaW51eC5pbnRlbC5jb20ACgkQzL64meEamQYrZw//VvEla53WfqbMhoN4 DutHuqipNILSusy7KzlaRhntIw4jahDZlUDVwFnvfgEP6KSsUrC5gAV/oDmy/6fH eObgZkOAg65n0Gzfmk0IFHkwCRONrzMruzj0C5BW/h2nmub4NUcnFLEcgCi45hOx BidoWKBa7ziHfl8Fhg0DNooG9PRkHFl1NKrns4GoHXo605j6KLe8mFwWG3mOOdCk QeWMbKMWsBZYPH1Gtr8mpycoDxDhgXBw91u81pbUFRP9wNP4RR2gIJhF6018XVwL 0+1lBMZ6SZhGavLCQcm5G8n7efVwkKKdg6WdI1o0URbKOFgRvoTuSD4a2rNrkiFS EoLQl7pA0CxreFAFFfljZTwuxDt5ZxwmeZKX76sxxNq68XDHYeykRIQAIUhi27oM rrh8ACHpipLNwJe5RMwzEpzpAigw5sbm7DrNcVHkTz3VZ45lyMEpJ5JPbHndwnx1 3P0cuF2QVIMh0ulQVhuSZ7Atk2DaclrsKi01mScW5lWP0718TbpdR+h9K6KkegJY eYBVaFWsCTyxrC2MWqbwsG1LMGF1sCE1dUu5kYw0NOtXuXnJSOCU2QtFD5TkidjN z/48hJYmsVaItN7B+5/tdcckpPEy8UxxuBNve89dJyPTc+5LAf2K0/8a6Imrx8Q6 CaqBYodbgdG4bbCTlIv5Oq3mXck= =bEhk -----END PGP SIGNATURE----- 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.
This commit is contained in:
commit
bfa150f37f
@ -412,8 +412,6 @@ static int dwc2_driver_probe(struct platform_device *dev)
|
||||
dev_dbg(&dev->dev, "mapped PA %08lx to VA %p\n",
|
||||
(unsigned long)res->start, hsotg->regs);
|
||||
|
||||
hsotg->needs_byte_swap = dwc2_check_core_endianness(hsotg);
|
||||
|
||||
retval = dwc2_lowlevel_hw_init(hsotg);
|
||||
if (retval)
|
||||
return retval;
|
||||
@ -438,6 +436,8 @@ static int dwc2_driver_probe(struct platform_device *dev)
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
hsotg->needs_byte_swap = dwc2_check_core_endianness(hsotg);
|
||||
|
||||
retval = dwc2_get_dr_mode(hsotg);
|
||||
if (retval)
|
||||
goto error;
|
||||
|
@ -180,8 +180,7 @@ static int dwc3_of_simple_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int dwc3_of_simple_runtime_suspend(struct device *dev)
|
||||
static int __maybe_unused dwc3_of_simple_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct dwc3_of_simple *simple = dev_get_drvdata(dev);
|
||||
int i;
|
||||
@ -192,7 +191,7 @@ static int dwc3_of_simple_runtime_suspend(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dwc3_of_simple_runtime_resume(struct device *dev)
|
||||
static int __maybe_unused dwc3_of_simple_runtime_resume(struct device *dev)
|
||||
{
|
||||
struct dwc3_of_simple *simple = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
@ -210,7 +209,7 @@ static int dwc3_of_simple_runtime_resume(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dwc3_of_simple_suspend(struct device *dev)
|
||||
static int __maybe_unused dwc3_of_simple_suspend(struct device *dev)
|
||||
{
|
||||
struct dwc3_of_simple *simple = dev_get_drvdata(dev);
|
||||
|
||||
@ -220,7 +219,7 @@ static int dwc3_of_simple_suspend(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dwc3_of_simple_resume(struct device *dev)
|
||||
static int __maybe_unused dwc3_of_simple_resume(struct device *dev)
|
||||
{
|
||||
struct dwc3_of_simple *simple = dev_get_drvdata(dev);
|
||||
|
||||
@ -229,7 +228,6 @@ static int dwc3_of_simple_resume(struct device *dev)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct dev_pm_ops dwc3_of_simple_dev_pm_ops = {
|
||||
SET_SYSTEM_SLEEP_PM_OPS(dwc3_of_simple_suspend, dwc3_of_simple_resume)
|
||||
|
@ -85,8 +85,8 @@ static int dwc3_byt_enable_ulpi_refclock(struct pci_dev *pci)
|
||||
u32 value;
|
||||
|
||||
reg = pcim_iomap(pci, GP_RWBAR, 0);
|
||||
if (IS_ERR(reg))
|
||||
return PTR_ERR(reg);
|
||||
if (!reg)
|
||||
return -ENOMEM;
|
||||
|
||||
value = readl(reg + GP_RWREG1);
|
||||
if (!(value & GP_RWREG1_ULPI_REFCLK_DISABLE))
|
||||
|
@ -1063,12 +1063,15 @@ static const struct usb_gadget_ops fotg210_gadget_ops = {
|
||||
static int fotg210_udc_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct fotg210_udc *fotg210 = platform_get_drvdata(pdev);
|
||||
int i;
|
||||
|
||||
usb_del_gadget_udc(&fotg210->gadget);
|
||||
iounmap(fotg210->reg);
|
||||
free_irq(platform_get_irq(pdev, 0), fotg210);
|
||||
|
||||
fotg210_ep_free_request(&fotg210->ep[0]->ep, fotg210->ep0_req);
|
||||
for (i = 0; i < FOTG210_MAX_NUM_EP; i++)
|
||||
kfree(fotg210->ep[i]);
|
||||
kfree(fotg210);
|
||||
|
||||
return 0;
|
||||
@ -1099,7 +1102,7 @@ static int fotg210_udc_probe(struct platform_device *pdev)
|
||||
/* initialize udc */
|
||||
fotg210 = kzalloc(sizeof(struct fotg210_udc), GFP_KERNEL);
|
||||
if (fotg210 == NULL)
|
||||
goto err_alloc;
|
||||
goto err;
|
||||
|
||||
for (i = 0; i < FOTG210_MAX_NUM_EP; i++) {
|
||||
_ep[i] = kzalloc(sizeof(struct fotg210_ep), GFP_KERNEL);
|
||||
@ -1111,7 +1114,7 @@ static int fotg210_udc_probe(struct platform_device *pdev)
|
||||
fotg210->reg = ioremap(res->start, resource_size(res));
|
||||
if (fotg210->reg == NULL) {
|
||||
pr_err("ioremap error.\n");
|
||||
goto err_map;
|
||||
goto err_alloc;
|
||||
}
|
||||
|
||||
spin_lock_init(&fotg210->lock);
|
||||
@ -1159,7 +1162,7 @@ static int fotg210_udc_probe(struct platform_device *pdev)
|
||||
fotg210->ep0_req = fotg210_ep_alloc_request(&fotg210->ep[0]->ep,
|
||||
GFP_KERNEL);
|
||||
if (fotg210->ep0_req == NULL)
|
||||
goto err_req;
|
||||
goto err_map;
|
||||
|
||||
fotg210_init(fotg210);
|
||||
|
||||
@ -1187,12 +1190,14 @@ err_req:
|
||||
fotg210_ep_free_request(&fotg210->ep[0]->ep, fotg210->ep0_req);
|
||||
|
||||
err_map:
|
||||
if (fotg210->reg)
|
||||
iounmap(fotg210->reg);
|
||||
iounmap(fotg210->reg);
|
||||
|
||||
err_alloc:
|
||||
for (i = 0; i < FOTG210_MAX_NUM_EP; i++)
|
||||
kfree(fotg210->ep[i]);
|
||||
kfree(fotg210);
|
||||
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1545,11 +1545,14 @@ static int net2280_pullup(struct usb_gadget *_gadget, int is_on)
|
||||
writel(tmp | BIT(USB_DETECT_ENABLE), &dev->usb->usbctl);
|
||||
} else {
|
||||
writel(tmp & ~BIT(USB_DETECT_ENABLE), &dev->usb->usbctl);
|
||||
stop_activity(dev, dev->driver);
|
||||
stop_activity(dev, NULL);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&dev->lock, flags);
|
||||
|
||||
if (!is_on && dev->driver)
|
||||
dev->driver->disconnect(&dev->gadget);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2466,8 +2469,11 @@ static void stop_activity(struct net2280 *dev, struct usb_gadget_driver *driver)
|
||||
nuke(&dev->ep[i]);
|
||||
|
||||
/* report disconnect; the driver is already quiesced */
|
||||
if (driver)
|
||||
if (driver) {
|
||||
spin_unlock(&dev->lock);
|
||||
driver->disconnect(&dev->gadget);
|
||||
spin_lock(&dev->lock);
|
||||
}
|
||||
|
||||
usb_reinit(dev);
|
||||
}
|
||||
@ -3341,6 +3347,8 @@ next_endpoints:
|
||||
BIT(PCI_RETRY_ABORT_INTERRUPT))
|
||||
|
||||
static void handle_stat1_irqs(struct net2280 *dev, u32 stat)
|
||||
__releases(dev->lock)
|
||||
__acquires(dev->lock)
|
||||
{
|
||||
struct net2280_ep *ep;
|
||||
u32 tmp, num, mask, scratch;
|
||||
@ -3381,12 +3389,14 @@ static void handle_stat1_irqs(struct net2280 *dev, u32 stat)
|
||||
if (disconnect || reset) {
|
||||
stop_activity(dev, dev->driver);
|
||||
ep0_start(dev);
|
||||
spin_unlock(&dev->lock);
|
||||
if (reset)
|
||||
usb_gadget_udc_reset
|
||||
(&dev->gadget, dev->driver);
|
||||
else
|
||||
(dev->driver->disconnect)
|
||||
(&dev->gadget);
|
||||
spin_lock(&dev->lock);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -3405,6 +3415,7 @@ static void handle_stat1_irqs(struct net2280 *dev, u32 stat)
|
||||
tmp = BIT(SUSPEND_REQUEST_CHANGE_INTERRUPT);
|
||||
if (stat & tmp) {
|
||||
writel(tmp, &dev->regs->irqstat1);
|
||||
spin_unlock(&dev->lock);
|
||||
if (stat & BIT(SUSPEND_REQUEST_INTERRUPT)) {
|
||||
if (dev->driver->suspend)
|
||||
dev->driver->suspend(&dev->gadget);
|
||||
@ -3415,6 +3426,7 @@ static void handle_stat1_irqs(struct net2280 *dev, u32 stat)
|
||||
dev->driver->resume(&dev->gadget);
|
||||
/* at high speed, note erratum 0133 */
|
||||
}
|
||||
spin_lock(&dev->lock);
|
||||
stat &= ~tmp;
|
||||
}
|
||||
|
||||
|
@ -812,12 +812,15 @@ static void usb3_irq_epc_int_1_speed(struct renesas_usb3 *usb3)
|
||||
switch (speed) {
|
||||
case USB_STA_SPEED_SS:
|
||||
usb3->gadget.speed = USB_SPEED_SUPER;
|
||||
usb3->gadget.ep0->maxpacket = USB3_EP0_SS_MAX_PACKET_SIZE;
|
||||
break;
|
||||
case USB_STA_SPEED_HS:
|
||||
usb3->gadget.speed = USB_SPEED_HIGH;
|
||||
usb3->gadget.ep0->maxpacket = USB3_EP0_HSFS_MAX_PACKET_SIZE;
|
||||
break;
|
||||
case USB_STA_SPEED_FS:
|
||||
usb3->gadget.speed = USB_SPEED_FULL;
|
||||
usb3->gadget.ep0->maxpacket = USB3_EP0_HSFS_MAX_PACKET_SIZE;
|
||||
break;
|
||||
default:
|
||||
usb3->gadget.speed = USB_SPEED_UNKNOWN;
|
||||
@ -2513,7 +2516,7 @@ static int renesas_usb3_init_ep(struct renesas_usb3 *usb3, struct device *dev,
|
||||
/* for control pipe */
|
||||
usb3->gadget.ep0 = &usb3_ep->ep;
|
||||
usb_ep_set_maxpacket_limit(&usb3_ep->ep,
|
||||
USB3_EP0_HSFS_MAX_PACKET_SIZE);
|
||||
USB3_EP0_SS_MAX_PACKET_SIZE);
|
||||
usb3_ep->ep.caps.type_control = true;
|
||||
usb3_ep->ep.caps.dir_in = true;
|
||||
usb3_ep->ep.caps.dir_out = true;
|
||||
|
Loading…
Reference in New Issue
Block a user