Skip to content

Commit 57218d7

Browse files
committed
Merge tag 'regmap-v5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap
Pull regmap updates from Mark Brown: "Quite a busy release for regmap, mostly support for new features useful on fairly small subsets of devices. The user visible features are: - A new API for registering large numbers of regmap fields at once. - Support for Intel AVMM buses connected via SPI. - Support for 12/20 address/value layouts. - Support for yet another scheme for acknowledging interrupts used on some Qualcomm devices" * tag 'regmap-v5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap: regmap: irq: Add support to clear ack registers regmap: add support to regmap_field_bulk_alloc/free apis regmap: destroy mutex (if used) in regmap_exit() regmap: debugfs: use semicolons rather than commas to separate statements regmap: debugfs: Fix more error path regressions regmap: Add support for 12/20 register formatting regmap: Add can_sleep configuration option regmap: soundwire: remove unused header mod_devicetable.h regmap: Use flexible sleep regmap: add Intel SPI Slave to AVMM Bus Bridge support
2 parents fd5c32d + 6e0545c commit 57218d7

9 files changed

Lines changed: 954 additions & 8 deletions

File tree

drivers/base/regmap/Kconfig

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# subsystems should select the appropriate symbols.
55

66
config REGMAP
7-
default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_W1 || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ || REGMAP_SOUNDWIRE || REGMAP_SCCB || REGMAP_I3C)
7+
default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_W1 || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ || REGMAP_SOUNDWIRE || REGMAP_SCCB || REGMAP_I3C || REGMAP_SPI_AVMM)
88
select IRQ_DOMAIN if REGMAP_IRQ
99
bool
1010

@@ -53,3 +53,7 @@ config REGMAP_SCCB
5353
config REGMAP_I3C
5454
tristate
5555
depends on I3C
56+
57+
config REGMAP_SPI_AVMM
58+
tristate
59+
depends on SPI

drivers/base/regmap/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ obj-$(CONFIG_REGMAP_W1) += regmap-w1.o
1717
obj-$(CONFIG_REGMAP_SOUNDWIRE) += regmap-sdw.o
1818
obj-$(CONFIG_REGMAP_SCCB) += regmap-sccb.o
1919
obj-$(CONFIG_REGMAP_I3C) += regmap-i3c.o
20+
obj-$(CONFIG_REGMAP_SPI_AVMM) += regmap-spi-avmm.o

drivers/base/regmap/internal.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,9 @@ struct regmap {
161161
void *selector_work_buf; /* Scratch buffer used for selector */
162162

163163
struct hwspinlock *hwlock;
164+
165+
/* if set, the regmap core can sleep */
166+
bool can_sleep;
164167
};
165168

166169
struct regcache_ops {

drivers/base/regmap/regmap-debugfs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ static inline void regmap_calc_tot_len(struct regmap *map,
183183
{
184184
/* Calculate the length of a fixed format */
185185
if (!map->debugfs_tot_len) {
186-
map->debugfs_reg_len = regmap_calc_reg_len(map->max_register),
186+
map->debugfs_reg_len = regmap_calc_reg_len(map->max_register);
187187
map->debugfs_val_len = 2 * map->format.val_bytes;
188188
map->debugfs_tot_len = map->debugfs_reg_len +
189189
map->debugfs_val_len + 3; /* : \n */

drivers/base/regmap/regmap-irq.c

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,14 @@ static void regmap_irq_sync_unlock(struct irq_data *data)
168168
ret = regmap_write(map, reg, ~d->mask_buf[i]);
169169
else
170170
ret = regmap_write(map, reg, d->mask_buf[i]);
171+
if (d->chip->clear_ack) {
172+
if (d->chip->ack_invert && !ret)
173+
ret = regmap_write(map, reg,
174+
d->mask_buf[i]);
175+
else if (!ret)
176+
ret = regmap_write(map, reg,
177+
~d->mask_buf[i]);
178+
}
171179
if (ret != 0)
172180
dev_err(d->map->dev, "Failed to ack 0x%x: %d\n",
173181
reg, ret);
@@ -493,7 +501,20 @@ static irqreturn_t regmap_irq_thread(int irq, void *d)
493501
if (data->status_buf[i] && (chip->ack_base || chip->use_ack)) {
494502
reg = chip->ack_base +
495503
(i * map->reg_stride * data->irq_reg_stride);
496-
ret = regmap_write(map, reg, data->status_buf[i]);
504+
if (chip->ack_invert)
505+
ret = regmap_write(map, reg,
506+
~data->status_buf[i]);
507+
else
508+
ret = regmap_write(map, reg,
509+
data->status_buf[i]);
510+
if (chip->clear_ack) {
511+
if (chip->ack_invert && !ret)
512+
ret = regmap_write(map, reg,
513+
data->status_buf[i]);
514+
else if (!ret)
515+
ret = regmap_write(map, reg,
516+
~data->status_buf[i]);
517+
}
497518
if (ret != 0)
498519
dev_err(map->dev, "Failed to ack 0x%x: %d\n",
499520
reg, ret);
@@ -722,6 +743,16 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode,
722743
else
723744
ret = regmap_write(map, reg,
724745
d->status_buf[i] & d->mask_buf[i]);
746+
if (chip->clear_ack) {
747+
if (chip->ack_invert && !ret)
748+
ret = regmap_write(map, reg,
749+
(d->status_buf[i] &
750+
d->mask_buf[i]));
751+
else if (!ret)
752+
ret = regmap_write(map, reg,
753+
~(d->status_buf[i] &
754+
d->mask_buf[i]));
755+
}
725756
if (ret != 0) {
726757
dev_err(map->dev, "Failed to ack 0x%x: %d\n",
727758
reg, ret);

drivers/base/regmap/regmap-sdw.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// Copyright(c) 2015-17 Intel Corporation.
33

44
#include <linux/device.h>
5-
#include <linux/mod_devicetable.h>
65
#include <linux/module.h>
76
#include <linux/soundwire/sdw.h>
87
#include "internal.h"

0 commit comments

Comments
 (0)