Skip to content

Commit 43cb5d4

Browse files
committed
Merge tag 'usb-5.13-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB fixes from Greg KH: "Here are a number of tiny USB fixes for 5.13-rc6. There are more than I would normally like, but there's been a bunch of people banging on the gadget and dwc3 and typec code recently for I think an Android release, which has resulted in a number of small fixes. It's nice to see companies send fixes upstream for this type of work, a notable change from years ago. Anyway, fixes in here are: - usb-serial device id updates - usb-serial cp210x driver fixes for broken firmware versions - typec fixes for crazy charging devices and other reported problems - dwc3 fixes for reported problems found - gadget fixes for reported problems - tiny xhci fixes - other small fixes for reported issues. - revert of a problem fix found by linux-next testing All of these have passed 0-day and linux-next testing with no reported problems (the revert for the found linux-next build problem included)" * tag 'usb-5.13-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (44 commits) Revert "usb: gadget: fsl: Re-enable driver for ARM SoCs" usb: typec: mux: Fix copy-paste mistake in typec_mux_match usb: typec: ucsi: Clear PPM capability data in ucsi_init() error path usb: gadget: fsl: Re-enable driver for ARM SoCs usb: typec: wcove: Use LE to CPU conversion when accessing msg->header USB: serial: cp210x: fix CP2102N-A01 modem control USB: serial: cp210x: fix alternate function for CP2102N QFN20 usb: misc: brcmstb-usb-pinmap: check return value after calling platform_get_resource() usb: dwc3: ep0: fix NULL pointer exception usb: gadget: eem: fix wrong eem header operation usb: typec: intel_pmc_mux: Put ACPI device using acpi_dev_put() usb: typec: intel_pmc_mux: Add missed error check for devm_ioremap_resource() usb: typec: intel_pmc_mux: Put fwnode in error case during ->probe() usb: typec: tcpm: Do not finish VDM AMS for retrying Responses usb: fix various gadget panics on 10gbps cabling usb: fix various gadgets null ptr deref on 10gbps cabling. usb: pci-quirks: disable D3cold on xhci suspend for s2idle on AMD Renoir usb: f_ncm: only first packet of aggregate needs to start timer USB: f_ncm: ncm_bitrate (speed) is unsigned MAINTAINERS: usb: add entry for isp1760 ...
2 parents c46fe4a + 7c4363d commit 43cb5d4

40 files changed

+357
-144
lines changed

Documentation/devicetree/bindings/connector/usb-connector.yaml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,17 @@ properties:
149149
maxItems: 6
150150
$ref: /schemas/types.yaml#/definitions/uint32-array
151151

152+
sink-vdos-v1:
153+
description: An array of u32 with each entry, a Vendor Defined Message Object (VDO),
154+
providing additional information corresponding to the product, the detailed bit
155+
definitions and the order of each VDO can be found in
156+
"USB Power Delivery Specification Revision 2.0, Version 1.3" chapter 6.4.4.3.1 Discover
157+
Identity. User can specify the VDO array via VDO_IDH/_CERT/_PRODUCT/_CABLE/_AMA defined in
158+
dt-bindings/usb/pd.h.
159+
minItems: 3
160+
maxItems: 6
161+
$ref: /schemas/types.yaml#/definitions/uint32-array
162+
152163
op-sink-microwatt:
153164
description: Sink required operating power in microwatt, if source can't
154165
offer the power, Capability Mismatch is set. Required for power sink and
@@ -207,6 +218,10 @@ properties:
207218
SNK_READY for non-pd link.
208219
type: boolean
209220

221+
dependencies:
222+
sink-vdos-v1: [ 'sink-vdos' ]
223+
sink-vdos: [ 'sink-vdos-v1' ]
224+
210225
required:
211226
- compatible
212227

MAINTAINERS

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18873,6 +18873,13 @@ S: Maintained
1887318873
F: drivers/usb/host/isp116x*
1887418874
F: include/linux/usb/isp116x.h
1887518875

18876+
USB ISP1760 DRIVER
18877+
M: Rui Miguel Silva <[email protected]>
18878+
18879+
S: Maintained
18880+
F: drivers/usb/isp1760/*
18881+
F: Documentation/devicetree/bindings/usb/nxp,isp1760.yaml
18882+
1887618883
USB LAN78XX ETHERNET DRIVER
1887718884
M: Woojung Huh <[email protected]>
1887818885

drivers/usb/cdns3/cdns3-gadget.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2007,7 +2007,7 @@ static void cdns3_configure_dmult(struct cdns3_device *priv_dev,
20072007
else
20082008
mask = BIT(priv_ep->num);
20092009

2010-
if (priv_ep->type != USB_ENDPOINT_XFER_ISOC) {
2010+
if (priv_ep->type != USB_ENDPOINT_XFER_ISOC && !priv_ep->dir) {
20112011
cdns3_set_register_bit(&regs->tdl_from_trb, mask);
20122012
cdns3_set_register_bit(&regs->tdl_beh, mask);
20132013
cdns3_set_register_bit(&regs->tdl_beh2, mask);
@@ -2046,15 +2046,13 @@ int cdns3_ep_config(struct cdns3_endpoint *priv_ep, bool enable)
20462046
case USB_ENDPOINT_XFER_INT:
20472047
ep_cfg = EP_CFG_EPTYPE(USB_ENDPOINT_XFER_INT);
20482048

2049-
if ((priv_dev->dev_ver == DEV_VER_V2 && !priv_ep->dir) ||
2050-
priv_dev->dev_ver > DEV_VER_V2)
2049+
if (priv_dev->dev_ver >= DEV_VER_V2 && !priv_ep->dir)
20512050
ep_cfg |= EP_CFG_TDL_CHK;
20522051
break;
20532052
case USB_ENDPOINT_XFER_BULK:
20542053
ep_cfg = EP_CFG_EPTYPE(USB_ENDPOINT_XFER_BULK);
20552054

2056-
if ((priv_dev->dev_ver == DEV_VER_V2 && !priv_ep->dir) ||
2057-
priv_dev->dev_ver > DEV_VER_V2)
2055+
if (priv_dev->dev_ver >= DEV_VER_V2 && !priv_ep->dir)
20582056
ep_cfg |= EP_CFG_TDL_CHK;
20592057
break;
20602058
default:

drivers/usb/cdns3/cdnsp-ring.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1517,13 +1517,14 @@ irqreturn_t cdnsp_thread_irq_handler(int irq, void *data)
15171517
{
15181518
struct cdnsp_device *pdev = (struct cdnsp_device *)data;
15191519
union cdnsp_trb *event_ring_deq;
1520+
unsigned long flags;
15201521
int counter = 0;
15211522

1522-
spin_lock(&pdev->lock);
1523+
spin_lock_irqsave(&pdev->lock, flags);
15231524

15241525
if (pdev->cdnsp_state & (CDNSP_STATE_HALTED | CDNSP_STATE_DYING)) {
15251526
cdnsp_died(pdev);
1526-
spin_unlock(&pdev->lock);
1527+
spin_unlock_irqrestore(&pdev->lock, flags);
15271528
return IRQ_HANDLED;
15281529
}
15291530

@@ -1539,7 +1540,7 @@ irqreturn_t cdnsp_thread_irq_handler(int irq, void *data)
15391540

15401541
cdnsp_update_erst_dequeue(pdev, event_ring_deq, 1);
15411542

1542-
spin_unlock(&pdev->lock);
1543+
spin_unlock_irqrestore(&pdev->lock, flags);
15431544

15441545
return IRQ_HANDLED;
15451546
}

drivers/usb/dwc3/core.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1690,11 +1690,6 @@ static int dwc3_remove(struct platform_device *pdev)
16901690
return 0;
16911691
}
16921692

1693-
static void dwc3_shutdown(struct platform_device *pdev)
1694-
{
1695-
dwc3_remove(pdev);
1696-
}
1697-
16981693
#ifdef CONFIG_PM
16991694
static int dwc3_core_init_for_resume(struct dwc3 *dwc)
17001695
{
@@ -2012,7 +2007,6 @@ MODULE_DEVICE_TABLE(acpi, dwc3_acpi_match);
20122007
static struct platform_driver dwc3_driver = {
20132008
.probe = dwc3_probe,
20142009
.remove = dwc3_remove,
2015-
.shutdown = dwc3_shutdown,
20162010
.driver = {
20172011
.name = "dwc3",
20182012
.of_match_table = of_match_ptr(of_dwc3_match),

drivers/usb/dwc3/debug.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,9 +413,12 @@ static inline const char *dwc3_gadget_generic_cmd_status_string(int status)
413413

414414

415415
#ifdef CONFIG_DEBUG_FS
416+
extern void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep);
416417
extern void dwc3_debugfs_init(struct dwc3 *d);
417418
extern void dwc3_debugfs_exit(struct dwc3 *d);
418419
#else
420+
static inline void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep)
421+
{ }
419422
static inline void dwc3_debugfs_init(struct dwc3 *d)
420423
{ }
421424
static inline void dwc3_debugfs_exit(struct dwc3 *d)

drivers/usb/dwc3/debugfs.c

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -886,30 +886,14 @@ static void dwc3_debugfs_create_endpoint_files(struct dwc3_ep *dep,
886886
}
887887
}
888888

889-
static void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep,
890-
struct dentry *parent)
889+
void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep)
891890
{
892891
struct dentry *dir;
893892

894-
dir = debugfs_create_dir(dep->name, parent);
893+
dir = debugfs_create_dir(dep->name, dep->dwc->root);
895894
dwc3_debugfs_create_endpoint_files(dep, dir);
896895
}
897896

898-
static void dwc3_debugfs_create_endpoint_dirs(struct dwc3 *dwc,
899-
struct dentry *parent)
900-
{
901-
int i;
902-
903-
for (i = 0; i < dwc->num_eps; i++) {
904-
struct dwc3_ep *dep = dwc->eps[i];
905-
906-
if (!dep)
907-
continue;
908-
909-
dwc3_debugfs_create_endpoint_dir(dep, parent);
910-
}
911-
}
912-
913897
void dwc3_debugfs_init(struct dwc3 *dwc)
914898
{
915899
struct dentry *root;
@@ -940,7 +924,6 @@ void dwc3_debugfs_init(struct dwc3 *dwc)
940924
&dwc3_testmode_fops);
941925
debugfs_create_file("link_state", 0644, root, dwc,
942926
&dwc3_link_state_fops);
943-
dwc3_debugfs_create_endpoint_dirs(dwc, root);
944927
}
945928
}
946929

drivers/usb/dwc3/dwc3-meson-g12a.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -651,14 +651,17 @@ static int dwc3_meson_g12a_setup_regmaps(struct dwc3_meson_g12a *priv,
651651
return PTR_ERR(priv->usb_glue_regmap);
652652

653653
/* Create a regmap for each USB2 PHY control register set */
654-
for (i = 0; i < priv->usb2_ports; i++) {
654+
for (i = 0; i < priv->drvdata->num_phys; i++) {
655655
struct regmap_config u2p_regmap_config = {
656656
.reg_bits = 8,
657657
.val_bits = 32,
658658
.reg_stride = 4,
659659
.max_register = U2P_R1,
660660
};
661661

662+
if (!strstr(priv->drvdata->phy_names[i], "usb2"))
663+
continue;
664+
662665
u2p_regmap_config.name = devm_kasprintf(priv->dev, GFP_KERNEL,
663666
"u2p-%d", i);
664667
if (!u2p_regmap_config.name)
@@ -772,13 +775,13 @@ static int dwc3_meson_g12a_probe(struct platform_device *pdev)
772775

773776
ret = priv->drvdata->usb_init(priv);
774777
if (ret)
775-
goto err_disable_clks;
778+
goto err_disable_regulator;
776779

777780
/* Init PHYs */
778781
for (i = 0 ; i < PHY_COUNT ; ++i) {
779782
ret = phy_init(priv->phys[i]);
780783
if (ret)
781-
goto err_disable_clks;
784+
goto err_disable_regulator;
782785
}
783786

784787
/* Set PHY Power */
@@ -816,6 +819,10 @@ static int dwc3_meson_g12a_probe(struct platform_device *pdev)
816819
for (i = 0 ; i < PHY_COUNT ; ++i)
817820
phy_exit(priv->phys[i]);
818821

822+
err_disable_regulator:
823+
if (priv->vbus)
824+
regulator_disable(priv->vbus);
825+
819826
err_disable_clks:
820827
clk_bulk_disable_unprepare(priv->drvdata->num_clks,
821828
priv->drvdata->clks);

drivers/usb/dwc3/ep0.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,9 @@ static struct dwc3_ep *dwc3_wIndex_to_dep(struct dwc3 *dwc, __le16 wIndex_le)
292292
epnum |= 1;
293293

294294
dep = dwc->eps[epnum];
295+
if (dep == NULL)
296+
return NULL;
297+
295298
if (dep->flags & DWC3_EP_ENABLED)
296299
return dep;
297300

drivers/usb/dwc3/gadget.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2261,13 +2261,10 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
22612261
}
22622262

22632263
/*
2264-
* Synchronize any pending event handling before executing the controller
2265-
* halt routine.
2264+
* Synchronize and disable any further event handling while controller
2265+
* is being enabled/disabled.
22662266
*/
2267-
if (!is_on) {
2268-
dwc3_gadget_disable_irq(dwc);
2269-
synchronize_irq(dwc->irq_gadget);
2270-
}
2267+
disable_irq(dwc->irq_gadget);
22712268

22722269
spin_lock_irqsave(&dwc->lock, flags);
22732270

@@ -2305,6 +2302,8 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
23052302

23062303
ret = dwc3_gadget_run_stop(dwc, is_on, false);
23072304
spin_unlock_irqrestore(&dwc->lock, flags);
2305+
enable_irq(dwc->irq_gadget);
2306+
23082307
pm_runtime_put(dwc->dev);
23092308

23102309
return ret;
@@ -2754,6 +2753,8 @@ static int dwc3_gadget_init_endpoint(struct dwc3 *dwc, u8 epnum)
27542753
INIT_LIST_HEAD(&dep->started_list);
27552754
INIT_LIST_HEAD(&dep->cancelled_list);
27562755

2756+
dwc3_debugfs_create_endpoint_dir(dep);
2757+
27572758
return 0;
27582759
}
27592760

@@ -2797,6 +2798,7 @@ static void dwc3_gadget_free_endpoints(struct dwc3 *dwc)
27972798
list_del(&dep->endpoint.ep_list);
27982799
}
27992800

2801+
debugfs_remove_recursive(debugfs_lookup(dep->name, dwc->root));
28002802
kfree(dep);
28012803
}
28022804
}
@@ -4046,6 +4048,7 @@ int dwc3_gadget_init(struct dwc3 *dwc)
40464048
dwc3_gadget_free_endpoints(dwc);
40474049
err4:
40484050
usb_put_gadget(dwc->gadget);
4051+
dwc->gadget = NULL;
40494052
err3:
40504053
dma_free_coherent(dwc->sysdev, DWC3_BOUNCE_SIZE, dwc->bounce,
40514054
dwc->bounce_addr);
@@ -4065,6 +4068,9 @@ int dwc3_gadget_init(struct dwc3 *dwc)
40654068

40664069
void dwc3_gadget_exit(struct dwc3 *dwc)
40674070
{
4071+
if (!dwc->gadget)
4072+
return;
4073+
40684074
usb_del_gadget(dwc->gadget);
40694075
dwc3_gadget_free_endpoints(dwc);
40704076
usb_put_gadget(dwc->gadget);

0 commit comments

Comments
 (0)