Lines Matching refs:tgi
30 #define GPIO_REG(tgi, x) (GPIO_BANK(x) * tgi->soc->bank_stride + \
76 struct tegra_gpio_info *tgi;
96 static inline void tegra_gpio_writel(struct tegra_gpio_info *tgi,
99 writel_relaxed(val, tgi->regs + reg);
102 static inline u32 tegra_gpio_readl(struct tegra_gpio_info *tgi, u32 reg)
104 return readl_relaxed(tgi->regs + reg);
113 static void tegra_gpio_mask_write(struct tegra_gpio_info *tgi, u32 reg,
121 tegra_gpio_writel(tgi, val, reg);
124 static void tegra_gpio_enable(struct tegra_gpio_info *tgi, unsigned int gpio)
126 tegra_gpio_mask_write(tgi, GPIO_MSK_CNF(tgi, gpio), gpio, 1);
129 static void tegra_gpio_disable(struct tegra_gpio_info *tgi, unsigned int gpio)
131 tegra_gpio_mask_write(tgi, GPIO_MSK_CNF(tgi, gpio), gpio, 0);
141 struct tegra_gpio_info *tgi = gpiochip_get_data(chip);
144 tegra_gpio_disable(tgi, offset);
150 struct tegra_gpio_info *tgi = gpiochip_get_data(chip);
152 tegra_gpio_mask_write(tgi, GPIO_MSK_OUT(tgi, offset), offset, value);
157 struct tegra_gpio_info *tgi = gpiochip_get_data(chip);
161 if (tegra_gpio_readl(tgi, GPIO_OE(tgi, offset)) & bval)
162 return !!(tegra_gpio_readl(tgi, GPIO_OUT(tgi, offset)) & bval);
164 return !!(tegra_gpio_readl(tgi, GPIO_IN(tgi, offset)) & bval);
170 struct tegra_gpio_info *tgi = gpiochip_get_data(chip);
173 tegra_gpio_mask_write(tgi, GPIO_MSK_OE(tgi, offset), offset, 0);
174 tegra_gpio_enable(tgi, offset);
178 dev_err(tgi->dev,
189 struct tegra_gpio_info *tgi = gpiochip_get_data(chip);
193 tegra_gpio_mask_write(tgi, GPIO_MSK_OE(tgi, offset), offset, 1);
194 tegra_gpio_enable(tgi, offset);
198 dev_err(tgi->dev,
208 struct tegra_gpio_info *tgi = gpiochip_get_data(chip);
212 cnf = tegra_gpio_readl(tgi, GPIO_CNF(tgi, offset));
216 oe = tegra_gpio_readl(tgi, GPIO_OE(tgi, offset));
227 struct tegra_gpio_info *tgi = gpiochip_get_data(chip);
228 struct tegra_gpio_bank *bank = &tgi->bank_info[GPIO_BANK(offset)];
234 tegra_gpio_mask_write(tgi, GPIO_MSK_DBC_EN(tgi, offset),
247 tegra_gpio_writel(tgi, debounce_ms, GPIO_DBC_CNT(tgi, offset));
252 tegra_gpio_mask_write(tgi, GPIO_MSK_DBC_EN(tgi, offset), offset, 1);
271 struct tegra_gpio_info *tgi = gpiochip_get_data(chip);
273 return irq_find_mapping(tgi->irq_domain, offset);
279 struct tegra_gpio_info *tgi = bank->tgi;
282 tegra_gpio_writel(tgi, 1 << GPIO_BIT(gpio), GPIO_INT_CLR(tgi, gpio));
288 struct tegra_gpio_info *tgi = bank->tgi;
291 tegra_gpio_mask_write(tgi, GPIO_MSK_INT_ENB(tgi, gpio), gpio, 0);
297 struct tegra_gpio_info *tgi = bank->tgi;
300 tegra_gpio_mask_write(tgi, GPIO_MSK_INT_ENB(tgi, gpio), gpio, 1);
307 struct tegra_gpio_info *tgi = bank->tgi;
339 val = tegra_gpio_readl(tgi, GPIO_INT_LVL(tgi, gpio));
342 tegra_gpio_writel(tgi, val, GPIO_INT_LVL(tgi, gpio));
346 tegra_gpio_mask_write(tgi, GPIO_MSK_OE(tgi, gpio), gpio, 0);
347 tegra_gpio_enable(tgi, gpio);
349 ret = gpiochip_lock_as_irq(&tgi->gc, gpio);
351 dev_err(tgi->dev,
353 tegra_gpio_disable(tgi, gpio);
368 struct tegra_gpio_info *tgi = bank->tgi;
372 gpiochip_unlock_as_irq(&tgi->gc, gpio);
383 struct tegra_gpio_info *tgi = bank->tgi;
389 sta = tegra_gpio_readl(tgi, GPIO_INT_STA(tgi, gpio)) &
390 tegra_gpio_readl(tgi, GPIO_INT_ENB(tgi, gpio));
391 lvl = tegra_gpio_readl(tgi, GPIO_INT_LVL(tgi, gpio));
394 tegra_gpio_writel(tgi, 1 << pin,
395 GPIO_INT_CLR(tgi, gpio));
406 generic_handle_irq(irq_find_mapping(tgi->irq_domain,
419 struct tegra_gpio_info *tgi = dev_get_drvdata(dev);
422 for (b = 0; b < tgi->bank_count; b++) {
423 struct tegra_gpio_bank *bank = &tgi->bank_info[b];
428 tegra_gpio_writel(tgi, bank->cnf[p],
429 GPIO_CNF(tgi, gpio));
431 if (tgi->soc->debounce_supported) {
432 tegra_gpio_writel(tgi, bank->dbc_cnt[p],
433 GPIO_DBC_CNT(tgi, gpio));
434 tegra_gpio_writel(tgi, bank->dbc_enb[p],
435 GPIO_MSK_DBC_EN(tgi, gpio));
438 tegra_gpio_writel(tgi, bank->out[p],
439 GPIO_OUT(tgi, gpio));
440 tegra_gpio_writel(tgi, bank->oe[p],
441 GPIO_OE(tgi, gpio));
442 tegra_gpio_writel(tgi, bank->int_lvl[p],
443 GPIO_INT_LVL(tgi, gpio));
444 tegra_gpio_writel(tgi, bank->int_enb[p],
445 GPIO_INT_ENB(tgi, gpio));
454 struct tegra_gpio_info *tgi = dev_get_drvdata(dev);
457 for (b = 0; b < tgi->bank_count; b++) {
458 struct tegra_gpio_bank *bank = &tgi->bank_info[b];
463 bank->cnf[p] = tegra_gpio_readl(tgi,
464 GPIO_CNF(tgi, gpio));
465 bank->out[p] = tegra_gpio_readl(tgi,
466 GPIO_OUT(tgi, gpio));
467 bank->oe[p] = tegra_gpio_readl(tgi,
468 GPIO_OE(tgi, gpio));
469 if (tgi->soc->debounce_supported) {
470 bank->dbc_enb[p] = tegra_gpio_readl(tgi,
471 GPIO_MSK_DBC_EN(tgi, gpio));
476 bank->int_enb[p] = tegra_gpio_readl(tgi,
477 GPIO_INT_ENB(tgi, gpio));
478 bank->int_lvl[p] = tegra_gpio_readl(tgi,
479 GPIO_INT_LVL(tgi, gpio));
482 tegra_gpio_writel(tgi, bank->wake_enb[p],
483 GPIO_INT_ENB(tgi, gpio));
521 struct tegra_gpio_info *tgi = s->private;
524 for (i = 0; i < tgi->bank_count; i++) {
531 tegra_gpio_readl(tgi, GPIO_CNF(tgi, gpio)),
532 tegra_gpio_readl(tgi, GPIO_OE(tgi, gpio)),
533 tegra_gpio_readl(tgi, GPIO_OUT(tgi, gpio)),
534 tegra_gpio_readl(tgi, GPIO_IN(tgi, gpio)),
535 tegra_gpio_readl(tgi, GPIO_INT_STA(tgi, gpio)),
536 tegra_gpio_readl(tgi, GPIO_INT_ENB(tgi, gpio)),
537 tegra_gpio_readl(tgi, GPIO_INT_LVL(tgi, gpio)));
545 static void tegra_gpio_debuginit(struct tegra_gpio_info *tgi)
547 debugfs_create_file("tegra_gpio", 0444, NULL, tgi,
553 static inline void tegra_gpio_debuginit(struct tegra_gpio_info *tgi)
565 struct tegra_gpio_info *tgi;
570 tgi = devm_kzalloc(&pdev->dev, sizeof(*tgi), GFP_KERNEL);
571 if (!tgi)
574 tgi->soc = of_device_get_match_data(&pdev->dev);
575 tgi->dev = &pdev->dev;
581 tgi->bank_count = ret;
583 if (!tgi->bank_count) {
588 tgi->gc.label = "tegra-gpio";
589 tgi->gc.request = tegra_gpio_request;
590 tgi->gc.free = tegra_gpio_free;
591 tgi->gc.direction_input = tegra_gpio_direction_input;
592 tgi->gc.get = tegra_gpio_get;
593 tgi->gc.direction_output = tegra_gpio_direction_output;
594 tgi->gc.set = tegra_gpio_set;
595 tgi->gc.get_direction = tegra_gpio_get_direction;
596 tgi->gc.to_irq = tegra_gpio_to_irq;
597 tgi->gc.base = 0;
598 tgi->gc.ngpio = tgi->bank_count * 32;
599 tgi->gc.parent = &pdev->dev;
600 tgi->gc.of_node = pdev->dev.of_node;
602 tgi->ic.name = "GPIO";
603 tgi->ic.irq_ack = tegra_gpio_irq_ack;
604 tgi->ic.irq_mask = tegra_gpio_irq_mask;
605 tgi->ic.irq_unmask = tegra_gpio_irq_unmask;
606 tgi->ic.irq_set_type = tegra_gpio_irq_set_type;
607 tgi->ic.irq_shutdown = tegra_gpio_irq_shutdown;
609 tgi->ic.irq_set_wake = tegra_gpio_irq_set_wake;
612 platform_set_drvdata(pdev, tgi);
614 if (tgi->soc->debounce_supported)
615 tgi->gc.set_config = tegra_gpio_set_config;
617 tgi->bank_info = devm_kcalloc(&pdev->dev, tgi->bank_count,
618 sizeof(*tgi->bank_info), GFP_KERNEL);
619 if (!tgi->bank_info)
622 tgi->irq_domain = irq_domain_add_linear(pdev->dev.of_node,
623 tgi->gc.ngpio,
625 if (!tgi->irq_domain)
628 for (i = 0; i < tgi->bank_count; i++) {
633 bank = &tgi->bank_info[i];
636 bank->tgi = tgi;
639 tgi->regs = devm_platform_ioremap_resource(pdev, 0);
640 if (IS_ERR(tgi->regs))
641 return PTR_ERR(tgi->regs);
643 for (i = 0; i < tgi->bank_count; i++) {
647 tegra_gpio_writel(tgi, 0x00, GPIO_INT_ENB(tgi, gpio));
651 ret = devm_gpiochip_add_data(&pdev->dev, &tgi->gc, tgi);
653 irq_domain_remove(tgi->irq_domain);
657 for (gpio = 0; gpio < tgi->gc.ngpio; gpio++) {
658 int irq = irq_create_mapping(tgi->irq_domain, gpio);
661 bank = &tgi->bank_info[GPIO_BANK(gpio)];
664 irq_set_chip_and_handler(irq, &tgi->ic, handle_simple_irq);
667 for (i = 0; i < tgi->bank_count; i++) {
668 bank = &tgi->bank_info[i];
679 tegra_gpio_debuginit(tgi);