Lines Matching +full:sc9860 +full:- +full:eic +full:- +full:debounce
1 // SPDX-License-Identifier: GPL-2.0
17 /* EIC registers definition */
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))
64 * The Spreadtrum EIC (external interrupt controller) can be used only in
67 * The Spreadtrum digital-chip EIC controller contains 4 sub-modules:
68 * debounce EIC, latch EIC, async EIC and sync EIC,
70 * The debounce EIC is used to capture the input signals' stable status
71 * (millisecond resolution) and a single-trigger mechanism is introduced
72 * into this sub-module to enhance the input event detection reliability.
73 * The debounce range is from 1ms to 4s with a step size of 1ms.
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
79 * The async EIC uses a 32k clock to capture the short signals (microsecond
82 * The EIC-sync is similar with GPIO's input function, which is a synchronized
114 "eic-debounce", "eic-latch", "eic-async",
115 "eic-sync",
140 return sprd_eic->base[bank]; in sprd_eic_offset_base()
152 spin_lock_irqsave(&sprd_eic->lock, flags); in sprd_eic_update()
161 spin_unlock_irqrestore(&sprd_eic->lock, flags); in sprd_eic_update()
188 switch (sprd_eic->type) { in sprd_eic_get()
196 return -ENOTSUPP; in sprd_eic_get()
213 unsigned int debounce) in sprd_eic_set_debounce() argument
221 value |= (debounce / 1000) & SPRD_EIC_DBNC_MASK; in sprd_eic_set_debounce()
236 return -ENOTSUPP; in sprd_eic_set_config()
245 switch (sprd_eic->type) { in sprd_eic_irq_mask()
260 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_irq_mask()
274 switch (sprd_eic->type) { in sprd_eic_irq_unmask()
289 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_irq_unmask()
299 switch (sprd_eic->type) { in sprd_eic_irq_ack()
313 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_irq_ack()
324 switch (sprd_eic->type) { in sprd_eic_irq_set_type()
352 return -ENOTSUPP; in sprd_eic_irq_set_type()
384 return -ENOTSUPP; in sprd_eic_irq_set_type()
426 return -ENOTSUPP; in sprd_eic_irq_set_type()
466 return -ENOTSUPP; in sprd_eic_irq_set_type()
470 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_irq_set_type()
471 return -ENOTSUPP; in sprd_eic_irq_set_type()
486 * The debounce EIC and latch EIC can only support level trigger, so we in sprd_eic_toggle_trigger()
489 if ((sprd_eic->type != SPRD_EIC_DEBOUNCE && in sprd_eic_toggle_trigger()
490 sprd_eic->type != SPRD_EIC_LATCH) || in sprd_eic_toggle_trigger()
498 switch (sprd_eic->type) { in sprd_eic_toggle_trigger()
518 dev_warn(chip->parent, "EIC level was changed.\n"); in sprd_eic_toggle_trigger()
531 for (bank = 0; bank * SPRD_EIC_PER_BANK_NR < chip->ngpio; bank++) { in sprd_eic_handle_one_type()
535 switch (sprd_eic->type) { in sprd_eic_handle_one_type()
553 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_handle_one_type()
560 girq = irq_find_mapping(chip->irq.domain, offset); in sprd_eic_handle_one_type()
575 * Since the digital-chip EIC 4 sub-modules (debounce, latch, async in sprd_eic_irq_handler()
577 * them to let them check if there are EIC interrupts were triggered. in sprd_eic_irq_handler()
589 sprd_eic_handle_one_type(&sprd_eic->chip); in sprd_eic_irq_notify()
595 .name = "sprd-eic",
614 struct device *dev = &pdev->dev; in sprd_eic_probe()
624 return -EINVAL; in sprd_eic_probe()
629 return -ENOMEM; in sprd_eic_probe()
631 spin_lock_init(&sprd_eic->lock); in sprd_eic_probe()
632 sprd_eic->type = pdata->type; in sprd_eic_probe()
634 sprd_eic->irq = platform_get_irq(pdev, 0); in sprd_eic_probe()
635 if (sprd_eic->irq < 0) in sprd_eic_probe()
636 return sprd_eic->irq; in sprd_eic_probe()
640 * We can have maximum 3 banks EICs, and each EIC has in sprd_eic_probe()
642 * have one bank EIC, thus base[1] and base[2] can be in sprd_eic_probe()
649 sprd_eic->base[i] = devm_ioremap_resource(dev, res); in sprd_eic_probe()
650 if (IS_ERR(sprd_eic->base[i])) in sprd_eic_probe()
651 return PTR_ERR(sprd_eic->base[i]); in sprd_eic_probe()
656 sprd_eic->chip.label = sprd_eic_label_name[sprd_eic->type]; in sprd_eic_probe()
657 sprd_eic->chip.ngpio = num_banks * SPRD_EIC_PER_BANK_NR; in sprd_eic_probe()
658 sprd_eic->chip.base = -1; in sprd_eic_probe()
659 sprd_eic->chip.parent = dev; in sprd_eic_probe()
660 sprd_eic->chip.direction_input = sprd_eic_direction_input; in sprd_eic_probe()
661 switch (sprd_eic->type) { in sprd_eic_probe()
663 sprd_eic->chip.request = sprd_eic_request; in sprd_eic_probe()
664 sprd_eic->chip.free = sprd_eic_free; in sprd_eic_probe()
665 sprd_eic->chip.set_config = sprd_eic_set_config; in sprd_eic_probe()
666 sprd_eic->chip.set = sprd_eic_set; in sprd_eic_probe()
670 sprd_eic->chip.get = sprd_eic_get; in sprd_eic_probe()
677 irq = &sprd_eic->chip.irq; in sprd_eic_probe()
679 irq->handler = handle_bad_irq; in sprd_eic_probe()
680 irq->default_type = IRQ_TYPE_NONE; in sprd_eic_probe()
681 irq->parent_handler = sprd_eic_irq_handler; in sprd_eic_probe()
682 irq->parent_handler_data = sprd_eic; in sprd_eic_probe()
683 irq->num_parents = 1; in sprd_eic_probe()
684 irq->parents = &sprd_eic->irq; in sprd_eic_probe()
686 ret = devm_gpiochip_add_data(dev, &sprd_eic->chip, sprd_eic); in sprd_eic_probe()
692 sprd_eic->irq_nb.notifier_call = sprd_eic_irq_notify; in sprd_eic_probe()
694 &sprd_eic->irq_nb); in sprd_eic_probe()
700 &sprd_eic->irq_nb); in sprd_eic_probe()
705 .compatible = "sprd,sc9860-eic-debounce",
709 .compatible = "sprd,sc9860-eic-latch",
713 .compatible = "sprd,sc9860-eic-async",
717 .compatible = "sprd,sc9860-eic-sync",
729 .name = "sprd-eic",
736 MODULE_DESCRIPTION("Spreadtrum EIC driver");