Merge remote-tracking branches 'regmap/fix/be', 'regmap/fix/doc' and 'regmap/fix/spmi' into regmap-linus

This commit is contained in:
Mark Brown 2016-05-13 10:36:10 +01:00
commit 2a2cd52190
4 changed files with 25 additions and 43 deletions

View file

@ -1,50 +1,29 @@
Device-Tree binding for regmap Devicetree binding for regmap
The endianness mode of CPU & Device scenarios:
Index Device Endianness properties
---------------------------------------------------
1 BE 'big-endian'
2 LE 'little-endian'
3 Native 'native-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.
Optional properties: Optional properties:
- {big,little,native}-endian: these are boolean properties, if absent
then the implementation will choose a default based on the device little-endian,
being controlled. These properties are for register values and all big-endian,
the buffers only. Native endian means that the CPU and device have native-endian: See common-properties.txt for a definition
the same endianness.
Note:
Regmap defaults to little-endian register access on MMIO based
devices, this is by far the most common setting. On CPU
architectures that typically run big-endian operating systems
(e.g. PowerPC), registers can be defined as big-endian and must
be marked that way in the devicetree.
On SoCs that can be operated in both big-endian and little-endian
modes, with a single hardware switch controlling both the endianess
of the CPU and a byteswap for MMIO registers (e.g. many Broadcom MIPS
chips), "native-endian" is used to allow using the same device tree
blob in both cases.
Examples: Examples:
Scenario 1 : CPU in LE mode & device in LE mode. Scenario 1 : a register set in big-endian mode.
dev: dev@40031000 { dev: dev@40031000 {
compatible = "name"; compatible = "syscon";
reg = <0x40031000 0x1000>; reg = <0x40031000 0x1000>;
...
};
Scenario 2 : CPU in LE mode & device in BE mode.
dev: dev@40031000 {
compatible = "name";
reg = <0x40031000 0x1000>;
...
big-endian; 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;
};

View file

@ -13,6 +13,7 @@
#ifndef _REGMAP_INTERNAL_H #ifndef _REGMAP_INTERNAL_H
#define _REGMAP_INTERNAL_H #define _REGMAP_INTERNAL_H
#include <linux/device.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/list.h> #include <linux/list.h>

View file

@ -23,6 +23,8 @@
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/slab.h> #include <linux/slab.h>
#include "internal.h"
struct regmap_mmio_context { struct regmap_mmio_context {
void __iomem *regs; void __iomem *regs;
unsigned val_bytes; unsigned val_bytes;
@ -246,7 +248,7 @@ static struct regmap_mmio_context *regmap_mmio_gen_context(struct device *dev,
ctx->val_bytes = config->val_bits / 8; ctx->val_bytes = config->val_bits / 8;
ctx->clk = ERR_PTR(-ENODEV); ctx->clk = ERR_PTR(-ENODEV);
switch (config->reg_format_endian) { switch (regmap_get_val_endian(dev, &regmap_mmio, config)) {
case REGMAP_ENDIAN_DEFAULT: case REGMAP_ENDIAN_DEFAULT:
case REGMAP_ENDIAN_LITTLE: case REGMAP_ENDIAN_LITTLE:
#ifdef __LITTLE_ENDIAN #ifdef __LITTLE_ENDIAN

View file

@ -142,7 +142,7 @@ static int regmap_spmi_ext_read(void *context,
while (val_size) { while (val_size) {
len = min_t(size_t, val_size, 8); len = min_t(size_t, val_size, 8);
err = spmi_ext_register_readl(context, addr, val, val_size); err = spmi_ext_register_readl(context, addr, val, len);
if (err) if (err)
goto err_out; goto err_out;