diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2020-04-16 18:40:49 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2020-04-16 18:40:49 +0200 |
commit | a1f5e9f895c704f068cf038bc05cbac6f7c9f310 (patch) | |
tree | 1d97a0993e8035d2137b1e5520b26a6c099b352d /drivers/mfd | |
parent | 32a48332753ac141998197f9f0e9c99d0d855102 (diff) | |
parent | 27d4a8f9a277ca362c7d6cecb53b65159c4bea10 (diff) | |
download | barebox-a1f5e9f895c704f068cf038bc05cbac6f7c9f310.tar.gz barebox-a1f5e9f895c704f068cf038bc05cbac6f7c9f310.tar.xz |
Merge branch 'for-next/spi'
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 38b25858ed..a464dfc506 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; syscon = xzalloc(sizeof(*syscon)); @@ -52,12 +54,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); |