Commit dd2ae2ec authored by Samuel Holland's avatar Samuel Holland Committed by Jernej Skrabec

soc: sunxi: sram: Export the LDO control register

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: default avatarJernej Skrabec <jernej.skrabec@gmail.com>
Signed-off-by: default avatarSamuel Holland <samuel@sholland.org>
Reviewed-by: default avatarHeiko Stuebner <heiko@sntech.de>
Tested-by: default avatarHeiko Stuebner <heiko@sntech.de>
Link: https://lore.kernel.org/r/20220815041248.53268-10-samuel@sholland.orgSigned-off-by: default avatarJernej Skrabec <jernej.skrabec@gmail.com>
parent ee07b905
...@@ -283,6 +283,7 @@ EXPORT_SYMBOL(sunxi_sram_release); ...@@ -283,6 +283,7 @@ EXPORT_SYMBOL(sunxi_sram_release);
struct sunxi_sramc_variant { struct sunxi_sramc_variant {
int num_emac_clocks; int num_emac_clocks;
bool has_ldo_ctrl;
}; };
static const struct sunxi_sramc_variant sun4i_a10_sramc_variant = { static const struct sunxi_sramc_variant sun4i_a10_sramc_variant = {
...@@ -302,25 +303,28 @@ static const struct sunxi_sramc_variant sun50i_h616_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_SRAM_EMAC_CLOCK_REG 0x30
#define SUNXI_SYS_LDO_CTRL_REG 0x150
static bool sunxi_sram_regmap_accessible_reg(struct device *dev, static bool sunxi_sram_regmap_accessible_reg(struct device *dev,
unsigned int reg) unsigned int reg)
{ {
const struct sunxi_sramc_variant *variant = dev_get_drvdata(dev); const struct sunxi_sramc_variant *variant = dev_get_drvdata(dev);
if (reg < SUNXI_SRAM_EMAC_CLOCK_REG) if (reg >= SUNXI_SRAM_EMAC_CLOCK_REG &&
return false; reg < SUNXI_SRAM_EMAC_CLOCK_REG + variant->num_emac_clocks * 4)
if (reg > SUNXI_SRAM_EMAC_CLOCK_REG + variant->num_emac_clocks * 4) return true;
return false; 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, .reg_bits = 32,
.val_bits = 32, .val_bits = 32,
.reg_stride = 4, .reg_stride = 4,
/* last defined register */ /* 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 */ /* other devices have no business accessing other registers */
.readable_reg = sunxi_sram_regmap_accessible_reg, .readable_reg = sunxi_sram_regmap_accessible_reg,
.writeable_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 = { ...@@ -328,9 +332,9 @@ static struct regmap_config sunxi_sram_emac_clock_regmap = {
static int __init sunxi_sram_probe(struct platform_device *pdev) static int __init sunxi_sram_probe(struct platform_device *pdev)
{ {
struct regmap *emac_clock;
const struct sunxi_sramc_variant *variant; const struct sunxi_sramc_variant *variant;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct regmap *regmap;
sram_dev = &pdev->dev; sram_dev = &pdev->dev;
...@@ -344,12 +348,10 @@ static int __init sunxi_sram_probe(struct platform_device *pdev) ...@@ -344,12 +348,10 @@ static int __init sunxi_sram_probe(struct platform_device *pdev)
if (IS_ERR(base)) if (IS_ERR(base))
return PTR_ERR(base); return PTR_ERR(base);
if (variant->num_emac_clocks > 0) { if (variant->num_emac_clocks || variant->has_ldo_ctrl) {
emac_clock = devm_regmap_init_mmio(&pdev->dev, base, regmap = devm_regmap_init_mmio(dev, base, &sunxi_sram_regmap_config);
&sunxi_sram_emac_clock_regmap); if (IS_ERR(regmap))
return PTR_ERR(regmap);
if (IS_ERR(emac_clock))
return PTR_ERR(emac_clock);
} }
of_platform_populate(dev->of_node, NULL, NULL, dev); of_platform_populate(dev->of_node, NULL, NULL, dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment