diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2020-03-24 13:19:34 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2020-04-14 09:13:19 +0200 |
commit | ef46f2db0001d4d5b66ddd34346aa36625dbf452 (patch) | |
tree | 2a87a67f0e577ceb3e23668b51893789218d1e6a /drivers/mfd | |
parent | d32a774ebbe8465c84e279a577d458890ef326e7 (diff) | |
download | barebox-ef46f2db0001d4d5b66ddd34346aa36625dbf452.tar.gz barebox-ef46f2db0001d4d5b66ddd34346aa36625dbf452.tar.xz |
regmap-mmio: Add big endian support
Add support for parsing the big-endian device tree property.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/mfd')
-rw-r--r-- | drivers/mfd/syscon.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c index f1e6559d71..67e2ebb6c2 100644 --- a/drivers/mfd/syscon.c +++ b/drivers/mfd/syscon.c @@ -40,8 +40,10 @@ static const struct regmap_config syscon_regmap_config = { static struct syscon *of_syscon_register(struct device_node *np, bool check_clk) { - int ret; + struct regmap_config syscon_config = syscon_regmap_config; struct syscon *syscon; + u32 reg_io_width; + int ret; struct resource res; if (!of_device_is_compatible(np, "syscon")) @@ -55,12 +57,33 @@ static struct syscon *of_syscon_register(struct device_node *np, bool check_clk) } syscon->base = IOMEM(res.start); - syscon->np = np; + + /* Parse the device's DT node for an endianness specification */ + if (of_property_read_bool(np, "big-endian")) + syscon_config.val_format_endian = REGMAP_ENDIAN_BIG; + else if (of_property_read_bool(np, "little-endian")) + syscon_config.val_format_endian = REGMAP_ENDIAN_LITTLE; + else if (of_property_read_bool(np, "native-endian")) + syscon_config.val_format_endian = REGMAP_ENDIAN_NATIVE; + + /* + * search for reg-io-width property in DT. If it is not provided, + * default to 4 bytes. regmap_init_mmio will return an error if values + * are invalid so there is no need to check them here. + */ + ret = of_property_read_u32(np, "reg-io-width", ®_io_width); + if (ret) + reg_io_width = 4; + + syscon_config.name = np->full_name; + syscon_config.reg_stride = reg_io_width; + syscon_config.val_bits = reg_io_width * 8; + syscon_config.max_register = resource_size(&res) - reg_io_width; list_add_tail(&syscon->list, &syscon_list); - syscon->regmap = of_regmap_init_mmio_clk(np, NULL, syscon->base, - &syscon_regmap_config); + syscon->regmap = regmap_init_mmio_clk(NULL, NULL, syscon->base, + &syscon_config); if (check_clk) { struct clk *clk = of_clk_get(np, 0); |