From nobody Wed Dec 17 09:16:56 2025 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2AC5BC4167B for ; Tue, 28 Nov 2023 13:21:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344984AbjK1NU7 (ORCPT ); Tue, 28 Nov 2023 08:20:59 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52372 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343821AbjK1NU5 (ORCPT ); Tue, 28 Nov 2023 08:20:57 -0500 Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [IPv6:2001:4b98:dc4:8::226]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C2813D62; Tue, 28 Nov 2023 05:21:01 -0800 (PST) Received: by mail.gandi.net (Postfix) with ESMTPSA id 39C60C000C; Tue, 28 Nov 2023 13:20:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1701177660; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=uG7hIl7at36uWKJHQ21nTIZih0E8GqWucxRcdCXoYHQ=; b=OL2Gbi/I03qzlLOdV3y8RDkLDr2fYDmcARSVxreMVGFgfnRLhaHz4RuRSWXvKPfJSYFFvG KPrfiTjtSTHyf/JVyg+I9TZ1LT8u17m+OhCOkzC2SGmc0B3qpxN9VkyxqzMUXyVVyCCwDO J/4CcWDr0p2HU958mwSRHlcWWDAH3rr+W/5RJ38FBZCNH1+KWcO882LqRlFfkyfhEKRxkL c25599glt9Nit566C56v3UM9e/V8NYIT/uFmp8zvtb3rF4VVRTuMz37+RbXYLB7LMEHkxz Aj8vNYR7yBj9DMgyaTh+WngIkTSasROcHKGwJKsa339hipUODpV9XpjfaZ29jA== From: Thomas Richard To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, s-vadapalli@ti.com, rogerq@kernel.org, grygorii.strashko@ti.com, dan.carpenter@linaro.org, thomas.petazzoni@bootlin.com, gregory.clement@bootlin.com, u-kumar1@ti.com, Thomas Richard Subject: [PATCH] net: ethernet: ti: am65-cpsw: improve suspend/resume support for J7200 Date: Tue, 28 Nov 2023 14:19:36 +0100 Message-Id: <20231128131936.600233-1-thomas.richard@bootlin.com> X-Mailer: git-send-email 2.39.2 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-GND-Sasl: thomas.richard@bootlin.com Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Gregory CLEMENT On J7200 the SoC is off during suspend, so the clocks have to be completely power down, and phy_set_mode_ext must be called again. Signed-off-by: Gregory CLEMENT Signed-off-by: Thomas Richard --- drivers/net/ethernet/ti/am65-cpsw-nuss.c | 25 ++++++++++++++++++++++++ drivers/net/ethernet/ti/am65-cpts.c | 11 +++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/etherne= t/ti/am65-cpsw-nuss.c index ece9f8df98ae..e95ef30bd67f 100644 --- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c +++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c @@ -2115,6 +2115,27 @@ static int am65_cpsw_nuss_init_slave_ports(struct am= 65_cpsw_common *common) return ret; } =20 +static int am65_cpsw_nuss_resume_slave_ports(struct am65_cpsw_common *comm= on) +{ + struct device *dev =3D common->dev; + int i; + + for (i =3D 1; i <=3D common->port_num; i++) { + struct am65_cpsw_port *port; + int ret; + + port =3D am65_common_get_port(common, i); + + ret =3D phy_set_mode_ext(port->slave.ifphy, PHY_MODE_ETHERNET, port->sla= ve.phy_if); + if (ret) { + dev_err(dev, "port %d error setting phy mode %d\n", i, ret); + return ret; + } + } + + return 0; +} + static void am65_cpsw_pcpu_stats_free(void *data) { struct am65_cpsw_ndev_stats __percpu *stats =3D data; @@ -3087,6 +3108,10 @@ static int am65_cpsw_nuss_resume(struct device *dev) if (common->rx_irq_disabled) disable_irq(common->rx_chns.irq); =20 + ret =3D am65_cpsw_nuss_resume_slave_ports(common); + if (ret) + dev_err(dev, "failed to resume slave ports: %d", ret); + am65_cpts_resume(common->cpts); =20 for (i =3D 0; i < common->port_num; i++) { diff --git a/drivers/net/ethernet/ti/am65-cpts.c b/drivers/net/ethernet/ti/= am65-cpts.c index c66618d91c28..e6db5b61409a 100644 --- a/drivers/net/ethernet/ti/am65-cpts.c +++ b/drivers/net/ethernet/ti/am65-cpts.c @@ -1189,7 +1189,11 @@ void am65_cpts_suspend(struct am65_cpts *cpts) cpts->sr_cpts_ns =3D am65_cpts_gettime(cpts, NULL); cpts->sr_ktime_ns =3D ktime_to_ns(ktime_get_real()); am65_cpts_disable(cpts); - clk_disable(cpts->refclk); + + /* During suspend the SoC can be power off, so let's not only + * disable but also unprepare the clock + */ + clk_disable_unprepare(cpts->refclk); =20 /* Save GENF state */ memcpy_fromio(&cpts->sr_genf, &cpts->reg->genf, sizeof(cpts->sr_genf)); @@ -1204,8 +1208,11 @@ void am65_cpts_resume(struct am65_cpts *cpts) int i; s64 ktime_ns; =20 + /* During suspend the SoC can be power off, so let's not only + * enable but also prepare the clock + */ + clk_prepare_enable(cpts->refclk); /* restore state and enable CPTS */ - clk_enable(cpts->refclk); am65_cpts_write32(cpts, cpts->sr_rftclk_sel, rftclk_sel); am65_cpts_set_add_val(cpts); am65_cpts_write32(cpts, cpts->sr_control, control); --=20 2.39.2