From nobody Wed Dec 17 12:04:50 2025 Received: from mail-wr1-f51.google.com (mail-wr1-f51.google.com [209.85.221.51]) (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 1CDCA36B060 for ; Tue, 11 Nov 2025 15:56:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762876595; cv=none; b=DcwfdcJDVYz7hFqayyuljnQG8Jk57O2iDnzD4DrlGMt98j7li/SioL1E5OlsizgYXpWg36emG+1mXarCCD3QxjvBX/dL4/9T3bSJh5RmXtxxODr06hP6xTXRsNjn3Alamdo4Z3lXrT8Ne5QMfNMz81ixLeRcEofs6D9RCeyiY3M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762876595; c=relaxed/simple; bh=0uIR8Qg8yt3OmnrdjUH1eJLhte55yFIneXSQYFVOiCY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ILObYI+yMAbx7/tEfiDYUqJ+doTimhjZ6iBC5CCI06reg3kxlHWhMRlB2b0A7hVq18oA9J5HZh0DriWnj5vr1YEm5osaBc/fWtXZ36bW8NtN9grWkVAHija9FGJtCAlK/sNVOmhWUjnTSRz1XBg2WY2ntUVPNq8tKmj/jPCHR3g= 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=EKP82GkX; arc=none smtp.client-ip=209.85.221.51 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="EKP82GkX" Received: by mail-wr1-f51.google.com with SMTP id ffacd0b85a97d-42b3b0d76fcso1403270f8f.3 for ; Tue, 11 Nov 2025 07:56:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762876591; x=1763481391; 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=EKP82GkXTbZwWCV/rHmG48pevIc5d0G+zmFArx7n+FTUuBciOA8nPVGe+GT4Y3H/RB /t+m7ri11+4B077LABWvMpXifLP0GvfwMuk0fcQAvAoy2v9JT6aiKGTt4v14/nTgEgD4 x40u6m5etb/Yk+fC1b4gWTbkvRlHgWWona+0tuvVff52G/r+ynniPb2+iRpQ7XjCeuYL mjPzXQy0WXGU6Es/XmC0P41NzspevHMGnCFE2GY4qF3J3LgmeYa9gWRhaaZEXoSeEMNE Vnfkj/52WWnCPsBmhG7OWER3mZF4ht9Sa85175pXBEhB47DVv4bX68Z3KIXx7SA40vbE 3QYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762876591; x=1763481391; 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=InSmCNGAU/L8t/1Gj+35ue9r+IStQI7XKmhun64uyn7J22svCMqCLznzM4eCTs3Hz7 PqXNkyeA3cjKArg61czeKa+lvwAXz3X+aTBmEUGOlpv1Ao2k85oZbO7eIL4FD7w0aH8o xZ07Wsx+SY9PaqCM/3kBVbepL5hkeT0EDYb3g7b9PBZgjd2OjiJPME7gmlqANAPaCL7p rFcXMitQBl6YyQ7itL7gqxEQozo6tHy/naUi/D/KFdzUUzVAeVgAhH4rD+YVeHdB2OEG KpNYjr+tw62hOcSdq5svHR/ASsirYoGUH8QZVBzZY/2VSnAAwR6ym9WyNx6oirp5+4ak Cwjw== X-Forwarded-Encrypted: i=1; AJvYcCU2x7toHRJ5WlQ3I7yAMWi4MacOIFdzV04mY3rQU1Asm8+6EVYDPKB1tFYUkbh8YLU3WV6sgqEOpEphnws=@vger.kernel.org X-Gm-Message-State: AOJu0YyB/8M+3Ugm7V1/ancjmX5/geSgqT5jWTNQtTeNeTgzeb1b50+H e8oaii4KJXc83ky9XVd77IijrZZOe0n8ESeY4s7Woa8+2B6ni89IdJ36 X-Gm-Gg: ASbGncukqjoeLRWz5tQUriycxgM+m3tK5rGKaqTij0ssKv06MKPq8ynGRqanQFymJDr YgKIR/k9aMCcWeuyZ9Qrpj1R23zzu2YlIU3rYB0uDLpHboN5b5xYUwjA2PJtOSSA3npeqmSeopA jcpoCR1Od/GVez3lB23yv3RDXUCRXrgs4luXa+sxcQM44yVi99IqDtsscWmGoDWbI96qLHuWUBg DBQnPSczISoxCFqPplCJ86OqBU4bmnhs9bI7xsVmQ+mKbLfXbLyoK1xmVfyjlKXZnr2voFE44wN 14OLAluOuq0SCovW3R6rCzCh8Q2QtJaRn1b0G3NPOBebvQWC7IP6R7nHueKLJ9vr+lEwBTDnz/U uDV0+d0IiDvMM5sNKvNyoEQAKISapi7+naWN2UR2OlmmbYiBNEEOuEITmfaLZDDPUsChoHb80vO 2XT8mU+ReBHhHxyQoOHKsedurkO6F+vH4zRoBAQhXW X-Google-Smtp-Source: AGHT+IHPgPMcB7v6a4L7yptAsuJpFLsTU4O6Av6t6XnKpwFFXbhHQkv8GRIFMxbCrfV9lZZtByQ1mA== X-Received: by 2002:a05:6000:4024:b0:42b:3ab7:b8a8 with SMTP id ffacd0b85a97d-42b3ab7bb63mr7741899f8f.17.1762876591357; Tue, 11 Nov 2025 07:56:31 -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-42abe63e13csm28676766f8f.19.2025.11.11.07.56.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Nov 2025 07:56:30 -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 v4 1/5] clk: en7523: convert driver to regmap API Date: Tue, 11 Nov 2025 16:56:17 +0100 Message-ID: <20251111155623.9024-2-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251111155623.9024-1-ansuelsmth@gmail.com> References: <20251111155623.9024-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