Lines Matching +full:off +full:- +full:chip
116 #define NBANK(chip) DIV_ROUND_UP(chip->gpio_chip.ngpio, BANK_SZ) argument
162 static int pca953x_read_single(struct pca953x_chip *chip, int reg, u32 *val, in pca953x_read_single() argument
163 int off) in pca953x_read_single() argument
166 int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ); in pca953x_read_single()
167 int offset = off / BANK_SZ; in pca953x_read_single()
169 ret = i2c_smbus_read_byte_data(chip->client, in pca953x_read_single()
174 dev_err(&chip->client->dev, "failed reading register\n"); in pca953x_read_single()
181 static int pca953x_write_single(struct pca953x_chip *chip, int reg, u32 val, in pca953x_write_single() argument
182 int off) in pca953x_write_single() argument
185 int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ); in pca953x_write_single()
186 int offset = off / BANK_SZ; in pca953x_write_single()
188 ret = i2c_smbus_write_byte_data(chip->client, in pca953x_write_single()
192 dev_err(&chip->client->dev, "failed writing register\n"); in pca953x_write_single()
199 static int pca953x_write_regs_8(struct pca953x_chip *chip, int reg, u8 *val) in pca953x_write_regs_8() argument
201 return i2c_smbus_write_byte_data(chip->client, reg, *val); in pca953x_write_regs_8()
204 static int pca953x_write_regs_16(struct pca953x_chip *chip, int reg, u8 *val) in pca953x_write_regs_16() argument
208 return i2c_smbus_write_word_data(chip->client, reg << 1, word); in pca953x_write_regs_16()
211 static int pca957x_write_regs_16(struct pca953x_chip *chip, int reg, u8 *val) in pca957x_write_regs_16() argument
215 ret = i2c_smbus_write_byte_data(chip->client, reg << 1, val[0]); in pca957x_write_regs_16()
219 return i2c_smbus_write_byte_data(chip->client, (reg << 1) + 1, val[1]); in pca957x_write_regs_16()
222 static int pca953x_write_regs_24(struct pca953x_chip *chip, int reg, u8 *val) in pca953x_write_regs_24() argument
224 int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ); in pca953x_write_regs_24()
228 return i2c_smbus_write_i2c_block_data(chip->client, in pca953x_write_regs_24()
230 NBANK(chip), val); in pca953x_write_regs_24()
233 static int pca953x_write_regs(struct pca953x_chip *chip, int reg, u8 *val) in pca953x_write_regs() argument
237 ret = chip->write_regs(chip, reg, val); in pca953x_write_regs()
239 dev_err(&chip->client->dev, "failed writing register\n"); in pca953x_write_regs()
246 static int pca953x_read_regs_8(struct pca953x_chip *chip, int reg, u8 *val) in pca953x_read_regs_8() argument
250 ret = i2c_smbus_read_byte_data(chip->client, reg); in pca953x_read_regs_8()
256 static int pca953x_read_regs_16(struct pca953x_chip *chip, int reg, u8 *val) in pca953x_read_regs_16() argument
260 ret = i2c_smbus_read_word_data(chip->client, reg << 1); in pca953x_read_regs_16()
266 static int pca953x_read_regs_24(struct pca953x_chip *chip, int reg, u8 *val) in pca953x_read_regs_24() argument
268 int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ); in pca953x_read_regs_24()
272 return i2c_smbus_read_i2c_block_data(chip->client, in pca953x_read_regs_24()
274 NBANK(chip), val); in pca953x_read_regs_24()
277 static int pca953x_read_regs(struct pca953x_chip *chip, int reg, u8 *val) in pca953x_read_regs() argument
281 ret = chip->read_regs(chip, reg, val); in pca953x_read_regs()
283 dev_err(&chip->client->dev, "failed reading register\n"); in pca953x_read_regs()
290 static int pca953x_gpio_direction_input(struct gpio_chip *gc, unsigned off) in pca953x_gpio_direction_input() argument
292 struct pca953x_chip *chip = gpiochip_get_data(gc); in pca953x_gpio_direction_input() local
296 mutex_lock(&chip->i2c_lock); in pca953x_gpio_direction_input()
297 reg_val = chip->reg_direction[off / BANK_SZ] | (1u << (off % BANK_SZ)); in pca953x_gpio_direction_input()
299 ret = pca953x_write_single(chip, chip->regs->direction, reg_val, off); in pca953x_gpio_direction_input()
303 chip->reg_direction[off / BANK_SZ] = reg_val; in pca953x_gpio_direction_input()
305 mutex_unlock(&chip->i2c_lock); in pca953x_gpio_direction_input()
310 unsigned off, int val) in pca953x_gpio_direction_output() argument
312 struct pca953x_chip *chip = gpiochip_get_data(gc); in pca953x_gpio_direction_output() local
316 mutex_lock(&chip->i2c_lock); in pca953x_gpio_direction_output()
319 reg_val = chip->reg_output[off / BANK_SZ] in pca953x_gpio_direction_output()
320 | (1u << (off % BANK_SZ)); in pca953x_gpio_direction_output()
322 reg_val = chip->reg_output[off / BANK_SZ] in pca953x_gpio_direction_output()
323 & ~(1u << (off % BANK_SZ)); in pca953x_gpio_direction_output()
325 ret = pca953x_write_single(chip, chip->regs->output, reg_val, off); in pca953x_gpio_direction_output()
329 chip->reg_output[off / BANK_SZ] = reg_val; in pca953x_gpio_direction_output()
332 reg_val = chip->reg_direction[off / BANK_SZ] & ~(1u << (off % BANK_SZ)); in pca953x_gpio_direction_output()
333 ret = pca953x_write_single(chip, chip->regs->direction, reg_val, off); in pca953x_gpio_direction_output()
337 chip->reg_direction[off / BANK_SZ] = reg_val; in pca953x_gpio_direction_output()
339 mutex_unlock(&chip->i2c_lock); in pca953x_gpio_direction_output()
343 static int pca953x_gpio_get_value(struct gpio_chip *gc, unsigned off) in pca953x_gpio_get_value() argument
345 struct pca953x_chip *chip = gpiochip_get_data(gc); in pca953x_gpio_get_value() local
349 mutex_lock(&chip->i2c_lock); in pca953x_gpio_get_value()
350 ret = pca953x_read_single(chip, chip->regs->input, ®_val, off); in pca953x_gpio_get_value()
351 mutex_unlock(&chip->i2c_lock); in pca953x_gpio_get_value()
360 return (reg_val & (1u << (off % BANK_SZ))) ? 1 : 0; in pca953x_gpio_get_value()
363 static void pca953x_gpio_set_value(struct gpio_chip *gc, unsigned off, int val) in pca953x_gpio_set_value() argument
365 struct pca953x_chip *chip = gpiochip_get_data(gc); in pca953x_gpio_set_value() local
369 mutex_lock(&chip->i2c_lock); in pca953x_gpio_set_value()
371 reg_val = chip->reg_output[off / BANK_SZ] in pca953x_gpio_set_value()
372 | (1u << (off % BANK_SZ)); in pca953x_gpio_set_value()
374 reg_val = chip->reg_output[off / BANK_SZ] in pca953x_gpio_set_value()
375 & ~(1u << (off % BANK_SZ)); in pca953x_gpio_set_value()
377 ret = pca953x_write_single(chip, chip->regs->output, reg_val, off); in pca953x_gpio_set_value()
381 chip->reg_output[off / BANK_SZ] = reg_val; in pca953x_gpio_set_value()
383 mutex_unlock(&chip->i2c_lock); in pca953x_gpio_set_value()
386 static int pca953x_gpio_get_direction(struct gpio_chip *gc, unsigned off) in pca953x_gpio_get_direction() argument
388 struct pca953x_chip *chip = gpiochip_get_data(gc); in pca953x_gpio_get_direction() local
392 mutex_lock(&chip->i2c_lock); in pca953x_gpio_get_direction()
393 ret = pca953x_read_single(chip, chip->regs->direction, ®_val, off); in pca953x_gpio_get_direction()
394 mutex_unlock(&chip->i2c_lock); in pca953x_gpio_get_direction()
398 return !!(reg_val & (1u << (off % BANK_SZ))); in pca953x_gpio_get_direction()
404 struct pca953x_chip *chip = gpiochip_get_data(gc); in pca953x_gpio_set_multiple() local
410 bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ); in pca953x_gpio_set_multiple()
412 mutex_lock(&chip->i2c_lock); in pca953x_gpio_set_multiple()
413 memcpy(reg_val, chip->reg_output, NBANK(chip)); in pca953x_gpio_set_multiple()
414 for (bank = 0; bank < NBANK(chip); bank++) { in pca953x_gpio_set_multiple()
425 ret = i2c_smbus_write_i2c_block_data(chip->client, in pca953x_gpio_set_multiple()
426 chip->regs->output << bank_shift, in pca953x_gpio_set_multiple()
427 NBANK(chip), reg_val); in pca953x_gpio_set_multiple()
431 memcpy(chip->reg_output, reg_val, NBANK(chip)); in pca953x_gpio_set_multiple()
433 mutex_unlock(&chip->i2c_lock); in pca953x_gpio_set_multiple()
436 static void pca953x_setup_gpio(struct pca953x_chip *chip, int gpios) in pca953x_setup_gpio() argument
440 gc = &chip->gpio_chip; in pca953x_setup_gpio()
442 gc->direction_input = pca953x_gpio_direction_input; in pca953x_setup_gpio()
443 gc->direction_output = pca953x_gpio_direction_output; in pca953x_setup_gpio()
444 gc->get = pca953x_gpio_get_value; in pca953x_setup_gpio()
445 gc->set = pca953x_gpio_set_value; in pca953x_setup_gpio()
446 gc->get_direction = pca953x_gpio_get_direction; in pca953x_setup_gpio()
447 gc->set_multiple = pca953x_gpio_set_multiple; in pca953x_setup_gpio()
448 gc->can_sleep = true; in pca953x_setup_gpio()
450 gc->base = chip->gpio_start; in pca953x_setup_gpio()
451 gc->ngpio = gpios; in pca953x_setup_gpio()
452 gc->label = chip->client->name; in pca953x_setup_gpio()
453 gc->parent = &chip->client->dev; in pca953x_setup_gpio()
454 gc->owner = THIS_MODULE; in pca953x_setup_gpio()
455 gc->names = chip->names; in pca953x_setup_gpio()
462 struct pca953x_chip *chip = gpiochip_get_data(gc); in pca953x_irq_mask() local
464 chip->irq_mask[d->hwirq / BANK_SZ] &= ~(1 << (d->hwirq % BANK_SZ)); in pca953x_irq_mask()
470 struct pca953x_chip *chip = gpiochip_get_data(gc); in pca953x_irq_unmask() local
472 chip->irq_mask[d->hwirq / BANK_SZ] |= 1 << (d->hwirq % BANK_SZ); in pca953x_irq_unmask()
478 struct pca953x_chip *chip = gpiochip_get_data(gc); in pca953x_irq_bus_lock() local
480 mutex_lock(&chip->irq_lock); in pca953x_irq_bus_lock()
486 struct pca953x_chip *chip = gpiochip_get_data(gc); in pca953x_irq_bus_sync_unlock() local
491 if (chip->driver_data & PCA_PCAL) { in pca953x_irq_bus_sync_unlock()
492 /* Enable latch on interrupt-enabled inputs */ in pca953x_irq_bus_sync_unlock()
493 pca953x_write_regs(chip, PCAL953X_IN_LATCH, chip->irq_mask); in pca953x_irq_bus_sync_unlock()
495 for (i = 0; i < NBANK(chip); i++) in pca953x_irq_bus_sync_unlock()
496 invert_irq_mask[i] = ~chip->irq_mask[i]; in pca953x_irq_bus_sync_unlock()
499 pca953x_write_regs(chip, PCAL953X_INT_MASK, invert_irq_mask); in pca953x_irq_bus_sync_unlock()
503 for (i = 0; i < NBANK(chip); i++) { in pca953x_irq_bus_sync_unlock()
504 new_irqs = chip->irq_trig_fall[i] | chip->irq_trig_raise[i]; in pca953x_irq_bus_sync_unlock()
505 new_irqs &= ~chip->reg_direction[i]; in pca953x_irq_bus_sync_unlock()
509 pca953x_gpio_direction_input(&chip->gpio_chip, in pca953x_irq_bus_sync_unlock()
515 mutex_unlock(&chip->irq_lock); in pca953x_irq_bus_sync_unlock()
521 struct pca953x_chip *chip = gpiochip_get_data(gc); in pca953x_irq_set_type() local
522 int bank_nb = d->hwirq / BANK_SZ; in pca953x_irq_set_type()
523 u8 mask = 1 << (d->hwirq % BANK_SZ); in pca953x_irq_set_type()
526 dev_err(&chip->client->dev, "irq %d: unsupported type %d\n", in pca953x_irq_set_type()
527 d->irq, type); in pca953x_irq_set_type()
528 return -EINVAL; in pca953x_irq_set_type()
532 chip->irq_trig_fall[bank_nb] |= mask; in pca953x_irq_set_type()
534 chip->irq_trig_fall[bank_nb] &= ~mask; in pca953x_irq_set_type()
537 chip->irq_trig_raise[bank_nb] |= mask; in pca953x_irq_set_type()
539 chip->irq_trig_raise[bank_nb] &= ~mask; in pca953x_irq_set_type()
547 struct pca953x_chip *chip = gpiochip_get_data(gc); in pca953x_irq_shutdown() local
548 u8 mask = 1 << (d->hwirq % BANK_SZ); in pca953x_irq_shutdown()
550 chip->irq_trig_raise[d->hwirq / BANK_SZ] &= ~mask; in pca953x_irq_shutdown()
551 chip->irq_trig_fall[d->hwirq / BANK_SZ] &= ~mask; in pca953x_irq_shutdown()
564 static bool pca953x_irq_pending(struct pca953x_chip *chip, u8 *pending) in pca953x_irq_pending() argument
573 if (chip->driver_data & PCA_PCAL) { in pca953x_irq_pending()
575 ret = pca953x_read_regs(chip, PCAL953X_INT_STAT, trigger); in pca953x_irq_pending()
580 ret = pca953x_read_regs(chip, PCA953X_INPUT, cur_stat); in pca953x_irq_pending()
584 for (i = 0; i < NBANK(chip); i++) { in pca953x_irq_pending()
586 pending[i] = (~cur_stat[i] & chip->irq_trig_fall[i]) | in pca953x_irq_pending()
587 (cur_stat[i] & chip->irq_trig_raise[i]); in pca953x_irq_pending()
596 ret = pca953x_read_regs(chip, chip->regs->input, cur_stat); in pca953x_irq_pending()
601 for (i = 0; i < NBANK(chip); i++) in pca953x_irq_pending()
602 cur_stat[i] &= chip->reg_direction[i]; in pca953x_irq_pending()
604 memcpy(old_stat, chip->irq_stat, NBANK(chip)); in pca953x_irq_pending()
606 for (i = 0; i < NBANK(chip); i++) { in pca953x_irq_pending()
607 trigger[i] = (cur_stat[i] ^ old_stat[i]) & chip->irq_mask[i]; in pca953x_irq_pending()
615 memcpy(chip->irq_stat, cur_stat, NBANK(chip)); in pca953x_irq_pending()
617 for (i = 0; i < NBANK(chip); i++) { in pca953x_irq_pending()
618 pending[i] = (old_stat[i] & chip->irq_trig_fall[i]) | in pca953x_irq_pending()
619 (cur_stat[i] & chip->irq_trig_raise[i]); in pca953x_irq_pending()
630 struct pca953x_chip *chip = devid; in pca953x_irq_handler() local
636 if (!pca953x_irq_pending(chip, pending)) in pca953x_irq_handler()
639 for (i = 0; i < NBANK(chip); i++) { in pca953x_irq_handler()
642 handle_nested_irq(irq_find_mapping(chip->gpio_chip.irq.domain, in pca953x_irq_handler()
652 static int pca953x_irq_setup(struct pca953x_chip *chip, in pca953x_irq_setup() argument
655 struct i2c_client *client = chip->client; in pca953x_irq_setup()
658 if (client->irq && irq_base != -1 in pca953x_irq_setup()
659 && (chip->driver_data & PCA_INT)) { in pca953x_irq_setup()
660 ret = pca953x_read_regs(chip, in pca953x_irq_setup()
661 chip->regs->input, chip->irq_stat); in pca953x_irq_setup()
670 for (i = 0; i < NBANK(chip); i++) in pca953x_irq_setup()
671 chip->irq_stat[i] &= chip->reg_direction[i]; in pca953x_irq_setup()
672 mutex_init(&chip->irq_lock); in pca953x_irq_setup()
674 ret = devm_request_threaded_irq(&client->dev, in pca953x_irq_setup()
675 client->irq, in pca953x_irq_setup()
680 dev_name(&client->dev), chip); in pca953x_irq_setup()
682 dev_err(&client->dev, "failed to request irq %d\n", in pca953x_irq_setup()
683 client->irq); in pca953x_irq_setup()
687 ret = gpiochip_irqchip_add_nested(&chip->gpio_chip, in pca953x_irq_setup()
693 dev_err(&client->dev, in pca953x_irq_setup()
698 gpiochip_set_nested_irqchip(&chip->gpio_chip, in pca953x_irq_setup()
700 client->irq); in pca953x_irq_setup()
707 static int pca953x_irq_setup(struct pca953x_chip *chip, in pca953x_irq_setup() argument
710 struct i2c_client *client = chip->client; in pca953x_irq_setup()
712 if (client->irq && irq_base != -1 && (chip->driver_data & PCA_INT)) in pca953x_irq_setup()
713 dev_warn(&client->dev, "interrupt support not compiled in\n"); in pca953x_irq_setup()
719 static int device_pca953x_init(struct pca953x_chip *chip, u32 invert) in device_pca953x_init() argument
724 chip->regs = &pca953x_regs; in device_pca953x_init()
726 ret = pca953x_read_regs(chip, chip->regs->output, chip->reg_output); in device_pca953x_init()
730 ret = pca953x_read_regs(chip, chip->regs->direction, in device_pca953x_init()
731 chip->reg_direction); in device_pca953x_init()
737 memset(val, 0xFF, NBANK(chip)); in device_pca953x_init()
739 memset(val, 0, NBANK(chip)); in device_pca953x_init()
741 ret = pca953x_write_regs(chip, PCA953X_INVERT, val); in device_pca953x_init()
746 static int device_pca957x_init(struct pca953x_chip *chip, u32 invert) in device_pca957x_init() argument
751 chip->regs = &pca957x_regs; in device_pca957x_init()
753 ret = pca953x_read_regs(chip, chip->regs->output, chip->reg_output); in device_pca957x_init()
756 ret = pca953x_read_regs(chip, chip->regs->direction, in device_pca957x_init()
757 chip->reg_direction); in device_pca957x_init()
763 memset(val, 0xFF, NBANK(chip)); in device_pca957x_init()
765 memset(val, 0, NBANK(chip)); in device_pca957x_init()
766 ret = pca953x_write_regs(chip, PCA957X_INVRT, val); in device_pca957x_init()
771 memset(val, 0x02, NBANK(chip)); in device_pca957x_init()
772 ret = pca953x_write_regs(chip, PCA957X_BKEN, val); in device_pca957x_init()
787 struct pca953x_chip *chip; in pca953x_probe() local
793 chip = devm_kzalloc(&client->dev, in pca953x_probe()
795 if (chip == NULL) in pca953x_probe()
796 return -ENOMEM; in pca953x_probe()
798 pdata = dev_get_platdata(&client->dev); in pca953x_probe()
800 irq_base = pdata->irq_base; in pca953x_probe()
801 chip->gpio_start = pdata->gpio_base; in pca953x_probe()
802 invert = pdata->invert; in pca953x_probe()
803 chip->names = pdata->names; in pca953x_probe()
807 chip->gpio_start = -1; in pca953x_probe()
811 * See if we need to de-assert a reset pin. in pca953x_probe()
813 * There is no known ACPI-enabled platforms that are in pca953x_probe()
817 reset_gpio = devm_gpiod_get_optional(&client->dev, "reset", in pca953x_probe()
823 chip->client = client; in pca953x_probe()
825 reg = devm_regulator_get(&client->dev, "vcc"); in pca953x_probe()
828 if (ret != -EPROBE_DEFER) in pca953x_probe()
829 dev_err(&client->dev, "reg get err: %d\n", ret); in pca953x_probe()
834 dev_err(&client->dev, "reg en err: %d\n", ret); in pca953x_probe()
837 chip->regulator = reg; in pca953x_probe()
840 chip->driver_data = i2c_id->driver_data; in pca953x_probe()
843 struct device *dev = &client->dev; in pca953x_probe()
845 chip->driver_data = (uintptr_t)of_device_get_match_data(dev); in pca953x_probe()
846 if (!chip->driver_data) { in pca953x_probe()
849 ret = -ENODEV; in pca953x_probe()
853 chip->driver_data = acpi_id->driver_data; in pca953x_probe()
857 mutex_init(&chip->i2c_lock); in pca953x_probe()
859 * In case we have an i2c-mux controlled by a GPIO provided by an in pca953x_probe()
862 * subclass for chip->i2c_lock. in pca953x_probe()
865 * false positives when the expander controlling the i2c-mux is on in pca953x_probe()
871 * applied to all other i2c-controlled GPIO expanders (and potentially in pca953x_probe()
872 * regmap-i2c). in pca953x_probe()
874 lockdep_set_subclass(&chip->i2c_lock, in pca953x_probe()
875 i2c_adapter_depth(client->adapter)); in pca953x_probe()
878 * we can't share this chip with another i2c master. in pca953x_probe()
880 pca953x_setup_gpio(chip, chip->driver_data & PCA_GPIO_MASK); in pca953x_probe()
882 if (chip->gpio_chip.ngpio <= 8) { in pca953x_probe()
883 chip->write_regs = pca953x_write_regs_8; in pca953x_probe()
884 chip->read_regs = pca953x_read_regs_8; in pca953x_probe()
885 } else if (chip->gpio_chip.ngpio >= 24) { in pca953x_probe()
886 chip->write_regs = pca953x_write_regs_24; in pca953x_probe()
887 chip->read_regs = pca953x_read_regs_24; in pca953x_probe()
889 if (PCA_CHIP_TYPE(chip->driver_data) == PCA953X_TYPE) in pca953x_probe()
890 chip->write_regs = pca953x_write_regs_16; in pca953x_probe()
892 chip->write_regs = pca957x_write_regs_16; in pca953x_probe()
893 chip->read_regs = pca953x_read_regs_16; in pca953x_probe()
896 if (PCA_CHIP_TYPE(chip->driver_data) == PCA953X_TYPE) in pca953x_probe()
897 ret = device_pca953x_init(chip, invert); in pca953x_probe()
899 ret = device_pca957x_init(chip, invert); in pca953x_probe()
903 ret = devm_gpiochip_add_data(&client->dev, &chip->gpio_chip, chip); in pca953x_probe()
907 ret = pca953x_irq_setup(chip, irq_base); in pca953x_probe()
911 if (pdata && pdata->setup) { in pca953x_probe()
912 ret = pdata->setup(client, chip->gpio_chip.base, in pca953x_probe()
913 chip->gpio_chip.ngpio, pdata->context); in pca953x_probe()
915 dev_warn(&client->dev, "setup failed, %d\n", ret); in pca953x_probe()
918 i2c_set_clientdata(client, chip); in pca953x_probe()
922 regulator_disable(chip->regulator); in pca953x_probe()
928 struct pca953x_platform_data *pdata = dev_get_platdata(&client->dev); in pca953x_remove()
929 struct pca953x_chip *chip = i2c_get_clientdata(client); in pca953x_remove() local
932 if (pdata && pdata->teardown) { in pca953x_remove()
933 ret = pdata->teardown(client, chip->gpio_chip.base, in pca953x_remove()
934 chip->gpio_chip.ngpio, pdata->context); in pca953x_remove()
936 dev_err(&client->dev, "%s failed, %d\n", in pca953x_remove()
942 regulator_disable(chip->regulator); in pca953x_remove()
947 /* convenience to stop overlong match-table lines */