From patchwork Sun Feb 11 21:06:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Blumenstingl X-Patchwork-Id: 10211609 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 93ECD602D8 for ; Sun, 11 Feb 2018 21:31:21 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 837E320952 for ; Sun, 11 Feb 2018 21:31:21 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7746126E97; Sun, 11 Feb 2018 21:31:21 +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=-4.2 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, RCVD_IN_DNSWL_MED autolearn=unavailable version=3.3.1 Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id CB01B20952 for ; Sun, 11 Feb 2018 21:31:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:MIME-Version:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:References:In-Reply-To:Message-Id:Date:Subject:To: From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=L/gFOvMOSnXPX5hipq/mGvYFf3PQ4IIETrjLKhTSdng=; b=JbbZE3WYEu3IETpgznQkO8pPvt F3gHU2h1ghy/WhIT3r3DO3jAwq4IrCyOSgqOTEEzvflPhqZr3MvPb0CVEUhi+pkE0joFg0693Deny gcNro497o4ZfbTI/cdEmxHDWcT8BmYyZ2QuvRURRqwIJB8AYPtHmK2haVXe15B35iKm6AasYEROT3 9k1IUCKQyDjd9UQWWC7AtdHLUDamSPW1UrULsjid2XAmkC1LOvOXeCJP9+OCvfKRUkNh12jjb7YvJ AifWOUJ+sIdjoldJmYHAuCv1rN8uLc2UY7bEu3UIiAITwfCnmH63huyGmkN55hjgg1U4gXIWLd6+t L0Zb0PDQ==; Received: from [198.137.202.133] (helo=bombadil.infradead.org) by casper.infradead.org with esmtps (Exim 4.89 #1 (Red Hat Linux)) id 1ekzDP-0008Qg-MC for patchwork-linux-mediatek@patchwork.kernel.org; Sun, 11 Feb 2018 21:31:15 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=L/gFOvMOSnXPX5hipq/mGvYFf3PQ4IIETrjLKhTSdng=; b=j5iQfz53dsm51P1lM3hsGcsVPH xZFZtpo3jgcjWoOCM0TUANQyQrB5k4hue0Y6iqmm8ZrSoH+E+3Sxx3AjjClTL8qWcqD5u5q++ZgBX BndxiK/U5nJfu+p9zn23JDBboSINhgnfp+rnsdcJVm8d1gi6QgStL3lybGZQ6VquGxiC637z+L+kV 4Sci73PG5301M+3l411qZOcMdNI+58+6PjC/ZtXwwmQtAkunpdIc1caoy8uej9QQbtJQOoB/nQtjA /n0/54iYqDU76WDAuXMr1FsWTTsOnT8JHV81UD/+4WZRFS2WbVz80+W6U9pSK6AgABszc1zhbXSdL Zna8BjJA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.89 #1 (Red Hat Linux)) id 1ekysS-0001OD-3a; Sun, 11 Feb 2018 21:09:36 +0000 Received: from mail-wr0-x243.google.com ([2a00:1450:400c:c0c::243]) by bombadil.infradead.org with esmtps (Exim 4.89 #1 (Red Hat Linux)) id 1ekyrL-0007yF-MW; Sun, 11 Feb 2018 21:08:30 +0000 Received: by mail-wr0-x243.google.com with SMTP id t94so13278186wrc.5; Sun, 11 Feb 2018 13:08:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=lKjp5MNMBpVDNhWQIXReweCh6J4cVbts52+ZlXmyscI=; b=XsUHrhK4lHRiPJSh8rDL3o45d8J0koEZUMW49VzqMQnGEViImQ43xixp9zlBqS/Zfb PurzxE1dqURHrNgJP3a28+g+0/Q37xnVaSJ4ApxIhzWtbbHMCixaZq2TMM9ZPYdbIeU5 J3MJSiuJfIOY04AXORVkvPLRbgSkA4YrNvHV8CYcCOd+EdqHF6X5U7+z3YkGCvXc9Zia dFmkigxtqtMZ7Sd1P0IclIHeAU2Joof48lRmE0B2HR0ggwSMODUw1/8KGQQ+/dbgiRBl 4GlCzhyhPczzPYtKF3Ncj9AIcwdK1erVRVjM2pNN8O/xKgAJFw6OooLMLJGlNLD2oJmp Stgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=lKjp5MNMBpVDNhWQIXReweCh6J4cVbts52+ZlXmyscI=; b=EmvJtjUdM3X5H6qtlEVN7ckeV+gXwuhOE5qBEjB/m8ILH4nE7Ga+yE8/H2/6bmxx06 LF++OkRtWb+eFoekxM3KOHK1KkgTBKnlYA9z2QQj4/Jg9L1r4UpB/FcFWO9XgEA0d9lg AQA7PUzf0lI13mhAfkMFte5d9YMu+Tiwd3jt1z++xvegii9UNj90uR4g3itmfefTVxMn BG2tH27E2xU7Iy9tzODGoBfVWHJhW66CemFcBvB03OlK4ajPLLYE4rXgCLiD5Lf5/5aZ Dwm8lB6Yj3uLYSrnDTyRpwcc4Pz92JiPv/2s+D2rrCyHUrz99p8p2Ntg4EHUBfZGwFsj jkPw== X-Gm-Message-State: APf1xPBX+H71c1xyg+ekUAuJ0uP+jxYTOldrBRLKcDKBGj0+q94QawrS dsFZ1DVzKlBQiHnt/Y8qceNZ8juw X-Google-Smtp-Source: AH8x224JFquuizY3q4CcxJ39mGtWQmweg+q94hK46vdnN8r4EhkGbOZG/rf5MMZtDXa9IOoVp+I3rg== X-Received: by 10.223.170.205 with SMTP id i13mr8077184wrc.38.1518383295854; Sun, 11 Feb 2018 13:08:15 -0800 (PST) Received: from blackbox.darklights.net (p5B056154.dip0.t-ipconnect.de. [91.5.97.84]) by smtp.googlemail.com with ESMTPSA id k13sm6301773wrd.61.2018.02.11.13.08.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Feb 2018 13:08:15 -0800 (PST) From: Martin Blumenstingl To: linux-usb@vger.kernel.org, mathias.nyman@intel.com, arnd@arndb.de, gregkh@linuxfoundation.org, felipe.balbi@linux.intel.com Subject: [PATCH usb-next v9 4/8] usb: core: hcd: integrate the PHY wrapper into the HCD core Date: Sun, 11 Feb 2018 22:06:47 +0100 Message-Id: <20180211210651.2046-5-martin.blumenstingl@googlemail.com> X-Mailer: git-send-email 2.16.1 In-Reply-To: <20180211210651.2046-1-martin.blumenstingl@googlemail.com> References: <20180211210651.2046-1-martin.blumenstingl@googlemail.com> X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, devicetree@vger.kernel.org, Peter.Chen@nxp.com, Martin Blumenstingl , narmstrong@baylibre.com, yixun.lan@amlogic.com, robh+dt@kernel.org, jonathanh@nvidia.com, linux@prisktech.co.nz, matthias.bgg@gmail.com, thierry.reding@gmail.com, linux-mediatek@lists.infradead.org, linux-amlogic@lists.infradead.org, linux-tegra@vger.kernel.org, stern@rowland.harvard.edu, linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org MIME-Version: 1.0 Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+patchwork-linux-mediatek=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP This integrates the PHY wrapper into the core hcd infrastructure. Multiple PHYs which are part of the HCD's device tree node are now managed (= powered on/off when needed), by the new usb_phy_roothub code. Suspend and resume is also supported, however not for runtime/auto-suspend (which is triggered for example when no devices are connected to the USB bus). This is needed on some SoCs (for example Amlogic Meson GXL) because if the PHYs are disabled during auto-suspend then devices which are plugged in afterwards are not seen by the host. One example where this is required is the Amlogic GXL and GXM SoCs: They are using a dwc3 USB controller with up to three ports enabled on the internal roothub. Each port has it's own PHY which must be enabled (if one of the PHYs is left disabled then none of the USB ports works at all). The new logic works on the Amlogic GXL and GXM SoCs because the dwc3 driver internally creates a xhci-hcd which then registers a HCD which then triggers our new PHY wrapper. USB controller drivers can opt out of this by setting "skip_phy_initialization" in struct usb_hcd to true. This is identical to how it works for a single USB PHY, so the "multiple PHY" handling is disabled for drivers that opted out of the management logic of a single PHY. Signed-off-by: Martin Blumenstingl Acked-by: Alan Stern Acked-by: Chunfeng Yun Tested-by: Yixun Lan --- drivers/usb/core/hcd.c | 31 +++++++++++++++++++++++++++++++ include/linux/usb/hcd.h | 1 + 2 files changed, 32 insertions(+) diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index f2307470a31e..32797c25ac3b 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -37,6 +37,7 @@ #include #include "usb.h" +#include "phy.h" /*-------------------------------------------------------------------------*/ @@ -2260,6 +2261,9 @@ int hcd_bus_suspend(struct usb_device *rhdev, pm_message_t msg) usb_set_device_state(rhdev, USB_STATE_SUSPENDED); hcd->state = HC_STATE_SUSPENDED; + if (!PMSG_IS_AUTO(msg)) + usb_phy_roothub_power_off(hcd->phy_roothub); + /* Did we race with a root-hub wakeup event? */ if (rhdev->do_remote_wakeup) { char buffer[6]; @@ -2296,6 +2300,13 @@ int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg) dev_dbg(&rhdev->dev, "skipped %s of dead bus\n", "resume"); return 0; } + + if (!PMSG_IS_AUTO(msg)) { + status = usb_phy_roothub_power_on(hcd->phy_roothub); + if (status) + return status; + } + if (!hcd->driver->bus_resume) return -ENOENT; if (HCD_RH_RUNNING(hcd)) @@ -2333,6 +2344,7 @@ int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg) } } else { hcd->state = old_state; + usb_phy_roothub_power_off(hcd->phy_roothub); dev_dbg(&rhdev->dev, "bus %s fail, err %d\n", "resume", status); if (status != -ESHUTDOWN) @@ -2769,6 +2781,18 @@ int usb_add_hcd(struct usb_hcd *hcd, } } + if (!hcd->skip_phy_initialization) { + hcd->phy_roothub = usb_phy_roothub_init(hcd->self.sysdev); + if (IS_ERR(hcd->phy_roothub)) { + retval = PTR_ERR(hcd->phy_roothub); + goto err_phy_roothub_init; + } + + retval = usb_phy_roothub_power_on(hcd->phy_roothub); + if (retval) + goto err_usb_phy_roothub_power_on; + } + dev_info(hcd->self.controller, "%s\n", hcd->product_desc); /* Keep old behaviour if authorized_default is not in [0, 1]. */ @@ -2933,6 +2957,10 @@ int usb_add_hcd(struct usb_hcd *hcd, err_register_bus: hcd_buffer_destroy(hcd); err_create_buf: + usb_phy_roothub_power_off(hcd->phy_roothub); +err_usb_phy_roothub_power_on: + usb_phy_roothub_exit(hcd->phy_roothub); +err_phy_roothub_init: if (IS_ENABLED(CONFIG_GENERIC_PHY) && hcd->remove_phy && hcd->phy) { phy_power_off(hcd->phy); phy_exit(hcd->phy); @@ -3017,6 +3045,9 @@ void usb_remove_hcd(struct usb_hcd *hcd) usb_deregister_bus(&hcd->self); hcd_buffer_destroy(hcd); + usb_phy_roothub_power_off(hcd->phy_roothub); + usb_phy_roothub_exit(hcd->phy_roothub); + if (IS_ENABLED(CONFIG_GENERIC_PHY) && hcd->remove_phy && hcd->phy) { phy_power_off(hcd->phy); phy_exit(hcd->phy); diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index b46fb6dd43ab..b85e3d4fb0c5 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h @@ -110,6 +110,7 @@ struct usb_hcd { */ struct usb_phy *usb_phy; struct phy *phy; + struct usb_phy_roothub *phy_roothub; /* Flags that need to be manipulated atomically because they can * change while the host controller is running. Always use