diff options
| author | Mark Brown <broonie@kernel.org> | 2026-09-07 14:28:23 +0100 |
|---|---|---|
| committer | Mark Brown <broonie@kernel.org> | 2026-09-07 14:28:23 +0100 |
| commit | ba001f006abf3f70ec257414b168655ae5556098 (patch) | |
| tree | 837de0589cccb00bec56660a7f57f978b07524fd | |
| parent | cefed17f06de5271cf17b6993bb3d616ee2d5ac5 (diff) | |
| parent | edc1518454f6439e50a9220e9a3ba09044ea8d8b (diff) | |
| download | linux-next-ba001f006abf3f70ec257414b168655ae5556098.tar.gz linux-next-ba001f006abf3f70ec257414b168655ae5556098.zip | |
Merge branch 'usb-next' of https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
42 files changed, 303 insertions, 114 deletions
diff --git a/Documentation/devicetree/bindings/usb/generic-ehci.yaml b/Documentation/devicetree/bindings/usb/generic-ehci.yaml index ae9fb70d0212..908b02d9175e 100644 --- a/Documentation/devicetree/bindings/usb/generic-ehci.yaml +++ b/Documentation/devicetree/bindings/usb/generic-ehci.yaml @@ -55,6 +55,10 @@ properties: - rockchip,rk3588-ehci - snps,hsdk-v1.0-ehci - socionext,uniphier-ehci + - st,stm32mp13-ehci + - st,stm32mp15-ehci + - st,stm32mp23-ehci + - st,stm32mp25-ehci - const: generic-ehci - items: - enum: @@ -80,6 +84,9 @@ properties: minItems: 1 maxItems: 2 + access-controllers: + maxItems: 1 + dma-coherent: true interrupts: @@ -193,6 +200,23 @@ allOf: else: properties: clock-names: false + - if: + properties: + compatible: + contains: + enum: + - st,stm32mp23-ehci + - st,stm32mp25-ehci + then: + properties: + clocks: + items: + - description: PHY clock + - description: Bus clock + + required: + - access-controllers + - clocks unevaluatedProperties: false diff --git a/Documentation/devicetree/bindings/usb/generic-ohci.yaml b/Documentation/devicetree/bindings/usb/generic-ohci.yaml index 322808aaa283..7a8c3c231815 100644 --- a/Documentation/devicetree/bindings/usb/generic-ohci.yaml +++ b/Documentation/devicetree/bindings/usb/generic-ohci.yaml @@ -49,6 +49,10 @@ properties: - ingenic,jz4740-ohci - rockchip,rk3588-ohci - snps,hsdk-v1.0-ohci + - st,stm32mp13-ohci + - st,stm32mp15-ohci + - st,stm32mp23-ohci + - st,stm32mp25-ohci - const: generic-ohci - enum: - generic-ohci @@ -65,6 +69,9 @@ properties: reg: maxItems: 1 + access-controllers: + maxItems: 1 + dma-coherent: true interrupts: @@ -213,6 +220,23 @@ allOf: clocks: minItems: 1 maxItems: 3 + - if: + properties: + compatible: + contains: + enum: + - st,stm32mp23-ohci + - st,stm32mp25-ohci + then: + properties: + clocks: + items: + - description: PHY clock + - description: Bus clock + + required: + - access-controllers + - clocks unevaluatedProperties: false diff --git a/Documentation/devicetree/bindings/usb/gpio-sbu-mux.yaml b/Documentation/devicetree/bindings/usb/gpio-sbu-mux.yaml index 793662f6f3bf..c0e60848d8ab 100644 --- a/Documentation/devicetree/bindings/usb/gpio-sbu-mux.yaml +++ b/Documentation/devicetree/bindings/usb/gpio-sbu-mux.yaml @@ -22,6 +22,7 @@ properties: - nxp,cbdtu02043 - onnn,fsusb42 - onnn,fsusb43l10x + - onnn,fusb340 - pericom,pi3usb102 - ti,tmuxhs4212 - const: gpio-sbu-mux diff --git a/Documentation/devicetree/bindings/usb/qcom,snps-dwc3.yaml b/Documentation/devicetree/bindings/usb/qcom,snps-dwc3.yaml index ea60f7220afe..9f91c8711e02 100644 --- a/Documentation/devicetree/bindings/usb/qcom,snps-dwc3.yaml +++ b/Documentation/devicetree/bindings/usb/qcom,snps-dwc3.yaml @@ -40,6 +40,7 @@ properties: - qcom,maili-dwc3 - qcom,milos-dwc3 - qcom,msm8953-dwc3 + - qcom,msm8974-dwc3 - qcom,msm8994-dwc3 - qcom,msm8996-dwc3 - qcom,msm8998-dwc3 @@ -268,6 +269,7 @@ allOf: contains: enum: - qcom,ipq8074-dwc3 + - qcom,msm8974-dwc3 - qcom,qdu1000-dwc3 then: properties: @@ -458,6 +460,23 @@ allOf: compatible: contains: enum: + - qcom,msm8974-dwc3 + then: + properties: + interrupts: + minItems: 3 + maxItems: 3 + interrupt-names: + items: + - const: dwc_usb3 + - const: pwr_event + - const: hs_phy_irq + + - if: + properties: + compatible: + contains: + enum: - qcom,msm8994-dwc3 - qcom,msm8996-dwc3 - qcom,qcs404-dwc3 diff --git a/Documentation/devicetree/bindings/usb/ti,hd3ss3220.yaml b/Documentation/devicetree/bindings/usb/ti,hd3ss3220.yaml index 06099e93c6c3..654a982666dd 100644 --- a/Documentation/devicetree/bindings/usb/ti,hd3ss3220.yaml +++ b/Documentation/devicetree/bindings/usb/ti,hd3ss3220.yaml @@ -25,6 +25,15 @@ properties: interrupts: maxItems: 1 + vcc33-supply: + description: 3.3V supply (VCC33 pin), powering the SuperSpeed 2:1 MUX. + + vdd5-supply: + description: + 5V supply (VDD5 pin), powering the CC controller and sourcing VCONN. + VDD5 has to be stable for at least tVDD5V_PG (2ms) before VCC33 starts + ramping up, unless ENn_CC is held high while both rails ramp up. + id-gpios: description: An input gpio for USB ID pin. Upon detecting a UFP device, HD3SS3220 @@ -68,6 +77,8 @@ examples: reg = <0x47>; interrupt-parent = <&gpio6>; interrupts = <3>; + vcc33-supply = <&vcc3v3_control>; + vdd5-supply = <&vcc5v0_device_s0>; ports { #address-cells = <1>; diff --git a/arch/arm/boot/dts/st/stm32mp131.dtsi b/arch/arm/boot/dts/st/stm32mp131.dtsi index 5ae33b26e313..ae45c2023afe 100644 --- a/arch/arm/boot/dts/st/stm32mp131.dtsi +++ b/arch/arm/boot/dts/st/stm32mp131.dtsi @@ -1128,7 +1128,7 @@ }; usbh_ohci: usb@5800c000 { - compatible = "generic-ohci"; + compatible = "st,stm32mp13-ohci", "generic-ohci"; reg = <0x5800c000 0x1000>; clocks = <&usbphyc>, <&rcc USBH>; resets = <&rcc USBH_R>; @@ -1137,7 +1137,7 @@ }; usbh_ehci: usb@5800d000 { - compatible = "generic-ehci"; + compatible = "st,stm32mp13-ehci", "generic-ehci"; reg = <0x5800d000 0x1000>; clocks = <&usbphyc>, <&rcc USBH>; resets = <&rcc USBH_R>; diff --git a/arch/arm/boot/dts/st/stm32mp151.dtsi b/arch/arm/boot/dts/st/stm32mp151.dtsi index e7fec8b49ae1..ae3188373238 100644 --- a/arch/arm/boot/dts/st/stm32mp151.dtsi +++ b/arch/arm/boot/dts/st/stm32mp151.dtsi @@ -504,7 +504,7 @@ }; usbh_ohci: usb@5800c000 { - compatible = "generic-ohci"; + compatible = "st,stm32mp15-ohci", "generic-ohci"; reg = <0x5800c000 0x1000>; clocks = <&usbphyc>, <&rcc USBH>; resets = <&rcc USBH_R>; @@ -515,7 +515,7 @@ }; usbh_ehci: usb@5800d000 { - compatible = "generic-ehci"; + compatible = "st,stm32mp15-ehci", "generic-ehci"; reg = <0x5800d000 0x1000>; clocks = <&usbphyc>, <&rcc USBH>; resets = <&rcc USBH_R>; diff --git a/arch/arm64/boot/dts/st/stm32mp231.dtsi b/arch/arm64/boot/dts/st/stm32mp231.dtsi index 9e1d240888ff..a393bcfd768a 100644 --- a/arch/arm64/boot/dts/st/stm32mp231.dtsi +++ b/arch/arm64/boot/dts/st/stm32mp231.dtsi @@ -778,6 +778,48 @@ snps,wr_osr_lmt = <0x7>; }; }; + + usbh_ohci: usb@482e0000 { + compatible = "st,stm32mp23-ohci", "generic-ohci"; + reg = <0x482e0000 0x1000>; + access-controllers = <&rifsc 63>; + clocks = <&usb2_phy1 1>, <&rcc CK_BUS_USB2OHCI>; + interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>; + phys = <&usb2_phy1>; + phy-names = "usb"; + resets = <&rcc USBH_R>; + status = "disabled"; + }; + + usbh_ehci: usb@482f0000 { + compatible = "st,stm32mp23-ehci", "generic-ehci"; + reg = <0x482f0000 0x1000>; + access-controllers = <&rifsc 63>; + clocks = <&usb2_phy1 0>, <&rcc CK_BUS_USB2EHCI>; + companion = <&usbh_ohci>; + interrupts = <GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>; + phys = <&usb2_phy1>; + phy-names = "usb"; + resets = <&rcc USBH_R>; + status = "disabled"; + }; + + usb3dr: usb@48300000 { + compatible = "st,stm32mp25-dwc3"; + reg = <0x48300000 0x100000>; + access-controllers = <&rifsc 66>; + clocks = <&rcc CK_KER_USB2PHY2>, + <&rcc CK_BUS_USB3DR>, + <&rcc CK_KER_USB2PHY2>; + clock-names = "ref", "bus_early", "suspend"; + interrupts = <GIC_SPI 228 IRQ_TYPE_LEVEL_HIGH>; + maximum-speed = "high-speed"; + phys = <&usb2_phy2>; + phy-names = "usb2-phy"; + resets = <&rcc USB3DR_R>; + st,syscfg = <&syscfg 0x4800>; + status = "disabled"; + }; }; bsec: efuse@44000000 { @@ -981,6 +1023,28 @@ compatible = "st,stm32mp23-syscfg", "syscon"; reg = <0x44230000 0x10000>; #clock-cells = <0>; + #address-cells = <1>; + #size-cells = <1>; + + usb2_phy1: phy@2400 { + compatible = "st,stm32mp25-usb2phy1"; + reg = <0x2400 0x24>; + #phy-cells = <0>; + #clock-cells = <1>; + clocks = <&rcc CK_KER_USB2PHY1>; + resets = <&rcc USB2PHY1_R>; + status = "disabled"; + }; + + usb2_phy2: phy@2800 { + compatible = "st,stm32mp25-usb2phy2"; + reg = <0x2800 0x10>; + #phy-cells = <0>; + #clock-cells = <1>; + clocks = <&rcc CK_KER_USB2PHY2EN>; + resets = <&rcc USB2PHY2_R>; + status = "disabled"; + }; }; pinctrl: pinctrl@44240000 { diff --git a/arch/arm64/boot/dts/st/stm32mp251.dtsi b/arch/arm64/boot/dts/st/stm32mp251.dtsi index 9c63fdb5a885..0d814ae2476a 100644 --- a/arch/arm64/boot/dts/st/stm32mp251.dtsi +++ b/arch/arm64/boot/dts/st/stm32mp251.dtsi @@ -1716,6 +1716,47 @@ }; }; + usbh_ohci: usb@482e0000 { + compatible = "st,stm32mp25-ohci", "generic-ohci"; + reg = <0x482e0000 0x1000>; + access-controllers = <&rifsc 63>; + clocks = <&usb2_phy1 1>, <&rcc CK_BUS_USB2OHCI>; + interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>; + phys = <&usb2_phy1>; + phy-names = "usb"; + resets = <&rcc USBH_R>; + status = "disabled"; + }; + + usbh_ehci: usb@482f0000 { + compatible = "st,stm32mp25-ehci", "generic-ehci"; + reg = <0x482f0000 0x1000>; + access-controllers = <&rifsc 63>; + clocks = <&usb2_phy1 0>, <&rcc CK_BUS_USB2EHCI>; + companion = <&usbh_ohci>; + interrupts = <GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>; + phys = <&usb2_phy1>; + phy-names = "usb"; + resets = <&rcc USBH_R>; + status = "disabled"; + }; + + usb3dr: usb@48300000 { + compatible = "st,stm32mp25-dwc3"; + reg = <0x48300000 0x100000>; + access-controllers = <&rifsc 66>; + clocks = <&rcc CK_KER_USB2PHY2>, + <&rcc CK_BUS_USB3DR>, + <&rcc CK_KER_USB2PHY2>; + clock-names = "ref", "bus_early", "suspend"; + interrupts = <GIC_SPI 228 IRQ_TYPE_LEVEL_HIGH>; + phys = <&usb2_phy2>, <&combophy PHY_TYPE_USB3>; + phy-names = "usb2-phy", "usb3-phy"; + resets = <&rcc USB3DR_R>; + st,syscfg = <&syscfg 0x4800>; + status = "disabled"; + }; + pcie_ep: pcie-ep@48400000 { compatible = "st,stm32mp25-pcie-ep"; reg = <0x48400000 0x100000>, @@ -1975,6 +2016,28 @@ compatible = "st,stm32mp25-syscfg", "syscon"; reg = <0x44230000 0x10000>; #clock-cells = <0>; + #address-cells = <1>; + #size-cells = <1>; + + usb2_phy1: phy@2400 { + compatible = "st,stm32mp25-usb2phy1"; + reg = <0x2400 0x24>; + #phy-cells = <0>; + #clock-cells = <1>; + clocks = <&rcc CK_KER_USB2PHY1>; + resets = <&rcc USB2PHY1_R>; + status = "disabled"; + }; + + usb2_phy2: phy@2800 { + compatible = "st,stm32mp25-usb2phy2"; + reg = <0x2800 0x10>; + #phy-cells = <0>; + #clock-cells = <1>; + clocks = <&rcc CK_KER_USB2PHY2EN>; + resets = <&rcc USB2PHY2_R>; + status = "disabled"; + }; }; pinctrl: pinctrl@44240000 { diff --git a/drivers/usb/cdns3/core.c b/drivers/usb/cdns3/core.c index 504bdf13ea80..87122fb5bdb8 100644 --- a/drivers/usb/cdns3/core.c +++ b/drivers/usb/cdns3/core.c @@ -449,10 +449,8 @@ int cdns_init(struct cdns *cdns) IRQF_SHARED, dev_name(cdns->dev), cdns); - if (ret) { - dev_err(cdns->dev, "couldn't register wakeup irq handler\n"); + if (ret) goto role_switch_unregister; - } } ret = cdns_drd_init(cdns); diff --git a/drivers/usb/cdns3/drd.c b/drivers/usb/cdns3/drd.c index d2bb682e4552..42f13757d904 100644 --- a/drivers/usb/cdns3/drd.c +++ b/drivers/usb/cdns3/drd.c @@ -509,10 +509,8 @@ int cdns_drd_init(struct cdns *cdns) cdns_drd_thread_irq, IRQF_SHARED, dev_name(cdns->dev), cdns); - if (ret) { - dev_err(cdns->dev, "couldn't get otg_irq\n"); + if (ret) return ret; - } state = readl(&cdns->otg_regs->sts); if (OTGSTS_OTG_NRDY(state)) { diff --git a/drivers/usb/common/usb-conn-gpio.c b/drivers/usb/common/usb-conn-gpio.c index 421c3af38e06..f6db03d89efd 100644 --- a/drivers/usb/common/usb-conn-gpio.c +++ b/drivers/usb/common/usb-conn-gpio.c @@ -251,10 +251,8 @@ static int usb_conn_probe(struct platform_device *pdev) ret = devm_request_threaded_irq(dev, info->id_irq, NULL, usb_conn_isr, USB_CONN_IRQF, pdev->name, info); - if (ret < 0) { - dev_err(dev, "failed to request ID IRQ\n"); + if (ret < 0) goto put_role_sw; - } } if (info->vbus_gpiod) { @@ -268,10 +266,8 @@ static int usb_conn_probe(struct platform_device *pdev) ret = devm_request_threaded_irq(dev, info->vbus_irq, NULL, usb_conn_isr, USB_CONN_IRQF, pdev->name, info); - if (ret < 0) { - dev_err(dev, "failed to request VBUS IRQ\n"); + if (ret < 0) goto put_role_sw; - } } platform_set_drvdata(pdev, info); diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c index 102169b40419..f7afbedf9f2c 100644 --- a/drivers/usb/dwc2/gadget.c +++ b/drivers/usb/dwc2/gadget.c @@ -5053,10 +5053,8 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg) ret = devm_request_irq(hsotg->dev, hsotg->irq, dwc2_hsotg_irq, IRQF_SHARED, dev_name(hsotg->dev), hsotg); - if (ret < 0) { - dev_err(dev, "cannot claim IRQ for gadget\n"); + if (ret < 0) return ret; - } /* hsotg->num_of_eps holds number of EPs other than ep0 */ diff --git a/drivers/usb/dwc3/debugfs.c b/drivers/usb/dwc3/debugfs.c index 65d909e4b785..01ebd73198e0 100644 --- a/drivers/usb/dwc3/debugfs.c +++ b/drivers/usb/dwc3/debugfs.c @@ -367,14 +367,10 @@ static ssize_t dwc3_lsp_write(struct file *file, const char __user *ubuf, struct seq_file *s = file->private_data; struct dwc3 *dwc = s->private; unsigned long flags; - char buf[32] = { 0 }; u32 sel; int ret; - if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count))) - return -EFAULT; - - ret = kstrtouint(buf, 0, &sel); + ret = kstrtou32_from_user(ubuf, count, 0, &sel); if (ret) return ret; diff --git a/drivers/usb/dwc3/dwc3-google.c b/drivers/usb/dwc3/dwc3-google.c index a01ca23cb6a8..ec53e658760e 100644 --- a/drivers/usb/dwc3/dwc3-google.c +++ b/drivers/usb/dwc3/dwc3-google.c @@ -235,10 +235,8 @@ static int dwc3_google_request_irq(struct dwc3_google *google, struct platform_d dwc3_google_resume_irq, IRQF_TRIGGER_HIGH | IRQF_ONESHOT, req_name, google); - if (ret < 0) { - dev_err(google->dev, "failed to request irq %s\n", req_name); + if (ret < 0) return ret; - } return irq; } diff --git a/drivers/usb/dwc3/dwc3-imx.c b/drivers/usb/dwc3/dwc3-imx.c index 973a486b544d..d967acd43d44 100644 --- a/drivers/usb/dwc3/dwc3-imx.c +++ b/drivers/usb/dwc3/dwc3-imx.c @@ -250,7 +250,7 @@ static int dwc3_imx_probe(struct platform_device *pdev) IRQF_ONESHOT | IRQF_NO_AUTOEN, irq_name, dwc_imx); if (ret) - return dev_err_probe(dev, ret, "failed to request IRQ #%d\n", irq); + return ret; ret = device_add_software_node(dev, &dwc3_imx_swnode); if (ret) diff --git a/drivers/usb/dwc3/dwc3-imx8mp.c b/drivers/usb/dwc3/dwc3-imx8mp.c index 1cf96540b66e..ee92a5efaa6e 100644 --- a/drivers/usb/dwc3/dwc3-imx8mp.c +++ b/drivers/usb/dwc3/dwc3-imx8mp.c @@ -273,10 +273,8 @@ static int dwc3_imx8mp_probe(struct platform_device *pdev) err = devm_request_threaded_irq(dev, irq, NULL, dwc3_imx8mp_interrupt, IRQF_ONESHOT, dev_name(dev), dwc3_imx); - if (err) { - dev_err(dev, "failed to request IRQ #%d --> %d\n", irq, err); + if (err) goto put_dwc3; - } device_set_wakeup_capable(dev, true); pm_runtime_put(dev); diff --git a/drivers/usb/dwc3/dwc3-keystone.c b/drivers/usb/dwc3/dwc3-keystone.c index 7ee1610162b9..8ad302abe883 100644 --- a/drivers/usb/dwc3/dwc3-keystone.c +++ b/drivers/usb/dwc3/dwc3-keystone.c @@ -144,11 +144,8 @@ static int kdwc3_probe(struct platform_device *pdev) error = devm_request_irq(dev, irq, dwc3_keystone_interrupt, IRQF_SHARED, dev_name(dev), kdwc); - if (error) { - dev_err(dev, "failed to request IRQ #%d --> %d\n", - irq, error); + if (error) goto err_irq; - } kdwc3_enable_irqs(kdwc); diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c index fe74d11bb629..3bff775fbe4e 100644 --- a/drivers/usb/dwc3/dwc3-omap.c +++ b/drivers/usb/dwc3/dwc3-omap.c @@ -518,11 +518,8 @@ static int dwc3_omap_probe(struct platform_device *pdev) ret = devm_request_threaded_irq(dev, omap->irq, dwc3_omap_interrupt, dwc3_omap_interrupt_thread, IRQF_SHARED, "dwc3-omap", omap); - if (ret) { - dev_err(dev, "failed to request IRQ #%d --> %d\n", - omap->irq, ret); + if (ret) goto err2; - } dwc3_omap_enable_irqs(omap); return 0; diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c index ac68b4218b56..ba26e61df915 100644 --- a/drivers/usb/dwc3/dwc3-qcom.c +++ b/drivers/usb/dwc3/dwc3-qcom.c @@ -19,6 +19,7 @@ #include <linux/iopoll.h> #include <linux/usb/hcd.h> #include <linux/usb.h> +#include <linux/property.h> #include "core.h" #include "glue.h" @@ -419,6 +420,16 @@ static irqreturn_t qcom_dwc3_resume_irq(int irq, void *data) return IRQ_HANDLED; } +static int dwc3_qcom_set_swnode(struct device *dev) +{ + const struct property_entry props[] = { + PROPERTY_ENTRY_BOOL("xhci-skip-phy-init-quirk"), + {} + }; + + return device_create_managed_software_node(dev, props, NULL); +} + static void dwc3_qcom_select_utmi_clk(struct dwc3_qcom *qcom) { /* Configure dwc3 to use UTMI clock as PIPE clock not present */ @@ -683,6 +694,10 @@ static int dwc3_qcom_probe(struct platform_device *pdev) if (ignore_pipe_clk) dwc3_qcom_select_utmi_clk(qcom); + ret = dwc3_qcom_set_swnode(dev); + if (ret) + goto clk_disable; + qcom->mode = usb_get_dr_mode(dev); if (qcom->mode == USB_DR_MODE_HOST) { diff --git a/drivers/usb/gadget/udc/aspeed-vhub/core.c b/drivers/usb/gadget/udc/aspeed-vhub/core.c index 4a8b9ff8368f..4ac990553a86 100644 --- a/drivers/usb/gadget/udc/aspeed-vhub/core.c +++ b/drivers/usb/gadget/udc/aspeed-vhub/core.c @@ -379,10 +379,8 @@ static int ast_vhub_probe(struct platform_device *pdev) } rc = devm_request_irq(&pdev->dev, vhub->irq, ast_vhub_irq, 0, KBUILD_MODNAME, vhub); - if (rc) { - dev_err(&pdev->dev, "Failed to request interrupt\n"); + if (rc) goto err; - } dma_mask_ptr = (u64 *)of_device_get_match_data(&pdev->dev); if (dma_mask_ptr) { diff --git a/drivers/usb/gadget/udc/aspeed_udc.c b/drivers/usb/gadget/udc/aspeed_udc.c index 54f81e668009..08b24902c7b9 100644 --- a/drivers/usb/gadget/udc/aspeed_udc.c +++ b/drivers/usb/gadget/udc/aspeed_udc.c @@ -1568,10 +1568,8 @@ static int ast_udc_probe(struct platform_device *pdev) rc = devm_request_irq(&pdev->dev, udc->irq, ast_udc_isr, 0, KBUILD_MODNAME, udc); - if (rc) { - dev_err(&pdev->dev, "Failed to request interrupt\n"); + if (rc) goto err_cleanup; - } rc = usb_add_gadget_udc(&pdev->dev, &udc->gadget); if (rc) { diff --git a/drivers/usb/gadget/udc/atmel_usba_udc.c b/drivers/usb/gadget/udc/atmel_usba_udc.c index 72a2f95ff018..18b4b2358d1e 100644 --- a/drivers/usb/gadget/udc/atmel_usba_udc.c +++ b/drivers/usb/gadget/udc/atmel_usba_udc.c @@ -2332,11 +2332,8 @@ static int usba_udc_probe(struct platform_device *pdev) ret = devm_request_irq(&pdev->dev, irq, usba_udc_irq, 0, "atmel_usba_udc", udc); - if (ret) { - dev_err(&pdev->dev, "Cannot request irq %d (error %d)\n", - irq, ret); + if (ret) return ret; - } udc->irq = irq; if (udc->vbus_pin) { diff --git a/drivers/usb/gadget/udc/r8a66597-udc.c b/drivers/usb/gadget/udc/r8a66597-udc.c index d190e16d43fc..915786c9628c 100644 --- a/drivers/usb/gadget/udc/r8a66597-udc.c +++ b/drivers/usb/gadget/udc/r8a66597-udc.c @@ -1894,10 +1894,8 @@ static int r8a66597_probe(struct platform_device *pdev) ret = devm_request_irq(dev, irq, r8a66597_irq, IRQF_SHARED, udc_name, r8a66597); - if (ret < 0) { - dev_err(dev, "request_irq error (%d)\n", ret); + if (ret < 0) goto clean_up2; - } INIT_LIST_HEAD(&r8a66597->gadget.ep_list); r8a66597->gadget.ep0 = &r8a66597->ep[0].ep; diff --git a/drivers/usb/gadget/udc/renesas_usbf.c b/drivers/usb/gadget/udc/renesas_usbf.c index d67002ea049a..367c9e73f366 100644 --- a/drivers/usb/gadget/udc/renesas_usbf.c +++ b/drivers/usb/gadget/udc/renesas_usbf.c @@ -3335,19 +3335,15 @@ static int usbf_probe(struct platform_device *pdev) if (irq < 0) return irq; ret = devm_request_irq(dev, irq, usbf_epc_irq, 0, "usbf-epc", udc); - if (ret) { - dev_err(dev, "cannot request irq %d err %d\n", irq, ret); + if (ret) return ret; - } irq = platform_get_irq(pdev, 1); if (irq < 0) return irq; ret = devm_request_irq(dev, irq, usbf_ahb_epc_irq, 0, "usbf-ahb-epc", udc); - if (ret) { - dev_err(dev, "cannot request irq %d err %d\n", irq, ret); + if (ret) return ret; - } usbf_reg_bitset(udc, USBF_REG_AHBMCTR, USBF_SYS_WBURST_TYPE); diff --git a/drivers/usb/gadget/udc/snps_udc_plat.c b/drivers/usb/gadget/udc/snps_udc_plat.c index 0ee3ed185d9c..8ce43c4f8fba 100644 --- a/drivers/usb/gadget/udc/snps_udc_plat.c +++ b/drivers/usb/gadget/udc/snps_udc_plat.c @@ -192,10 +192,8 @@ static int udc_plat_probe(struct platform_device *pdev) ret = devm_request_irq(dev, udc->irq, udc_irq, IRQF_SHARED, "snps-udc", udc); - if (ret < 0) { - dev_err(dev, "Request irq %d failed for UDC\n", udc->irq); + if (ret < 0) goto exit_dma; - } platform_set_drvdata(pdev, udc); udc->chiprev = UDC_BCM_REV; diff --git a/drivers/usb/gadget/udc/tegra-xudc.c b/drivers/usb/gadget/udc/tegra-xudc.c index e9d33be02866..5042c13f92be 100644 --- a/drivers/usb/gadget/udc/tegra-xudc.c +++ b/drivers/usb/gadget/udc/tegra-xudc.c @@ -3803,11 +3803,8 @@ static int tegra_xudc_probe(struct platform_device *pdev) err = devm_request_irq(&pdev->dev, xudc->irq, tegra_xudc_irq, 0, dev_name(&pdev->dev), xudc); - if (err < 0) { - dev_err(xudc->dev, "failed to claim IRQ#%u: %d\n", xudc->irq, - err); + if (err < 0) return err; - } xudc->clks = devm_kcalloc(&pdev->dev, xudc->soc->num_clks, sizeof(*xudc->clks), GFP_KERNEL); diff --git a/drivers/usb/host/xhci-tegra.c b/drivers/usb/host/xhci-tegra.c index 6f235d1e117e..15dfa7e1a7dd 100644 --- a/drivers/usb/host/xhci-tegra.c +++ b/drivers/usb/host/xhci-tegra.c @@ -1909,20 +1909,16 @@ static int tegra_xusb_probe(struct platform_device *pdev) tegra_xusb_mbox_irq, tegra_xusb_mbox_thread, 0, dev_name(&pdev->dev), tegra); - if (err < 0) { - dev_err(&pdev->dev, "failed to request IRQ: %d\n", err); + if (err < 0) goto remove_usb3; - } if (tegra->padctl_irq) { err = devm_request_threaded_irq(&pdev->dev, tegra->padctl_irq, NULL, tegra_xusb_padctl_irq, IRQF_ONESHOT, dev_name(&pdev->dev), tegra); - if (err < 0) { - dev_err(&pdev->dev, "failed to request padctl IRQ: %d\n", err); + if (err < 0) goto remove_usb3; - } } err = tegra_xusb_enable_firmware_messages(tegra); diff --git a/drivers/usb/misc/brcmstb-usb-pinmap.c b/drivers/usb/misc/brcmstb-usb-pinmap.c index 1ce885e4184c..d8e9c80a9c2e 100644 --- a/drivers/usb/misc/brcmstb-usb-pinmap.c +++ b/drivers/usb/misc/brcmstb-usb-pinmap.c @@ -299,10 +299,8 @@ static int __init brcmstb_usb_pinmap_probe(struct platform_device *pdev) brcmstb_usb_pinmap_ovr_isr, IRQF_TRIGGER_RISING, pdev->name, pdata); - if (err < 0) { - dev_err(&pdev->dev, "Error requesting IRQ\n"); + if (err < 0) return err; - } } for (x = 0, pin = pdata->in_pins; x < pdata->in_count; x++, pin++) { @@ -317,11 +315,8 @@ static int __init brcmstb_usb_pinmap_probe(struct platform_device *pdev) IRQF_SHARED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, pdev->name, pin); - if (err < 0) { - dev_err(&pdev->dev, "Error requesting IRQ for %s pin\n", - pin->name); + if (err < 0) return err; - } } dev_dbg(&pdev->dev, "Driver probe succeeded\n"); diff --git a/drivers/usb/misc/qcom_eud.c b/drivers/usb/misc/qcom_eud.c index 926419ca560f..a7b9ed4ac071 100644 --- a/drivers/usb/misc/qcom_eud.c +++ b/drivers/usb/misc/qcom_eud.c @@ -225,7 +225,7 @@ static int eud_probe(struct platform_device *pdev) ret = devm_request_threaded_irq(&pdev->dev, chip->irq, handle_eud_irq, handle_eud_irq_thread, IRQF_ONESHOT, NULL, chip); if (ret) - return dev_err_probe(chip->dev, ret, "failed to allocate irq\n"); + return ret; enable_irq_wake(chip->irq); diff --git a/drivers/usb/mtu3/mtu3_core.c b/drivers/usb/mtu3/mtu3_core.c index a40bf5bad2d5..990e2e8e6bc2 100644 --- a/drivers/usb/mtu3/mtu3_core.c +++ b/drivers/usb/mtu3/mtu3_core.c @@ -973,10 +973,8 @@ int ssusb_gadget_init(struct ssusb_mtk *ssusb) ret = devm_request_threaded_irq(dev, mtu->irq, NULL, mtu3_irq, IRQF_ONESHOT, dev_name(dev), mtu); - if (ret) { - dev_err(dev, "request irq %d failed!\n", mtu->irq); + if (ret) goto irq_err; - } /* power down device IP for power saving by default */ mtu3_stop(mtu); diff --git a/drivers/usb/phy/phy-ab8500-usb.c b/drivers/usb/phy/phy-ab8500-usb.c index 6a98aeeeae31..e2e06e57dced 100644 --- a/drivers/usb/phy/phy-ab8500-usb.c +++ b/drivers/usb/phy/phy-ab8500-usb.c @@ -748,10 +748,8 @@ static int ab8500_usb_irq_setup(struct platform_device *pdev, ab8500_usb_link_status_irq, IRQF_NO_SUSPEND | IRQF_SHARED | IRQF_ONESHOT, "usb-link-status", ab); - if (err < 0) { - dev_err(ab->dev, "request_irq failed for link status irq\n"); + if (err < 0) return err; - } } if (ab->flags & AB8500_USB_FLAG_USE_ID_WAKEUP_IRQ) { @@ -762,10 +760,8 @@ static int ab8500_usb_irq_setup(struct platform_device *pdev, ab8500_usb_disconnect_irq, IRQF_NO_SUSPEND | IRQF_SHARED | IRQF_ONESHOT, "usb-id-fall", ab); - if (err < 0) { - dev_err(ab->dev, "request_irq failed for ID fall irq\n"); + if (err < 0) return err; - } } if (ab->flags & AB8500_USB_FLAG_USE_VBUS_DET_IRQ) { @@ -776,10 +772,8 @@ static int ab8500_usb_irq_setup(struct platform_device *pdev, ab8500_usb_disconnect_irq, IRQF_NO_SUSPEND | IRQF_SHARED | IRQF_ONESHOT, "usb-vbus-fall", ab); - if (err < 0) { - dev_err(ab->dev, "request_irq failed for Vbus fall irq\n"); + if (err < 0) return err; - } } return 0; diff --git a/drivers/usb/phy/phy-generic.c b/drivers/usb/phy/phy-generic.c index de26b302334d..a41671eda2a1 100644 --- a/drivers/usb/phy/phy-generic.c +++ b/drivers/usb/phy/phy-generic.c @@ -282,8 +282,7 @@ static int usb_phy_generic_probe(struct platform_device *pdev) VBUS_IRQ_FLAGS, "vbus_detect", nop); if (err) - return dev_err_probe(dev, err, "can't request irq %i\n", - gpiod_to_irq(nop->gpiod_vbus)); + return err; nop->phy.otg->state = gpiod_get_value(nop->gpiod_vbus) ? OTG_STATE_B_PERIPHERAL : OTG_STATE_B_IDLE; diff --git a/drivers/usb/phy/phy-gpio-vbus-usb.c b/drivers/usb/phy/phy-gpio-vbus-usb.c index ce09e789afd8..c0135a30cabd 100644 --- a/drivers/usb/phy/phy-gpio-vbus-usb.c +++ b/drivers/usb/phy/phy-gpio-vbus-usb.c @@ -297,11 +297,8 @@ static int gpio_vbus_probe(struct platform_device *pdev) err = devm_request_irq(&pdev->dev, irq, gpio_vbus_irq, irqflags, "vbus_detect", pdev); - if (err) { - dev_err(&pdev->dev, "can't request irq %i, err: %d\n", - irq, err); + if (err) return err; - } INIT_DELAYED_WORK(&gpio_vbus->work, gpio_vbus_work); diff --git a/drivers/usb/renesas_usbhs/mod.c b/drivers/usb/renesas_usbhs/mod.c index f2ea3e1412d2..dcaebcc0614d 100644 --- a/drivers/usb/renesas_usbhs/mod.c +++ b/drivers/usb/renesas_usbhs/mod.c @@ -143,10 +143,8 @@ int usbhs_mod_probe(struct usbhs_priv *priv) /* irq settings */ ret = devm_request_irq(dev, priv->irq, usbhs_interrupt, 0, dev_name(dev), priv); - if (ret) { - dev_err(dev, "irq request err\n"); + if (ret) goto mod_init_gadget_err; - } return ret; diff --git a/drivers/usb/typec/anx7411.c b/drivers/usb/typec/anx7411.c index 41df115912b9..2c41e00819f8 100644 --- a/drivers/usb/typec/anx7411.c +++ b/drivers/usb/typec/anx7411.c @@ -1529,10 +1529,8 @@ static int anx7411_i2c_probe(struct i2c_client *client) IRQF_TRIGGER_FALLING | IRQF_ONESHOT, "anx7411-intp", plat); - if (ret) { - dev_err(dev, "fail to request irq\n"); + if (ret) goto free_wq; - } if (anx7411_typec_check_connection(plat)) dev_err(dev, "check status\n"); diff --git a/drivers/usb/typec/hd3ss3220.c b/drivers/usb/typec/hd3ss3220.c index 4eec90c82bae..a717d0f8a4e5 100644 --- a/drivers/usb/typec/hd3ss3220.c +++ b/drivers/usb/typec/hd3ss3220.c @@ -49,6 +49,9 @@ #define HD3SS3220_REG_GEN_CTRL_MODE_SELECT_UFP BIT(4) #define HD3SS3220_REG_GEN_CTRL_MODE_SELECT_DRP (BIT(5) | BIT(4)) +/* Minimum time VDD5 has to be stable before VCC33 starts ramping up */ +#define HD3SS3220_TVDD5V_PG_US 2000 + struct hd3ss3220 { struct device *dev; struct regmap *regmap; @@ -363,6 +366,31 @@ static irqreturn_t hd3ss3220_id_isr(int irq, void *dev_id) return IRQ_HANDLED; } +/* + * Bring both supplies up in the order the datasheet asks for. Powering VCC33 + * first can back-power the device in a non-functioning state, which grounds + * the I2C bus and takes both this device and any others on the same bus down + */ +static int hd3ss3220_power_up(struct device *dev) +{ + int ret; + + ret = devm_regulator_get_enable(dev, "vdd5"); + if (ret) + return dev_err_probe(dev, ret, "failed to enable VDD5\n"); + + /* Nothing to stagger against unless the board describes both rails */ + if (device_property_present(dev, "vdd5-supply") && + device_property_present(dev, "vcc33-supply")) + fsleep(HD3SS3220_TVDD5V_PG_US); + + ret = devm_regulator_get_enable(dev, "vcc33"); + if (ret) + return dev_err_probe(dev, ret, "failed to enable VCC33\n"); + + return 0; +} + static int hd3ss3220_probe(struct i2c_client *client) { struct typec_capability typec_cap = { }; @@ -384,6 +412,10 @@ static int hd3ss3220_probe(struct i2c_client *client) if (IS_ERR(hd3ss3220->regmap)) return PTR_ERR(hd3ss3220->regmap); + ret = hd3ss3220_power_up(hd3ss3220->dev); + if (ret) + return ret; + /* For backward compatibility check the connector child node first */ connector = device_get_named_child_node(hd3ss3220->dev, "connector"); if (connector) { @@ -441,10 +473,8 @@ static int hd3ss3220_probe(struct i2c_client *client) IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, dev_name(hd3ss3220->dev), hd3ss3220); - if (ret < 0) { - dev_err(hd3ss3220->dev, "failed to get ID irq: %d\n", ret); + if (ret < 0) goto err_put_fwnode; - } } typec_cap.prefer_role = TYPEC_NO_PREFERRED_ROLE; diff --git a/drivers/usb/typec/mux/gpio-sbu-mux.c b/drivers/usb/typec/mux/gpio-sbu-mux.c index 1834f1a2dd9d..b1aa976aca24 100644 --- a/drivers/usb/typec/mux/gpio-sbu-mux.c +++ b/drivers/usb/typec/mux/gpio-sbu-mux.c @@ -17,6 +17,7 @@ struct gpio_sbu_mux { struct typec_switch_dev *sw; struct typec_mux_dev *mux; + bool mode_switch; struct mutex lock; /* protect enabled and swapped */ bool enabled; @@ -40,19 +41,24 @@ static int gpio_sbu_switch_set(struct typec_switch_dev *sw, enabled = false; break; case TYPEC_ORIENTATION_NORMAL: + if (!sbu_mux->mode_switch) + enabled = true; swapped = false; break; case TYPEC_ORIENTATION_REVERSE: + if (!sbu_mux->mode_switch) + enabled = true; swapped = true; break; } - if (enabled != sbu_mux->enabled) - gpiod_set_value_cansleep(sbu_mux->enable_gpio, enabled); - if (swapped != sbu_mux->swapped) gpiod_set_value_cansleep(sbu_mux->select_gpio, swapped); + /* If both enabled and swapped transition, set enable GPIO after to avoid glitches */ + if (enabled != sbu_mux->enabled) + gpiod_set_value_cansleep(sbu_mux->enable_gpio, enabled); + sbu_mux->enabled = enabled; sbu_mux->swapped = swapped; @@ -120,6 +126,7 @@ static int gpio_sbu_mux_probe(struct platform_device *pdev) sw_desc.fwnode = dev_fwnode(dev); sw_desc.set = gpio_sbu_switch_set; + sbu_mux->mode_switch = device_property_read_bool(dev, "mode-switch"); sbu_mux->sw = typec_switch_register(dev, &sw_desc); if (IS_ERR(sbu_mux->sw)) return dev_err_probe(dev, PTR_ERR(sbu_mux->sw), diff --git a/drivers/usb/typec/mux/it5205.c b/drivers/usb/typec/mux/it5205.c index 5e1a120b2e3b..2ab2ba6a3cbd 100644 --- a/drivers/usb/typec/mux/it5205.c +++ b/drivers/usb/typec/mux/it5205.c @@ -250,7 +250,7 @@ static int it5205_probe(struct i2c_client *client) if (ret) { typec_mux_unregister(it->mux); typec_switch_unregister(it->sw); - return dev_err_probe(dev, ret, "Failed to request irq\n"); + return ret; } } diff --git a/drivers/usb/typec/tcpm/tcpci_maxim_core.c b/drivers/usb/typec/tcpm/tcpci_maxim_core.c index 998693a61839..52dbbbe53691 100644 --- a/drivers/usb/typec/tcpm/tcpci_maxim_core.c +++ b/drivers/usb/typec/tcpm/tcpci_maxim_core.c @@ -542,8 +542,7 @@ static int max_tcpci_probe(struct i2c_client *client) (IRQF_TRIGGER_LOW | IRQF_ONESHOT), dev_name(chip->dev), chip); if (ret < 0) - return dev_err_probe(&client->dev, ret, - "IRQ initialization failed\n"); + return ret; ret = devm_device_init_wakeup(chip->dev); if (ret) diff --git a/drivers/usb/typec/tcpm/tcpci_mt6360.c b/drivers/usb/typec/tcpm/tcpci_mt6360.c index 881ffacbfd77..d4010ea5183b 100644 --- a/drivers/usb/typec/tcpm/tcpci_mt6360.c +++ b/drivers/usb/typec/tcpm/tcpci_mt6360.c @@ -167,7 +167,6 @@ static int mt6360_tcpc_probe(struct platform_device *pdev) ret = devm_request_threaded_irq(mti->dev, mti->irq, NULL, mt6360_irq, IRQF_ONESHOT, dev_name(&pdev->dev), mti); if (ret) { - dev_err(mti->dev, "Failed to register irq\n"); tcpci_unregister_port(mti->tcpci); return ret; } diff --git a/drivers/usb/typec/tcpm/tcpci_mt6370.c b/drivers/usb/typec/tcpm/tcpci_mt6370.c index 7d6c75c70985..2e85cb05ed37 100644 --- a/drivers/usb/typec/tcpm/tcpci_mt6370.c +++ b/drivers/usb/typec/tcpm/tcpci_mt6370.c @@ -168,7 +168,7 @@ static int mt6370_tcpc_probe(struct platform_device *pdev) ret = devm_request_threaded_irq(dev, irq, NULL, mt6370_irq_handler, IRQF_ONESHOT, dev_name(dev), priv); if (ret) - return dev_err_probe(dev, ret, "Failed to allocate irq\n"); + return ret; device_init_wakeup(dev, true); dev_pm_set_wake_irq(dev, irq); |
