Lines Matching refs:gpio

9 #include <linux/gpio/driver.h>
18 #include <dt-bindings/gpio/tegra186-gpio.h>
19 #include <dt-bindings/gpio/tegra194-gpio.h>
20 #include <dt-bindings/gpio/tegra234-gpio.h>
21 #include <dt-bindings/gpio/tegra241-gpio.h>
104 struct gpio_chip gpio;
117 tegra186_gpio_get_port(struct tegra_gpio *gpio, unsigned int *pin)
121 for (i = 0; i < gpio->soc->num_ports; i++) {
122 const struct tegra_gpio_port *port = &gpio->soc->ports[i];
135 static void __iomem *tegra186_gpio_get_base(struct tegra_gpio *gpio,
141 port = tegra186_gpio_get_port(gpio, &pin);
147 return gpio->base + offset + pin * 0x20;
150 static void __iomem *tegra186_gpio_get_secure_base(struct tegra_gpio *gpio,
156 port = tegra186_gpio_get_port(gpio, &pin);
162 return gpio->secure + offset + pin * TEGRA186_GPIO_SCR_PIN_SIZE;
165 static inline bool tegra186_gpio_is_accessible(struct tegra_gpio *gpio, unsigned int pin)
170 secure = tegra186_gpio_get_secure_base(gpio, pin);
172 if (gpio->soc->has_vm_support) {
192 struct tegra_gpio *gpio = gpiochip_get_data(chip);
196 if (!tegra186_gpio_is_accessible(gpio, j))
205 struct tegra_gpio *gpio = gpiochip_get_data(chip);
209 base = tegra186_gpio_get_base(gpio, offset);
223 struct tegra_gpio *gpio = gpiochip_get_data(chip);
227 base = tegra186_gpio_get_base(gpio, offset);
246 struct tegra_gpio *gpio = gpiochip_get_data(chip);
253 base = tegra186_gpio_get_base(gpio, offset);
275 struct tegra_gpio *gpio;
282 gpio = gpiochip_get_data(gc);
283 if (!gpio)
286 base = tegra186_gpio_get_base(gpio, offset);
310 struct tegra_gpio *gpio;
317 gpio = gpiochip_get_data(gc);
318 if (!gpio)
321 base = tegra186_gpio_get_base(gpio, offset);
342 struct tegra_gpio *gpio = gpiochip_get_data(chip);
346 base = tegra186_gpio_get_base(gpio, offset);
362 struct tegra_gpio *gpio = gpiochip_get_data(chip);
366 base = tegra186_gpio_get_base(gpio, offset);
383 struct tegra_gpio *gpio = gpiochip_get_data(chip);
387 base = tegra186_gpio_get_base(gpio, offset);
417 struct tegra_gpio *gpio = gpiochip_get_data(chip);
423 if (!gpio->soc->pinmux || gpio->soc->num_pin_ranges == 0)
426 np = of_find_compatible_node(NULL, NULL, gpio->soc->pinmux);
435 for (i = 0; i < gpio->soc->num_pin_ranges; i++) {
436 unsigned int pin = gpio->soc->pin_ranges[i].offset, port;
437 const char *group = gpio->soc->pin_ranges[i].group;
442 if (port >= gpio->soc->num_ports) {
449 pin += gpio->soc->ports[j].pins;
463 struct tegra_gpio *gpio = gpiochip_get_data(chip);
475 if (port >= gpio->soc->num_ports) {
481 offset += gpio->soc->ports[i].pins;
489 #define to_tegra_gpio(x) container_of((x), struct tegra_gpio, gpio)
494 struct tegra_gpio *gpio = to_tegra_gpio(gc);
497 base = tegra186_gpio_get_base(gpio, data->hwirq);
507 struct tegra_gpio *gpio = to_tegra_gpio(gc);
511 base = tegra186_gpio_get_base(gpio, data->hwirq);
519 gpiochip_disable_irq(&gpio->gpio, data->hwirq);
525 struct tegra_gpio *gpio = to_tegra_gpio(gc);
529 base = tegra186_gpio_get_base(gpio, data->hwirq);
533 gpiochip_enable_irq(&gpio->gpio, data->hwirq);
543 struct tegra_gpio *gpio = to_tegra_gpio(gc);
547 base = tegra186_gpio_get_base(gpio, data->hwirq);
626 struct tegra_gpio *gpio = irq_desc_get_handler_data(desc);
627 struct irq_domain *domain = gpio->gpio.irq.domain;
634 for (i = 0; i < gpio->soc->num_ports; i++) {
635 const struct tegra_gpio_port *port = &gpio->soc->ports[i];
640 base = gpio->base + port->bank * 0x1000 + port->port * 0x200;
643 for (j = 0; j < gpio->num_irqs_per_bank; j++) {
644 if (parent == gpio->irq[port->bank * gpio->num_irqs_per_bank + j])
648 if (j == gpio->num_irqs_per_bank)
670 struct tegra_gpio *gpio = gpiochip_get_data(domain->host_data);
673 if (WARN_ON(gpio->gpio.of_gpio_n_cells < 2))
676 if (WARN_ON(fwspec->param_count < gpio->gpio.of_gpio_n_cells))
682 if (port >= gpio->soc->num_ports)
686 offset += gpio->soc->ports[i].pins;
699 struct tegra_gpio *gpio = gpiochip_get_data(chip);
704 fwspec->param[0] = gpio->soc->instance;
726 struct tegra_gpio *gpio = gpiochip_get_data(chip);
729 for (i = 0; i < gpio->soc->num_ports; i++) {
730 if (offset < gpio->soc->ports[i].pins)
733 offset -= gpio->soc->ports[i].pins;
746 static void tegra186_gpio_init_route_mapping(struct tegra_gpio *gpio)
748 struct device *dev = gpio->gpio.parent;
752 for (i = 0; i < gpio->soc->num_ports; i++) {
753 const struct tegra_gpio_port *port = &gpio->soc->ports[i];
757 base = gpio->secure + port->bank * 0x1000 + 0x800;
792 static unsigned int tegra186_gpio_irqs_per_bank(struct tegra_gpio *gpio)
794 struct device *dev = gpio->gpio.parent;
796 if (gpio->num_irq > gpio->num_banks) {
797 if (gpio->num_irq % gpio->num_banks != 0)
801 if (gpio->num_irq < gpio->num_banks)
804 gpio->num_irqs_per_bank = gpio->num_irq / gpio->num_banks;
806 if (gpio->num_irqs_per_bank > gpio->soc->num_irqs_per_bank)
813 gpio->num_irq, gpio->num_banks);
821 struct tegra_gpio *gpio;
826 gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL);
827 if (!gpio)
830 gpio->soc = device_get_match_data(&pdev->dev);
831 gpio->gpio.label = gpio->soc->name;
832 gpio->gpio.parent = &pdev->dev;
835 for (i = 0; i < gpio->soc->num_ports; i++)
836 if (gpio->soc->ports[i].bank > gpio->num_banks)
837 gpio->num_banks = gpio->soc->ports[i].bank;
839 gpio->num_banks++;
842 gpio->secure = devm_platform_ioremap_resource_byname(pdev, "security");
843 if (IS_ERR(gpio->secure)) {
844 gpio->secure = devm_platform_ioremap_resource(pdev, 0);
845 if (IS_ERR(gpio->secure))
846 return PTR_ERR(gpio->secure);
849 gpio->base = devm_platform_ioremap_resource_byname(pdev, "gpio");
850 if (IS_ERR(gpio->base)) {
851 gpio->base = devm_platform_ioremap_resource(pdev, 1);
852 if (IS_ERR(gpio->base))
853 return PTR_ERR(gpio->base);
860 gpio->num_irq = err;
862 err = tegra186_gpio_irqs_per_bank(gpio);
866 gpio->irq = devm_kcalloc(&pdev->dev, gpio->num_irq, sizeof(*gpio->irq),
868 if (!gpio->irq)
871 for (i = 0; i < gpio->num_irq; i++) {
876 gpio->irq[i] = err;
879 gpio->gpio.request = gpiochip_generic_request;
880 gpio->gpio.free = gpiochip_generic_free;
881 gpio->gpio.get_direction = tegra186_gpio_get_direction;
882 gpio->gpio.direction_input = tegra186_gpio_direction_input;
883 gpio->gpio.direction_output = tegra186_gpio_direction_output;
884 gpio->gpio.get = tegra186_gpio_get;
885 gpio->gpio.set = tegra186_gpio_set;
886 gpio->gpio.set_config = tegra186_gpio_set_config;
887 gpio->gpio.add_pin_ranges = tegra186_gpio_add_pin_ranges;
888 gpio->gpio.init_valid_mask = tegra186_init_valid_mask;
889 if (gpio->soc->has_gte) {
890 gpio->gpio.en_hw_timestamp = tegra186_gpio_en_hw_ts;
891 gpio->gpio.dis_hw_timestamp = tegra186_gpio_dis_hw_ts;
894 gpio->gpio.base = -1;
896 for (i = 0; i < gpio->soc->num_ports; i++)
897 gpio->gpio.ngpio += gpio->soc->ports[i].pins;
899 names = devm_kcalloc(gpio->gpio.parent, gpio->gpio.ngpio,
904 for (i = 0, offset = 0; i < gpio->soc->num_ports; i++) {
905 const struct tegra_gpio_port *port = &gpio->soc->ports[i];
909 name = devm_kasprintf(gpio->gpio.parent, GFP_KERNEL,
920 gpio->gpio.names = (const char * const *)names;
923 gpio->gpio.of_gpio_n_cells = 2;
924 gpio->gpio.of_xlate = tegra186_gpio_of_xlate;
927 irq = &gpio->gpio.irq;
937 irq->parent_handler_data = gpio;
938 irq->num_parents = gpio->num_irq;
947 if (gpio->num_irqs_per_bank > 1) {
948 irq->parents = devm_kcalloc(&pdev->dev, gpio->num_banks,
953 for (i = 0; i < gpio->num_banks; i++)
954 irq->parents[i] = gpio->irq[i * gpio->num_irqs_per_bank];
956 irq->num_parents = gpio->num_banks;
958 irq->num_parents = gpio->num_irq;
959 irq->parents = gpio->irq;
962 if (gpio->soc->num_irqs_per_bank > 1)
963 tegra186_gpio_init_route_mapping(gpio);
978 irq->map = devm_kcalloc(&pdev->dev, gpio->gpio.ngpio,
983 for (i = 0, offset = 0; i < gpio->soc->num_ports; i++) {
984 const struct tegra_gpio_port *port = &gpio->soc->ports[i];
992 return devm_gpiochip_add_data(&pdev->dev, &gpio->gpio, gpio);
1032 .name = "tegra186-gpio",
1060 .name = "tegra186-gpio-aon",
1113 .name = "tegra194-gpio",
1141 .name = "tegra194-gpio-aon",
1187 .name = "tegra234-gpio",
1213 .name = "tegra234-gpio-aon",
1245 .name = "tegra241-gpio",
1267 .name = "tegra241-gpio-aon",
1275 .compatible = "nvidia,tegra186-gpio",
1278 .compatible = "nvidia,tegra186-gpio-aon",
1281 .compatible = "nvidia,tegra194-gpio",
1284 .compatible = "nvidia,tegra194-gpio-aon",
1287 .compatible = "nvidia,tegra234-gpio",
1290 .compatible = "nvidia,tegra234-gpio-aon",
1311 .name = "tegra186-gpio",