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.
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()
198 /* EICs are always input, nothing need to do here. */ in sprd_eic_direction_input()
204 /* EICs are always input, nothing need to do here. */ in sprd_eic_set()
208 unsigned int debounce) in sprd_eic_set_debounce() argument
216 value |= (debounce / 1000) & SPRD_EIC_DBNC_MASK; in sprd_eic_set_debounce()
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()
340 return -ENOTSUPP; in sprd_eic_irq_set_type()
365 return -ENOTSUPP; in sprd_eic_irq_set_type()
402 return -ENOTSUPP; in sprd_eic_irq_set_type()
437 return -ENOTSUPP; in sprd_eic_irq_set_type()
441 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_irq_set_type()
442 return -ENOTSUPP; in sprd_eic_irq_set_type()
457 * The debounce EIC and latch EIC can only support level trigger, so we in sprd_eic_toggle_trigger()
460 if ((sprd_eic->type != SPRD_EIC_DEBOUNCE && in sprd_eic_toggle_trigger()
461 sprd_eic->type != SPRD_EIC_LATCH) || in sprd_eic_toggle_trigger()
469 switch (sprd_eic->type) { in sprd_eic_toggle_trigger()
489 dev_warn(chip->parent, "EIC level was changed.\n"); in sprd_eic_toggle_trigger()
501 return !strcmp(chip->label, sprd_eic_label_name[type]); in sprd_eic_match_chip_by_type()
509 for (bank = 0; bank * SPRD_EIC_PER_BANK_NR < chip->ngpio; bank++) { in sprd_eic_handle_one_type()
513 switch (sprd_eic->type) { in sprd_eic_handle_one_type()
531 dev_err(chip->parent, "Unsupported EIC type.\n"); in sprd_eic_handle_one_type()
538 girq = irq_find_mapping(chip->irq.domain, offset); in sprd_eic_handle_one_type()
555 * Since the digital-chip EIC 4 sub-modules (debounce, latch, async in sprd_eic_irq_handler()
571 .name = "sprd-eic",
587 pdata = of_device_get_match_data(&pdev->dev); in sprd_eic_probe()
589 dev_err(&pdev->dev, "No matching driver data found.\n"); in sprd_eic_probe()
590 return -EINVAL; in sprd_eic_probe()
593 sprd_eic = devm_kzalloc(&pdev->dev, sizeof(*sprd_eic), GFP_KERNEL); in sprd_eic_probe()
595 return -ENOMEM; in sprd_eic_probe()
597 spin_lock_init(&sprd_eic->lock); in sprd_eic_probe()
598 sprd_eic->type = pdata->type; in sprd_eic_probe()
600 sprd_eic->irq = platform_get_irq(pdev, 0); in sprd_eic_probe()
601 if (sprd_eic->irq < 0) in sprd_eic_probe()
602 return sprd_eic->irq; in sprd_eic_probe()
615 sprd_eic->base[i] = devm_ioremap_resource(&pdev->dev, res); in sprd_eic_probe()
616 if (IS_ERR(sprd_eic->base[i])) in sprd_eic_probe()
617 return PTR_ERR(sprd_eic->base[i]); in sprd_eic_probe()
620 sprd_eic->chip.label = sprd_eic_label_name[sprd_eic->type]; in sprd_eic_probe()
621 sprd_eic->chip.ngpio = pdata->num_eics; in sprd_eic_probe()
622 sprd_eic->chip.base = -1; in sprd_eic_probe()
623 sprd_eic->chip.parent = &pdev->dev; in sprd_eic_probe()
624 sprd_eic->chip.direction_input = sprd_eic_direction_input; in sprd_eic_probe()
625 switch (sprd_eic->type) { in sprd_eic_probe()
627 sprd_eic->chip.request = sprd_eic_request; in sprd_eic_probe()
628 sprd_eic->chip.free = sprd_eic_free; in sprd_eic_probe()
629 sprd_eic->chip.set_config = sprd_eic_set_config; in sprd_eic_probe()
630 sprd_eic->chip.set = sprd_eic_set; in sprd_eic_probe()
634 sprd_eic->chip.get = sprd_eic_get; in sprd_eic_probe()
641 irq = &sprd_eic->chip.irq; in sprd_eic_probe()
643 irq->handler = handle_bad_irq; in sprd_eic_probe()
644 irq->default_type = IRQ_TYPE_NONE; in sprd_eic_probe()
645 irq->parent_handler = sprd_eic_irq_handler; in sprd_eic_probe()
646 irq->parent_handler_data = sprd_eic; in sprd_eic_probe()
647 irq->num_parents = 1; in sprd_eic_probe()
648 irq->parents = &sprd_eic->irq; in sprd_eic_probe()
650 ret = devm_gpiochip_add_data(&pdev->dev, &sprd_eic->chip, sprd_eic); in sprd_eic_probe()
652 dev_err(&pdev->dev, "Could not register gpiochip %d.\n", ret); in sprd_eic_probe()
661 .compatible = "sprd,sc9860-eic-debounce",
665 .compatible = "sprd,sc9860-eic-latch",
669 .compatible = "sprd,sc9860-eic-async",
673 .compatible = "sprd,sc9860-eic-sync",
685 .name = "sprd-eic",