Lines Matching +full:pins +full:- +full:are +full:- +full:numbered
1 // SPDX-License-Identifier: GPL-2.0-only
24 * Bank 0 covers pins "GPIO 1/R0" to "GPIO 6/R5", numbered 0 to 5 by the
25 * driver, and bank 1 covers pins "GPIO 7/C0" to "GPIO 11/C4", numbered 6 to
31 #define ADP5585_BIT(n) ((n) >= 6 ? BIT((n) - 6) : BIT(n))
34 * Bank 0 covers pins "GPIO 1/R0" to "GPIO 8/R7", numbered 0 to 7 by the
35 * driver, bank 1 covers pins "GPIO 9/C0" to "GPIO 16/C7", numbered 8 to
36 * 15 and bank 3 covers pins "GPIO 17/C8" to "GPIO 19/C10", numbered 16 to 18.
92 const struct adp5585_gpio_chip *info = adp5585_gpio->info; in adp5585_gpio_get_direction()
95 regmap_read(adp5585_gpio->regmap, info->gpio_dir_a + info->bank(off), &val); in adp5585_gpio_get_direction()
97 return val & info->bit(off) ? GPIO_LINE_DIRECTION_OUT : GPIO_LINE_DIRECTION_IN; in adp5585_gpio_get_direction()
103 const struct adp5585_gpio_chip *info = adp5585_gpio->info; in adp5585_gpio_direction_input()
105 return regmap_clear_bits(adp5585_gpio->regmap, info->gpio_dir_a + info->bank(off), in adp5585_gpio_direction_input()
106 info->bit(off)); in adp5585_gpio_direction_input()
112 const struct adp5585_gpio_chip *info = adp5585_gpio->info; in adp5585_gpio_direction_output()
113 unsigned int bank = info->bank(off); in adp5585_gpio_direction_output()
114 unsigned int bit = info->bit(off); in adp5585_gpio_direction_output()
117 ret = regmap_update_bits(adp5585_gpio->regmap, info->gpo_data_a + bank, in adp5585_gpio_direction_output()
122 return regmap_set_bits(adp5585_gpio->regmap, info->gpio_dir_a + bank, in adp5585_gpio_direction_output()
129 const struct adp5585_gpio_chip *info = adp5585_gpio->info; in adp5585_gpio_get_value()
130 unsigned int bank = info->bank(off); in adp5585_gpio_get_value()
131 unsigned int bit = info->bit(off); in adp5585_gpio_get_value()
146 regmap_read(adp5585_gpio->regmap, info->gpio_dir_a + bank, &val); in adp5585_gpio_get_value()
147 reg = val & bit ? info->gpo_data_a : info->gpi_stat_a; in adp5585_gpio_get_value()
148 regmap_read(adp5585_gpio->regmap, reg + bank, &val); in adp5585_gpio_get_value()
157 const struct adp5585_gpio_chip *info = adp5585_gpio->info; in adp5585_gpio_set_value()
158 unsigned int bit = adp5585_gpio->info->bit(off); in adp5585_gpio_set_value()
160 return regmap_update_bits(adp5585_gpio->regmap, info->gpo_data_a + info->bank(off), in adp5585_gpio_set_value()
167 const struct adp5585_gpio_chip *info = adp5585_gpio->info; in adp5585_gpio_set_bias()
171 * The bias configuration fields are 2 bits wide and laid down in in adp5585_gpio_set_bias()
176 if (info->has_bias_hole) in adp5585_gpio_set_bias()
178 reg = info->rpull_cfg_a + bit / 8; in adp5585_gpio_set_bias()
182 return regmap_update_bits(adp5585_gpio->regmap, reg, mask, val); in adp5585_gpio_set_bias()
188 const struct adp5585_gpio_chip *info = adp5585_gpio->info; in adp5585_gpio_set_drive()
189 unsigned int bit = adp5585_gpio->info->bit(off); in adp5585_gpio_set_drive()
191 return regmap_update_bits(adp5585_gpio->regmap, in adp5585_gpio_set_drive()
192 info->gpo_out_a + info->bank(off), bit, in adp5585_gpio_set_drive()
199 const struct adp5585_gpio_chip *info = adp5585_gpio->info; in adp5585_gpio_set_debounce()
200 unsigned int bit = adp5585_gpio->info->bit(off); in adp5585_gpio_set_debounce()
202 return regmap_update_bits(adp5585_gpio->regmap, in adp5585_gpio_set_debounce()
203 info->debounce_dis_a + info->bank(off), bit, in adp5585_gpio_set_debounce()
237 return -ENOTSUPP; in adp5585_gpio_set_config()
244 const struct adp5585_gpio_chip *info = adp5585_gpio->info; in adp5585_gpio_request()
245 struct device *dev = chip->parent; in adp5585_gpio_request()
246 struct adp5585_dev *adp5585 = dev_get_drvdata(dev->parent); in adp5585_gpio_request()
247 const struct adp5585_regs *regs = adp5585->regs; in adp5585_gpio_request()
250 ret = test_and_set_bit(off, adp5585->pin_usage); in adp5585_gpio_request()
252 return -EBUSY; in adp5585_gpio_request()
255 return regmap_clear_bits(adp5585_gpio->regmap, in adp5585_gpio_request()
256 regs->pin_cfg_a + info->bank(off), in adp5585_gpio_request()
257 info->bit(off)); in adp5585_gpio_request()
262 struct device *dev = chip->parent; in adp5585_gpio_free()
263 struct adp5585_dev *adp5585 = dev_get_drvdata(dev->parent); in adp5585_gpio_free()
265 clear_bit(off, adp5585->pin_usage); in adp5585_gpio_free()
272 struct device *dev = adp5585_gpio->gpio_chip.parent; in adp5585_gpio_key_event()
280 if (key < adp5585_gpio->info->gpi_ev_min || key > adp5585_gpio->info->gpi_ev_max) in adp5585_gpio_key_event()
283 off = key - adp5585_gpio->info->gpi_ev_min; in adp5585_gpio_key_event()
284 active_high = test_bit(off, &adp5585_gpio->irq_active_high); in adp5585_gpio_key_event()
286 irq = irq_find_mapping(adp5585_gpio->gpio_chip.irq.domain, off); in adp5585_gpio_key_event()
296 dev_dbg_ratelimited(dev, "gpio-keys event(%u) press=%lu, a_high=%u\n", in adp5585_gpio_key_event()
316 mutex_lock(&adp5585_gpio->bus_lock); in adp5585_irq_bus_lock()
323 const struct adp5585_gpio_chip *info = adp5585_gpio->info; in adp5585_irq_bus_sync_unlock()
325 bool active_high = test_bit(hwirq, &adp5585_gpio->irq_active_high); in adp5585_irq_bus_sync_unlock()
326 bool enabled = test_bit(hwirq, &adp5585_gpio->irq_en); in adp5585_irq_bus_sync_unlock()
327 bool masked = test_bit(hwirq, &adp5585_gpio->irq_mask); in adp5585_irq_bus_sync_unlock()
328 unsigned int bank = adp5585_gpio->info->bank(hwirq); in adp5585_irq_bus_sync_unlock()
329 unsigned int bit = adp5585_gpio->info->bit(hwirq); in adp5585_irq_bus_sync_unlock()
336 regmap_update_bits(adp5585_gpio->regmap, info->gpi_int_lvl_a + bank, bit, in adp5585_irq_bus_sync_unlock()
338 regmap_update_bits(adp5585_gpio->regmap, info->gpi_ev_a + bank, bit, in adp5585_irq_bus_sync_unlock()
340 assign_bit(hwirq, &adp5585_gpio->irq_en, !masked); in adp5585_irq_bus_sync_unlock()
343 mutex_unlock(&adp5585_gpio->bus_lock); in adp5585_irq_bus_sync_unlock()
352 __set_bit(hwirq, &adp5585_gpio->irq_mask); in adp5585_irq_mask()
363 __clear_bit(hwirq, &adp5585_gpio->irq_mask); in adp5585_irq_unmask()
373 return -EINVAL; in adp5585_irq_set_type()
375 assign_bit(hwirq, &adp5585_gpio->irq_active_high, in adp5585_irq_set_type()
396 struct device *dev = adp5585_gpio->gpio_chip.parent; in adp5585_gpio_unreg_notifier()
397 struct adp5585_dev *adp5585 = dev_get_drvdata(dev->parent); in adp5585_gpio_unreg_notifier()
399 blocking_notifier_chain_unregister(&adp5585->event_notifier, in adp5585_gpio_unreg_notifier()
400 &adp5585_gpio->nb); in adp5585_gpio_unreg_notifier()
405 struct adp5585_dev *adp5585 = dev_get_drvdata(pdev->dev.parent); in adp5585_gpio_probe()
408 struct device *dev = &pdev->dev; in adp5585_gpio_probe()
415 return -ENOMEM; in adp5585_gpio_probe()
417 adp5585_gpio->regmap = adp5585->regmap; in adp5585_gpio_probe()
419 adp5585_gpio->info = (const struct adp5585_gpio_chip *)id->driver_data; in adp5585_gpio_probe()
420 if (!adp5585_gpio->info) in adp5585_gpio_probe()
421 return -ENODEV; in adp5585_gpio_probe()
423 device_set_of_node_from_dev(dev, dev->parent); in adp5585_gpio_probe()
425 gc = &adp5585_gpio->gpio_chip; in adp5585_gpio_probe()
426 gc->parent = dev; in adp5585_gpio_probe()
427 gc->get_direction = adp5585_gpio_get_direction; in adp5585_gpio_probe()
428 gc->direction_input = adp5585_gpio_direction_input; in adp5585_gpio_probe()
429 gc->direction_output = adp5585_gpio_direction_output; in adp5585_gpio_probe()
430 gc->get = adp5585_gpio_get_value; in adp5585_gpio_probe()
431 gc->set = adp5585_gpio_set_value; in adp5585_gpio_probe()
432 gc->set_config = adp5585_gpio_set_config; in adp5585_gpio_probe()
433 gc->request = adp5585_gpio_request; in adp5585_gpio_probe()
434 gc->free = adp5585_gpio_free; in adp5585_gpio_probe()
435 gc->can_sleep = true; in adp5585_gpio_probe()
437 gc->base = -1; in adp5585_gpio_probe()
438 gc->ngpio = adp5585->n_pins; in adp5585_gpio_probe()
439 gc->label = pdev->name; in adp5585_gpio_probe()
440 gc->owner = THIS_MODULE; in adp5585_gpio_probe()
442 if (device_property_present(dev->parent, "interrupt-controller")) { in adp5585_gpio_probe()
443 if (!adp5585->irq) in adp5585_gpio_probe()
444 return dev_err_probe(dev, -EINVAL, in adp5585_gpio_probe()
447 girq = &adp5585_gpio->gpio_chip.irq; in adp5585_gpio_probe()
449 girq->handler = handle_bad_irq; in adp5585_gpio_probe()
450 girq->threaded = true; in adp5585_gpio_probe()
452 adp5585_gpio->nb.notifier_call = adp5585_gpio_key_event; in adp5585_gpio_probe()
453 ret = blocking_notifier_chain_register(&adp5585->event_notifier, in adp5585_gpio_probe()
454 &adp5585_gpio->nb); in adp5585_gpio_probe()
465 adp5585_gpio->irq_mask = ~0UL; in adp5585_gpio_probe()
467 ret = devm_mutex_init(dev, &adp5585_gpio->bus_lock); in adp5585_gpio_probe()
470 ret = devm_gpiochip_add_data(dev, &adp5585_gpio->gpio_chip, in adp5585_gpio_probe()
510 { "adp5585-gpio", (kernel_ulong_t)&adp5585_gpio_chip_info },
511 { "adp5589-gpio", (kernel_ulong_t)&adp5589_gpio_chip_info },
518 .name = "adp5585-gpio",