Lines Matching refs:tgi
30 #define GPIO_REG(tgi, x) (GPIO_BANK(x) * tgi->soc->bank_stride + \ argument
76 struct tegra_gpio_info *tgi; member
96 static inline void tegra_gpio_writel(struct tegra_gpio_info *tgi, in tegra_gpio_writel() argument
99 __raw_writel(val, tgi->regs + reg); in tegra_gpio_writel()
102 static inline u32 tegra_gpio_readl(struct tegra_gpio_info *tgi, u32 reg) in tegra_gpio_readl() argument
104 return __raw_readl(tgi->regs + reg); in tegra_gpio_readl()
113 static void tegra_gpio_mask_write(struct tegra_gpio_info *tgi, u32 reg, in tegra_gpio_mask_write() argument
121 tegra_gpio_writel(tgi, val, reg); in tegra_gpio_mask_write()
124 static void tegra_gpio_enable(struct tegra_gpio_info *tgi, unsigned int gpio) in tegra_gpio_enable() argument
126 tegra_gpio_mask_write(tgi, GPIO_MSK_CNF(tgi, gpio), gpio, 1); in tegra_gpio_enable()
129 static void tegra_gpio_disable(struct tegra_gpio_info *tgi, unsigned int gpio) in tegra_gpio_disable() argument
131 tegra_gpio_mask_write(tgi, GPIO_MSK_CNF(tgi, gpio), gpio, 0); in tegra_gpio_disable()
141 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_free() local
144 tegra_gpio_disable(tgi, offset); in tegra_gpio_free()
150 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_set() local
152 tegra_gpio_mask_write(tgi, GPIO_MSK_OUT(tgi, offset), offset, value); in tegra_gpio_set()
157 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_get() local
161 if (tegra_gpio_readl(tgi, GPIO_OE(tgi, offset)) & bval) in tegra_gpio_get()
162 return !!(tegra_gpio_readl(tgi, GPIO_OUT(tgi, offset)) & bval); in tegra_gpio_get()
164 return !!(tegra_gpio_readl(tgi, GPIO_IN(tgi, offset)) & bval); in tegra_gpio_get()
170 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_direction_input() local
173 tegra_gpio_mask_write(tgi, GPIO_MSK_OE(tgi, offset), offset, 0); in tegra_gpio_direction_input()
174 tegra_gpio_enable(tgi, offset); in tegra_gpio_direction_input()
178 dev_err(tgi->dev, in tegra_gpio_direction_input()
189 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_direction_output() local
193 tegra_gpio_mask_write(tgi, GPIO_MSK_OE(tgi, offset), offset, 1); in tegra_gpio_direction_output()
194 tegra_gpio_enable(tgi, offset); in tegra_gpio_direction_output()
198 dev_err(tgi->dev, in tegra_gpio_direction_output()
208 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_get_direction() local
212 cnf = tegra_gpio_readl(tgi, GPIO_CNF(tgi, offset)); in tegra_gpio_get_direction()
216 oe = tegra_gpio_readl(tgi, GPIO_OE(tgi, offset)); in tegra_gpio_get_direction()
224 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_set_debounce() local
225 struct tegra_gpio_bank *bank = &tgi->bank_info[GPIO_BANK(offset)]; in tegra_gpio_set_debounce()
231 tegra_gpio_mask_write(tgi, GPIO_MSK_DBC_EN(tgi, offset), in tegra_gpio_set_debounce()
244 tegra_gpio_writel(tgi, debounce_ms, GPIO_DBC_CNT(tgi, offset)); in tegra_gpio_set_debounce()
249 tegra_gpio_mask_write(tgi, GPIO_MSK_DBC_EN(tgi, offset), offset, 1); in tegra_gpio_set_debounce()
268 struct tegra_gpio_info *tgi = gpiochip_get_data(chip); in tegra_gpio_to_irq() local
270 return irq_find_mapping(tgi->irq_domain, offset); in tegra_gpio_to_irq()
276 struct tegra_gpio_info *tgi = bank->tgi; in tegra_gpio_irq_ack() local
279 tegra_gpio_writel(tgi, 1 << GPIO_BIT(gpio), GPIO_INT_CLR(tgi, gpio)); in tegra_gpio_irq_ack()
285 struct tegra_gpio_info *tgi = bank->tgi; in tegra_gpio_irq_mask() local
288 tegra_gpio_mask_write(tgi, GPIO_MSK_INT_ENB(tgi, gpio), gpio, 0); in tegra_gpio_irq_mask()
294 struct tegra_gpio_info *tgi = bank->tgi; in tegra_gpio_irq_unmask() local
297 tegra_gpio_mask_write(tgi, GPIO_MSK_INT_ENB(tgi, gpio), gpio, 1); in tegra_gpio_irq_unmask()
304 struct tegra_gpio_info *tgi = bank->tgi; in tegra_gpio_irq_set_type() local
336 val = tegra_gpio_readl(tgi, GPIO_INT_LVL(tgi, gpio)); in tegra_gpio_irq_set_type()
339 tegra_gpio_writel(tgi, val, GPIO_INT_LVL(tgi, gpio)); in tegra_gpio_irq_set_type()
343 tegra_gpio_mask_write(tgi, GPIO_MSK_OE(tgi, gpio), gpio, 0); in tegra_gpio_irq_set_type()
344 tegra_gpio_enable(tgi, gpio); in tegra_gpio_irq_set_type()
346 ret = gpiochip_lock_as_irq(&tgi->gc, gpio); in tegra_gpio_irq_set_type()
348 dev_err(tgi->dev, in tegra_gpio_irq_set_type()
350 tegra_gpio_disable(tgi, gpio); in tegra_gpio_irq_set_type()
365 struct tegra_gpio_info *tgi = bank->tgi; in tegra_gpio_irq_shutdown() local
368 gpiochip_unlock_as_irq(&tgi->gc, gpio); in tegra_gpio_irq_shutdown()
379 struct tegra_gpio_info *tgi = bank->tgi; in tegra_gpio_irq_handler() local
385 sta = tegra_gpio_readl(tgi, GPIO_INT_STA(tgi, gpio)) & in tegra_gpio_irq_handler()
386 tegra_gpio_readl(tgi, GPIO_INT_ENB(tgi, gpio)); in tegra_gpio_irq_handler()
387 lvl = tegra_gpio_readl(tgi, GPIO_INT_LVL(tgi, gpio)); in tegra_gpio_irq_handler()
390 tegra_gpio_writel(tgi, 1 << pin, in tegra_gpio_irq_handler()
391 GPIO_INT_CLR(tgi, gpio)); in tegra_gpio_irq_handler()
402 generic_handle_irq(irq_find_mapping(tgi->irq_domain, in tegra_gpio_irq_handler()
415 struct tegra_gpio_info *tgi = dev_get_drvdata(dev); in tegra_gpio_resume() local
421 for (b = 0; b < tgi->bank_count; b++) { in tegra_gpio_resume()
422 struct tegra_gpio_bank *bank = &tgi->bank_info[b]; in tegra_gpio_resume()
427 tegra_gpio_writel(tgi, bank->cnf[p], in tegra_gpio_resume()
428 GPIO_CNF(tgi, gpio)); in tegra_gpio_resume()
430 if (tgi->soc->debounce_supported) { in tegra_gpio_resume()
431 tegra_gpio_writel(tgi, bank->dbc_cnt[p], in tegra_gpio_resume()
432 GPIO_DBC_CNT(tgi, gpio)); in tegra_gpio_resume()
433 tegra_gpio_writel(tgi, bank->dbc_enb[p], in tegra_gpio_resume()
434 GPIO_MSK_DBC_EN(tgi, gpio)); in tegra_gpio_resume()
437 tegra_gpio_writel(tgi, bank->out[p], in tegra_gpio_resume()
438 GPIO_OUT(tgi, gpio)); in tegra_gpio_resume()
439 tegra_gpio_writel(tgi, bank->oe[p], in tegra_gpio_resume()
440 GPIO_OE(tgi, gpio)); in tegra_gpio_resume()
441 tegra_gpio_writel(tgi, bank->int_lvl[p], in tegra_gpio_resume()
442 GPIO_INT_LVL(tgi, gpio)); in tegra_gpio_resume()
443 tegra_gpio_writel(tgi, bank->int_enb[p], in tegra_gpio_resume()
444 GPIO_INT_ENB(tgi, gpio)); in tegra_gpio_resume()
454 struct tegra_gpio_info *tgi = dev_get_drvdata(dev); in tegra_gpio_suspend() local
459 for (b = 0; b < tgi->bank_count; b++) { in tegra_gpio_suspend()
460 struct tegra_gpio_bank *bank = &tgi->bank_info[b]; in tegra_gpio_suspend()
465 bank->cnf[p] = tegra_gpio_readl(tgi, in tegra_gpio_suspend()
466 GPIO_CNF(tgi, gpio)); in tegra_gpio_suspend()
467 bank->out[p] = tegra_gpio_readl(tgi, in tegra_gpio_suspend()
468 GPIO_OUT(tgi, gpio)); in tegra_gpio_suspend()
469 bank->oe[p] = tegra_gpio_readl(tgi, in tegra_gpio_suspend()
470 GPIO_OE(tgi, gpio)); in tegra_gpio_suspend()
471 if (tgi->soc->debounce_supported) { in tegra_gpio_suspend()
472 bank->dbc_enb[p] = tegra_gpio_readl(tgi, in tegra_gpio_suspend()
473 GPIO_MSK_DBC_EN(tgi, gpio)); in tegra_gpio_suspend()
478 bank->int_enb[p] = tegra_gpio_readl(tgi, in tegra_gpio_suspend()
479 GPIO_INT_ENB(tgi, gpio)); in tegra_gpio_suspend()
480 bank->int_lvl[p] = tegra_gpio_readl(tgi, in tegra_gpio_suspend()
481 GPIO_INT_LVL(tgi, gpio)); in tegra_gpio_suspend()
484 tegra_gpio_writel(tgi, bank->wake_enb[p], in tegra_gpio_suspend()
485 GPIO_INT_ENB(tgi, gpio)); in tegra_gpio_suspend()
518 struct tegra_gpio_info *tgi = s->private; in tegra_dbg_gpio_show() local
521 for (i = 0; i < tgi->bank_count; i++) { in tegra_dbg_gpio_show()
528 tegra_gpio_readl(tgi, GPIO_CNF(tgi, gpio)), in tegra_dbg_gpio_show()
529 tegra_gpio_readl(tgi, GPIO_OE(tgi, gpio)), in tegra_dbg_gpio_show()
530 tegra_gpio_readl(tgi, GPIO_OUT(tgi, gpio)), in tegra_dbg_gpio_show()
531 tegra_gpio_readl(tgi, GPIO_IN(tgi, gpio)), in tegra_dbg_gpio_show()
532 tegra_gpio_readl(tgi, GPIO_INT_STA(tgi, gpio)), in tegra_dbg_gpio_show()
533 tegra_gpio_readl(tgi, GPIO_INT_ENB(tgi, gpio)), in tegra_dbg_gpio_show()
534 tegra_gpio_readl(tgi, GPIO_INT_LVL(tgi, gpio))); in tegra_dbg_gpio_show()
542 static void tegra_gpio_debuginit(struct tegra_gpio_info *tgi) in tegra_gpio_debuginit() argument
544 debugfs_create_file("tegra_gpio", 0444, NULL, tgi, in tegra_gpio_debuginit()
550 static inline void tegra_gpio_debuginit(struct tegra_gpio_info *tgi) in tegra_gpio_debuginit() argument
562 struct tegra_gpio_info *tgi; in tegra_gpio_probe() local
567 tgi = devm_kzalloc(&pdev->dev, sizeof(*tgi), GFP_KERNEL); in tegra_gpio_probe()
568 if (!tgi) in tegra_gpio_probe()
571 tgi->soc = of_device_get_match_data(&pdev->dev); in tegra_gpio_probe()
572 tgi->dev = &pdev->dev; in tegra_gpio_probe()
578 tgi->bank_count = ret; in tegra_gpio_probe()
580 if (!tgi->bank_count) { in tegra_gpio_probe()
585 tgi->gc.label = "tegra-gpio"; in tegra_gpio_probe()
586 tgi->gc.request = tegra_gpio_request; in tegra_gpio_probe()
587 tgi->gc.free = tegra_gpio_free; in tegra_gpio_probe()
588 tgi->gc.direction_input = tegra_gpio_direction_input; in tegra_gpio_probe()
589 tgi->gc.get = tegra_gpio_get; in tegra_gpio_probe()
590 tgi->gc.direction_output = tegra_gpio_direction_output; in tegra_gpio_probe()
591 tgi->gc.set = tegra_gpio_set; in tegra_gpio_probe()
592 tgi->gc.get_direction = tegra_gpio_get_direction; in tegra_gpio_probe()
593 tgi->gc.to_irq = tegra_gpio_to_irq; in tegra_gpio_probe()
594 tgi->gc.base = 0; in tegra_gpio_probe()
595 tgi->gc.ngpio = tgi->bank_count * 32; in tegra_gpio_probe()
596 tgi->gc.parent = &pdev->dev; in tegra_gpio_probe()
597 tgi->gc.of_node = pdev->dev.of_node; in tegra_gpio_probe()
599 tgi->ic.name = "GPIO"; in tegra_gpio_probe()
600 tgi->ic.irq_ack = tegra_gpio_irq_ack; in tegra_gpio_probe()
601 tgi->ic.irq_mask = tegra_gpio_irq_mask; in tegra_gpio_probe()
602 tgi->ic.irq_unmask = tegra_gpio_irq_unmask; in tegra_gpio_probe()
603 tgi->ic.irq_set_type = tegra_gpio_irq_set_type; in tegra_gpio_probe()
604 tgi->ic.irq_shutdown = tegra_gpio_irq_shutdown; in tegra_gpio_probe()
606 tgi->ic.irq_set_wake = tegra_gpio_irq_set_wake; in tegra_gpio_probe()
609 platform_set_drvdata(pdev, tgi); in tegra_gpio_probe()
611 if (tgi->soc->debounce_supported) in tegra_gpio_probe()
612 tgi->gc.set_config = tegra_gpio_set_config; in tegra_gpio_probe()
614 tgi->bank_info = devm_kcalloc(&pdev->dev, tgi->bank_count, in tegra_gpio_probe()
615 sizeof(*tgi->bank_info), GFP_KERNEL); in tegra_gpio_probe()
616 if (!tgi->bank_info) in tegra_gpio_probe()
619 tgi->irq_domain = irq_domain_add_linear(pdev->dev.of_node, in tegra_gpio_probe()
620 tgi->gc.ngpio, in tegra_gpio_probe()
622 if (!tgi->irq_domain) in tegra_gpio_probe()
625 for (i = 0; i < tgi->bank_count; i++) { in tegra_gpio_probe()
630 bank = &tgi->bank_info[i]; in tegra_gpio_probe()
633 bank->tgi = tgi; in tegra_gpio_probe()
636 tgi->regs = devm_platform_ioremap_resource(pdev, 0); in tegra_gpio_probe()
637 if (IS_ERR(tgi->regs)) in tegra_gpio_probe()
638 return PTR_ERR(tgi->regs); in tegra_gpio_probe()
640 for (i = 0; i < tgi->bank_count; i++) { in tegra_gpio_probe()
644 tegra_gpio_writel(tgi, 0x00, GPIO_INT_ENB(tgi, gpio)); in tegra_gpio_probe()
648 ret = devm_gpiochip_add_data(&pdev->dev, &tgi->gc, tgi); in tegra_gpio_probe()
650 irq_domain_remove(tgi->irq_domain); in tegra_gpio_probe()
654 for (gpio = 0; gpio < tgi->gc.ngpio; gpio++) { in tegra_gpio_probe()
655 int irq = irq_create_mapping(tgi->irq_domain, gpio); in tegra_gpio_probe()
658 bank = &tgi->bank_info[GPIO_BANK(gpio)]; in tegra_gpio_probe()
661 irq_set_chip_and_handler(irq, &tgi->ic, handle_simple_irq); in tegra_gpio_probe()
664 for (i = 0; i < tgi->bank_count; i++) { in tegra_gpio_probe()
665 bank = &tgi->bank_info[i]; in tegra_gpio_probe()
676 tegra_gpio_debuginit(tgi); in tegra_gpio_probe()