From nobody Fri Dec 19 20:54:23 2025 Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6EE552DE1E6 for ; Thu, 6 Nov 2025 19:59:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762459187; cv=none; b=f6X0dbJqoXHciZXXBNn+kbdgTopAzTzTos85AuWDm3U5lKZlZ/HJdwF83AB+KoQ7M6sHFenr0yxtC2hGlFKWSUXG73aYkvy4fc1rGA/1T5fM8CPQDxLzZnlFb3pWj2ZSI4BNvtrxt+TtthOvIKKA4gZYbJPgU9g2XpxyPvv8nrs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762459187; c=relaxed/simple; bh=0uIR8Qg8yt3OmnrdjUH1eJLhte55yFIneXSQYFVOiCY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gdDeKzzzubYeVPqsF/P24xITv+GKz96isNReko+hcgfNgJZooSjpMA9fSaO3d6F5HLH+edwpo5LEpEWTOUxbwPkI9c79K+4UoC8T7nuoAHxraB+pNsSd27eB4MHixmdL846Mz4/yA31PZTRfsp1OvCuy0oKR7YTUCpIYxC2YNa0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=JHCDdm+V; arc=none smtp.client-ip=209.85.221.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="JHCDdm+V" Received: by mail-wr1-f41.google.com with SMTP id ffacd0b85a97d-429c7869704so5716f8f.2 for ; Thu, 06 Nov 2025 11:59:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762459184; x=1763063984; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=q/ctzYR0cJkPKD2JP2ySHJQqhhHfUgTf2W4E572ADBk=; b=JHCDdm+VaiftJZM7n18t+x4WQtVK6ko/if31MhJUeDylwpBq3XyfTR955vhW4mU6Hk oowLEM/QwI4pTAwBvJWOHtjZEPMf/fg/94JX37uHBexYleIyskAMfQ4yiSGf+RjGkusY DQNWCQ7AI8mD1M+eskUhsNkA5slt4hhOhUkg8DI0n7djSMUT+ghN5ZfNBN/7AQuZxApH HBhXdrArXdbhTVA6sDiA8CbF9bJiYVMqSIPwg1sgjpMM9nmycKnKdBjlAPMi0BVycqb2 oqMEAYVfdEwKqWetEXZrJopiQnC+uQkmYICptjuVOf21gHfCBOTaPWtfgZUdGPJzk4wS 9UjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762459184; x=1763063984; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=q/ctzYR0cJkPKD2JP2ySHJQqhhHfUgTf2W4E572ADBk=; b=qaqgWre8z9cai1uks9dkSrtlv2brr25BOyR6C8wvvWRi7UiSSqxBiSAvYbhQo5Ekid zuMEAwWZ0dBAnqPy+mtj08nzgZRDHaqbtCefptV8dPfQvb6/KlEc9juraYDUOjiMQqxP nDblOKD3RWlsjvTTA5mrzrbCsMZrdgF0UEmvQTur/3N9Fsw+uWkjGJLSKKjjizCvpJnz sTCUagdaCE9LWIJzn0+pI80FuEf8ywyfPr8NBtjTBFUciU5WrsGFCLn/jigBqKDb032h NVBZm7++1H9vK85ghE9izis3j9Dk33F3f8BECmTPyI5CrpHQbKPNhoRR9cV9USyVIzoz I5dg== X-Forwarded-Encrypted: i=1; AJvYcCWPC3qVu1kE05pZDs7vYcKCt6V4LGs7oWyqUhsJVeTA+1x3wbSeLJK8qyhT3QwpMIOTOliBw6XVInvobiI=@vger.kernel.org X-Gm-Message-State: AOJu0YysJusKycMKDeTXNaOiWCgendhxLjf2R5aUHPxFIrEZnBn7gCat eL9gzqWjq3Yu/yqbaGuYlZLEvvSG+44LKLXvwMLQOr9hlr6KDLn3iS+v X-Gm-Gg: ASbGncsCY6+GAYb8OjQGnGgkBLL05sPaEhuuEIlAdZo10WWLxEdcfGeCY3NgabdkOOf TQwMO1P0yNN+149n7YjDrtkjf+TvgrnbsUztOnlKmHzhBYteoVmJdedPADEdXMoKqP0TC405D4g UWG4I7oPC8xawmvTyi0bWTSPOX9fJ29blwwsY/NVwz35s570D/gXCgbNBOKDWQE6wmh0eWlAZpb wLuzmSPsHnFkm9LRT457LUoZfvxpLBy8G1qpJC2AGIi38vwjOWg+CFT754Bp9mtUf9w1dY4vw/j V7037MEQGSjPkrNsgvFO3NULiHdEHOFJuodl2lKWSeQL0XlrGUjGedkGjV9Nc7on4ttZk9zqrS3 uCyhqVGfHhPmrhTfPVKKD/4rv5ELMXE+uHcy9qMImLexqCs8W6bamyZcDno4oDDdCy2RKqCVpOe M5gyg0G7HG5gt+V7eYyEdFVhe3pMX2/w== X-Google-Smtp-Source: AGHT+IGQDx7RvvjrjkDSZGpRYT8YPQC4M9SiZCedTbsw4bmTNh1TUkV57bJnfaRioQ2iiFwpXZh41w== X-Received: by 2002:a05:6000:2dc3:b0:429:d3e9:667 with SMTP id ffacd0b85a97d-42ae588195emr365883f8f.18.1762459183629; Thu, 06 Nov 2025 11:59:43 -0800 (PST) Received: from Ansuel-XPS24 (93-34-90-37.ip49.fastwebnet.it. [93.34.90.37]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-42abe62bfa0sm990037f8f.5.2025.11.06.11.59.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Nov 2025 11:59:42 -0800 (PST) From: Christian Marangi To: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Philipp Zabel , Felix Fietkau , linux-clk@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Christian Marangi Subject: [PATCH v3 1/5] clk: en7523: convert driver to regmap API Date: Thu, 6 Nov 2025 20:59:28 +0100 Message-ID: <20251106195935.1767696-2-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251106195935.1767696-1-ansuelsmth@gmail.com> References: <20251106195935.1767696-1-ansuelsmth@gmail.com> 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 Content-Type: text/plain; charset="utf-8" Convert driver to regmap API, in preparation for support of Airoha AN7523 as the SCU will be an MFD and the regmap will be provided in the parent node. Signed-off-by: Christian Marangi --- drivers/clk/clk-en7523.c | 137 ++++++++++++++++++++++----------------- 1 file changed, 76 insertions(+), 61 deletions(-) diff --git a/drivers/clk/clk-en7523.c b/drivers/clk/clk-en7523.c index 15bbdeb60b8e..314e7450313f 100644 --- a/drivers/clk/clk-en7523.c +++ b/drivers/clk/clk-en7523.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only =20 +#include #include #include #include @@ -34,6 +35,7 @@ #define REG_RESET_CONTROL_PCIE2 BIT(26) /* EN7581 */ #define REG_NP_SCU_PCIC 0x88 +#define REG_PCIE_CTRL GENMASK(7, 0) #define REG_NP_SCU_SSTR 0x9c #define REG_PCIE_XSI0_SEL_MASK GENMASK(14, 13) #define REG_PCIE_XSI1_SEL_MASK GENMASK(12, 11) @@ -63,14 +65,14 @@ struct en_clk_desc { }; =20 struct en_clk_gate { - void __iomem *base; + struct regmap *map; struct clk_hw hw; }; =20 struct en_rst_data { const u16 *bank_ofs; const u16 *idx_map; - void __iomem *base; + struct regmap *map; struct reset_controller_dev rcdev; }; =20 @@ -388,44 +390,44 @@ static u32 en7523_get_div(const struct en_clk_desc *d= esc, u32 val) static int en7523_pci_is_enabled(struct clk_hw *hw) { struct en_clk_gate *cg =3D container_of(hw, struct en_clk_gate, hw); + u32 val; =20 - return !!(readl(cg->base + REG_PCI_CONTROL) & REG_PCI_CONTROL_REFCLK_EN1); + regmap_read(cg->map, REG_PCI_CONTROL, &val); + return !!(val & REG_PCI_CONTROL_REFCLK_EN1); } =20 static int en7523_pci_prepare(struct clk_hw *hw) { struct en_clk_gate *cg =3D container_of(hw, struct en_clk_gate, hw); - void __iomem *np_base =3D cg->base; - u32 val, mask; + struct regmap *map =3D cg->map; + u32 mask; =20 /* Need to pull device low before reset */ - val =3D readl(np_base + REG_PCI_CONTROL); - val &=3D ~(REG_PCI_CONTROL_PERSTOUT1 | REG_PCI_CONTROL_PERSTOUT); - writel(val, np_base + REG_PCI_CONTROL); + regmap_clear_bits(map, REG_PCI_CONTROL, + REG_PCI_CONTROL_PERSTOUT1 | + REG_PCI_CONTROL_PERSTOUT); usleep_range(1000, 2000); =20 /* Enable PCIe port 1 */ - val |=3D REG_PCI_CONTROL_REFCLK_EN1; - writel(val, np_base + REG_PCI_CONTROL); + regmap_set_bits(map, REG_PCI_CONTROL, + REG_PCI_CONTROL_REFCLK_EN1); usleep_range(1000, 2000); =20 /* Reset to default */ - val =3D readl(np_base + REG_RESET_CONTROL1); mask =3D REG_RESET_CONTROL_PCIE1 | REG_RESET_CONTROL_PCIE2 | REG_RESET_CONTROL_PCIEHB; - writel(val & ~mask, np_base + REG_RESET_CONTROL1); + regmap_clear_bits(map, REG_RESET_CONTROL1, mask); usleep_range(1000, 2000); - writel(val | mask, np_base + REG_RESET_CONTROL1); + regmap_set_bits(map, REG_RESET_CONTROL1, mask); msleep(100); - writel(val & ~mask, np_base + REG_RESET_CONTROL1); + regmap_clear_bits(map, REG_RESET_CONTROL1, mask); usleep_range(5000, 10000); =20 /* Release device */ mask =3D REG_PCI_CONTROL_PERSTOUT1 | REG_PCI_CONTROL_PERSTOUT; - val =3D readl(np_base + REG_PCI_CONTROL); - writel(val & ~mask, np_base + REG_PCI_CONTROL); + regmap_clear_bits(map, REG_PCI_CONTROL, mask); usleep_range(1000, 2000); - writel(val | mask, np_base + REG_PCI_CONTROL); + regmap_set_bits(map, REG_PCI_CONTROL, mask); msleep(250); =20 return 0; @@ -434,16 +436,13 @@ static int en7523_pci_prepare(struct clk_hw *hw) static void en7523_pci_unprepare(struct clk_hw *hw) { struct en_clk_gate *cg =3D container_of(hw, struct en_clk_gate, hw); - void __iomem *np_base =3D cg->base; - u32 val; + struct regmap *map =3D cg->map; =20 - val =3D readl(np_base + REG_PCI_CONTROL); - val &=3D ~REG_PCI_CONTROL_REFCLK_EN1; - writel(val, np_base + REG_PCI_CONTROL); + regmap_clear_bits(map, REG_PCI_CONTROL, REG_PCI_CONTROL_REFCLK_EN1); } =20 static struct clk_hw *en7523_register_pcie_clk(struct device *dev, - void __iomem *np_base) + struct regmap *clk_map) { const struct en_clk_soc_data *soc_data =3D device_get_match_data(dev); struct clk_init_data init =3D { @@ -456,7 +455,7 @@ static struct clk_hw *en7523_register_pcie_clk(struct d= evice *dev, if (!cg) return NULL; =20 - cg->base =3D np_base; + cg->map =3D clk_map; cg->hw.init =3D &init; =20 if (init.ops->unprepare) @@ -474,21 +473,20 @@ static int en7581_pci_is_enabled(struct clk_hw *hw) u32 val, mask; =20 mask =3D REG_PCI_CONTROL_REFCLK_EN0 | REG_PCI_CONTROL_REFCLK_EN1; - val =3D readl(cg->base + REG_PCI_CONTROL); + regmap_read(cg->map, REG_PCI_CONTROL, &val); return (val & mask) =3D=3D mask; } =20 static int en7581_pci_enable(struct clk_hw *hw) { struct en_clk_gate *cg =3D container_of(hw, struct en_clk_gate, hw); - void __iomem *np_base =3D cg->base; - u32 val, mask; + struct regmap *map =3D cg->map; + u32 mask; =20 mask =3D REG_PCI_CONTROL_REFCLK_EN0 | REG_PCI_CONTROL_REFCLK_EN1 | REG_PCI_CONTROL_PERSTOUT1 | REG_PCI_CONTROL_PERSTOUT2 | REG_PCI_CONTROL_PERSTOUT; - val =3D readl(np_base + REG_PCI_CONTROL); - writel(val | mask, np_base + REG_PCI_CONTROL); + regmap_set_bits(map, REG_PCI_CONTROL, mask); =20 return 0; } @@ -496,19 +494,18 @@ static int en7581_pci_enable(struct clk_hw *hw) static void en7581_pci_disable(struct clk_hw *hw) { struct en_clk_gate *cg =3D container_of(hw, struct en_clk_gate, hw); - void __iomem *np_base =3D cg->base; - u32 val, mask; + struct regmap *map =3D cg->map; + u32 mask; =20 mask =3D REG_PCI_CONTROL_REFCLK_EN0 | REG_PCI_CONTROL_REFCLK_EN1 | REG_PCI_CONTROL_PERSTOUT1 | REG_PCI_CONTROL_PERSTOUT2 | REG_PCI_CONTROL_PERSTOUT; - val =3D readl(np_base + REG_PCI_CONTROL); - writel(val & ~mask, np_base + REG_PCI_CONTROL); + regmap_clear_bits(map, REG_PCI_CONTROL, mask); usleep_range(1000, 2000); } =20 static void en7523_register_clocks(struct device *dev, struct clk_hw_onece= ll_data *clk_data, - void __iomem *base, void __iomem *np_base) + struct regmap *map, struct regmap *clk_map) { struct clk_hw *hw; u32 rate; @@ -517,10 +514,12 @@ static void en7523_register_clocks(struct device *dev= , struct clk_hw_onecell_dat for (i =3D 0; i < ARRAY_SIZE(en7523_base_clks); i++) { const struct en_clk_desc *desc =3D &en7523_base_clks[i]; u32 reg =3D desc->div_reg ? desc->div_reg : desc->base_reg; - u32 val =3D readl(base + desc->base_reg); + u32 val; + + regmap_read(map, desc->base_reg, &val); =20 rate =3D en7523_get_base_rate(desc, val); - val =3D readl(base + reg); + regmap_read(map, reg, &val); rate /=3D en7523_get_div(desc, val); =20 hw =3D clk_hw_register_fixed_rate(dev, desc->name, NULL, 0, rate); @@ -533,30 +532,47 @@ static void en7523_register_clocks(struct device *dev= , struct clk_hw_onecell_dat clk_data->hws[desc->id] =3D hw; } =20 - hw =3D en7523_register_pcie_clk(dev, np_base); + hw =3D en7523_register_pcie_clk(dev, clk_map); clk_data->hws[EN7523_CLK_PCIE] =3D hw; } =20 +static const struct regmap_config en7523_clk_regmap_config =3D { + .reg_bits =3D 32, + .val_bits =3D 32, + .reg_stride =3D 4, +}; + static int en7523_clk_hw_init(struct platform_device *pdev, struct clk_hw_onecell_data *clk_data) { void __iomem *base, *np_base; + struct regmap *map, *clk_map; =20 base =3D devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(base)) return PTR_ERR(base); =20 + map =3D devm_regmap_init_mmio(&pdev->dev, base, + &en7523_clk_regmap_config); + if (IS_ERR(map)) + return PTR_ERR(map); + np_base =3D devm_platform_ioremap_resource(pdev, 1); if (IS_ERR(np_base)) return PTR_ERR(np_base); =20 - en7523_register_clocks(&pdev->dev, clk_data, base, np_base); + clk_map =3D devm_regmap_init_mmio(&pdev->dev, np_base, + &en7523_clk_regmap_config); + if (IS_ERR(clk_map)) + return PTR_ERR(clk_map); + + en7523_register_clocks(&pdev->dev, clk_data, map, clk_map); =20 return 0; } =20 static void en7581_register_clocks(struct device *dev, struct clk_hw_onece= ll_data *clk_data, - struct regmap *map, void __iomem *base) + struct regmap *map, struct regmap *clk_map) { struct clk_hw *hw; u32 rate; @@ -593,7 +609,7 @@ static void en7581_register_clocks(struct device *dev, = struct clk_hw_onecell_dat clk_data->hws[desc->id] =3D hw; } =20 - hw =3D en7523_register_pcie_clk(dev, base); + hw =3D en7523_register_pcie_clk(dev, clk_map); clk_data->hws[EN7523_CLK_PCIE] =3D hw; } =20 @@ -601,15 +617,10 @@ static int en7523_reset_update(struct reset_controlle= r_dev *rcdev, unsigned long id, bool assert) { struct en_rst_data *rst_data =3D container_of(rcdev, struct en_rst_data, = rcdev); - void __iomem *addr =3D rst_data->base + rst_data->bank_ofs[id / RST_NR_PE= R_BANK]; - u32 val; + u32 addr =3D rst_data->bank_ofs[id / RST_NR_PER_BANK]; =20 - val =3D readl(addr); - if (assert) - val |=3D BIT(id % RST_NR_PER_BANK); - else - val &=3D ~BIT(id % RST_NR_PER_BANK); - writel(val, addr); + regmap_update_bits(rst_data->map, addr, BIT(id % RST_NR_PER_BANK), + assert ? BIT(id % RST_NR_PER_BANK) : 0); =20 return 0; } @@ -630,9 +641,11 @@ static int en7523_reset_status(struct reset_controller= _dev *rcdev, unsigned long id) { struct en_rst_data *rst_data =3D container_of(rcdev, struct en_rst_data, = rcdev); - void __iomem *addr =3D rst_data->base + rst_data->bank_ofs[id / RST_NR_PE= R_BANK]; + u32 addr =3D rst_data->bank_ofs[id / RST_NR_PER_BANK]; + u32 val; =20 - return !!(readl(addr) & BIT(id % RST_NR_PER_BANK)); + regmap_read(rst_data->map, addr, &val); + return !!(val & BIT(id % RST_NR_PER_BANK)); } =20 static int en7523_reset_xlate(struct reset_controller_dev *rcdev, @@ -652,7 +665,7 @@ static const struct reset_control_ops en7581_reset_ops = =3D { .status =3D en7523_reset_status, }; =20 -static int en7581_reset_register(struct device *dev, void __iomem *base) +static int en7581_reset_register(struct device *dev, struct regmap *map) { struct en_rst_data *rst_data; =20 @@ -662,7 +675,7 @@ static int en7581_reset_register(struct device *dev, vo= id __iomem *base) =20 rst_data->bank_ofs =3D en7581_rst_ofs; rst_data->idx_map =3D en7581_rst_map; - rst_data->base =3D base; + rst_data->map =3D map; =20 rst_data->rcdev.nr_resets =3D ARRAY_SIZE(en7581_rst_map); rst_data->rcdev.of_xlate =3D en7523_reset_xlate; @@ -678,9 +691,8 @@ static int en7581_reset_register(struct device *dev, vo= id __iomem *base) static int en7581_clk_hw_init(struct platform_device *pdev, struct clk_hw_onecell_data *clk_data) { - struct regmap *map; + struct regmap *map, *clk_map; void __iomem *base; - u32 val; =20 map =3D syscon_regmap_lookup_by_compatible("airoha,en7581-chip-scu"); if (IS_ERR(map)) @@ -690,15 +702,18 @@ static int en7581_clk_hw_init(struct platform_device = *pdev, if (IS_ERR(base)) return PTR_ERR(base); =20 - en7581_register_clocks(&pdev->dev, clk_data, map, base); + clk_map =3D devm_regmap_init_mmio(&pdev->dev, base, &en7523_clk_regmap_co= nfig); + if (IS_ERR(clk_map)) + return PTR_ERR(clk_map); + + en7581_register_clocks(&pdev->dev, clk_data, map, clk_map); =20 - val =3D readl(base + REG_NP_SCU_SSTR); - val &=3D ~(REG_PCIE_XSI0_SEL_MASK | REG_PCIE_XSI1_SEL_MASK); - writel(val, base + REG_NP_SCU_SSTR); - val =3D readl(base + REG_NP_SCU_PCIC); - writel(val | 3, base + REG_NP_SCU_PCIC); + regmap_clear_bits(clk_map, REG_NP_SCU_SSTR, + REG_PCIE_XSI0_SEL_MASK | REG_PCIE_XSI1_SEL_MASK); + regmap_update_bits(clk_map, REG_NP_SCU_PCIC, REG_PCIE_CTRL, + FIELD_PREP(REG_PCIE_CTRL, 3)); =20 - return en7581_reset_register(&pdev->dev, base); + return en7581_reset_register(&pdev->dev, clk_map); } =20 static int en7523_clk_probe(struct platform_device *pdev) --=20 2.51.0