From patchwork Tue Jun 6 15:59:02 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johan Hovold X-Patchwork-Id: 9769231 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id CDAD060364 for ; Tue, 6 Jun 2017 16:03:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D6A0622B1F for ; Tue, 6 Jun 2017 16:03:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CA8BE2843F; Tue, 6 Jun 2017 16:03:38 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 805F222B1F for ; Tue, 6 Jun 2017 16:03:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751610AbdFFQDW (ORCPT ); Tue, 6 Jun 2017 12:03:22 -0400 Received: from mail-lf0-f65.google.com ([209.85.215.65]:33173 "EHLO mail-lf0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751533AbdFFQAw (ORCPT ); Tue, 6 Jun 2017 12:00:52 -0400 Received: by mail-lf0-f65.google.com with SMTP id u62so11922861lfg.0; Tue, 06 Jun 2017 09:00:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=jSiku5flXzxis+xJCnbi6aePQ1/GxUMrxaTppiWo7dQ=; b=QOyFbEcg90/LLbYrKgK0qbMyN04YQjN8zrKMcir4bv+b+lRYA5JzIlf4ingGab6+y1 20fDJXZZt9Sfd43YV17quqe/wzpm84myoLs3W5RrGv1gGvXVBcQ5iC1ec6GO2je3W1w3 PQyIOUnqOgfpgXHJ/C0ADAij/94ogUXuhtMnOr+DWXXdZZAyjwsMe/aE05n9zddg6g+l w5GP9rbqBTYwbFwT4HdUb4KZLt4nMfYyC/R+nRw0r3A+E09KFA34bWaMHNCDxGntyRQZ jSJuDbKq5FB7dqkQt2pPzZOwobauAzfU1liVASYG8Ulr851mmQQAbRKgQqy5s2KvnemQ DiVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=jSiku5flXzxis+xJCnbi6aePQ1/GxUMrxaTppiWo7dQ=; b=XLc3EPDVo8TWEGR1+sXUivIE1l+pM7/gEG9uq/dXsM5U1IHbdZoRR/0wZKmd1jvC4g DFtKW2a16NZm2mWhjuhdfPqhLI6xpzDoEbXDloxnCswcXbpb9Am0wtwZXv5tBfxiD8er SNG38Md7s3Gem39KIA/hj6fWkCElGZYVz5Nf1H0zSSrUzdtDjmqtBltOaU5uzhNtPbQx zG96I+h5g++UaTRI/2CIXP+1kzR8HKMO58k8zRUEsTK6sT1EMOPTAmCMDqXVU4AAMU71 b3ztpn1acVKs2JgGgpZO6D5Dyi3LZEZgmQG8i8yY7vW8bfuFvbkUOIHI0gqV3RXrBUOo 653w== X-Gm-Message-State: AODbwcA4Xjfi5iGJDTyxXJPqNgLpgcGOqwrhTIeKOeOmINwO4YzFrYo4 qfE2Wc7LvkdvUA== X-Received: by 10.25.31.9 with SMTP id f9mr6734338lff.160.1496764850112; Tue, 06 Jun 2017 09:00:50 -0700 (PDT) Received: from xi.terra (c-42c8e255.07-184-6d6c6d4.cust.bredbandsbolaget.se. [85.226.200.66]) by smtp.gmail.com with ESMTPSA id j7sm2055620lfg.28.2017.06.06.09.00.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 06 Jun 2017 09:00:47 -0700 (PDT) Received: from johan by xi.terra with local (Exim 4.89) (envelope-from ) id 1dIGuV-00071J-05; Tue, 06 Jun 2017 18:00:47 +0200 From: Johan Hovold To: Greg Kroah-Hartman Cc: Linus Walleij , Peter Chen , Rob Herring , Arnd Bergmann , Sricharan R , Zhang Rui , Eduardo Valentin , linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, Johan Hovold Subject: [PATCH v2 5/7] USB: of: fix root-hub device-tree node handling Date: Tue, 6 Jun 2017 17:59:02 +0200 Message-Id: <20170606155904.26819-6-johan@kernel.org> X-Mailer: git-send-email 2.13.0 In-Reply-To: <20170606155904.26819-1-johan@kernel.org> References: <20170606155904.26819-1-johan@kernel.org> Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP In an attempt to work around a pinmux over-allocation issue in driver core, commit dc5878abf49c ("usb: core: move root hub's device node assignment after it is added to bus") moved the device-tree node assignment until after the root hub had been registered. This not only makes the device-tree node unavailable to the usb driver during probe, but also prevents the of_node from being linked to in sysfs and causes a race with user-space for the (recently added) devspec attribute. Use the new device_set_of_node_from_dev() helper to reuse the node of the sysdev device, something which now prevents driver core from trying to reclaim any pinctrl pins during probe. Fixes: dc5878abf49c ("usb: core: move root hub's device node assignment after it is added to bus") Fixes: 51fa91475e43 ("usb/core: Added devspec sysfs entry for devices behind the usb hub") Signed-off-by: Johan Hovold --- drivers/usb/core/hcd.c | 2 -- drivers/usb/core/usb.c | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 5dea98358c05..2cff59e9c268 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -1076,7 +1076,6 @@ static void usb_deregister_bus (struct usb_bus *bus) static int register_root_hub(struct usb_hcd *hcd) { struct device *parent_dev = hcd->self.controller; - struct device *sysdev = hcd->self.sysdev; struct usb_device *usb_dev = hcd->self.root_hub; const int devnum = 1; int retval; @@ -1123,7 +1122,6 @@ static int register_root_hub(struct usb_hcd *hcd) /* Did the HC die before the root hub was registered? */ if (HCD_DEAD(hcd)) usb_hc_died (hcd); /* This time clean up */ - usb_dev->dev.of_node = sysdev->of_node; } mutex_unlock(&usb_bus_idr_lock); diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 62e1906bb2f3..17681d5638ac 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -416,8 +416,7 @@ static void usb_release_dev(struct device *dev) usb_destroy_configuration(udev); usb_release_bos_descriptor(udev); - if (udev->parent) - of_node_put(dev->of_node); + of_node_put(dev->of_node); usb_put_hcd(hcd); kfree(udev->product); kfree(udev->manufacturer); @@ -616,6 +615,7 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent, dev->route = 0; dev->dev.parent = bus->controller; + device_set_of_node_from_dev(&dev->dev, bus->sysdev); dev_set_name(&dev->dev, "usb%d", bus->busnum); root_hub = 1; } else {