Lines Matching +full:driving +full:- +full:level +full:- +full:compensate
1 // SPDX-License-Identifier: GPL-2.0-only
28 #include <linux/pinctrl/pinconf-generic.h>
69 (CY8C95X0_VIRTUAL + (x) - CY8C95X0_PORTSEL + (p) * MUXED_STRIDE)
92 { "irq-gpios", &cy8c95x0_irq_gpios, 1, ACPI_GPIO_QUIRK_ABSOLUTE_NUMBER },
117 * Since first controller (gpio-sch.c) and second
118 * (gpio-dwapb.c) are at the fixed bases, we may safely
130 * struct cy8c95x0_pinctrl - driver data
135 * @irq_trig_raise: I/O bits affected by raising voltage level
136 * @irq_trig_fall: I/O bits affected by falling voltage level
137 * @irq_trig_low: I/O bits affected by a low voltage level
138 * @irq_trig_high: I/O bits affected by a high voltage level
140 * @shiftmask: Mask used to compensate for Gport2 width
492 return -EINVAL; in cy8c95x0_regmap_update_bits_base()
504 guard(mutex)(&chip->i2c_lock); in cy8c95x0_regmap_update_bits_base()
506 ret = regmap_update_bits_base(chip->regmap, off, mask, val, change, async, force); in cy8c95x0_regmap_update_bits_base()
511 * Allows to mark the registers as non-volatile and reduces I/O cycles. in cy8c95x0_regmap_update_bits_base()
515 regcache_cache_only(chip->regmap, true); in cy8c95x0_regmap_update_bits_base()
521 regmap_clear_bits(chip->regmap, off, mask & val); in cy8c95x0_regmap_update_bits_base()
523 regcache_cache_only(chip->regmap, false); in cy8c95x0_regmap_update_bits_base()
530 * cy8c95x0_regmap_write_bits() - writes a register using the regmap cache
554 * cy8c95x0_regmap_update_bits() - updates a register using the regmap cache
578 * cy8c95x0_regmap_read() - reads a register using the regmap cache
608 guard(mutex)(&chip->i2c_lock); in cy8c95x0_regmap_read()
610 ret = regmap_read(chip->regmap, off, read_val); in cy8c95x0_regmap_read()
625 bitmap_andnot(tmask, mask, chip->shiftmask, MAX_LINE); in cy8c95x0_write_regs_mask()
627 bitmap_replace(tmask, tmask, mask, chip->shiftmask, BANK_SZ * 3); in cy8c95x0_write_regs_mask()
629 bitmap_andnot(tval, val, chip->shiftmask, MAX_LINE); in cy8c95x0_write_regs_mask()
631 bitmap_replace(tval, tval, val, chip->shiftmask, BANK_SZ * 3); in cy8c95x0_write_regs_mask()
633 for (unsigned int i = 0; i < chip->nport; i++) { in cy8c95x0_write_regs_mask()
643 dev_err(chip->dev, "failed writing register %d, port %u: err %d\n", reg, i, ret); in cy8c95x0_write_regs_mask()
662 bitmap_andnot(tmask, mask, chip->shiftmask, MAX_LINE); in cy8c95x0_read_regs_mask()
664 bitmap_replace(tmask, tmask, mask, chip->shiftmask, BANK_SZ * 3); in cy8c95x0_read_regs_mask()
666 bitmap_andnot(tval, val, chip->shiftmask, MAX_LINE); in cy8c95x0_read_regs_mask()
668 bitmap_replace(tval, tval, val, chip->shiftmask, BANK_SZ * 3); in cy8c95x0_read_regs_mask()
670 for (unsigned int i = 0; i < chip->nport; i++) { in cy8c95x0_read_regs_mask()
678 dev_err(chip->dev, "failed reading register %d, port %u: err %d\n", reg, i, ret); in cy8c95x0_read_regs_mask()
689 bitmap_replace(val, tmp, tval, chip->shiftmask, MAX_LINE); in cy8c95x0_read_regs_mask()
707 /* Set output level */ in cy8c95x0_gpio_direction_output()
824 return -ENOTSUPP; in cy8c95x0_gpio_get_pincfg()
855 __clear_bit(off, chip->push_pull); in cy8c95x0_gpio_set_pincfg()
859 __clear_bit(off, chip->push_pull); in cy8c95x0_gpio_set_pincfg()
863 __clear_bit(off, chip->push_pull); in cy8c95x0_gpio_set_pincfg()
867 __clear_bit(off, chip->push_pull); in cy8c95x0_gpio_set_pincfg()
871 __clear_bit(off, chip->push_pull); in cy8c95x0_gpio_set_pincfg()
875 __set_bit(off, chip->push_pull); in cy8c95x0_gpio_set_pincfg()
886 return -ENOTSUPP; in cy8c95x0_gpio_set_pincfg()
914 struct device *dev = chip->dev; in cy8c95x0_add_pin_ranges()
917 ret = gpiochip_add_pin_range(gc, dev_name(dev), 0, 0, chip->tpin); in cy8c95x0_add_pin_ranges()
926 struct gpio_chip *gc = &chip->gpio_chip; in cy8c95x0_setup_gpiochip()
928 gc->request = gpiochip_generic_request; in cy8c95x0_setup_gpiochip()
929 gc->free = gpiochip_generic_free; in cy8c95x0_setup_gpiochip()
930 gc->direction_input = cy8c95x0_gpio_direction_input; in cy8c95x0_setup_gpiochip()
931 gc->direction_output = cy8c95x0_gpio_direction_output; in cy8c95x0_setup_gpiochip()
932 gc->get = cy8c95x0_gpio_get_value; in cy8c95x0_setup_gpiochip()
933 gc->set = cy8c95x0_gpio_set_value; in cy8c95x0_setup_gpiochip()
934 gc->get_direction = cy8c95x0_gpio_get_direction; in cy8c95x0_setup_gpiochip()
935 gc->get_multiple = cy8c95x0_gpio_get_multiple; in cy8c95x0_setup_gpiochip()
936 gc->set_multiple = cy8c95x0_gpio_set_multiple; in cy8c95x0_setup_gpiochip()
937 gc->set_config = gpiochip_generic_config; in cy8c95x0_setup_gpiochip()
938 gc->can_sleep = true; in cy8c95x0_setup_gpiochip()
939 gc->add_pin_ranges = cy8c95x0_add_pin_ranges; in cy8c95x0_setup_gpiochip()
941 gc->base = -1; in cy8c95x0_setup_gpiochip()
942 gc->ngpio = chip->tpin; in cy8c95x0_setup_gpiochip()
944 gc->parent = chip->dev; in cy8c95x0_setup_gpiochip()
945 gc->owner = THIS_MODULE; in cy8c95x0_setup_gpiochip()
946 gc->names = NULL; in cy8c95x0_setup_gpiochip()
948 gc->label = dev_name(chip->dev); in cy8c95x0_setup_gpiochip()
950 return devm_gpiochip_add_data(chip->dev, gc, chip); in cy8c95x0_setup_gpiochip()
959 set_bit(hwirq, chip->irq_mask); in cy8c95x0_irq_mask()
970 clear_bit(hwirq, chip->irq_mask); in cy8c95x0_irq_unmask()
978 mutex_lock(&chip->irq_lock); in cy8c95x0_irq_bus_lock()
991 cy8c95x0_write_regs_mask(chip, CY8C95X0_INTMASK, chip->irq_mask, ones); in cy8c95x0_irq_bus_sync_unlock()
994 cy8c95x0_read_regs_mask(chip, CY8C95X0_DIRECTION, reg_direction, chip->irq_mask); in cy8c95x0_irq_bus_sync_unlock()
995 bitmap_or(irq_mask, chip->irq_mask, reg_direction, MAX_LINE); in cy8c95x0_irq_bus_sync_unlock()
1001 mutex_unlock(&chip->irq_lock); in cy8c95x0_irq_bus_sync_unlock()
1024 dev_err(chip->dev, "irq %d: unsupported type %d\n", d->irq, type); in cy8c95x0_irq_set_type()
1025 return -EINVAL; in cy8c95x0_irq_set_type()
1028 assign_bit(hwirq, chip->irq_trig_fall, trig_type & IRQ_TYPE_EDGE_FALLING); in cy8c95x0_irq_set_type()
1029 assign_bit(hwirq, chip->irq_trig_raise, trig_type & IRQ_TYPE_EDGE_RISING); in cy8c95x0_irq_set_type()
1030 assign_bit(hwirq, chip->irq_trig_low, type == IRQ_TYPE_LEVEL_LOW); in cy8c95x0_irq_set_type()
1031 assign_bit(hwirq, chip->irq_trig_high, type == IRQ_TYPE_LEVEL_HIGH); in cy8c95x0_irq_set_type()
1042 clear_bit(hwirq, chip->irq_trig_raise); in cy8c95x0_irq_shutdown()
1043 clear_bit(hwirq, chip->irq_trig_fall); in cy8c95x0_irq_shutdown()
1044 clear_bit(hwirq, chip->irq_trig_low); in cy8c95x0_irq_shutdown()
1045 clear_bit(hwirq, chip->irq_trig_high); in cy8c95x0_irq_shutdown()
1049 .name = "cy8c95x0-irq",
1078 bitmap_replace(new_stat, chip->irq_trig_fall, chip->irq_trig_raise, in cy8c95x0_irq_pending()
1089 struct gpio_chip *gc = &chip->gpio_chip; in cy8c95x0_irq_handler()
1091 int nested_irq, level; in cy8c95x0_irq_handler() local
1099 for_each_set_bit(level, pending, MAX_LINE) { in cy8c95x0_irq_handler()
1101 nested_irq = irq_find_mapping(gc->irq.domain, level); in cy8c95x0_irq_handler()
1104 dev_warn_ratelimited(gc->parent, "unmapped interrupt %d\n", level); in cy8c95x0_irq_handler()
1108 if (test_bit(level, chip->irq_trig_low)) in cy8c95x0_irq_handler()
1109 while (!cy8c95x0_gpio_get_value(gc, level)) in cy8c95x0_irq_handler()
1111 else if (test_bit(level, chip->irq_trig_high)) in cy8c95x0_irq_handler()
1112 while (cy8c95x0_gpio_get_value(gc, level)) in cy8c95x0_irq_handler()
1127 return chip->tpin; in cy8c95x0_pinctrl_get_groups_count()
1200 *num_groups = chip->tpin; in cy8c95x0_get_function_groups()
1263 * Disable driving the pin by forcing it to HighZ. Only setting in cy8c95x0_pinmux_direction()
1264 * the direction register isn't sufficient in Push-Pull mode. in cy8c95x0_pinmux_direction()
1266 if (input && test_bit(pin, chip->push_pull)) { in cy8c95x0_pinmux_direction()
1271 __clear_bit(pin, chip->push_pull); in cy8c95x0_pinmux_direction()
1328 struct gpio_irq_chip *girq = &chip->gpio_chip.irq; in cy8c95x0_irq_setup()
1332 mutex_init(&chip->irq_lock); in cy8c95x0_irq_setup()
1339 dev_err(chip->dev, "failed to clear irq status register\n"); in cy8c95x0_irq_setup()
1344 bitmap_fill(chip->irq_mask, MAX_LINE); in cy8c95x0_irq_setup()
1349 girq->parent_handler = NULL; in cy8c95x0_irq_setup()
1350 girq->num_parents = 0; in cy8c95x0_irq_setup()
1351 girq->parents = NULL; in cy8c95x0_irq_setup()
1352 girq->default_type = IRQ_TYPE_NONE; in cy8c95x0_irq_setup()
1353 girq->handler = handle_simple_irq; in cy8c95x0_irq_setup()
1354 girq->threaded = true; in cy8c95x0_irq_setup()
1356 ret = devm_request_threaded_irq(chip->dev, irq, in cy8c95x0_irq_setup()
1359 dev_name(chip->dev), chip); in cy8c95x0_irq_setup()
1361 dev_err(chip->dev, "failed to request irq %d\n", irq); in cy8c95x0_irq_setup()
1364 dev_info(chip->dev, "Registered threaded IRQ\n"); in cy8c95x0_irq_setup()
1371 struct pinctrl_desc *pd = &chip->pinctrl_desc; in cy8c95x0_setup_pinctrl()
1373 pd->pctlops = &cy8c95x0_pinctrl_ops; in cy8c95x0_setup_pinctrl()
1374 pd->confops = &cy8c95x0_pinconf_ops; in cy8c95x0_setup_pinctrl()
1375 pd->pmxops = &cy8c95x0_pmxops; in cy8c95x0_setup_pinctrl()
1376 pd->name = dev_name(chip->dev); in cy8c95x0_setup_pinctrl()
1377 pd->pins = cy8c9560_pins; in cy8c95x0_setup_pinctrl()
1378 pd->npins = chip->tpin; in cy8c95x0_setup_pinctrl()
1379 pd->owner = THIS_MODULE; in cy8c95x0_setup_pinctrl()
1381 chip->pctldev = devm_pinctrl_register(chip->dev, pd, chip); in cy8c95x0_setup_pinctrl()
1382 if (IS_ERR(chip->pctldev)) in cy8c95x0_setup_pinctrl()
1383 return dev_err_probe(chip->dev, PTR_ERR(chip->pctldev), in cy8c95x0_setup_pinctrl()
1392 struct i2c_adapter *adapter = client->adapter; in cy8c95x0_detect()
1397 return -ENODEV; in cy8c95x0_detect()
1413 return -ENODEV; in cy8c95x0_detect()
1416 dev_info(&client->dev, "Found a %s chip at 0x%02x.\n", name, client->addr); in cy8c95x0_detect()
1417 strscpy(info->type, name); in cy8c95x0_detect()
1424 struct device *dev = &client->dev; in cy8c95x0_probe()
1432 return -ENOMEM; in cy8c95x0_probe()
1434 chip->dev = dev; in cy8c95x0_probe()
1437 chip->driver_data = (uintptr_t)i2c_get_match_data(client); in cy8c95x0_probe()
1438 if (!chip->driver_data) in cy8c95x0_probe()
1439 return -ENODEV; in cy8c95x0_probe()
1441 chip->tpin = chip->driver_data & CY8C95X0_GPIO_MASK; in cy8c95x0_probe()
1442 chip->nport = DIV_ROUND_UP(CY8C95X0_PIN_TO_OFFSET(chip->tpin), BANK_SZ); in cy8c95x0_probe()
1446 switch (chip->tpin) { in cy8c95x0_probe()
1448 strscpy(chip->name, cy8c95x0_id[0].name); in cy8c95x0_probe()
1449 regmap_range_conf.range_max = CY8C95X0_VIRTUAL + 3 * MUXED_STRIDE - 1; in cy8c95x0_probe()
1452 strscpy(chip->name, cy8c95x0_id[1].name); in cy8c95x0_probe()
1453 regmap_range_conf.range_max = CY8C95X0_VIRTUAL + 6 * MUXED_STRIDE - 1; in cy8c95x0_probe()
1456 strscpy(chip->name, cy8c95x0_id[2].name); in cy8c95x0_probe()
1457 regmap_range_conf.range_max = CY8C95X0_VIRTUAL + 8 * MUXED_STRIDE - 1; in cy8c95x0_probe()
1460 return -ENODEV; in cy8c95x0_probe()
1468 chip->gpio_reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); in cy8c95x0_probe()
1469 if (IS_ERR(chip->gpio_reset)) in cy8c95x0_probe()
1470 return dev_err_probe(dev, PTR_ERR(chip->gpio_reset), "Failed to get GPIO 'reset'\n"); in cy8c95x0_probe()
1471 gpiod_set_consumer_name(chip->gpio_reset, "CY8C95X0 RESET"); in cy8c95x0_probe()
1472 if (chip->gpio_reset) { in cy8c95x0_probe()
1474 gpiod_set_value_cansleep(chip->gpio_reset, 0); in cy8c95x0_probe()
1484 chip->regmap = devm_regmap_init_i2c(client, ®map_conf); in cy8c95x0_probe()
1485 if (IS_ERR(chip->regmap)) in cy8c95x0_probe()
1486 return PTR_ERR(chip->regmap); in cy8c95x0_probe()
1488 bitmap_zero(chip->push_pull, MAX_LINE); in cy8c95x0_probe()
1489 bitmap_zero(chip->shiftmask, MAX_LINE); in cy8c95x0_probe()
1490 bitmap_set(chip->shiftmask, 0, 20); in cy8c95x0_probe()
1491 mutex_init(&chip->i2c_lock); in cy8c95x0_probe()
1494 ret = cy8c95x0_acpi_get_irq(&client->dev); in cy8c95x0_probe()
1496 client->irq = ret; in cy8c95x0_probe()
1499 if (client->irq) { in cy8c95x0_probe()
1500 ret = cy8c95x0_irq_setup(chip, client->irq); in cy8c95x0_probe()
1520 .name = "cy8c95x0-pinctrl",