Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Andrew F. Davis and committed by
Mark Brown
9bf485c9 4fbd8d19

+8 -2
+3 -1
drivers/base/regmap/regmap.c
··· 769 769 INIT_LIST_HEAD(&map->async_free); 770 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 775 map->read_flag_mask = config->read_flag_mask; 774 776 map->write_flag_mask = config->write_flag_mask; 775 777 } else if (bus) {
+5 -1
include/linux/regmap.h
··· 296 296 * a read. 297 297 * @write_flag_mask: Mask to be set in the top bytes of the register when doing 298 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 303 * @use_single_rw: If set, converts the bulk read and write operations into 301 304 * a series of single read and write operations. This is useful 302 305 * for device that does not support bulk read and write. ··· 358 355 359 356 unsigned long read_flag_mask; 360 357 unsigned long write_flag_mask; 358 + bool zero_flag_mask; 361 359 362 360 bool use_single_rw; 363 361 bool can_multi_write;