Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'usb-4.12-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb

Pull USB fixes from Greg KH:
"Here are some small USB fixes for 4.12-rc5

They are for some reported issues in the chipidea and gadget drivers.
Nothing major. All have been in linux-next for a while with no
reported issues"

* tag 'usb-4.12-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb:
usb: gadget: udc: renesas_usb3: Fix PN_INT_ENA disabling timing
usb: gadget: udc: renesas_usb3: lock for PN_ registers access
usb: gadget: udc: renesas_usb3: fix deadlock by spinlock
usb: gadget: udc: renesas_usb3: fix pm_runtime functions calling
usb: gadget: f_mass_storage: Serialize wake and sleep execution
usb: dwc2: add support for the DWC2 controller on Meson8 SoCs
phy: qualcomm: phy-qcom-qmp: fix application of sizeof to pointer
usb: musb: dsps: keep VBUS on for host-only mode
usb: chipidea: core: check before accessing ci_role in ci_role_show
usb: chipidea: debug: check before accessing ci_role
phy: qcom-qmp: fix return value check in qcom_qmp_phy_create()
usb: chipidea: udc: fix NULL pointer dereference if udc_start failed
usb: chipidea: imx: Do not access CLKONOFF on i.MX51

+102 -35
+1
Documentation/devicetree/bindings/usb/dwc2.txt
··· 10 10 - "rockchip,rk3288-usb", "rockchip,rk3066-usb", "snps,dwc2": for rk3288 Soc; 11 11 - "lantiq,arx100-usb": The DWC2 USB controller instance in Lantiq ARX SoCs; 12 12 - "lantiq,xrx200-usb": The DWC2 USB controller instance in Lantiq XRX SoCs; 13 + - "amlogic,meson8-usb": The DWC2 USB controller instance in Amlogic Meson8 SoCs; 13 14 - "amlogic,meson8b-usb": The DWC2 USB controller instance in Amlogic Meson8b SoCs; 14 15 - "amlogic,meson-gxbb-usb": The DWC2 USB controller instance in Amlogic S905 SoCs; 15 16 - "amcc,dwc-otg": The DWC2 USB controller instance in AMCC Canyonlands 460EX SoCs;
+7 -7
drivers/phy/phy-qcom-qmp.c
··· 844 844 int num = qmp->cfg->num_vregs; 845 845 int i; 846 846 847 - qmp->vregs = devm_kcalloc(dev, num, sizeof(qmp->vregs), GFP_KERNEL); 847 + qmp->vregs = devm_kcalloc(dev, num, sizeof(*qmp->vregs), GFP_KERNEL); 848 848 if (!qmp->vregs) 849 849 return -ENOMEM; 850 850 ··· 983 983 * Resources are indexed as: tx -> 0; rx -> 1; pcs -> 2. 984 984 */ 985 985 qphy->tx = of_iomap(np, 0); 986 - if (IS_ERR(qphy->tx)) 987 - return PTR_ERR(qphy->tx); 986 + if (!qphy->tx) 987 + return -ENOMEM; 988 988 989 989 qphy->rx = of_iomap(np, 1); 990 - if (IS_ERR(qphy->rx)) 991 - return PTR_ERR(qphy->rx); 990 + if (!qphy->rx) 991 + return -ENOMEM; 992 992 993 993 qphy->pcs = of_iomap(np, 2); 994 - if (IS_ERR(qphy->pcs)) 995 - return PTR_ERR(qphy->pcs); 994 + if (!qphy->pcs) 995 + return -ENOMEM; 996 996 997 997 /* 998 998 * Get PHY's Pipe clock, if any. USB3 and PCIe are PIPE3
+4 -1
drivers/usb/chipidea/core.c
··· 843 843 { 844 844 struct ci_hdrc *ci = dev_get_drvdata(dev); 845 845 846 - return sprintf(buf, "%s\n", ci_role(ci)->name); 846 + if (ci->role != CI_ROLE_END) 847 + return sprintf(buf, "%s\n", ci_role(ci)->name); 848 + 849 + return 0; 847 850 } 848 851 849 852 static ssize_t ci_role_store(struct device *dev,
+2 -1
drivers/usb/chipidea/debug.c
··· 294 294 { 295 295 struct ci_hdrc *ci = s->private; 296 296 297 - seq_printf(s, "%s\n", ci_role(ci)->name); 297 + if (ci->role != CI_ROLE_END) 298 + seq_printf(s, "%s\n", ci_role(ci)->name); 298 299 299 300 return 0; 300 301 }
+6 -2
drivers/usb/chipidea/udc.c
··· 1993 1993 int ci_hdrc_gadget_init(struct ci_hdrc *ci) 1994 1994 { 1995 1995 struct ci_role_driver *rdrv; 1996 + int ret; 1996 1997 1997 1998 if (!hw_read(ci, CAP_DCCPARAMS, DCCPARAMS_DC)) 1998 1999 return -ENXIO; ··· 2006 2005 rdrv->stop = udc_id_switch_for_host; 2007 2006 rdrv->irq = udc_irq; 2008 2007 rdrv->name = "gadget"; 2009 - ci->roles[CI_ROLE_GADGET] = rdrv; 2010 2008 2011 - return udc_start(ci); 2009 + ret = udc_start(ci); 2010 + if (!ret) 2011 + ci->roles[CI_ROLE_GADGET] = rdrv; 2012 + 2013 + return ret; 2012 2014 }
+32 -9
drivers/usb/chipidea/usbmisc_imx.c
··· 108 108 const struct usbmisc_ops *ops; 109 109 }; 110 110 111 + static inline bool is_imx53_usbmisc(struct imx_usbmisc_data *data); 112 + 111 113 static int usbmisc_imx25_init(struct imx_usbmisc_data *data) 112 114 { 113 115 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); ··· 244 242 val = readl(reg) | MX53_USB_UHx_CTRL_WAKE_UP_EN 245 243 | MX53_USB_UHx_CTRL_ULPI_INT_EN; 246 244 writel(val, reg); 247 - /* Disable internal 60Mhz clock */ 248 - reg = usbmisc->base + MX53_USB_CLKONOFF_CTRL_OFFSET; 249 - val = readl(reg) | MX53_USB_CLKONOFF_CTRL_H2_INT60CKOFF; 250 - writel(val, reg); 245 + if (is_imx53_usbmisc(data)) { 246 + /* Disable internal 60Mhz clock */ 247 + reg = usbmisc->base + 248 + MX53_USB_CLKONOFF_CTRL_OFFSET; 249 + val = readl(reg) | 250 + MX53_USB_CLKONOFF_CTRL_H2_INT60CKOFF; 251 + writel(val, reg); 252 + } 253 + 251 254 } 252 255 if (data->disable_oc) { 253 256 reg = usbmisc->base + MX53_USB_UH2_CTRL_OFFSET; ··· 274 267 val = readl(reg) | MX53_USB_UHx_CTRL_WAKE_UP_EN 275 268 | MX53_USB_UHx_CTRL_ULPI_INT_EN; 276 269 writel(val, reg); 277 - /* Disable internal 60Mhz clock */ 278 - reg = usbmisc->base + MX53_USB_CLKONOFF_CTRL_OFFSET; 279 - val = readl(reg) | MX53_USB_CLKONOFF_CTRL_H3_INT60CKOFF; 280 - writel(val, reg); 270 + 271 + if (is_imx53_usbmisc(data)) { 272 + /* Disable internal 60Mhz clock */ 273 + reg = usbmisc->base + 274 + MX53_USB_CLKONOFF_CTRL_OFFSET; 275 + val = readl(reg) | 276 + MX53_USB_CLKONOFF_CTRL_H3_INT60CKOFF; 277 + writel(val, reg); 278 + } 281 279 } 282 280 if (data->disable_oc) { 283 281 reg = usbmisc->base + MX53_USB_UH3_CTRL_OFFSET; ··· 468 456 .init = usbmisc_imx27_init, 469 457 }; 470 458 459 + static const struct usbmisc_ops imx51_usbmisc_ops = { 460 + .init = usbmisc_imx53_init, 461 + }; 462 + 471 463 static const struct usbmisc_ops imx53_usbmisc_ops = { 472 464 .init = usbmisc_imx53_init, 473 465 }; ··· 494 478 .init = usbmisc_imx7d_init, 495 479 .set_wakeup = usbmisc_imx7d_set_wakeup, 496 480 }; 481 + 482 + static inline bool is_imx53_usbmisc(struct imx_usbmisc_data *data) 483 + { 484 + struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); 485 + 486 + return usbmisc->ops == &imx53_usbmisc_ops; 487 + } 497 488 498 489 int imx_usbmisc_init(struct imx_usbmisc_data *data) 499 490 { ··· 559 536 }, 560 537 { 561 538 .compatible = "fsl,imx51-usbmisc", 562 - .data = &imx53_usbmisc_ops, 539 + .data = &imx51_usbmisc_ops, 563 540 }, 564 541 { 565 542 .compatible = "fsl,imx53-usbmisc",
+2
drivers/usb/dwc2/params.c
··· 144 144 { .compatible = "lantiq,xrx200-usb", .data = dwc2_set_ltq_params }, 145 145 { .compatible = "snps,dwc2" }, 146 146 { .compatible = "samsung,s3c6400-hsotg" }, 147 + { .compatible = "amlogic,meson8-usb", 148 + .data = dwc2_set_amlogic_params }, 147 149 { .compatible = "amlogic,meson8b-usb", 148 150 .data = dwc2_set_amlogic_params }, 149 151 { .compatible = "amlogic,meson-gxbb-usb",
+11 -2
drivers/usb/gadget/function/f_mass_storage.c
··· 396 396 /* Caller must hold fsg->lock */ 397 397 static void wakeup_thread(struct fsg_common *common) 398 398 { 399 - smp_wmb(); /* ensure the write of bh->state is complete */ 399 + /* 400 + * Ensure the reading of thread_wakeup_needed 401 + * and the writing of bh->state are completed 402 + */ 403 + smp_mb(); 400 404 /* Tell the main thread that something has happened */ 401 405 common->thread_wakeup_needed = 1; 402 406 if (common->thread_task) ··· 631 627 } 632 628 __set_current_state(TASK_RUNNING); 633 629 common->thread_wakeup_needed = 0; 634 - smp_rmb(); /* ensure the latest bh->state is visible */ 630 + 631 + /* 632 + * Ensure the writing of thread_wakeup_needed 633 + * and the reading of bh->state are completed 634 + */ 635 + smp_mb(); 635 636 return rc; 636 637 } 637 638
+32 -13
drivers/usb/gadget/udc/renesas_usb3.c
··· 623 623 { 624 624 usb3_disconnect(usb3); 625 625 usb3_write(usb3, 0, USB3_P0_INT_ENA); 626 - usb3_write(usb3, 0, USB3_PN_INT_ENA); 627 626 usb3_write(usb3, 0, USB3_USB_OTG_INT_ENA); 628 627 usb3_write(usb3, 0, USB3_USB_INT_ENA_1); 629 628 usb3_write(usb3, 0, USB3_USB_INT_ENA_2); ··· 1474 1475 struct renesas_usb3_request *usb3_req, 1475 1476 int status) 1476 1477 { 1477 - usb3_pn_stop(usb3); 1478 + unsigned long flags; 1479 + 1480 + spin_lock_irqsave(&usb3->lock, flags); 1481 + if (usb3_pn_change(usb3, usb3_ep->num)) 1482 + usb3_pn_stop(usb3); 1483 + spin_unlock_irqrestore(&usb3->lock, flags); 1484 + 1478 1485 usb3_disable_pipe_irq(usb3, usb3_ep->num); 1479 1486 usb3_request_done(usb3_ep, usb3_req, status); 1480 1487 ··· 1509 1504 { 1510 1505 struct renesas_usb3_ep *usb3_ep = usb3_get_ep(usb3, num); 1511 1506 struct renesas_usb3_request *usb3_req = usb3_get_request(usb3_ep); 1507 + bool done = false; 1512 1508 1513 1509 if (!usb3_req) 1514 1510 return; 1511 + 1512 + spin_lock(&usb3->lock); 1513 + if (usb3_pn_change(usb3, num)) 1514 + goto out; 1515 1515 1516 1516 if (usb3_ep->dir_in) { 1517 1517 /* Do not stop the IN pipe here to detect LSTTR interrupt */ ··· 1524 1514 usb3_clear_bit(usb3, PN_INT_BFRDY, USB3_PN_INT_ENA); 1525 1515 } else { 1526 1516 if (!usb3_read_pipe(usb3_ep, usb3_req, USB3_PN_READ)) 1527 - usb3_request_done_pipen(usb3, usb3_ep, usb3_req, 0); 1517 + done = true; 1528 1518 } 1519 + 1520 + out: 1521 + /* need to unlock because usb3_request_done_pipen() locks it */ 1522 + spin_unlock(&usb3->lock); 1523 + 1524 + if (done) 1525 + usb3_request_done_pipen(usb3, usb3_ep, usb3_req, 0); 1529 1526 } 1530 1527 1531 1528 static void usb3_irq_epc_pipen(struct renesas_usb3 *usb3, int num) 1532 1529 { 1533 1530 u32 pn_int_sta; 1534 1531 1535 - if (usb3_pn_change(usb3, num) < 0) 1532 + spin_lock(&usb3->lock); 1533 + if (usb3_pn_change(usb3, num) < 0) { 1534 + spin_unlock(&usb3->lock); 1536 1535 return; 1536 + } 1537 1537 1538 1538 pn_int_sta = usb3_read(usb3, USB3_PN_INT_STA); 1539 1539 pn_int_sta &= usb3_read(usb3, USB3_PN_INT_ENA); 1540 1540 usb3_write(usb3, pn_int_sta, USB3_PN_INT_STA); 1541 + spin_unlock(&usb3->lock); 1541 1542 if (pn_int_sta & PN_INT_LSTTR) 1542 1543 usb3_irq_epc_pipen_lsttr(usb3, num); 1543 1544 if (pn_int_sta & PN_INT_BFRDY) ··· 1681 1660 1682 1661 spin_lock_irqsave(&usb3->lock, flags); 1683 1662 if (!usb3_pn_change(usb3, usb3_ep->num)) { 1663 + usb3_write(usb3, 0, USB3_PN_INT_ENA); 1684 1664 usb3_write(usb3, 0, USB3_PN_RAMMAP); 1685 1665 usb3_clear_bit(usb3, PN_CON_EN, USB3_PN_CON); 1686 1666 } ··· 1821 1799 /* hook up the driver */ 1822 1800 usb3->driver = driver; 1823 1801 1802 + pm_runtime_enable(usb3_to_dev(usb3)); 1803 + pm_runtime_get_sync(usb3_to_dev(usb3)); 1804 + 1824 1805 renesas_usb3_init_controller(usb3); 1825 1806 1826 1807 return 0; ··· 1832 1807 static int renesas_usb3_stop(struct usb_gadget *gadget) 1833 1808 { 1834 1809 struct renesas_usb3 *usb3 = gadget_to_renesas_usb3(gadget); 1835 - unsigned long flags; 1836 1810 1837 - spin_lock_irqsave(&usb3->lock, flags); 1838 1811 usb3->softconnect = false; 1839 1812 usb3->gadget.speed = USB_SPEED_UNKNOWN; 1840 1813 usb3->driver = NULL; 1841 1814 renesas_usb3_stop_controller(usb3); 1842 - spin_unlock_irqrestore(&usb3->lock, flags); 1815 + 1816 + pm_runtime_put(usb3_to_dev(usb3)); 1817 + pm_runtime_disable(usb3_to_dev(usb3)); 1843 1818 1844 1819 return 0; 1845 1820 } ··· 1915 1890 struct renesas_usb3 *usb3 = platform_get_drvdata(pdev); 1916 1891 1917 1892 device_remove_file(&pdev->dev, &dev_attr_role); 1918 - 1919 - pm_runtime_put(&pdev->dev); 1920 - pm_runtime_disable(&pdev->dev); 1921 1893 1922 1894 usb_del_gadget_udc(&usb3->gadget); 1923 1895 ··· 2120 2098 goto err_dev_create; 2121 2099 2122 2100 usb3->workaround_for_vbus = priv->workaround_for_vbus; 2123 - 2124 - pm_runtime_enable(&pdev->dev); 2125 - pm_runtime_get_sync(&pdev->dev); 2126 2101 2127 2102 dev_info(&pdev->dev, "probed\n"); 2128 2103
+5
drivers/usb/musb/musb_dsps.c
··· 245 245 dsps_mod_timer_optional(glue); 246 246 break; 247 247 case OTG_STATE_A_WAIT_BCON: 248 + /* keep VBUS on for host-only mode */ 249 + if (musb->port_mode == MUSB_PORT_MODE_HOST) { 250 + dsps_mod_timer_optional(glue); 251 + break; 252 + } 248 253 musb_writeb(musb->mregs, MUSB_DEVCTL, 0); 249 254 skip_session = 1; 250 255 /* fall */