patch "usb: xhci: tegra: Check padctrl interrupt presence in device tree" added to usb-linus
Subsystems (4)
This is a note to let you know that I've just added the patch titled
usb: xhci: tegra: Check padctrl interrupt presence in device tree
to my usb git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
in the usb-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From 51f2246158f686c881859f4b620f831f06e296e1 Mon Sep 17 00:00:00 2001
From: Dmitry Osipenko <[email protected]>
Date: Mon, 8 Nov 2021 01:44:55 +0300
Subject: usb: xhci: tegra: Check padctrl interrupt presence in device tree
Older device-trees don't specify padctrl interrupt and xhci-tegra driver now fails to probe with -EINVAL using those device-trees. Check interrupt presence and keep runtime PM disabled if it's missing to fix the trouble.
--- drivers/usb/host/xhci-tegra.c | 41 +++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 12 deletions(-)
drivers/usb/host/xhci-tegra.c +29 -12
@@ -1400,6 +1400,7 @@ static void tegra_xusb_deinit_usb_phy(struct tegra_xusb *tegra)static int tegra_xusb_probe (struct platform_device *pdev) { +struct of_phandle_args args;struct tegra_xusb *tegra;struct device_node *np;struct resource *regs;
@@ -1454,10 +1455,17 @@ static int tegra_xusb_probe(struct platform_device *pdev) goto put_padctl; } - tegra->padctl_irq =of_irq_get (np,0 ); -if (tegra->padctl_irq <=0 ) { - err = (tegra->padctl_irq ==0 ) ? -ENODEV : tegra->padctl_irq; - goto put_padctl; +/* Older device-trees don't have padctrl interrupt */ + err =of_irq_parse_one (np,0 , &args); +if (!err) { + tegra->padctl_irq =of_irq_get (np,0 ); +if (tegra->padctl_irq <=0 ) { + err = (tegra->padctl_irq ==0 ) ? -ENODEV : tegra->padctl_irq; + goto put_padctl; + } + }else { +dev_dbg (&pdev->dev, +"%pOF is missing an interrupt, disabling PM support\n" , np); } tegra->host_clk =devm_clk_get (&pdev->dev,"xusb_host" );
@@ -1696,11 +1704,15 @@ static int tegra_xusb_probe(struct platform_device *pdev) goto remove_usb3; } - 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); - 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); + goto remove_usb3; + } } err =tegra_xusb_enable_firmware_messages (tegra);
@@ -1718,13 +1730,16 @@ static int tegra_xusb_probe(struct platform_device *pdev)/* Enable wake for both USB 2.0 and USB 3.0 roothubs */ device_init_wakeup (&tegra->hcd->self.root_hub->dev, true);device_init_wakeup (&xhci->shared_hcd->self.root_hub->dev, true); -device_init_wakeup (tegra->dev, true);pm_runtime_use_autosuspend (tegra->dev);pm_runtime_set_autosuspend_delay (tegra->dev,2000 );pm_runtime_mark_last_busy (tegra->dev);pm_runtime_set_active (tegra->dev); -pm_runtime_enable (tegra->dev); + +if (tegra->padctl_irq) { +device_init_wakeup (tegra->dev, true); +pm_runtime_enable (tegra->dev); + }return 0 ;
@@ -1772,7 +1787,9 @@ static int tegra_xusb_remove(struct platform_device *pdev)dma_free_coherent (&pdev->dev, tegra->fw.size, tegra->fw.virt, tegra->fw.phys); -pm_runtime_disable (&pdev->dev); +if (tegra->padctl_irq) +pm_runtime_disable (&pdev->dev); +pm_runtime_put (&pdev->dev);tegra_xusb_powergate_partitions (tegra);
Signature · 1 line
2.34.0