Lines Matching +full:nxp +full:- +full:i
1 // SPDX-License-Identifier: GPL-2.0-only
3 * PCA953x 4/8/16/24/40 bit I/O ports
127 { "irq-gpios", &pca953x_irq_gpios, 1, ACPI_GPIO_QUIRK_ABSOLUTE_NUMBER },
139 ret = acpi_dev_gpio_irq_get_by(ACPI_COMPANION(dev), "irq-gpios", 0); in pca953x_acpi_get_irq()
153 * relative. Since first controller (gpio-sch.c) and
154 * second (gpio-dwapb.c) are at the fixed bases, we may
176 #define NBANK(chip) DIV_ROUND_UP(chip->gpio_chip.ngpio, BANK_SZ)
227 return fls((chip->gpio_chip.ngpio - 1) / BANK_SZ); in pca953x_bank_shift()
249 * - Standard set, below 0x40, each port can be replicated up to 8 times
250 * - PCA953x standard
255 * - PCA957x with mixed up registers
262 * - Extended set, above 0x40, often chip specific.
263 * - PCAL6524/PCAL9555A with custom PCAL IRQ handling:
265 * Pull-up/pull-down enable reg 0x40 + 3 * bank_size RW
266 * Pull-up/pull-down select reg 0x40 + 4 * bank_size RW
270 * - Registers with bit 0x80 set, the AI bit
280 int offset = reg & (BIT(bank_shift) - 1); in pca953x_check_register()
284 if (!(chip->driver_data & PCA_PCAL)) in pca953x_check_register()
319 reg -= 0x54; in pcal6534_check_register()
326 reg -= 0x30; in pcal6534_check_register()
351 if (PCA_CHIP_TYPE(chip->driver_data) == PCA957X_TYPE) { in pca953x_readable_register()
360 if (chip->driver_data & PCA_PCAL) { in pca953x_readable_register()
366 return chip->check_reg(chip, reg, bank); in pca953x_readable_register()
374 if (PCA_CHIP_TYPE(chip->driver_data) == PCA957X_TYPE) { in pca953x_writeable_register()
382 if (chip->driver_data & PCA_PCAL) in pca953x_writeable_register()
386 return chip->check_reg(chip, reg, bank); in pca953x_writeable_register()
394 if (PCA_CHIP_TYPE(chip->driver_data) == PCA957X_TYPE) in pca953x_volatile_register()
399 if (chip->driver_data & PCA_PCAL) in pca953x_volatile_register()
402 return chip->check_reg(chip, reg, bank); in pca953x_volatile_register()
484 u8 regaddr = chip->recalc_addr(chip, reg, 0); in pca953x_write_regs()
486 int i, ret; in pca953x_write_regs() local
488 for (i = 0; i < NBANK(chip); i++) in pca953x_write_regs()
489 value[i] = bitmap_get_value8(val, i * BANK_SZ); in pca953x_write_regs()
491 ret = regmap_bulk_write(chip->regmap, regaddr, value, NBANK(chip)); in pca953x_write_regs()
493 dev_err(&chip->client->dev, "failed writing register\n"); in pca953x_write_regs()
502 u8 regaddr = chip->recalc_addr(chip, reg, 0); in pca953x_read_regs()
504 int i, ret; in pca953x_read_regs() local
506 ret = regmap_bulk_read(chip->regmap, regaddr, value, NBANK(chip)); in pca953x_read_regs()
508 dev_err(&chip->client->dev, "failed reading register\n"); in pca953x_read_regs()
512 for (i = 0; i < NBANK(chip); i++) in pca953x_read_regs()
513 bitmap_set_value8(val, value[i], i * BANK_SZ); in pca953x_read_regs()
521 u8 dirreg = chip->recalc_addr(chip, chip->regs->direction, off); in pca953x_gpio_direction_input()
524 guard(mutex)(&chip->i2c_lock); in pca953x_gpio_direction_input()
526 return regmap_write_bits(chip->regmap, dirreg, bit, bit); in pca953x_gpio_direction_input()
533 u8 dirreg = chip->recalc_addr(chip, chip->regs->direction, off); in pca953x_gpio_direction_output()
534 u8 outreg = chip->recalc_addr(chip, chip->regs->output, off); in pca953x_gpio_direction_output()
538 guard(mutex)(&chip->i2c_lock); in pca953x_gpio_direction_output()
541 ret = regmap_write_bits(chip->regmap, outreg, bit, val ? bit : 0); in pca953x_gpio_direction_output()
546 return regmap_write_bits(chip->regmap, dirreg, bit, 0); in pca953x_gpio_direction_output()
552 u8 inreg = chip->recalc_addr(chip, chip->regs->input, off); in pca953x_gpio_get_value()
557 scoped_guard(mutex, &chip->i2c_lock) in pca953x_gpio_get_value()
558 ret = regmap_read(chip->regmap, inreg, ®_val); in pca953x_gpio_get_value()
568 u8 outreg = chip->recalc_addr(chip, chip->regs->output, off); in pca953x_gpio_set_value()
571 guard(mutex)(&chip->i2c_lock); in pca953x_gpio_set_value()
573 regmap_write_bits(chip->regmap, outreg, bit, val ? bit : 0); in pca953x_gpio_set_value()
579 u8 dirreg = chip->recalc_addr(chip, chip->regs->direction, off); in pca953x_gpio_get_direction()
584 scoped_guard(mutex, &chip->i2c_lock) in pca953x_gpio_get_direction()
585 ret = regmap_read(chip->regmap, dirreg, ®_val); in pca953x_gpio_get_direction()
602 scoped_guard(mutex, &chip->i2c_lock) in pca953x_gpio_get_multiple()
603 ret = pca953x_read_regs(chip, chip->regs->input, reg_val); in pca953x_gpio_get_multiple()
607 bitmap_replace(bits, bits, reg_val, mask, gc->ngpio); in pca953x_gpio_get_multiple()
618 guard(mutex)(&chip->i2c_lock); in pca953x_gpio_set_multiple()
620 ret = pca953x_read_regs(chip, chip->regs->output, reg_val); in pca953x_gpio_set_multiple()
624 bitmap_replace(reg_val, reg_val, bits, mask, gc->ngpio); in pca953x_gpio_set_multiple()
626 pca953x_write_regs(chip, chip->regs->output, reg_val); in pca953x_gpio_set_multiple()
634 u8 pull_en_reg = chip->recalc_addr(chip, PCAL953X_PULL_EN, offset); in pca953x_gpio_set_pull_up_down()
635 u8 pull_sel_reg = chip->recalc_addr(chip, PCAL953X_PULL_SEL, offset); in pca953x_gpio_set_pull_up_down()
640 * pull-up/pull-down configuration requires PCAL extended in pca953x_gpio_set_pull_up_down()
643 if (!(chip->driver_data & PCA_PCAL)) in pca953x_gpio_set_pull_up_down()
644 return -ENOTSUPP; in pca953x_gpio_set_pull_up_down()
646 guard(mutex)(&chip->i2c_lock); in pca953x_gpio_set_pull_up_down()
648 /* Configure pull-up/pull-down */ in pca953x_gpio_set_pull_up_down()
650 ret = regmap_write_bits(chip->regmap, pull_sel_reg, bit, bit); in pca953x_gpio_set_pull_up_down()
652 ret = regmap_write_bits(chip->regmap, pull_sel_reg, bit, 0); in pca953x_gpio_set_pull_up_down()
658 /* Disable/Enable pull-up/pull-down */ in pca953x_gpio_set_pull_up_down()
660 return regmap_write_bits(chip->regmap, pull_en_reg, bit, 0); in pca953x_gpio_set_pull_up_down()
662 return regmap_write_bits(chip->regmap, pull_en_reg, bit, bit); in pca953x_gpio_set_pull_up_down()
677 return -ENOTSUPP; in pca953x_gpio_set_config()
685 gc = &chip->gpio_chip; in pca953x_setup_gpio()
687 gc->direction_input = pca953x_gpio_direction_input; in pca953x_setup_gpio()
688 gc->direction_output = pca953x_gpio_direction_output; in pca953x_setup_gpio()
689 gc->get = pca953x_gpio_get_value; in pca953x_setup_gpio()
690 gc->set = pca953x_gpio_set_value; in pca953x_setup_gpio()
691 gc->get_direction = pca953x_gpio_get_direction; in pca953x_setup_gpio()
692 gc->get_multiple = pca953x_gpio_get_multiple; in pca953x_setup_gpio()
693 gc->set_multiple = pca953x_gpio_set_multiple; in pca953x_setup_gpio()
694 gc->set_config = pca953x_gpio_set_config; in pca953x_setup_gpio()
695 gc->can_sleep = true; in pca953x_setup_gpio()
697 gc->base = chip->gpio_start; in pca953x_setup_gpio()
698 gc->ngpio = gpios; in pca953x_setup_gpio()
699 gc->label = dev_name(&chip->client->dev); in pca953x_setup_gpio()
700 gc->parent = &chip->client->dev; in pca953x_setup_gpio()
701 gc->owner = THIS_MODULE; in pca953x_setup_gpio()
711 clear_bit(hwirq, chip->irq_mask); in pca953x_irq_mask()
722 set_bit(hwirq, chip->irq_mask); in pca953x_irq_unmask()
731 atomic_inc(&chip->wakeup_path); in pca953x_irq_set_wake()
733 atomic_dec(&chip->wakeup_path); in pca953x_irq_set_wake()
735 return irq_set_irq_wake(chip->client->irq, on); in pca953x_irq_set_wake()
743 mutex_lock(&chip->irq_lock); in pca953x_irq_bus_lock()
754 if (chip->driver_data & PCA_PCAL) { in pca953x_irq_bus_sync_unlock()
755 guard(mutex)(&chip->i2c_lock); in pca953x_irq_bus_sync_unlock()
757 /* Enable latch on interrupt-enabled inputs */ in pca953x_irq_bus_sync_unlock()
758 pca953x_write_regs(chip, PCAL953X_IN_LATCH, chip->irq_mask); in pca953x_irq_bus_sync_unlock()
760 bitmap_complement(irq_mask, chip->irq_mask, gc->ngpio); in pca953x_irq_bus_sync_unlock()
767 pca953x_read_regs(chip, chip->regs->direction, reg_direction); in pca953x_irq_bus_sync_unlock()
769 bitmap_or(irq_mask, chip->irq_trig_fall, chip->irq_trig_raise, gc->ngpio); in pca953x_irq_bus_sync_unlock()
770 bitmap_complement(reg_direction, reg_direction, gc->ngpio); in pca953x_irq_bus_sync_unlock()
771 bitmap_and(irq_mask, irq_mask, reg_direction, gc->ngpio); in pca953x_irq_bus_sync_unlock()
774 for_each_set_bit(level, irq_mask, gc->ngpio) in pca953x_irq_bus_sync_unlock()
775 pca953x_gpio_direction_input(&chip->gpio_chip, level); in pca953x_irq_bus_sync_unlock()
777 mutex_unlock(&chip->irq_lock); in pca953x_irq_bus_sync_unlock()
787 dev_err(&chip->client->dev, "irq %d: unsupported type %d\n", in pca953x_irq_set_type()
788 d->irq, type); in pca953x_irq_set_type()
789 return -EINVAL; in pca953x_irq_set_type()
792 assign_bit(hwirq, chip->irq_trig_fall, type & IRQ_TYPE_EDGE_FALLING); in pca953x_irq_set_type()
793 assign_bit(hwirq, chip->irq_trig_raise, type & IRQ_TYPE_EDGE_RISING); in pca953x_irq_set_type()
804 clear_bit(hwirq, chip->irq_trig_raise); in pca953x_irq_shutdown()
805 clear_bit(hwirq, chip->irq_trig_fall); in pca953x_irq_shutdown()
812 seq_printf(p, dev_name(gc->parent)); in pca953x_irq_print_chip()
830 struct gpio_chip *gc = &chip->gpio_chip; in pca953x_irq_pending()
838 ret = pca953x_read_regs(chip, chip->regs->input, cur_stat); in pca953x_irq_pending()
843 pca953x_read_regs(chip, chip->regs->direction, reg_direction); in pca953x_irq_pending()
845 bitmap_copy(old_stat, chip->irq_stat, gc->ngpio); in pca953x_irq_pending()
847 bitmap_and(new_stat, cur_stat, reg_direction, gc->ngpio); in pca953x_irq_pending()
848 bitmap_xor(cur_stat, new_stat, old_stat, gc->ngpio); in pca953x_irq_pending()
849 bitmap_and(trigger, cur_stat, chip->irq_mask, gc->ngpio); in pca953x_irq_pending()
851 bitmap_copy(chip->irq_stat, new_stat, gc->ngpio); in pca953x_irq_pending()
853 if (bitmap_empty(trigger, gc->ngpio)) in pca953x_irq_pending()
856 bitmap_and(cur_stat, chip->irq_trig_fall, old_stat, gc->ngpio); in pca953x_irq_pending()
857 bitmap_and(old_stat, chip->irq_trig_raise, new_stat, gc->ngpio); in pca953x_irq_pending()
858 bitmap_or(new_stat, old_stat, cur_stat, gc->ngpio); in pca953x_irq_pending()
859 bitmap_and(pending, new_stat, trigger, gc->ngpio); in pca953x_irq_pending()
861 return !bitmap_empty(pending, gc->ngpio); in pca953x_irq_pending()
867 struct gpio_chip *gc = &chip->gpio_chip; in pca953x_irq_handler()
874 scoped_guard(mutex, &chip->i2c_lock) in pca953x_irq_handler()
879 for_each_set_bit(level, pending, gc->ngpio) { in pca953x_irq_handler()
880 int nested_irq = irq_find_mapping(gc->irq.domain, level); in pca953x_irq_handler()
883 dev_warn_ratelimited(gc->parent, "unmapped interrupt %d\n", level); in pca953x_irq_handler()
897 struct i2c_client *client = chip->client; in pca953x_irq_setup()
904 ret = pca953x_acpi_get_irq(&client->dev); in pca953x_irq_setup()
906 client->irq = ret; in pca953x_irq_setup()
909 if (!client->irq) in pca953x_irq_setup()
912 if (irq_base == -1) in pca953x_irq_setup()
915 if (!(chip->driver_data & PCA_INT)) in pca953x_irq_setup()
918 ret = pca953x_read_regs(chip, chip->regs->input, irq_stat); in pca953x_irq_setup()
927 pca953x_read_regs(chip, chip->regs->direction, reg_direction); in pca953x_irq_setup()
928 bitmap_and(chip->irq_stat, irq_stat, reg_direction, chip->gpio_chip.ngpio); in pca953x_irq_setup()
929 mutex_init(&chip->irq_lock); in pca953x_irq_setup()
931 girq = &chip->gpio_chip.irq; in pca953x_irq_setup()
934 girq->parent_handler = NULL; in pca953x_irq_setup()
935 girq->num_parents = 0; in pca953x_irq_setup()
936 girq->parents = NULL; in pca953x_irq_setup()
937 girq->default_type = IRQ_TYPE_NONE; in pca953x_irq_setup()
938 girq->handler = handle_simple_irq; in pca953x_irq_setup()
939 girq->threaded = true; in pca953x_irq_setup()
940 girq->first = irq_base; /* FIXME: get rid of this */ in pca953x_irq_setup()
942 ret = devm_request_threaded_irq(&client->dev, client->irq, in pca953x_irq_setup()
945 dev_name(&client->dev), chip); in pca953x_irq_setup()
947 dev_err(&client->dev, "failed to request irq %d\n", in pca953x_irq_setup()
948 client->irq); in pca953x_irq_setup()
959 struct i2c_client *client = chip->client; in pca953x_irq_setup()
961 if (client->irq && irq_base != -1 && (chip->driver_data & PCA_INT)) in pca953x_irq_setup()
962 dev_warn(&client->dev, "interrupt support not compiled in\n"); in pca953x_irq_setup()
974 regaddr = chip->recalc_addr(chip, chip->regs->output, 0); in device_pca95xx_init()
975 ret = regcache_sync_region(chip->regmap, regaddr, in device_pca95xx_init()
976 regaddr + NBANK(chip) - 1); in device_pca95xx_init()
980 regaddr = chip->recalc_addr(chip, chip->regs->direction, 0); in device_pca95xx_init()
981 ret = regcache_sync_region(chip->regmap, regaddr, in device_pca95xx_init()
982 regaddr + NBANK(chip) - 1); in device_pca95xx_init()
989 ret = pca953x_write_regs(chip, chip->regs->invert, val); in device_pca95xx_init()
997 unsigned int i; in device_pca957x_init() local
1005 for (i = 0; i < NBANK(chip); i++) in device_pca957x_init()
1006 bitmap_set_value8(val, 0x02, i * BANK_SZ); in device_pca957x_init()
1024 struct device *dev = &chip->client->dev; in pca953x_get_and_enable_regulator()
1025 struct regulator *reg = chip->regulator; in pca953x_get_and_enable_regulator()
1040 chip->regulator = reg; in pca953x_get_and_enable_regulator()
1046 struct device *dev = &client->dev; in pca953x_probe()
1053 chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL); in pca953x_probe()
1055 return -ENOMEM; in pca953x_probe()
1057 pdata = dev_get_platdata(&client->dev); in pca953x_probe()
1059 irq_base = pdata->irq_base; in pca953x_probe()
1060 chip->gpio_start = pdata->gpio_base; in pca953x_probe()
1064 chip->gpio_start = -1; in pca953x_probe()
1068 * See if we need to de-assert a reset pin. in pca953x_probe()
1070 * There is no known ACPI-enabled platforms that are in pca953x_probe()
1074 reset_gpio = devm_gpiod_get_optional(&client->dev, "reset", in pca953x_probe()
1081 chip->client = client; in pca953x_probe()
1082 chip->driver_data = (uintptr_t)i2c_get_match_data(client); in pca953x_probe()
1083 if (!chip->driver_data) in pca953x_probe()
1084 return -ENODEV; in pca953x_probe()
1092 pca953x_setup_gpio(chip, chip->driver_data & PCA_GPIO_MASK); in pca953x_probe()
1094 if (NBANK(chip) > 2 || PCA_CHIP_TYPE(chip->driver_data) == PCA957X_TYPE) { in pca953x_probe()
1095 dev_info(&client->dev, "using AI\n"); in pca953x_probe()
1098 dev_info(&client->dev, "using no AI\n"); in pca953x_probe()
1102 if (PCA_CHIP_TYPE(chip->driver_data) == PCAL653X_TYPE) { in pca953x_probe()
1103 chip->recalc_addr = pcal6534_recalc_addr; in pca953x_probe()
1104 chip->check_reg = pcal6534_check_register; in pca953x_probe()
1106 chip->recalc_addr = pca953x_recalc_addr; in pca953x_probe()
1107 chip->check_reg = pca953x_check_register; in pca953x_probe()
1110 chip->regmap = devm_regmap_init_i2c(client, regmap_config); in pca953x_probe()
1111 if (IS_ERR(chip->regmap)) in pca953x_probe()
1112 return PTR_ERR(chip->regmap); in pca953x_probe()
1114 regcache_mark_dirty(chip->regmap); in pca953x_probe()
1116 mutex_init(&chip->i2c_lock); in pca953x_probe()
1118 * In case we have an i2c-mux controlled by a GPIO provided by an in pca953x_probe()
1121 * subclass for chip->i2c_lock. in pca953x_probe()
1124 * false positives when the expander controlling the i2c-mux is on in pca953x_probe()
1130 * applied to all other i2c-controlled GPIO expanders (and potentially in pca953x_probe()
1131 * regmap-i2c). in pca953x_probe()
1133 lockdep_set_subclass(&chip->i2c_lock, in pca953x_probe()
1134 i2c_adapter_depth(client->adapter)); in pca953x_probe()
1139 if (PCA_CHIP_TYPE(chip->driver_data) == PCA957X_TYPE) { in pca953x_probe()
1140 chip->regs = &pca957x_regs; in pca953x_probe()
1143 chip->regs = &pca953x_regs; in pca953x_probe()
1153 return devm_gpiochip_add_data(dev, &chip->gpio_chip, chip); in pca953x_probe()
1159 struct device *dev = &chip->client->dev; in pca953x_regcache_sync()
1167 regaddr = chip->recalc_addr(chip, chip->regs->direction, 0); in pca953x_regcache_sync()
1168 ret = regcache_sync_region(chip->regmap, regaddr, regaddr + NBANK(chip) - 1); in pca953x_regcache_sync()
1174 regaddr = chip->recalc_addr(chip, chip->regs->output, 0); in pca953x_regcache_sync()
1175 ret = regcache_sync_region(chip->regmap, regaddr, regaddr + NBANK(chip) - 1); in pca953x_regcache_sync()
1182 if (chip->driver_data & PCA_PCAL) { in pca953x_regcache_sync()
1183 regaddr = chip->recalc_addr(chip, PCAL953X_IN_LATCH, 0); in pca953x_regcache_sync()
1184 ret = regcache_sync_region(chip->regmap, regaddr, in pca953x_regcache_sync()
1185 regaddr + NBANK(chip) - 1); in pca953x_regcache_sync()
1192 regaddr = chip->recalc_addr(chip, PCAL953X_INT_MASK, 0); in pca953x_regcache_sync()
1193 ret = regcache_sync_region(chip->regmap, regaddr, in pca953x_regcache_sync()
1194 regaddr + NBANK(chip) - 1); in pca953x_regcache_sync()
1210 guard(mutex)(&chip->i2c_lock); in pca953x_restore_context()
1212 if (chip->client->irq > 0) in pca953x_restore_context()
1213 enable_irq(chip->client->irq); in pca953x_restore_context()
1214 regcache_cache_only(chip->regmap, false); in pca953x_restore_context()
1215 regcache_mark_dirty(chip->regmap); in pca953x_restore_context()
1220 return regcache_sync(chip->regmap); in pca953x_restore_context()
1225 guard(mutex)(&chip->i2c_lock); in pca953x_save_context()
1228 if (chip->client->irq > 0) in pca953x_save_context()
1229 disable_irq(chip->client->irq); in pca953x_save_context()
1230 regcache_cache_only(chip->regmap, true); in pca953x_save_context()
1239 if (atomic_read(&chip->wakeup_path)) in pca953x_suspend()
1242 regulator_disable(chip->regulator); in pca953x_suspend()
1252 if (!atomic_read(&chip->wakeup_path)) { in pca953x_resume()
1253 ret = regulator_enable(chip->regulator); in pca953x_resume()
1270 /* convenience to stop overlong match-table lines */
1276 { .compatible = "nxp,pca6408", .data = OF_953X(8, PCA_INT), },
1277 { .compatible = "nxp,pca6416", .data = OF_953X(16, PCA_INT), },
1278 { .compatible = "nxp,pca9505", .data = OF_953X(40, PCA_INT), },
1279 { .compatible = "nxp,pca9506", .data = OF_953X(40, PCA_INT), },
1280 { .compatible = "nxp,pca9534", .data = OF_953X( 8, PCA_INT), },
1281 { .compatible = "nxp,pca9535", .data = OF_953X(16, PCA_INT), },
1282 { .compatible = "nxp,pca9536", .data = OF_953X( 4, 0), },
1283 { .compatible = "nxp,pca9537", .data = OF_953X( 4, PCA_INT), },
1284 { .compatible = "nxp,pca9538", .data = OF_953X( 8, PCA_INT), },
1285 { .compatible = "nxp,pca9539", .data = OF_953X(16, PCA_INT), },
1286 { .compatible = "nxp,pca9554", .data = OF_953X( 8, PCA_INT), },
1287 { .compatible = "nxp,pca9555", .data = OF_953X(16, PCA_INT), },
1288 { .compatible = "nxp,pca9556", .data = OF_953X( 8, 0), },
1289 { .compatible = "nxp,pca9557", .data = OF_953X( 8, 0), },
1290 { .compatible = "nxp,pca9574", .data = OF_957X( 8, PCA_INT), },
1291 { .compatible = "nxp,pca9575", .data = OF_957X(16, PCA_INT), },
1292 { .compatible = "nxp,pca9698", .data = OF_953X(40, 0), },
1294 { .compatible = "nxp,pcal6408", .data = OF_953X(8, PCA_LATCH_INT), },
1295 { .compatible = "nxp,pcal6416", .data = OF_953X(16, PCA_LATCH_INT), },
1296 { .compatible = "nxp,pcal6524", .data = OF_953X(24, PCA_LATCH_INT), },
1297 { .compatible = "nxp,pcal6534", .data = OF_653X(34, PCA_LATCH_INT), },
1298 { .compatible = "nxp,pcal9535", .data = OF_953X(16, PCA_LATCH_INT), },
1299 { .compatible = "nxp,pcal9554b", .data = OF_953X( 8, PCA_LATCH_INT), },
1300 { .compatible = "nxp,pcal9555a", .data = OF_953X(16, PCA_LATCH_INT), },