Skip to content

Commit 6f8e4e1

Browse files
committed
Merge tag 'gpio-fixes-for-v5.19-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux
Pull gpio fixes from Bartosz Golaszewski: - fix several regmap usage issues in gpio-pca953x - fix out-of-tree build for GPIO selftests - fix integer overflow in gpio-xilinx * tag 'gpio-fixes-for-v5.19-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux: gpio: gpio-xilinx: Fix integer overflow selftests: gpio: fix include path to kernel headers for out of tree builds gpio: pca953x: use the correct register address when regcache sync during init gpio: pca953x: use the correct range when do regmap sync gpio: pca953x: only use single read/write for No AI mode
2 parents 6147191 + 32c094a commit 6f8e4e1

File tree

3 files changed

+16
-10
lines changed

3 files changed

+16
-10
lines changed

drivers/gpio/gpio-pca953x.c

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,9 @@ static const struct regmap_config pca953x_i2c_regmap = {
351351
.reg_bits = 8,
352352
.val_bits = 8,
353353

354+
.use_single_read = true,
355+
.use_single_write = true,
356+
354357
.readable_reg = pca953x_readable_register,
355358
.writeable_reg = pca953x_writeable_register,
356359
.volatile_reg = pca953x_volatile_register,
@@ -906,15 +909,18 @@ static int pca953x_irq_setup(struct pca953x_chip *chip,
906909
static int device_pca95xx_init(struct pca953x_chip *chip, u32 invert)
907910
{
908911
DECLARE_BITMAP(val, MAX_LINE);
912+
u8 regaddr;
909913
int ret;
910914

911-
ret = regcache_sync_region(chip->regmap, chip->regs->output,
912-
chip->regs->output + NBANK(chip));
915+
regaddr = pca953x_recalc_addr(chip, chip->regs->output, 0);
916+
ret = regcache_sync_region(chip->regmap, regaddr,
917+
regaddr + NBANK(chip) - 1);
913918
if (ret)
914919
goto out;
915920

916-
ret = regcache_sync_region(chip->regmap, chip->regs->direction,
917-
chip->regs->direction + NBANK(chip));
921+
regaddr = pca953x_recalc_addr(chip, chip->regs->direction, 0);
922+
ret = regcache_sync_region(chip->regmap, regaddr,
923+
regaddr + NBANK(chip) - 1);
918924
if (ret)
919925
goto out;
920926

@@ -1127,14 +1133,14 @@ static int pca953x_regcache_sync(struct device *dev)
11271133
* sync these registers first and only then sync the rest.
11281134
*/
11291135
regaddr = pca953x_recalc_addr(chip, chip->regs->direction, 0);
1130-
ret = regcache_sync_region(chip->regmap, regaddr, regaddr + NBANK(chip));
1136+
ret = regcache_sync_region(chip->regmap, regaddr, regaddr + NBANK(chip) - 1);
11311137
if (ret) {
11321138
dev_err(dev, "Failed to sync GPIO dir registers: %d\n", ret);
11331139
return ret;
11341140
}
11351141

11361142
regaddr = pca953x_recalc_addr(chip, chip->regs->output, 0);
1137-
ret = regcache_sync_region(chip->regmap, regaddr, regaddr + NBANK(chip));
1143+
ret = regcache_sync_region(chip->regmap, regaddr, regaddr + NBANK(chip) - 1);
11381144
if (ret) {
11391145
dev_err(dev, "Failed to sync GPIO out registers: %d\n", ret);
11401146
return ret;
@@ -1144,7 +1150,7 @@ static int pca953x_regcache_sync(struct device *dev)
11441150
if (chip->driver_data & PCA_PCAL) {
11451151
regaddr = pca953x_recalc_addr(chip, PCAL953X_IN_LATCH, 0);
11461152
ret = regcache_sync_region(chip->regmap, regaddr,
1147-
regaddr + NBANK(chip));
1153+
regaddr + NBANK(chip) - 1);
11481154
if (ret) {
11491155
dev_err(dev, "Failed to sync INT latch registers: %d\n",
11501156
ret);
@@ -1153,7 +1159,7 @@ static int pca953x_regcache_sync(struct device *dev)
11531159

11541160
regaddr = pca953x_recalc_addr(chip, PCAL953X_INT_MASK, 0);
11551161
ret = regcache_sync_region(chip->regmap, regaddr,
1156-
regaddr + NBANK(chip));
1162+
regaddr + NBANK(chip) - 1);
11571163
if (ret) {
11581164
dev_err(dev, "Failed to sync INT mask registers: %d\n",
11591165
ret);

drivers/gpio/gpio-xilinx.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ static inline void xgpio_set_value32(unsigned long *map, int bit, u32 v)
9999
const unsigned long offset = (bit % BITS_PER_LONG) & BIT(5);
100100

101101
map[index] &= ~(0xFFFFFFFFul << offset);
102-
map[index] |= v << offset;
102+
map[index] |= (unsigned long)v << offset;
103103
}
104104

105105
static inline int xgpio_regoffset(struct xgpio_instance *chip, int ch)

tools/testing/selftests/gpio/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
TEST_PROGS := gpio-mockup.sh gpio-sim.sh
44
TEST_FILES := gpio-mockup-sysfs.sh
55
TEST_GEN_PROGS_EXTENDED := gpio-mockup-cdev gpio-chip-info gpio-line-name
6-
CFLAGS += -O2 -g -Wall -I../../../../usr/include/
6+
CFLAGS += -O2 -g -Wall -I../../../../usr/include/ $(KHDR_INCLUDES)
77

88
include ../lib.mk

0 commit comments

Comments
 (0)