|
@@ -362,25 +362,28 @@ exit:
|
|
}
|
|
}
|
|
|
|
|
|
static void pca953x_gpio_set_multiple(struct gpio_chip *gc,
|
|
static void pca953x_gpio_set_multiple(struct gpio_chip *gc,
|
|
- unsigned long *mask, unsigned long *bits)
|
|
|
|
|
|
+ unsigned long *mask, unsigned long *bits)
|
|
{
|
|
{
|
|
struct pca953x_chip *chip = gpiochip_get_data(gc);
|
|
struct pca953x_chip *chip = gpiochip_get_data(gc);
|
|
|
|
+ unsigned int bank_mask, bank_val;
|
|
|
|
+ int bank_shift, bank;
|
|
u8 reg_val[MAX_BANK];
|
|
u8 reg_val[MAX_BANK];
|
|
int ret;
|
|
int ret;
|
|
- int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ);
|
|
|
|
- int bank;
|
|
|
|
|
|
+
|
|
|
|
+ bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ);
|
|
|
|
|
|
memcpy(reg_val, chip->reg_output, NBANK(chip));
|
|
memcpy(reg_val, chip->reg_output, NBANK(chip));
|
|
mutex_lock(&chip->i2c_lock);
|
|
mutex_lock(&chip->i2c_lock);
|
|
- for(bank=0; bank<NBANK(chip); bank++) {
|
|
|
|
- unsigned bankmask = mask[bank / sizeof(*mask)] >>
|
|
|
|
- ((bank % sizeof(*mask)) * 8);
|
|
|
|
- if(bankmask) {
|
|
|
|
- unsigned bankval = bits[bank / sizeof(*bits)] >>
|
|
|
|
- ((bank % sizeof(*bits)) * 8);
|
|
|
|
- reg_val[bank] = (reg_val[bank] & ~bankmask) | bankval;
|
|
|
|
|
|
+ for (bank = 0; bank < NBANK(chip); bank++) {
|
|
|
|
+ bank_mask = mask[bank / sizeof(*mask)] >>
|
|
|
|
+ ((bank % sizeof(*mask)) * 8);
|
|
|
|
+ if (bank_mask) {
|
|
|
|
+ bank_val = bits[bank / sizeof(*bits)] >>
|
|
|
|
+ ((bank % sizeof(*bits)) * 8);
|
|
|
|
+ reg_val[bank] = (reg_val[bank] & ~bank_mask) | bank_val;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
ret = i2c_smbus_write_i2c_block_data(chip->client,
|
|
ret = i2c_smbus_write_i2c_block_data(chip->client,
|
|
chip->regs->output << bank_shift,
|
|
chip->regs->output << bank_shift,
|
|
NBANK(chip), reg_val);
|
|
NBANK(chip), reg_val);
|