Lines Matching +full:ctrl +full:- +full:module
1 // SPDX-License-Identifier: GPL-2.0
7 #include <linux/module.h>
30 struct idt_gpio_ctrl *ctrl = gpiochip_get_data(gc); in idt_gpio_dispatch() local
37 pending = readl(ctrl->pic + IDT_PIC_IRQ_PEND); in idt_gpio_dispatch()
38 pending &= ~ctrl->mask_cache; in idt_gpio_dispatch()
39 for_each_set_bit(bit, &pending, gc->ngpio) { in idt_gpio_dispatch()
40 virq = irq_linear_revmap(gc->irq.domain, bit); in idt_gpio_dispatch()
51 struct idt_gpio_ctrl *ctrl = gpiochip_get_data(gc); in idt_gpio_irq_set_type() local
58 return -EINVAL; in idt_gpio_irq_set_type()
60 spin_lock_irqsave(&gc->bgpio_lock, flags); in idt_gpio_irq_set_type()
62 ilevel = readl(ctrl->gpio + IDT_GPIO_ILEVEL); in idt_gpio_irq_set_type()
64 ilevel |= BIT(d->hwirq); in idt_gpio_irq_set_type()
66 ilevel &= ~BIT(d->hwirq); in idt_gpio_irq_set_type()
68 writel(ilevel, ctrl->gpio + IDT_GPIO_ILEVEL); in idt_gpio_irq_set_type()
71 spin_unlock_irqrestore(&gc->bgpio_lock, flags); in idt_gpio_irq_set_type()
78 struct idt_gpio_ctrl *ctrl = gpiochip_get_data(gc); in idt_gpio_ack() local
80 writel(~BIT(d->hwirq), ctrl->gpio + IDT_GPIO_ISTAT); in idt_gpio_ack()
86 struct idt_gpio_ctrl *ctrl = gpiochip_get_data(gc); in idt_gpio_mask() local
89 spin_lock_irqsave(&gc->bgpio_lock, flags); in idt_gpio_mask()
91 ctrl->mask_cache |= BIT(d->hwirq); in idt_gpio_mask()
92 writel(ctrl->mask_cache, ctrl->pic + IDT_PIC_IRQ_MASK); in idt_gpio_mask()
94 spin_unlock_irqrestore(&gc->bgpio_lock, flags); in idt_gpio_mask()
100 struct idt_gpio_ctrl *ctrl = gpiochip_get_data(gc); in idt_gpio_unmask() local
103 spin_lock_irqsave(&gc->bgpio_lock, flags); in idt_gpio_unmask()
105 ctrl->mask_cache &= ~BIT(d->hwirq); in idt_gpio_unmask()
106 writel(ctrl->mask_cache, ctrl->pic + IDT_PIC_IRQ_MASK); in idt_gpio_unmask()
108 spin_unlock_irqrestore(&gc->bgpio_lock, flags); in idt_gpio_unmask()
113 struct idt_gpio_ctrl *ctrl = gpiochip_get_data(gc); in idt_gpio_irq_init_hw() local
116 ctrl->mask_cache = 0xffffffff; in idt_gpio_irq_init_hw()
117 writel(ctrl->mask_cache, ctrl->pic + IDT_PIC_IRQ_MASK); in idt_gpio_irq_init_hw()
132 struct device *dev = &pdev->dev; in idt_gpio_probe()
134 struct idt_gpio_ctrl *ctrl; in idt_gpio_probe() local
140 ctrl = devm_kzalloc(dev, sizeof(*ctrl), GFP_KERNEL); in idt_gpio_probe()
141 if (!ctrl) in idt_gpio_probe()
142 return -ENOMEM; in idt_gpio_probe()
144 ctrl->gpio = devm_platform_ioremap_resource_byname(pdev, "gpio"); in idt_gpio_probe()
145 if (IS_ERR(ctrl->gpio)) in idt_gpio_probe()
146 return PTR_ERR(ctrl->gpio); in idt_gpio_probe()
148 ctrl->gc.parent = dev; in idt_gpio_probe()
150 ret = bgpio_init(&ctrl->gc, &pdev->dev, 4, ctrl->gpio + IDT_GPIO_DATA, in idt_gpio_probe()
151 NULL, NULL, ctrl->gpio + IDT_GPIO_DIR, NULL, 0); in idt_gpio_probe()
159 ctrl->gc.ngpio = ngpios; in idt_gpio_probe()
161 if (device_property_read_bool(dev, "interrupt-controller")) { in idt_gpio_probe()
162 ctrl->pic = devm_platform_ioremap_resource_byname(pdev, "pic"); in idt_gpio_probe()
163 if (IS_ERR(ctrl->pic)) in idt_gpio_probe()
164 return PTR_ERR(ctrl->pic); in idt_gpio_probe()
168 return -EINVAL; in idt_gpio_probe()
170 girq = &ctrl->gc.irq; in idt_gpio_probe()
171 girq->chip = &idt_gpio_irqchip; in idt_gpio_probe()
172 girq->init_hw = idt_gpio_irq_init_hw; in idt_gpio_probe()
173 girq->parent_handler = idt_gpio_dispatch; in idt_gpio_probe()
174 girq->num_parents = 1; in idt_gpio_probe()
175 girq->parents = devm_kcalloc(dev, girq->num_parents, in idt_gpio_probe()
176 sizeof(*girq->parents), in idt_gpio_probe()
178 if (!girq->parents) in idt_gpio_probe()
179 return -ENOMEM; in idt_gpio_probe()
181 girq->parents[0] = parent_irq; in idt_gpio_probe()
182 girq->default_type = IRQ_TYPE_NONE; in idt_gpio_probe()
183 girq->handler = handle_bad_irq; in idt_gpio_probe()
186 return devm_gpiochip_add_data(&pdev->dev, &ctrl->gc, ctrl); in idt_gpio_probe()
190 { .compatible = "idt,32434-gpio" },
198 .name = "idt3243x-gpio",