Lines Matching full:ctl
47 static void meson8_gpio_irq_sel_pin(struct meson_gpio_irq_controller *ctl,
49 static void meson_gpio_irq_init_dummy(struct meson_gpio_irq_controller *ctl);
50 static void meson_a1_gpio_irq_sel_pin(struct meson_gpio_irq_controller *ctl,
53 static void meson_a1_gpio_irq_init(struct meson_gpio_irq_controller *ctl);
54 static int meson8_gpio_irq_set_type(struct meson_gpio_irq_controller *ctl,
56 static int meson_s4_gpio_irq_set_type(struct meson_gpio_irq_controller *ctl,
60 void (*gpio_irq_sel_pin)(struct meson_gpio_irq_controller *ctl,
62 void (*gpio_irq_init)(struct meson_gpio_irq_controller *ctl);
63 int (*gpio_irq_set_type)(struct meson_gpio_irq_controller *ctl,
211 static void meson_gpio_irq_update_bits(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_update_bits() argument
217 raw_spin_lock_irqsave(&ctl->lock, flags); in meson_gpio_irq_update_bits()
219 tmp = readl_relaxed(ctl->base + reg); in meson_gpio_irq_update_bits()
222 writel_relaxed(tmp, ctl->base + reg); in meson_gpio_irq_update_bits()
224 raw_spin_unlock_irqrestore(&ctl->lock, flags); in meson_gpio_irq_update_bits()
227 static void meson_gpio_irq_init_dummy(struct meson_gpio_irq_controller *ctl) in meson_gpio_irq_init_dummy() argument
231 static void meson8_gpio_irq_sel_pin(struct meson_gpio_irq_controller *ctl, in meson8_gpio_irq_sel_pin() argument
240 meson_gpio_irq_update_bits(ctl, reg_offset, in meson8_gpio_irq_sel_pin()
241 ctl->params->pin_sel_mask << bit_offset, in meson8_gpio_irq_sel_pin()
245 static void meson_a1_gpio_irq_sel_pin(struct meson_gpio_irq_controller *ctl, in meson_a1_gpio_irq_sel_pin() argument
255 meson_gpio_irq_update_bits(ctl, reg_offset, in meson_a1_gpio_irq_sel_pin()
256 ctl->params->pin_sel_mask << bit_offset, in meson_a1_gpio_irq_sel_pin()
261 static void meson_a1_gpio_irq_init(struct meson_gpio_irq_controller *ctl) in meson_a1_gpio_irq_init() argument
263 meson_gpio_irq_update_bits(ctl, REG_EDGE_POL, BIT(31), BIT(31)); in meson_a1_gpio_irq_init()
267 meson_gpio_irq_request_channel(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_request_channel() argument
274 raw_spin_lock_irqsave(&ctl->lock, flags); in meson_gpio_irq_request_channel()
277 idx = find_first_zero_bit(ctl->channel_map, ctl->params->nr_channels); in meson_gpio_irq_request_channel()
278 if (idx >= ctl->params->nr_channels) { in meson_gpio_irq_request_channel()
279 raw_spin_unlock_irqrestore(&ctl->lock, flags); in meson_gpio_irq_request_channel()
285 set_bit(idx, ctl->channel_map); in meson_gpio_irq_request_channel()
287 raw_spin_unlock_irqrestore(&ctl->lock, flags); in meson_gpio_irq_request_channel()
293 ctl->params->ops.gpio_irq_sel_pin(ctl, idx, hwirq); in meson_gpio_irq_request_channel()
301 *channel_hwirq = &(ctl->channel_irqs[idx]); in meson_gpio_irq_request_channel()
310 meson_gpio_irq_get_channel_idx(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_get_channel_idx() argument
313 return channel_hwirq - ctl->channel_irqs; in meson_gpio_irq_get_channel_idx()
317 meson_gpio_irq_release_channel(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_release_channel() argument
322 idx = meson_gpio_irq_get_channel_idx(ctl, channel_hwirq); in meson_gpio_irq_release_channel()
323 clear_bit(idx, ctl->channel_map); in meson_gpio_irq_release_channel()
326 static int meson8_gpio_irq_set_type(struct meson_gpio_irq_controller *ctl, in meson8_gpio_irq_set_type() argument
329 const struct meson_gpio_irq_params *params = ctl->params; in meson8_gpio_irq_set_type()
333 idx = meson_gpio_irq_get_channel_idx(ctl, channel_hwirq); in meson8_gpio_irq_set_type()
361 meson_gpio_irq_update_bits(ctl, REG_EDGE_POL, in meson8_gpio_irq_set_type()
382 static int meson_s4_gpio_irq_set_type(struct meson_gpio_irq_controller *ctl, in meson_s4_gpio_irq_set_type() argument
385 const struct meson_gpio_irq_params *params = ctl->params; in meson_s4_gpio_irq_set_type()
389 idx = meson_gpio_irq_get_channel_idx(ctl, channel_hwirq); in meson_s4_gpio_irq_set_type()
393 meson_gpio_irq_update_bits(ctl, params->edge_pol_reg, BIT(idx), 0); in meson_s4_gpio_irq_set_type()
396 val = BIT(ctl->params->edge_both_offset + idx); in meson_s4_gpio_irq_set_type()
397 meson_gpio_irq_update_bits(ctl, params->edge_pol_reg, val, val); in meson_s4_gpio_irq_set_type()
402 val |= BIT(ctl->params->pol_low_offset + idx); in meson_s4_gpio_irq_set_type()
405 val |= BIT(ctl->params->edge_single_offset + idx); in meson_s4_gpio_irq_set_type()
407 meson_gpio_irq_update_bits(ctl, params->edge_pol_reg, in meson_s4_gpio_irq_set_type()
432 struct meson_gpio_irq_controller *ctl = data->domain->host_data; in meson_gpio_irq_set_type() local
436 ret = ctl->params->ops.gpio_irq_set_type(ctl, type, channel_hwirq); in meson_gpio_irq_set_type()
493 struct meson_gpio_irq_controller *ctl = domain->host_data; in meson_gpio_irq_domain_alloc() local
506 ret = meson_gpio_irq_request_channel(ctl, hwirq, &channel_hwirq); in meson_gpio_irq_domain_alloc()
514 meson_gpio_irq_release_channel(ctl, channel_hwirq); in meson_gpio_irq_domain_alloc()
528 struct meson_gpio_irq_controller *ctl = domain->host_data; in meson_gpio_irq_domain_free() local
540 meson_gpio_irq_release_channel(ctl, channel_hwirq); in meson_gpio_irq_domain_free()
549 static int meson_gpio_irq_parse_dt(struct device_node *node, struct meson_gpio_irq_controller *ctl) in meson_gpio_irq_parse_dt() argument
558 ctl->params = match->data; in meson_gpio_irq_parse_dt()
562 ctl->channel_irqs, in meson_gpio_irq_parse_dt()
563 ctl->params->nr_channels, in meson_gpio_irq_parse_dt()
564 ctl->params->nr_channels); in meson_gpio_irq_parse_dt()
566 pr_err("can't get %d channel interrupts\n", ctl->params->nr_channels); in meson_gpio_irq_parse_dt()
570 ctl->params->ops.gpio_irq_init(ctl); in meson_gpio_irq_parse_dt()
578 struct meson_gpio_irq_controller *ctl; in meson_gpio_irq_of_init() local
592 ctl = kzalloc(sizeof(*ctl), GFP_KERNEL); in meson_gpio_irq_of_init()
593 if (!ctl) in meson_gpio_irq_of_init()
596 raw_spin_lock_init(&ctl->lock); in meson_gpio_irq_of_init()
598 ctl->base = of_iomap(node, 0); in meson_gpio_irq_of_init()
599 if (!ctl->base) { in meson_gpio_irq_of_init()
604 ret = meson_gpio_irq_parse_dt(node, ctl); in meson_gpio_irq_of_init()
609 ctl->params->nr_hwirq, in meson_gpio_irq_of_init()
612 ctl); in meson_gpio_irq_of_init()
620 ctl->params->nr_hwirq, ctl->params->nr_channels); in meson_gpio_irq_of_init()
625 iounmap(ctl->base); in meson_gpio_irq_of_init()
627 kfree(ctl); in meson_gpio_irq_of_init()