Lines Matching +full:input +full:- +full:debounce

1 // SPDX-License-Identifier: GPL-2.0
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))
64 * input mode to generate interrupts if detecting input signals.
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.
72 * The debounce range is from 1ms to 4s with a step size of 1ms.
81 * The EIC-sync is similar with GPIO's input function, which is a synchronized
82 * signal input register.
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()
199 /* EICs are always input, nothing need to do here. */ in sprd_eic_direction_input()
205 /* EICs are always input, nothing need to do here. */ in sprd_eic_set()
209 unsigned int debounce) in sprd_eic_set_debounce() argument
217 value |= (debounce / 1000) & SPRD_EIC_DBNC_MASK; in sprd_eic_set_debounce()
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()
337 return -ENOTSUPP; in sprd_eic_irq_set_type()
362 return -ENOTSUPP; in sprd_eic_irq_set_type()
399 return -ENOTSUPP; in sprd_eic_irq_set_type()
434 return -ENOTSUPP; in sprd_eic_irq_set_type()
438 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_irq_set_type()
439 return -ENOTSUPP; in sprd_eic_irq_set_type()
454 * The debounce EIC and latch EIC can only support level trigger, so we in sprd_eic_toggle_trigger()
457 if ((sprd_eic->type != SPRD_EIC_DEBOUNCE && in sprd_eic_toggle_trigger()
458 sprd_eic->type != SPRD_EIC_LATCH) || in sprd_eic_toggle_trigger()
466 switch (sprd_eic->type) { in sprd_eic_toggle_trigger()
486 dev_warn(chip->parent, "EIC level was changed.\n"); in sprd_eic_toggle_trigger()
498 return !strcmp(chip->label, sprd_eic_label_name[type]); in sprd_eic_match_chip_by_type()
506 for (bank = 0; bank * SPRD_EIC_PER_BANK_NR < chip->ngpio; bank++) { in sprd_eic_handle_one_type()
510 switch (sprd_eic->type) { in sprd_eic_handle_one_type()
528 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_handle_one_type()
535 girq = irq_find_mapping(chip->irq.domain, offset); in sprd_eic_handle_one_type()
552 * Since the digital-chip EIC 4 sub-modules (debounce, latch, async in sprd_eic_irq_handler()
575 pdata = of_device_get_match_data(&pdev->dev); in sprd_eic_probe()
577 dev_err(&pdev->dev, "No matching driver data found.\n"); in sprd_eic_probe()
578 return -EINVAL; in sprd_eic_probe()
581 sprd_eic = devm_kzalloc(&pdev->dev, sizeof(*sprd_eic), GFP_KERNEL); in sprd_eic_probe()
583 return -ENOMEM; in sprd_eic_probe()
585 spin_lock_init(&sprd_eic->lock); in sprd_eic_probe()
586 sprd_eic->type = pdata->type; in sprd_eic_probe()
588 sprd_eic->irq = platform_get_irq(pdev, 0); in sprd_eic_probe()
589 if (sprd_eic->irq < 0) in sprd_eic_probe()
590 return sprd_eic->irq; in sprd_eic_probe()
603 sprd_eic->base[i] = devm_ioremap_resource(&pdev->dev, res); in sprd_eic_probe()
604 if (IS_ERR(sprd_eic->base[i])) in sprd_eic_probe()
605 return PTR_ERR(sprd_eic->base[i]); in sprd_eic_probe()
608 sprd_eic->chip.label = sprd_eic_label_name[sprd_eic->type]; in sprd_eic_probe()
609 sprd_eic->chip.ngpio = pdata->num_eics; in sprd_eic_probe()
610 sprd_eic->chip.base = -1; in sprd_eic_probe()
611 sprd_eic->chip.parent = &pdev->dev; in sprd_eic_probe()
612 sprd_eic->chip.direction_input = sprd_eic_direction_input; in sprd_eic_probe()
613 switch (sprd_eic->type) { in sprd_eic_probe()
615 sprd_eic->chip.request = sprd_eic_request; in sprd_eic_probe()
616 sprd_eic->chip.free = sprd_eic_free; in sprd_eic_probe()
617 sprd_eic->chip.set_config = sprd_eic_set_config; in sprd_eic_probe()
618 sprd_eic->chip.set = sprd_eic_set; in sprd_eic_probe()
622 sprd_eic->chip.get = sprd_eic_get; in sprd_eic_probe()
629 sprd_eic->intc.name = dev_name(&pdev->dev); in sprd_eic_probe()
630 sprd_eic->intc.irq_ack = sprd_eic_irq_ack; in sprd_eic_probe()
631 sprd_eic->intc.irq_mask = sprd_eic_irq_mask; in sprd_eic_probe()
632 sprd_eic->intc.irq_unmask = sprd_eic_irq_unmask; in sprd_eic_probe()
633 sprd_eic->intc.irq_set_type = sprd_eic_irq_set_type; in sprd_eic_probe()
634 sprd_eic->intc.flags = IRQCHIP_SKIP_SET_WAKE; in sprd_eic_probe()
636 irq = &sprd_eic->chip.irq; in sprd_eic_probe()
637 irq->chip = &sprd_eic->intc; in sprd_eic_probe()
638 irq->handler = handle_bad_irq; in sprd_eic_probe()
639 irq->default_type = IRQ_TYPE_NONE; in sprd_eic_probe()
640 irq->parent_handler = sprd_eic_irq_handler; in sprd_eic_probe()
641 irq->parent_handler_data = sprd_eic; in sprd_eic_probe()
642 irq->num_parents = 1; in sprd_eic_probe()
643 irq->parents = &sprd_eic->irq; in sprd_eic_probe()
645 ret = devm_gpiochip_add_data(&pdev->dev, &sprd_eic->chip, sprd_eic); in sprd_eic_probe()
647 dev_err(&pdev->dev, "Could not register gpiochip %d.\n", ret); in sprd_eic_probe()
657 .compatible = "sprd,sc9860-eic-debounce",
661 .compatible = "sprd,sc9860-eic-latch",
665 .compatible = "sprd,sc9860-eic-async",
669 .compatible = "sprd,sc9860-eic-sync",
681 .name = "sprd-eic",