Lines Matching refs:tgi

30 #define GPIO_REG(tgi, x)	(GPIO_BANK(x) * tgi->soc->bank_stride + \  argument
102 static inline void tegra_gpio_writel(struct tegra_gpio_info *tgi, in tegra_gpio_writel() argument
105 writel_relaxed(val, tgi->regs + reg); in tegra_gpio_writel()
108 static inline u32 tegra_gpio_readl(struct tegra_gpio_info *tgi, u32 reg) in tegra_gpio_readl() argument
110 return readl_relaxed(tgi->regs + reg); in tegra_gpio_readl()
119 static void tegra_gpio_mask_write(struct tegra_gpio_info *tgi, u32 reg, in tegra_gpio_mask_write() argument
127 tegra_gpio_writel(tgi, val, reg); in tegra_gpio_mask_write()
130 static void tegra_gpio_enable(struct tegra_gpio_info *tgi, unsigned int gpio) in tegra_gpio_enable() argument
132 tegra_gpio_mask_write(tgi, GPIO_MSK_CNF(tgi, gpio), gpio, 1); in tegra_gpio_enable()
135 static void tegra_gpio_disable(struct tegra_gpio_info *tgi, unsigned int gpio) in tegra_gpio_disable() argument
137 tegra_gpio_mask_write(tgi, GPIO_MSK_CNF(tgi, gpio), gpio, 0); in tegra_gpio_disable()
147 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_free() local
150 tegra_gpio_disable(tgi, offset); in tegra_gpio_free()
156 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_set() local
158 tegra_gpio_mask_write(tgi, GPIO_MSK_OUT(tgi, offset), offset, value); in tegra_gpio_set()
163 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_get() local
167 if (tegra_gpio_readl(tgi, GPIO_OE(tgi, offset)) & bval) in tegra_gpio_get()
168 return !!(tegra_gpio_readl(tgi, GPIO_OUT(tgi, offset)) & bval); in tegra_gpio_get()
170 return !!(tegra_gpio_readl(tgi, GPIO_IN(tgi, offset)) & bval); in tegra_gpio_get()
176 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_direction_input() local
179 tegra_gpio_mask_write(tgi, GPIO_MSK_OE(tgi, offset), offset, 0); in tegra_gpio_direction_input()
180 tegra_gpio_enable(tgi, offset); in tegra_gpio_direction_input()
184 dev_err(tgi->dev, in tegra_gpio_direction_input()
195 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_direction_output() local
199 tegra_gpio_mask_write(tgi, GPIO_MSK_OE(tgi, offset), offset, 1); in tegra_gpio_direction_output()
200 tegra_gpio_enable(tgi, offset); in tegra_gpio_direction_output()
204 dev_err(tgi->dev, in tegra_gpio_direction_output()
214 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_get_direction() local
218 cnf = tegra_gpio_readl(tgi, GPIO_CNF(tgi, offset)); in tegra_gpio_get_direction()
222 oe = tegra_gpio_readl(tgi, GPIO_OE(tgi, offset)); in tegra_gpio_get_direction()
233 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_set_debounce() local
234 struct tegra_gpio_bank *bank = &tgi->bank_info[GPIO_BANK(offset)]; in tegra_gpio_set_debounce()
240 tegra_gpio_mask_write(tgi, GPIO_MSK_DBC_EN(tgi, offset), in tegra_gpio_set_debounce()
253 tegra_gpio_writel(tgi, debounce_ms, GPIO_DBC_CNT(tgi, offset)); in tegra_gpio_set_debounce()
258 tegra_gpio_mask_write(tgi, GPIO_MSK_DBC_EN(tgi, offset), offset, 1); in tegra_gpio_set_debounce()
278 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_irq_ack() local
281 tegra_gpio_writel(tgi, 1 << GPIO_BIT(gpio), GPIO_INT_CLR(tgi, gpio)); in tegra_gpio_irq_ack()
287 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_irq_mask() local
290 tegra_gpio_mask_write(tgi, GPIO_MSK_INT_ENB(tgi, gpio), gpio, 0); in tegra_gpio_irq_mask()
296 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_irq_unmask() local
299 tegra_gpio_mask_write(tgi, GPIO_MSK_INT_ENB(tgi, gpio), gpio, 1); in tegra_gpio_irq_unmask()
306 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_irq_set_type() local
312 bank = &tgi->bank_info[GPIO_BANK(d->hwirq)]; in tegra_gpio_irq_set_type()
341 val = tegra_gpio_readl(tgi, GPIO_INT_LVL(tgi, gpio)); in tegra_gpio_irq_set_type()
344 tegra_gpio_writel(tgi, val, GPIO_INT_LVL(tgi, gpio)); in tegra_gpio_irq_set_type()
348 tegra_gpio_mask_write(tgi, GPIO_MSK_OE(tgi, gpio), gpio, 0); in tegra_gpio_irq_set_type()
349 tegra_gpio_enable(tgi, gpio); in tegra_gpio_irq_set_type()
351 ret = gpiochip_lock_as_irq(&tgi->gc, gpio); in tegra_gpio_irq_set_type()
353 dev_err(tgi->dev, in tegra_gpio_irq_set_type()
355 tegra_gpio_disable(tgi, gpio); in tegra_gpio_irq_set_type()
373 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_irq_shutdown() local
377 gpiochip_unlock_as_irq(&tgi->gc, gpio); in tegra_gpio_irq_shutdown()
382 struct tegra_gpio_info *tgi = irq_desc_get_handler_data(desc); in tegra_gpio_irq_handler() local
384 struct irq_domain *domain = tgi->gc.irq.domain; in tegra_gpio_irq_handler()
392 for (i = 0; i < tgi->bank_count; i++) { in tegra_gpio_irq_handler()
393 if (tgi->irqs[i] == irq) { in tegra_gpio_irq_handler()
394 bank = &tgi->bank_info[i]; in tegra_gpio_irq_handler()
406 sta = tegra_gpio_readl(tgi, GPIO_INT_STA(tgi, gpio)) & in tegra_gpio_irq_handler()
407 tegra_gpio_readl(tgi, GPIO_INT_ENB(tgi, gpio)); in tegra_gpio_irq_handler()
408 lvl = tegra_gpio_readl(tgi, GPIO_INT_LVL(tgi, gpio)); in tegra_gpio_irq_handler()
413 tegra_gpio_writel(tgi, 1 << pin, in tegra_gpio_irq_handler()
414 GPIO_INT_CLR(tgi, gpio)); in tegra_gpio_irq_handler()
468 struct tegra_gpio_info *tgi = dev_get_drvdata(dev); in tegra_gpio_resume() local
471 for (b = 0; b < tgi->bank_count; b++) { in tegra_gpio_resume()
472 struct tegra_gpio_bank *bank = &tgi->bank_info[b]; in tegra_gpio_resume()
477 tegra_gpio_writel(tgi, bank->cnf[p], in tegra_gpio_resume()
478 GPIO_CNF(tgi, gpio)); in tegra_gpio_resume()
480 if (tgi->soc->debounce_supported) { in tegra_gpio_resume()
481 tegra_gpio_writel(tgi, bank->dbc_cnt[p], in tegra_gpio_resume()
482 GPIO_DBC_CNT(tgi, gpio)); in tegra_gpio_resume()
483 tegra_gpio_writel(tgi, bank->dbc_enb[p], in tegra_gpio_resume()
484 GPIO_MSK_DBC_EN(tgi, gpio)); in tegra_gpio_resume()
487 tegra_gpio_writel(tgi, bank->out[p], in tegra_gpio_resume()
488 GPIO_OUT(tgi, gpio)); in tegra_gpio_resume()
489 tegra_gpio_writel(tgi, bank->oe[p], in tegra_gpio_resume()
490 GPIO_OE(tgi, gpio)); in tegra_gpio_resume()
491 tegra_gpio_writel(tgi, bank->int_lvl[p], in tegra_gpio_resume()
492 GPIO_INT_LVL(tgi, gpio)); in tegra_gpio_resume()
493 tegra_gpio_writel(tgi, bank->int_enb[p], in tegra_gpio_resume()
494 GPIO_INT_ENB(tgi, gpio)); in tegra_gpio_resume()
503 struct tegra_gpio_info *tgi = dev_get_drvdata(dev); in tegra_gpio_suspend() local
506 for (b = 0; b < tgi->bank_count; b++) { in tegra_gpio_suspend()
507 struct tegra_gpio_bank *bank = &tgi->bank_info[b]; in tegra_gpio_suspend()
512 bank->cnf[p] = tegra_gpio_readl(tgi, in tegra_gpio_suspend()
513 GPIO_CNF(tgi, gpio)); in tegra_gpio_suspend()
514 bank->out[p] = tegra_gpio_readl(tgi, in tegra_gpio_suspend()
515 GPIO_OUT(tgi, gpio)); in tegra_gpio_suspend()
516 bank->oe[p] = tegra_gpio_readl(tgi, in tegra_gpio_suspend()
517 GPIO_OE(tgi, gpio)); in tegra_gpio_suspend()
518 if (tgi->soc->debounce_supported) { in tegra_gpio_suspend()
519 bank->dbc_enb[p] = tegra_gpio_readl(tgi, in tegra_gpio_suspend()
520 GPIO_MSK_DBC_EN(tgi, gpio)); in tegra_gpio_suspend()
525 bank->int_enb[p] = tegra_gpio_readl(tgi, in tegra_gpio_suspend()
526 GPIO_INT_ENB(tgi, gpio)); in tegra_gpio_suspend()
527 bank->int_lvl[p] = tegra_gpio_readl(tgi, in tegra_gpio_suspend()
528 GPIO_INT_LVL(tgi, gpio)); in tegra_gpio_suspend()
531 tegra_gpio_writel(tgi, bank->wake_enb[p], in tegra_gpio_suspend()
532 GPIO_INT_ENB(tgi, gpio)); in tegra_gpio_suspend()
542 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_irq_set_wake() local
548 bank = &tgi->bank_info[GPIO_BANK(d->hwirq)]; in tegra_gpio_irq_set_wake()
554 err = irq_set_irq_wake(tgi->irqs[bank->bank], enable); in tegra_gpio_irq_set_wake()
561 irq_set_irq_wake(tgi->irqs[bank->bank], !enable); in tegra_gpio_irq_set_wake()
588 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_irq_request_resources() local
590 tegra_gpio_enable(tgi, d->hwirq); in tegra_gpio_irq_request_resources()
598 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_irq_release_resources() local
601 tegra_gpio_enable(tgi, d->hwirq); in tegra_gpio_irq_release_resources()
611 struct tegra_gpio_info *tgi = dev_get_drvdata(s->private); in tegra_dbg_gpio_show() local
614 for (i = 0; i < tgi->bank_count; i++) { in tegra_dbg_gpio_show()
621 tegra_gpio_readl(tgi, GPIO_CNF(tgi, gpio)), in tegra_dbg_gpio_show()
622 tegra_gpio_readl(tgi, GPIO_OE(tgi, gpio)), in tegra_dbg_gpio_show()
623 tegra_gpio_readl(tgi, GPIO_OUT(tgi, gpio)), in tegra_dbg_gpio_show()
624 tegra_gpio_readl(tgi, GPIO_IN(tgi, gpio)), in tegra_dbg_gpio_show()
625 tegra_gpio_readl(tgi, GPIO_INT_STA(tgi, gpio)), in tegra_dbg_gpio_show()
626 tegra_gpio_readl(tgi, GPIO_INT_ENB(tgi, gpio)), in tegra_dbg_gpio_show()
627 tegra_gpio_readl(tgi, GPIO_INT_LVL(tgi, gpio))); in tegra_dbg_gpio_show()
633 static void tegra_gpio_debuginit(struct tegra_gpio_info *tgi) in tegra_gpio_debuginit() argument
635 debugfs_create_devm_seqfile(tgi->dev, "tegra_gpio", NULL, in tegra_gpio_debuginit()
641 static inline void tegra_gpio_debuginit(struct tegra_gpio_info *tgi) in tegra_gpio_debuginit() argument
659 struct tegra_gpio_info *tgi; in tegra_gpio_probe() local
665 tgi = devm_kzalloc(&pdev->dev, sizeof(*tgi), GFP_KERNEL); in tegra_gpio_probe()
666 if (!tgi) in tegra_gpio_probe()
669 tgi->soc = of_device_get_match_data(&pdev->dev); in tegra_gpio_probe()
670 tgi->dev = &pdev->dev; in tegra_gpio_probe()
676 tgi->bank_count = ret; in tegra_gpio_probe()
678 if (!tgi->bank_count) { in tegra_gpio_probe()
683 tgi->gc.label = "tegra-gpio"; in tegra_gpio_probe()
684 tgi->gc.request = tegra_gpio_request; in tegra_gpio_probe()
685 tgi->gc.free = tegra_gpio_free; in tegra_gpio_probe()
686 tgi->gc.direction_input = tegra_gpio_direction_input; in tegra_gpio_probe()
687 tgi->gc.get = tegra_gpio_get; in tegra_gpio_probe()
688 tgi->gc.direction_output = tegra_gpio_direction_output; in tegra_gpio_probe()
689 tgi->gc.set = tegra_gpio_set; in tegra_gpio_probe()
690 tgi->gc.get_direction = tegra_gpio_get_direction; in tegra_gpio_probe()
691 tgi->gc.base = 0; in tegra_gpio_probe()
692 tgi->gc.ngpio = tgi->bank_count * 32; in tegra_gpio_probe()
693 tgi->gc.parent = &pdev->dev; in tegra_gpio_probe()
694 tgi->gc.of_node = pdev->dev.of_node; in tegra_gpio_probe()
696 tgi->ic.name = "GPIO"; in tegra_gpio_probe()
697 tgi->ic.irq_ack = tegra_gpio_irq_ack; in tegra_gpio_probe()
698 tgi->ic.irq_mask = tegra_gpio_irq_mask; in tegra_gpio_probe()
699 tgi->ic.irq_unmask = tegra_gpio_irq_unmask; in tegra_gpio_probe()
700 tgi->ic.irq_set_type = tegra_gpio_irq_set_type; in tegra_gpio_probe()
701 tgi->ic.irq_shutdown = tegra_gpio_irq_shutdown; in tegra_gpio_probe()
703 tgi->ic.irq_set_wake = tegra_gpio_irq_set_wake; in tegra_gpio_probe()
705 tgi->ic.irq_request_resources = tegra_gpio_irq_request_resources; in tegra_gpio_probe()
706 tgi->ic.irq_release_resources = tegra_gpio_irq_release_resources; in tegra_gpio_probe()
708 platform_set_drvdata(pdev, tgi); in tegra_gpio_probe()
710 if (tgi->soc->debounce_supported) in tegra_gpio_probe()
711 tgi->gc.set_config = tegra_gpio_set_config; in tegra_gpio_probe()
713 tgi->bank_info = devm_kcalloc(&pdev->dev, tgi->bank_count, in tegra_gpio_probe()
714 sizeof(*tgi->bank_info), GFP_KERNEL); in tegra_gpio_probe()
715 if (!tgi->bank_info) in tegra_gpio_probe()
718 tgi->irqs = devm_kcalloc(&pdev->dev, tgi->bank_count, in tegra_gpio_probe()
719 sizeof(*tgi->irqs), GFP_KERNEL); in tegra_gpio_probe()
720 if (!tgi->irqs) in tegra_gpio_probe()
723 for (i = 0; i < tgi->bank_count; i++) { in tegra_gpio_probe()
728 bank = &tgi->bank_info[i]; in tegra_gpio_probe()
731 tgi->irqs[i] = ret; in tegra_gpio_probe()
739 irq = &tgi->gc.irq; in tegra_gpio_probe()
740 irq->chip = &tgi->ic; in tegra_gpio_probe()
747 irq->parent_handler_data = tgi; in tegra_gpio_probe()
748 irq->num_parents = tgi->bank_count; in tegra_gpio_probe()
749 irq->parents = tgi->irqs; in tegra_gpio_probe()
759 tgi->ic.irq_set_affinity = tegra_gpio_irq_set_affinity; in tegra_gpio_probe()
762 tgi->regs = devm_platform_ioremap_resource(pdev, 0); in tegra_gpio_probe()
763 if (IS_ERR(tgi->regs)) in tegra_gpio_probe()
764 return PTR_ERR(tgi->regs); in tegra_gpio_probe()
766 for (i = 0; i < tgi->bank_count; i++) { in tegra_gpio_probe()
770 tegra_gpio_writel(tgi, 0x00, GPIO_INT_ENB(tgi, gpio)); in tegra_gpio_probe()
774 ret = devm_gpiochip_add_data(&pdev->dev, &tgi->gc, tgi); in tegra_gpio_probe()
778 tegra_gpio_debuginit(tgi); in tegra_gpio_probe()