Skip to content

Commit f785fb2

Browse files
committed
Merge remote-tracking branches 'regmap/topic/core' and 'regmap/topic/debugfs' into regmap-next
3 parents c8d2bc9 + 5556244 + 359a2f1 commit f785fb2

4 files changed

Lines changed: 71 additions & 22 deletions

File tree

drivers/base/regmap/internal.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ struct regmap {
105105

106106
bool defer_caching;
107107

108-
u8 read_flag_mask;
109-
u8 write_flag_mask;
108+
unsigned long read_flag_mask;
109+
unsigned long write_flag_mask;
110110

111111
/* number of bits to (left) shift the reg value when formatting*/
112112
int reg_shift;
@@ -173,6 +173,7 @@ struct regcache_ops {
173173
int (*drop)(struct regmap *map, unsigned int min, unsigned int max);
174174
};
175175

176+
bool regmap_cached(struct regmap *map, unsigned int reg);
176177
bool regmap_writeable(struct regmap *map, unsigned int reg);
177178
bool regmap_readable(struct regmap *map, unsigned int reg);
178179
bool regmap_volatile(struct regmap *map, unsigned int reg);

drivers/base/regmap/regmap-debugfs.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,17 @@ static void regmap_debugfs_free_dump_cache(struct regmap *map)
7777
}
7878
}
7979

80+
static bool regmap_printable(struct regmap *map, unsigned int reg)
81+
{
82+
if (regmap_precious(map, reg))
83+
return false;
84+
85+
if (!regmap_readable(map, reg) && !regmap_cached(map, reg))
86+
return false;
87+
88+
return true;
89+
}
90+
8091
/*
8192
* Work out where the start offset maps into register numbers, bearing
8293
* in mind that we suppress hidden registers.
@@ -105,8 +116,7 @@ static unsigned int regmap_debugfs_get_dump_start(struct regmap *map,
105116
if (list_empty(&map->debugfs_off_cache)) {
106117
for (; i <= map->max_register; i += map->reg_stride) {
107118
/* Skip unprinted registers, closing off cache entry */
108-
if (!regmap_readable(map, i) ||
109-
regmap_precious(map, i)) {
119+
if (!regmap_printable(map, i)) {
110120
if (c) {
111121
c->max = p - 1;
112122
c->max_reg = i - map->reg_stride;
@@ -204,7 +214,7 @@ static ssize_t regmap_read_debugfs(struct regmap *map, unsigned int from,
204214
start_reg = regmap_debugfs_get_dump_start(map, from, *ppos, &p);
205215

206216
for (i = start_reg; i <= to; i += map->reg_stride) {
207-
if (!regmap_readable(map, i))
217+
if (!regmap_readable(map, i) && !regmap_cached(map, i))
208218
continue;
209219

210220
if (regmap_precious(map, i))

drivers/base/regmap/regmap.c

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,29 @@ bool regmap_writeable(struct regmap *map, unsigned int reg)
9393
return true;
9494
}
9595

96+
bool regmap_cached(struct regmap *map, unsigned int reg)
97+
{
98+
int ret;
99+
unsigned int val;
100+
101+
if (map->cache == REGCACHE_NONE)
102+
return false;
103+
104+
if (!map->cache_ops)
105+
return false;
106+
107+
if (map->max_register && reg > map->max_register)
108+
return false;
109+
110+
map->lock(map->lock_arg);
111+
ret = regcache_read(map, reg, &val);
112+
map->unlock(map->lock_arg);
113+
if (ret)
114+
return false;
115+
116+
return true;
117+
}
118+
96119
bool regmap_readable(struct regmap *map, unsigned int reg)
97120
{
98121
if (!map->reg_read)
@@ -749,6 +772,9 @@ struct regmap *__regmap_init(struct device *dev,
749772
case REGMAP_ENDIAN_BIG:
750773
map->format.format_reg = regmap_format_16_be;
751774
break;
775+
case REGMAP_ENDIAN_LITTLE:
776+
map->format.format_reg = regmap_format_16_le;
777+
break;
752778
case REGMAP_ENDIAN_NATIVE:
753779
map->format.format_reg = regmap_format_16_native;
754780
break;
@@ -768,6 +794,9 @@ struct regmap *__regmap_init(struct device *dev,
768794
case REGMAP_ENDIAN_BIG:
769795
map->format.format_reg = regmap_format_32_be;
770796
break;
797+
case REGMAP_ENDIAN_LITTLE:
798+
map->format.format_reg = regmap_format_32_le;
799+
break;
771800
case REGMAP_ENDIAN_NATIVE:
772801
map->format.format_reg = regmap_format_32_native;
773802
break;
@@ -782,6 +811,9 @@ struct regmap *__regmap_init(struct device *dev,
782811
case REGMAP_ENDIAN_BIG:
783812
map->format.format_reg = regmap_format_64_be;
784813
break;
814+
case REGMAP_ENDIAN_LITTLE:
815+
map->format.format_reg = regmap_format_64_le;
816+
break;
785817
case REGMAP_ENDIAN_NATIVE:
786818
map->format.format_reg = regmap_format_64_native;
787819
break;
@@ -1296,12 +1328,26 @@ static int _regmap_select_page(struct regmap *map, unsigned int *reg,
12961328
return 0;
12971329
}
12981330

1331+
static void regmap_set_work_buf_flag_mask(struct regmap *map, int max_bytes,
1332+
unsigned long mask)
1333+
{
1334+
u8 *buf;
1335+
int i;
1336+
1337+
if (!mask || !map->work_buf)
1338+
return;
1339+
1340+
buf = map->work_buf;
1341+
1342+
for (i = 0; i < max_bytes; i++)
1343+
buf[i] |= (mask >> (8 * i)) & 0xff;
1344+
}
1345+
12991346
int _regmap_raw_write(struct regmap *map, unsigned int reg,
13001347
const void *val, size_t val_len)
13011348
{
13021349
struct regmap_range_node *range;
13031350
unsigned long flags;
1304-
u8 *u8 = map->work_buf;
13051351
void *work_val = map->work_buf + map->format.reg_bytes +
13061352
map->format.pad_bytes;
13071353
void *buf;
@@ -1370,8 +1416,8 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg,
13701416
}
13711417

13721418
map->format.format_reg(map->work_buf, reg, map->reg_shift);
1373-
1374-
u8[0] |= map->write_flag_mask;
1419+
regmap_set_work_buf_flag_mask(map, map->format.reg_bytes,
1420+
map->write_flag_mask);
13751421

13761422
/*
13771423
* Essentially all I/O mechanisms will be faster with a single
@@ -2251,7 +2297,6 @@ static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
22512297
unsigned int val_len)
22522298
{
22532299
struct regmap_range_node *range;
2254-
u8 *u8 = map->work_buf;
22552300
int ret;
22562301

22572302
WARN_ON(!map->bus);
@@ -2268,15 +2313,8 @@ static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
22682313
}
22692314

22702315
map->format.format_reg(map->work_buf, reg, map->reg_shift);
2271-
2272-
/*
2273-
* Some buses or devices flag reads by setting the high bits in the
2274-
* register address; since it's always the high bits for all
2275-
* current formats we can do this here rather than in
2276-
* formatting. This may break if we get interesting formats.
2277-
*/
2278-
u8[0] |= map->read_flag_mask;
2279-
2316+
regmap_set_work_buf_flag_mask(map, map->format.reg_bytes,
2317+
map->read_flag_mask);
22802318
trace_regmap_hw_read_start(map, reg, val_len / map->format.val_bytes);
22812319

22822320
ret = map->bus->read(map->bus_context, map->work_buf,

include/linux/regmap.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -241,9 +241,9 @@ typedef void (*regmap_unlock)(void *);
241241
* register cache support).
242242
* @num_reg_defaults: Number of elements in reg_defaults.
243243
*
244-
* @read_flag_mask: Mask to be set in the top byte of the register when doing
244+
* @read_flag_mask: Mask to be set in the top bytes of the register when doing
245245
* a read.
246-
* @write_flag_mask: Mask to be set in the top byte of the register when doing
246+
* @write_flag_mask: Mask to be set in the top bytes of the register when doing
247247
* a write. If both read_flag_mask and write_flag_mask are
248248
* empty the regmap_bus default masks are used.
249249
* @use_single_rw: If set, converts the bulk read and write operations into
@@ -299,8 +299,8 @@ struct regmap_config {
299299
const void *reg_defaults_raw;
300300
unsigned int num_reg_defaults_raw;
301301

302-
u8 read_flag_mask;
303-
u8 write_flag_mask;
302+
unsigned long read_flag_mask;
303+
unsigned long write_flag_mask;
304304

305305
bool use_single_rw;
306306
bool can_multi_write;

0 commit comments

Comments
 (0)