Received: by 2002:a5d:9c59:0:0:0:0:0 with SMTP id 25csp784852iof; Mon, 6 Jun 2022 12:25:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzSegf2kFOO4sHlyCwTPPIu+CmKsnQbB34gWaf94OBTv8u+KiRWoZL5HOBGGAiHZXZ7QwdQ X-Received: by 2002:a17:90b:3ec9:b0:1e8:6ab9:a47 with SMTP id rm9-20020a17090b3ec900b001e86ab90a47mr11558584pjb.60.1654543541371; Mon, 06 Jun 2022 12:25:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1654543541; cv=none; d=google.com; s=arc-20160816; b=znNAJlwvz3f9XX854uSP+znDlk71zA84RHuTL/K/ftDS9/ix+0lAN5kSJq3hAkxGl7 sTvWN2lKR0qTjxWwoHebat2uWre8VT5ZzbZdqryqKHclP+PdIvYOuOq9JU/7dgXE7SLL kvi3ZPqI83epo7SWZOorpedD6/r6Kkv60ulgxHOTlnD0t4RENIvU71gJrVqWrc2inHL1 wiY6e4g0px4MmHdCkCe1RJ2GtBL0WbtM4NEQB3xoE3UaBAELHDw31yrZju6aUrSevEHc Km9QPaD7pRT5mc4DMG5EYYMRm1N3a+MUbfCosK3gC4zcXGsiQWMVXGeUagEF8sUYWswu ZUUw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-transfer-encoding :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=31RKhQHPFx4JWxOJ4mvDhxVLOMZjTTqSuOEz1b6ipQ8=; b=lIQ1eJ9Jck7fXuSCFNBmis2qFAI1ep4IbdzBudCX7OTA/LzWtFR+lYCWYnOGRy6GNh Nj9yttyGBaiCd+AnrogvZSjJKUnMXfPQiWQlLZr0fDodbcJ37HHiMb0MH+BRynF0lVF4 Sxfp9Bz7ou/Z3ao3/QS8UzPk55+Q97E2zbM+0pRkU0xlY8VpYIt2MSgrnpef9e3OfWwR JR5eSVeU1Kmt/SAaRIq8OtcUjipTOVI/p2oipn8L7ycOijwuKGytowftnSvk903R5rmu anOE7H5q7IoEnwwFIk15meV0R4orlSOrWbNjtheqeRrbrfjdtDJMCGQcGtJU6+9DnpwS +X8Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id s6-20020a056a00178600b004fa3a8e0062si22181738pfg.281.2022.06.06.12.25.22; Mon, 06 Jun 2022 12:25:41 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231359AbiFFSM4 (ORCPT + 99 others); Mon, 6 Jun 2022 14:12:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35874 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231269AbiFFSMy (ORCPT ); Mon, 6 Jun 2022 14:12:54 -0400 Received: from netrider.rowland.org (netrider.rowland.org [192.131.102.5]) by lindbergh.monkeyblade.net (Postfix) with SMTP id 234E42AC72 for ; Mon, 6 Jun 2022 11:12:53 -0700 (PDT) Received: (qmail 377508 invoked by uid 1000); 6 Jun 2022 14:12:52 -0400 Date: Mon, 6 Jun 2022 14:12:52 -0400 From: Alan Stern To: =?iso-8859-1?Q?Cl=E9ment_L=E9ger?= Cc: Greg Kroah-Hartman , Nicolas Ferre , Alexandre Belloni , Claudiu Beznea , linux-usb@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] usb: host: ohci-at91: add support to enter suspend using SMC Message-ID: References: <20220606141802.165252-1-clement.leger@bootlin.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20220606141802.165252-1-clement.leger@bootlin.com> X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,SPF_HELO_PASS,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Jun 06, 2022 at 04:18:02PM +0200, Cl?ment L?ger wrote: > When Linux is running under OP-TEE, the SFR is set as secured and thus > the AT91_OHCIICR_USB_SUSPEND register isn't accessible. Add a SMC to > do the appropriate call to suspend the controller. > The SMC id is fetched from the device-tree property > "microchip,suspend-smc-id". if present, then the syscon regmap is not > used to enter suspend and a SMC is issued. > > Signed-off-by: Cl?ment L?ger > --- Acked-by: Alan Stern However, this is a little weird... You've written usb_hcd_at91_probe() so that the SMC is detected in preference to the regmap, but then you wrote ohci_at91_port_suspend() so that the regmap is used in preference to the SMC. It's not wrong, but it is confusing to read. Do you want to rewrite the patch to make the two routines agree on which mechanism to use by default? Alan Stern > drivers/usb/host/ohci-at91.c | 69 ++++++++++++++++++++++++------------ > 1 file changed, 46 insertions(+), 23 deletions(-) > > diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c > index a24aea3d2759..e73fda4af278 100644 > --- a/drivers/usb/host/ohci-at91.c > +++ b/drivers/usb/host/ohci-at91.c > @@ -13,6 +13,7 @@ > * This file is licenced under the GPL. > */ > > +#include > #include > #include > #include > @@ -55,6 +56,7 @@ struct ohci_at91_priv { > bool clocked; > bool wakeup; /* Saved wake-up state for resume */ > struct regmap *sfr_regmap; > + u32 smc_id; > }; > /* interface and function clocks; sometimes also an AHB clock */ > > @@ -135,6 +137,19 @@ static void at91_stop_hc(struct platform_device *pdev) > > static void usb_hcd_at91_remove (struct usb_hcd *, struct platform_device *); > > +static u32 at91_dt_suspend_smc(struct device *dev) > +{ > + u32 smc_id; > + > + if (!dev->of_node) > + return 0; > + > + if (of_property_read_u32(dev->of_node, "microchip,suspend-smc-id", &smc_id)) > + return 0; > + > + return smc_id; > +} > + > static struct regmap *at91_dt_syscon_sfr(void) > { > struct regmap *regmap; > @@ -215,9 +230,13 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver, > goto err; > } > > - ohci_at91->sfr_regmap = at91_dt_syscon_sfr(); > - if (!ohci_at91->sfr_regmap) > - dev_dbg(dev, "failed to find sfr node\n"); > + ohci_at91->smc_id = at91_dt_suspend_smc(dev); > + if (!ohci_at91->smc_id) { > + dev_dbg(dev, "failed to find sfr suspend smc id, using regmap\n"); > + ohci_at91->sfr_regmap = at91_dt_syscon_sfr(); > + if (!ohci_at91->sfr_regmap) > + dev_dbg(dev, "failed to find sfr node\n"); > + } > > board = hcd->self.controller->platform_data; > ohci = hcd_to_ohci(hcd); > @@ -303,24 +322,30 @@ static int ohci_at91_hub_status_data(struct usb_hcd *hcd, char *buf) > return length; > } > > -static int ohci_at91_port_suspend(struct regmap *regmap, u8 set) > +static int ohci_at91_port_suspend(struct ohci_at91_priv *ohci_at91, u8 set) > { > + struct regmap *regmap = ohci_at91->sfr_regmap; > u32 regval; > int ret; > > - if (!regmap) > - return 0; > + if (regmap) { > + ret = regmap_read(regmap, AT91_SFR_OHCIICR, ®val); > + if (ret) > + return ret; > > - ret = regmap_read(regmap, AT91_SFR_OHCIICR, ®val); > - if (ret) > - return ret; > + if (set) > + regval |= AT91_OHCIICR_USB_SUSPEND; > + else > + regval &= ~AT91_OHCIICR_USB_SUSPEND; > > - if (set) > - regval |= AT91_OHCIICR_USB_SUSPEND; > - else > - regval &= ~AT91_OHCIICR_USB_SUSPEND; > + regmap_write(regmap, AT91_SFR_OHCIICR, regval); > + } else if (ohci_at91->smc_id) { > + struct arm_smccc_res res; > > - regmap_write(regmap, AT91_SFR_OHCIICR, regval); > + arm_smccc_smc(ohci_at91->smc_id, set, 0, 0, 0, 0, 0, 0, &res); > + if (res.a0) > + return -EINVAL; > + } > > return 0; > } > @@ -357,9 +382,8 @@ static int ohci_at91_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, > > case USB_PORT_FEAT_SUSPEND: > dev_dbg(hcd->self.controller, "SetPortFeat: SUSPEND\n"); > - if (valid_port(wIndex) && ohci_at91->sfr_regmap) { > - ohci_at91_port_suspend(ohci_at91->sfr_regmap, > - 1); > + if (valid_port(wIndex)) { > + ohci_at91_port_suspend(ohci_at91, 1); > return 0; > } > break; > @@ -400,9 +424,8 @@ static int ohci_at91_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, > > case USB_PORT_FEAT_SUSPEND: > dev_dbg(hcd->self.controller, "ClearPortFeature: SUSPEND\n"); > - if (valid_port(wIndex) && ohci_at91->sfr_regmap) { > - ohci_at91_port_suspend(ohci_at91->sfr_regmap, > - 0); > + if (valid_port(wIndex)) { > + ohci_at91_port_suspend(ohci_at91, 0); > return 0; > } > break; > @@ -630,10 +653,10 @@ ohci_hcd_at91_drv_suspend(struct device *dev) > /* flush the writes */ > (void) ohci_readl (ohci, &ohci->regs->control); > msleep(1); > - ohci_at91_port_suspend(ohci_at91->sfr_regmap, 1); > + ohci_at91_port_suspend(ohci_at91, 1); > at91_stop_clock(ohci_at91); > } else { > - ohci_at91_port_suspend(ohci_at91->sfr_regmap, 1); > + ohci_at91_port_suspend(ohci_at91, 1); > } > > return ret; > @@ -645,7 +668,7 @@ ohci_hcd_at91_drv_resume(struct device *dev) > struct usb_hcd *hcd = dev_get_drvdata(dev); > struct ohci_at91_priv *ohci_at91 = hcd_to_ohci_at91_priv(hcd); > > - ohci_at91_port_suspend(ohci_at91->sfr_regmap, 0); > + ohci_at91_port_suspend(ohci_at91, 0); > > if (ohci_at91->wakeup) > disable_irq_wake(hcd->irq); > -- > 2.36.1 >