Lines Matching +full:orientation +full:- +full:gpios
1 // SPDX-License-Identifier: GPL-2.0-only
31 #include <linux/pinctrl/pinconf-generic.h>
36 #include "pinctrl-utils.h"
37 #include "pinctrl-amd.h"
45 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in amd_gpio_get_direction()
46 pin_reg = readl(gpio_dev->base + offset * 4); in amd_gpio_get_direction()
47 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in amd_gpio_get_direction()
61 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in amd_gpio_direction_input()
62 pin_reg = readl(gpio_dev->base + offset * 4); in amd_gpio_direction_input()
64 writel(pin_reg, gpio_dev->base + offset * 4); in amd_gpio_direction_input()
65 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in amd_gpio_direction_input()
77 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in amd_gpio_direction_output()
78 pin_reg = readl(gpio_dev->base + offset * 4); in amd_gpio_direction_output()
84 writel(pin_reg, gpio_dev->base + offset * 4); in amd_gpio_direction_output()
85 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in amd_gpio_direction_output()
96 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in amd_gpio_get_value()
97 pin_reg = readl(gpio_dev->base + offset * 4); in amd_gpio_get_value()
98 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in amd_gpio_get_value()
109 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in amd_gpio_set_value()
110 pin_reg = readl(gpio_dev->base + offset * 4); in amd_gpio_set_value()
115 writel(pin_reg, gpio_dev->base + offset * 4); in amd_gpio_set_value()
116 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in amd_gpio_set_value()
128 pin_reg = readl(gpio_dev->base + WAKE_INT_MASTER_REG); in amd_gpio_set_debounce()
133 pin_reg = readl(gpio_dev->base + offset * 4); in amd_gpio_set_debounce()
174 ret = -EINVAL; in amd_gpio_set_debounce()
182 writel(pin_reg, gpio_dev->base + offset * 4); in amd_gpio_set_debounce()
208 char *orientation; in amd_gpio_dbg_show() local
213 seq_printf(s, "WAKE_INT_MASTER_REG: 0x%08x\n", readl(gpio_dev->base + WAKE_INT_MASTER_REG)); in amd_gpio_dbg_show()
214 for (bank = 0; bank < gpio_dev->hwbank_num; bank++) { in amd_gpio_dbg_show()
243 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in amd_gpio_dbg_show()
244 pin_reg = readl(gpio_dev->base + i * 4); in amd_gpio_dbg_show()
245 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in amd_gpio_dbg_show()
325 orientation = "↑"; in amd_gpio_dbg_show()
327 orientation = "↓"; in amd_gpio_dbg_show()
331 orientation = "↑"; in amd_gpio_dbg_show()
333 orientation = "↓"; in amd_gpio_dbg_show()
335 seq_printf(s, "%s %s|", pin_sts, orientation); in amd_gpio_dbg_show()
379 gpiochip_enable_irq(gc, d->hwirq); in amd_gpio_irq_enable()
381 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in amd_gpio_irq_enable()
382 pin_reg = readl(gpio_dev->base + (d->hwirq)*4); in amd_gpio_irq_enable()
385 writel(pin_reg, gpio_dev->base + (d->hwirq)*4); in amd_gpio_irq_enable()
386 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in amd_gpio_irq_enable()
396 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in amd_gpio_irq_disable()
397 pin_reg = readl(gpio_dev->base + (d->hwirq)*4); in amd_gpio_irq_disable()
400 writel(pin_reg, gpio_dev->base + (d->hwirq)*4); in amd_gpio_irq_disable()
401 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in amd_gpio_irq_disable()
403 gpiochip_disable_irq(gc, d->hwirq); in amd_gpio_irq_disable()
413 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in amd_gpio_irq_mask()
414 pin_reg = readl(gpio_dev->base + (d->hwirq)*4); in amd_gpio_irq_mask()
416 writel(pin_reg, gpio_dev->base + (d->hwirq)*4); in amd_gpio_irq_mask()
417 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in amd_gpio_irq_mask()
427 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in amd_gpio_irq_unmask()
428 pin_reg = readl(gpio_dev->base + (d->hwirq)*4); in amd_gpio_irq_unmask()
430 writel(pin_reg, gpio_dev->base + (d->hwirq)*4); in amd_gpio_irq_unmask()
431 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in amd_gpio_irq_unmask()
443 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in amd_gpio_irq_set_wake()
444 pin_reg = readl(gpio_dev->base + (d->hwirq)*4); in amd_gpio_irq_set_wake()
451 writel(pin_reg, gpio_dev->base + (d->hwirq)*4); in amd_gpio_irq_set_wake()
452 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in amd_gpio_irq_set_wake()
455 err = enable_irq_wake(gpio_dev->irq); in amd_gpio_irq_set_wake()
457 err = disable_irq_wake(gpio_dev->irq); in amd_gpio_irq_set_wake()
460 dev_err(&gpio_dev->pdev->dev, "failed to %s wake-up interrupt\n", in amd_gpio_irq_set_wake()
473 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in amd_gpio_irq_eoi()
474 reg = readl(gpio_dev->base + WAKE_INT_MASTER_REG); in amd_gpio_irq_eoi()
476 writel(reg, gpio_dev->base + WAKE_INT_MASTER_REG); in amd_gpio_irq_eoi()
477 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in amd_gpio_irq_eoi()
488 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in amd_gpio_irq_set_type()
489 pin_reg = readl(gpio_dev->base + (d->hwirq)*4); in amd_gpio_irq_set_type()
531 dev_err(&gpio_dev->pdev->dev, "Invalid type value\n"); in amd_gpio_irq_set_type()
532 ret = -EINVAL; in amd_gpio_irq_set_type()
539 * generation for *all* GPIOs for a length of time that depends on in amd_gpio_irq_set_type()
548 * bit of other GPIOs. We keep the GPIO masked while polling to avoid in amd_gpio_irq_set_type()
555 writel(pin_reg_irq_en, gpio_dev->base + (d->hwirq)*4); in amd_gpio_irq_set_type()
556 while ((readl(gpio_dev->base + (d->hwirq)*4) & mask) != mask) in amd_gpio_irq_set_type()
558 writel(pin_reg, gpio_dev->base + (d->hwirq)*4); in amd_gpio_irq_set_type()
559 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in amd_gpio_irq_set_type()
598 struct gpio_chip *gc = &gpio_dev->gc; in do_amd_gpio_irq_handler()
607 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in do_amd_gpio_irq_handler()
608 status = readl(gpio_dev->base + WAKE_INT_STATUS_REG1); in do_amd_gpio_irq_handler()
610 status |= readl(gpio_dev->base + WAKE_INT_STATUS_REG0); in do_amd_gpio_irq_handler()
611 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in do_amd_gpio_irq_handler()
613 /* Bit 0-45 contain the relevant status bits */ in do_amd_gpio_irq_handler()
614 status &= (1ULL << 46) - 1; in do_amd_gpio_irq_handler()
615 regs = gpio_dev->base; in do_amd_gpio_irq_handler()
636 generic_handle_domain_irq_safe(gc->irq.domain, irqnr + i); in do_amd_gpio_irq_handler()
645 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in do_amd_gpio_irq_handler()
649 dev_dbg(&gpio_dev->pdev->dev, in do_amd_gpio_irq_handler()
656 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in do_amd_gpio_irq_handler()
664 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in do_amd_gpio_irq_handler()
665 regval = readl(gpio_dev->base + WAKE_INT_MASTER_REG); in do_amd_gpio_irq_handler()
667 writel(regval, gpio_dev->base + WAKE_INT_MASTER_REG); in do_amd_gpio_irq_handler()
668 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in do_amd_gpio_irq_handler()
680 return do_amd_gpio_irq_handler(-1, dev_id); in amd_gpio_check_wake()
687 return gpio_dev->ngroups; in amd_get_groups_count()
695 return gpio_dev->groups[group].name; in amd_get_group_name()
705 *pins = gpio_dev->groups[group].pins; in amd_get_group_pins()
706 *num_pins = gpio_dev->groups[group].npins; in amd_get_group_pins()
730 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in amd_pinconf_get()
731 pin_reg = readl(gpio_dev->base + pin*4); in amd_pinconf_get()
732 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in amd_pinconf_get()
751 dev_dbg(&gpio_dev->pdev->dev, "Invalid config param %04x\n", in amd_pinconf_get()
753 return -ENOTSUPP; in amd_pinconf_get()
772 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in amd_pinconf_set()
776 pin_reg = readl(gpio_dev->base + pin*4); in amd_pinconf_set()
801 dev_dbg(&gpio_dev->pdev->dev, in amd_pinconf_set()
803 ret = -ENOTSUPP; in amd_pinconf_set()
806 writel(pin_reg, gpio_dev->base + pin*4); in amd_pinconf_set()
809 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in amd_pinconf_set()
827 return -ENOTSUPP; in amd_pinconf_group_get()
845 return -ENOTSUPP; in amd_pinconf_group_set()
855 return amd_pinconf_set(gpio_dev->pctrl, pin, &config, 1); in amd_gpio_set_config()
867 struct pinctrl_desc *desc = gpio_dev->pctrl->desc; in amd_gpio_irq_init()
875 for (i = 0; i < desc->npins; i++) { in amd_gpio_irq_init()
876 int pin = desc->pins[i].number; in amd_gpio_irq_init()
877 const struct pin_desc *pd = pin_desc_get(gpio_dev->pctrl, pin); in amd_gpio_irq_init()
882 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in amd_gpio_irq_init()
884 pin_reg = readl(gpio_dev->base + pin * 4); in amd_gpio_irq_init()
886 writel(pin_reg, gpio_dev->base + pin * 4); in amd_gpio_irq_init()
888 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in amd_gpio_irq_init()
895 const struct pin_desc *pd = pin_desc_get(gpio_dev->pctrl, pin); in amd_gpio_should_save()
904 if (pd->mux_owner || pd->gpio_owner || in amd_gpio_should_save()
905 gpiochip_line_is_irq(&gpio_dev->gc, pin)) in amd_gpio_should_save()
914 struct pinctrl_desc *desc = gpio_dev->pctrl->desc; in amd_gpio_suspend()
918 for (i = 0; i < desc->npins; i++) { in amd_gpio_suspend()
919 int pin = desc->pins[i].number; in amd_gpio_suspend()
924 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in amd_gpio_suspend()
925 gpio_dev->saved_regs[i] = readl(gpio_dev->base + pin * 4) & ~PIN_IRQ_PENDING; in amd_gpio_suspend()
928 if (!(gpio_dev->saved_regs[i] & WAKE_SOURCE)) { in amd_gpio_suspend()
929 writel(gpio_dev->saved_regs[i] & ~BIT(INTERRUPT_MASK_OFF), in amd_gpio_suspend()
930 gpio_dev->base + pin * 4); in amd_gpio_suspend()
935 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in amd_gpio_suspend()
944 struct pinctrl_desc *desc = gpio_dev->pctrl->desc; in amd_gpio_resume()
948 for (i = 0; i < desc->npins; i++) { in amd_gpio_resume()
949 int pin = desc->pins[i].number; in amd_gpio_resume()
954 raw_spin_lock_irqsave(&gpio_dev->lock, flags); in amd_gpio_resume()
955 gpio_dev->saved_regs[i] |= readl(gpio_dev->base + pin * 4) & PIN_IRQ_PENDING; in amd_gpio_resume()
956 writel(gpio_dev->saved_regs[i], gpio_dev->base + pin * 4); in amd_gpio_resume()
957 raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); in amd_gpio_resume()
985 if (!gpio_dev->iomux_base) { in amd_get_groups()
986 dev_err(&gpio_dev->pdev->dev, "iomux function %d group not supported\n", selector); in amd_get_groups()
987 return -EINVAL; in amd_get_groups()
998 struct device *dev = &gpio_dev->pdev->dev; in amd_set_mux()
1002 if (!gpio_dev->iomux_base) in amd_set_mux()
1003 return -EINVAL; in amd_set_mux()
1006 if (strcmp(gpio_dev->groups[group].name, pmx_functions[function].groups[index])) in amd_set_mux()
1009 if (readb(gpio_dev->iomux_base + pmx_functions[function].index) == in amd_set_mux()
1013 return -EINVAL; in amd_set_mux()
1016 writeb(index, gpio_dev->iomux_base + pmx_functions[function].index); in amd_set_mux()
1018 if (index != (readb(gpio_dev->iomux_base + pmx_functions[function].index) & in amd_set_mux()
1022 return -EINVAL; in amd_set_mux()
1025 for (ind = 0; ind < gpio_dev->groups[group].npins; ind++) { in amd_set_mux()
1026 if (strncmp(gpio_dev->groups[group].name, "IMX_F", strlen("IMX_F"))) in amd_set_mux()
1029 pd = pin_desc_get(gpio_dev->pctrl, gpio_dev->groups[group].pins[ind]); in amd_set_mux()
1030 pd->mux_owner = gpio_dev->groups[group].name; in amd_set_mux()
1057 struct device *dev = &gpio_dev->pdev->dev; in amd_get_iomux_res()
1060 index = device_property_match_string(dev, "pinctrl-resource-names", "iomux"); in amd_get_iomux_res()
1066 gpio_dev->iomux_base = devm_platform_ioremap_resource(gpio_dev->pdev, index); in amd_get_iomux_res()
1067 if (IS_ERR(gpio_dev->iomux_base)) { in amd_get_iomux_res()
1075 desc->pmxops = NULL; in amd_get_iomux_res()
1085 gpio_dev = devm_kzalloc(&pdev->dev, in amd_gpio_probe()
1088 return -ENOMEM; in amd_gpio_probe()
1090 raw_spin_lock_init(&gpio_dev->lock); in amd_gpio_probe()
1092 gpio_dev->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); in amd_gpio_probe()
1093 if (IS_ERR(gpio_dev->base)) { in amd_gpio_probe()
1094 dev_err(&pdev->dev, "Failed to get gpio io resource.\n"); in amd_gpio_probe()
1095 return PTR_ERR(gpio_dev->base); in amd_gpio_probe()
1098 gpio_dev->irq = platform_get_irq(pdev, 0); in amd_gpio_probe()
1099 if (gpio_dev->irq < 0) in amd_gpio_probe()
1100 return gpio_dev->irq; in amd_gpio_probe()
1103 gpio_dev->saved_regs = devm_kcalloc(&pdev->dev, amd_pinctrl_desc.npins, in amd_gpio_probe()
1104 sizeof(*gpio_dev->saved_regs), in amd_gpio_probe()
1106 if (!gpio_dev->saved_regs) in amd_gpio_probe()
1107 return -ENOMEM; in amd_gpio_probe()
1110 gpio_dev->pdev = pdev; in amd_gpio_probe()
1111 gpio_dev->gc.get_direction = amd_gpio_get_direction; in amd_gpio_probe()
1112 gpio_dev->gc.direction_input = amd_gpio_direction_input; in amd_gpio_probe()
1113 gpio_dev->gc.direction_output = amd_gpio_direction_output; in amd_gpio_probe()
1114 gpio_dev->gc.get = amd_gpio_get_value; in amd_gpio_probe()
1115 gpio_dev->gc.set = amd_gpio_set_value; in amd_gpio_probe()
1116 gpio_dev->gc.set_config = amd_gpio_set_config; in amd_gpio_probe()
1117 gpio_dev->gc.dbg_show = amd_gpio_dbg_show; in amd_gpio_probe()
1119 gpio_dev->gc.base = -1; in amd_gpio_probe()
1120 gpio_dev->gc.label = pdev->name; in amd_gpio_probe()
1121 gpio_dev->gc.owner = THIS_MODULE; in amd_gpio_probe()
1122 gpio_dev->gc.parent = &pdev->dev; in amd_gpio_probe()
1123 gpio_dev->gc.ngpio = resource_size(res) / 4; in amd_gpio_probe()
1125 gpio_dev->hwbank_num = gpio_dev->gc.ngpio / 64; in amd_gpio_probe()
1126 gpio_dev->groups = kerncz_groups; in amd_gpio_probe()
1127 gpio_dev->ngroups = ARRAY_SIZE(kerncz_groups); in amd_gpio_probe()
1129 amd_pinctrl_desc.name = dev_name(&pdev->dev); in amd_gpio_probe()
1131 gpio_dev->pctrl = devm_pinctrl_register(&pdev->dev, &amd_pinctrl_desc, in amd_gpio_probe()
1133 if (IS_ERR(gpio_dev->pctrl)) { in amd_gpio_probe()
1134 dev_err(&pdev->dev, "Couldn't register pinctrl driver\n"); in amd_gpio_probe()
1135 return PTR_ERR(gpio_dev->pctrl); in amd_gpio_probe()
1141 girq = &gpio_dev->gc.irq; in amd_gpio_probe()
1144 girq->parent_handler = NULL; in amd_gpio_probe()
1145 girq->num_parents = 0; in amd_gpio_probe()
1146 girq->parents = NULL; in amd_gpio_probe()
1147 girq->default_type = IRQ_TYPE_NONE; in amd_gpio_probe()
1148 girq->handler = handle_simple_irq; in amd_gpio_probe()
1150 ret = gpiochip_add_data(&gpio_dev->gc, gpio_dev); in amd_gpio_probe()
1154 ret = gpiochip_add_pin_range(&gpio_dev->gc, dev_name(&pdev->dev), in amd_gpio_probe()
1155 0, 0, gpio_dev->gc.ngpio); in amd_gpio_probe()
1157 dev_err(&pdev->dev, "Failed to add pin range\n"); in amd_gpio_probe()
1161 ret = devm_request_irq(&pdev->dev, gpio_dev->irq, amd_gpio_irq_handler, in amd_gpio_probe()
1167 acpi_register_wakeup_handler(gpio_dev->irq, amd_gpio_check_wake, gpio_dev); in amd_gpio_probe()
1169 dev_dbg(&pdev->dev, "amd gpio driver loaded\n"); in amd_gpio_probe()
1173 gpiochip_remove(&gpio_dev->gc); in amd_gpio_probe()
1184 gpiochip_remove(&gpio_dev->gc); in amd_gpio_remove()