aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-05-29 10:37:40 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-05-29 10:37:40 +0200
commitffad0c8695eb61e151a1095cb140b7c804f7b889 (patch)
treef2a91928d3365c74b0b7257a95ce9f490c9fd49f
parent4f5efdd3c8ea0888db32f21f3bde0d3c9a144dac (diff)
downloadpatches-ffad0c8695eb61e151a1095cb140b7c804f7b889.tar.gz
new usb patches
-rw-r--r--nfc-pn533-don-t-send-usb-data-off-of-the-stack.patch140
-rw-r--r--series3
-rw-r--r--usb-debugfs-cleanup.patch1553
-rw-r--r--usb-debugfs.patch476
-rw-r--r--usb-serial-visor-handle-potential-invalid-device-configuration.patch8
5 files changed, 2177 insertions, 3 deletions
diff --git a/nfc-pn533-don-t-send-usb-data-off-of-the-stack.patch b/nfc-pn533-don-t-send-usb-data-off-of-the-stack.patch
new file mode 100644
index 0000000000000..a10400977b5a9
--- /dev/null
+++ b/nfc-pn533-don-t-send-usb-data-off-of-the-stack.patch
@@ -0,0 +1,140 @@
+From foo@baz Thu May 17 18:35:38 CEST 2018
+Date: Thu, 17 May 2018 18:35:38 +0200
+To: Greg KH <gregkh@linuxfoundation.org>
+From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Subject: [PATCH v3] NFC: pn533: don't send USB data off of the stack
+
+It's amazing that this driver ever worked, but now that x86 doesn't
+allow USB data to be sent off of the stack, it really does not work at
+all. Fix this up by properly allocating the data for the small
+"commands" that get sent to the device off of the stack.
+
+We do this for one command by having a whole urb just for ack messages,
+as they can be submitted in interrupt context, so we can not use
+usb_bulk_msg(). But the poweron command can sleep (and does), so use
+usb_bulk_msg() for that transfer.
+
+Reported-by: Carlos Manuel Santos <cmmpsantos@gmail.com>
+Cc: Samuel Ortiz <sameo@linux.intel.com>
+Cc: Stephen Hemminger <stephen@networkplumber.org>
+Cc: stable <stable@vger.kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/nfc/pn533/usb.c | 42 ++++++++++++++++++++++++++++++------------
+ 1 file changed, 30 insertions(+), 12 deletions(-)
+
+--- a/drivers/nfc/pn533/usb.c
++++ b/drivers/nfc/pn533/usb.c
+@@ -62,6 +62,9 @@ struct pn533_usb_phy {
+ struct urb *out_urb;
+ struct urb *in_urb;
+
++ struct urb *ack_urb;
++ u8 *ack_buffer;
++
+ struct pn533 *priv;
+ };
+
+@@ -150,13 +153,16 @@ static int pn533_usb_send_ack(struct pn5
+ struct pn533_usb_phy *phy = dev->phy;
+ static const u8 ack[6] = {0x00, 0x00, 0xff, 0x00, 0xff, 0x00};
+ /* spec 7.1.1.3: Preamble, SoPC (2), ACK Code (2), Postamble */
+- int rc;
+
+- phy->out_urb->transfer_buffer = (u8 *)ack;
+- phy->out_urb->transfer_buffer_length = sizeof(ack);
+- rc = usb_submit_urb(phy->out_urb, flags);
++ if (!phy->ack_buffer) {
++ phy->ack_buffer = kmemdup(ack, sizeof(ack), flags);
++ if (!phy->ack_buffer)
++ return -ENOMEM;
++ }
+
+- return rc;
++ phy->ack_urb->transfer_buffer = phy->ack_buffer;
++ phy->ack_urb->transfer_buffer_length = sizeof(ack);
++ return usb_submit_urb(phy->ack_urb, flags);
+ }
+
+ static int pn533_usb_send_frame(struct pn533 *dev,
+@@ -375,26 +381,31 @@ static int pn533_acr122_poweron_rdr(stru
+ /* Power on th reader (CCID cmd) */
+ u8 cmd[10] = {PN533_ACR122_PC_TO_RDR_ICCPOWERON,
+ 0, 0, 0, 0, 0, 0, 3, 0, 0};
++ char *buffer;
++ int transferred;
+ int rc;
+ void *cntx;
+ struct pn533_acr122_poweron_rdr_arg arg;
+
+ dev_dbg(&phy->udev->dev, "%s\n", __func__);
+
++ buffer = kmemdup(cmd, sizeof(cmd), GFP_KERNEL);
++ if (!buffer)
++ return -ENOMEM;
++
+ init_completion(&arg.done);
+ cntx = phy->in_urb->context; /* backup context */
+
+ phy->in_urb->complete = pn533_acr122_poweron_rdr_resp;
+ phy->in_urb->context = &arg;
+
+- phy->out_urb->transfer_buffer = cmd;
+- phy->out_urb->transfer_buffer_length = sizeof(cmd);
+-
+ print_hex_dump_debug("ACR122 TX: ", DUMP_PREFIX_NONE, 16, 1,
+ cmd, sizeof(cmd), false);
+
+- rc = usb_submit_urb(phy->out_urb, GFP_KERNEL);
+- if (rc) {
++ rc = usb_bulk_msg(phy->udev, phy->out_urb->pipe, buffer, sizeof(cmd),
++ &transferred, 0);
++ kfree(buffer);
++ if (rc || (transferred != sizeof(cmd))) {
+ nfc_err(&phy->udev->dev,
+ "Reader power on cmd error %d\n", rc);
+ return rc;
+@@ -490,8 +501,9 @@ static int pn533_usb_probe(struct usb_in
+
+ phy->in_urb = usb_alloc_urb(0, GFP_KERNEL);
+ phy->out_urb = usb_alloc_urb(0, GFP_KERNEL);
++ phy->ack_urb = usb_alloc_urb(0, GFP_KERNEL);
+
+- if (!phy->in_urb || !phy->out_urb)
++ if (!phy->in_urb || !phy->out_urb || !phy->ack_urb)
+ goto error;
+
+ usb_fill_bulk_urb(phy->in_urb, phy->udev,
+@@ -501,7 +513,9 @@ static int pn533_usb_probe(struct usb_in
+ usb_fill_bulk_urb(phy->out_urb, phy->udev,
+ usb_sndbulkpipe(phy->udev, out_endpoint),
+ NULL, 0, pn533_send_complete, phy);
+-
++ usb_fill_bulk_urb(phy->ack_urb, phy->udev,
++ usb_sndbulkpipe(phy->udev, out_endpoint),
++ NULL, 0, pn533_send_complete, phy);
+
+ switch (id->driver_info) {
+ case PN533_DEVICE_STD:
+@@ -554,6 +568,7 @@ static int pn533_usb_probe(struct usb_in
+ error:
+ usb_free_urb(phy->in_urb);
+ usb_free_urb(phy->out_urb);
++ usb_free_urb(phy->ack_urb);
+ usb_put_dev(phy->udev);
+ kfree(in_buf);
+
+@@ -573,10 +588,13 @@ static void pn533_usb_disconnect(struct
+
+ usb_kill_urb(phy->in_urb);
+ usb_kill_urb(phy->out_urb);
++ usb_kill_urb(phy->ack_urb);
+
+ kfree(phy->in_urb->transfer_buffer);
+ usb_free_urb(phy->in_urb);
+ usb_free_urb(phy->out_urb);
++ usb_free_urb(phy->ack_urb);
++ kfree(phy->ack_buffer);
+
+ nfc_info(&interface->dev, "NXP PN533 NFC device disconnected\n");
+ }
diff --git a/series b/series
index 6f437bdffc563..9d19248397d58 100644
--- a/series
+++ b/series
@@ -1,5 +1,8 @@
#
+usb-debugfs-cleanup.patch
+usb-debugfs.patch
+nfc-pn533-don-t-send-usb-data-off-of-the-stack.patch
usb-serial-visor-handle-potential-invalid-device-configuration.patch
usb_DEVICE_ATTR.patch
diff --git a/usb-debugfs-cleanup.patch b/usb-debugfs-cleanup.patch
new file mode 100644
index 0000000000000..22b9033cd1bbc
--- /dev/null
+++ b/usb-debugfs-cleanup.patch
@@ -0,0 +1,1553 @@
+From 7b3bcbfe0aeedeec64c83cf9655273e8f42f1c54 Mon Sep 17 00:00:00 2001
+From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Date: Tue, 29 May 2018 10:36:11 +0200
+Subject: [PATCH] usb: debugfs cleanup
+
+Fix up all of the debugfs calls, no need to check the return values at
+all. This cleans up lots of unneeded code.
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/chipidea/ci.h | 2 +-
+ drivers/usb/chipidea/core.c | 4 +-
+ drivers/usb/chipidea/debug.c | 56 +++++-------------
+ drivers/usb/core/usb.c | 26 ++-------
+ drivers/usb/dwc2/debugfs.c | 78 +++++--------------------
+ drivers/usb/dwc3/debugfs.c | 43 ++++----------
+ drivers/usb/gadget/udc/atmel_usba_udc.c | 71 ++++------------------
+ drivers/usb/gadget/udc/atmel_usba_udc.h | 4 --
+ drivers/usb/gadget/udc/bcm63xx_udc.c | 37 ++----------
+ drivers/usb/gadget/udc/gr_udc.c | 7 +--
+ drivers/usb/gadget/udc/gr_udc.h | 1 -
+ drivers/usb/gadget/udc/pxa27x_udc.c | 43 ++------------
+ drivers/usb/gadget/udc/pxa27x_udc.h | 3 -
+ drivers/usb/gadget/udc/renesas_usb3.c | 18 +-----
+ drivers/usb/gadget/udc/s3c2410_udc.c | 17 ++----
+ drivers/usb/host/ehci-dbg.c | 30 +++-------
+ drivers/usb/host/ehci-hcd.c | 5 --
+ drivers/usb/host/fhci-dbg.c | 23 ++------
+ drivers/usb/host/fhci.h | 2 -
+ drivers/usb/host/fotg210-hcd.c | 34 +++--------
+ drivers/usb/host/imx21-dbg.c | 44 ++++----------
+ drivers/usb/host/isp116x-hcd.c | 17 ++----
+ drivers/usb/host/ohci-dbg.c | 45 +++-----------
+ drivers/usb/host/ohci-hcd.c | 5 --
+ drivers/usb/host/ohci.h | 3 -
+ drivers/usb/host/uhci-hcd.c | 15 ++---
+ drivers/usb/mon/mon_text.c | 37 +++---------
+ drivers/usb/mtu3/mtu3_dr.c | 4 --
+ drivers/usb/musb/musb_core.c | 5 +-
+ drivers/usb/musb/musb_debug.h | 5 +-
+ drivers/usb/musb/musb_debugfs.c | 44 +++-----------
+ drivers/usb/musb/musb_dsps.c | 9 +--
+ drivers/usb/typec/fusb302/fusb302.c | 24 +++-----
+ drivers/usb/typec/tcpm.c | 9 +--
+ 34 files changed, 157 insertions(+), 613 deletions(-)
+
+diff --git a/drivers/usb/chipidea/ci.h b/drivers/usb/chipidea/ci.h
+index 98b7cb3d0064..0bf244d50544 100644
+--- a/drivers/usb/chipidea/ci.h
++++ b/drivers/usb/chipidea/ci.h
+@@ -450,7 +450,7 @@ void hw_phymode_configure(struct ci_hdrc *ci);
+
+ void ci_platform_configure(struct ci_hdrc *ci);
+
+-int dbg_create_files(struct ci_hdrc *ci);
++void dbg_create_files(struct ci_hdrc *ci);
+
+ void dbg_remove_files(struct ci_hdrc *ci);
+ #endif /* __DRIVERS_USB_CHIPIDEA_CI_H */
+diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
+index 33ae87fa3ff3..85fc6db48e44 100644
+--- a/drivers/usb/chipidea/core.c
++++ b/drivers/usb/chipidea/core.c
+@@ -1062,9 +1062,7 @@ static int ci_hdrc_probe(struct platform_device *pdev)
+ ci_hdrc_otg_fsm_start(ci);
+
+ device_set_wakeup_capable(&pdev->dev, true);
+- ret = dbg_create_files(ci);
+- if (ret)
+- goto stop;
++ dbg_create_files(ci);
+
+ ret = sysfs_create_group(&dev->kobj, &ci_attr_group);
+ if (ret)
+diff --git a/drivers/usb/chipidea/debug.c b/drivers/usb/chipidea/debug.c
+index ce648cb3ed94..fcc91a338875 100644
+--- a/drivers/usb/chipidea/debug.c
++++ b/drivers/usb/chipidea/debug.c
+@@ -340,54 +340,28 @@ DEFINE_SHOW_ATTRIBUTE(ci_registers);
+ *
+ * This function returns an error code
+ */
+-int dbg_create_files(struct ci_hdrc *ci)
++void dbg_create_files(struct ci_hdrc *ci)
+ {
+- struct dentry *dent;
+-
+ ci->debugfs = debugfs_create_dir(dev_name(ci->dev), NULL);
+- if (!ci->debugfs)
+- return -ENOMEM;
+-
+- dent = debugfs_create_file("device", S_IRUGO, ci->debugfs, ci,
+- &ci_device_fops);
+- if (!dent)
+- goto err;
+-
+- dent = debugfs_create_file("port_test", S_IRUGO | S_IWUSR, ci->debugfs,
+- ci, &ci_port_test_fops);
+- if (!dent)
+- goto err;
+-
+- dent = debugfs_create_file("qheads", S_IRUGO, ci->debugfs, ci,
+- &ci_qheads_fops);
+- if (!dent)
+- goto err;
+
+- dent = debugfs_create_file("requests", S_IRUGO, ci->debugfs, ci,
+- &ci_requests_fops);
+- if (!dent)
+- goto err;
++ debugfs_create_file("device", S_IRUGO, ci->debugfs, ci,
++ &ci_device_fops);
++ debugfs_create_file("port_test", S_IRUGO | S_IWUSR, ci->debugfs, ci,
++ &ci_port_test_fops);
++ debugfs_create_file("qheads", S_IRUGO, ci->debugfs, ci,
++ &ci_qheads_fops);
++ debugfs_create_file("requests", S_IRUGO, ci->debugfs, ci,
++ &ci_requests_fops);
+
+ if (ci_otg_is_fsm_mode(ci)) {
+- dent = debugfs_create_file("otg", S_IRUGO, ci->debugfs, ci,
+- &ci_otg_fops);
+- if (!dent)
+- goto err;
++ debugfs_create_file("otg", S_IRUGO, ci->debugfs, ci,
++ &ci_otg_fops);
+ }
+
+- dent = debugfs_create_file("role", S_IRUGO | S_IWUSR, ci->debugfs, ci,
+- &ci_role_fops);
+- if (!dent)
+- goto err;
+-
+- dent = debugfs_create_file("registers", S_IRUGO, ci->debugfs, ci,
+- &ci_registers_fops);
+-
+- if (dent)
+- return 0;
+-err:
+- debugfs_remove_recursive(ci->debugfs);
+- return -ENOMEM;
++ debugfs_create_file("role", S_IRUGO | S_IWUSR, ci->debugfs, ci,
++ &ci_role_fops);
++ debugfs_create_file("registers", S_IRUGO, ci->debugfs, ci,
++ &ci_registers_fops);
+ }
+
+ /**
+diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
+index 0adb6345ff2e..623be3174fb3 100644
+--- a/drivers/usb/core/usb.c
++++ b/drivers/usb/core/usb.c
+@@ -1167,30 +1167,16 @@ static struct notifier_block usb_bus_nb = {
+ struct dentry *usb_debug_root;
+ EXPORT_SYMBOL_GPL(usb_debug_root);
+
+-static struct dentry *usb_debug_devices;
+-
+-static int usb_debugfs_init(void)
++static void usb_debugfs_init(void)
+ {
+ usb_debug_root = debugfs_create_dir("usb", NULL);
+- if (!usb_debug_root)
+- return -ENOENT;
+-
+- usb_debug_devices = debugfs_create_file("devices", 0444,
+- usb_debug_root, NULL,
+- &usbfs_devices_fops);
+- if (!usb_debug_devices) {
+- debugfs_remove(usb_debug_root);
+- usb_debug_root = NULL;
+- return -ENOENT;
+- }
+-
+- return 0;
++ debugfs_create_file("devices", 0444, usb_debug_root, NULL,
++ &usbfs_devices_fops);
+ }
+
+ static void usb_debugfs_cleanup(void)
+ {
+- debugfs_remove(usb_debug_devices);
+- debugfs_remove(usb_debug_root);
++ debugfs_remove_recursive(usb_debug_root);
+ }
+
+ /*
+@@ -1205,9 +1191,7 @@ static int __init usb_init(void)
+ }
+ usb_init_pool_max();
+
+- retval = usb_debugfs_init();
+- if (retval)
+- goto out;
++ usb_debugfs_init();
+
+ usb_acpi_register();
+ retval = bus_register(&usb_bus_type);
+diff --git a/drivers/usb/dwc2/debugfs.c b/drivers/usb/dwc2/debugfs.c
+index 7e6618ad9f21..d0bdb7997557 100644
+--- a/drivers/usb/dwc2/debugfs.c
++++ b/drivers/usb/dwc2/debugfs.c
+@@ -294,52 +294,30 @@ DEFINE_SHOW_ATTRIBUTE(ep);
+ static void dwc2_hsotg_create_debug(struct dwc2_hsotg *hsotg)
+ {
+ struct dentry *root;
+- struct dentry *file;
+ unsigned int epidx;
+
+ root = hsotg->debug_root;
+
+ /* create general state file */
+-
+- file = debugfs_create_file("state", 0444, root, hsotg, &state_fops);
+- if (IS_ERR(file))
+- dev_err(hsotg->dev, "%s: failed to create state\n", __func__);
+-
+- file = debugfs_create_file("testmode", 0644, root, hsotg,
+- &testmode_fops);
+- if (IS_ERR(file))
+- dev_err(hsotg->dev, "%s: failed to create testmode\n",
+- __func__);
+-
+- file = debugfs_create_file("fifo", 0444, root, hsotg, &fifo_fops);
+- if (IS_ERR(file))
+- dev_err(hsotg->dev, "%s: failed to create fifo\n", __func__);
++ debugfs_create_file("state", 0444, root, hsotg, &state_fops);
++ debugfs_create_file("testmode", 0644, root, hsotg, &testmode_fops);
++ debugfs_create_file("fifo", 0444, root, hsotg, &fifo_fops);
+
+ /* Create one file for each out endpoint */
+ for (epidx = 0; epidx < hsotg->num_of_eps; epidx++) {
+ struct dwc2_hsotg_ep *ep;
+
+ ep = hsotg->eps_out[epidx];
+- if (ep) {
+- file = debugfs_create_file(ep->name, 0444,
+- root, ep, &ep_fops);
+- if (IS_ERR(file))
+- dev_err(hsotg->dev, "failed to create %s debug file\n",
+- ep->name);
+- }
++ if (ep)
++ debugfs_create_file(ep->name, 0444, root, ep, &ep_fops);
+ }
+ /* Create one file for each in endpoint. EP0 is handled with out eps */
+ for (epidx = 1; epidx < hsotg->num_of_eps; epidx++) {
+ struct dwc2_hsotg_ep *ep;
+
+ ep = hsotg->eps_in[epidx];
+- if (ep) {
+- file = debugfs_create_file(ep->name, 0444,
+- root, ep, &ep_fops);
+- if (IS_ERR(file))
+- dev_err(hsotg->dev, "failed to create %s debug file\n",
+- ep->name);
+- }
++ if (ep)
++ debugfs_create_file(ep->name, 0444, root, ep, &ep_fops);
+ }
+ }
+ #else
+@@ -792,32 +770,14 @@ DEFINE_SHOW_ATTRIBUTE(dr_mode);
+ int dwc2_debugfs_init(struct dwc2_hsotg *hsotg)
+ {
+ int ret;
+- struct dentry *file;
++ struct dentry *root;
+
+- hsotg->debug_root = debugfs_create_dir(dev_name(hsotg->dev), NULL);
+- if (!hsotg->debug_root) {
+- ret = -ENOMEM;
+- goto err0;
+- }
++ root = debugfs_create_dir(dev_name(hsotg->dev), NULL);
++ hsotg->debug_root = root;
+
+- file = debugfs_create_file("params", 0444,
+- hsotg->debug_root,
+- hsotg, &params_fops);
+- if (IS_ERR(file))
+- dev_err(hsotg->dev, "%s: failed to create params\n", __func__);
+-
+- file = debugfs_create_file("hw_params", 0444,
+- hsotg->debug_root,
+- hsotg, &hw_params_fops);
+- if (IS_ERR(file))
+- dev_err(hsotg->dev, "%s: failed to create hw_params\n",
+- __func__);
+-
+- file = debugfs_create_file("dr_mode", 0444,
+- hsotg->debug_root,
+- hsotg, &dr_mode_fops);
+- if (IS_ERR(file))
+- dev_err(hsotg->dev, "%s: failed to create dr_mode\n", __func__);
++ debugfs_create_file("params", 0444, root, hsotg, &params_fops);
++ debugfs_create_file("hw_params", 0444, root, hsotg, &hw_params_fops);
++ debugfs_create_file("dr_mode", 0444, root, hsotg, &dr_mode_fops);
+
+ /* Add gadget debugfs nodes */
+ dwc2_hsotg_create_debug(hsotg);
+@@ -826,24 +786,18 @@ int dwc2_debugfs_init(struct dwc2_hsotg *hsotg)
+ GFP_KERNEL);
+ if (!hsotg->regset) {
+ ret = -ENOMEM;
+- goto err1;
++ goto err;
+ }
+
+ hsotg->regset->regs = dwc2_regs;
+ hsotg->regset->nregs = ARRAY_SIZE(dwc2_regs);
+ hsotg->regset->base = hsotg->regs;
+
+- file = debugfs_create_regset32("regdump", 0444, hsotg->debug_root,
+- hsotg->regset);
+- if (!file) {
+- ret = -ENOMEM;
+- goto err1;
+- }
++ debugfs_create_regset32("regdump", 0444, root, hsotg->regset);
+
+ return 0;
+-err1:
++err:
+ debugfs_remove_recursive(hsotg->debug_root);
+-err0:
+ return ret;
+ }
+
+diff --git a/drivers/usb/dwc3/debugfs.c b/drivers/usb/dwc3/debugfs.c
+index 2f07be1e1f31..df8e73ec3342 100644
+--- a/drivers/usb/dwc3/debugfs.c
++++ b/drivers/usb/dwc3/debugfs.c
+@@ -716,9 +716,6 @@ static void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep,
+ struct dentry *dir;
+
+ dir = debugfs_create_dir(dep->name, parent);
+- if (IS_ERR_OR_NULL(dir))
+- return;
+-
+ dwc3_debugfs_create_endpoint_files(dep, dir);
+ }
+
+@@ -740,49 +737,31 @@ static void dwc3_debugfs_create_endpoint_dirs(struct dwc3 *dwc,
+ void dwc3_debugfs_init(struct dwc3 *dwc)
+ {
+ struct dentry *root;
+- struct dentry *file;
+-
+- root = debugfs_create_dir(dev_name(dwc->dev), NULL);
+- if (IS_ERR_OR_NULL(root)) {
+- if (!root)
+- dev_err(dwc->dev, "Can't create debugfs root\n");
+- return;
+- }
+- dwc->root = root;
+
+ dwc->regset = kzalloc(sizeof(*dwc->regset), GFP_KERNEL);
+- if (!dwc->regset) {
+- debugfs_remove_recursive(root);
++ if (!dwc->regset)
+ return;
+- }
+
+ dwc->regset->regs = dwc3_regs;
+ dwc->regset->nregs = ARRAY_SIZE(dwc3_regs);
+ dwc->regset->base = dwc->regs - DWC3_GLOBALS_REGS_START;
+
+- file = debugfs_create_regset32("regdump", S_IRUGO, root, dwc->regset);
+- if (!file)
+- dev_dbg(dwc->dev, "Can't create debugfs regdump\n");
++ root = debugfs_create_dir(dev_name(dwc->dev), NULL);
++ dwc->root = root;
++
++ debugfs_create_regset32("regdump", S_IRUGO, root, dwc->regset);
+
+ if (IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE)) {
+- file = debugfs_create_file("mode", S_IRUGO | S_IWUSR, root,
+- dwc, &dwc3_mode_fops);
+- if (!file)
+- dev_dbg(dwc->dev, "Can't create debugfs mode\n");
++ debugfs_create_file("mode", S_IRUGO | S_IWUSR, root, dwc,
++ &dwc3_mode_fops);
+ }
+
+ if (IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE) ||
+ IS_ENABLED(CONFIG_USB_DWC3_GADGET)) {
+- file = debugfs_create_file("testmode", S_IRUGO | S_IWUSR, root,
+- dwc, &dwc3_testmode_fops);
+- if (!file)
+- dev_dbg(dwc->dev, "Can't create debugfs testmode\n");
+-
+- file = debugfs_create_file("link_state", S_IRUGO | S_IWUSR,
+- root, dwc, &dwc3_link_state_fops);
+- if (!file)
+- dev_dbg(dwc->dev, "Can't create debugfs link_state\n");
+-
++ debugfs_create_file("testmode", S_IRUGO | S_IWUSR, root, dwc,
++ &dwc3_testmode_fops);
++ debugfs_create_file("link_state", S_IRUGO | S_IWUSR, root, dwc,
++ &dwc3_link_state_fops);
+ dwc3_debugfs_create_endpoint_dirs(dwc, root);
+ }
+ }
+diff --git a/drivers/usb/gadget/udc/atmel_usba_udc.c b/drivers/usb/gadget/udc/atmel_usba_udc.c
+index 2f586f2bda7e..a4d99bf50f2f 100644
+--- a/drivers/usb/gadget/udc/atmel_usba_udc.c
++++ b/drivers/usb/gadget/udc/atmel_usba_udc.c
+@@ -206,94 +206,45 @@ static void usba_ep_init_debugfs(struct usba_udc *udc,
+ struct dentry *ep_root;
+
+ ep_root = debugfs_create_dir(ep->ep.name, udc->debugfs_root);
+- if (!ep_root)
+- goto err_root;
+ ep->debugfs_dir = ep_root;
+
+- ep->debugfs_queue = debugfs_create_file("queue", 0400, ep_root,
+- ep, &queue_dbg_fops);
+- if (!ep->debugfs_queue)
+- goto err_queue;
+-
+- if (ep->can_dma) {
+- ep->debugfs_dma_status
+- = debugfs_create_u32("dma_status", 0400, ep_root,
+- &ep->last_dma_status);
+- if (!ep->debugfs_dma_status)
+- goto err_dma_status;
+- }
+- if (ep_is_control(ep)) {
+- ep->debugfs_state
+- = debugfs_create_u32("state", 0400, ep_root,
+- &ep->state);
+- if (!ep->debugfs_state)
+- goto err_state;
+- }
+-
+- return;
+-
+-err_state:
++ debugfs_create_file("queue", 0400, ep_root, ep, &queue_dbg_fops);
+ if (ep->can_dma)
+- debugfs_remove(ep->debugfs_dma_status);
+-err_dma_status:
+- debugfs_remove(ep->debugfs_queue);
+-err_queue:
+- debugfs_remove(ep_root);
+-err_root:
+- dev_err(&ep->udc->pdev->dev,
+- "failed to create debugfs directory for %s\n", ep->ep.name);
++ debugfs_create_u32("dma_status", 0400, ep_root,
++ &ep->last_dma_status);
++ if (ep_is_control(ep))
++ debugfs_create_u32("state", 0400, ep_root, &ep->state);
+ }
+
+ static void usba_ep_cleanup_debugfs(struct usba_ep *ep)
+ {
+- debugfs_remove(ep->debugfs_queue);
+- debugfs_remove(ep->debugfs_dma_status);
+- debugfs_remove(ep->debugfs_state);
+- debugfs_remove(ep->debugfs_dir);
+- ep->debugfs_dma_status = NULL;
+- ep->debugfs_dir = NULL;
++ debugfs_remove_recursive(ep->debugfs_dir);
+ }
+
+ static void usba_init_debugfs(struct usba_udc *udc)
+ {
+- struct dentry *root, *regs;
++ struct dentry *root;
+ struct resource *regs_resource;
+
+ root = debugfs_create_dir(udc->gadget.name, NULL);
+- if (IS_ERR(root) || !root)
+- goto err_root;
+ udc->debugfs_root = root;
+
+ regs_resource = platform_get_resource(udc->pdev, IORESOURCE_MEM,
+ CTRL_IOMEM_ID);
+
+ if (regs_resource) {
+- regs = debugfs_create_file_size("regs", 0400, root, udc,
+- &regs_dbg_fops,
+- resource_size(regs_resource));
+- if (!regs)
+- goto err_regs;
+- udc->debugfs_regs = regs;
++ debugfs_create_file_size("regs", 0400, root, udc,
++ &regs_dbg_fops,
++ resource_size(regs_resource));
+ }
+
+ usba_ep_init_debugfs(udc, to_usba_ep(udc->gadget.ep0));
+-
+- return;
+-
+-err_regs:
+- debugfs_remove(root);
+-err_root:
+- udc->debugfs_root = NULL;
+- dev_err(&udc->pdev->dev, "debugfs is not available\n");
+ }
+
+ static void usba_cleanup_debugfs(struct usba_udc *udc)
+ {
+ usba_ep_cleanup_debugfs(to_usba_ep(udc->gadget.ep0));
+- debugfs_remove(udc->debugfs_regs);
+- debugfs_remove(udc->debugfs_root);
+- udc->debugfs_regs = NULL;
+- udc->debugfs_root = NULL;
++ debugfs_remove_recursive(udc->debugfs_root);
+ }
+ #else
+ static inline void usba_ep_init_debugfs(struct usba_udc *udc,
+diff --git a/drivers/usb/gadget/udc/atmel_usba_udc.h b/drivers/usb/gadget/udc/atmel_usba_udc.h
+index d7eb7cf4fd5c..030bf797cd25 100644
+--- a/drivers/usb/gadget/udc/atmel_usba_udc.h
++++ b/drivers/usb/gadget/udc/atmel_usba_udc.h
+@@ -287,9 +287,6 @@ struct usba_ep {
+ #ifdef CONFIG_USB_GADGET_DEBUG_FS
+ u32 last_dma_status;
+ struct dentry *debugfs_dir;
+- struct dentry *debugfs_queue;
+- struct dentry *debugfs_dma_status;
+- struct dentry *debugfs_state;
+ #endif
+ };
+
+@@ -344,7 +341,6 @@ struct usba_udc {
+
+ #ifdef CONFIG_USB_GADGET_DEBUG_FS
+ struct dentry *debugfs_root;
+- struct dentry *debugfs_regs;
+ #endif
+
+ struct regmap *pmc;
+diff --git a/drivers/usb/gadget/udc/bcm63xx_udc.c b/drivers/usb/gadget/udc/bcm63xx_udc.c
+index 3a8df8601074..c1fcc77403ea 100644
+--- a/drivers/usb/gadget/udc/bcm63xx_udc.c
++++ b/drivers/usb/gadget/udc/bcm63xx_udc.c
+@@ -288,8 +288,6 @@ struct bcm63xx_req {
+ * @ep0_reply: Pending reply from gadget driver.
+ * @ep0_request: Outstanding ep0 request.
+ * @debugfs_root: debugfs directory: /sys/kernel/debug/<DRV_MODULE_NAME>.
+- * @debugfs_usbd: debugfs file "usbd" for controller state.
+- * @debugfs_iudma: debugfs file "usbd" for IUDMA state.
+ */
+ struct bcm63xx_udc {
+ spinlock_t lock;
+@@ -330,8 +328,6 @@ struct bcm63xx_udc {
+ struct usb_request *ep0_request;
+
+ struct dentry *debugfs_root;
+- struct dentry *debugfs_usbd;
+- struct dentry *debugfs_iudma;
+ };
+
+ static const struct usb_ep_ops bcm63xx_udc_ep_ops;
+@@ -2247,34 +2243,16 @@ DEFINE_SHOW_ATTRIBUTE(bcm63xx_iudma_dbg);
+ */
+ static void bcm63xx_udc_init_debugfs(struct bcm63xx_udc *udc)
+ {
+- struct dentry *root, *usbd, *iudma;
++ struct dentry *root;
+
+ if (!IS_ENABLED(CONFIG_USB_GADGET_DEBUG_FS))
+ return;
+
+ root = debugfs_create_dir(udc->gadget.name, NULL);
+- if (IS_ERR(root) || !root)
+- goto err_root;
+-
+- usbd = debugfs_create_file("usbd", 0400, root, udc,
+- &bcm63xx_usbd_dbg_fops);
+- if (!usbd)
+- goto err_usbd;
+- iudma = debugfs_create_file("iudma", 0400, root, udc,
+- &bcm63xx_iudma_dbg_fops);
+- if (!iudma)
+- goto err_iudma;
+-
+ udc->debugfs_root = root;
+- udc->debugfs_usbd = usbd;
+- udc->debugfs_iudma = iudma;
+- return;
+-err_iudma:
+- debugfs_remove(usbd);
+-err_usbd:
+- debugfs_remove(root);
+-err_root:
+- dev_err(udc->dev, "debugfs is not available\n");
++
++ debugfs_create_file("usbd", 0400, root, udc, &bcm63xx_usbd_dbg_fops);
++ debugfs_create_file("iudma", 0400, root, udc, &bcm63xx_iudma_dbg_fops);
+ }
+
+ /**
+@@ -2285,12 +2263,7 @@ static void bcm63xx_udc_init_debugfs(struct bcm63xx_udc *udc)
+ */
+ static void bcm63xx_udc_cleanup_debugfs(struct bcm63xx_udc *udc)
+ {
+- debugfs_remove(udc->debugfs_iudma);
+- debugfs_remove(udc->debugfs_usbd);
+- debugfs_remove(udc->debugfs_root);
+- udc->debugfs_iudma = NULL;
+- udc->debugfs_usbd = NULL;
+- udc->debugfs_root = NULL;
++ debugfs_remove_recursive(udc->debugfs_root);
+ }
+
+ /***********************************************************************
+diff --git a/drivers/usb/gadget/udc/gr_udc.c b/drivers/usb/gadget/udc/gr_udc.c
+index ca83c15d8ea4..729e60e49564 100644
+--- a/drivers/usb/gadget/udc/gr_udc.c
++++ b/drivers/usb/gadget/udc/gr_udc.c
+@@ -209,15 +209,12 @@ static void gr_dfs_create(struct gr_udc *dev)
+ const char *name = "gr_udc_state";
+
+ dev->dfs_root = debugfs_create_dir(dev_name(dev->dev), NULL);
+- dev->dfs_state = debugfs_create_file(name, 0444, dev->dfs_root, dev,
+- &gr_dfs_fops);
++ debugfs_create_file(name, 0444, dev->dfs_root, dev, &gr_dfs_fops);
+ }
+
+ static void gr_dfs_delete(struct gr_udc *dev)
+ {
+- /* Handles NULL and ERR pointers internally */
+- debugfs_remove(dev->dfs_state);
+- debugfs_remove(dev->dfs_root);
++ debugfs_remove_recursive(dev->dfs_root);
+ }
+
+ #else /* !CONFIG_USB_GADGET_DEBUG_FS */
+diff --git a/drivers/usb/gadget/udc/gr_udc.h b/drivers/usb/gadget/udc/gr_udc.h
+index 3e913268c8c5..417ad2aa2cc7 100644
+--- a/drivers/usb/gadget/udc/gr_udc.h
++++ b/drivers/usb/gadget/udc/gr_udc.h
+@@ -217,7 +217,6 @@ struct gr_udc {
+ spinlock_t lock; /* General lock, a.k.a. "dev->lock" in comments */
+
+ struct dentry *dfs_root;
+- struct dentry *dfs_state;
+ };
+
+ #define to_gr_udc(gadget) (container_of((gadget), struct gr_udc, gadget))
+diff --git a/drivers/usb/gadget/udc/pxa27x_udc.c b/drivers/usb/gadget/udc/pxa27x_udc.c
+index a58242e901df..014233252299 100644
+--- a/drivers/usb/gadget/udc/pxa27x_udc.c
++++ b/drivers/usb/gadget/udc/pxa27x_udc.c
+@@ -205,50 +205,19 @@ DEFINE_SHOW_ATTRIBUTE(eps_dbg);
+
+ static void pxa_init_debugfs(struct pxa_udc *udc)
+ {
+- struct dentry *root, *state, *queues, *eps;
++ struct dentry *root;
+
+ root = debugfs_create_dir(udc->gadget.name, NULL);
+- if (IS_ERR(root) || !root)
+- goto err_root;
+-
+- state = debugfs_create_file("udcstate", 0400, root, udc,
+- &state_dbg_fops);
+- if (!state)
+- goto err_state;
+- queues = debugfs_create_file("queues", 0400, root, udc,
+- &queues_dbg_fops);
+- if (!queues)
+- goto err_queues;
+- eps = debugfs_create_file("epstate", 0400, root, udc,
+- &eps_dbg_fops);
+- if (!eps)
+- goto err_eps;
+-
+ udc->debugfs_root = root;
+- udc->debugfs_state = state;
+- udc->debugfs_queues = queues;
+- udc->debugfs_eps = eps;
+- return;
+-err_eps:
+- debugfs_remove(eps);
+-err_queues:
+- debugfs_remove(queues);
+-err_state:
+- debugfs_remove(root);
+-err_root:
+- dev_err(udc->dev, "debugfs is not available\n");
++
++ debugfs_create_file("udcstate", 0400, root, udc, &state_dbg_fops);
++ debugfs_create_file("queues", 0400, root, udc, &queues_dbg_fops);
++ debugfs_create_file("epstate", 0400, root, udc, &eps_dbg_fops);
+ }
+
+ static void pxa_cleanup_debugfs(struct pxa_udc *udc)
+ {
+- debugfs_remove(udc->debugfs_eps);
+- debugfs_remove(udc->debugfs_queues);
+- debugfs_remove(udc->debugfs_state);
+- debugfs_remove(udc->debugfs_root);
+- udc->debugfs_eps = NULL;
+- udc->debugfs_queues = NULL;
+- udc->debugfs_state = NULL;
+- udc->debugfs_root = NULL;
++ debugfs_remove_recursive(udc->debugfs_root);
+ }
+
+ #else
+diff --git a/drivers/usb/gadget/udc/pxa27x_udc.h b/drivers/usb/gadget/udc/pxa27x_udc.h
+index 1128d39a4255..13b2977399ab 100644
+--- a/drivers/usb/gadget/udc/pxa27x_udc.h
++++ b/drivers/usb/gadget/udc/pxa27x_udc.h
+@@ -476,9 +476,6 @@ struct pxa_udc {
+ #endif
+ #ifdef CONFIG_USB_GADGET_DEBUG_FS
+ struct dentry *debugfs_root;
+- struct dentry *debugfs_state;
+- struct dentry *debugfs_queues;
+- struct dentry *debugfs_eps;
+ #endif
+ };
+ #define to_pxa(g) (container_of((g), struct pxa_udc, gadget))
+diff --git a/drivers/usb/gadget/udc/renesas_usb3.c b/drivers/usb/gadget/udc/renesas_usb3.c
+index 5caf78bbbf7c..977ea1a02cf9 100644
+--- a/drivers/usb/gadget/udc/renesas_usb3.c
++++ b/drivers/usb/gadget/udc/renesas_usb3.c
+@@ -2391,22 +2391,10 @@ static const struct file_operations renesas_usb3_b_device_fops = {
+ static void renesas_usb3_debugfs_init(struct renesas_usb3 *usb3,
+ struct device *dev)
+ {
+- struct dentry *root, *file;
++ usb3->dentry = debugfs_create_dir(dev_name(dev), NULL);
+
+- root = debugfs_create_dir(dev_name(dev), NULL);
+- if (IS_ERR_OR_NULL(root)) {
+- dev_info(dev, "%s: Can't create the root\n", __func__);
+- return;
+- }
+-
+- file = debugfs_create_file("b_device", 0644, root, usb3,
+- &renesas_usb3_b_device_fops);
+- if (!file) {
+- dev_info(dev, "%s: Can't create debugfs mode\n", __func__);
+- debugfs_remove_recursive(root);
+- } else {
+- usb3->dentry = root;
+- }
++ debugfs_create_file("b_device", 0644, usb3->dentry, usb3,
++ &renesas_usb3_b_device_fops);
+ }
+
+ /*------- platform_driver ------------------------------------------------*/
+diff --git a/drivers/usb/gadget/udc/s3c2410_udc.c b/drivers/usb/gadget/udc/s3c2410_udc.c
+index f154f49e98c8..8bf5ad7a59ad 100644
+--- a/drivers/usb/gadget/udc/s3c2410_udc.c
++++ b/drivers/usb/gadget/udc/s3c2410_udc.c
+@@ -1871,13 +1871,9 @@ static int s3c2410_udc_probe(struct platform_device *pdev)
+ if (retval)
+ goto err_add_udc;
+
+- if (s3c2410_udc_debugfs_root) {
+- udc->regs_info = debugfs_create_file("registers", S_IRUGO,
+- s3c2410_udc_debugfs_root,
+- udc, &s3c2410_udc_debugfs_fops);
+- if (!udc->regs_info)
+- dev_warn(dev, "debugfs file creation failed\n");
+- }
++ udc->regs_info = debugfs_create_file("registers", S_IRUGO,
++ s3c2410_udc_debugfs_root, udc,
++ &s3c2410_udc_debugfs_fops);
+
+ dev_dbg(dev, "probe ok\n");
+
+@@ -1994,11 +1990,6 @@ static int __init udc_init(void)
+ dprintk(DEBUG_NORMAL, "%s\n", gadget_name);
+
+ s3c2410_udc_debugfs_root = debugfs_create_dir(gadget_name, NULL);
+- if (IS_ERR(s3c2410_udc_debugfs_root)) {
+- pr_err("%s: debugfs dir creation failed %ld\n",
+- gadget_name, PTR_ERR(s3c2410_udc_debugfs_root));
+- s3c2410_udc_debugfs_root = NULL;
+- }
+
+ retval = platform_driver_register(&udc_driver_24x0);
+ if (retval)
+@@ -2014,7 +2005,7 @@ static int __init udc_init(void)
+ static void __exit udc_exit(void)
+ {
+ platform_driver_unregister(&udc_driver_24x0);
+- debugfs_remove(s3c2410_udc_debugfs_root);
++ debugfs_remove_recursive(s3c2410_udc_debugfs_root);
+ }
+
+ module_init(udc_init);
+diff --git a/drivers/usb/host/ehci-dbg.c b/drivers/usb/host/ehci-dbg.c
+index 3ed75aaa09d9..7619cfb06883 100644
+--- a/drivers/usb/host/ehci-dbg.c
++++ b/drivers/usb/host/ehci-dbg.c
+@@ -1028,29 +1028,15 @@ static inline void create_debug_files(struct ehci_hcd *ehci)
+ struct usb_bus *bus = &ehci_to_hcd(ehci)->self;
+
+ ehci->debug_dir = debugfs_create_dir(bus->bus_name, ehci_debug_root);
+- if (!ehci->debug_dir)
+- return;
+
+- if (!debugfs_create_file("async", S_IRUGO, ehci->debug_dir, bus,
+- &debug_async_fops))
+- goto file_error;
+-
+- if (!debugfs_create_file("bandwidth", S_IRUGO, ehci->debug_dir, bus,
+- &debug_bandwidth_fops))
+- goto file_error;
+-
+- if (!debugfs_create_file("periodic", S_IRUGO, ehci->debug_dir, bus,
+- &debug_periodic_fops))
+- goto file_error;
+-
+- if (!debugfs_create_file("registers", S_IRUGO, ehci->debug_dir, bus,
+- &debug_registers_fops))
+- goto file_error;
+-
+- return;
+-
+-file_error:
+- debugfs_remove_recursive(ehci->debug_dir);
++ debugfs_create_file("async", S_IRUGO, ehci->debug_dir, bus,
++ &debug_async_fops);
++ debugfs_create_file("bandwidth", S_IRUGO, ehci->debug_dir, bus,
++ &debug_bandwidth_fops);
++ debugfs_create_file("periodic", S_IRUGO, ehci->debug_dir, bus,
++ &debug_periodic_fops);
++ debugfs_create_file("registers", S_IRUGO, ehci->debug_dir, bus,
++ &debug_registers_fops);
+ }
+
+ static inline void remove_debug_files(struct ehci_hcd *ehci)
+diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
+index d927adf3afcd..89c47ae5c7d3 100644
+--- a/drivers/usb/host/ehci-hcd.c
++++ b/drivers/usb/host/ehci-hcd.c
+@@ -1311,10 +1311,6 @@ static int __init ehci_hcd_init(void)
+
+ #ifdef CONFIG_DYNAMIC_DEBUG
+ ehci_debug_root = debugfs_create_dir("ehci", usb_debug_root);
+- if (!ehci_debug_root) {
+- retval = -ENOENT;
+- goto err_debug;
+- }
+ #endif
+
+ #ifdef PLATFORM_DRIVER
+@@ -1361,7 +1357,6 @@ static int __init ehci_hcd_init(void)
+ #ifdef CONFIG_DYNAMIC_DEBUG
+ debugfs_remove(ehci_debug_root);
+ ehci_debug_root = NULL;
+-err_debug:
+ #endif
+ clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
+ return retval;
+diff --git a/drivers/usb/host/fhci-dbg.c b/drivers/usb/host/fhci-dbg.c
+index ebf9bb219f75..100048b3bd17 100644
+--- a/drivers/usb/host/fhci-dbg.c
++++ b/drivers/usb/host/fhci-dbg.c
+@@ -83,27 +83,14 @@ void fhci_dfs_create(struct fhci_hcd *fhci)
+ struct device *dev = fhci_to_hcd(fhci)->self.controller;
+
+ fhci->dfs_root = debugfs_create_dir(dev_name(dev), usb_debug_root);
+- if (!fhci->dfs_root) {
+- WARN_ON(1);
+- return;
+- }
+-
+- fhci->dfs_regs = debugfs_create_file("regs", S_IFREG | S_IRUGO,
+- fhci->dfs_root, fhci, &fhci_dfs_regs_fops);
+
+- fhci->dfs_irq_stat = debugfs_create_file("irq_stat",
+- S_IFREG | S_IRUGO, fhci->dfs_root, fhci,
+- &fhci_dfs_irq_stat_fops);
+-
+- WARN_ON(!fhci->dfs_regs || !fhci->dfs_irq_stat);
++ debugfs_create_file("regs", S_IFREG | S_IRUGO, fhci->dfs_root, fhci,
++ &fhci_dfs_regs_fops);
++ debugfs_create_file("irq_stat", S_IFREG | S_IRUGO, fhci->dfs_root, fhci,
++ &fhci_dfs_irq_stat_fops);
+ }
+
+ void fhci_dfs_destroy(struct fhci_hcd *fhci)
+ {
+- if (!fhci->dfs_root)
+- return;
+-
+- debugfs_remove(fhci->dfs_irq_stat);
+- debugfs_remove(fhci->dfs_regs);
+- debugfs_remove(fhci->dfs_root);
++ debugfs_remove_recursive(fhci->dfs_root);
+ }
+diff --git a/drivers/usb/host/fhci.h b/drivers/usb/host/fhci.h
+index e7ec41d62410..2ce5031d866d 100644
+--- a/drivers/usb/host/fhci.h
++++ b/drivers/usb/host/fhci.h
+@@ -262,8 +262,6 @@ struct fhci_hcd {
+ #ifdef CONFIG_FHCI_DEBUG
+ int usb_irq_stat[13];
+ struct dentry *dfs_root;
+- struct dentry *dfs_regs;
+- struct dentry *dfs_irq_stat;
+ #endif
+ };
+
+diff --git a/drivers/usb/host/fotg210-hcd.c b/drivers/usb/host/fotg210-hcd.c
+index d8abf401918a..e64eb47770c8 100644
+--- a/drivers/usb/host/fotg210-hcd.c
++++ b/drivers/usb/host/fotg210-hcd.c
+@@ -844,28 +844,16 @@ static int debug_registers_open(struct inode *inode, struct file *file)
+ static inline void create_debug_files(struct fotg210_hcd *fotg210)
+ {
+ struct usb_bus *bus = &fotg210_to_hcd(fotg210)->self;
++ struct dentry *root;
+
+- fotg210->debug_dir = debugfs_create_dir(bus->bus_name,
+- fotg210_debug_root);
+- if (!fotg210->debug_dir)
+- return;
+-
+- if (!debugfs_create_file("async", S_IRUGO, fotg210->debug_dir, bus,
+- &debug_async_fops))
+- goto file_error;
+-
+- if (!debugfs_create_file("periodic", S_IRUGO, fotg210->debug_dir, bus,
+- &debug_periodic_fops))
+- goto file_error;
++ root = debugfs_create_dir(bus->bus_name, fotg210_debug_root);
++ fotg210->debug_dir = root;
+
+- if (!debugfs_create_file("registers", S_IRUGO, fotg210->debug_dir, bus,
+- &debug_registers_fops))
+- goto file_error;
+-
+- return;
+-
+-file_error:
+- debugfs_remove_recursive(fotg210->debug_dir);
++ debugfs_create_file("async", S_IRUGO, root, bus, &debug_async_fops);
++ debugfs_create_file("periodic", S_IRUGO, root, bus,
++ &debug_periodic_fops);
++ debugfs_create_file("registers", S_IRUGO, root, bus,
++ &debug_registers_fops);
+ }
+
+ static inline void remove_debug_files(struct fotg210_hcd *fotg210)
+@@ -5686,10 +5674,6 @@ static int __init fotg210_hcd_init(void)
+ sizeof(struct fotg210_itd));
+
+ fotg210_debug_root = debugfs_create_dir("fotg210", usb_debug_root);
+- if (!fotg210_debug_root) {
+- retval = -ENOENT;
+- goto err_debug;
+- }
+
+ retval = platform_driver_register(&fotg210_hcd_driver);
+ if (retval < 0)
+@@ -5699,7 +5683,7 @@ static int __init fotg210_hcd_init(void)
+ clean:
+ debugfs_remove(fotg210_debug_root);
+ fotg210_debug_root = NULL;
+-err_debug:
++
+ clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
+ return retval;
+ }
+diff --git a/drivers/usb/host/imx21-dbg.c b/drivers/usb/host/imx21-dbg.c
+index a213ed6f07b5..7fcf1d9dd7f3 100644
+--- a/drivers/usb/host/imx21-dbg.c
++++ b/drivers/usb/host/imx21-dbg.c
+@@ -417,46 +417,22 @@ DEFINE_SHOW_ATTRIBUTE(debug_isoc);
+
+ static void create_debug_files(struct imx21 *imx21)
+ {
+- imx21->debug_root = debugfs_create_dir(dev_name(imx21->dev), NULL);
+- if (!imx21->debug_root)
+- goto failed_create_rootdir;
++ struct dentry *root;
+
+- if (!debugfs_create_file("status", S_IRUGO,
+- imx21->debug_root, imx21, &debug_status_fops))
+- goto failed_create;
++ root = debugfs_create_dir(dev_name(imx21->dev), NULL);
++ imx21->debug_root = root;
+
+- if (!debugfs_create_file("dmem", S_IRUGO,
+- imx21->debug_root, imx21, &debug_dmem_fops))
+- goto failed_create;
+-
+- if (!debugfs_create_file("etd", S_IRUGO,
+- imx21->debug_root, imx21, &debug_etd_fops))
+- goto failed_create;
+-
+- if (!debugfs_create_file("statistics", S_IRUGO,
+- imx21->debug_root, imx21, &debug_statistics_fops))
+- goto failed_create;
+-
+- if (!debugfs_create_file("isoc", S_IRUGO,
+- imx21->debug_root, imx21, &debug_isoc_fops))
+- goto failed_create;
+-
+- return;
+-
+-failed_create:
+- debugfs_remove_recursive(imx21->debug_root);
+-
+-failed_create_rootdir:
+- imx21->debug_root = NULL;
++ debugfs_create_file("status", S_IRUGO, root, imx21, &debug_status_fops);
++ debugfs_create_file("dmem", S_IRUGO, root, imx21, &debug_dmem_fops);
++ debugfs_create_file("etd", S_IRUGO, root, imx21, &debug_etd_fops);
++ debugfs_create_file("statistics", S_IRUGO, root, imx21,
++ &debug_statistics_fops);
++ debugfs_create_file("isoc", S_IRUGO, root, imx21, &debug_isoc_fops);
+ }
+
+-
+ static void remove_debug_files(struct imx21 *imx21)
+ {
+- if (imx21->debug_root) {
+- debugfs_remove_recursive(imx21->debug_root);
+- imx21->debug_root = NULL;
+- }
++ debugfs_remove_recursive(imx21->debug_root);
+ }
+
+ #endif
+diff --git a/drivers/usb/host/isp116x-hcd.c b/drivers/usb/host/isp116x-hcd.c
+index 4602ed801f0a..74da136d322a 100644
+--- a/drivers/usb/host/isp116x-hcd.c
++++ b/drivers/usb/host/isp116x-hcd.c
+@@ -1198,14 +1198,11 @@ static int isp116x_debug_show(struct seq_file *s, void *unused)
+ }
+ DEFINE_SHOW_ATTRIBUTE(isp116x_debug);
+
+-static int create_debug_file(struct isp116x *isp116x)
++static void create_debug_file(struct isp116x *isp116x)
+ {
+ isp116x->dentry = debugfs_create_file(hcd_name,
+ S_IRUGO, NULL, isp116x,
+ &isp116x_debug_fops);
+- if (!isp116x->dentry)
+- return -ENOMEM;
+- return 0;
+ }
+
+ static void remove_debug_file(struct isp116x *isp116x)
+@@ -1215,8 +1212,8 @@ static void remove_debug_file(struct isp116x *isp116x)
+
+ #else
+
+-#define create_debug_file(d) 0
+-#define remove_debug_file(d) do{}while(0)
++static inline void create_debug_file(struct isp116x *isp116x) { }
++static inline void remove_debug_file(struct isp116x *isp116x) { }
+
+ #endif /* CONFIG_DEBUG_FS */
+
+@@ -1643,16 +1640,10 @@ static int isp116x_probe(struct platform_device *pdev)
+
+ device_wakeup_enable(hcd->self.controller);
+
+- ret = create_debug_file(isp116x);
+- if (ret) {
+- ERR("Couldn't create debugfs entry\n");
+- goto err7;
+- }
++ create_debug_file(isp116x);
+
+ return 0;
+
+- err7:
+- usb_remove_hcd(hcd);
+ err6:
+ usb_put_hcd(hcd);
+ err5:
+diff --git a/drivers/usb/host/ohci-dbg.c b/drivers/usb/host/ohci-dbg.c
+index ac7d4ac34b02..d3ee1f52aaab 100644
+--- a/drivers/usb/host/ohci-dbg.c
++++ b/drivers/usb/host/ohci-dbg.c
+@@ -762,50 +762,23 @@ static int debug_registers_open(struct inode *inode, struct file *file)
+ static inline void create_debug_files (struct ohci_hcd *ohci)
+ {
+ struct usb_bus *bus = &ohci_to_hcd(ohci)->self;
++ struct dentry *root;
+
+- ohci->debug_dir = debugfs_create_dir(bus->bus_name, ohci_debug_root);
+- if (!ohci->debug_dir)
+- goto dir_error;
++ root = debugfs_create_dir(bus->bus_name, ohci_debug_root);
++ ohci->debug_dir = root;
+
+- ohci->debug_async = debugfs_create_file("async", S_IRUGO,
+- ohci->debug_dir, ohci,
+- &debug_async_fops);
+- if (!ohci->debug_async)
+- goto async_error;
+-
+- ohci->debug_periodic = debugfs_create_file("periodic", S_IRUGO,
+- ohci->debug_dir, ohci,
+- &debug_periodic_fops);
+- if (!ohci->debug_periodic)
+- goto periodic_error;
+-
+- ohci->debug_registers = debugfs_create_file("registers", S_IRUGO,
+- ohci->debug_dir, ohci,
+- &debug_registers_fops);
+- if (!ohci->debug_registers)
+- goto registers_error;
++ debugfs_create_file("async", S_IRUGO, root, ohci, &debug_async_fops);
++ debugfs_create_file("periodic", S_IRUGO, root, ohci,
++ &debug_periodic_fops);
++ debugfs_create_file("registers", S_IRUGO, root, ohci,
++ &debug_registers_fops);
+
+ ohci_dbg (ohci, "created debug files\n");
+- return;
+-
+-registers_error:
+- debugfs_remove(ohci->debug_periodic);
+-periodic_error:
+- debugfs_remove(ohci->debug_async);
+-async_error:
+- debugfs_remove(ohci->debug_dir);
+-dir_error:
+- ohci->debug_periodic = NULL;
+- ohci->debug_async = NULL;
+- ohci->debug_dir = NULL;
+ }
+
+ static inline void remove_debug_files (struct ohci_hcd *ohci)
+ {
+- debugfs_remove(ohci->debug_registers);
+- debugfs_remove(ohci->debug_periodic);
+- debugfs_remove(ohci->debug_async);
+- debugfs_remove(ohci->debug_dir);
++ debugfs_remove_recursive(ohci->debug_dir);
+ }
+
+ /*-------------------------------------------------------------------------*/
+diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
+index 4806e0f9e8d4..210181fd98d2 100644
+--- a/drivers/usb/host/ohci-hcd.c
++++ b/drivers/usb/host/ohci-hcd.c
+@@ -1258,10 +1258,6 @@ static int __init ohci_hcd_mod_init(void)
+ set_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
+
+ ohci_debug_root = debugfs_create_dir("ohci", usb_debug_root);
+- if (!ohci_debug_root) {
+- retval = -ENOENT;
+- goto error_debug;
+- }
+
+ #ifdef PS3_SYSTEM_BUS_DRIVER
+ retval = ps3_ohci_driver_register(&PS3_SYSTEM_BUS_DRIVER);
+@@ -1318,7 +1314,6 @@ static int __init ohci_hcd_mod_init(void)
+ #endif
+ debugfs_remove(ohci_debug_root);
+ ohci_debug_root = NULL;
+- error_debug:
+
+ clear_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
+ return retval;
+diff --git a/drivers/usb/host/ohci.h b/drivers/usb/host/ohci.h
+index 508a803139dd..ef4813bfc5bf 100644
+--- a/drivers/usb/host/ohci.h
++++ b/drivers/usb/host/ohci.h
+@@ -431,9 +431,6 @@ struct ohci_hcd {
+ struct work_struct nec_work; /* Worker for NEC quirk */
+
+ struct dentry *debug_dir;
+- struct dentry *debug_async;
+- struct dentry *debug_periodic;
+- struct dentry *debug_registers;
+
+ /* platform-specific data -- must come last */
+ unsigned long priv[0] __aligned(sizeof(s64));
+diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c
+index f9c3947577fc..6218bfe54f52 100644
+--- a/drivers/usb/host/uhci-hcd.c
++++ b/drivers/usb/host/uhci-hcd.c
+@@ -590,14 +590,10 @@ static int uhci_start(struct usb_hcd *hcd)
+ init_waitqueue_head(&uhci->waitqh);
+
+ #ifdef UHCI_DEBUG_OPS
+- dentry = debugfs_create_file(hcd->self.bus_name,
+- S_IFREG|S_IRUGO|S_IWUSR, uhci_debugfs_root,
+- uhci, &uhci_debug_operations);
+- if (!dentry) {
+- dev_err(uhci_dev(uhci), "couldn't create uhci debugfs entry\n");
+- return -ENOMEM;
+- }
+- uhci->dentry = dentry;
++ uhci->dentry = debugfs_create_file(hcd->self.bus_name,
++ S_IFREG|S_IRUGO|S_IWUSR,
++ uhci_debugfs_root, uhci,
++ &uhci_debug_operations);
+ #endif
+
+ uhci->frame = dma_zalloc_coherent(uhci_dev(uhci),
+@@ -882,8 +878,6 @@ static int __init uhci_hcd_init(void)
+ if (!errbuf)
+ goto errbuf_failed;
+ uhci_debugfs_root = debugfs_create_dir("uhci", usb_debug_root);
+- if (!uhci_debugfs_root)
+- goto debug_failed;
+ #endif
+
+ uhci_up_cachep = kmem_cache_create("uhci_urb_priv",
+@@ -918,7 +912,6 @@ static int __init uhci_hcd_init(void)
+ #if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG)
+ debugfs_remove(uhci_debugfs_root);
+
+-debug_failed:
+ kfree(errbuf);
+
+ errbuf_failed:
+diff --git a/drivers/usb/mon/mon_text.c b/drivers/usb/mon/mon_text.c
+index 984f7e12a6a5..bc5ecd5ff565 100644
+--- a/drivers/usb/mon/mon_text.c
++++ b/drivers/usb/mon/mon_text.c
+@@ -700,7 +700,6 @@ static const struct file_operations mon_fops_text_u = {
+
+ int mon_text_add(struct mon_bus *mbus, const struct usb_bus *ubus)
+ {
+- struct dentry *d;
+ enum { NAMESZ = 10 };
+ char name[NAMESZ];
+ int busnum = ubus? ubus->busnum: 0;
+@@ -713,42 +712,32 @@ int mon_text_add(struct mon_bus *mbus, const struct usb_bus *ubus)
+ rc = snprintf(name, NAMESZ, "%dt", busnum);
+ if (rc <= 0 || rc >= NAMESZ)
+ goto err_print_t;
+- d = debugfs_create_file(name, 0600, mon_dir, mbus,
++ mbus->dent_t = debugfs_create_file(name, 0600, mon_dir, mbus,
+ &mon_fops_text_t);
+- if (d == NULL)
+- goto err_create_t;
+- mbus->dent_t = d;
+ }
+
+ rc = snprintf(name, NAMESZ, "%du", busnum);
+ if (rc <= 0 || rc >= NAMESZ)
+ goto err_print_u;
+- d = debugfs_create_file(name, 0600, mon_dir, mbus, &mon_fops_text_u);
+- if (d == NULL)
+- goto err_create_u;
+- mbus->dent_u = d;
++ mbus->dent_u = debugfs_create_file(name, 0600, mon_dir, mbus,
++ &mon_fops_text_u);
+
+ rc = snprintf(name, NAMESZ, "%ds", busnum);
+ if (rc <= 0 || rc >= NAMESZ)
+ goto err_print_s;
+- d = debugfs_create_file(name, 0600, mon_dir, mbus, &mon_fops_stat);
+- if (d == NULL)
+- goto err_create_s;
+- mbus->dent_s = d;
++ mbus->dent_s = debugfs_create_file(name, 0600, mon_dir, mbus,
++ &mon_fops_stat);
+
+ return 1;
+
+-err_create_s:
+ err_print_s:
+ debugfs_remove(mbus->dent_u);
+ mbus->dent_u = NULL;
+-err_create_u:
+ err_print_u:
+ if (ubus != NULL) {
+ debugfs_remove(mbus->dent_t);
+ mbus->dent_t = NULL;
+ }
+-err_create_t:
+ err_print_t:
+ return 0;
+ }
+@@ -756,8 +745,7 @@ int mon_text_add(struct mon_bus *mbus, const struct usb_bus *ubus)
+ void mon_text_del(struct mon_bus *mbus)
+ {
+ debugfs_remove(mbus->dent_u);
+- if (mbus->dent_t != NULL)
+- debugfs_remove(mbus->dent_t);
++ debugfs_remove(mbus->dent_t);
+ debugfs_remove(mbus->dent_s);
+ }
+
+@@ -775,18 +763,7 @@ static void mon_text_ctor(void *mem)
+
+ int __init mon_text_init(void)
+ {
+- struct dentry *mondir;
+-
+- mondir = debugfs_create_dir("usbmon", usb_debug_root);
+- if (IS_ERR(mondir)) {
+- /* debugfs not available, but we can use usbmon without it */
+- return 0;
+- }
+- if (mondir == NULL) {
+- printk(KERN_NOTICE TAG ": unable to create usbmon directory\n");
+- return -ENOMEM;
+- }
+- mon_dir = mondir;
++ mon_dir = debugfs_create_dir("usbmon", usb_debug_root);
+ return 0;
+ }
+
+diff --git a/drivers/usb/mtu3/mtu3_dr.c b/drivers/usb/mtu3/mtu3_dr.c
+index 8c3bbf732bc4..ac60e9c8564e 100644
+--- a/drivers/usb/mtu3/mtu3_dr.c
++++ b/drivers/usb/mtu3/mtu3_dr.c
+@@ -378,10 +378,6 @@ static void ssusb_debugfs_init(struct ssusb_mtk *ssusb)
+ struct dentry *root;
+
+ root = debugfs_create_dir(dev_name(ssusb->dev), usb_debug_root);
+- if (!root) {
+- dev_err(ssusb->dev, "create debugfs root failed\n");
+- return;
+- }
+ ssusb->dbgfs_root = root;
+
+ debugfs_create_file("mode", 0644, root, ssusb, &ssusb_mode_fops);
+diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
+index 5cc64980058b..b7d56272f9d1 100644
+--- a/drivers/usb/musb/musb_core.c
++++ b/drivers/usb/musb/musb_core.c
+@@ -2387,9 +2387,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
+ if (status < 0)
+ goto fail3;
+
+- status = musb_init_debugfs(musb);
+- if (status < 0)
+- goto fail4;
++ musb_init_debugfs(musb);
+
+ status = sysfs_create_group(&musb->controller->kobj, &musb_attr_group);
+ if (status)
+@@ -2404,7 +2402,6 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
+ fail5:
+ musb_exit_debugfs(musb);
+
+-fail4:
+ musb_gadget_cleanup(musb);
+ musb_host_cleanup(musb);
+
+diff --git a/drivers/usb/musb/musb_debug.h b/drivers/usb/musb/musb_debug.h
+index 5e0f079dde21..c444a80fe1da 100644
+--- a/drivers/usb/musb/musb_debug.h
++++ b/drivers/usb/musb/musb_debug.h
+@@ -20,12 +20,11 @@
+ void musb_dbg(struct musb *musb, const char *fmt, ...);
+
+ #ifdef CONFIG_DEBUG_FS
+-int musb_init_debugfs(struct musb *musb);
++void musb_init_debugfs(struct musb *musb);
+ void musb_exit_debugfs(struct musb *musb);
+ #else
+-static inline int musb_init_debugfs(struct musb *musb)
++static inline void musb_init_debugfs(struct musb *musb)
+ {
+- return 0;
+ }
+ static inline void musb_exit_debugfs(struct musb *musb)
+ {
+diff --git a/drivers/usb/musb/musb_debugfs.c b/drivers/usb/musb/musb_debugfs.c
+index e2050cac3eae..f42858e2b54c 100644
+--- a/drivers/usb/musb/musb_debugfs.c
++++ b/drivers/usb/musb/musb_debugfs.c
+@@ -321,48 +321,18 @@ static const struct file_operations musb_softconnect_fops = {
+ .release = single_release,
+ };
+
+-int musb_init_debugfs(struct musb *musb)
++void musb_init_debugfs(struct musb *musb)
+ {
+- struct dentry *root;
+- struct dentry *file;
+- int ret;
++ struct dentry *root;
+
+ root = debugfs_create_dir(dev_name(musb->controller), NULL);
+- if (!root) {
+- ret = -ENOMEM;
+- goto err0;
+- }
+-
+- file = debugfs_create_file("regdump", S_IRUGO, root, musb,
+- &musb_regdump_fops);
+- if (!file) {
+- ret = -ENOMEM;
+- goto err1;
+- }
+-
+- file = debugfs_create_file("testmode", S_IRUGO | S_IWUSR,
+- root, musb, &musb_test_mode_fops);
+- if (!file) {
+- ret = -ENOMEM;
+- goto err1;
+- }
+-
+- file = debugfs_create_file("softconnect", S_IRUGO | S_IWUSR,
+- root, musb, &musb_softconnect_fops);
+- if (!file) {
+- ret = -ENOMEM;
+- goto err1;
+- }
+-
+ musb->debugfs_root = root;
+
+- return 0;
+-
+-err1:
+- debugfs_remove_recursive(root);
+-
+-err0:
+- return ret;
++ debugfs_create_file("regdump", S_IRUGO, root, musb, &musb_regdump_fops);
++ debugfs_create_file("testmode", S_IRUGO | S_IWUSR, root, musb,
++ &musb_test_mode_fops);
++ debugfs_create_file("softconnect", S_IRUGO | S_IWUSR, root, musb,
++ &musb_softconnect_fops);
+ }
+
+ void /* __init_or_exit */ musb_exit_debugfs(struct musb *musb)
+diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
+index cfe6bfcbeb5d..fb871eabcc10 100644
+--- a/drivers/usb/musb/musb_dsps.c
++++ b/drivers/usb/musb/musb_dsps.c
+@@ -399,24 +399,17 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
+ static int dsps_musb_dbg_init(struct musb *musb, struct dsps_glue *glue)
+ {
+ struct dentry *root;
+- struct dentry *file;
+ char buf[128];
+
+ sprintf(buf, "%s.dsps", dev_name(musb->controller));
+ root = debugfs_create_dir(buf, NULL);
+- if (!root)
+- return -ENOMEM;
+ glue->dbgfs_root = root;
+
+ glue->regset.regs = dsps_musb_regs;
+ glue->regset.nregs = ARRAY_SIZE(dsps_musb_regs);
+ glue->regset.base = musb->ctrl_base;
+
+- file = debugfs_create_regset32("regdump", S_IRUGO, root, &glue->regset);
+- if (!file) {
+- debugfs_remove_recursive(root);
+- return -ENOMEM;
+- }
++ debugfs_create_regset32("regdump", S_IRUGO, root, &glue->regset);
+ return 0;
+ }
+
+diff --git a/drivers/usb/typec/fusb302/fusb302.c b/drivers/usb/typec/fusb302/fusb302.c
+index 9c1eba9ea004..07b07ddf6af0 100644
+--- a/drivers/usb/typec/fusb302/fusb302.c
++++ b/drivers/usb/typec/fusb302/fusb302.c
+@@ -117,7 +117,6 @@ struct fusb302_chip {
+ u32 snk_pdo[PDO_MAX_OBJECTS];
+
+ #ifdef CONFIG_DEBUG_FS
+- struct dentry *dentry;
+ /* lock for log buffer access */
+ struct mutex logbuffer_lock;
+ int logbuffer_head;
+@@ -215,33 +214,26 @@ DEFINE_SHOW_ATTRIBUTE(fusb302_debug);
+
+ static struct dentry *rootdir;
+
+-static int fusb302_debugfs_init(struct fusb302_chip *chip)
++static void fusb302_debugfs_init(struct fusb302_chip *chip)
+ {
+ mutex_init(&chip->logbuffer_lock);
+- if (!rootdir) {
++ if (!rootdir)
+ rootdir = debugfs_create_dir("fusb302", NULL);
+- if (!rootdir)
+- return -ENOMEM;
+- }
+-
+- chip->dentry = debugfs_create_file(dev_name(chip->dev),
+- S_IFREG | 0444, rootdir,
+- chip, &fusb302_debug_fops);
+
+- return 0;
++ debugfs_create_file(dev_name(chip->dev), S_IFREG | 0444, rootdir, chip,
++ &fusb302_debug_fops);
+ }
+
+ static void fusb302_debugfs_exit(struct fusb302_chip *chip)
+ {
+- debugfs_remove(chip->dentry);
+- debugfs_remove(rootdir);
++ debugfs_remove_recursive(rootdir);
+ }
+
+ #else
+
+ static void fusb302_log(const struct fusb302_chip *chip,
+ const char *fmt, ...) { }
+-static int fusb302_debugfs_init(const struct fusb302_chip *chip) { return 0; }
++static void fusb302_debugfs_init(const struct fusb302_chip *chip) { }
+ static void fusb302_debugfs_exit(const struct fusb302_chip *chip) { }
+
+ #endif
+@@ -1773,9 +1765,7 @@ static int fusb302_probe(struct i2c_client *client,
+ return -EPROBE_DEFER;
+ }
+
+- ret = fusb302_debugfs_init(chip);
+- if (ret < 0)
+- return ret;
++ fusb302_debugfs_init(chip);
+
+ chip->wq = create_singlethread_workqueue(dev_name(chip->dev));
+ if (!chip->wq) {
+diff --git a/drivers/usb/typec/tcpm.c b/drivers/usb/typec/tcpm.c
+index 0ccd2ce1eb59..1443b3233371 100644
+--- a/drivers/usb/typec/tcpm.c
++++ b/drivers/usb/typec/tcpm.c
+@@ -566,15 +566,12 @@ DEFINE_SHOW_ATTRIBUTE(tcpm_debug);
+
+ static struct dentry *rootdir;
+
+-static int tcpm_debugfs_init(struct tcpm_port *port)
++static void tcpm_debugfs_init(struct tcpm_port *port)
+ {
+ mutex_init(&port->logbuffer_lock);
+ /* /sys/kernel/debug/tcpm/usbcX */
+- if (!rootdir) {
++ if (!rootdir)
+ rootdir = debugfs_create_dir("tcpm", NULL);
+- if (!rootdir)
+- return -ENOMEM;
+- }
+
+ port->dentry = debugfs_create_file(dev_name(port->dev),
+ S_IFREG | 0444, rootdir,
+@@ -595,7 +592,7 @@ static void tcpm_log(const struct tcpm_port *port, const char *fmt, ...) { }
+ __printf(2, 3)
+ static void tcpm_log_force(struct tcpm_port *port, const char *fmt, ...) { }
+ static void tcpm_log_source_caps(struct tcpm_port *port) { }
+-static int tcpm_debugfs_init(const struct tcpm_port *port) { return 0; }
++static void tcpm_debugfs_init(const struct tcpm_port *port) { return 0; }
+ static void tcpm_debugfs_exit(const struct tcpm_port *port) { }
+
+ #endif
+--
+2.17.0
+
diff --git a/usb-debugfs.patch b/usb-debugfs.patch
new file mode 100644
index 0000000000000..79ef25f0ea42d
--- /dev/null
+++ b/usb-debugfs.patch
@@ -0,0 +1,476 @@
+---
+ drivers/usb/chipidea/ci.h | 2 -
+ drivers/usb/chipidea/core.c | 4 --
+ drivers/usb/chipidea/debug.c | 56 ++++++++----------------------
+ drivers/usb/core/usb.c | 26 ++------------
+ drivers/usb/dwc2/debugfs.c | 78 ++++++++-----------------------------------
+ drivers/usb/dwc3/debugfs.c | 33 +++---------------
+ drivers/usb/host/ehci-dbg.c | 30 ++++------------
+ drivers/usb/mon/mon_text.c | 37 +++-----------------
+ 8 files changed, 60 insertions(+), 206 deletions(-)
+
+--- a/drivers/usb/chipidea/ci.h
++++ b/drivers/usb/chipidea/ci.h
+@@ -450,7 +450,7 @@ void hw_phymode_configure(struct ci_hdrc
+
+ void ci_platform_configure(struct ci_hdrc *ci);
+
+-int dbg_create_files(struct ci_hdrc *ci);
++void dbg_create_files(struct ci_hdrc *ci);
+
+ void dbg_remove_files(struct ci_hdrc *ci);
+ #endif /* __DRIVERS_USB_CHIPIDEA_CI_H */
+--- a/drivers/usb/chipidea/core.c
++++ b/drivers/usb/chipidea/core.c
+@@ -1062,9 +1062,7 @@ static int ci_hdrc_probe(struct platform
+ ci_hdrc_otg_fsm_start(ci);
+
+ device_set_wakeup_capable(&pdev->dev, true);
+- ret = dbg_create_files(ci);
+- if (ret)
+- goto stop;
++ dbg_create_files(ci);
+
+ ret = sysfs_create_group(&dev->kobj, &ci_attr_group);
+ if (ret)
+--- a/drivers/usb/chipidea/debug.c
++++ b/drivers/usb/chipidea/debug.c
+@@ -340,54 +340,28 @@ DEFINE_SHOW_ATTRIBUTE(ci_registers);
+ *
+ * This function returns an error code
+ */
+-int dbg_create_files(struct ci_hdrc *ci)
++void dbg_create_files(struct ci_hdrc *ci)
+ {
+- struct dentry *dent;
+-
+ ci->debugfs = debugfs_create_dir(dev_name(ci->dev), NULL);
+- if (!ci->debugfs)
+- return -ENOMEM;
+-
+- dent = debugfs_create_file("device", S_IRUGO, ci->debugfs, ci,
+- &ci_device_fops);
+- if (!dent)
+- goto err;
+-
+- dent = debugfs_create_file("port_test", S_IRUGO | S_IWUSR, ci->debugfs,
+- ci, &ci_port_test_fops);
+- if (!dent)
+- goto err;
+
+- dent = debugfs_create_file("qheads", S_IRUGO, ci->debugfs, ci,
+- &ci_qheads_fops);
+- if (!dent)
+- goto err;
+-
+- dent = debugfs_create_file("requests", S_IRUGO, ci->debugfs, ci,
+- &ci_requests_fops);
+- if (!dent)
+- goto err;
++ debugfs_create_file("device", S_IRUGO, ci->debugfs, ci,
++ &ci_device_fops);
++ debugfs_create_file("port_test", S_IRUGO | S_IWUSR, ci->debugfs, ci,
++ &ci_port_test_fops);
++ debugfs_create_file("qheads", S_IRUGO, ci->debugfs, ci,
++ &ci_qheads_fops);
++ debugfs_create_file("requests", S_IRUGO, ci->debugfs, ci,
++ &ci_requests_fops);
+
+ if (ci_otg_is_fsm_mode(ci)) {
+- dent = debugfs_create_file("otg", S_IRUGO, ci->debugfs, ci,
+- &ci_otg_fops);
+- if (!dent)
+- goto err;
++ debugfs_create_file("otg", S_IRUGO, ci->debugfs, ci,
++ &ci_otg_fops);
+ }
+
+- dent = debugfs_create_file("role", S_IRUGO | S_IWUSR, ci->debugfs, ci,
+- &ci_role_fops);
+- if (!dent)
+- goto err;
+-
+- dent = debugfs_create_file("registers", S_IRUGO, ci->debugfs, ci,
+- &ci_registers_fops);
+-
+- if (dent)
+- return 0;
+-err:
+- debugfs_remove_recursive(ci->debugfs);
+- return -ENOMEM;
++ debugfs_create_file("role", S_IRUGO | S_IWUSR, ci->debugfs, ci,
++ &ci_role_fops);
++ debugfs_create_file("registers", S_IRUGO, ci->debugfs, ci,
++ &ci_registers_fops);
+ }
+
+ /**
+--- a/drivers/usb/core/usb.c
++++ b/drivers/usb/core/usb.c
+@@ -1167,30 +1167,16 @@ static struct notifier_block usb_bus_nb
+ struct dentry *usb_debug_root;
+ EXPORT_SYMBOL_GPL(usb_debug_root);
+
+-static struct dentry *usb_debug_devices;
+-
+-static int usb_debugfs_init(void)
++static void usb_debugfs_init(void)
+ {
+ usb_debug_root = debugfs_create_dir("usb", NULL);
+- if (!usb_debug_root)
+- return -ENOENT;
+-
+- usb_debug_devices = debugfs_create_file("devices", 0444,
+- usb_debug_root, NULL,
+- &usbfs_devices_fops);
+- if (!usb_debug_devices) {
+- debugfs_remove(usb_debug_root);
+- usb_debug_root = NULL;
+- return -ENOENT;
+- }
+-
+- return 0;
++ debugfs_create_file("devices", 0444, usb_debug_root, NULL,
++ &usbfs_devices_fops);
+ }
+
+ static void usb_debugfs_cleanup(void)
+ {
+- debugfs_remove(usb_debug_devices);
+- debugfs_remove(usb_debug_root);
++ debugfs_remove_recursive(usb_debug_root);
+ }
+
+ /*
+@@ -1205,9 +1191,7 @@ static int __init usb_init(void)
+ }
+ usb_init_pool_max();
+
+- retval = usb_debugfs_init();
+- if (retval)
+- goto out;
++ usb_debugfs_init();
+
+ usb_acpi_register();
+ retval = bus_register(&usb_bus_type);
+--- a/drivers/usb/dwc2/debugfs.c
++++ b/drivers/usb/dwc2/debugfs.c
+@@ -293,52 +293,30 @@ DEFINE_SHOW_ATTRIBUTE(ep);
+ static void dwc2_hsotg_create_debug(struct dwc2_hsotg *hsotg)
+ {
+ struct dentry *root;
+- struct dentry *file;
+ unsigned int epidx;
+
+ root = hsotg->debug_root;
+
+ /* create general state file */
+-
+- file = debugfs_create_file("state", 0444, root, hsotg, &state_fops);
+- if (IS_ERR(file))
+- dev_err(hsotg->dev, "%s: failed to create state\n", __func__);
+-
+- file = debugfs_create_file("testmode", 0644, root, hsotg,
+- &testmode_fops);
+- if (IS_ERR(file))
+- dev_err(hsotg->dev, "%s: failed to create testmode\n",
+- __func__);
+-
+- file = debugfs_create_file("fifo", 0444, root, hsotg, &fifo_fops);
+- if (IS_ERR(file))
+- dev_err(hsotg->dev, "%s: failed to create fifo\n", __func__);
++ debugfs_create_file("state", 0444, root, hsotg, &state_fops);
++ debugfs_create_file("testmode", 0644, root, hsotg, &testmode_fops);
++ debugfs_create_file("fifo", 0444, root, hsotg, &fifo_fops);
+
+ /* Create one file for each out endpoint */
+ for (epidx = 0; epidx < hsotg->num_of_eps; epidx++) {
+ struct dwc2_hsotg_ep *ep;
+
+ ep = hsotg->eps_out[epidx];
+- if (ep) {
+- file = debugfs_create_file(ep->name, 0444,
+- root, ep, &ep_fops);
+- if (IS_ERR(file))
+- dev_err(hsotg->dev, "failed to create %s debug file\n",
+- ep->name);
+- }
++ if (ep)
++ debugfs_create_file(ep->name, 0444, root, ep, &ep_fops);
+ }
+ /* Create one file for each in endpoint. EP0 is handled with out eps */
+ for (epidx = 1; epidx < hsotg->num_of_eps; epidx++) {
+ struct dwc2_hsotg_ep *ep;
+
+ ep = hsotg->eps_in[epidx];
+- if (ep) {
+- file = debugfs_create_file(ep->name, 0444,
+- root, ep, &ep_fops);
+- if (IS_ERR(file))
+- dev_err(hsotg->dev, "failed to create %s debug file\n",
+- ep->name);
+- }
++ if (ep)
++ debugfs_create_file(ep->name, 0444, root, ep, &ep_fops);
+ }
+ }
+ #else
+@@ -790,32 +768,14 @@ DEFINE_SHOW_ATTRIBUTE(dr_mode);
+ int dwc2_debugfs_init(struct dwc2_hsotg *hsotg)
+ {
+ int ret;
+- struct dentry *file;
++ struct dentry *root;
+
+- hsotg->debug_root = debugfs_create_dir(dev_name(hsotg->dev), NULL);
+- if (!hsotg->debug_root) {
+- ret = -ENOMEM;
+- goto err0;
+- }
++ root = debugfs_create_dir(dev_name(hsotg->dev), NULL);
++ hsotg->debug_root = root;
+
+- file = debugfs_create_file("params", 0444,
+- hsotg->debug_root,
+- hsotg, &params_fops);
+- if (IS_ERR(file))
+- dev_err(hsotg->dev, "%s: failed to create params\n", __func__);
+-
+- file = debugfs_create_file("hw_params", 0444,
+- hsotg->debug_root,
+- hsotg, &hw_params_fops);
+- if (IS_ERR(file))
+- dev_err(hsotg->dev, "%s: failed to create hw_params\n",
+- __func__);
+-
+- file = debugfs_create_file("dr_mode", 0444,
+- hsotg->debug_root,
+- hsotg, &dr_mode_fops);
+- if (IS_ERR(file))
+- dev_err(hsotg->dev, "%s: failed to create dr_mode\n", __func__);
++ debugfs_create_file("params", 0444, root, hsotg, &params_fops);
++ debugfs_create_file("hw_params", 0444, root, hsotg, &hw_params_fops);
++ debugfs_create_file("dr_mode", 0444, root, hsotg, &dr_mode_fops);
+
+ /* Add gadget debugfs nodes */
+ dwc2_hsotg_create_debug(hsotg);
+@@ -824,24 +784,18 @@ int dwc2_debugfs_init(struct dwc2_hsotg
+ GFP_KERNEL);
+ if (!hsotg->regset) {
+ ret = -ENOMEM;
+- goto err1;
++ goto err;
+ }
+
+ hsotg->regset->regs = dwc2_regs;
+ hsotg->regset->nregs = ARRAY_SIZE(dwc2_regs);
+ hsotg->regset->base = hsotg->regs;
+
+- file = debugfs_create_regset32("regdump", 0444, hsotg->debug_root,
+- hsotg->regset);
+- if (!file) {
+- ret = -ENOMEM;
+- goto err1;
+- }
++ debugfs_create_regset32("regdump", 0444, root, hsotg->regset);
+
+ return 0;
+-err1:
++err:
+ debugfs_remove_recursive(hsotg->debug_root);
+-err0:
+ return ret;
+ }
+
+--- a/drivers/usb/dwc3/debugfs.c
++++ b/drivers/usb/dwc3/debugfs.c
+@@ -716,9 +716,6 @@ static void dwc3_debugfs_create_endpoint
+ struct dentry *dir;
+
+ dir = debugfs_create_dir(dep->name, parent);
+- if (IS_ERR_OR_NULL(dir))
+- return;
+-
+ dwc3_debugfs_create_endpoint_files(dep, dir);
+ }
+
+@@ -740,14 +737,8 @@ static void dwc3_debugfs_create_endpoint
+ void dwc3_debugfs_init(struct dwc3 *dwc)
+ {
+ struct dentry *root;
+- struct dentry *file;
+
+ root = debugfs_create_dir(dev_name(dwc->dev), NULL);
+- if (IS_ERR_OR_NULL(root)) {
+- if (!root)
+- dev_err(dwc->dev, "Can't create debugfs root\n");
+- return;
+- }
+ dwc->root = root;
+
+ dwc->regset = kzalloc(sizeof(*dwc->regset), GFP_KERNEL);
+@@ -760,29 +751,19 @@ void dwc3_debugfs_init(struct dwc3 *dwc)
+ dwc->regset->nregs = ARRAY_SIZE(dwc3_regs);
+ dwc->regset->base = dwc->regs - DWC3_GLOBALS_REGS_START;
+
+- file = debugfs_create_regset32("regdump", S_IRUGO, root, dwc->regset);
+- if (!file)
+- dev_dbg(dwc->dev, "Can't create debugfs regdump\n");
++ debugfs_create_regset32("regdump", S_IRUGO, root, dwc->regset);
+
+ if (IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE)) {
+- file = debugfs_create_file("mode", S_IRUGO | S_IWUSR, root,
+- dwc, &dwc3_mode_fops);
+- if (!file)
+- dev_dbg(dwc->dev, "Can't create debugfs mode\n");
++ debugfs_create_file("mode", S_IRUGO | S_IWUSR, root, dwc,
++ &dwc3_mode_fops);
+ }
+
+ if (IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE) ||
+ IS_ENABLED(CONFIG_USB_DWC3_GADGET)) {
+- file = debugfs_create_file("testmode", S_IRUGO | S_IWUSR, root,
+- dwc, &dwc3_testmode_fops);
+- if (!file)
+- dev_dbg(dwc->dev, "Can't create debugfs testmode\n");
+-
+- file = debugfs_create_file("link_state", S_IRUGO | S_IWUSR,
+- root, dwc, &dwc3_link_state_fops);
+- if (!file)
+- dev_dbg(dwc->dev, "Can't create debugfs link_state\n");
+-
++ debugfs_create_file("testmode", S_IRUGO | S_IWUSR, root, dwc,
++ &dwc3_testmode_fops);
++ debugfs_create_file("link_state", S_IRUGO | S_IWUSR, root, dwc,
++ &dwc3_link_state_fops);
+ dwc3_debugfs_create_endpoint_dirs(dwc, root);
+ }
+ }
+--- a/drivers/usb/host/ehci-dbg.c
++++ b/drivers/usb/host/ehci-dbg.c
+@@ -1028,29 +1028,15 @@ static inline void create_debug_files(st
+ struct usb_bus *bus = &ehci_to_hcd(ehci)->self;
+
+ ehci->debug_dir = debugfs_create_dir(bus->bus_name, ehci_debug_root);
+- if (!ehci->debug_dir)
+- return;
+
+- if (!debugfs_create_file("async", S_IRUGO, ehci->debug_dir, bus,
+- &debug_async_fops))
+- goto file_error;
+-
+- if (!debugfs_create_file("bandwidth", S_IRUGO, ehci->debug_dir, bus,
+- &debug_bandwidth_fops))
+- goto file_error;
+-
+- if (!debugfs_create_file("periodic", S_IRUGO, ehci->debug_dir, bus,
+- &debug_periodic_fops))
+- goto file_error;
+-
+- if (!debugfs_create_file("registers", S_IRUGO, ehci->debug_dir, bus,
+- &debug_registers_fops))
+- goto file_error;
+-
+- return;
+-
+-file_error:
+- debugfs_remove_recursive(ehci->debug_dir);
++ debugfs_create_file("async", S_IRUGO, ehci->debug_dir, bus,
++ &debug_async_fops);
++ debugfs_create_file("bandwidth", S_IRUGO, ehci->debug_dir, bus,
++ &debug_bandwidth_fops);
++ debugfs_create_file("periodic", S_IRUGO, ehci->debug_dir, bus,
++ &debug_periodic_fops);
++ debugfs_create_file("registers", S_IRUGO, ehci->debug_dir, bus,
++ &debug_registers_fops);
+ }
+
+ static inline void remove_debug_files(struct ehci_hcd *ehci)
+--- a/drivers/usb/mon/mon_text.c
++++ b/drivers/usb/mon/mon_text.c
+@@ -700,7 +700,6 @@ static const struct file_operations mon_
+
+ int mon_text_add(struct mon_bus *mbus, const struct usb_bus *ubus)
+ {
+- struct dentry *d;
+ enum { NAMESZ = 10 };
+ char name[NAMESZ];
+ int busnum = ubus? ubus->busnum: 0;
+@@ -713,42 +712,32 @@ int mon_text_add(struct mon_bus *mbus, c
+ rc = snprintf(name, NAMESZ, "%dt", busnum);
+ if (rc <= 0 || rc >= NAMESZ)
+ goto err_print_t;
+- d = debugfs_create_file(name, 0600, mon_dir, mbus,
++ mbus->dent_t = debugfs_create_file(name, 0600, mon_dir, mbus,
+ &mon_fops_text_t);
+- if (d == NULL)
+- goto err_create_t;
+- mbus->dent_t = d;
+ }
+
+ rc = snprintf(name, NAMESZ, "%du", busnum);
+ if (rc <= 0 || rc >= NAMESZ)
+ goto err_print_u;
+- d = debugfs_create_file(name, 0600, mon_dir, mbus, &mon_fops_text_u);
+- if (d == NULL)
+- goto err_create_u;
+- mbus->dent_u = d;
++ mbus->dent_u = debugfs_create_file(name, 0600, mon_dir, mbus,
++ &mon_fops_text_u);
+
+ rc = snprintf(name, NAMESZ, "%ds", busnum);
+ if (rc <= 0 || rc >= NAMESZ)
+ goto err_print_s;
+- d = debugfs_create_file(name, 0600, mon_dir, mbus, &mon_fops_stat);
+- if (d == NULL)
+- goto err_create_s;
+- mbus->dent_s = d;
++ mbus->dent_s = debugfs_create_file(name, 0600, mon_dir, mbus,
++ &mon_fops_stat);
+
+ return 1;
+
+-err_create_s:
+ err_print_s:
+ debugfs_remove(mbus->dent_u);
+ mbus->dent_u = NULL;
+-err_create_u:
+ err_print_u:
+ if (ubus != NULL) {
+ debugfs_remove(mbus->dent_t);
+ mbus->dent_t = NULL;
+ }
+-err_create_t:
+ err_print_t:
+ return 0;
+ }
+@@ -756,8 +745,7 @@ err_print_t:
+ void mon_text_del(struct mon_bus *mbus)
+ {
+ debugfs_remove(mbus->dent_u);
+- if (mbus->dent_t != NULL)
+- debugfs_remove(mbus->dent_t);
++ debugfs_remove(mbus->dent_t);
+ debugfs_remove(mbus->dent_s);
+ }
+
+@@ -775,18 +763,7 @@ static void mon_text_ctor(void *mem)
+
+ int __init mon_text_init(void)
+ {
+- struct dentry *mondir;
+-
+- mondir = debugfs_create_dir("usbmon", usb_debug_root);
+- if (IS_ERR(mondir)) {
+- /* debugfs not available, but we can use usbmon without it */
+- return 0;
+- }
+- if (mondir == NULL) {
+- printk(KERN_NOTICE TAG ": unable to create usbmon directory\n");
+- return -ENOMEM;
+- }
+- mon_dir = mondir;
++ mon_dir = debugfs_create_dir("usbmon", usb_debug_root);
+ return 0;
+ }
+
diff --git a/usb-serial-visor-handle-potential-invalid-device-configuration.patch b/usb-serial-visor-handle-potential-invalid-device-configuration.patch
index 15f465118ab94..c73ab62cb0757 100644
--- a/usb-serial-visor-handle-potential-invalid-device-configuration.patch
+++ b/usb-serial-visor-handle-potential-invalid-device-configuration.patch
@@ -24,11 +24,13 @@ Johan, I incorporated your review comments of my original one-off patch
here as well.
-diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c
-index f5373ed2cd45..8ddbecc25d89 100644
+---
+ drivers/usb/serial/visor.c | 69 ++++++++++++++++++++++-----------------------
+ 1 file changed, 35 insertions(+), 34 deletions(-)
+
--- a/drivers/usb/serial/visor.c
+++ b/drivers/usb/serial/visor.c
-@@ -335,47 +335,48 @@ static int palm_os_3_probe(struct usb_serial *serial,
+@@ -335,47 +335,48 @@ static int palm_os_3_probe(struct usb_se
goto exit;
}