Lines Matching full:gpio
8 #include <linux/gpio/driver.h>
15 #include <dt-bindings/gpio/tegra186-gpio.h>
16 #include <dt-bindings/gpio/tegra194-gpio.h>
78 struct gpio_chip gpio; member
90 tegra186_gpio_get_port(struct tegra_gpio *gpio, unsigned int *pin) in tegra186_gpio_get_port() argument
94 for (i = 0; i < gpio->soc->num_ports; i++) { in tegra186_gpio_get_port()
95 const struct tegra_gpio_port *port = &gpio->soc->ports[i]; in tegra186_gpio_get_port()
108 static void __iomem *tegra186_gpio_get_base(struct tegra_gpio *gpio, in tegra186_gpio_get_base() argument
114 port = tegra186_gpio_get_port(gpio, &pin); in tegra186_gpio_get_base()
120 return gpio->base + offset + pin * 0x20; in tegra186_gpio_get_base()
126 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_get_direction() local
130 base = tegra186_gpio_get_base(gpio, offset); in tegra186_gpio_get_direction()
144 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_direction_input() local
148 base = tegra186_gpio_get_base(gpio, offset); in tegra186_gpio_direction_input()
167 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_direction_output() local
174 base = tegra186_gpio_get_base(gpio, offset); in tegra186_gpio_direction_output()
193 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_get() local
197 base = tegra186_gpio_get_base(gpio, offset); in tegra186_gpio_get()
213 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_set() local
217 base = tegra186_gpio_get_base(gpio, offset); in tegra186_gpio_set()
234 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_set_config() local
238 base = tegra186_gpio_get_base(gpio, offset); in tegra186_gpio_set_config()
248 * The Tegra186 GPIO controller supports a maximum of 255 ms debounce in tegra186_gpio_set_config()
268 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_add_pin_ranges() local
274 if (!gpio->soc->pinmux || gpio->soc->num_pin_ranges == 0) in tegra186_gpio_add_pin_ranges()
277 np = of_find_compatible_node(NULL, NULL, gpio->soc->pinmux); in tegra186_gpio_add_pin_ranges()
286 for (i = 0; i < gpio->soc->num_pin_ranges; i++) { in tegra186_gpio_add_pin_ranges()
287 unsigned int pin = gpio->soc->pin_ranges[i].offset, port; in tegra186_gpio_add_pin_ranges()
288 const char *group = gpio->soc->pin_ranges[i].group; in tegra186_gpio_add_pin_ranges()
293 if (port >= gpio->soc->num_ports) { in tegra186_gpio_add_pin_ranges()
300 pin += gpio->soc->ports[j].pins; in tegra186_gpio_add_pin_ranges()
314 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_of_xlate() local
326 if (port >= gpio->soc->num_ports) { in tegra186_gpio_of_xlate()
332 offset += gpio->soc->ports[i].pins; in tegra186_gpio_of_xlate()
342 struct tegra_gpio *gpio = irq_data_get_irq_chip_data(data); in tegra186_irq_ack() local
345 base = tegra186_gpio_get_base(gpio, data->hwirq); in tegra186_irq_ack()
354 struct tegra_gpio *gpio = irq_data_get_irq_chip_data(data); in tegra186_irq_mask() local
358 base = tegra186_gpio_get_base(gpio, data->hwirq); in tegra186_irq_mask()
369 struct tegra_gpio *gpio = irq_data_get_irq_chip_data(data); in tegra186_irq_unmask() local
373 base = tegra186_gpio_get_base(gpio, data->hwirq); in tegra186_irq_unmask()
384 struct tegra_gpio *gpio = irq_data_get_irq_chip_data(data); in tegra186_irq_set_type() local
388 base = tegra186_gpio_get_base(gpio, data->hwirq); in tegra186_irq_set_type()
449 struct tegra_gpio *gpio = irq_desc_get_handler_data(desc); in tegra186_gpio_irq() local
450 struct irq_domain *domain = gpio->gpio.irq.domain; in tegra186_gpio_irq()
457 for (i = 0; i < gpio->soc->num_ports; i++) { in tegra186_gpio_irq()
458 const struct tegra_gpio_port *port = &gpio->soc->ports[i]; in tegra186_gpio_irq()
463 base = gpio->base + port->bank * 0x1000 + port->port * 0x200; in tegra186_gpio_irq()
466 if (parent != gpio->irq[port->bank]) in tegra186_gpio_irq()
488 struct tegra_gpio *gpio = gpiochip_get_data(domain->host_data); in tegra186_gpio_irq_domain_translate() local
491 if (WARN_ON(gpio->gpio.of_gpio_n_cells < 2)) in tegra186_gpio_irq_domain_translate()
494 if (WARN_ON(fwspec->param_count < gpio->gpio.of_gpio_n_cells)) in tegra186_gpio_irq_domain_translate()
500 if (port >= gpio->soc->num_ports) in tegra186_gpio_irq_domain_translate()
504 offset += gpio->soc->ports[i].pins; in tegra186_gpio_irq_domain_translate()
516 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_populate_parent_fwspec() local
525 fwspec->param[0] = gpio->soc->instance; in tegra186_gpio_populate_parent_fwspec()
547 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_child_offset_to_irq() local
550 for (i = 0; i < gpio->soc->num_ports; i++) { in tegra186_gpio_child_offset_to_irq()
551 if (offset < gpio->soc->ports[i].pins) in tegra186_gpio_child_offset_to_irq()
554 offset -= gpio->soc->ports[i].pins; in tegra186_gpio_child_offset_to_irq()
566 static void tegra186_gpio_init_route_mapping(struct tegra_gpio *gpio) in tegra186_gpio_init_route_mapping() argument
571 for (i = 0; i < gpio->soc->num_ports; i++) { in tegra186_gpio_init_route_mapping()
572 const struct tegra_gpio_port *port = &gpio->soc->ports[i]; in tegra186_gpio_init_route_mapping()
576 base = gpio->secure + port->bank * 0x1000 + 0x800; in tegra186_gpio_init_route_mapping()
601 struct tegra_gpio *gpio; in tegra186_gpio_probe() local
606 gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL); in tegra186_gpio_probe()
607 if (!gpio) in tegra186_gpio_probe()
610 gpio->soc = device_get_match_data(&pdev->dev); in tegra186_gpio_probe()
612 gpio->secure = devm_platform_ioremap_resource_byname(pdev, "security"); in tegra186_gpio_probe()
613 if (IS_ERR(gpio->secure)) { in tegra186_gpio_probe()
614 gpio->secure = devm_platform_ioremap_resource(pdev, 0); in tegra186_gpio_probe()
615 if (IS_ERR(gpio->secure)) in tegra186_gpio_probe()
616 return PTR_ERR(gpio->secure); in tegra186_gpio_probe()
619 gpio->base = devm_platform_ioremap_resource_byname(pdev, "gpio"); in tegra186_gpio_probe()
620 if (IS_ERR(gpio->base)) { in tegra186_gpio_probe()
621 gpio->base = devm_platform_ioremap_resource(pdev, 1); in tegra186_gpio_probe()
622 if (IS_ERR(gpio->base)) in tegra186_gpio_probe()
623 return PTR_ERR(gpio->base); in tegra186_gpio_probe()
630 gpio->num_irq = err; in tegra186_gpio_probe()
632 gpio->irq = devm_kcalloc(&pdev->dev, gpio->num_irq, sizeof(*gpio->irq), in tegra186_gpio_probe()
634 if (!gpio->irq) in tegra186_gpio_probe()
637 for (i = 0; i < gpio->num_irq; i++) { in tegra186_gpio_probe()
642 gpio->irq[i] = err; in tegra186_gpio_probe()
645 gpio->gpio.label = gpio->soc->name; in tegra186_gpio_probe()
646 gpio->gpio.parent = &pdev->dev; in tegra186_gpio_probe()
648 gpio->gpio.request = gpiochip_generic_request; in tegra186_gpio_probe()
649 gpio->gpio.free = gpiochip_generic_free; in tegra186_gpio_probe()
650 gpio->gpio.get_direction = tegra186_gpio_get_direction; in tegra186_gpio_probe()
651 gpio->gpio.direction_input = tegra186_gpio_direction_input; in tegra186_gpio_probe()
652 gpio->gpio.direction_output = tegra186_gpio_direction_output; in tegra186_gpio_probe()
653 gpio->gpio.get = tegra186_gpio_get; in tegra186_gpio_probe()
654 gpio->gpio.set = tegra186_gpio_set; in tegra186_gpio_probe()
655 gpio->gpio.set_config = tegra186_gpio_set_config; in tegra186_gpio_probe()
656 gpio->gpio.add_pin_ranges = tegra186_gpio_add_pin_ranges; in tegra186_gpio_probe()
658 gpio->gpio.base = -1; in tegra186_gpio_probe()
660 for (i = 0; i < gpio->soc->num_ports; i++) in tegra186_gpio_probe()
661 gpio->gpio.ngpio += gpio->soc->ports[i].pins; in tegra186_gpio_probe()
663 names = devm_kcalloc(gpio->gpio.parent, gpio->gpio.ngpio, in tegra186_gpio_probe()
668 for (i = 0, offset = 0; i < gpio->soc->num_ports; i++) { in tegra186_gpio_probe()
669 const struct tegra_gpio_port *port = &gpio->soc->ports[i]; in tegra186_gpio_probe()
673 name = devm_kasprintf(gpio->gpio.parent, GFP_KERNEL, in tegra186_gpio_probe()
684 gpio->gpio.names = (const char * const *)names; in tegra186_gpio_probe()
687 gpio->gpio.of_node = pdev->dev.of_node; in tegra186_gpio_probe()
688 gpio->gpio.of_gpio_n_cells = 2; in tegra186_gpio_probe()
689 gpio->gpio.of_xlate = tegra186_gpio_of_xlate; in tegra186_gpio_probe()
692 gpio->intc.name = dev_name(&pdev->dev); in tegra186_gpio_probe()
693 gpio->intc.irq_ack = tegra186_irq_ack; in tegra186_gpio_probe()
694 gpio->intc.irq_mask = tegra186_irq_mask; in tegra186_gpio_probe()
695 gpio->intc.irq_unmask = tegra186_irq_unmask; in tegra186_gpio_probe()
696 gpio->intc.irq_set_type = tegra186_irq_set_type; in tegra186_gpio_probe()
697 gpio->intc.irq_set_wake = tegra186_irq_set_wake; in tegra186_gpio_probe()
699 irq = &gpio->gpio.irq; in tegra186_gpio_probe()
700 irq->chip = &gpio->intc; in tegra186_gpio_probe()
709 irq->parent_handler_data = gpio; in tegra186_gpio_probe()
710 irq->num_parents = gpio->num_irq; in tegra186_gpio_probe()
711 irq->parents = gpio->irq; in tegra186_gpio_probe()
722 tegra186_gpio_init_route_mapping(gpio); in tegra186_gpio_probe()
724 irq->map = devm_kcalloc(&pdev->dev, gpio->gpio.ngpio, in tegra186_gpio_probe()
729 for (i = 0, offset = 0; i < gpio->soc->num_ports; i++) { in tegra186_gpio_probe()
730 const struct tegra_gpio_port *port = &gpio->soc->ports[i]; in tegra186_gpio_probe()
738 return devm_gpiochip_add_data(&pdev->dev, &gpio->gpio, gpio); in tegra186_gpio_probe()
778 .name = "tegra186-gpio",
804 .name = "tegra186-gpio-aon",
855 .name = "tegra194-gpio",
881 .name = "tegra194-gpio-aon",
887 .compatible = "nvidia,tegra186-gpio",
890 .compatible = "nvidia,tegra186-gpio-aon",
893 .compatible = "nvidia,tegra194-gpio",
896 .compatible = "nvidia,tegra194-gpio-aon",
915 .name = "tegra186-gpio",
923 MODULE_DESCRIPTION("NVIDIA Tegra186 GPIO controller driver");