From d647c199510c2c126ac03ecbea51086e10126a40 Mon Sep 17 00:00:00 2001
From: Xiubo Li
Date: Tue, 15 Jul 2014 12:23:02 +0800
Subject: regmap: add DT endianness binding support.
For many drivers which will support rich endianness of Devices
need define DT properties by itself with the binding support.
The endianness using regmap:
Index Device Properties if needs bytes-swap,
or just ignore it
-------------------------------------------------------------
1 BE 'big-endian'
2 LE 'little-endian'
The properties include all the register values and the buffers.
And these properties are very usful for the MMIO devices:
Such as: a memory-mapped device, on one SoC is in BE mode, while
in another SoC will be in LE mode, and the CPU will always in LE
mode.
For the first case, we must use cpu_to_be32/be32_to_cpu for
32-bit registers accessing, so the 'big-endian' property is needed.
For the second case, we can just ignore the bytes-swap
functions like cpu_to_le32/le32_to_cpu, so the 'little-endian'
property could be abscent.
And vice versa...
Signed-off-by: Xiubo Li
Signed-off-by: Mark Brown
---
drivers/base/regmap/regmap-i2c.c | 2 +
drivers/base/regmap/regmap-spi.c | 2 +
drivers/base/regmap/regmap.c | 117 +++++++++++++++++++++++++++++++++++----
3 files changed, 110 insertions(+), 11 deletions(-)
(limited to 'drivers')
diff --git a/drivers/base/regmap/regmap-i2c.c b/drivers/base/regmap/regmap-i2c.c
index ca193d1ef47c..053150a7f9f2 100644
--- a/drivers/base/regmap/regmap-i2c.c
+++ b/drivers/base/regmap/regmap-i2c.c
@@ -168,6 +168,8 @@ static struct regmap_bus regmap_i2c = {
.write = regmap_i2c_write,
.gather_write = regmap_i2c_gather_write,
.read = regmap_i2c_read,
+ .reg_format_endian_default = REGMAP_ENDIAN_BIG,
+ .val_format_endian_default = REGMAP_ENDIAN_BIG,
};
static const struct regmap_bus *regmap_get_i2c_bus(struct i2c_client *i2c,
diff --git a/drivers/base/regmap/regmap-spi.c b/drivers/base/regmap/regmap-spi.c
index 0eb3097c0d76..53d1148e80a0 100644
--- a/drivers/base/regmap/regmap-spi.c
+++ b/drivers/base/regmap/regmap-spi.c
@@ -109,6 +109,8 @@ static struct regmap_bus regmap_spi = {
.async_alloc = regmap_spi_async_alloc,
.read = regmap_spi_read,
.read_flag_mask = 0x80,
+ .reg_format_endian_default = REGMAP_ENDIAN_BIG,
+ .val_format_endian_default = REGMAP_ENDIAN_BIG,
};
/**
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index 78f43fb2fe84..e4e567e82b84 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -15,6 +15,7 @@
#include
#include
#include
+#include
#include
#include
@@ -448,6 +449,102 @@ int regmap_attach_dev(struct device *dev, struct regmap *map,
}
EXPORT_SYMBOL_GPL(regmap_attach_dev);
+enum regmap_endian_type {
+ REGMAP_ENDIAN_REG,
+ REGMAP_ENDIAN_VAL,
+};
+
+static int of_regmap_get_endian(struct device *dev,
+ const struct regmap_bus *bus,
+ const struct regmap_config *config,
+ enum regmap_endian_type type,
+ enum regmap_endian *endian)
+{
+ struct device_node *np = dev->of_node;
+
+ if (!endian || !config)
+ return -EINVAL;
+
+ /*
+ * Firstly, try to parse the endianness from driver's config,
+ * this is to be compatible with the none DT or the old drivers.
+ * From the driver's config the endianness value maybe:
+ * REGMAP_ENDIAN_BIG,
+ * REGMAP_ENDIAN_LITTLE,
+ * REGMAP_ENDIAN_NATIVE,
+ * REGMAP_ENDIAN_DEFAULT.
+ */
+ switch (type) {
+ case REGMAP_ENDIAN_REG:
+ *endian = config->reg_format_endian;
+ break;
+ case REGMAP_ENDIAN_VAL:
+ *endian = config->val_format_endian;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ /*
+ * If the endianness parsed from driver config is
+ * REGMAP_ENDIAN_DEFAULT, that means maybe we are using the DT
+ * node to specify the endianness information.
+ */
+ if (*endian != REGMAP_ENDIAN_DEFAULT)
+ return 0;
+
+ /*
+ * Secondly, try to parse the endianness from DT node if the
+ * driver config does not specify it.
+ * From the DT node the endianness value maybe:
+ * REGMAP_ENDIAN_BIG,
+ * REGMAP_ENDIAN_LITTLE,
+ * REGMAP_ENDIAN_NATIVE,
+ */
+ switch (type) {
+ case REGMAP_ENDIAN_VAL:
+ if (of_property_read_bool(np, "big-endian"))
+ *endian = REGMAP_ENDIAN_BIG;
+ else if (of_property_read_bool(np, "little-endian"))
+ *endian = REGMAP_ENDIAN_LITTLE;
+ else
+ *endian = REGMAP_ENDIAN_NATIVE;
+ break;
+ case REGMAP_ENDIAN_REG:
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ /*
+ * If the endianness parsed from DT node is REGMAP_ENDIAN_NATIVE, that
+ * maybe means the DT does not care the endianness or it should use
+ * the regmap bus's default endianness, then we should try to check
+ * whether the regmap bus has specified the default endianness.
+ */
+ if (*endian != REGMAP_ENDIAN_NATIVE)
+ return 0;
+
+ /*
+ * Finally, try to parse the endianness from regmap bus config
+ * if in device's DT node the endianness property is absent.
+ */
+ switch (type) {
+ case REGMAP_ENDIAN_REG:
+ if (bus && bus->reg_format_endian_default)
+ *endian = bus->reg_format_endian_default;
+ break;
+ case REGMAP_ENDIAN_VAL:
+ if (bus && bus->val_format_endian_default)
+ *endian = bus->val_format_endian_default;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
/**
* regmap_init(): Initialise register map
*
@@ -551,17 +648,15 @@ struct regmap *regmap_init(struct device *dev,
map->reg_read = _regmap_bus_read;
}
- reg_endian = config->reg_format_endian;
- if (reg_endian == REGMAP_ENDIAN_DEFAULT)
- reg_endian = bus->reg_format_endian_default;
- if (reg_endian == REGMAP_ENDIAN_DEFAULT)
- reg_endian = REGMAP_ENDIAN_BIG;
-
- val_endian = config->val_format_endian;
- if (val_endian == REGMAP_ENDIAN_DEFAULT)
- val_endian = bus->val_format_endian_default;
- if (val_endian == REGMAP_ENDIAN_DEFAULT)
- val_endian = REGMAP_ENDIAN_BIG;
+ ret = of_regmap_get_endian(dev, bus, config, REGMAP_ENDIAN_REG,
+ ®_endian);
+ if (ret)
+ return ERR_PTR(ret);
+
+ ret = of_regmap_get_endian(dev, bus, config, REGMAP_ENDIAN_VAL,
+ &val_endian);
+ if (ret)
+ return ERR_PTR(ret);
switch (config->reg_bits + map->reg_shift) {
case 2:
--
cgit v1.2.3
From ba1b53feb8cacbd84bcf0e48925e30ad29e141a6 Mon Sep 17 00:00:00 2001
From: Javier Martinez Canillas
Date: Mon, 18 Aug 2014 15:09:02 +0200
Subject: regmap: Fix DT endianess parsing logic
Commit d647c199510c ("regmap: add DT endianness binding support.")
added support to parse the device endianness from the device tree
but unfortunately the added logic doesn't have the same semantics
than the old code. This leads to a NULL dereference pointer error
when these properties are not provided by the Device Tree:
Unable to handle kernel NULL pointer dereference at virtual address 00000044
pgd = c0004000
[00000044] *pgd=00000000
Internal error: Oops: 5 [#1] PREEMPT SMP ARM
Modules linked in:
CPU: 5 PID: 1 Comm: swapper/0 Not tainted 3.17.0-rc1-next-20140818ccu #671
task: ea412800 ti: ea484000 task.ti: ea484000
PC is at regmap_update_bits+0xc/0x5c
The problem is that platforms that rely on the default value now
gets different values due two related issues in the current code:
a) It only parses the endianness from DT for the regmap registers
and not for the regmap values but it checks unconditionally in
both cases if the resulting endiannes is REGMAP_ENDIAN_NATIVE.
b) REGMAP_ENDIAN_NATIVE is not even a valid DT property according
to the regmap DT binding documentation so it shouldn't be set.
Signed-off-by: Javier Martinez Canillas
Signed-off-by: Mark Brown
---
drivers/base/regmap/regmap.c | 16 ++++------------
1 file changed, 4 insertions(+), 12 deletions(-)
(limited to 'drivers')
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index e4e567e82b84..055a9c3a3b12 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -499,7 +499,6 @@ static int of_regmap_get_endian(struct device *dev,
* From the DT node the endianness value maybe:
* REGMAP_ENDIAN_BIG,
* REGMAP_ENDIAN_LITTLE,
- * REGMAP_ENDIAN_NATIVE,
*/
switch (type) {
case REGMAP_ENDIAN_VAL:
@@ -507,8 +506,10 @@ static int of_regmap_get_endian(struct device *dev,
*endian = REGMAP_ENDIAN_BIG;
else if (of_property_read_bool(np, "little-endian"))
*endian = REGMAP_ENDIAN_LITTLE;
- else
- *endian = REGMAP_ENDIAN_NATIVE;
+
+ if (*endian != REGMAP_ENDIAN_DEFAULT)
+ return 0;
+
break;
case REGMAP_ENDIAN_REG:
break;
@@ -516,15 +517,6 @@ static int of_regmap_get_endian(struct device *dev,
return -EINVAL;
}
- /*
- * If the endianness parsed from DT node is REGMAP_ENDIAN_NATIVE, that
- * maybe means the DT does not care the endianness or it should use
- * the regmap bus's default endianness, then we should try to check
- * whether the regmap bus has specified the default endianness.
- */
- if (*endian != REGMAP_ENDIAN_NATIVE)
- return 0;
-
/*
* Finally, try to parse the endianness from regmap bus config
* if in device's DT node the endianness property is absent.
--
cgit v1.2.3
From 45e1a279ce1d2ff9b2b2fedf4cdced10c7ca3ab5 Mon Sep 17 00:00:00 2001
From: Stephen Warren
Date: Tue, 19 Aug 2014 10:49:07 -0600
Subject: regmap: of_regmap_get_endian() cleanup
Commit d647c199510c ("regmap: add DT endianness binding support") had
some issues. Commit ba1b53feb8ca ("regmap: Fix DT endianess parsing
logic") fixed the main problem. This patch fixes the other.
Specifically, restore the overall default of REGMAP_ENDIAN_BIG if none of
the config, DT, or the bus specify any endianness. Without this,
of_regmap_get_endian() could return REGMAP_ENDIAN_DEFAULT, which the
calling code can't handle. Since all busses do specify an endianness in
the current code, this makes no difference right now, but I saw no
justification in the patch description for removing this final default.
Also, clean up the code a bit:
* s/of_regmap_get_endian/regmap_get_endian/ since the function isn't DT-
specific, even if the reason it was originally added was to add some
DT-specific features.
* After potentially reading an endianess specification from DT, the code
checks whether DT did specify an endianness, and if so, returns it. Move
this test outside the whole switch statement so that if the
REGMAP_ENDIAN_REG case ever modifies *endian, this check will pick that
up. This partially reverts part of commit ba1b53feb8ca ("regmap: Fix DT
endianess parsing logic"), while maintaining the bug-fix that commit
made to this code.
* Make the comments briefer, and only refer to the specific action taken
at their location. This makes most of the comments independent of DT,
and easier to follow.
Cc: Xiubo Li
Cc: Javier Martinez Canillas
Cc: Thierry Reding
Fixes: d647c199510c ("regmap: add DT endianness binding support")
Signed-off-by: Stephen Warren
Signed-off-by: Mark Brown
---
drivers/base/regmap/regmap.c | 54 ++++++++++++++++----------------------------
1 file changed, 20 insertions(+), 34 deletions(-)
(limited to 'drivers')
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index 055a9c3a3b12..bb4502a48be5 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -454,7 +454,7 @@ enum regmap_endian_type {
REGMAP_ENDIAN_VAL,
};
-static int of_regmap_get_endian(struct device *dev,
+static int regmap_get_endian(struct device *dev,
const struct regmap_bus *bus,
const struct regmap_config *config,
enum regmap_endian_type type,
@@ -465,15 +465,7 @@ static int of_regmap_get_endian(struct device *dev,
if (!endian || !config)
return -EINVAL;
- /*
- * Firstly, try to parse the endianness from driver's config,
- * this is to be compatible with the none DT or the old drivers.
- * From the driver's config the endianness value maybe:
- * REGMAP_ENDIAN_BIG,
- * REGMAP_ENDIAN_LITTLE,
- * REGMAP_ENDIAN_NATIVE,
- * REGMAP_ENDIAN_DEFAULT.
- */
+ /* Retrieve the endianness specification from the regmap config */
switch (type) {
case REGMAP_ENDIAN_REG:
*endian = config->reg_format_endian;
@@ -485,31 +477,17 @@ static int of_regmap_get_endian(struct device *dev,
return -EINVAL;
}
- /*
- * If the endianness parsed from driver config is
- * REGMAP_ENDIAN_DEFAULT, that means maybe we are using the DT
- * node to specify the endianness information.
- */
+ /* If the regmap config specified a non-default value, use that */
if (*endian != REGMAP_ENDIAN_DEFAULT)
return 0;
- /*
- * Secondly, try to parse the endianness from DT node if the
- * driver config does not specify it.
- * From the DT node the endianness value maybe:
- * REGMAP_ENDIAN_BIG,
- * REGMAP_ENDIAN_LITTLE,
- */
+ /* Parse the device's DT node for an endianness specification */
switch (type) {
case REGMAP_ENDIAN_VAL:
if (of_property_read_bool(np, "big-endian"))
*endian = REGMAP_ENDIAN_BIG;
else if (of_property_read_bool(np, "little-endian"))
*endian = REGMAP_ENDIAN_LITTLE;
-
- if (*endian != REGMAP_ENDIAN_DEFAULT)
- return 0;
-
break;
case REGMAP_ENDIAN_REG:
break;
@@ -517,10 +495,11 @@ static int of_regmap_get_endian(struct device *dev,
return -EINVAL;
}
- /*
- * Finally, try to parse the endianness from regmap bus config
- * if in device's DT node the endianness property is absent.
- */
+ /* If the endianness was specified in DT, use that */
+ if (*endian != REGMAP_ENDIAN_DEFAULT)
+ return 0;
+
+ /* Retrieve the endianness specification from the bus config */
switch (type) {
case REGMAP_ENDIAN_REG:
if (bus && bus->reg_format_endian_default)
@@ -534,6 +513,13 @@ static int of_regmap_get_endian(struct device *dev,
return -EINVAL;
}
+ /* If the bus specified a non-default value, use that */
+ if (*endian != REGMAP_ENDIAN_DEFAULT)
+ return 0;
+
+ /* Use this if no other value was found */
+ *endian = REGMAP_ENDIAN_BIG;
+
return 0;
}
@@ -640,13 +626,13 @@ struct regmap *regmap_init(struct device *dev,
map->reg_read = _regmap_bus_read;
}
- ret = of_regmap_get_endian(dev, bus, config, REGMAP_ENDIAN_REG,
- ®_endian);
+ ret = regmap_get_endian(dev, bus, config, REGMAP_ENDIAN_REG,
+ ®_endian);
if (ret)
return ERR_PTR(ret);
- ret = of_regmap_get_endian(dev, bus, config, REGMAP_ENDIAN_VAL,
- &val_endian);
+ ret = regmap_get_endian(dev, bus, config, REGMAP_ENDIAN_VAL,
+ &val_endian);
if (ret)
return ERR_PTR(ret);
--
cgit v1.2.3
From cf673fbc6342b1c2310cdfdc4ed99f18f866b8e4 Mon Sep 17 00:00:00 2001
From: Geert Uytterhoeven
Date: Wed, 27 Aug 2014 16:36:03 +0200
Subject: regmap: Split regmap_get_endian() in two functions
Split regmap_get_endian() in two functions, regmap_get_reg_endian() and
regmap_get_val_endian().
This allows to:
- Get rid of the three switch()es on "type", incl. error handling in
three "default" cases,
- Get rid of the regmap_endian_type enum,
- Get rid of the non-NULL check of "config" (regmap_init() already
checks for that),
- Get rid of the "endian" output parameters, and just return the
regmap_endian enum value, as the functions can no longer fail.
This saves 21 lines of code (despite the still-present
one-comment-per-line over-documentation), and 30 bytes of code on ARM
V7.
Signed-off-by: Geert Uytterhoeven
Reviewed-by: Stephen Warren
Signed-off-by: Mark Brown
---
drivers/base/regmap/regmap.c | 107 +++++++++++++++++--------------------------
1 file changed, 43 insertions(+), 64 deletions(-)
(limited to 'drivers')
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index bb4502a48be5..01ae4b829360 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -449,78 +449,64 @@ int regmap_attach_dev(struct device *dev, struct regmap *map,
}
EXPORT_SYMBOL_GPL(regmap_attach_dev);
-enum regmap_endian_type {
- REGMAP_ENDIAN_REG,
- REGMAP_ENDIAN_VAL,
-};
+static enum regmap_endian regmap_get_reg_endian(const struct regmap_bus *bus,
+ const struct regmap_config *config)
+{
+ enum regmap_endian endian;
-static int regmap_get_endian(struct device *dev,
- const struct regmap_bus *bus,
- const struct regmap_config *config,
- enum regmap_endian_type type,
- enum regmap_endian *endian)
+ /* Retrieve the endianness specification from the regmap config */
+ endian = config->reg_format_endian;
+
+ /* If the regmap config specified a non-default value, use that */
+ if (endian != REGMAP_ENDIAN_DEFAULT)
+ return endian;
+
+ /* Retrieve the endianness specification from the bus config */
+ if (bus && bus->reg_format_endian_default)
+ endian = bus->reg_format_endian_default;
+
+ /* If the bus specified a non-default value, use that */
+ if (endian != REGMAP_ENDIAN_DEFAULT)
+ return endian;
+
+ /* Use this if no other value was found */
+ return REGMAP_ENDIAN_BIG;
+}
+
+static enum regmap_endian regmap_get_val_endian(struct device *dev,
+ const struct regmap_bus *bus,
+ const struct regmap_config *config)
{
struct device_node *np = dev->of_node;
-
- if (!endian || !config)
- return -EINVAL;
+ enum regmap_endian endian;
/* Retrieve the endianness specification from the regmap config */
- switch (type) {
- case REGMAP_ENDIAN_REG:
- *endian = config->reg_format_endian;
- break;
- case REGMAP_ENDIAN_VAL:
- *endian = config->val_format_endian;
- break;
- default:
- return -EINVAL;
- }
+ endian = config->val_format_endian;
/* If the regmap config specified a non-default value, use that */
- if (*endian != REGMAP_ENDIAN_DEFAULT)
- return 0;
+ if (endian != REGMAP_ENDIAN_DEFAULT)
+ return endian;
/* Parse the device's DT node for an endianness specification */
- switch (type) {
- case REGMAP_ENDIAN_VAL:
- if (of_property_read_bool(np, "big-endian"))
- *endian = REGMAP_ENDIAN_BIG;
- else if (of_property_read_bool(np, "little-endian"))
- *endian = REGMAP_ENDIAN_LITTLE;
- break;
- case REGMAP_ENDIAN_REG:
- break;
- default:
- return -EINVAL;
- }
+ if (of_property_read_bool(np, "big-endian"))
+ endian = REGMAP_ENDIAN_BIG;
+ else if (of_property_read_bool(np, "little-endian"))
+ endian = REGMAP_ENDIAN_LITTLE;
/* If the endianness was specified in DT, use that */
- if (*endian != REGMAP_ENDIAN_DEFAULT)
- return 0;
+ if (endian != REGMAP_ENDIAN_DEFAULT)
+ return endian;
/* Retrieve the endianness specification from the bus config */
- switch (type) {
- case REGMAP_ENDIAN_REG:
- if (bus && bus->reg_format_endian_default)
- *endian = bus->reg_format_endian_default;
- break;
- case REGMAP_ENDIAN_VAL:
- if (bus && bus->val_format_endian_default)
- *endian = bus->val_format_endian_default;
- break;
- default:
- return -EINVAL;
- }
+ if (bus && bus->val_format_endian_default)
+ endian = bus->val_format_endian_default;
/* If the bus specified a non-default value, use that */
- if (*endian != REGMAP_ENDIAN_DEFAULT)
- return 0;
+ if (endian != REGMAP_ENDIAN_DEFAULT)
+ return endian;
/* Use this if no other value was found */
- *endian = REGMAP_ENDIAN_BIG;
-
- return 0;
+ return REGMAP_ENDIAN_BIG;
}
/**
@@ -626,15 +612,8 @@ struct regmap *regmap_init(struct device *dev,
map->reg_read = _regmap_bus_read;
}
- ret = regmap_get_endian(dev, bus, config, REGMAP_ENDIAN_REG,
- ®_endian);
- if (ret)
- return ERR_PTR(ret);
-
- ret = regmap_get_endian(dev, bus, config, REGMAP_ENDIAN_VAL,
- &val_endian);
- if (ret)
- return ERR_PTR(ret);
+ reg_endian = regmap_get_reg_endian(bus, config);
+ val_endian = regmap_get_val_endian(dev, bus, config);
switch (config->reg_bits + map->reg_shift) {
case 2:
--
cgit v1.2.3
From 6e64b6ccc1e46932768e3bb8974fc2e5589bca7a Mon Sep 17 00:00:00 2001
From: Pankaj Dubey
Date: Thu, 18 Sep 2014 15:12:20 +0530
Subject: regmap: fix NULL pointer dereference in regmap_get_val_endian
Recents commits for getting reg endianness causing NULL pointer
dereference if dev is passed NULL in regmap_init_mmio. This patch
fixes this issue, and allows to parse reg endianness only if dev
and dev->of_node exist.
Signed-off-by: Pankaj Dubey
Signed-off-by: Mark Brown
---
drivers/base/regmap/regmap.c | 23 ++++++++++++++---------
1 file changed, 14 insertions(+), 9 deletions(-)
(limited to 'drivers')
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index 01ae4b829360..fd7ae9a10c4d 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -477,7 +477,7 @@ static enum regmap_endian regmap_get_val_endian(struct device *dev,
const struct regmap_bus *bus,
const struct regmap_config *config)
{
- struct device_node *np = dev->of_node;
+ struct device_node *np;
enum regmap_endian endian;
/* Retrieve the endianness specification from the regmap config */
@@ -487,15 +487,20 @@ static enum regmap_endian regmap_get_val_endian(struct device *dev,
if (endian != REGMAP_ENDIAN_DEFAULT)
return endian;
- /* Parse the device's DT node for an endianness specification */
- if (of_property_read_bool(np, "big-endian"))
- endian = REGMAP_ENDIAN_BIG;
- else if (of_property_read_bool(np, "little-endian"))
- endian = REGMAP_ENDIAN_LITTLE;
+ /* If the dev and dev->of_node exist try to get endianness from DT */
+ if (dev && dev->of_node) {
+ np = dev->of_node;
- /* If the endianness was specified in DT, use that */
- if (endian != REGMAP_ENDIAN_DEFAULT)
- return endian;
+ /* Parse the device's DT node for an endianness specification */
+ if (of_property_read_bool(np, "big-endian"))
+ endian = REGMAP_ENDIAN_BIG;
+ else if (of_property_read_bool(np, "little-endian"))
+ endian = REGMAP_ENDIAN_LITTLE;
+
+ /* If the endianness was specified in DT, use that */
+ if (endian != REGMAP_ENDIAN_DEFAULT)
+ return endian;
+ }
/* Retrieve the endianness specification from the bus config */
if (bus && bus->val_format_endian_default)
--
cgit v1.2.3