regmap: Split use_single_rw internally into use_single_read/write
use_single_rw currently reflects the capabilities of the connected device. The capabilities of the bus are currently missing for this variable. As there are read only and write only buses we need seperate values for use_single_rw to also reflect tha capabilities of the bus. This patch splits use_single_rw into use_single_read and use_single_write. The initialization is changed to check the configuration for use_single_rw and to check the capabilities of the used bus. Signed-off-by: Markus Pargmann <mpa@pengutronix.de> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
committed by
Mark Brown
parent
c594b7f21d
commit
67921a1a66
@ -139,8 +139,10 @@ struct regmap {
|
|||||||
struct reg_default *patch;
|
struct reg_default *patch;
|
||||||
int patch_regs;
|
int patch_regs;
|
||||||
|
|
||||||
/* if set, converts bulk rw to single rw */
|
/* if set, converts bulk read to single read */
|
||||||
bool use_single_rw;
|
bool use_single_read;
|
||||||
|
/* if set, converts bulk read to single read */
|
||||||
|
bool use_single_write;
|
||||||
/* if set, the device supports multi write mode */
|
/* if set, the device supports multi write mode */
|
||||||
bool can_multi_write;
|
bool can_multi_write;
|
||||||
|
|
||||||
|
@ -729,7 +729,7 @@ int regcache_sync_block(struct regmap *map, void *block,
|
|||||||
unsigned int block_base, unsigned int start,
|
unsigned int block_base, unsigned int start,
|
||||||
unsigned int end)
|
unsigned int end)
|
||||||
{
|
{
|
||||||
if (regmap_can_raw_write(map) && !map->use_single_rw)
|
if (regmap_can_raw_write(map) && !map->use_single_write)
|
||||||
return regcache_sync_block_raw(map, block, cache_present,
|
return regcache_sync_block_raw(map, block, cache_present,
|
||||||
block_base, start, end);
|
block_base, start, end);
|
||||||
else
|
else
|
||||||
|
@ -209,7 +209,7 @@ static irqreturn_t regmap_irq_thread(int irq, void *d)
|
|||||||
* Read in the statuses, using a single bulk read if possible
|
* Read in the statuses, using a single bulk read if possible
|
||||||
* in order to reduce the I/O overheads.
|
* in order to reduce the I/O overheads.
|
||||||
*/
|
*/
|
||||||
if (!map->use_single_rw && map->reg_stride == 1 &&
|
if (!map->use_single_read && map->reg_stride == 1 &&
|
||||||
data->irq_reg_stride == 1) {
|
data->irq_reg_stride == 1) {
|
||||||
u8 *buf8 = data->status_reg_buf;
|
u8 *buf8 = data->status_reg_buf;
|
||||||
u16 *buf16 = data->status_reg_buf;
|
u16 *buf16 = data->status_reg_buf;
|
||||||
@ -398,7 +398,7 @@ int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
|
|||||||
else
|
else
|
||||||
d->irq_reg_stride = 1;
|
d->irq_reg_stride = 1;
|
||||||
|
|
||||||
if (!map->use_single_rw && map->reg_stride == 1 &&
|
if (!map->use_single_read && map->reg_stride == 1 &&
|
||||||
d->irq_reg_stride == 1) {
|
d->irq_reg_stride == 1) {
|
||||||
d->status_reg_buf = kmalloc(map->format.val_bytes *
|
d->status_reg_buf = kmalloc(map->format.val_bytes *
|
||||||
chip->num_regs, GFP_KERNEL);
|
chip->num_regs, GFP_KERNEL);
|
||||||
|
@ -576,7 +576,8 @@ struct regmap *regmap_init(struct device *dev,
|
|||||||
map->reg_stride = config->reg_stride;
|
map->reg_stride = config->reg_stride;
|
||||||
else
|
else
|
||||||
map->reg_stride = 1;
|
map->reg_stride = 1;
|
||||||
map->use_single_rw = config->use_single_rw;
|
map->use_single_read = config->use_single_rw || !bus || !bus->read;
|
||||||
|
map->use_single_write = config->use_single_rw || !bus || !bus->write;
|
||||||
map->can_multi_write = config->can_multi_write;
|
map->can_multi_write = config->can_multi_write;
|
||||||
map->dev = dev;
|
map->dev = dev;
|
||||||
map->bus = bus;
|
map->bus = bus;
|
||||||
@ -766,7 +767,7 @@ struct regmap *regmap_init(struct device *dev,
|
|||||||
if ((reg_endian != REGMAP_ENDIAN_BIG) ||
|
if ((reg_endian != REGMAP_ENDIAN_BIG) ||
|
||||||
(val_endian != REGMAP_ENDIAN_BIG))
|
(val_endian != REGMAP_ENDIAN_BIG))
|
||||||
goto err_map;
|
goto err_map;
|
||||||
map->use_single_rw = true;
|
map->use_single_write = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!map->format.format_write &&
|
if (!map->format.format_write &&
|
||||||
@ -1720,7 +1721,7 @@ int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
|
|||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
map->unlock(map->lock_arg);
|
map->unlock(map->lock_arg);
|
||||||
} else if (map->use_single_rw) {
|
} else if (map->use_single_write) {
|
||||||
map->lock(map->lock_arg);
|
map->lock(map->lock_arg);
|
||||||
for (i = 0; i < val_count; i++) {
|
for (i = 0; i < val_count; i++) {
|
||||||
ret = _regmap_raw_write(map,
|
ret = _regmap_raw_write(map,
|
||||||
@ -2312,7 +2313,7 @@ int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
|
|||||||
* Some devices does not support bulk read, for
|
* Some devices does not support bulk read, for
|
||||||
* them we have a series of single read operations.
|
* them we have a series of single read operations.
|
||||||
*/
|
*/
|
||||||
if (map->use_single_rw) {
|
if (map->use_single_read) {
|
||||||
for (i = 0; i < val_count; i++) {
|
for (i = 0; i < val_count; i++) {
|
||||||
ret = regmap_raw_read(map,
|
ret = regmap_raw_read(map,
|
||||||
reg + (i * map->reg_stride),
|
reg + (i * map->reg_stride),
|
||||||
|
Reference in New Issue
Block a user