Lines Matching +full:pinctrl +full:- +full:lpc18xx

1 // SPDX-License-Identifier: GPL-2.0
3 * GPIO driver for NXP LPC18xx/43xx.
18 #include <linux/pinctrl/consumer.h>
21 /* LPC18xx GPIO register offsets */
27 /* LPC18xx GPIO pin interrupt controller register offsets */
58 u32 val = readl_relaxed(ic->base + LPC18XX_GPIO_PIN_IC_ISEL); in lpc18xx_gpio_pin_ic_isel()
65 writel_relaxed(val, ic->base + LPC18XX_GPIO_PIN_IC_ISEL); in lpc18xx_gpio_pin_ic_isel()
71 writel_relaxed(BIT(pin), ic->base + reg); in lpc18xx_gpio_pin_ic_set()
76 struct lpc18xx_gpio_pin_ic *ic = d->chip_data; in lpc18xx_gpio_pin_ic_mask()
80 raw_spin_lock(&ic->lock); in lpc18xx_gpio_pin_ic_mask()
83 lpc18xx_gpio_pin_ic_set(ic, d->hwirq, in lpc18xx_gpio_pin_ic_mask()
87 lpc18xx_gpio_pin_ic_set(ic, d->hwirq, in lpc18xx_gpio_pin_ic_mask()
90 raw_spin_unlock(&ic->lock); in lpc18xx_gpio_pin_ic_mask()
94 gpiochip_disable_irq(ic->gpio, hwirq); in lpc18xx_gpio_pin_ic_mask()
99 struct lpc18xx_gpio_pin_ic *ic = d->chip_data; in lpc18xx_gpio_pin_ic_unmask()
103 gpiochip_enable_irq(ic->gpio, hwirq); in lpc18xx_gpio_pin_ic_unmask()
105 raw_spin_lock(&ic->lock); in lpc18xx_gpio_pin_ic_unmask()
108 lpc18xx_gpio_pin_ic_set(ic, d->hwirq, in lpc18xx_gpio_pin_ic_unmask()
112 lpc18xx_gpio_pin_ic_set(ic, d->hwirq, in lpc18xx_gpio_pin_ic_unmask()
115 raw_spin_unlock(&ic->lock); in lpc18xx_gpio_pin_ic_unmask()
122 struct lpc18xx_gpio_pin_ic *ic = d->chip_data; in lpc18xx_gpio_pin_ic_eoi()
125 raw_spin_lock(&ic->lock); in lpc18xx_gpio_pin_ic_eoi()
128 lpc18xx_gpio_pin_ic_set(ic, d->hwirq, in lpc18xx_gpio_pin_ic_eoi()
131 raw_spin_unlock(&ic->lock); in lpc18xx_gpio_pin_ic_eoi()
138 struct lpc18xx_gpio_pin_ic *ic = d->chip_data; in lpc18xx_gpio_pin_ic_set_type()
140 raw_spin_lock(&ic->lock); in lpc18xx_gpio_pin_ic_set_type()
143 lpc18xx_gpio_pin_ic_isel(ic, d->hwirq, true); in lpc18xx_gpio_pin_ic_set_type()
144 lpc18xx_gpio_pin_ic_set(ic, d->hwirq, in lpc18xx_gpio_pin_ic_set_type()
147 lpc18xx_gpio_pin_ic_isel(ic, d->hwirq, true); in lpc18xx_gpio_pin_ic_set_type()
148 lpc18xx_gpio_pin_ic_set(ic, d->hwirq, in lpc18xx_gpio_pin_ic_set_type()
151 lpc18xx_gpio_pin_ic_isel(ic, d->hwirq, false); in lpc18xx_gpio_pin_ic_set_type()
154 raw_spin_unlock(&ic->lock); in lpc18xx_gpio_pin_ic_set_type()
160 .name = "LPC18xx GPIO pin",
174 struct lpc18xx_gpio_pin_ic *ic = domain->host_data; in lpc18xx_gpio_pin_ic_domain_alloc()
179 return -EINVAL; in lpc18xx_gpio_pin_ic_domain_alloc()
181 hwirq = fwspec->param[0]; in lpc18xx_gpio_pin_ic_domain_alloc()
183 return -EINVAL; in lpc18xx_gpio_pin_ic_domain_alloc()
186 * All LPC18xx/LPC43xx GPIO pin hardware interrupts are translated in lpc18xx_gpio_pin_ic_domain_alloc()
187 * into edge interrupts 32...39 on parent Cortex-M3/M4 NVIC in lpc18xx_gpio_pin_ic_domain_alloc()
189 parent_fwspec.fwnode = domain->parent->fwnode; in lpc18xx_gpio_pin_ic_domain_alloc()
212 struct device *dev = gc->gpio.parent; in lpc18xx_gpio_pin_ic_probe()
219 parent_node = of_irq_find_parent(dev->of_node); in lpc18xx_gpio_pin_ic_probe()
221 return -ENXIO; in lpc18xx_gpio_pin_ic_probe()
226 return -ENXIO; in lpc18xx_gpio_pin_ic_probe()
230 return -ENOMEM; in lpc18xx_gpio_pin_ic_probe()
232 index = of_property_match_string(dev->of_node, "reg-names", in lpc18xx_gpio_pin_ic_probe()
233 "gpio-pin-ic"); in lpc18xx_gpio_pin_ic_probe()
235 ret = -ENODEV; in lpc18xx_gpio_pin_ic_probe()
239 ret = of_address_to_resource(dev->of_node, index, &res); in lpc18xx_gpio_pin_ic_probe()
243 ic->base = devm_ioremap_resource(dev, &res); in lpc18xx_gpio_pin_ic_probe()
244 if (IS_ERR(ic->base)) { in lpc18xx_gpio_pin_ic_probe()
245 ret = PTR_ERR(ic->base); in lpc18xx_gpio_pin_ic_probe()
249 raw_spin_lock_init(&ic->lock); in lpc18xx_gpio_pin_ic_probe()
251 ic->domain = irq_domain_create_hierarchy(parent_domain, 0, NR_LPC18XX_GPIO_PIN_IC_IRQS, in lpc18xx_gpio_pin_ic_probe()
254 if (!ic->domain) { in lpc18xx_gpio_pin_ic_probe()
256 ret = -ENODEV; in lpc18xx_gpio_pin_ic_probe()
260 ic->gpio = &gc->gpio; in lpc18xx_gpio_pin_ic_probe()
261 gc->pin_ic = ic; in lpc18xx_gpio_pin_ic_probe()
266 devm_iounmap(dev, ic->base); in lpc18xx_gpio_pin_ic_probe()
278 writeb(value ? 1 : 0, gc->base + offset); in lpc18xx_gpio_set()
286 return !!readb(gc->base + offset); in lpc18xx_gpio_get()
299 spin_lock_irqsave(&gc->lock, flags); in lpc18xx_gpio_direction()
300 dir = readl(gc->base + LPC18XX_REG_DIR(port)); in lpc18xx_gpio_direction()
305 writel(dir, gc->base + LPC18XX_REG_DIR(port)); in lpc18xx_gpio_direction()
306 spin_unlock_irqrestore(&gc->lock, flags); in lpc18xx_gpio_direction()
325 .label = "lpc18xx/43xx-gpio",
338 struct device *dev = &pdev->dev; in lpc18xx_gpio_probe()
345 return -ENOMEM; in lpc18xx_gpio_probe()
347 gc->gpio = lpc18xx_chip; in lpc18xx_gpio_probe()
350 index = of_property_match_string(dev->of_node, "reg-names", "gpio"); in lpc18xx_gpio_probe()
353 gc->base = devm_platform_ioremap_resource(pdev, 0); in lpc18xx_gpio_probe()
357 ret = of_address_to_resource(dev->of_node, index, &res); in lpc18xx_gpio_probe()
361 gc->base = devm_ioremap_resource(dev, &res); in lpc18xx_gpio_probe()
363 if (IS_ERR(gc->base)) in lpc18xx_gpio_probe()
364 return PTR_ERR(gc->base); in lpc18xx_gpio_probe()
372 spin_lock_init(&gc->lock); in lpc18xx_gpio_probe()
374 gc->gpio.parent = dev; in lpc18xx_gpio_probe()
376 ret = devm_gpiochip_add_data(dev, &gc->gpio, gc); in lpc18xx_gpio_probe()
390 if (gc->pin_ic) in lpc18xx_gpio_remove()
391 irq_domain_remove(gc->pin_ic->domain); in lpc18xx_gpio_remove()
395 { .compatible = "nxp,lpc1850-gpio" },
404 .name = "lpc18xx-gpio",
412 MODULE_DESCRIPTION("GPIO driver for LPC18xx/43xx");