Lines Matching +full:irq +full:- +full:signals
1 // SPDX-License-Identifier: GPL-2.0
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))
65 * input mode to generate interrupts if detecting input signals.
67 * The Spreadtrum digital-chip EIC controller contains 4 sub-modules:
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.
75 * The latch EIC is used to latch some special power down signals and
77 * to capture signals.
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
99 int irq; member
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()
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()
477 static void sprd_eic_toggle_trigger(struct gpio_chip *chip, unsigned int irq, in sprd_eic_toggle_trigger() argument
481 struct irq_data *data = irq_get_irq_data(irq); 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()
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()
615 struct gpio_irq_chip *irq; in sprd_eic_probe() local
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()
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()
678 gpio_irq_chip_set_chip(irq, &sprd_eic_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",