|
@@ -35,10 +35,14 @@ static int _regmap_update_bits(struct regmap *map, unsigned int reg,
|
|
|
unsigned int mask, unsigned int val,
|
|
|
bool *change);
|
|
|
|
|
|
+static int _regmap_bus_reg_read(void *context, unsigned int reg,
|
|
|
+ unsigned int *val);
|
|
|
static int _regmap_bus_read(void *context, unsigned int reg,
|
|
|
unsigned int *val);
|
|
|
static int _regmap_bus_formatted_write(void *context, unsigned int reg,
|
|
|
unsigned int val);
|
|
|
+static int _regmap_bus_reg_write(void *context, unsigned int reg,
|
|
|
+ unsigned int val);
|
|
|
static int _regmap_bus_raw_write(void *context, unsigned int reg,
|
|
|
unsigned int val);
|
|
|
|
|
@@ -192,6 +196,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 +227,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 +258,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 +272,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 +301,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 +315,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;
|
|
@@ -493,6 +539,12 @@ struct regmap *regmap_init(struct device *dev,
|
|
|
map->reg_read = config->reg_read;
|
|
|
map->reg_write = config->reg_write;
|
|
|
|
|
|
+ map->defer_caching = false;
|
|
|
+ goto skip_format_initialization;
|
|
|
+ } else if (!bus->read || !bus->write) {
|
|
|
+ map->reg_read = _regmap_bus_reg_read;
|
|
|
+ map->reg_write = _regmap_bus_reg_write;
|
|
|
+
|
|
|
map->defer_caching = false;
|
|
|
goto skip_format_initialization;
|
|
|
} else {
|
|
@@ -608,6 +660,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 +686,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;
|
|
@@ -1284,6 +1346,14 @@ static int _regmap_bus_formatted_write(void *context, unsigned int reg,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static int _regmap_bus_reg_write(void *context, unsigned int reg,
|
|
|
+ unsigned int val)
|
|
|
+{
|
|
|
+ struct regmap *map = context;
|
|
|
+
|
|
|
+ return map->bus->reg_write(map->bus_context, reg, val);
|
|
|
+}
|
|
|
+
|
|
|
static int _regmap_bus_raw_write(void *context, unsigned int reg,
|
|
|
unsigned int val)
|
|
|
{
|
|
@@ -1615,6 +1685,9 @@ static int _regmap_raw_multi_reg_write(struct regmap *map,
|
|
|
size_t pair_size = reg_bytes + pad_bytes + val_bytes;
|
|
|
size_t len = pair_size * num_regs;
|
|
|
|
|
|
+ if (!len)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
buf = kzalloc(len, GFP_KERNEL);
|
|
|
if (!buf)
|
|
|
return -ENOMEM;
|
|
@@ -1662,7 +1735,7 @@ static int _regmap_range_multi_paged_reg_write(struct regmap *map,
|
|
|
int ret;
|
|
|
int i, n;
|
|
|
struct reg_default *base;
|
|
|
- unsigned int this_page;
|
|
|
+ unsigned int this_page = 0;
|
|
|
/*
|
|
|
* the set of registers are not neccessarily in order, but
|
|
|
* since the order of write must be preserved this algorithm
|
|
@@ -1925,6 +1998,14 @@ static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static int _regmap_bus_reg_read(void *context, unsigned int reg,
|
|
|
+ unsigned int *val)
|
|
|
+{
|
|
|
+ struct regmap *map = context;
|
|
|
+
|
|
|
+ return map->bus->reg_read(map->bus_context, reg, val);
|
|
|
+}
|
|
|
+
|
|
|
static int _regmap_bus_read(void *context, unsigned int reg,
|
|
|
unsigned int *val)
|
|
|
{
|