Lines Matching +full:nxp +full:- +full:i
2 * PCA953x 4/8/16/24/40 bit I/O ports
116 #define NBANK(chip) DIV_ROUND_UP(chip->gpio_chip.ngpio, BANK_SZ)
166 int bank_shift = fls((chip->gpio_chip.ngpio - 1) / 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()
185 int bank_shift = fls((chip->gpio_chip.ngpio - 1) / 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()
201 return i2c_smbus_write_byte_data(chip->client, reg, *val); in pca953x_write_regs_8()
208 return i2c_smbus_write_word_data(chip->client, reg << 1, word); in pca953x_write_regs_16()
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()
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()
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()
250 ret = i2c_smbus_read_byte_data(chip->client, reg); in pca953x_read_regs_8()
260 ret = i2c_smbus_read_word_data(chip->client, reg << 1); in pca953x_read_regs_16()
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()
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()
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()
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()
322 reg_val = chip->reg_output[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()
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()
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()
374 reg_val = chip->reg_output[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()
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()
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()
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()
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()
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()
464 chip->irq_mask[d->hwirq / BANK_SZ] &= ~(1 << (d->hwirq % BANK_SZ)); in pca953x_irq_mask()
472 chip->irq_mask[d->hwirq / BANK_SZ] |= 1 << (d->hwirq % BANK_SZ); in pca953x_irq_unmask()
480 mutex_lock(&chip->irq_lock); in pca953x_irq_bus_lock()
488 int level, i; 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()
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()
510 level + (BANK_SZ * i)); in pca953x_irq_bus_sync_unlock()
515 mutex_unlock(&chip->irq_lock); in pca953x_irq_bus_sync_unlock()
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()
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()
571 int ret, i; in pca953x_irq_pending() local
573 if (chip->driver_data & PCA_PCAL) { 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()
588 pending[i] &= trigger[i]; in pca953x_irq_pending()
589 if (pending[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()
608 if (trigger[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()
620 pending[i] &= trigger[i]; in pca953x_irq_pending()
621 if (pending[i]) in pca953x_irq_pending()
634 int i; in pca953x_irq_handler() local
639 for (i = 0; i < NBANK(chip); i++) { in pca953x_irq_handler()
640 while (pending[i]) { in pca953x_irq_handler()
641 level = __ffs(pending[i]); in pca953x_irq_handler()
642 handle_nested_irq(irq_find_mapping(chip->gpio_chip.irq.domain, in pca953x_irq_handler()
643 level + (BANK_SZ * i))); in pca953x_irq_handler()
644 pending[i] &= ~(1 << level); in pca953x_irq_handler()
655 struct i2c_client *client = chip->client; in pca953x_irq_setup()
656 int ret, i; in pca953x_irq_setup() local
658 if (client->irq && irq_base != -1 in pca953x_irq_setup()
659 && (chip->driver_data & PCA_INT)) { 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()
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()
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()
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()
793 chip = devm_kzalloc(&client->dev, 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()
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()
903 ret = devm_gpiochip_add_data(&client->dev, &chip->gpio_chip, chip); 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()
922 regulator_disable(chip->regulator); in pca953x_probe()
928 struct pca953x_platform_data *pdata = dev_get_platdata(&client->dev); in pca953x_remove()
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 */
952 { .compatible = "nxp,pca9505", .data = OF_953X(40, PCA_INT), },
953 { .compatible = "nxp,pca9534", .data = OF_953X( 8, PCA_INT), },
954 { .compatible = "nxp,pca9535", .data = OF_953X(16, PCA_INT), },
955 { .compatible = "nxp,pca9536", .data = OF_953X( 4, 0), },
956 { .compatible = "nxp,pca9537", .data = OF_953X( 4, PCA_INT), },
957 { .compatible = "nxp,pca9538", .data = OF_953X( 8, PCA_INT), },
958 { .compatible = "nxp,pca9539", .data = OF_953X(16, PCA_INT), },
959 { .compatible = "nxp,pca9554", .data = OF_953X( 8, PCA_INT), },
960 { .compatible = "nxp,pca9555", .data = OF_953X(16, PCA_INT), },
961 { .compatible = "nxp,pca9556", .data = OF_953X( 8, 0), },
962 { .compatible = "nxp,pca9557", .data = OF_953X( 8, 0), },
963 { .compatible = "nxp,pca9574", .data = OF_957X( 8, PCA_INT), },
964 { .compatible = "nxp,pca9575", .data = OF_957X(16, PCA_INT), },
965 { .compatible = "nxp,pca9698", .data = OF_953X(40, 0), },
967 { .compatible = "nxp,pcal6524", .data = OF_953X(24, PCA_LATCH_INT), },
968 { .compatible = "nxp,pcal9555a", .data = OF_953X(16, PCA_LATCH_INT), },