Lines Matching refs: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;
90 tegra186_gpio_get_port(struct tegra_gpio *gpio, unsigned int *pin)
94 for (i = 0; i < gpio->soc->num_ports; i++) {
95 const struct tegra_gpio_port *port = &gpio->soc->ports[i];
108 static void __iomem *tegra186_gpio_get_base(struct tegra_gpio *gpio,
114 port = tegra186_gpio_get_port(gpio, &pin);
120 return gpio->base + offset + pin * 0x20;
126 struct tegra_gpio *gpio = gpiochip_get_data(chip);
130 base = tegra186_gpio_get_base(gpio, offset);
144 struct tegra_gpio *gpio = gpiochip_get_data(chip);
148 base = tegra186_gpio_get_base(gpio, offset);
167 struct tegra_gpio *gpio = gpiochip_get_data(chip);
174 base = tegra186_gpio_get_base(gpio, offset);
193 struct tegra_gpio *gpio = gpiochip_get_data(chip);
197 base = tegra186_gpio_get_base(gpio, offset);
213 struct tegra_gpio *gpio = gpiochip_get_data(chip);
217 base = tegra186_gpio_get_base(gpio, offset);
234 struct tegra_gpio *gpio = gpiochip_get_data(chip);
238 base = tegra186_gpio_get_base(gpio, offset);
268 struct tegra_gpio *gpio = gpiochip_get_data(chip);
274 if (!gpio->soc->pinmux || gpio->soc->num_pin_ranges == 0)
277 np = of_find_compatible_node(NULL, NULL, gpio->soc->pinmux);
286 for (i = 0; i < gpio->soc->num_pin_ranges; i++) {
287 unsigned int pin = gpio->soc->pin_ranges[i].offset, port;
288 const char *group = gpio->soc->pin_ranges[i].group;
293 if (port >= gpio->soc->num_ports) {
300 pin += gpio->soc->ports[j].pins;
314 struct tegra_gpio *gpio = gpiochip_get_data(chip);
326 if (port >= gpio->soc->num_ports) {
332 offset += gpio->soc->ports[i].pins;
340 #define to_tegra_gpio(x) container_of((x), struct tegra_gpio, gpio)
345 struct tegra_gpio *gpio = to_tegra_gpio(gc);
348 base = tegra186_gpio_get_base(gpio, data->hwirq);
358 struct tegra_gpio *gpio = to_tegra_gpio(gc);
362 base = tegra186_gpio_get_base(gpio, data->hwirq);
374 struct tegra_gpio *gpio = to_tegra_gpio(gc);
378 base = tegra186_gpio_get_base(gpio, data->hwirq);
390 struct tegra_gpio *gpio = to_tegra_gpio(gc);
394 base = tegra186_gpio_get_base(gpio, data->hwirq);
455 struct tegra_gpio *gpio = irq_desc_get_handler_data(desc);
456 struct irq_domain *domain = gpio->gpio.irq.domain;
463 for (i = 0; i < gpio->soc->num_ports; i++) {
464 const struct tegra_gpio_port *port = &gpio->soc->ports[i];
469 base = gpio->base + port->bank * 0x1000 + port->port * 0x200;
472 if (parent != gpio->irq[port->bank])
497 struct tegra_gpio *gpio = gpiochip_get_data(domain->host_data);
500 if (WARN_ON(gpio->gpio.of_gpio_n_cells < 2))
503 if (WARN_ON(fwspec->param_count < gpio->gpio.of_gpio_n_cells))
509 if (port >= gpio->soc->num_ports)
513 offset += gpio->soc->ports[i].pins;
525 struct tegra_gpio *gpio = gpiochip_get_data(chip);
534 fwspec->param[0] = gpio->soc->instance;
556 struct tegra_gpio *gpio = gpiochip_get_data(chip);
559 for (i = 0; i < gpio->soc->num_ports; i++) {
560 if (offset < gpio->soc->ports[i].pins)
563 offset -= gpio->soc->ports[i].pins;
575 static void tegra186_gpio_init_route_mapping(struct tegra_gpio *gpio)
580 for (i = 0; i < gpio->soc->num_ports; i++) {
581 const struct tegra_gpio_port *port = &gpio->soc->ports[i];
585 base = gpio->secure + port->bank * 0x1000 + 0x800;
610 struct tegra_gpio *gpio;
615 gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL);
616 if (!gpio)
619 gpio->soc = of_device_get_match_data(&pdev->dev);
621 gpio->secure = devm_platform_ioremap_resource_byname(pdev, "security");
622 if (IS_ERR(gpio->secure))
623 return PTR_ERR(gpio->secure);
625 gpio->base = devm_platform_ioremap_resource_byname(pdev, "gpio");
626 if (IS_ERR(gpio->base))
627 return PTR_ERR(gpio->base);
633 gpio->num_irq = err;
635 gpio->irq = devm_kcalloc(&pdev->dev, gpio->num_irq, sizeof(*gpio->irq),
637 if (!gpio->irq)
640 for (i = 0; i < gpio->num_irq; i++) {
645 gpio->irq[i] = err;
648 gpio->gpio.label = gpio->soc->name;
649 gpio->gpio.parent = &pdev->dev;
651 gpio->gpio.request = gpiochip_generic_request;
652 gpio->gpio.free = gpiochip_generic_free;
653 gpio->gpio.get_direction = tegra186_gpio_get_direction;
654 gpio->gpio.direction_input = tegra186_gpio_direction_input;
655 gpio->gpio.direction_output = tegra186_gpio_direction_output;
656 gpio->gpio.get = tegra186_gpio_get,
657 gpio->gpio.set = tegra186_gpio_set;
658 gpio->gpio.set_config = tegra186_gpio_set_config;
659 gpio->gpio.add_pin_ranges = tegra186_gpio_add_pin_ranges;
661 gpio->gpio.base = -1;
663 for (i = 0; i < gpio->soc->num_ports; i++)
664 gpio->gpio.ngpio += gpio->soc->ports[i].pins;
666 names = devm_kcalloc(gpio->gpio.parent, gpio->gpio.ngpio,
671 for (i = 0, offset = 0; i < gpio->soc->num_ports; i++) {
672 const struct tegra_gpio_port *port = &gpio->soc->ports[i];
676 name = devm_kasprintf(gpio->gpio.parent, GFP_KERNEL,
687 gpio->gpio.names = (const char * const *)names;
689 gpio->gpio.of_node = pdev->dev.of_node;
690 gpio->gpio.of_gpio_n_cells = 2;
691 gpio->gpio.of_xlate = tegra186_gpio_of_xlate;
693 gpio->intc.name = pdev->dev.of_node->name;
694 gpio->intc.irq_ack = tegra186_irq_ack;
695 gpio->intc.irq_mask = tegra186_irq_mask;
696 gpio->intc.irq_unmask = tegra186_irq_unmask;
697 gpio->intc.irq_set_type = tegra186_irq_set_type;
698 gpio->intc.irq_set_wake = tegra186_irq_set_wake;
700 irq = &gpio->gpio.irq;
701 irq->chip = &gpio->intc;
710 irq->parent_handler_data = gpio;
711 irq->num_parents = gpio->num_irq;
712 irq->parents = gpio->irq;
723 tegra186_gpio_init_route_mapping(gpio);
725 irq->map = devm_kcalloc(&pdev->dev, gpio->gpio.ngpio,
730 for (i = 0, offset = 0; i < gpio->soc->num_ports; i++) {
731 const struct tegra_gpio_port *port = &gpio->soc->ports[i];
739 platform_set_drvdata(pdev, gpio);
741 err = devm_gpiochip_add_data(&pdev->dev, &gpio->gpio, gpio);
790 .name = "tegra186-gpio",
816 .name = "tegra186-gpio-aon",
867 .name = "tegra194-gpio",
893 .name = "tegra194-gpio-aon",
899 .compatible = "nvidia,tegra186-gpio",
902 .compatible = "nvidia,tegra186-gpio-aon",
905 .compatible = "nvidia,tegra194-gpio",
908 .compatible = "nvidia,tegra194-gpio-aon",
918 .name = "tegra186-gpio",