• Home
  • Raw
  • Download

Lines Matching +full:eic +full:- +full:async

1 // SPDX-License-Identifier: GPL-2.0
16 /* EIC registers definition */
53 * The digital-chip EIC controller can support maximum 3 banks, and each bank
59 #define SPRD_EIC_BIT(x) ((x) & (SPRD_EIC_PER_BANK_NR - 1))
63 * The Spreadtrum EIC (external interrupt controller) can be used only in
66 * The Spreadtrum digital-chip EIC controller contains 4 sub-modules:
67 * debounce EIC, latch EIC, async EIC and sync EIC,
69 * The debounce EIC is used to capture the input signals' stable status
70 * (millisecond resolution) and a single-trigger mechanism is introduced
71 * into this sub-module to enhance the input event detection reliability.
74 * The latch EIC is used to latch some special power down signals and
75 * generate interrupts, since the latch EIC does not depend on the APB clock
78 * The async EIC uses a 32k clock to capture the short signals (microsecond
81 * The EIC-sync is similar with GPIO's input function, which is a synchronized
107 "eic-debounce", "eic-latch", "eic-async",
108 "eic-sync",
137 return sprd_eic->base[bank]; in sprd_eic_offset_base()
149 spin_lock_irqsave(&sprd_eic->lock, flags); in sprd_eic_update()
158 spin_unlock_irqrestore(&sprd_eic->lock, flags); in sprd_eic_update()
185 switch (sprd_eic->type) { in sprd_eic_get()
193 return -ENOTSUPP; in sprd_eic_get()
232 return -ENOTSUPP; in sprd_eic_set_config()
241 switch (sprd_eic->type) { in sprd_eic_irq_mask()
256 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_irq_mask()
266 switch (sprd_eic->type) { in sprd_eic_irq_unmask()
281 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_irq_unmask()
291 switch (sprd_eic->type) { in sprd_eic_irq_ack()
305 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_irq_ack()
316 switch (sprd_eic->type) { in sprd_eic_irq_set_type()
344 return -ENOTSUPP; in sprd_eic_irq_set_type()
376 return -ENOTSUPP; in sprd_eic_irq_set_type()
418 return -ENOTSUPP; in sprd_eic_irq_set_type()
458 return -ENOTSUPP; in sprd_eic_irq_set_type()
462 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_irq_set_type()
463 return -ENOTSUPP; in sprd_eic_irq_set_type()
478 * The debounce EIC and latch EIC can only support level trigger, so we in sprd_eic_toggle_trigger()
481 if ((sprd_eic->type != SPRD_EIC_DEBOUNCE && in sprd_eic_toggle_trigger()
482 sprd_eic->type != SPRD_EIC_LATCH) || in sprd_eic_toggle_trigger()
490 switch (sprd_eic->type) { in sprd_eic_toggle_trigger()
510 dev_warn(chip->parent, "EIC level was changed.\n"); in sprd_eic_toggle_trigger()
522 return !strcmp(chip->label, sprd_eic_label_name[type]); in sprd_eic_match_chip_by_type()
530 for (bank = 0; bank * SPRD_EIC_PER_BANK_NR < chip->ngpio; bank++) { in sprd_eic_handle_one_type()
534 switch (sprd_eic->type) { in sprd_eic_handle_one_type()
552 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_handle_one_type()
559 girq = irq_find_mapping(chip->irq.domain, offset); in sprd_eic_handle_one_type()
576 * Since the digital-chip EIC 4 sub-modules (debounce, latch, async in sprd_eic_irq_handler()
578 * EIC module to check if there are EIC interrupts were triggered. in sprd_eic_irq_handler()
599 pdata = of_device_get_match_data(&pdev->dev); in sprd_eic_probe()
601 dev_err(&pdev->dev, "No matching driver data found.\n"); in sprd_eic_probe()
602 return -EINVAL; in sprd_eic_probe()
605 sprd_eic = devm_kzalloc(&pdev->dev, sizeof(*sprd_eic), GFP_KERNEL); in sprd_eic_probe()
607 return -ENOMEM; in sprd_eic_probe()
609 spin_lock_init(&sprd_eic->lock); in sprd_eic_probe()
610 sprd_eic->type = pdata->type; in sprd_eic_probe()
612 sprd_eic->irq = platform_get_irq(pdev, 0); in sprd_eic_probe()
613 if (sprd_eic->irq < 0) in sprd_eic_probe()
614 return sprd_eic->irq; in sprd_eic_probe()
618 * We can have maximum 3 banks EICs, and each EIC has in sprd_eic_probe()
620 * have one bank EIC, thus base[1] and base[2] can be in sprd_eic_probe()
627 sprd_eic->base[i] = devm_ioremap_resource(&pdev->dev, res); in sprd_eic_probe()
628 if (IS_ERR(sprd_eic->base[i])) in sprd_eic_probe()
629 return PTR_ERR(sprd_eic->base[i]); in sprd_eic_probe()
632 sprd_eic->chip.label = sprd_eic_label_name[sprd_eic->type]; in sprd_eic_probe()
633 sprd_eic->chip.ngpio = pdata->num_eics; in sprd_eic_probe()
634 sprd_eic->chip.base = -1; in sprd_eic_probe()
635 sprd_eic->chip.parent = &pdev->dev; in sprd_eic_probe()
636 sprd_eic->chip.of_node = pdev->dev.of_node; in sprd_eic_probe()
637 sprd_eic->chip.direction_input = sprd_eic_direction_input; in sprd_eic_probe()
638 switch (sprd_eic->type) { in sprd_eic_probe()
640 sprd_eic->chip.request = sprd_eic_request; in sprd_eic_probe()
641 sprd_eic->chip.free = sprd_eic_free; in sprd_eic_probe()
642 sprd_eic->chip.set_config = sprd_eic_set_config; in sprd_eic_probe()
643 sprd_eic->chip.set = sprd_eic_set; in sprd_eic_probe()
647 sprd_eic->chip.get = sprd_eic_get; in sprd_eic_probe()
654 sprd_eic->intc.name = dev_name(&pdev->dev); in sprd_eic_probe()
655 sprd_eic->intc.irq_ack = sprd_eic_irq_ack; in sprd_eic_probe()
656 sprd_eic->intc.irq_mask = sprd_eic_irq_mask; in sprd_eic_probe()
657 sprd_eic->intc.irq_unmask = sprd_eic_irq_unmask; in sprd_eic_probe()
658 sprd_eic->intc.irq_set_type = sprd_eic_irq_set_type; in sprd_eic_probe()
659 sprd_eic->intc.flags = IRQCHIP_SKIP_SET_WAKE; in sprd_eic_probe()
661 irq = &sprd_eic->chip.irq; in sprd_eic_probe()
662 irq->chip = &sprd_eic->intc; in sprd_eic_probe()
663 irq->handler = handle_bad_irq; in sprd_eic_probe()
664 irq->default_type = IRQ_TYPE_NONE; in sprd_eic_probe()
665 irq->parent_handler = sprd_eic_irq_handler; in sprd_eic_probe()
666 irq->parent_handler_data = sprd_eic; in sprd_eic_probe()
667 irq->num_parents = 1; in sprd_eic_probe()
668 irq->parents = &sprd_eic->irq; in sprd_eic_probe()
670 ret = devm_gpiochip_add_data(&pdev->dev, &sprd_eic->chip, sprd_eic); in sprd_eic_probe()
672 dev_err(&pdev->dev, "Could not register gpiochip %d.\n", ret); in sprd_eic_probe()
682 .compatible = "sprd,sc9860-eic-debounce",
686 .compatible = "sprd,sc9860-eic-latch",
690 .compatible = "sprd,sc9860-eic-async",
694 .compatible = "sprd,sc9860-eic-sync",
706 .name = "sprd-eic",
713 MODULE_DESCRIPTION("Spreadtrum EIC driver");