Lines Matching full:gpio
9 #include <linux/gpio/driver.h>
19 #include <dt-bindings/gpio/tegra186-gpio.h>
20 #include <dt-bindings/gpio/tegra194-gpio.h>
21 #include <dt-bindings/gpio/tegra234-gpio.h>
22 #include <dt-bindings/gpio/tegra241-gpio.h>
99 struct gpio_chip gpio; member
112 tegra186_gpio_get_port(struct tegra_gpio *gpio, unsigned int *pin) in tegra186_gpio_get_port() argument
116 for (i = 0; i < gpio->soc->num_ports; i++) { in tegra186_gpio_get_port()
117 const struct tegra_gpio_port *port = &gpio->soc->ports[i]; in tegra186_gpio_get_port()
130 static void __iomem *tegra186_gpio_get_base(struct tegra_gpio *gpio, in tegra186_gpio_get_base() argument
136 port = tegra186_gpio_get_port(gpio, &pin); in tegra186_gpio_get_base()
142 return gpio->base + offset + pin * 0x20; in tegra186_gpio_get_base()
145 static void __iomem *tegra186_gpio_get_secure_base(struct tegra_gpio *gpio, in tegra186_gpio_get_secure_base() argument
151 port = tegra186_gpio_get_port(gpio, &pin); in tegra186_gpio_get_secure_base()
157 return gpio->secure + offset + pin * TEGRA186_GPIO_SCR_PIN_SIZE; in tegra186_gpio_get_secure_base()
160 static inline bool tegra186_gpio_is_accessible(struct tegra_gpio *gpio, unsigned int pin) in tegra186_gpio_is_accessible() argument
165 secure = tegra186_gpio_get_secure_base(gpio, pin); in tegra186_gpio_is_accessible()
167 if (gpio->soc->has_vm_support) { in tegra186_gpio_is_accessible()
177 * registers for given GPIO pin. in tegra186_gpio_is_accessible()
180 * GPIO pin. in tegra186_gpio_is_accessible()
195 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_init_valid_mask() local
199 if (!tegra186_gpio_is_accessible(gpio, j)) in tegra186_init_valid_mask()
208 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_set() local
212 base = tegra186_gpio_get_base(gpio, offset); in tegra186_gpio_set()
230 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_get_direction() local
234 base = tegra186_gpio_get_base(gpio, offset); in tegra186_gpio_get_direction()
248 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_direction_input() local
252 base = tegra186_gpio_get_base(gpio, offset); in tegra186_gpio_direction_input()
271 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_direction_output() local
281 base = tegra186_gpio_get_base(gpio, offset); in tegra186_gpio_direction_output()
303 struct tegra_gpio *gpio; in tegra186_gpio_en_hw_ts() local
310 gpio = gpiochip_get_data(gc); in tegra186_gpio_en_hw_ts()
311 if (!gpio) in tegra186_gpio_en_hw_ts()
314 base = tegra186_gpio_get_base(gpio, offset); in tegra186_gpio_en_hw_ts()
338 struct tegra_gpio *gpio; in tegra186_gpio_dis_hw_ts() local
345 gpio = gpiochip_get_data(gc); in tegra186_gpio_dis_hw_ts()
346 if (!gpio) in tegra186_gpio_dis_hw_ts()
349 base = tegra186_gpio_get_base(gpio, offset); in tegra186_gpio_dis_hw_ts()
370 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_get() local
374 base = tegra186_gpio_get_base(gpio, offset); in tegra186_gpio_get()
391 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_set_config() local
395 base = tegra186_gpio_get_base(gpio, offset); in tegra186_gpio_set_config()
405 * The Tegra186 GPIO controller supports a maximum of 255 ms debounce in tegra186_gpio_set_config()
425 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_add_pin_ranges() local
431 if (!gpio->soc->pinmux || gpio->soc->num_pin_ranges == 0) in tegra186_gpio_add_pin_ranges()
434 np = of_find_compatible_node(NULL, NULL, gpio->soc->pinmux); in tegra186_gpio_add_pin_ranges()
443 for (i = 0; i < gpio->soc->num_pin_ranges; i++) { in tegra186_gpio_add_pin_ranges()
444 unsigned int pin = gpio->soc->pin_ranges[i].offset, port; in tegra186_gpio_add_pin_ranges()
445 const char *group = gpio->soc->pin_ranges[i].group; in tegra186_gpio_add_pin_ranges()
450 if (port >= gpio->soc->num_ports) { in tegra186_gpio_add_pin_ranges()
457 pin += gpio->soc->ports[j].pins; in tegra186_gpio_add_pin_ranges()
471 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_of_xlate() local
483 if (port >= gpio->soc->num_ports) { in tegra186_gpio_of_xlate()
489 offset += gpio->soc->ports[i].pins; in tegra186_gpio_of_xlate()
497 #define to_tegra_gpio(x) container_of((x), struct tegra_gpio, gpio)
502 struct tegra_gpio *gpio = to_tegra_gpio(gc); in tegra186_irq_ack() local
505 base = tegra186_gpio_get_base(gpio, data->hwirq); in tegra186_irq_ack()
515 struct tegra_gpio *gpio = to_tegra_gpio(gc); in tegra186_irq_mask() local
519 base = tegra186_gpio_get_base(gpio, data->hwirq); in tegra186_irq_mask()
527 gpiochip_disable_irq(&gpio->gpio, data->hwirq); in tegra186_irq_mask()
533 struct tegra_gpio *gpio = to_tegra_gpio(gc); in tegra186_irq_unmask() local
537 base = tegra186_gpio_get_base(gpio, data->hwirq); in tegra186_irq_unmask()
541 gpiochip_enable_irq(&gpio->gpio, data->hwirq); in tegra186_irq_unmask()
551 struct tegra_gpio *gpio = to_tegra_gpio(gc); in tegra186_irq_set_type() local
555 base = tegra186_gpio_get_base(gpio, data->hwirq); in tegra186_irq_set_type()
634 struct tegra_gpio *gpio = irq_desc_get_handler_data(desc); in tegra186_gpio_irq() local
635 struct irq_domain *domain = gpio->gpio.irq.domain; in tegra186_gpio_irq()
642 for (i = 0; i < gpio->soc->num_ports; i++) { in tegra186_gpio_irq()
643 const struct tegra_gpio_port *port = &gpio->soc->ports[i]; in tegra186_gpio_irq()
648 base = gpio->base + port->bank * 0x1000 + port->port * 0x200; in tegra186_gpio_irq()
651 for (j = 0; j < gpio->num_irqs_per_bank; j++) { in tegra186_gpio_irq()
652 if (parent == gpio->irq[port->bank * gpio->num_irqs_per_bank + j]) in tegra186_gpio_irq()
656 if (j == gpio->num_irqs_per_bank) in tegra186_gpio_irq()
678 struct tegra_gpio *gpio = gpiochip_get_data(domain->host_data); in tegra186_gpio_irq_domain_translate() local
681 if (WARN_ON(gpio->gpio.of_gpio_n_cells < 2)) in tegra186_gpio_irq_domain_translate()
684 if (WARN_ON(fwspec->param_count < gpio->gpio.of_gpio_n_cells)) in tegra186_gpio_irq_domain_translate()
690 if (port >= gpio->soc->num_ports) in tegra186_gpio_irq_domain_translate()
694 offset += gpio->soc->ports[i].pins; in tegra186_gpio_irq_domain_translate()
707 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_populate_parent_fwspec() local
712 fwspec->param[0] = gpio->soc->instance; in tegra186_gpio_populate_parent_fwspec()
734 struct tegra_gpio *gpio = gpiochip_get_data(chip); in tegra186_gpio_child_offset_to_irq() local
737 for (i = 0; i < gpio->soc->num_ports; i++) { in tegra186_gpio_child_offset_to_irq()
738 if (offset < gpio->soc->ports[i].pins) in tegra186_gpio_child_offset_to_irq()
741 offset -= gpio->soc->ports[i].pins; in tegra186_gpio_child_offset_to_irq()
754 static void tegra186_gpio_init_route_mapping(struct tegra_gpio *gpio) in tegra186_gpio_init_route_mapping() argument
756 struct device *dev = gpio->gpio.parent; in tegra186_gpio_init_route_mapping()
760 for (i = 0; i < gpio->soc->num_ports; i++) { in tegra186_gpio_init_route_mapping()
761 const struct tegra_gpio_port *port = &gpio->soc->ports[i]; in tegra186_gpio_init_route_mapping()
765 base = gpio->secure + port->bank * 0x1000 + 0x800; in tegra186_gpio_init_route_mapping()
785 * By default we only want to route GPIO pins to IRQ 0. This works in tegra186_gpio_init_route_mapping()
787 * and hence all GPIO pins are owned by Linux. in tegra186_gpio_init_route_mapping()
800 static unsigned int tegra186_gpio_irqs_per_bank(struct tegra_gpio *gpio) in tegra186_gpio_irqs_per_bank() argument
802 struct device *dev = gpio->gpio.parent; in tegra186_gpio_irqs_per_bank()
804 if (gpio->num_irq > gpio->num_banks) { in tegra186_gpio_irqs_per_bank()
805 if (gpio->num_irq % gpio->num_banks != 0) in tegra186_gpio_irqs_per_bank()
809 if (gpio->num_irq < gpio->num_banks) in tegra186_gpio_irqs_per_bank()
812 gpio->num_irqs_per_bank = gpio->num_irq / gpio->num_banks; in tegra186_gpio_irqs_per_bank()
814 if (gpio->num_irqs_per_bank > gpio->soc->num_irqs_per_bank) in tegra186_gpio_irqs_per_bank()
821 gpio->num_irq, gpio->num_banks); in tegra186_gpio_irqs_per_bank()
829 struct tegra_gpio *gpio; in tegra186_gpio_probe() local
835 gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL); in tegra186_gpio_probe()
836 if (!gpio) in tegra186_gpio_probe()
839 gpio->soc = device_get_match_data(&pdev->dev); in tegra186_gpio_probe()
840 gpio->gpio.label = gpio->soc->name; in tegra186_gpio_probe()
841 gpio->gpio.parent = &pdev->dev; in tegra186_gpio_probe()
844 for (i = 0; i < gpio->soc->num_ports; i++) in tegra186_gpio_probe()
845 if (gpio->soc->ports[i].bank > gpio->num_banks) in tegra186_gpio_probe()
846 gpio->num_banks = gpio->soc->ports[i].bank; in tegra186_gpio_probe()
848 gpio->num_banks++; in tegra186_gpio_probe()
854 gpio->secure = devm_ioremap_resource(&pdev->dev, res); in tegra186_gpio_probe()
855 if (IS_ERR(gpio->secure)) in tegra186_gpio_probe()
856 return PTR_ERR(gpio->secure); in tegra186_gpio_probe()
858 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "gpio"); in tegra186_gpio_probe()
861 gpio->base = devm_ioremap_resource(&pdev->dev, res); in tegra186_gpio_probe()
862 if (IS_ERR(gpio->base)) in tegra186_gpio_probe()
863 return PTR_ERR(gpio->base); in tegra186_gpio_probe()
869 gpio->num_irq = err; in tegra186_gpio_probe()
871 err = tegra186_gpio_irqs_per_bank(gpio); in tegra186_gpio_probe()
875 gpio->irq = devm_kcalloc(&pdev->dev, gpio->num_irq, sizeof(*gpio->irq), in tegra186_gpio_probe()
877 if (!gpio->irq) in tegra186_gpio_probe()
880 for (i = 0; i < gpio->num_irq; i++) { in tegra186_gpio_probe()
885 gpio->irq[i] = err; in tegra186_gpio_probe()
888 gpio->gpio.request = gpiochip_generic_request; in tegra186_gpio_probe()
889 gpio->gpio.free = gpiochip_generic_free; in tegra186_gpio_probe()
890 gpio->gpio.get_direction = tegra186_gpio_get_direction; in tegra186_gpio_probe()
891 gpio->gpio.direction_input = tegra186_gpio_direction_input; in tegra186_gpio_probe()
892 gpio->gpio.direction_output = tegra186_gpio_direction_output; in tegra186_gpio_probe()
893 gpio->gpio.get = tegra186_gpio_get; in tegra186_gpio_probe()
894 gpio->gpio.set = tegra186_gpio_set; in tegra186_gpio_probe()
895 gpio->gpio.set_config = tegra186_gpio_set_config; in tegra186_gpio_probe()
896 gpio->gpio.add_pin_ranges = tegra186_gpio_add_pin_ranges; in tegra186_gpio_probe()
897 gpio->gpio.init_valid_mask = tegra186_init_valid_mask; in tegra186_gpio_probe()
898 if (gpio->soc->has_gte) { in tegra186_gpio_probe()
899 gpio->gpio.en_hw_timestamp = tegra186_gpio_en_hw_ts; in tegra186_gpio_probe()
900 gpio->gpio.dis_hw_timestamp = tegra186_gpio_dis_hw_ts; in tegra186_gpio_probe()
903 gpio->gpio.base = -1; in tegra186_gpio_probe()
905 for (i = 0; i < gpio->soc->num_ports; i++) in tegra186_gpio_probe()
906 gpio->gpio.ngpio += gpio->soc->ports[i].pins; in tegra186_gpio_probe()
908 names = devm_kcalloc(gpio->gpio.parent, gpio->gpio.ngpio, in tegra186_gpio_probe()
913 for (i = 0, offset = 0; i < gpio->soc->num_ports; i++) { in tegra186_gpio_probe()
914 const struct tegra_gpio_port *port = &gpio->soc->ports[i]; in tegra186_gpio_probe()
918 name = devm_kasprintf(gpio->gpio.parent, GFP_KERNEL, in tegra186_gpio_probe()
929 gpio->gpio.names = (const char * const *)names; in tegra186_gpio_probe()
932 gpio->gpio.of_gpio_n_cells = 2; in tegra186_gpio_probe()
933 gpio->gpio.of_xlate = tegra186_gpio_of_xlate; in tegra186_gpio_probe()
936 irq = &gpio->gpio.irq; in tegra186_gpio_probe()
946 irq->parent_handler_data = gpio; in tegra186_gpio_probe()
947 irq->num_parents = gpio->num_irq; in tegra186_gpio_probe()
956 if (gpio->num_irqs_per_bank > 1) { in tegra186_gpio_probe()
957 irq->parents = devm_kcalloc(&pdev->dev, gpio->num_banks, in tegra186_gpio_probe()
962 for (i = 0; i < gpio->num_banks; i++) in tegra186_gpio_probe()
963 irq->parents[i] = gpio->irq[i * gpio->num_irqs_per_bank]; in tegra186_gpio_probe()
965 irq->num_parents = gpio->num_banks; in tegra186_gpio_probe()
967 irq->num_parents = gpio->num_irq; in tegra186_gpio_probe()
968 irq->parents = gpio->irq; in tegra186_gpio_probe()
971 if (gpio->soc->num_irqs_per_bank > 1) in tegra186_gpio_probe()
972 tegra186_gpio_init_route_mapping(gpio); in tegra186_gpio_probe()
987 irq->map = devm_kcalloc(&pdev->dev, gpio->gpio.ngpio, in tegra186_gpio_probe()
992 for (i = 0, offset = 0; i < gpio->soc->num_ports; i++) { in tegra186_gpio_probe()
993 const struct tegra_gpio_port *port = &gpio->soc->ports[i]; in tegra186_gpio_probe()
1001 return devm_gpiochip_add_data(&pdev->dev, &gpio->gpio, gpio); in tegra186_gpio_probe()
1041 .name = "tegra186-gpio",
1069 .name = "tegra186-gpio-aon",
1122 .name = "tegra194-gpio",
1150 .name = "tegra194-gpio-aon",
1196 .name = "tegra234-gpio",
1222 .name = "tegra234-gpio-aon",
1254 .name = "tegra241-gpio",
1276 .name = "tegra241-gpio-aon",
1284 .compatible = "nvidia,tegra186-gpio",
1287 .compatible = "nvidia,tegra186-gpio-aon",
1290 .compatible = "nvidia,tegra194-gpio",
1293 .compatible = "nvidia,tegra194-gpio-aon",
1296 .compatible = "nvidia,tegra234-gpio",
1299 .compatible = "nvidia,tegra234-gpio-aon",
1320 .name = "tegra186-gpio",
1328 MODULE_DESCRIPTION("NVIDIA Tegra186 GPIO controller driver");