linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCHv3 0/2] add DT endianness binding support
@ 2014-04-30  4:43 Xiubo Li
  2014-04-30  4:43 ` [PATCHv3 1/2] dt/bindings: Add the DT binding documentation for endianness Xiubo Li
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Xiubo Li @ 2014-04-30  4:43 UTC (permalink / raw)
  To: mark.rutland, broonie
  Cc: gregkh, mpa, devicetree, linux-doc, linux-kernel, Xiubo Li

Changes in V3:
- Follow Mark Rutland's advice.
- Document common case of the endianess usage.

Changes in V2:
- Namespace the properties using the prefix sring.
- Add one binding ducomentation off regmap.

Xiubo Li (2):
  dt/bindings: Add the DT binding documentation for endianness
  regmap: add DT endianness binding support.

 .../devicetree/bindings/endianness/endianness.txt  |  47 +++++++
 drivers/base/regmap/regmap-i2c.c                   |   2 +
 drivers/base/regmap/regmap-spi.c                   |   2 +
 drivers/base/regmap/regmap.c                       | 147 +++++++++++++++++++--
 4 files changed, 187 insertions(+), 11 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/endianness/endianness.txt

-- 
1.8.4


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCHv3 1/2] dt/bindings: Add the DT binding documentation for endianness
  2014-04-30  4:43 [PATCHv3 0/2] add DT endianness binding support Xiubo Li
@ 2014-04-30  4:43 ` Xiubo Li
  2014-04-30  4:43 ` [PATCHv3 2/2] regmap: add DT endianness binding support Xiubo Li
  2014-04-30  7:10 ` [PATCHv3 0/2] " Richard Cochran
  2 siblings, 0 replies; 11+ messages in thread
From: Xiubo Li @ 2014-04-30  4:43 UTC (permalink / raw)
  To: mark.rutland, broonie
  Cc: gregkh, mpa, devicetree, linux-doc, linux-kernel, Xiubo Li

Signed-off-by: Xiubo Li <Li.Xiubo@freescale.com>
---
 .../devicetree/bindings/endianness/endianness.txt  | 47 ++++++++++++++++++++++
 1 file changed, 47 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/endianness/endianness.txt

diff --git a/Documentation/devicetree/bindings/endianness/endianness.txt b/Documentation/devicetree/bindings/endianness/endianness.txt
new file mode 100644
index 0000000..49458a1
--- /dev/null
+++ b/Documentation/devicetree/bindings/endianness/endianness.txt
@@ -0,0 +1,47 @@
+Device-Tree binding for device endianness
+
+The endianness mode of CPU & Device scenarios:
+Index    CPU       Device     Endianess flag for DT bool property
+------------------------------------------------------------
+1        LE        LE         -
+2        LE        BE         'big-endian{,-*}'
+3        BE        BE         -
+4        BE        LE         'little-endian{,-*}'
+
+For one device driver, which will run in different scenarios above
+on different SoCs using the devicetree, we need one way to simplify
+this.
+
+Required properties:
+- {big,little}-endian{,-*}: this is one boolean property.
+
+Examples:
+Scenario 1 : CPU in LE mode & device in LE mode.
+dev: dev@40031000 {
+	      compatible = "name";
+	      reg = <0x40031000 0x1000>;
+	      ...
+};
+
+Scenario 2 : CPU in LE mode & device in BE mode.
+dev: dev@40031000 {
+	      compatible = "name";
+	      reg = <0x40031000 0x1000>;
+	      ...
+	      big-endian{,-*};
+};
+
+Scenario 3 : CPU in BE mode & device in BE mode.
+dev: dev@40031000 {
+	      compatible = "name";
+	      reg = <0x40031000 0x1000>;
+	      ...
+};
+
+Scenario 4 : CPU in BE mode & device in LE mode.
+dev: dev@40031000 {
+	      compatible = "name";
+	      reg = <0x40031000 0x1000>;
+	      ...
+	      little-endian{,-*};
+};
-- 
1.8.4


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCHv3 2/2] regmap: add DT endianness binding support.
  2014-04-30  4:43 [PATCHv3 0/2] add DT endianness binding support Xiubo Li
  2014-04-30  4:43 ` [PATCHv3 1/2] dt/bindings: Add the DT binding documentation for endianness Xiubo Li
@ 2014-04-30  4:43 ` Xiubo Li
  2014-04-30  6:56   ` Markus Pargmann
  2014-04-30  7:10 ` [PATCHv3 0/2] " Richard Cochran
  2 siblings, 1 reply; 11+ messages in thread
From: Xiubo Li @ 2014-04-30  4:43 UTC (permalink / raw)
  To: mark.rutland, broonie
  Cc: gregkh, mpa, devicetree, linux-doc, linux-kernel, Xiubo Li

For many drivers which will support rich endianness of CPU<-->Dev
need define DT properties by itself without the binding support.

The endianness using regmap:
Index    CPU       Device     Endianess flag for DT bool property
------------------------------------------------------------
1        LE        LE         -
2        LE        BE         'big-endian-{val,reg}'
3        BE        BE         -
4        BE        LE         'little-endian-{val,reg}'

Please see the following documetation for detail:
    Documentation/devicetree/bindings/endianness/endianness.txt

Signed-off-by: Xiubo Li <Li.Xiubo@freescale.com>
---
 drivers/base/regmap/regmap-i2c.c |   2 +
 drivers/base/regmap/regmap-spi.c |   2 +
 drivers/base/regmap/regmap.c     | 147 ++++++++++++++++++++++++++++++++++++---
 3 files changed, 140 insertions(+), 11 deletions(-)

diff --git a/drivers/base/regmap/regmap-i2c.c b/drivers/base/regmap/regmap-i2c.c
index fa6bf52..1f603a6 100644
--- a/drivers/base/regmap/regmap-i2c.c
+++ b/drivers/base/regmap/regmap-i2c.c
@@ -96,6 +96,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,
 };
 
 /**
diff --git a/drivers/base/regmap/regmap-spi.c b/drivers/base/regmap/regmap-spi.c
index 37f12ae..377fa29 100644
--- a/drivers/base/regmap/regmap-spi.c
+++ b/drivers/base/regmap/regmap-spi.c
@@ -110,6 +110,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 8e8cea1..946e901 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -15,6 +15,7 @@
 #include <linux/export.h>
 #include <linux/mutex.h>
 #include <linux/err.h>
+#include <linux/of.h>
 #include <linux/rbtree.h>
 #include <linux/sched.h>
 
@@ -422,6 +423,132 @@ static void regmap_range_exit(struct regmap *map)
 	kfree(map->selector_work_buf);
 }
 
+enum regmap_endian_type {
+	REGMAP_ENDIAN_REG,
+	REGMAP_ENDIAN_VAL,
+};
+
+/**
+ * of_regmap_endian_by_type() - Parse and lookup the endian referenced
+ * by a device node
+ * @np: pointer to clock consumer node
+ * @type: type of consumer's endian input
+ *
+ * This function parses the device endian property, and uses them to
+ * determine the endian of the registers and values.
+ */
+static int of_regmap_endian_by_type(struct device_node *np,
+					enum regmap_endian_type type,
+					enum regmap_endian *endian)
+{
+	if (!endian)
+		return -EINVAL;
+
+	switch (type) {
+	case REGMAP_ENDIAN_REG:
+		if (of_property_read_bool(np, "big-endian-reg"))
+			*endian = REGMAP_ENDIAN_BIG;
+		else if (of_property_read_bool(np, "little-endian-reg"))
+			*endian = REGMAP_ENDIAN_LITTLE;
+		else
+			*endian = REGMAP_ENDIAN_NATIVE;
+		break;
+	case REGMAP_ENDIAN_VAL:
+		if (of_property_read_bool(np, "big-endian-val"))
+			*endian = REGMAP_ENDIAN_BIG;
+		else if (of_property_read_bool(np, "little-endian-val"))
+			*endian = REGMAP_ENDIAN_LITTLE;
+		else
+			*endian = REGMAP_ENDIAN_NATIVE;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+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)
+{
+	int ret;
+
+	if (!endian || !config)
+		return -EINVAL;
+
+	/*
+	 * Firstly, try to parse the endian from driver's config,
+	 * this is to be compatible with the none DT or the old drivers.
+	 * From the driver's config the endian 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 endian parsing from driver's config is REGMAP_ENDIAN_DEFAULT,
+	 * that means maybe we are using the DT node to specify the endianness.
+	 */
+	if (*endian != REGMAP_ENDIAN_DEFAULT)
+		return 0;
+
+	/*
+	 * Secondly, try to parse the endian from DT node if the
+	 * driver config does not specify it.
+	 * From the DT node the endian value maybe:
+	 *   REGMAP_ENDIAN_BIG,
+	 *   REGMAP_ENDIAN_LITTLE,
+	 *   REGMAP_ENDIAN_NATIVE,
+	 */
+	if (dev) {
+		ret = of_regmap_endian_by_type(dev->of_node, type, endian);
+		if (ret < 0)
+			return ret;
+	}
+
+	/*
+	 * If the endian parsing 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 endianess.
+	 */
+	if (*endian != REGMAP_ENDIAN_NATIVE)
+		return 0;
+
+	/*
+	 * Finally, try to parse the endian from regmap bus config
+	 * if in device's DT node the endian 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
  *
@@ -518,17 +645,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,
+				   &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:
-- 
1.8.4


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCHv3 2/2] regmap: add DT endianness binding support.
  2014-04-30  4:43 ` [PATCHv3 2/2] regmap: add DT endianness binding support Xiubo Li
@ 2014-04-30  6:56   ` Markus Pargmann
  2014-04-30  7:10     ` Li.Xiubo
  0 siblings, 1 reply; 11+ messages in thread
From: Markus Pargmann @ 2014-04-30  6:56 UTC (permalink / raw)
  To: Xiubo Li
  Cc: mark.rutland, broonie, gregkh, devicetree, linux-doc, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 5769 bytes --]

Hi,

On Wed, Apr 30, 2014 at 12:43:49PM +0800, Xiubo Li wrote:
[...]
> diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
> index 8e8cea1..946e901 100644
> --- a/drivers/base/regmap/regmap.c
> +++ b/drivers/base/regmap/regmap.c
> @@ -15,6 +15,7 @@
>  #include <linux/export.h>
>  #include <linux/mutex.h>
>  #include <linux/err.h>
> +#include <linux/of.h>
>  #include <linux/rbtree.h>
>  #include <linux/sched.h>
>  
> @@ -422,6 +423,132 @@ static void regmap_range_exit(struct regmap *map)
>  	kfree(map->selector_work_buf);
>  }
>  
> +enum regmap_endian_type {
> +	REGMAP_ENDIAN_REG,
> +	REGMAP_ENDIAN_VAL,
> +};
> +
> +/**
> + * of_regmap_endian_by_type() - Parse and lookup the endian referenced
> + * by a device node
> + * @np: pointer to clock consumer node

This is not the clock consumer, right?

> + * @type: type of consumer's endian input
> + *
> + * This function parses the device endian property, and uses them to
> + * determine the endian of the registers and values.
> + */
> +static int of_regmap_endian_by_type(struct device_node *np,
> +					enum regmap_endian_type type,
> +					enum regmap_endian *endian)
> +{
> +	if (!endian)
> +		return -EINVAL;
> +
> +	switch (type) {
> +	case REGMAP_ENDIAN_REG:
> +		if (of_property_read_bool(np, "big-endian-reg"))
> +			*endian = REGMAP_ENDIAN_BIG;
> +		else if (of_property_read_bool(np, "little-endian-reg"))
> +			*endian = REGMAP_ENDIAN_LITTLE;
> +		else
> +			*endian = REGMAP_ENDIAN_NATIVE;

You could also return an error code here as there was no DT property
found. This doesn't change to much in the code, just an idea.

Regards,

Markus

> +		break;
> +	case REGMAP_ENDIAN_VAL:
> +		if (of_property_read_bool(np, "big-endian-val"))
> +			*endian = REGMAP_ENDIAN_BIG;
> +		else if (of_property_read_bool(np, "little-endian-val"))
> +			*endian = REGMAP_ENDIAN_LITTLE;
> +		else
> +			*endian = REGMAP_ENDIAN_NATIVE;
> +		break;
> +	default:
> +		return -EINVAL;
> +	}
> +
> +	return 0;
> +}
> +
> +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)
> +{
> +	int ret;
> +
> +	if (!endian || !config)
> +		return -EINVAL;
> +
> +	/*
> +	 * Firstly, try to parse the endian from driver's config,
> +	 * this is to be compatible with the none DT or the old drivers.
> +	 * From the driver's config the endian 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 endian parsing from driver's config is REGMAP_ENDIAN_DEFAULT,
> +	 * that means maybe we are using the DT node to specify the endianness.
> +	 */
> +	if (*endian != REGMAP_ENDIAN_DEFAULT)
> +		return 0;
> +
> +	/*
> +	 * Secondly, try to parse the endian from DT node if the
> +	 * driver config does not specify it.
> +	 * From the DT node the endian value maybe:
> +	 *   REGMAP_ENDIAN_BIG,
> +	 *   REGMAP_ENDIAN_LITTLE,
> +	 *   REGMAP_ENDIAN_NATIVE,
> +	 */
> +	if (dev) {
> +		ret = of_regmap_endian_by_type(dev->of_node, type, endian);
> +		if (ret < 0)
> +			return ret;
> +	}
> +
> +	/*
> +	 * If the endian parsing 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 endianess.
> +	 */
> +	if (*endian != REGMAP_ENDIAN_NATIVE)
> +		return 0;
> +
> +	/*
> +	 * Finally, try to parse the endian from regmap bus config
> +	 * if in device's DT node the endian 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
>   *
> @@ -518,17 +645,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,
> +				   &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:
> -- 
> 1.8.4
> 
> 

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCHv3 0/2] add DT endianness binding support
  2014-04-30  4:43 [PATCHv3 0/2] add DT endianness binding support Xiubo Li
  2014-04-30  4:43 ` [PATCHv3 1/2] dt/bindings: Add the DT binding documentation for endianness Xiubo Li
  2014-04-30  4:43 ` [PATCHv3 2/2] regmap: add DT endianness binding support Xiubo Li
@ 2014-04-30  7:10 ` Richard Cochran
  2014-04-30  7:14   ` Li.Xiubo
  2014-04-30 18:25   ` Mark Brown
  2 siblings, 2 replies; 11+ messages in thread
From: Richard Cochran @ 2014-04-30  7:10 UTC (permalink / raw)
  To: Xiubo Li
  Cc: mark.rutland, broonie, gregkh, mpa, devicetree, linux-doc, linux-kernel

Shouldn't this go to the arm list and rmk for review, too?

Thanks,
Richard

^ permalink raw reply	[flat|nested] 11+ messages in thread

* RE: [PATCHv3 2/2] regmap: add DT endianness binding support.
  2014-04-30  6:56   ` Markus Pargmann
@ 2014-04-30  7:10     ` Li.Xiubo
  0 siblings, 0 replies; 11+ messages in thread
From: Li.Xiubo @ 2014-04-30  7:10 UTC (permalink / raw)
  To: Markus Pargmann
  Cc: mark.rutland, broonie, gregkh, devicetree, linux-doc, linux-kernel

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="utf-8", Size: 5689 bytes --]

> > + * of_regmap_endian_by_type() - Parse and lookup the endian referenced
> > + * by a device node
> > + * @np: pointer to clock consumer node
> 
> This is not the clock consumer, right?
> 

Yes, you are right.

I will fix it.


> > + * @type: type of consumer's endian input
> > + *
> > + * This function parses the device endian property, and uses them to
> > + * determine the endian of the registers and values.
> > + */
> > +static int of_regmap_endian_by_type(struct device_node *np,
> > +					enum regmap_endian_type type,
> > +					enum regmap_endian *endian)
> > +{
> > +	if (!endian)
> > +		return -EINVAL;
> > +
> > +	switch (type) {
> > +	case REGMAP_ENDIAN_REG:
> > +		if (of_property_read_bool(np, "big-endian-reg"))
> > +			*endian = REGMAP_ENDIAN_BIG;
> > +		else if (of_property_read_bool(np, "little-endian-reg"))
> > +			*endian = REGMAP_ENDIAN_LITTLE;
> > +		else
> > +			*endian = REGMAP_ENDIAN_NATIVE;
> 
> You could also return an error code here as there was no DT property
> found. This doesn't change to much in the code, just an idea.
> 

The properties are all Boolean ones, and returning an error code here
is not proper. Isn't it ?

Returning _NATIVE here means to indicate that the the CPU and DEV are in
the same endianness mode...


Thanks very much,

BRs
Xiubo



> Regards,
> 
> Markus
> 
> > +		break;
> > +	case REGMAP_ENDIAN_VAL:
> > +		if (of_property_read_bool(np, "big-endian-val"))
> > +			*endian = REGMAP_ENDIAN_BIG;
> > +		else if (of_property_read_bool(np, "little-endian-val"))
> > +			*endian = REGMAP_ENDIAN_LITTLE;
> > +		else
> > +			*endian = REGMAP_ENDIAN_NATIVE;
> > +		break;
> > +	default:
> > +		return -EINVAL;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +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)
> > +{
> > +	int ret;
> > +
> > +	if (!endian || !config)
> > +		return -EINVAL;
> > +
> > +	/*
> > +	 * Firstly, try to parse the endian from driver's config,
> > +	 * this is to be compatible with the none DT or the old drivers.
> > +	 * From the driver's config the endian 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 endian parsing from driver's config is REGMAP_ENDIAN_DEFAULT,
> > +	 * that means maybe we are using the DT node to specify the endianness.
> > +	 */
> > +	if (*endian != REGMAP_ENDIAN_DEFAULT)
> > +		return 0;
> > +
> > +	/*
> > +	 * Secondly, try to parse the endian from DT node if the
> > +	 * driver config does not specify it.
> > +	 * From the DT node the endian value maybe:
> > +	 *   REGMAP_ENDIAN_BIG,
> > +	 *   REGMAP_ENDIAN_LITTLE,
> > +	 *   REGMAP_ENDIAN_NATIVE,
> > +	 */
> > +	if (dev) {
> > +		ret = of_regmap_endian_by_type(dev->of_node, type, endian);
> > +		if (ret < 0)
> > +			return ret;
> > +	}
> > +
> > +	/*
> > +	 * If the endian parsing 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 endianess.
> > +	 */
> > +	if (*endian != REGMAP_ENDIAN_NATIVE)
> > +		return 0;
> > +
> > +	/*
> > +	 * Finally, try to parse the endian from regmap bus config
> > +	 * if in device's DT node the endian 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
> >   *
> > @@ -518,17 +645,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,
> > +				   &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:
> > --
> > 1.8.4
> >
> >
> 
> --
> Pengutronix e.K.                           |                             |
> Industrial Linux Solutions                 | http://www.pengutronix.de/  |
> Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
> Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |
ÿôèº{.nÇ+‰·Ÿ®‰­†+%ŠËÿ±éݶ\x17¥Šwÿº{.nÇ+‰·¥Š{±þG«éÿŠ{ayº\x1dʇڙë,j\a­¢f£¢·hšïêÿ‘êçz_è®\x03(­éšŽŠÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?™¨è­Ú&£ø§~á¶iO•æ¬z·švØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?–I¥

^ permalink raw reply	[flat|nested] 11+ messages in thread

* RE: [PATCHv3 0/2] add DT endianness binding support
  2014-04-30  7:10 ` [PATCHv3 0/2] " Richard Cochran
@ 2014-04-30  7:14   ` Li.Xiubo
  2014-04-30  9:26     ` Richard Cochran
  2014-04-30 13:46     ` Richard Cochran
  2014-04-30 18:25   ` Mark Brown
  1 sibling, 2 replies; 11+ messages in thread
From: Li.Xiubo @ 2014-04-30  7:14 UTC (permalink / raw)
  To: Richard Cochran
  Cc: mark.rutland, broonie, gregkh, mpa, devicetree, linux-doc, linux-kernel


> Subject: Re: [PATCHv3 0/2] add DT endianness binding support
> 
> Shouldn't this go to the arm list and rmk for review, too?
> 

Well, yes, I forgot it.

Should I resend them ?

Thanks,


> Thanks,
> Richard

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCHv3 0/2] add DT endianness binding support
  2014-04-30  7:14   ` Li.Xiubo
@ 2014-04-30  9:26     ` Richard Cochran
  2014-04-30 13:46     ` Richard Cochran
  1 sibling, 0 replies; 11+ messages in thread
From: Richard Cochran @ 2014-04-30  9:26 UTC (permalink / raw)
  To: Li.Xiubo
  Cc: mark.rutland, broonie, gregkh, mpa, devicetree, linux-doc, linux-kernel

On Wed, Apr 30, 2014 at 07:14:08AM +0000, Li.Xiubo@freescale.com wrote:
> 
> > Subject: Re: [PATCHv3 0/2] add DT endianness binding support
> > 
> > Shouldn't this go to the arm list and rmk for review, too?
> > 
> 
> Well, yes, I forgot it.
> 
> Should I resend them ?

Please.

Thanks,
Richard

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCHv3 0/2] add DT endianness binding support
  2014-04-30  7:14   ` Li.Xiubo
  2014-04-30  9:26     ` Richard Cochran
@ 2014-04-30 13:46     ` Richard Cochran
  1 sibling, 0 replies; 11+ messages in thread
From: Richard Cochran @ 2014-04-30 13:46 UTC (permalink / raw)
  To: Li.Xiubo
  Cc: mark.rutland, broonie, gregkh, mpa, devicetree, linux-doc, linux-kernel

On Wed, Apr 30, 2014 at 07:14:08AM +0000, Li.Xiubo@freescale.com wrote:
> 
> > Subject: Re: [PATCHv3 0/2] add DT endianness binding support
> > 
> > Shouldn't this go to the arm list and rmk for review, too?
> > 
> 
> Well, yes, I forgot it.
> 
> Should I resend them ?

What I meant was, you should put

	<linux-arm-kernel@lists.infradead.org>

and

	"Russell King <linux@arm.linux.org.uk>"

onto CC.

Thanks,
Richard

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCHv3 0/2] add DT endianness binding support
  2014-04-30  7:10 ` [PATCHv3 0/2] " Richard Cochran
  2014-04-30  7:14   ` Li.Xiubo
@ 2014-04-30 18:25   ` Mark Brown
  2014-05-01  3:43     ` Richard Cochran
  1 sibling, 1 reply; 11+ messages in thread
From: Mark Brown @ 2014-04-30 18:25 UTC (permalink / raw)
  To: Richard Cochran
  Cc: Xiubo Li, mark.rutland, gregkh, mpa, devicetree, linux-doc, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 292 bytes --]

On Wed, Apr 30, 2014 at 09:10:12AM +0200, Richard Cochran wrote:
> Shouldn't this go to the arm list and rmk for review, too?

Is there any particular reason for including rmk?  It's generally not
helpful to spam people with serieses without reason, we all get quite a
lot of mail already...

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCHv3 0/2] add DT endianness binding support
  2014-04-30 18:25   ` Mark Brown
@ 2014-05-01  3:43     ` Richard Cochran
  0 siblings, 0 replies; 11+ messages in thread
From: Richard Cochran @ 2014-05-01  3:43 UTC (permalink / raw)
  To: Mark Brown
  Cc: Xiubo Li, mark.rutland, gregkh, mpa, devicetree, linux-doc, linux-kernel

On Wed, Apr 30, 2014 at 11:25:00AM -0700, Mark Brown wrote:
> On Wed, Apr 30, 2014 at 09:10:12AM +0200, Richard Cochran wrote:
> > Shouldn't this go to the arm list and rmk for review, too?
> 
> Is there any particular reason for including rmk?  It's generally not
> helpful to spam people with serieses without reason, we all get quite a
> lot of mail already...

I recall seeing him writing at length about cpu/peripheral endianness
issues, so I assume he has some expertise here. It would be a shame if
a new DT feature were overlooking something important.

Thanks,
Richard

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2014-05-01  3:44 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-04-30  4:43 [PATCHv3 0/2] add DT endianness binding support Xiubo Li
2014-04-30  4:43 ` [PATCHv3 1/2] dt/bindings: Add the DT binding documentation for endianness Xiubo Li
2014-04-30  4:43 ` [PATCHv3 2/2] regmap: add DT endianness binding support Xiubo Li
2014-04-30  6:56   ` Markus Pargmann
2014-04-30  7:10     ` Li.Xiubo
2014-04-30  7:10 ` [PATCHv3 0/2] " Richard Cochran
2014-04-30  7:14   ` Li.Xiubo
2014-04-30  9:26     ` Richard Cochran
2014-04-30 13:46     ` Richard Cochran
2014-04-30 18:25   ` Mark Brown
2014-05-01  3:43     ` Richard Cochran

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).