Skip to content

Commit 74d6694

Browse files
committed
Merge remote-tracking branch 'regmap/for-next' into sound/upstream-20220330
2 parents 2210a17 + c53d92b commit 74d6694

4 files changed

Lines changed: 28 additions & 17 deletions

File tree

drivers/base/regmap/internal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ struct regmap_format {
3131
size_t buf_size;
3232
size_t reg_bytes;
3333
size_t pad_bytes;
34+
size_t reg_downshift;
3435
size_t val_bytes;
3536
void (*format_write)(struct regmap *map,
3637
unsigned int reg, unsigned int val);
@@ -62,6 +63,7 @@ struct regmap {
6263
regmap_unlock unlock;
6364
void *lock_arg; /* This is passed to lock/unlock functions */
6465
gfp_t alloc_flags;
66+
unsigned int reg_base;
6567

6668
struct device *dev; /* Device we do I/O on */
6769
void *work_buf; /* Scratch buffer used to format I/O */

drivers/base/regmap/regmap-irq.c

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -189,11 +189,9 @@ static void regmap_irq_sync_unlock(struct irq_data *data)
189189
ret = regmap_write(map, reg, d->mask_buf[i]);
190190
if (d->chip->clear_ack) {
191191
if (d->chip->ack_invert && !ret)
192-
ret = regmap_write(map, reg,
193-
d->mask_buf[i]);
192+
ret = regmap_write(map, reg, UINT_MAX);
194193
else if (!ret)
195-
ret = regmap_write(map, reg,
196-
~d->mask_buf[i]);
194+
ret = regmap_write(map, reg, 0);
197195
}
198196
if (ret != 0)
199197
dev_err(d->map->dev, "Failed to ack 0x%x: %d\n",
@@ -537,7 +535,7 @@ static irqreturn_t regmap_irq_thread(int irq, void *d)
537535

538536
/*
539537
* Ignore masked IRQs and ack if we need to; we ack early so
540-
* there is no race between handling and acknowleding the
538+
* there is no race between handling and acknowledging the
541539
* interrupt. We assume that typically few of the interrupts
542540
* will fire simultaneously so don't worry about overhead from
543541
* doing a write per register.
@@ -556,11 +554,9 @@ static irqreturn_t regmap_irq_thread(int irq, void *d)
556554
data->status_buf[i]);
557555
if (chip->clear_ack) {
558556
if (chip->ack_invert && !ret)
559-
ret = regmap_write(map, reg,
560-
data->status_buf[i]);
557+
ret = regmap_write(map, reg, UINT_MAX);
561558
else if (!ret)
562-
ret = regmap_write(map, reg,
563-
~data->status_buf[i]);
559+
ret = regmap_write(map, reg, 0);
564560
}
565561
if (ret != 0)
566562
dev_err(map->dev, "Failed to ack 0x%x: %d\n",
@@ -817,13 +813,9 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode,
817813
d->status_buf[i] & d->mask_buf[i]);
818814
if (chip->clear_ack) {
819815
if (chip->ack_invert && !ret)
820-
ret = regmap_write(map, reg,
821-
(d->status_buf[i] &
822-
d->mask_buf[i]));
816+
ret = regmap_write(map, reg, UINT_MAX);
823817
else if (!ret)
824-
ret = regmap_write(map, reg,
825-
~(d->status_buf[i] &
826-
d->mask_buf[i]));
818+
ret = regmap_write(map, reg, 0);
827819
}
828820
if (ret != 0) {
829821
dev_err(map->dev, "Failed to ack 0x%x: %d\n",
@@ -1053,7 +1045,7 @@ int devm_regmap_add_irq_chip_fwnode(struct device *dev,
10531045
EXPORT_SYMBOL_GPL(devm_regmap_add_irq_chip_fwnode);
10541046

10551047
/**
1056-
* devm_regmap_add_irq_chip() - Resource manager regmap_add_irq_chip()
1048+
* devm_regmap_add_irq_chip() - Resource managed regmap_add_irq_chip()
10571049
*
10581050
* @dev: The device pointer on which irq_chip belongs to.
10591051
* @map: The regmap for the device.
@@ -1082,7 +1074,7 @@ EXPORT_SYMBOL_GPL(devm_regmap_add_irq_chip);
10821074
/**
10831075
* devm_regmap_del_irq_chip() - Resource managed regmap_del_irq_chip()
10841076
*
1085-
* @dev: Device for which which resource was allocated.
1077+
* @dev: Device for which the resource was allocated.
10861078
* @irq: Primary IRQ for the device.
10871079
* @data: &regmap_irq_chip_data allocated by regmap_add_irq_chip().
10881080
*

drivers/base/regmap/regmap.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -821,8 +821,11 @@ struct regmap *__regmap_init(struct device *dev,
821821
else
822822
map->alloc_flags = GFP_KERNEL;
823823

824+
map->reg_base = config->reg_base;
825+
824826
map->format.reg_bytes = DIV_ROUND_UP(config->reg_bits, 8);
825827
map->format.pad_bytes = config->pad_bits / 8;
828+
map->format.reg_downshift = config->reg_downshift;
826829
map->format.val_bytes = DIV_ROUND_UP(config->val_bits, 8);
827830
map->format.buf_size = DIV_ROUND_UP(config->reg_bits +
828831
config->val_bits + config->pad_bits, 8);
@@ -1735,6 +1738,8 @@ static int _regmap_raw_write_impl(struct regmap *map, unsigned int reg,
17351738
return ret;
17361739
}
17371740

1741+
reg += map->reg_base;
1742+
reg >>= map->format.reg_downshift;
17381743
map->format.format_reg(map->work_buf, reg, map->reg_shift);
17391744
regmap_set_work_buf_flag_mask(map, map->format.reg_bytes,
17401745
map->write_flag_mask);
@@ -1905,6 +1910,8 @@ static int _regmap_bus_formatted_write(void *context, unsigned int reg,
19051910
return ret;
19061911
}
19071912

1913+
reg += map->reg_base;
1914+
reg >>= map->format.reg_downshift;
19081915
map->format.format_write(map, reg, val);
19091916

19101917
trace_regmap_hw_write_start(map, reg, 1);
@@ -2346,6 +2353,8 @@ static int _regmap_raw_multi_reg_write(struct regmap *map,
23462353
unsigned int reg = regs[i].reg;
23472354
unsigned int val = regs[i].def;
23482355
trace_regmap_hw_write_start(map, reg, 1);
2356+
reg += map->reg_base;
2357+
reg >>= map->format.reg_downshift;
23492358
map->format.format_reg(u8, reg, map->reg_shift);
23502359
u8 += reg_bytes + pad_bytes;
23512360
map->format.format_val(u8, val, 0);
@@ -2673,6 +2682,8 @@ static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
26732682
return ret;
26742683
}
26752684

2685+
reg += map->reg_base;
2686+
reg >>= map->format.reg_downshift;
26762687
map->format.format_reg(map->work_buf, reg, map->reg_shift);
26772688
regmap_set_work_buf_flag_mask(map, map->format.reg_bytes,
26782689
map->read_flag_mask);

include/linux/regmap.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,10 @@ typedef void (*regmap_unlock)(void *);
237237
* @reg_stride: The register address stride. Valid register addresses are a
238238
* multiple of this value. If set to 0, a value of 1 will be
239239
* used.
240+
* @reg_downshift: The number of bits to downshift the register before
241+
* performing any operations.
242+
* @reg_base: Value to be added to every register address before performing any
243+
* operation.
240244
* @pad_bits: Number of bits of padding between register and value.
241245
* @val_bits: Number of bits in a register value, mandatory.
242246
*
@@ -360,6 +364,8 @@ struct regmap_config {
360364

361365
int reg_bits;
362366
int reg_stride;
367+
int reg_downshift;
368+
unsigned int reg_base;
363369
int pad_bits;
364370
int val_bits;
365371

0 commit comments

Comments
 (0)