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
106 "eic-debounce", "eic-latch", "eic-async",
107 "eic-sync",
136 return sprd_eic->base[bank]; in sprd_eic_offset_base()
148 spin_lock_irqsave(&sprd_eic->lock, flags); in sprd_eic_update()
157 spin_unlock_irqrestore(&sprd_eic->lock, flags); in sprd_eic_update()
184 switch (sprd_eic->type) { in sprd_eic_get()
192 return -ENOTSUPP; in sprd_eic_get()
231 return -ENOTSUPP; in sprd_eic_set_config()
240 switch (sprd_eic->type) { in sprd_eic_irq_mask()
255 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_irq_mask()
269 switch (sprd_eic->type) { in sprd_eic_irq_unmask()
284 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_irq_unmask()
294 switch (sprd_eic->type) { in sprd_eic_irq_ack()
308 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_irq_ack()
319 switch (sprd_eic->type) { in sprd_eic_irq_set_type()
347 return -ENOTSUPP; in sprd_eic_irq_set_type()
379 return -ENOTSUPP; in sprd_eic_irq_set_type()
421 return -ENOTSUPP; in sprd_eic_irq_set_type()
461 return -ENOTSUPP; in sprd_eic_irq_set_type()
465 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_irq_set_type()
466 return -ENOTSUPP; in sprd_eic_irq_set_type()
481 * The debounce EIC and latch EIC can only support level trigger, so we in sprd_eic_toggle_trigger()
484 if ((sprd_eic->type != SPRD_EIC_DEBOUNCE && in sprd_eic_toggle_trigger()
485 sprd_eic->type != SPRD_EIC_LATCH) || in sprd_eic_toggle_trigger()
493 switch (sprd_eic->type) { in sprd_eic_toggle_trigger()
513 dev_warn(chip->parent, "EIC level was changed.\n"); in sprd_eic_toggle_trigger()
525 return !strcmp(chip->label, sprd_eic_label_name[type]); in sprd_eic_match_chip_by_type()
533 for (bank = 0; bank * SPRD_EIC_PER_BANK_NR < chip->ngpio; bank++) { in sprd_eic_handle_one_type()
537 switch (sprd_eic->type) { in sprd_eic_handle_one_type()
555 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_handle_one_type()
562 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()
581 * EIC module to check if there are EIC interrupts were triggered. in sprd_eic_irq_handler()
595 .name = "sprd-eic",
611 pdata = of_device_get_match_data(&pdev->dev); in sprd_eic_probe()
613 dev_err(&pdev->dev, "No matching driver data found.\n"); in sprd_eic_probe()
614 return -EINVAL; in sprd_eic_probe()
617 sprd_eic = devm_kzalloc(&pdev->dev, sizeof(*sprd_eic), GFP_KERNEL); in sprd_eic_probe()
619 return -ENOMEM; in sprd_eic_probe()
621 spin_lock_init(&sprd_eic->lock); in sprd_eic_probe()
622 sprd_eic->type = pdata->type; in sprd_eic_probe()
624 sprd_eic->irq = platform_get_irq(pdev, 0); in sprd_eic_probe()
625 if (sprd_eic->irq < 0) in sprd_eic_probe()
626 return sprd_eic->irq; in sprd_eic_probe()
630 * We can have maximum 3 banks EICs, and each EIC has in sprd_eic_probe()
632 * have one bank EIC, thus base[1] and base[2] can be in sprd_eic_probe()
639 sprd_eic->base[i] = devm_ioremap_resource(&pdev->dev, res); in sprd_eic_probe()
640 if (IS_ERR(sprd_eic->base[i])) in sprd_eic_probe()
641 return PTR_ERR(sprd_eic->base[i]); in sprd_eic_probe()
644 sprd_eic->chip.label = sprd_eic_label_name[sprd_eic->type]; in sprd_eic_probe()
645 sprd_eic->chip.ngpio = pdata->num_eics; in sprd_eic_probe()
646 sprd_eic->chip.base = -1; in sprd_eic_probe()
647 sprd_eic->chip.parent = &pdev->dev; in sprd_eic_probe()
648 sprd_eic->chip.direction_input = sprd_eic_direction_input; in sprd_eic_probe()
649 switch (sprd_eic->type) { in sprd_eic_probe()
651 sprd_eic->chip.request = sprd_eic_request; in sprd_eic_probe()
652 sprd_eic->chip.free = sprd_eic_free; in sprd_eic_probe()
653 sprd_eic->chip.set_config = sprd_eic_set_config; in sprd_eic_probe()
654 sprd_eic->chip.set = sprd_eic_set; in sprd_eic_probe()
658 sprd_eic->chip.get = sprd_eic_get; in sprd_eic_probe()
665 irq = &sprd_eic->chip.irq; in sprd_eic_probe()
667 irq->handler = handle_bad_irq; in sprd_eic_probe()
668 irq->default_type = IRQ_TYPE_NONE; in sprd_eic_probe()
669 irq->parent_handler = sprd_eic_irq_handler; in sprd_eic_probe()
670 irq->parent_handler_data = sprd_eic; in sprd_eic_probe()
671 irq->num_parents = 1; in sprd_eic_probe()
672 irq->parents = &sprd_eic->irq; in sprd_eic_probe()
674 ret = devm_gpiochip_add_data(&pdev->dev, &sprd_eic->chip, sprd_eic); in sprd_eic_probe()
676 dev_err(&pdev->dev, "Could not register gpiochip %d.\n", ret); in sprd_eic_probe()
685 .compatible = "sprd,sc9860-eic-debounce",
689 .compatible = "sprd,sc9860-eic-latch",
693 .compatible = "sprd,sc9860-eic-async",
697 .compatible = "sprd,sc9860-eic-sync",
709 .name = "sprd-eic",
716 MODULE_DESCRIPTION("Spreadtrum EIC driver");