Lines Matching full:ctl
88 static void meson_gpio_irq_update_bits(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_update_bits() argument
93 tmp = readl_relaxed(ctl->base + reg); in meson_gpio_irq_update_bits()
96 writel_relaxed(tmp, ctl->base + reg); in meson_gpio_irq_update_bits()
105 meson_gpio_irq_request_channel(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_request_channel() argument
111 spin_lock(&ctl->lock); in meson_gpio_irq_request_channel()
114 idx = find_first_zero_bit(ctl->channel_map, NUM_CHANNEL); in meson_gpio_irq_request_channel()
116 spin_unlock(&ctl->lock); in meson_gpio_irq_request_channel()
122 set_bit(idx, ctl->channel_map); in meson_gpio_irq_request_channel()
129 meson_gpio_irq_update_bits(ctl, reg, in meson_gpio_irq_request_channel()
139 *channel_hwirq = &(ctl->channel_irqs[idx]); in meson_gpio_irq_request_channel()
141 spin_unlock(&ctl->lock); in meson_gpio_irq_request_channel()
150 meson_gpio_irq_get_channel_idx(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_get_channel_idx() argument
153 return channel_hwirq - ctl->channel_irqs; in meson_gpio_irq_get_channel_idx()
157 meson_gpio_irq_release_channel(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_release_channel() argument
162 idx = meson_gpio_irq_get_channel_idx(ctl, channel_hwirq); in meson_gpio_irq_release_channel()
163 clear_bit(idx, ctl->channel_map); in meson_gpio_irq_release_channel()
166 static int meson_gpio_irq_type_setup(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_type_setup() argument
173 idx = meson_gpio_irq_get_channel_idx(ctl, channel_hwirq); in meson_gpio_irq_type_setup()
193 spin_lock(&ctl->lock); in meson_gpio_irq_type_setup()
195 meson_gpio_irq_update_bits(ctl, REG_EDGE_POL, in meson_gpio_irq_type_setup()
198 spin_unlock(&ctl->lock); in meson_gpio_irq_type_setup()
223 struct meson_gpio_irq_controller *ctl = data->domain->host_data; in meson_gpio_irq_set_type() local
227 ret = meson_gpio_irq_type_setup(ctl, type, channel_hwirq); in meson_gpio_irq_set_type()
284 struct meson_gpio_irq_controller *ctl = domain->host_data; in meson_gpio_irq_domain_alloc() local
297 ret = meson_gpio_irq_request_channel(ctl, hwirq, &channel_hwirq); in meson_gpio_irq_domain_alloc()
305 meson_gpio_irq_release_channel(ctl, channel_hwirq); in meson_gpio_irq_domain_alloc()
319 struct meson_gpio_irq_controller *ctl = domain->host_data; in meson_gpio_irq_domain_free() local
331 meson_gpio_irq_release_channel(ctl, channel_hwirq); in meson_gpio_irq_domain_free()
341 struct meson_gpio_irq_controller *ctl) in meson_gpio_irq_parse_dt() argument
352 ctl->nr_hwirq = params->nr_hwirq; in meson_gpio_irq_parse_dt()
356 ctl->channel_irqs, in meson_gpio_irq_parse_dt()
371 struct meson_gpio_irq_controller *ctl; in meson_gpio_irq_of_init() local
385 ctl = kzalloc(sizeof(*ctl), GFP_KERNEL); in meson_gpio_irq_of_init()
386 if (!ctl) in meson_gpio_irq_of_init()
389 spin_lock_init(&ctl->lock); in meson_gpio_irq_of_init()
391 ctl->base = of_iomap(node, 0); in meson_gpio_irq_of_init()
392 if (!ctl->base) { in meson_gpio_irq_of_init()
397 ret = meson_gpio_irq_parse_dt(node, ctl); in meson_gpio_irq_of_init()
401 domain = irq_domain_create_hierarchy(parent_domain, 0, ctl->nr_hwirq, in meson_gpio_irq_of_init()
404 ctl); in meson_gpio_irq_of_init()
412 ctl->nr_hwirq, NUM_CHANNEL); in meson_gpio_irq_of_init()
417 iounmap(ctl->base); in meson_gpio_irq_of_init()
419 kfree(ctl); in meson_gpio_irq_of_init()