Lines Matching +full:latched +full:- +full:gpios

1 // SPDX-License-Identifier: GPL-2.0+
8 * pinctrl-nomadik.c, please see original file for copyright information
9 * pinctrl-tegra.c, please see original file for copyright information
32 #include <linux/pinctrl/pinconf-generic.h>
38 #include <dt-bindings/pinctrl/bcm2835.h>
40 #define MODULE_NAME "pinctrl-bcm2835"
58 #define GPPUD 0x94 /* Pin Pull-up/down Enable */
59 #define GPPUDCLK0 0x98 /* Pin Pull-up/down Enable Clock */
60 #define GP_GPIO_PUP_PDN_CNTRL_REG0 0xe4 /* 2711 Pin Pull-up/down select */
240 [IRQ_TYPE_EDGE_RISING] = "edge-rising",
241 [IRQ_TYPE_EDGE_FALLING] = "edge-falling",
242 [IRQ_TYPE_EDGE_BOTH] = "edge-both",
243 [IRQ_TYPE_LEVEL_HIGH] = "level-high",
244 [IRQ_TYPE_LEVEL_LOW] = "level-low",
249 return readl(pc->base + reg); in bcm2835_gpio_rd()
255 writel(val, pc->base + reg); in bcm2835_gpio_wr()
279 dev_dbg(pc->dev, "get %08x (%u => %s)\n", val, pin, in bcm2835_pinctrl_fsel_get()
293 spin_lock_irqsave(&pc->fsel_lock, flags); in bcm2835_pinctrl_fsel_set()
297 dev_dbg(pc->dev, "read %08x (%u => %s)\n", val, pin, in bcm2835_pinctrl_fsel_set()
308 dev_dbg(pc->dev, "trans %08x (%u <= %s)\n", val, pin, in bcm2835_pinctrl_fsel_set()
316 dev_dbg(pc->dev, "write %08x (%u <= %s)\n", val, pin, in bcm2835_pinctrl_fsel_set()
321 spin_unlock_irqrestore(&pc->fsel_lock, flags); in bcm2835_pinctrl_fsel_set()
346 return -EINVAL; in bcm2835_gpio_get_direction()
373 struct device_node *np = dev_of_node(gc->parent); in bcm2835_add_pin_ranges_fallback()
380 gc->ngpio); in bcm2835_add_pin_ranges_fallback()
394 .base = -1,
401 .label = "pinctrl-bcm2711",
411 .base = -1,
426 events &= pc->enabled_irq_map[bank]; in bcm2835_gpio_irq_handle_bank()
429 generic_handle_domain_irq(pc->gpio_chip.irq.domain, in bcm2835_gpio_irq_handle_bank()
444 if (chip->irq.parents[i] == irq) { in bcm2835_gpio_irq_handler()
455 case 0: /* IRQ0 covers GPIOs 0-27 */ in bcm2835_gpio_irq_handler()
458 case 1: /* IRQ1 covers GPIOs 28-45 */ in bcm2835_gpio_irq_handler()
462 case 2: /* IRQ2 covers GPIOs 46-57 */ in bcm2835_gpio_irq_handler()
492 switch (pc->irq_type[offset]) { in bcm2835_gpio_irq_config()
527 raw_spin_lock_irqsave(&pc->irq_lock[bank], flags); in bcm2835_gpio_irq_unmask()
528 set_bit(offset, &pc->enabled_irq_map[bank]); in bcm2835_gpio_irq_unmask()
530 raw_spin_unlock_irqrestore(&pc->irq_lock[bank], flags); in bcm2835_gpio_irq_unmask()
542 raw_spin_lock_irqsave(&pc->irq_lock[bank], flags); in bcm2835_gpio_irq_mask()
544 /* Clear events that were latched prior to clearing event sources */ in bcm2835_gpio_irq_mask()
546 clear_bit(offset, &pc->enabled_irq_map[bank]); in bcm2835_gpio_irq_mask()
547 raw_spin_unlock_irqrestore(&pc->irq_lock[bank], flags); in bcm2835_gpio_irq_mask()
562 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_disabled()
566 return -EINVAL; in __bcm2835_gpio_irq_set_type_disabled()
577 if (pc->irq_type[offset] != type) { in __bcm2835_gpio_irq_set_type_enabled()
579 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_enabled()
584 if (pc->irq_type[offset] == IRQ_TYPE_EDGE_BOTH) { in __bcm2835_gpio_irq_set_type_enabled()
586 pc->irq_type[offset] = IRQ_TYPE_EDGE_FALLING; in __bcm2835_gpio_irq_set_type_enabled()
588 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_enabled()
589 } else if (pc->irq_type[offset] != type) { in __bcm2835_gpio_irq_set_type_enabled()
591 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_enabled()
597 if (pc->irq_type[offset] == IRQ_TYPE_EDGE_BOTH) { in __bcm2835_gpio_irq_set_type_enabled()
599 pc->irq_type[offset] = IRQ_TYPE_EDGE_RISING; in __bcm2835_gpio_irq_set_type_enabled()
601 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_enabled()
602 } else if (pc->irq_type[offset] != type) { in __bcm2835_gpio_irq_set_type_enabled()
604 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_enabled()
610 if (pc->irq_type[offset] == IRQ_TYPE_EDGE_RISING) { in __bcm2835_gpio_irq_set_type_enabled()
612 pc->irq_type[offset] = IRQ_TYPE_EDGE_FALLING; in __bcm2835_gpio_irq_set_type_enabled()
614 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_enabled()
615 } else if (pc->irq_type[offset] == IRQ_TYPE_EDGE_FALLING) { in __bcm2835_gpio_irq_set_type_enabled()
617 pc->irq_type[offset] = IRQ_TYPE_EDGE_RISING; in __bcm2835_gpio_irq_set_type_enabled()
619 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_enabled()
620 } else if (pc->irq_type[offset] != type) { in __bcm2835_gpio_irq_set_type_enabled()
622 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_enabled()
629 if (pc->irq_type[offset] != type) { in __bcm2835_gpio_irq_set_type_enabled()
631 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_enabled()
637 return -EINVAL; in __bcm2835_gpio_irq_set_type_enabled()
652 raw_spin_lock_irqsave(&pc->irq_lock[bank], flags); in bcm2835_gpio_irq_set_type()
654 if (test_bit(offset, &pc->enabled_irq_map[bank])) in bcm2835_gpio_irq_set_type()
664 raw_spin_unlock_irqrestore(&pc->irq_lock[bank], flags); in bcm2835_gpio_irq_set_type()
684 int ret = -EINVAL; in bcm2835_gpio_irq_set_wake()
686 if (!pc->wake_irq) in bcm2835_gpio_irq_set_wake()
699 ret = enable_irq_wake(pc->wake_irq[irqgroup]); in bcm2835_gpio_irq_set_wake()
701 ret = disable_irq_wake(pc->wake_irq[irqgroup]); in bcm2835_gpio_irq_set_wake()
744 struct gpio_chip *chip = &pc->gpio_chip; in bcm2835_pctl_pin_dbg_show()
748 int irq = irq_find_mapping(chip->irq.domain, offset); in bcm2835_pctl_pin_dbg_show()
752 irq, irq_type_names[pc->irq_type[offset]]); in bcm2835_pctl_pin_dbg_show()
774 dev_err(pc->dev, "%pOF: invalid brcm,function %d\n", np, fnum); in bcm2835_pctl_dt_node_to_map_func()
775 return -EINVAL; in bcm2835_pctl_dt_node_to_map_func()
778 map->type = PIN_MAP_TYPE_MUX_GROUP; in bcm2835_pctl_dt_node_to_map_func()
779 map->data.mux.group = bcm2835_gpio_groups[pin]; in bcm2835_pctl_dt_node_to_map_func()
780 map->data.mux.function = bcm2835_functions[fnum]; in bcm2835_pctl_dt_node_to_map_func()
794 dev_err(pc->dev, "%pOF: invalid brcm,pull %d\n", np, pull); in bcm2835_pctl_dt_node_to_map_pull()
795 return -EINVAL; in bcm2835_pctl_dt_node_to_map_pull()
800 return -ENOMEM; in bcm2835_pctl_dt_node_to_map_pull()
803 map->type = PIN_MAP_TYPE_CONFIGS_PIN; in bcm2835_pctl_dt_node_to_map_pull()
804 map->data.configs.group_or_pin = bcm2835_gpio_pins[pin].name; in bcm2835_pctl_dt_node_to_map_pull()
805 map->data.configs.configs = configs; in bcm2835_pctl_dt_node_to_map_pull()
806 map->data.configs.num_configs = 1; in bcm2835_pctl_dt_node_to_map_pull()
831 dev_err(pc->dev, "%pOF: missing brcm,pins property\n", np); in bcm2835_pctl_dt_node_to_map()
832 return -EINVAL; in bcm2835_pctl_dt_node_to_map()
839 dev_err(pc->dev, in bcm2835_pctl_dt_node_to_map()
842 return -EINVAL; in bcm2835_pctl_dt_node_to_map()
845 num_pins = pins->length / 4; in bcm2835_pctl_dt_node_to_map()
846 num_funcs = funcs ? (funcs->length / 4) : 0; in bcm2835_pctl_dt_node_to_map()
847 num_pulls = pulls ? (pulls->length / 4) : 0; in bcm2835_pctl_dt_node_to_map()
850 dev_err(pc->dev, in bcm2835_pctl_dt_node_to_map()
853 return -EINVAL; in bcm2835_pctl_dt_node_to_map()
857 dev_err(pc->dev, in bcm2835_pctl_dt_node_to_map()
860 return -EINVAL; in bcm2835_pctl_dt_node_to_map()
871 return -ENOMEM; in bcm2835_pctl_dt_node_to_map()
877 if (pin >= pc->pctl_desc.npins) { in bcm2835_pctl_dt_node_to_map()
878 dev_err(pc->dev, "%pOF: invalid brcm,pins value %d\n", in bcm2835_pctl_dt_node_to_map()
880 err = -EINVAL; in bcm2835_pctl_dt_node_to_map()
1007 return -ENOTSUPP; in bcm2835_pinconf_get()
1062 /* Set output-high or output-low */ in bcm2835_pinconf_set()
1068 return -ENOTSUPP; in bcm2835_pinconf_set()
1134 /* Set output-high or output-low */ in bcm2711_pinconf_set()
1140 return -ENOTSUPP; in bcm2711_pinconf_set()
1164 .name = "pinctrl-bcm2711",
1179 .name = "pinctrl-bcm2711",
1203 .compatible = "brcm,bcm2835-gpio",
1207 .compatible = "brcm,bcm2711-gpio",
1211 .compatible = "brcm,bcm7211-gpio",
1219 struct device *dev = &pdev->dev; in bcm2835_pinctrl_probe()
1220 struct device_node *np = dev->of_node; in bcm2835_pinctrl_probe()
1234 return -ENOMEM; in bcm2835_pinctrl_probe()
1237 pc->dev = dev; in bcm2835_pinctrl_probe()
1245 pc->base = devm_ioremap_resource(dev, &iomem); in bcm2835_pinctrl_probe()
1246 if (IS_ERR(pc->base)) in bcm2835_pinctrl_probe()
1247 return PTR_ERR(pc->base); in bcm2835_pinctrl_probe()
1249 match = of_match_node(bcm2835_pinctrl_match, pdev->dev.of_node); in bcm2835_pinctrl_probe()
1251 return -EINVAL; in bcm2835_pinctrl_probe()
1253 pdata = match->data; in bcm2835_pinctrl_probe()
1254 is_7211 = of_device_is_compatible(np, "brcm,bcm7211-gpio"); in bcm2835_pinctrl_probe()
1256 pc->gpio_chip = *pdata->gpio_chip; in bcm2835_pinctrl_probe()
1257 pc->gpio_chip.parent = dev; in bcm2835_pinctrl_probe()
1259 spin_lock_init(&pc->fsel_lock); in bcm2835_pinctrl_probe()
1277 raw_spin_lock_init(&pc->irq_lock[i]); in bcm2835_pinctrl_probe()
1280 pc->pctl_desc = *pdata->pctl_desc; in bcm2835_pinctrl_probe()
1281 pc->pctl_dev = devm_pinctrl_register(dev, &pc->pctl_desc, pc); in bcm2835_pinctrl_probe()
1282 if (IS_ERR(pc->pctl_dev)) { in bcm2835_pinctrl_probe()
1283 gpiochip_remove(&pc->gpio_chip); in bcm2835_pinctrl_probe()
1284 return PTR_ERR(pc->pctl_dev); in bcm2835_pinctrl_probe()
1287 pc->gpio_range = *pdata->gpio_range; in bcm2835_pinctrl_probe()
1288 pc->gpio_range.base = pc->gpio_chip.base; in bcm2835_pinctrl_probe()
1289 pc->gpio_range.gc = &pc->gpio_chip; in bcm2835_pinctrl_probe()
1290 pinctrl_add_gpio_range(pc->pctl_dev, &pc->gpio_range); in bcm2835_pinctrl_probe()
1292 girq = &pc->gpio_chip.irq; in bcm2835_pinctrl_probe()
1294 girq->parent_handler = bcm2835_gpio_irq_handler; in bcm2835_pinctrl_probe()
1295 girq->num_parents = BCM2835_NUM_IRQS; in bcm2835_pinctrl_probe()
1296 girq->parents = devm_kcalloc(dev, BCM2835_NUM_IRQS, in bcm2835_pinctrl_probe()
1297 sizeof(*girq->parents), in bcm2835_pinctrl_probe()
1299 if (!girq->parents) { in bcm2835_pinctrl_probe()
1300 err = -ENOMEM; in bcm2835_pinctrl_probe()
1305 pc->wake_irq = devm_kcalloc(dev, BCM2835_NUM_IRQS, in bcm2835_pinctrl_probe()
1306 sizeof(*pc->wake_irq), in bcm2835_pinctrl_probe()
1308 if (!pc->wake_irq) { in bcm2835_pinctrl_probe()
1309 err = -ENOMEM; in bcm2835_pinctrl_probe()
1316 * since we use one gpiochip to cover all lines - the in bcm2835_pinctrl_probe()
1318 * bank that was firing the IRQ and look up the per-group in bcm2835_pinctrl_probe()
1325 girq->parents[i] = irq_of_parse_and_map(np, i); in bcm2835_pinctrl_probe()
1327 if (!girq->parents[i]) { in bcm2835_pinctrl_probe()
1328 girq->num_parents = i; in bcm2835_pinctrl_probe()
1334 pc->wake_irq[i] = irq_of_parse_and_map(np, i + in bcm2835_pinctrl_probe()
1337 len = strlen(dev_name(pc->dev)) + 16; in bcm2835_pinctrl_probe()
1338 name = devm_kzalloc(pc->dev, len, GFP_KERNEL); in bcm2835_pinctrl_probe()
1340 err = -ENOMEM; in bcm2835_pinctrl_probe()
1344 snprintf(name, len, "%s:bank%d", dev_name(pc->dev), i); in bcm2835_pinctrl_probe()
1347 err = devm_request_irq(dev, pc->wake_irq[i], in bcm2835_pinctrl_probe()
1352 pc->wake_irq[i]); in bcm2835_pinctrl_probe()
1355 girq->default_type = IRQ_TYPE_NONE; in bcm2835_pinctrl_probe()
1356 girq->handler = handle_level_irq; in bcm2835_pinctrl_probe()
1358 err = gpiochip_add_data(&pc->gpio_chip, pc); in bcm2835_pinctrl_probe()
1367 pinctrl_remove_gpio_range(pc->pctl_dev, &pc->gpio_range); in bcm2835_pinctrl_probe()