Received: by 2002:ab2:620c:0:b0:1ef:ffd0:ce49 with SMTP id o12csp42732lqt; Mon, 18 Mar 2024 00:01:52 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCVCXJDJx38yZgX+bZ8WFbGc9ROwvllaKhNUdMLb1VonmbSOu8H3UG228UgkV/BUTnnpOM8s7Ew/V+6Kj4gG/XcGPKuJVVLxZ955lPCjzg== X-Google-Smtp-Source: AGHT+IFucX9cFzM5OvOlGYNat90gl2AQRqrKF2bgUi6mYTpKycig3mAtIlj2mIGfUpnJuD9QgzRI X-Received: by 2002:a05:6402:249d:b0:567:66b:6bde with SMTP id q29-20020a056402249d00b00567066b6bdemr9258586eda.39.1710745312401; Mon, 18 Mar 2024 00:01:52 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1710745312; cv=pass; d=google.com; s=arc-20160816; b=TB+H3R0+s2A/Q1OGgJMSz9AE0S6hdnONGOenmAyW6OmHL1lNCBJrU4jRrC76yVd5m6 FAfRu2VjkHfNfdtPMqV80cvuTztYWWQZ8UuS13/da0IBIqNf3fxKPwqZFsHvEMCx2xg7 Shl+fWYvmxDcEI72TH4x27KxPyYqhu4FEL0EP7WQqGogPO9uHh17H5YcIQ1Dj5jMAF6M SUNo0LkGyPCR7k3kfMWxa7QG34Y5AbxqlaNhDVb6cuksIB68kNqyeHrIMwUWTu2N2dD2 3SkCcw9b4UJu/fcNXMNmkd6pks+3idMz4hxm3X5yOUFOvtuKrPvd5fTlxP/ZOmnBZwdH 23mA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-subscribe:list-id:precedence:message-id:date :subject:cc:to:from; bh=I83Et9fqqz00IZCLQf5y5boiXE72mkGYf3bo7VQCrwA=; fh=xTAq27uGFdHtvgODsU9kFctwgWwVa0N0KlhNjtxDTNE=; b=ahygB4nVTXWsLzWre/mbuBwGjUQb6bKtqTKhhFAF1FcgeFnrNRMu7y8qpSJ6qalwTD e7BiKgL2GPTM4577iQJ5U4Vszf53ldfjBcoViwASa2fBw8to9UhHRMvxhwU/5Et4Aa7/ RH9sNK6fBnfugwA3LqIB6rplt5CevQri5pwnwNm2XOYKbwnVkvBCaSkHFWRPBka2KPE6 xMcrSFpCe88qjmXQG6SL9q11KBS+G5PRKHaTEIfnjc9PSKF1gHR6diYI5nWBykUbQaGj 0UhN399xkxzsAfJUpssVBLq6X+NX0V59A8jfgJlf/jP6+q89lBRPq7k2UySY4XquFjY5 U9Ow==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=nxp.com dmarc=pass fromdomain=nxp.com); spf=pass (google.com: domain of linux-kernel+bounces-105751-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-105751-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [147.75.80.249]) by mx.google.com with ESMTPS id g8-20020a056402320800b0056b803e4f09si176763eda.649.2024.03.18.00.01.52 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Mar 2024 00:01:52 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-105751-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) client-ip=147.75.80.249; Authentication-Results: mx.google.com; arc=pass (i=1 spf=pass spfdomain=nxp.com dmarc=pass fromdomain=nxp.com); spf=pass (google.com: domain of linux-kernel+bounces-105751-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-105751-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id AF7351F2196C for ; Mon, 18 Mar 2024 06:53:35 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id C7A0922339; Mon, 18 Mar 2024 06:53:27 +0000 (UTC) Received: from inva020.nxp.com (inva020.nxp.com [92.121.34.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7984D1CA89; Mon, 18 Mar 2024 06:53:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=92.121.34.13 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710744807; cv=none; b=q+Vs0/rS/4YndAX2eT3WKaMqqhUAwuyYcJ+kLXWwlSUr1/Nnw73xSdQXTk8CaD/RIRFR6CRRkYOjOzw/aJb4jO3BTRHH1SdnMzOIS8ZmHiZnXL6fb+Oegchx9xRrbYBgOk0QS2Ir2QO4vHKKVL+2khmhTsJtliWYoXDgOosju5E= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710744807; c=relaxed/simple; bh=4m/ohYPMa+0mBDHTTy2RJmhezQAAKT1R6j2wsefkv94=; h=From:To:Cc:Subject:Date:Message-Id; b=Y9elhtDZUigP/9U0ZRCkWTKLPGi086z/b0ucz/WnqBamc0HRedUlx3ApYgWgxjWm1nGFI/6itpQnnXwA3wRW65Og+ayX+WL7gO0HDQ2zaWOOcHiRbnl1lKFdKlZvpCVe+aX1uERlP13SQLhmqxbEBhvpPjn7NsS21pM7IVy4yHU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; arc=none smtp.client-ip=92.121.34.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Received: from inva020.nxp.com (localhost [127.0.0.1]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 9589D1A0BA3; Mon, 18 Mar 2024 07:53:18 +0100 (CET) Received: from aprdc01srsp001v.ap-rdc01.nxp.com (aprdc01srsp001v.ap-rdc01.nxp.com [165.114.16.16]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 337111A0580; Mon, 18 Mar 2024 07:53:18 +0100 (CET) Received: from localhost.localdomain (shlinux2.ap.freescale.net [10.192.224.44]) by aprdc01srsp001v.ap-rdc01.nxp.com (Postfix) with ESMTP id 77ACD183AC0B; Mon, 18 Mar 2024 14:53:16 +0800 (+08) From: Shengjiu Wang To: abelvesa@kernel.org, peng.fan@nxp.com, mturquette@baylibre.com, sboyd@kernel.org, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, linux-imx@nxp.com, shengjiu.wang@gmail.com Cc: linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH] clk: imx: imx8mp: Add pm_runtime support for power saving Date: Mon, 18 Mar 2024 14:36:51 +0800 Message-Id: <1710743811-1698-1-git-send-email-shengjiu.wang@nxp.com> X-Mailer: git-send-email 2.7.4 X-Virus-Scanned: ClamAV using ClamSMTP Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Add pm_runtime support for power saving. In pm runtime suspend state the registers will be reseted, so add registers save in pm runtime suspend and restore them in pm runtime resume. Signed-off-by: Shengjiu Wang --- drivers/clk/imx/clk-imx8mp-audiomix.c | 99 ++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 3 deletions(-) diff --git a/drivers/clk/imx/clk-imx8mp-audiomix.c b/drivers/clk/imx/clk-imx8mp-audiomix.c index 55ed211a5e0b..d2bf53e2aacf 100644 --- a/drivers/clk/imx/clk-imx8mp-audiomix.c +++ b/drivers/clk/imx/clk-imx8mp-audiomix.c @@ -7,10 +7,12 @@ #include #include +#include #include #include #include #include +#include #include @@ -18,6 +20,7 @@ #define CLKEN0 0x000 #define CLKEN1 0x004 +#define EARC 0x200 #define SAI1_MCLK_SEL 0x300 #define SAI2_MCLK_SEL 0x304 #define SAI3_MCLK_SEL 0x308 @@ -26,6 +29,12 @@ #define SAI7_MCLK_SEL 0x314 #define PDM_SEL 0x318 #define SAI_PLL_GNRL_CTL 0x400 +#define SAI_PLL_FDIVL_CTL0 0x404 +#define SAI_PLL_FDIVL_CTL1 0x408 +#define SAI_PLL_SSCG_CTL 0x40C +#define SAI_PLL_MNIT_CTL 0x410 +#define IPG_LP_CTRL 0x504 +#define REGS_NUM 16 #define SAIn_MCLK1_PARENT(n) \ static const struct clk_parent_data \ @@ -182,13 +191,65 @@ static struct clk_imx8mp_audiomix_sel sels[] = { CLK_SAIn(7) }; +struct clk_imx8mp_audiomix_regs { + u32 regs_num; + u32 regs_off[]; +}; + +static const struct clk_imx8mp_audiomix_regs audiomix_regs = { + .regs_num = REGS_NUM, + .regs_off = { + CLKEN0, + CLKEN1, + EARC, + SAI1_MCLK_SEL, + SAI2_MCLK_SEL, + SAI3_MCLK_SEL, + SAI5_MCLK_SEL, + SAI6_MCLK_SEL, + SAI7_MCLK_SEL, + PDM_SEL, + SAI_PLL_GNRL_CTL, + SAI_PLL_FDIVL_CTL0, + SAI_PLL_FDIVL_CTL1, + SAI_PLL_SSCG_CTL, + SAI_PLL_MNIT_CTL, + IPG_LP_CTRL + }, +}; + +struct clk_imx8mp_audiomix_drvdata { + void __iomem *base; + u32 regs_save[REGS_NUM]; +}; + +static void clk_imx8mp_audiomix_save_restore(struct device *dev, bool save) +{ + struct clk_imx8mp_audiomix_drvdata *drvdata = dev_get_drvdata(dev); + void __iomem *base = drvdata->base; + int i; + + if (save) { + for (i = 0; i < audiomix_regs.regs_num; i++) + drvdata->regs_save[i] = readl(base + audiomix_regs.regs_off[i]); + } else { + for (i = 0; i < audiomix_regs.regs_num; i++) + writel(drvdata->regs_save[i], base + audiomix_regs.regs_off[i]); + } +} + static int clk_imx8mp_audiomix_probe(struct platform_device *pdev) { + struct clk_imx8mp_audiomix_drvdata *drvdata; struct clk_hw_onecell_data *priv; struct device *dev = &pdev->dev; void __iomem *base; struct clk_hw *hw; - int i; + int i, ret; + + drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); + if (!drvdata) + return -ENOMEM; priv = devm_kzalloc(dev, struct_size(priv, hws, IMX8MP_CLK_AUDIOMIX_END), @@ -202,6 +263,9 @@ static int clk_imx8mp_audiomix_probe(struct platform_device *pdev) if (IS_ERR(base)) return PTR_ERR(base); + drvdata->base = base; + dev_set_drvdata(dev, drvdata); + for (i = 0; i < ARRAY_SIZE(sels); i++) { if (sels[i].num_parents == 1) { hw = devm_clk_hw_register_gate_parent_data(dev, @@ -257,10 +321,38 @@ static int clk_imx8mp_audiomix_probe(struct platform_device *pdev) if (IS_ERR(hw)) return PTR_ERR(hw); - return devm_of_clk_add_hw_provider(&pdev->dev, of_clk_hw_onecell_get, - priv); + ret = devm_of_clk_add_hw_provider(&pdev->dev, of_clk_hw_onecell_get, + priv); + if (ret) + return ret; + + pm_runtime_enable(&pdev->dev); + clk_imx8mp_audiomix_save_restore(&pdev->dev, true); + + return 0; } +static int clk_imx8mp_audiomix_runtime_suspend(struct device *dev) +{ + clk_imx8mp_audiomix_save_restore(dev, true); + + return 0; +} + +static int clk_imx8mp_audiomix_runtime_resume(struct device *dev) +{ + clk_imx8mp_audiomix_save_restore(dev, false); + + return 0; +} + +static const struct dev_pm_ops clk_imx8mp_audiomix_pm_ops = { + SET_RUNTIME_PM_OPS(clk_imx8mp_audiomix_runtime_suspend, + clk_imx8mp_audiomix_runtime_resume, NULL) + SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, + pm_runtime_force_resume) +}; + static const struct of_device_id clk_imx8mp_audiomix_of_match[] = { { .compatible = "fsl,imx8mp-audio-blk-ctrl" }, { /* sentinel */ } @@ -272,6 +364,7 @@ static struct platform_driver clk_imx8mp_audiomix_driver = { .driver = { .name = "imx8mp-audio-blk-ctrl", .of_match_table = clk_imx8mp_audiomix_of_match, + .pm = &clk_imx8mp_audiomix_pm_ops, }, }; -- 2.34.1