regmap: implement LE formatting/parsing for 16/32-bit values.
Allow busses to request little endianness formatting and parsing for 16- and 32-bit values. This will be useful to support regmap-mmio. For the following the scenarios using the regmap-mmio, for example: Index CPU Device Endianess flag for values ---------------------------------------------------------- 1 LE LE REGMAP_ENDIAN_DEFAULT/NATIVE 2 LE BE REGMAP_ENDIAN_BIG 3 BE BE REGMAP_ENDIAN_DEFAULT/NATIVE 4 BE LE REGMAP_ENDIAN_LITTLE For one device driver, which will support all the cases above, needs two boolean properties in DT node like: 'big-endian' for case 2 and 'little-endian' for case 4, and for cases 1 and 3 they all will be absent. Signed-off-by: Xiubo Li <Li.Xiubo@freescale.com> Signed-off-by: Mark Brown <broonie@linaro.org>
This commit is contained in:
parent
c9eaa447e7
commit
4aa8c0694c
1 changed files with 52 additions and 0 deletions
|
@ -192,6 +192,13 @@ static void regmap_format_16_be(void *buf, unsigned int val, unsigned int shift)
|
|||
b[0] = cpu_to_be16(val << shift);
|
||||
}
|
||||
|
||||
static void regmap_format_16_le(void *buf, unsigned int val, unsigned int shift)
|
||||
{
|
||||
__le16 *b = buf;
|
||||
|
||||
b[0] = cpu_to_le16(val << shift);
|
||||
}
|
||||
|
||||
static void regmap_format_16_native(void *buf, unsigned int val,
|
||||
unsigned int shift)
|
||||
{
|
||||
|
@ -216,6 +223,13 @@ static void regmap_format_32_be(void *buf, unsigned int val, unsigned int shift)
|
|||
b[0] = cpu_to_be32(val << shift);
|
||||
}
|
||||
|
||||
static void regmap_format_32_le(void *buf, unsigned int val, unsigned int shift)
|
||||
{
|
||||
__le32 *b = buf;
|
||||
|
||||
b[0] = cpu_to_le32(val << shift);
|
||||
}
|
||||
|
||||
static void regmap_format_32_native(void *buf, unsigned int val,
|
||||
unsigned int shift)
|
||||
{
|
||||
|
@ -240,6 +254,13 @@ static unsigned int regmap_parse_16_be(const void *buf)
|
|||
return be16_to_cpu(b[0]);
|
||||
}
|
||||
|
||||
static unsigned int regmap_parse_16_le(const void *buf)
|
||||
{
|
||||
const __le16 *b = buf;
|
||||
|
||||
return le16_to_cpu(b[0]);
|
||||
}
|
||||
|
||||
static void regmap_parse_16_be_inplace(void *buf)
|
||||
{
|
||||
__be16 *b = buf;
|
||||
|
@ -247,6 +268,13 @@ static void regmap_parse_16_be_inplace(void *buf)
|
|||
b[0] = be16_to_cpu(b[0]);
|
||||
}
|
||||
|
||||
static void regmap_parse_16_le_inplace(void *buf)
|
||||
{
|
||||
__le16 *b = buf;
|
||||
|
||||
b[0] = le16_to_cpu(b[0]);
|
||||
}
|
||||
|
||||
static unsigned int regmap_parse_16_native(const void *buf)
|
||||
{
|
||||
return *(u16 *)buf;
|
||||
|
@ -269,6 +297,13 @@ static unsigned int regmap_parse_32_be(const void *buf)
|
|||
return be32_to_cpu(b[0]);
|
||||
}
|
||||
|
||||
static unsigned int regmap_parse_32_le(const void *buf)
|
||||
{
|
||||
const __le32 *b = buf;
|
||||
|
||||
return le32_to_cpu(b[0]);
|
||||
}
|
||||
|
||||
static void regmap_parse_32_be_inplace(void *buf)
|
||||
{
|
||||
__be32 *b = buf;
|
||||
|
@ -276,6 +311,13 @@ static void regmap_parse_32_be_inplace(void *buf)
|
|||
b[0] = be32_to_cpu(b[0]);
|
||||
}
|
||||
|
||||
static void regmap_parse_32_le_inplace(void *buf)
|
||||
{
|
||||
__le32 *b = buf;
|
||||
|
||||
b[0] = le32_to_cpu(b[0]);
|
||||
}
|
||||
|
||||
static unsigned int regmap_parse_32_native(const void *buf)
|
||||
{
|
||||
return *(u32 *)buf;
|
||||
|
@ -608,6 +650,11 @@ struct regmap *regmap_init(struct device *dev,
|
|||
map->format.parse_val = regmap_parse_16_be;
|
||||
map->format.parse_inplace = regmap_parse_16_be_inplace;
|
||||
break;
|
||||
case REGMAP_ENDIAN_LITTLE:
|
||||
map->format.format_val = regmap_format_16_le;
|
||||
map->format.parse_val = regmap_parse_16_le;
|
||||
map->format.parse_inplace = regmap_parse_16_le_inplace;
|
||||
break;
|
||||
case REGMAP_ENDIAN_NATIVE:
|
||||
map->format.format_val = regmap_format_16_native;
|
||||
map->format.parse_val = regmap_parse_16_native;
|
||||
|
@ -629,6 +676,11 @@ struct regmap *regmap_init(struct device *dev,
|
|||
map->format.parse_val = regmap_parse_32_be;
|
||||
map->format.parse_inplace = regmap_parse_32_be_inplace;
|
||||
break;
|
||||
case REGMAP_ENDIAN_LITTLE:
|
||||
map->format.format_val = regmap_format_32_le;
|
||||
map->format.parse_val = regmap_parse_32_le;
|
||||
map->format.parse_inplace = regmap_parse_32_le_inplace;
|
||||
break;
|
||||
case REGMAP_ENDIAN_NATIVE:
|
||||
map->format.format_val = regmap_format_32_native;
|
||||
map->format.parse_val = regmap_parse_32_native;
|
||||
|
|
Loading…
Reference in a new issue