From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 20555C4167B for ; Tue, 14 Nov 2023 08:39:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=9Tpps+TKZ3RE2naoTf9bZDqu54tpAzynnjgRlmMk8d4=; b=WgWVDdTAlPttCf 06xBX2DNVBD6vln8CqP7k8KtNTC7kfsUJne6wYqZm6xUPzTql42XXjSOPb2urvlpfebskfdXk5xps Gl3qPwq+8cwZ4+U0V6ifx1esTPkjDsnEKa0q/uZ0bOMBdsfO8N9Ntut1oEHZWL05n8NBMouWwtM7D g43AeGNV39UEn5avk6SFr8Wyd5BlsE/OmMiY4nO5vl1j7aSLY0v9+jMxN5KAY3aSH44BFmfSlVYkO g2YRArL70pIakW2zbjNwxvAKhDbFBmU8NUD9OJFVQBVhEKZcsr7SZUGe/WOKQFp+nzEUKiiO6C1ec TCY8Ljy10nknBdvn2zjQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1r2owq-00FOyp-0j; Tue, 14 Nov 2023 08:39:04 +0000 Received: from ams.source.kernel.org ([145.40.68.75]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1r2own-00FOyA-11 for linux-arm-kernel@lists.infradead.org; Tue, 14 Nov 2023 08:39:02 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by ams.source.kernel.org (Postfix) with ESMTP id B796FB80ABF; Tue, 14 Nov 2023 08:38:58 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id BF65BC433C8; Tue, 14 Nov 2023 08:38:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1699951138; bh=Qz4bqCfb39E5fvYkFxANSDUiv0YU+cze73hZIqUJoas=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=Evo9Jq1Z02upcf0EdAXLr4DlJDNCEFzN9aofJ05Ssk28wE/s7yhMnPCIvtgjG0ebI YM6fuhkTs2jJDiOoKnHakIJYHuesen4hL+NtfDBjRZvQF8EuPFzgLbCkoBmgNzOZsE s3n/I/E9TmOG/fgt1nv3OA3McT+8vff5mbv0UJyMud8/LPvkoJ6JH5x0L/A9jKkM+j 7txpZPI0iD1r3pY5eyEyrFoBp5IL1uS3Seukf8ep1Cy8W1L4C8p18vwf0qlBY4/6U+ +6XOvxBO1VkkzrCzFAJVUCL8vBorLhLrC2Na/51HzRKdACb/vSbbch47ukXavw6VqS 7H3lwKgnE9B8Q== Date: Tue, 14 Nov 2023 16:38:38 +0800 From: Peter Chen To: =?iso-8859-1?Q?Th=E9o?= Lebrun Cc: Greg Kroah-Hartman , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Roger Quadros , Pawel Laszczak , Nishanth Menon , Vignesh Raghavendra , Tero Kristo , linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH 4/6] usb: cdns3: support power-off of controller when in host role Message-ID: <20231114083838.GC64573@nchen-desktop> References: <20231113-j7200-usb-suspend-v1-0-ad1ee714835c@bootlin.com> <20231113-j7200-usb-suspend-v1-4-ad1ee714835c@bootlin.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20231113-j7200-usb-suspend-v1-4-ad1ee714835c@bootlin.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231114_003901_677019_24E503F2 X-CRM114-Status: GOOD ( 30.73 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On 23-11-13 15:26:59, Th=E9o Lebrun wrote: > The controller is not being reconfigured at resume. Change resume to > redo hardware config if quirk CDNS3_RESET_ON_RESUME is active. Current logic has power off judgement, see cdns3_controller_resume for detail. > = > Platform data comes from the parent driver (eg cdns3-ti). > = > The quirk should be passed if the platform driver knows that the > controller might be in reset state at resume. We do NOT reconfigure the > hardware without this quirk to avoid losing state if we did a suspend > without reset. > = > If the quirk is on, we notify the xHCI subsystem that: > = > 1. We reset on resume. It will therefore redo the xHC init & trigger > such message as "root hub lost power or was reset" in dmesg. > = > 2. It should disable/enable clocks on suspend/resume. This does not > matter on our platform as xhci-plat does not get access to any clock > but it would be the right thing to do if we indeed had such clocks. > = > Signed-off-by: Th=E9o Lebrun > --- > drivers/usb/cdns3/core.h | 1 + > drivers/usb/cdns3/host.c | 20 ++++++++++++++++++++ > 2 files changed, 21 insertions(+) > = > diff --git a/drivers/usb/cdns3/core.h b/drivers/usb/cdns3/core.h > index 81a9c9d6be08..7487067ba23f 100644 > --- a/drivers/usb/cdns3/core.h > +++ b/drivers/usb/cdns3/core.h > @@ -44,6 +44,7 @@ struct cdns3_platform_data { > bool suspend, bool wakeup); > unsigned long quirks; > #define CDNS3_DEFAULT_PM_RUNTIME_ALLOW BIT(0) > +#define CDNS3_RESET_ON_RESUME BIT(1) > }; > = > /** > diff --git a/drivers/usb/cdns3/host.c b/drivers/usb/cdns3/host.c > index 6164fc4c96a4..a81019a7c8cc 100644 > --- a/drivers/usb/cdns3/host.c > +++ b/drivers/usb/cdns3/host.c > @@ -88,6 +88,9 @@ static int __cdns_host_init(struct cdns *cdns) > goto err1; > } > = > + if (cdns->pdata && cdns->pdata->quirks & CDNS3_RESET_ON_RESUME) > + cdns->xhci_plat_data->quirks |=3D XHCI_RESET_ON_RESUME | XHCI_SUSPEND_= RESUME_CLKS; > + If you set this flag, how could you support the USB remote wakeup request? In that case, the USB bus does not expect re-enumeration. > if (cdns->pdata && (cdns->pdata->quirks & CDNS3_DEFAULT_PM_RUNTIME_ALLO= W)) > cdns->xhci_plat_data->quirks |=3D XHCI_DEFAULT_PM_RUNTIME_ALLOW; > = > @@ -124,6 +127,18 @@ static void cdns_host_exit(struct cdns *cdns) > cdns_drd_host_off(cdns); > } > = > +static int cdns_host_suspend(struct cdns *cdns, bool do_wakeup) > +{ > + if (!do_wakeup) > + cdns_drd_host_off(cdns); > + return 0; > +} > + > +static int cdns_host_resume(struct cdns *cdns, bool hibernated) > +{ > + return cdns_drd_host_on(cdns); This one will redo if controller's power is off, please consider both on and power situation. > +} > + > int cdns_host_init(struct cdns *cdns) > { > struct cdns_role_driver *rdrv; > @@ -137,6 +152,11 @@ int cdns_host_init(struct cdns *cdns) > rdrv->state =3D CDNS_ROLE_STATE_INACTIVE; > rdrv->name =3D "host"; > = > + if (cdns->pdata && cdns->pdata->quirks & CDNS3_RESET_ON_RESUME) { > + rdrv->suspend =3D cdns_host_suspend; > + rdrv->resume =3D cdns_host_resume; > + } > + > cdns->roles[USB_ROLE_HOST] =3D rdrv; > = > return 0; > = > -- = > 2.41.0 > = -- = Thanks, Peter Chen _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel