Skip to content

Commit c53d92b

Browse files
committed
Merge remote-tracking branch 'regmap/for-5.18' into regmap-next
2 parents 7dd5ab0 + 0074f3f commit c53d92b

4 files changed

Lines changed: 22 additions & 3 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: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,7 @@ static irqreturn_t regmap_irq_thread(int irq, void *d)
535535

536536
/*
537537
* Ignore masked IRQs and ack if we need to; we ack early so
538-
* there is no race between handling and acknowleding the
538+
* there is no race between handling and acknowledging the
539539
* interrupt. We assume that typically few of the interrupts
540540
* will fire simultaneously so don't worry about overhead from
541541
* doing a write per register.
@@ -1045,7 +1045,7 @@ int devm_regmap_add_irq_chip_fwnode(struct device *dev,
10451045
EXPORT_SYMBOL_GPL(devm_regmap_add_irq_chip_fwnode);
10461046

10471047
/**
1048-
* devm_regmap_add_irq_chip() - Resource manager regmap_add_irq_chip()
1048+
* devm_regmap_add_irq_chip() - Resource managed regmap_add_irq_chip()
10491049
*
10501050
* @dev: The device pointer on which irq_chip belongs to.
10511051
* @map: The regmap for the device.
@@ -1074,7 +1074,7 @@ EXPORT_SYMBOL_GPL(devm_regmap_add_irq_chip);
10741074
/**
10751075
* devm_regmap_del_irq_chip() - Resource managed regmap_del_irq_chip()
10761076
*
1077-
* @dev: Device for which which resource was allocated.
1077+
* @dev: Device for which the resource was allocated.
10781078
* @irq: Primary IRQ for the device.
10791079
* @data: &regmap_irq_chip_data allocated by regmap_add_irq_chip().
10801080
*

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)