soc: sunxi: sram: Export the LDO control register
authorSamuel Holland <samuel@sholland.org>
Mon, 15 Aug 2022 04:12:46 +0000 (23:12 -0500)
committerJernej Skrabec <jernej.skrabec@gmail.com>
Sun, 18 Sep 2022 20:54:32 +0000 (22:54 +0200)
Some newer Allwinner SoCs contain internal LDOs managed by a register in
the system control MMIO space. Export this from the regmap in addtion to
the EMAC register.

Use generic names now that the regmap is no longer EMAC-specific.

Acked-by: Jernej Skrabec <jernej.skrabec@gmail.com>
Signed-off-by: Samuel Holland <samuel@sholland.org>
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
Tested-by: Heiko Stuebner <heiko@sntech.de>
Link: https://lore.kernel.org/r/20220815041248.53268-10-samuel@sholland.org
Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
drivers/soc/sunxi/sunxi_sram.c

index 7c6fb17..7e8dab0 100644 (file)
@@ -283,6 +283,7 @@ EXPORT_SYMBOL(sunxi_sram_release);
 
 struct sunxi_sramc_variant {
        int num_emac_clocks;
+       bool has_ldo_ctrl;
 };
 
 static const struct sunxi_sramc_variant sun4i_a10_sramc_variant = {
@@ -302,25 +303,28 @@ static const struct sunxi_sramc_variant sun50i_h616_sramc_variant = {
 };
 
 #define SUNXI_SRAM_EMAC_CLOCK_REG      0x30
+#define SUNXI_SYS_LDO_CTRL_REG         0x150
+
 static bool sunxi_sram_regmap_accessible_reg(struct device *dev,
                                             unsigned int reg)
 {
        const struct sunxi_sramc_variant *variant = dev_get_drvdata(dev);
 
-       if (reg < SUNXI_SRAM_EMAC_CLOCK_REG)
-               return false;
-       if (reg > SUNXI_SRAM_EMAC_CLOCK_REG + variant->num_emac_clocks * 4)
-               return false;
+       if (reg >= SUNXI_SRAM_EMAC_CLOCK_REG &&
+           reg <  SUNXI_SRAM_EMAC_CLOCK_REG + variant->num_emac_clocks * 4)
+               return true;
+       if (reg == SUNXI_SYS_LDO_CTRL_REG && variant->has_ldo_ctrl)
+               return true;
 
-       return true;
+       return false;
 }
 
-static struct regmap_config sunxi_sram_emac_clock_regmap = {
+static struct regmap_config sunxi_sram_regmap_config = {
        .reg_bits       = 32,
        .val_bits       = 32,
        .reg_stride     = 4,
        /* last defined register */
-       .max_register   = SUNXI_SRAM_EMAC_CLOCK_REG + 4,
+       .max_register   = SUNXI_SYS_LDO_CTRL_REG,
        /* other devices have no business accessing other registers */
        .readable_reg   = sunxi_sram_regmap_accessible_reg,
        .writeable_reg  = sunxi_sram_regmap_accessible_reg,
@@ -328,9 +332,9 @@ static struct regmap_config sunxi_sram_emac_clock_regmap = {
 
 static int __init sunxi_sram_probe(struct platform_device *pdev)
 {
-       struct regmap *emac_clock;
        const struct sunxi_sramc_variant *variant;
        struct device *dev = &pdev->dev;
+       struct regmap *regmap;
 
        sram_dev = &pdev->dev;
 
@@ -344,12 +348,10 @@ static int __init sunxi_sram_probe(struct platform_device *pdev)
        if (IS_ERR(base))
                return PTR_ERR(base);
 
-       if (variant->num_emac_clocks > 0) {
-               emac_clock = devm_regmap_init_mmio(&pdev->dev, base,
-                                                  &sunxi_sram_emac_clock_regmap);
-
-               if (IS_ERR(emac_clock))
-                       return PTR_ERR(emac_clock);
+       if (variant->num_emac_clocks || variant->has_ldo_ctrl) {
+               regmap = devm_regmap_init_mmio(dev, base, &sunxi_sram_regmap_config);
+               if (IS_ERR(regmap))
+                       return PTR_ERR(regmap);
        }
 
        of_platform_populate(dev->of_node, NULL, NULL, dev);