Lines Matching refs:pc
90 struct bcm2835_pinctrl *pc; member
264 static inline u32 bcm2835_gpio_rd(struct bcm2835_pinctrl *pc, unsigned reg) in bcm2835_gpio_rd() argument
266 return readl(pc->base + reg); in bcm2835_gpio_rd()
269 static inline void bcm2835_gpio_wr(struct bcm2835_pinctrl *pc, unsigned reg, in bcm2835_gpio_wr() argument
272 writel(val, pc->base + reg); in bcm2835_gpio_wr()
275 static inline int bcm2835_gpio_get_bit(struct bcm2835_pinctrl *pc, unsigned reg, in bcm2835_gpio_get_bit() argument
279 return (bcm2835_gpio_rd(pc, reg) >> GPIO_REG_SHIFT(bit)) & 1; in bcm2835_gpio_get_bit()
283 static inline void bcm2835_gpio_set_bit(struct bcm2835_pinctrl *pc, in bcm2835_gpio_set_bit() argument
287 bcm2835_gpio_wr(pc, reg, BIT(GPIO_REG_SHIFT(bit))); in bcm2835_gpio_set_bit()
291 struct bcm2835_pinctrl *pc, unsigned pin) in bcm2835_pinctrl_fsel_get() argument
293 u32 val = bcm2835_gpio_rd(pc, FSEL_REG(pin)); in bcm2835_pinctrl_fsel_get()
296 dev_dbg(pc->dev, "get %08x (%u => %s)\n", val, pin, in bcm2835_pinctrl_fsel_get()
303 struct bcm2835_pinctrl *pc, unsigned pin, in bcm2835_pinctrl_fsel_set() argument
306 u32 val = bcm2835_gpio_rd(pc, FSEL_REG(pin)); in bcm2835_pinctrl_fsel_set()
309 dev_dbg(pc->dev, "read %08x (%u => %s)\n", val, pin, in bcm2835_pinctrl_fsel_set()
320 dev_dbg(pc->dev, "trans %08x (%u <= %s)\n", val, pin, in bcm2835_pinctrl_fsel_set()
322 bcm2835_gpio_wr(pc, FSEL_REG(pin), val); in bcm2835_pinctrl_fsel_set()
328 dev_dbg(pc->dev, "write %08x (%u <= %s)\n", val, pin, in bcm2835_pinctrl_fsel_set()
330 bcm2835_gpio_wr(pc, FSEL_REG(pin), val); in bcm2835_pinctrl_fsel_set()
340 struct bcm2835_pinctrl *pc = dev_get_drvdata(chip->dev); in bcm2835_gpio_get() local
342 return bcm2835_gpio_get_bit(pc, GPLEV0, offset); in bcm2835_gpio_get()
347 struct bcm2835_pinctrl *pc = dev_get_drvdata(chip->dev); in bcm2835_gpio_set() local
349 bcm2835_gpio_set_bit(pc, value ? GPSET0 : GPCLR0, offset); in bcm2835_gpio_set()
361 struct bcm2835_pinctrl *pc = dev_get_drvdata(chip->dev); in bcm2835_gpio_to_irq() local
363 return irq_linear_revmap(pc->irq_domain, offset); in bcm2835_gpio_to_irq()
384 struct bcm2835_pinctrl *pc = irqdata->pc; in bcm2835_gpio_irq_handler() local
391 events = bcm2835_gpio_rd(pc, GPEDS0 + bank * 4); in bcm2835_gpio_irq_handler()
392 events &= pc->enabled_irq_map[bank]; in bcm2835_gpio_irq_handler()
395 type = pc->irq_type[gpio]; in bcm2835_gpio_irq_handler()
397 generic_handle_irq(irq_linear_revmap(pc->irq_domain, gpio)); in bcm2835_gpio_irq_handler()
402 static inline void __bcm2835_gpio_irq_config(struct bcm2835_pinctrl *pc, in __bcm2835_gpio_irq_config() argument
407 value = bcm2835_gpio_rd(pc, reg); in __bcm2835_gpio_irq_config()
412 bcm2835_gpio_wr(pc, reg, value); in __bcm2835_gpio_irq_config()
416 static void bcm2835_gpio_irq_config(struct bcm2835_pinctrl *pc, in bcm2835_gpio_irq_config() argument
419 switch (pc->irq_type[offset]) { in bcm2835_gpio_irq_config()
421 __bcm2835_gpio_irq_config(pc, GPREN0, offset, enable); in bcm2835_gpio_irq_config()
425 __bcm2835_gpio_irq_config(pc, GPFEN0, offset, enable); in bcm2835_gpio_irq_config()
429 __bcm2835_gpio_irq_config(pc, GPREN0, offset, enable); in bcm2835_gpio_irq_config()
430 __bcm2835_gpio_irq_config(pc, GPFEN0, offset, enable); in bcm2835_gpio_irq_config()
434 __bcm2835_gpio_irq_config(pc, GPHEN0, offset, enable); in bcm2835_gpio_irq_config()
438 __bcm2835_gpio_irq_config(pc, GPLEN0, offset, enable); in bcm2835_gpio_irq_config()
445 struct bcm2835_pinctrl *pc = irq_data_get_irq_chip_data(data); in bcm2835_gpio_irq_enable() local
451 spin_lock_irqsave(&pc->irq_lock[bank], flags); in bcm2835_gpio_irq_enable()
452 set_bit(offset, &pc->enabled_irq_map[bank]); in bcm2835_gpio_irq_enable()
453 bcm2835_gpio_irq_config(pc, gpio, true); in bcm2835_gpio_irq_enable()
454 spin_unlock_irqrestore(&pc->irq_lock[bank], flags); in bcm2835_gpio_irq_enable()
459 struct bcm2835_pinctrl *pc = irq_data_get_irq_chip_data(data); in bcm2835_gpio_irq_disable() local
465 spin_lock_irqsave(&pc->irq_lock[bank], flags); in bcm2835_gpio_irq_disable()
466 bcm2835_gpio_irq_config(pc, gpio, false); in bcm2835_gpio_irq_disable()
468 bcm2835_gpio_set_bit(pc, GPEDS0, gpio); in bcm2835_gpio_irq_disable()
469 clear_bit(offset, &pc->enabled_irq_map[bank]); in bcm2835_gpio_irq_disable()
470 spin_unlock_irqrestore(&pc->irq_lock[bank], flags); in bcm2835_gpio_irq_disable()
473 static int __bcm2835_gpio_irq_set_type_disabled(struct bcm2835_pinctrl *pc, in __bcm2835_gpio_irq_set_type_disabled() argument
483 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_disabled()
493 static int __bcm2835_gpio_irq_set_type_enabled(struct bcm2835_pinctrl *pc, in __bcm2835_gpio_irq_set_type_enabled() argument
498 if (pc->irq_type[offset] != type) { in __bcm2835_gpio_irq_set_type_enabled()
499 bcm2835_gpio_irq_config(pc, offset, false); in __bcm2835_gpio_irq_set_type_enabled()
500 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_enabled()
505 if (pc->irq_type[offset] == IRQ_TYPE_EDGE_BOTH) { in __bcm2835_gpio_irq_set_type_enabled()
507 pc->irq_type[offset] = IRQ_TYPE_EDGE_FALLING; in __bcm2835_gpio_irq_set_type_enabled()
508 bcm2835_gpio_irq_config(pc, offset, false); in __bcm2835_gpio_irq_set_type_enabled()
509 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_enabled()
510 } else if (pc->irq_type[offset] != type) { in __bcm2835_gpio_irq_set_type_enabled()
511 bcm2835_gpio_irq_config(pc, offset, false); in __bcm2835_gpio_irq_set_type_enabled()
512 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_enabled()
513 bcm2835_gpio_irq_config(pc, offset, true); in __bcm2835_gpio_irq_set_type_enabled()
518 if (pc->irq_type[offset] == IRQ_TYPE_EDGE_BOTH) { in __bcm2835_gpio_irq_set_type_enabled()
520 pc->irq_type[offset] = IRQ_TYPE_EDGE_RISING; in __bcm2835_gpio_irq_set_type_enabled()
521 bcm2835_gpio_irq_config(pc, offset, false); in __bcm2835_gpio_irq_set_type_enabled()
522 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_enabled()
523 } else if (pc->irq_type[offset] != type) { in __bcm2835_gpio_irq_set_type_enabled()
524 bcm2835_gpio_irq_config(pc, offset, false); in __bcm2835_gpio_irq_set_type_enabled()
525 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_enabled()
526 bcm2835_gpio_irq_config(pc, offset, true); in __bcm2835_gpio_irq_set_type_enabled()
531 if (pc->irq_type[offset] == IRQ_TYPE_EDGE_RISING) { in __bcm2835_gpio_irq_set_type_enabled()
533 pc->irq_type[offset] = IRQ_TYPE_EDGE_FALLING; in __bcm2835_gpio_irq_set_type_enabled()
534 bcm2835_gpio_irq_config(pc, offset, true); in __bcm2835_gpio_irq_set_type_enabled()
535 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_enabled()
536 } else if (pc->irq_type[offset] == IRQ_TYPE_EDGE_FALLING) { in __bcm2835_gpio_irq_set_type_enabled()
538 pc->irq_type[offset] = IRQ_TYPE_EDGE_RISING; in __bcm2835_gpio_irq_set_type_enabled()
539 bcm2835_gpio_irq_config(pc, offset, true); in __bcm2835_gpio_irq_set_type_enabled()
540 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_enabled()
541 } else if (pc->irq_type[offset] != type) { in __bcm2835_gpio_irq_set_type_enabled()
542 bcm2835_gpio_irq_config(pc, offset, false); in __bcm2835_gpio_irq_set_type_enabled()
543 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_enabled()
544 bcm2835_gpio_irq_config(pc, offset, true); in __bcm2835_gpio_irq_set_type_enabled()
550 if (pc->irq_type[offset] != type) { in __bcm2835_gpio_irq_set_type_enabled()
551 bcm2835_gpio_irq_config(pc, offset, false); in __bcm2835_gpio_irq_set_type_enabled()
552 pc->irq_type[offset] = type; in __bcm2835_gpio_irq_set_type_enabled()
553 bcm2835_gpio_irq_config(pc, offset, true); in __bcm2835_gpio_irq_set_type_enabled()
565 struct bcm2835_pinctrl *pc = irq_data_get_irq_chip_data(data); in bcm2835_gpio_irq_set_type() local
572 spin_lock_irqsave(&pc->irq_lock[bank], flags); in bcm2835_gpio_irq_set_type()
574 if (test_bit(offset, &pc->enabled_irq_map[bank])) in bcm2835_gpio_irq_set_type()
575 ret = __bcm2835_gpio_irq_set_type_enabled(pc, gpio, type); in bcm2835_gpio_irq_set_type()
577 ret = __bcm2835_gpio_irq_set_type_disabled(pc, gpio, type); in bcm2835_gpio_irq_set_type()
584 spin_unlock_irqrestore(&pc->irq_lock[bank], flags); in bcm2835_gpio_irq_set_type()
591 struct bcm2835_pinctrl *pc = irq_data_get_irq_chip_data(data); in bcm2835_gpio_irq_ack() local
594 bcm2835_gpio_set_bit(pc, GPEDS0, gpio); in bcm2835_gpio_irq_ack()
633 struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev); in bcm2835_pctl_pin_dbg_show() local
634 enum bcm2835_fsel fsel = bcm2835_pinctrl_fsel_get(pc, offset); in bcm2835_pctl_pin_dbg_show()
636 int value = bcm2835_gpio_get_bit(pc, GPLEV0, offset); in bcm2835_pctl_pin_dbg_show()
637 int irq = irq_find_mapping(pc->irq_domain, offset); in bcm2835_pctl_pin_dbg_show()
641 irq, irq_type_names[pc->irq_type[offset]]); in bcm2835_pctl_pin_dbg_show()
656 static int bcm2835_pctl_dt_node_to_map_func(struct bcm2835_pinctrl *pc, in bcm2835_pctl_dt_node_to_map_func() argument
663 dev_err(pc->dev, "%s: invalid brcm,function %d\n", in bcm2835_pctl_dt_node_to_map_func()
676 static int bcm2835_pctl_dt_node_to_map_pull(struct bcm2835_pinctrl *pc, in bcm2835_pctl_dt_node_to_map_pull() argument
684 dev_err(pc->dev, "%s: invalid brcm,pull %d\n", in bcm2835_pctl_dt_node_to_map_pull()
707 struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev); in bcm2835_pctl_dt_node_to_map() local
716 dev_err(pc->dev, "%s: missing brcm,pins property\n", in bcm2835_pctl_dt_node_to_map()
725 dev_err(pc->dev, in bcm2835_pctl_dt_node_to_map()
736 dev_err(pc->dev, in bcm2835_pctl_dt_node_to_map()
743 dev_err(pc->dev, in bcm2835_pctl_dt_node_to_map()
764 dev_err(pc->dev, "%s: invalid brcm,pins value %d\n", in bcm2835_pctl_dt_node_to_map()
775 err = bcm2835_pctl_dt_node_to_map_func(pc, np, pin, in bcm2835_pctl_dt_node_to_map()
785 err = bcm2835_pctl_dt_node_to_map_pull(pc, np, pin, in bcm2835_pctl_dt_node_to_map()
838 struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev); in bcm2835_pmx_set() local
840 bcm2835_pinctrl_fsel_set(pc, group_selector, func_selector); in bcm2835_pmx_set()
849 struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev); in bcm2835_pmx_gpio_disable_free() local
852 bcm2835_pinctrl_fsel_set(pc, offset, BCM2835_FSEL_GPIO_IN); in bcm2835_pmx_gpio_disable_free()
860 struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev); in bcm2835_pmx_gpio_set_direction() local
864 bcm2835_pinctrl_fsel_set(pc, offset, fsel); in bcm2835_pmx_gpio_set_direction()
889 struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev); in bcm2835_pinconf_set() local
905 bcm2835_gpio_wr(pc, GPPUD, arg & 3); in bcm2835_pinconf_set()
911 bcm2835_gpio_wr(pc, GPPUDCLK0 + (off * 4), BIT(bit)); in bcm2835_pinconf_set()
913 bcm2835_gpio_wr(pc, GPPUDCLK0 + (off * 4), 0); in bcm2835_pinconf_set()
943 struct bcm2835_pinctrl *pc; in bcm2835_pinctrl_probe() local
949 pc = devm_kzalloc(dev, sizeof(*pc), GFP_KERNEL); in bcm2835_pinctrl_probe()
950 if (!pc) in bcm2835_pinctrl_probe()
953 platform_set_drvdata(pdev, pc); in bcm2835_pinctrl_probe()
954 pc->dev = dev; in bcm2835_pinctrl_probe()
962 pc->base = devm_ioremap_resource(dev, &iomem); in bcm2835_pinctrl_probe()
963 if (IS_ERR(pc->base)) in bcm2835_pinctrl_probe()
964 return PTR_ERR(pc->base); in bcm2835_pinctrl_probe()
966 pc->gpio_chip = bcm2835_gpio_chip; in bcm2835_pinctrl_probe()
967 pc->gpio_chip.dev = dev; in bcm2835_pinctrl_probe()
968 pc->gpio_chip.of_node = np; in bcm2835_pinctrl_probe()
970 pc->irq_domain = irq_domain_add_linear(np, BCM2835_NUM_GPIOS, in bcm2835_pinctrl_probe()
972 if (!pc->irq_domain) { in bcm2835_pinctrl_probe()
978 int irq = irq_create_mapping(pc->irq_domain, i); in bcm2835_pinctrl_probe()
982 irq_set_chip_data(irq, pc); in bcm2835_pinctrl_probe()
992 bcm2835_gpio_wr(pc, GPREN0 + i * 4, 0); in bcm2835_pinctrl_probe()
993 bcm2835_gpio_wr(pc, GPFEN0 + i * 4, 0); in bcm2835_pinctrl_probe()
994 bcm2835_gpio_wr(pc, GPHEN0 + i * 4, 0); in bcm2835_pinctrl_probe()
995 bcm2835_gpio_wr(pc, GPLEN0 + i * 4, 0); in bcm2835_pinctrl_probe()
996 bcm2835_gpio_wr(pc, GPAREN0 + i * 4, 0); in bcm2835_pinctrl_probe()
997 bcm2835_gpio_wr(pc, GPAFEN0 + i * 4, 0); in bcm2835_pinctrl_probe()
1000 events = bcm2835_gpio_rd(pc, GPEDS0 + i * 4); in bcm2835_pinctrl_probe()
1002 bcm2835_gpio_wr(pc, GPEDS0 + i * 4, BIT(offset)); in bcm2835_pinctrl_probe()
1004 pc->irq[i] = irq_of_parse_and_map(np, i); in bcm2835_pinctrl_probe()
1005 pc->irq_data[i].pc = pc; in bcm2835_pinctrl_probe()
1006 pc->irq_data[i].bank = i; in bcm2835_pinctrl_probe()
1007 spin_lock_init(&pc->irq_lock[i]); in bcm2835_pinctrl_probe()
1009 len = strlen(dev_name(pc->dev)) + 16; in bcm2835_pinctrl_probe()
1010 name = devm_kzalloc(pc->dev, len, GFP_KERNEL); in bcm2835_pinctrl_probe()
1013 snprintf(name, len, "%s:bank%d", dev_name(pc->dev), i); in bcm2835_pinctrl_probe()
1015 err = devm_request_irq(dev, pc->irq[i], in bcm2835_pinctrl_probe()
1017 name, &pc->irq_data[i]); in bcm2835_pinctrl_probe()
1019 dev_err(dev, "unable to request IRQ %d\n", pc->irq[i]); in bcm2835_pinctrl_probe()
1024 err = gpiochip_add(&pc->gpio_chip); in bcm2835_pinctrl_probe()
1030 pc->pctl_dev = pinctrl_register(&bcm2835_pinctrl_desc, dev, pc); in bcm2835_pinctrl_probe()
1031 if (IS_ERR(pc->pctl_dev)) { in bcm2835_pinctrl_probe()
1032 gpiochip_remove(&pc->gpio_chip); in bcm2835_pinctrl_probe()
1033 return PTR_ERR(pc->pctl_dev); in bcm2835_pinctrl_probe()
1036 pc->gpio_range = bcm2835_pinctrl_gpio_range; in bcm2835_pinctrl_probe()
1037 pc->gpio_range.base = pc->gpio_chip.base; in bcm2835_pinctrl_probe()
1038 pc->gpio_range.gc = &pc->gpio_chip; in bcm2835_pinctrl_probe()
1039 pinctrl_add_gpio_range(pc->pctl_dev, &pc->gpio_range); in bcm2835_pinctrl_probe()
1046 struct bcm2835_pinctrl *pc = platform_get_drvdata(pdev); in bcm2835_pinctrl_remove() local
1048 pinctrl_unregister(pc->pctl_dev); in bcm2835_pinctrl_remove()
1049 gpiochip_remove(&pc->gpio_chip); in bcm2835_pinctrl_remove()