Lines Matching +full:edge +full:- +full:offset
1 // SPDX-License-Identifier: GPL-2.0-only
45 static inline void rda_gpio_update(struct gpio_chip *chip, unsigned int offset, in rda_gpio_update() argument
49 void __iomem *base = rda_gpio->base; in rda_gpio_update()
53 spin_lock_irqsave(&rda_gpio->lock, flags); in rda_gpio_update()
57 tmp |= BIT(offset); in rda_gpio_update()
59 tmp &= ~BIT(offset); in rda_gpio_update()
62 spin_unlock_irqrestore(&rda_gpio->lock, flags); in rda_gpio_update()
69 void __iomem *base = rda_gpio->base; in rda_gpio_irq_mask()
70 u32 offset = irqd_to_hwirq(data); in rda_gpio_irq_mask() local
73 value = BIT(offset) << RDA_GPIO_IRQ_RISE_SHIFT; in rda_gpio_irq_mask()
74 value |= BIT(offset) << RDA_GPIO_IRQ_FALL_SHIFT; in rda_gpio_irq_mask()
82 u32 offset = irqd_to_hwirq(data); in rda_gpio_irq_ack() local
84 rda_gpio_update(chip, offset, RDA_GPIO_INT_CLR, 1); in rda_gpio_irq_ack()
87 static int rda_gpio_set_irq(struct gpio_chip *chip, u32 offset, in rda_gpio_set_irq() argument
91 void __iomem *base = rda_gpio->base; in rda_gpio_set_irq()
96 /* Set rising edge trigger */ in rda_gpio_set_irq()
97 value = BIT(offset) << RDA_GPIO_IRQ_RISE_SHIFT; in rda_gpio_set_irq()
100 /* Switch to edge trigger interrupt */ in rda_gpio_set_irq()
101 value = BIT(offset) << RDA_GPIO_LEVEL_SHIFT; in rda_gpio_set_irq()
106 /* Set falling edge trigger */ in rda_gpio_set_irq()
107 value = BIT(offset) << RDA_GPIO_IRQ_FALL_SHIFT; in rda_gpio_set_irq()
110 /* Switch to edge trigger interrupt */ in rda_gpio_set_irq()
111 value = BIT(offset) << RDA_GPIO_LEVEL_SHIFT; in rda_gpio_set_irq()
116 /* Set both edge trigger */ in rda_gpio_set_irq()
117 value = BIT(offset) << RDA_GPIO_IRQ_RISE_SHIFT; in rda_gpio_set_irq()
118 value |= BIT(offset) << RDA_GPIO_IRQ_FALL_SHIFT; in rda_gpio_set_irq()
121 /* Switch to edge trigger interrupt */ in rda_gpio_set_irq()
122 value = BIT(offset) << RDA_GPIO_LEVEL_SHIFT; in rda_gpio_set_irq()
128 value = BIT(offset) << RDA_GPIO_IRQ_RISE_SHIFT; in rda_gpio_set_irq()
131 value |= BIT(offset) << RDA_GPIO_LEVEL_SHIFT; in rda_gpio_set_irq()
137 value = BIT(offset) << RDA_GPIO_IRQ_FALL_SHIFT; in rda_gpio_set_irq()
140 value |= BIT(offset) << RDA_GPIO_LEVEL_SHIFT; in rda_gpio_set_irq()
145 return -EINVAL; in rda_gpio_set_irq()
154 u32 offset = irqd_to_hwirq(data); in rda_gpio_irq_unmask() local
157 rda_gpio_set_irq(chip, offset, trigger); in rda_gpio_irq_unmask()
163 u32 offset = irqd_to_hwirq(data); in rda_gpio_irq_set_type() local
166 ret = rda_gpio_set_irq(chip, offset, flow_type); in rda_gpio_irq_set_type()
188 status = readl_relaxed(rda_gpio->base + RDA_GPIO_INT_STATUS); in rda_gpio_irq_handler()
193 girq = irq_find_mapping(chip->irq.domain, n); in rda_gpio_irq_handler()
202 struct device_node *np = pdev->dev.of_node; in rda_gpio_probe()
203 struct device *dev = &pdev->dev; in rda_gpio_probe()
211 return -ENOMEM; in rda_gpio_probe()
222 rda_gpio->irq = platform_get_irq(pdev, 0); in rda_gpio_probe()
224 rda_gpio->base = devm_platform_ioremap_resource(pdev, 0); in rda_gpio_probe()
225 if (IS_ERR(rda_gpio->base)) in rda_gpio_probe()
226 return PTR_ERR(rda_gpio->base); in rda_gpio_probe()
228 spin_lock_init(&rda_gpio->lock); in rda_gpio_probe()
230 ret = bgpio_init(&rda_gpio->chip, dev, 4, in rda_gpio_probe()
231 rda_gpio->base + RDA_GPIO_VAL, in rda_gpio_probe()
232 rda_gpio->base + RDA_GPIO_SET, in rda_gpio_probe()
233 rda_gpio->base + RDA_GPIO_CLR, in rda_gpio_probe()
234 rda_gpio->base + RDA_GPIO_OEN_SET_OUT, in rda_gpio_probe()
235 rda_gpio->base + RDA_GPIO_OEN_SET_IN, in rda_gpio_probe()
242 rda_gpio->chip.label = dev_name(dev); in rda_gpio_probe()
243 rda_gpio->chip.ngpio = ngpios; in rda_gpio_probe()
244 rda_gpio->chip.base = -1; in rda_gpio_probe()
245 rda_gpio->chip.parent = dev; in rda_gpio_probe()
246 rda_gpio->chip.of_node = np; in rda_gpio_probe()
248 if (rda_gpio->irq >= 0) { in rda_gpio_probe()
249 rda_gpio->irq_chip.name = "rda-gpio", in rda_gpio_probe()
250 rda_gpio->irq_chip.irq_ack = rda_gpio_irq_ack, in rda_gpio_probe()
251 rda_gpio->irq_chip.irq_mask = rda_gpio_irq_mask, in rda_gpio_probe()
252 rda_gpio->irq_chip.irq_unmask = rda_gpio_irq_unmask, in rda_gpio_probe()
253 rda_gpio->irq_chip.irq_set_type = rda_gpio_irq_set_type, in rda_gpio_probe()
254 rda_gpio->irq_chip.flags = IRQCHIP_SKIP_SET_WAKE, in rda_gpio_probe()
256 girq = &rda_gpio->chip.irq; in rda_gpio_probe()
257 girq->chip = &rda_gpio->irq_chip; in rda_gpio_probe()
258 girq->handler = handle_bad_irq; in rda_gpio_probe()
259 girq->default_type = IRQ_TYPE_NONE; in rda_gpio_probe()
260 girq->parent_handler = rda_gpio_irq_handler; in rda_gpio_probe()
261 girq->parent_handler_data = rda_gpio; in rda_gpio_probe()
262 girq->num_parents = 1; in rda_gpio_probe()
263 girq->parents = devm_kcalloc(dev, 1, in rda_gpio_probe()
264 sizeof(*girq->parents), in rda_gpio_probe()
266 if (!girq->parents) in rda_gpio_probe()
267 return -ENOMEM; in rda_gpio_probe()
268 girq->parents[0] = rda_gpio->irq; in rda_gpio_probe()
273 return devm_gpiochip_add_data(dev, &rda_gpio->chip, rda_gpio); in rda_gpio_probe()
277 { .compatible = "rda,8810pl-gpio", },
285 .name = "rda-gpio",