diff options
| -rw-r--r-- | drivers/base/regmap/internal.h | 4 | ||||
| -rw-r--r-- | drivers/base/regmap/regmap.c | 32 | ||||
| -rw-r--r-- | include/linux/regmap.h | 8 |
3 files changed, 25 insertions, 19 deletions
diff --git a/drivers/base/regmap/internal.h b/drivers/base/regmap/internal.h index a0380338946a..6636f03ac2da 100644 --- a/drivers/base/regmap/internal.h +++ b/drivers/base/regmap/internal.h | |||
| @@ -105,8 +105,8 @@ struct regmap { | |||
| 105 | 105 | ||
| 106 | bool defer_caching; | 106 | bool defer_caching; |
| 107 | 107 | ||
| 108 | u8 read_flag_mask; | 108 | unsigned long read_flag_mask; |
| 109 | u8 write_flag_mask; | 109 | unsigned long write_flag_mask; |
| 110 | 110 | ||
| 111 | /* number of bits to (left) shift the reg value when formatting*/ | 111 | /* number of bits to (left) shift the reg value when formatting*/ |
| 112 | int reg_shift; | 112 | int reg_shift; |
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 51fa7d66a393..a6a5236b6c8d 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c | |||
| @@ -1296,12 +1296,26 @@ static int _regmap_select_page(struct regmap *map, unsigned int *reg, | |||
| 1296 | return 0; | 1296 | return 0; |
| 1297 | } | 1297 | } |
| 1298 | 1298 | ||
| 1299 | static void regmap_set_work_buf_flag_mask(struct regmap *map, int max_bytes, | ||
| 1300 | unsigned long mask) | ||
| 1301 | { | ||
| 1302 | u8 *buf; | ||
| 1303 | int i; | ||
| 1304 | |||
| 1305 | if (!mask || !map->work_buf) | ||
| 1306 | return; | ||
| 1307 | |||
| 1308 | buf = map->work_buf; | ||
| 1309 | |||
| 1310 | for (i = 0; i < max_bytes; i++) | ||
| 1311 | buf[i] |= (mask >> (8 * i)) & 0xff; | ||
| 1312 | } | ||
| 1313 | |||
| 1299 | int _regmap_raw_write(struct regmap *map, unsigned int reg, | 1314 | int _regmap_raw_write(struct regmap *map, unsigned int reg, |
| 1300 | const void *val, size_t val_len) | 1315 | const void *val, size_t val_len) |
| 1301 | { | 1316 | { |
| 1302 | struct regmap_range_node *range; | 1317 | struct regmap_range_node *range; |
| 1303 | unsigned long flags; | 1318 | unsigned long flags; |
| 1304 | u8 *u8 = map->work_buf; | ||
| 1305 | void *work_val = map->work_buf + map->format.reg_bytes + | 1319 | void *work_val = map->work_buf + map->format.reg_bytes + |
| 1306 | map->format.pad_bytes; | 1320 | map->format.pad_bytes; |
| 1307 | void *buf; | 1321 | void *buf; |
| @@ -1370,8 +1384,8 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg, | |||
| 1370 | } | 1384 | } |
| 1371 | 1385 | ||
| 1372 | map->format.format_reg(map->work_buf, reg, map->reg_shift); | 1386 | map->format.format_reg(map->work_buf, reg, map->reg_shift); |
| 1373 | 1387 | regmap_set_work_buf_flag_mask(map, map->format.reg_bytes, | |
| 1374 | u8[0] |= map->write_flag_mask; | 1388 | map->write_flag_mask); |
| 1375 | 1389 | ||
| 1376 | /* | 1390 | /* |
| 1377 | * Essentially all I/O mechanisms will be faster with a single | 1391 | * Essentially all I/O mechanisms will be faster with a single |
| @@ -2245,7 +2259,6 @@ static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val, | |||
| 2245 | unsigned int val_len) | 2259 | unsigned int val_len) |
| 2246 | { | 2260 | { |
| 2247 | struct regmap_range_node *range; | 2261 | struct regmap_range_node *range; |
| 2248 | u8 *u8 = map->work_buf; | ||
| 2249 | int ret; | 2262 | int ret; |
| 2250 | 2263 | ||
| 2251 | WARN_ON(!map->bus); | 2264 | WARN_ON(!map->bus); |
| @@ -2262,15 +2275,8 @@ static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val, | |||
| 2262 | } | 2275 | } |
| 2263 | 2276 | ||
| 2264 | map->format.format_reg(map->work_buf, reg, map->reg_shift); | 2277 | map->format.format_reg(map->work_buf, reg, map->reg_shift); |
| 2265 | 2278 | regmap_set_work_buf_flag_mask(map, map->format.reg_bytes, | |
| 2266 | /* | 2279 | map->read_flag_mask); |
| 2267 | * Some buses or devices flag reads by setting the high bits in the | ||
| 2268 | * register address; since it's always the high bits for all | ||
| 2269 | * current formats we can do this here rather than in | ||
| 2270 | * formatting. This may break if we get interesting formats. | ||
| 2271 | */ | ||
| 2272 | u8[0] |= map->read_flag_mask; | ||
| 2273 | |||
| 2274 | trace_regmap_hw_read_start(map, reg, val_len / map->format.val_bytes); | 2280 | trace_regmap_hw_read_start(map, reg, val_len / map->format.val_bytes); |
| 2275 | 2281 | ||
| 2276 | ret = map->bus->read(map->bus_context, map->work_buf, | 2282 | ret = map->bus->read(map->bus_context, map->work_buf, |
diff --git a/include/linux/regmap.h b/include/linux/regmap.h index 2c12cc5af744..9adc7b21903d 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h | |||
| @@ -241,9 +241,9 @@ typedef void (*regmap_unlock)(void *); | |||
| 241 | * register cache support). | 241 | * register cache support). |
| 242 | * @num_reg_defaults: Number of elements in reg_defaults. | 242 | * @num_reg_defaults: Number of elements in reg_defaults. |
| 243 | * | 243 | * |
| 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 |
| 245 | * a read. | 245 | * 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 |
| 247 | * a write. If both read_flag_mask and write_flag_mask are | 247 | * a write. If both read_flag_mask and write_flag_mask are |
| 248 | * empty the regmap_bus default masks are used. | 248 | * empty the regmap_bus default masks are used. |
| 249 | * @use_single_rw: If set, converts the bulk read and write operations into | 249 | * @use_single_rw: If set, converts the bulk read and write operations into |
| @@ -299,8 +299,8 @@ struct regmap_config { | |||
| 299 | const void *reg_defaults_raw; | 299 | const void *reg_defaults_raw; |
| 300 | unsigned int num_reg_defaults_raw; | 300 | unsigned int num_reg_defaults_raw; |
| 301 | 301 | ||
| 302 | u8 read_flag_mask; | 302 | unsigned long read_flag_mask; |
| 303 | u8 write_flag_mask; | 303 | unsigned long write_flag_mask; |
| 304 | 304 | ||
| 305 | bool use_single_rw; | 305 | bool use_single_rw; |
| 306 | bool can_multi_write; | 306 | bool can_multi_write; |
