From nobody Fri Dec 19 11:30:59 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 16C43134CF; Tue, 15 Apr 2025 02:45:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744685158; cv=none; b=XzLs5jmIaMy3aG/4KZSrzomqcL/sy5c3O41b5StPljgElnG3dpftflpuLnXswe5rHohqNI4StUWrua1f/LAEcqndDG6XqggV4RFA9Jsa8KhOhk1FGf9ab+UgQ9UIfZDrDX2NibadB5uzR9/qcGD7Ga+mJ/AzmsZZBbTL34KZBiA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744685158; c=relaxed/simple; bh=2x91J5sem5IP8gA0gECFNvOpz83ewu5oEZzUTMSLuJ4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=snM0IAdlWYilAriSZ3ctc1sqJgm0LfU1ATPhfxmeu5KUW0/XkRkrXkejelFaNdeKwFU7mV2mESG8witIUyO0QLm4Dl24yMXvFBZYmxijw5bPRy1X+7SgypEVQtHyZNpAoa/UPvvBgC5pf9yUurGD4hgwe4CWV1+XjbXka8K8+Tw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=O9lkO4am; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="O9lkO4am" Received: by smtp.kernel.org (Postfix) with ESMTPS id C8BD8C4CEEC; Tue, 15 Apr 2025 02:45:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1744685157; bh=2x91J5sem5IP8gA0gECFNvOpz83ewu5oEZzUTMSLuJ4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=O9lkO4ame3P0xGx9j6/HBR1vb2zUOAxfcz11sefe7z/DcwyPZWyuOUc/3TZcfy28Q OYWBwCkWTKLQ74qmRcrO4Nq+PPXthuSyMTfJwaaj/Qs837P86ifJs44CmdsX4zzTDY WndRi3uauNX27N6ATR75t32Iz/rFYSg6kDMUeDZUZtpbz8/Ib7lCYoh9jnCnaX0Iwg Qvhn7oQhuIYwKM8+CGlxXV0Kgsg6+j57V3mUHwpTjjtw+XlIwJvPAtTBc/EUnxsTTy 2cMP3lmaMZ1kmySvKMdFJgHG5o/6egt2qUd6Njehr8WeG+xBn79taBJ36Ei0LsJ65x memFgHuO5gkOQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id B29B6C369B8; Tue, 15 Apr 2025 02:45:57 +0000 (UTC) From: Chuan Liu via B4 Relay Date: Tue, 15 Apr 2025 10:45:24 +0800 Subject: [PATCH v3 1/7] soc: amlogic: clk-measure: Define MSR_CLK's register offset separately Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250415-clk-measure-v3-1-9b8551dd33b4@amlogic.com> References: <20250415-clk-measure-v3-0-9b8551dd33b4@amlogic.com> In-Reply-To: <20250415-clk-measure-v3-0-9b8551dd33b4@amlogic.com> To: Neil Armstrong , Kevin Hilman , Jerome Brunet , Martin Blumenstingl , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: linux-arm-kernel@lists.infradead.org, linux-amlogic@lists.infradead.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Chuan Liu X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1744685155; l=5875; i=chuan.liu@amlogic.com; s=20240902; h=from:subject:message-id; bh=0guFezE8LgXk4zTIDey8n/7AjPQ9HaO6/P9CKzBKwgU=; b=LH0Wu2xuiibSPuT7Nk/mM9O+YUHq27jKVIacku7LUFDJOsShPXDqWbYF+YqTgLXQF09mTRSp0 QVupv191xPtCMG6JrwE29U4gOyvElxjCwGFXDU3ocI5eyZ09thS93vY X-Developer-Key: i=chuan.liu@amlogic.com; a=ed25519; pk=fnKDB+81SoWGKW2GJNFkKy/ULvsDmJZRGBE7pR5Xcpo= X-Endpoint-Received: by B4 Relay for chuan.liu@amlogic.com/20240902 with auth_id=203 X-Original-From: Chuan Liu Reply-To: chuan.liu@amlogic.com From: Chuan Liu Since the MSR_CLK register offset differs between chip variants, we replace the macro-based definition with chip-specific assignments. Change the max_register in regmap_config to be retrieved from DTS. Reviewed-by: Neil Armstrong Signed-off-by: Chuan Liu --- drivers/soc/amlogic/meson-clk-measure.c | 55 ++++++++++++++++++++++++-----= ---- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/drivers/soc/amlogic/meson-clk-measure.c b/drivers/soc/amlogic/= meson-clk-measure.c index 39638d6a593c..3594ef5b7ff0 100644 --- a/drivers/soc/amlogic/meson-clk-measure.c +++ b/drivers/soc/amlogic/meson-clk-measure.c @@ -14,11 +14,6 @@ =20 static DEFINE_MUTEX(measure_lock); =20 -#define MSR_CLK_DUTY 0x0 -#define MSR_CLK_REG0 0x4 -#define MSR_CLK_REG1 0x8 -#define MSR_CLK_REG2 0xc - #define MSR_DURATION GENMASK(15, 0) #define MSR_ENABLE BIT(16) #define MSR_CONT BIT(17) /* continuous measurement */ @@ -39,9 +34,17 @@ struct meson_msr_id { const char *name; }; =20 +struct msr_reg_offset { + unsigned int duty_val; + unsigned int freq_ctrl; + unsigned int duty_ctrl; + unsigned int freq_val; +}; + struct meson_msr_data { struct meson_msr_id *msr_table; unsigned int msr_count; + const struct msr_reg_offset *reg; }; =20 struct meson_msr { @@ -495,6 +498,7 @@ static int meson_measure_id(struct meson_msr_id *clk_ms= r_id, unsigned int duration) { struct meson_msr *priv =3D clk_msr_id->priv; + const struct msr_reg_offset *reg =3D priv->data.reg; unsigned int val; int ret; =20 @@ -502,22 +506,22 @@ static int meson_measure_id(struct meson_msr_id *clk_= msr_id, if (ret) return ret; =20 - regmap_write(priv->regmap, MSR_CLK_REG0, 0); + regmap_write(priv->regmap, reg->freq_ctrl, 0); =20 /* Set measurement duration */ - regmap_update_bits(priv->regmap, MSR_CLK_REG0, MSR_DURATION, + regmap_update_bits(priv->regmap, reg->freq_ctrl, MSR_DURATION, FIELD_PREP(MSR_DURATION, duration - 1)); =20 /* Set ID */ - regmap_update_bits(priv->regmap, MSR_CLK_REG0, MSR_CLK_SRC, + regmap_update_bits(priv->regmap, reg->freq_ctrl, MSR_CLK_SRC, FIELD_PREP(MSR_CLK_SRC, clk_msr_id->id)); =20 /* Enable & Start */ - regmap_update_bits(priv->regmap, MSR_CLK_REG0, + regmap_update_bits(priv->regmap, reg->freq_ctrl, MSR_RUN | MSR_ENABLE, MSR_RUN | MSR_ENABLE); =20 - ret =3D regmap_read_poll_timeout(priv->regmap, MSR_CLK_REG0, + ret =3D regmap_read_poll_timeout(priv->regmap, reg->freq_ctrl, val, !(val & MSR_BUSY), 10, 10000); if (ret) { mutex_unlock(&measure_lock); @@ -525,10 +529,10 @@ static int meson_measure_id(struct meson_msr_id *clk_= msr_id, } =20 /* Disable */ - regmap_update_bits(priv->regmap, MSR_CLK_REG0, MSR_ENABLE, 0); + regmap_update_bits(priv->regmap, reg->freq_ctrl, MSR_ENABLE, 0); =20 /* Get the value in multiple of gate time counts */ - regmap_read(priv->regmap, MSR_CLK_REG2, &val); + regmap_read(priv->regmap, reg->freq_val, &val); =20 mutex_unlock(&measure_lock); =20 @@ -599,11 +603,10 @@ static int clk_msr_summary_show(struct seq_file *s, v= oid *data) } DEFINE_SHOW_ATTRIBUTE(clk_msr_summary); =20 -static const struct regmap_config meson_clk_msr_regmap_config =3D { +static struct regmap_config meson_clk_msr_regmap_config =3D { .reg_bits =3D 32, .val_bits =3D 32, .reg_stride =3D 4, - .max_register =3D MSR_CLK_REG2, }; =20 static int meson_msr_probe(struct platform_device *pdev) @@ -611,6 +614,7 @@ static int meson_msr_probe(struct platform_device *pdev) const struct meson_msr_data *match_data; struct meson_msr *priv; struct dentry *root, *clks; + struct resource *res; void __iomem *base; int i; =20 @@ -636,15 +640,24 @@ static int meson_msr_probe(struct platform_device *pd= ev) match_data->msr_count * sizeof(struct meson_msr_id)); priv->data.msr_count =3D match_data->msr_count; =20 - base =3D devm_platform_ioremap_resource(pdev, 0); + base =3D devm_platform_get_and_ioremap_resource(pdev, 0, &res); if (IS_ERR(base)) return PTR_ERR(base); =20 + meson_clk_msr_regmap_config.max_register =3D resource_size(res) - 4; priv->regmap =3D devm_regmap_init_mmio(&pdev->dev, base, &meson_clk_msr_regmap_config); if (IS_ERR(priv->regmap)) return PTR_ERR(priv->regmap); =20 + priv->data.reg =3D devm_kzalloc(&pdev->dev, sizeof(struct msr_reg_offset), + GFP_KERNEL); + if (!priv->data.reg) + return -ENOMEM; + + memcpy((void *)priv->data.reg, match_data->reg, + sizeof(struct msr_reg_offset)); + root =3D debugfs_create_dir("meson-clk-msr", NULL); clks =3D debugfs_create_dir("clks", root); =20 @@ -664,29 +677,41 @@ static int meson_msr_probe(struct platform_device *pd= ev) return 0; } =20 +static const struct msr_reg_offset msr_reg_offset =3D { + .duty_val =3D 0x0, + .freq_ctrl =3D 0x4, + .duty_ctrl =3D 0x8, + .freq_val =3D 0xc, +}; + static const struct meson_msr_data clk_msr_gx_data =3D { .msr_table =3D (void *)clk_msr_gx, .msr_count =3D ARRAY_SIZE(clk_msr_gx), + .reg =3D &msr_reg_offset, }; =20 static const struct meson_msr_data clk_msr_m8_data =3D { .msr_table =3D (void *)clk_msr_m8, .msr_count =3D ARRAY_SIZE(clk_msr_m8), + .reg =3D &msr_reg_offset, }; =20 static const struct meson_msr_data clk_msr_axg_data =3D { .msr_table =3D (void *)clk_msr_axg, .msr_count =3D ARRAY_SIZE(clk_msr_axg), + .reg =3D &msr_reg_offset, }; =20 static const struct meson_msr_data clk_msr_g12a_data =3D { .msr_table =3D (void *)clk_msr_g12a, .msr_count =3D ARRAY_SIZE(clk_msr_g12a), + .reg =3D &msr_reg_offset, }; =20 static const struct meson_msr_data clk_msr_sm1_data =3D { .msr_table =3D (void *)clk_msr_sm1, .msr_count =3D ARRAY_SIZE(clk_msr_sm1), + .reg =3D &msr_reg_offset, }; =20 static const struct of_device_id meson_msr_match_table[] =3D { --=20 2.42.0