aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew F. Davis <afd@ti.com>2018-01-07 18:19:09 -0500
committerMark Brown <broonie@kernel.org>2018-01-08 07:15:04 -0500
commit9bf485c955bcb707a5e679bcc74075deb0bc8531 (patch)
tree5d56a0e7983f8c374e250921fb3a7c11bceeb643
parent4fbd8d194f06c8a3fd2af1ce560ddb31f7ec8323 (diff)
regmap: Allow empty read/write_flag_mask
All zero read and write masks in the regmap config are used to signal no special mask is needed and the bus defaults are used. In some devices all zero read/write masks are the special mask and bus defaults should not be used. To signal this a new variable is added. For example SPI often sets bit 7 in address to signal to the device a read is requested. On TI AFE44xx parts with SPI interfaces no bit needs to be set as registers are either read or write only and the operation can be determined from the address only. For this case both masks must be zero to not effect the address. Signed-off-by: Andrew F. Davis <afd@ti.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--drivers/base/regmap/regmap.c4
-rw-r--r--include/linux/regmap.h6
2 files changed, 8 insertions, 2 deletions
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index 8d516a9bfc01..025c62358bd6 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -769,7 +769,9 @@ struct regmap *__regmap_init(struct device *dev,
769 INIT_LIST_HEAD(&map->async_free); 769 INIT_LIST_HEAD(&map->async_free);
770 init_waitqueue_head(&map->async_waitq); 770 init_waitqueue_head(&map->async_waitq);
771 771
772 if (config->read_flag_mask || config->write_flag_mask) { 772 if (config->read_flag_mask ||
773 config->write_flag_mask ||
774 config->zero_flag_mask) {
773 map->read_flag_mask = config->read_flag_mask; 775 map->read_flag_mask = config->read_flag_mask;
774 map->write_flag_mask = config->write_flag_mask; 776 map->write_flag_mask = config->write_flag_mask;
775 } else if (bus) { 777 } else if (bus) {
diff --git a/include/linux/regmap.h b/include/linux/regmap.h
index 15eddc1353ba..f8bff272c429 100644
--- a/include/linux/regmap.h
+++ b/include/linux/regmap.h
@@ -296,7 +296,10 @@ typedef void (*regmap_unlock)(void *);
296 * a read. 296 * a read.
297 * @write_flag_mask: Mask to be set in the top bytes of the register when doing 297 * @write_flag_mask: Mask to be set in the top bytes of the register when doing
298 * a write. If both read_flag_mask and write_flag_mask are 298 * a write. If both read_flag_mask and write_flag_mask are
299 * empty the regmap_bus default masks are used. 299 * empty and zero_flag_mask is not set the regmap_bus default
300 * masks are used.
301 * @zero_flag_mask: If set, read_flag_mask and write_flag_mask are used even
302 * if they are both empty.
300 * @use_single_rw: If set, converts the bulk read and write operations into 303 * @use_single_rw: If set, converts the bulk read and write operations into
301 * a series of single read and write operations. This is useful 304 * a series of single read and write operations. This is useful
302 * for device that does not support bulk read and write. 305 * for device that does not support bulk read and write.
@@ -355,6 +358,7 @@ struct regmap_config {
355 358
356 unsigned long read_flag_mask; 359 unsigned long read_flag_mask;
357 unsigned long write_flag_mask; 360 unsigned long write_flag_mask;
361 bool zero_flag_mask;
358 362
359 bool use_single_rw; 363 bool use_single_rw;
360 bool can_multi_write; 364 bool can_multi_write;