From nobody Fri Dec 26 05:14:18 2025 Received: from zg8tmtyylji0my4xnjqumte4.icoremail.net (zg8tmtyylji0my4xnjqumte4.icoremail.net [162.243.164.118]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 62CFD37149; Tue, 9 Jan 2024 11:47:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kernelsoft.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kernelsoft.com Received: from localhost.localdomain (unknown [106.37.191.2]) by mail (Coremail) with SMTP id AQAAfwAXEEwSMp1lYIpFAA--.14466S2; Tue, 09 Jan 2024 19:46:27 +0800 (CST) From: tianyu2 To: rafael@kernel.org, viresh.kumar@linaro.org, shawnguo@kernel.org, s.hauer@pengutronix.de Cc: kernel@pengutronix.de, festevam@gmail.com, linux-imx@nxp.com, linux-pm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH] cpufreq: imx6: use regmap to read ocotp register Date: Tue, 9 Jan 2024 19:45:21 +0800 Message-Id: <20240109114521.518195-1-tianyu2@kernelsoft.com> X-Mailer: git-send-email 2.25.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: AQAAfwAXEEwSMp1lYIpFAA--.14466S2 X-Coremail-Antispam: 1UD129KBjvJXoWxXr13WF4kKFW8GFWxGw1DAwb_yoW5Xw4Dpa y7uFWayrW5XFnrtw1vyF4kG3W3trn2yayUJa10kwnaqwnxtFyrWas0vF9YyF95ZF95GF15 XF1ktrWxCw4UXr7anT9S1TB71UUUUUDqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnUUvcSsGvfC2KfnxnUUI43ZEXa7xR_UUUUUUUUU== X-CM-SenderInfo: xwld05zxs6yvxuqhz2xriwhudrp/ Content-Type: text/plain; charset="utf-8" Reading the ocotp register directly is unsafe and will cause the system to hang if its clock is not turned on in CCM. The regmap interface has clk enabled, which can solve this problem. Signed-off-by: tianyu2 --- drivers/cpufreq/imx6q-cpufreq.c | 45 +++++++++++---------------------- 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/drivers/cpufreq/imx6q-cpufreq.c b/drivers/cpufreq/imx6q-cpufre= q.c index 494d044b9e72..f18b9ee5e484 100644 --- a/drivers/cpufreq/imx6q-cpufreq.c +++ b/drivers/cpufreq/imx6q-cpufreq.c @@ -14,6 +14,8 @@ #include #include #include +#include +#include =20 #define PU_SOC_VOLTAGE_NORMAL 1250000 #define PU_SOC_VOLTAGE_HIGH 1275000 @@ -225,8 +227,6 @@ static void imx6x_disable_freq_in_opp(struct device *de= v, unsigned long freq) =20 static int imx6q_opp_check_speed_grading(struct device *dev) { - struct device_node *np; - void __iomem *base; u32 val; int ret; =20 @@ -235,16 +235,11 @@ static int imx6q_opp_check_speed_grading(struct devic= e *dev) if (ret) return ret; } else { - np =3D of_find_compatible_node(NULL, NULL, "fsl,imx6q-ocotp"); - if (!np) - return -ENOENT; + struct regmap *ocotp; =20 - base =3D of_iomap(np, 0); - of_node_put(np); - if (!base) { - dev_err(dev, "failed to map ocotp\n"); - return -EFAULT; - } + ocotp =3D syscon_regmap_lookup_by_compatible("fsl,imx6q-ocotp"); + if (IS_ERR(ocotp)) + return -ENOENT; =20 /* * SPEED_GRADING[1:0] defines the max speed of ARM: @@ -254,8 +249,7 @@ static int imx6q_opp_check_speed_grading(struct device = *dev) * 2b'00: 792000000Hz; * We need to set the max speed of ARM according to fuse map. */ - val =3D readl_relaxed(base + OCOTP_CFG3); - iounmap(base); + regmap_read(ocotp, OCOTP_CFG3, &val); } =20 val >>=3D OCOTP_CFG3_SPEED_SHIFT; @@ -290,25 +284,16 @@ static int imx6ul_opp_check_speed_grading(struct devi= ce *dev) if (ret) return ret; } else { - struct device_node *np; - void __iomem *base; - - np =3D of_find_compatible_node(NULL, NULL, "fsl,imx6ul-ocotp"); - if (!np) - np =3D of_find_compatible_node(NULL, NULL, - "fsl,imx6ull-ocotp"); - if (!np) - return -ENOENT; + struct regmap *ocotp; =20 - base =3D of_iomap(np, 0); - of_node_put(np); - if (!base) { - dev_err(dev, "failed to map ocotp\n"); - return -EFAULT; - } + ocotp =3D syscon_regmap_lookup_by_compatible("fsl,imx6ul-ocotp"); + if (IS_ERR(ocotp)) + ocotp =3D syscon_regmap_lookup_by_compatible("fsl,imx6ull-ocotp"); + + if (IS_ERR(ocotp)) + return -ENOENT; =20 - val =3D readl_relaxed(base + OCOTP_CFG3); - iounmap(base); + regmap_read(ocotp, OCOTP_CFG3, &val); } =20 /* --=20 2.25.1