Lines Matching +full:gpio +full:- +full:latch

1 // SPDX-License-Identifier: GPL-2.0
8 #include <linux/gpio/driver.h>
54 * The digital-chip EIC controller can support maximum 3 banks, and each bank
60 #define SPRD_EIC_BIT(x) ((x) & (SPRD_EIC_PER_BANK_NR - 1))
67 * The Spreadtrum digital-chip EIC controller contains 4 sub-modules:
68 * debounce EIC, latch EIC, async EIC and sync EIC,
71 * (millisecond resolution) and a single-trigger mechanism is introduced
72 * into this sub-module to enhance the input event detection reliability.
75 * The latch EIC is used to latch some special power down signals and
76 * generate interrupts, since the latch EIC does not depend on the APB clock
82 * The EIC-sync is similar with GPIO's input function, which is a synchronized
115 "eic-debounce", "eic-latch", "eic-async",
116 "eic-sync",
145 return sprd_eic->base[bank]; in sprd_eic_offset_base()
157 spin_lock_irqsave(&sprd_eic->lock, flags); in sprd_eic_update()
166 spin_unlock_irqrestore(&sprd_eic->lock, flags); in sprd_eic_update()
193 switch (sprd_eic->type) { in sprd_eic_get()
201 return -ENOTSUPP; in sprd_eic_get()
240 return -ENOTSUPP; in sprd_eic_set_config()
249 switch (sprd_eic->type) { in sprd_eic_irq_mask()
264 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_irq_mask()
278 switch (sprd_eic->type) { in sprd_eic_irq_unmask()
293 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_irq_unmask()
303 switch (sprd_eic->type) { in sprd_eic_irq_ack()
317 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_irq_ack()
328 switch (sprd_eic->type) { in sprd_eic_irq_set_type()
356 return -ENOTSUPP; in sprd_eic_irq_set_type()
388 return -ENOTSUPP; in sprd_eic_irq_set_type()
430 return -ENOTSUPP; in sprd_eic_irq_set_type()
470 return -ENOTSUPP; in sprd_eic_irq_set_type()
474 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_irq_set_type()
475 return -ENOTSUPP; in sprd_eic_irq_set_type()
490 * The debounce EIC and latch EIC can only support level trigger, so we in sprd_eic_toggle_trigger()
493 if ((sprd_eic->type != SPRD_EIC_DEBOUNCE && in sprd_eic_toggle_trigger()
494 sprd_eic->type != SPRD_EIC_LATCH) || in sprd_eic_toggle_trigger()
502 switch (sprd_eic->type) { in sprd_eic_toggle_trigger()
522 dev_warn(chip->parent, "EIC level was changed.\n"); in sprd_eic_toggle_trigger()
535 for (bank = 0; bank * SPRD_EIC_PER_BANK_NR < chip->ngpio; bank++) { in sprd_eic_handle_one_type()
539 switch (sprd_eic->type) { in sprd_eic_handle_one_type()
557 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_handle_one_type()
564 girq = irq_find_mapping(chip->irq.domain, offset); in sprd_eic_handle_one_type()
579 * Since the digital-chip EIC 4 sub-modules (debounce, latch, async in sprd_eic_irq_handler()
593 sprd_eic_handle_one_type(&sprd_eic->chip); in sprd_eic_irq_notify()
599 .name = "sprd-eic",
618 struct device *dev = &pdev->dev; in sprd_eic_probe()
627 return -EINVAL; in sprd_eic_probe()
632 return -ENOMEM; in sprd_eic_probe()
634 spin_lock_init(&sprd_eic->lock); in sprd_eic_probe()
635 sprd_eic->type = pdata->type; in sprd_eic_probe()
637 sprd_eic->irq = platform_get_irq(pdev, 0); in sprd_eic_probe()
638 if (sprd_eic->irq < 0) in sprd_eic_probe()
639 return sprd_eic->irq; in sprd_eic_probe()
652 sprd_eic->base[i] = devm_ioremap_resource(dev, res); in sprd_eic_probe()
653 if (IS_ERR(sprd_eic->base[i])) in sprd_eic_probe()
654 return PTR_ERR(sprd_eic->base[i]); in sprd_eic_probe()
657 sprd_eic->chip.label = sprd_eic_label_name[sprd_eic->type]; in sprd_eic_probe()
658 sprd_eic->chip.ngpio = pdata->num_eics; in sprd_eic_probe()
659 sprd_eic->chip.base = -1; in sprd_eic_probe()
660 sprd_eic->chip.parent = dev; in sprd_eic_probe()
661 sprd_eic->chip.direction_input = sprd_eic_direction_input; in sprd_eic_probe()
662 switch (sprd_eic->type) { in sprd_eic_probe()
664 sprd_eic->chip.request = sprd_eic_request; in sprd_eic_probe()
665 sprd_eic->chip.free = sprd_eic_free; in sprd_eic_probe()
666 sprd_eic->chip.set_config = sprd_eic_set_config; in sprd_eic_probe()
667 sprd_eic->chip.set = sprd_eic_set; in sprd_eic_probe()
671 sprd_eic->chip.get = sprd_eic_get; in sprd_eic_probe()
678 irq = &sprd_eic->chip.irq; in sprd_eic_probe()
680 irq->handler = handle_bad_irq; in sprd_eic_probe()
681 irq->default_type = IRQ_TYPE_NONE; in sprd_eic_probe()
682 irq->parent_handler = sprd_eic_irq_handler; in sprd_eic_probe()
683 irq->parent_handler_data = sprd_eic; in sprd_eic_probe()
684 irq->num_parents = 1; in sprd_eic_probe()
685 irq->parents = &sprd_eic->irq; in sprd_eic_probe()
687 ret = devm_gpiochip_add_data(dev, &sprd_eic->chip, sprd_eic); in sprd_eic_probe()
693 sprd_eic->irq_nb.notifier_call = sprd_eic_irq_notify; in sprd_eic_probe()
695 &sprd_eic->irq_nb); in sprd_eic_probe()
701 &sprd_eic->irq_nb); in sprd_eic_probe()
706 .compatible = "sprd,sc9860-eic-debounce",
710 .compatible = "sprd,sc9860-eic-latch",
714 .compatible = "sprd,sc9860-eic-async",
718 .compatible = "sprd,sc9860-eic-sync",
730 .name = "sprd-eic",