Lines Matching refs:ctl
49 static void meson8_gpio_irq_sel_pin(struct meson_gpio_irq_controller *ctl,
51 static void meson_gpio_irq_init_dummy(struct meson_gpio_irq_controller *ctl);
52 static void meson_a1_gpio_irq_sel_pin(struct meson_gpio_irq_controller *ctl,
55 static void meson_a1_gpio_irq_init(struct meson_gpio_irq_controller *ctl);
56 static int meson8_gpio_irq_set_type(struct meson_gpio_irq_controller *ctl,
58 static int meson_s4_gpio_irq_set_type(struct meson_gpio_irq_controller *ctl,
62 void (*gpio_irq_sel_pin)(struct meson_gpio_irq_controller *ctl,
64 void (*gpio_irq_init)(struct meson_gpio_irq_controller *ctl);
65 int (*gpio_irq_set_type)(struct meson_gpio_irq_controller *ctl,
184 static void meson_gpio_irq_update_bits(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_update_bits() argument
190 raw_spin_lock_irqsave(&ctl->lock, flags); in meson_gpio_irq_update_bits()
192 tmp = readl_relaxed(ctl->base + reg); in meson_gpio_irq_update_bits()
195 writel_relaxed(tmp, ctl->base + reg); in meson_gpio_irq_update_bits()
197 raw_spin_unlock_irqrestore(&ctl->lock, flags); in meson_gpio_irq_update_bits()
200 static void meson_gpio_irq_init_dummy(struct meson_gpio_irq_controller *ctl) in meson_gpio_irq_init_dummy() argument
204 static void meson8_gpio_irq_sel_pin(struct meson_gpio_irq_controller *ctl, in meson8_gpio_irq_sel_pin() argument
213 meson_gpio_irq_update_bits(ctl, reg_offset, in meson8_gpio_irq_sel_pin()
214 ctl->params->pin_sel_mask << bit_offset, in meson8_gpio_irq_sel_pin()
218 static void meson_a1_gpio_irq_sel_pin(struct meson_gpio_irq_controller *ctl, in meson_a1_gpio_irq_sel_pin() argument
228 meson_gpio_irq_update_bits(ctl, reg_offset, in meson_a1_gpio_irq_sel_pin()
229 ctl->params->pin_sel_mask << bit_offset, in meson_a1_gpio_irq_sel_pin()
234 static void meson_a1_gpio_irq_init(struct meson_gpio_irq_controller *ctl) in meson_a1_gpio_irq_init() argument
236 meson_gpio_irq_update_bits(ctl, REG_EDGE_POL, BIT(31), BIT(31)); in meson_a1_gpio_irq_init()
240 meson_gpio_irq_request_channel(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_request_channel() argument
247 raw_spin_lock_irqsave(&ctl->lock, flags); in meson_gpio_irq_request_channel()
250 idx = find_first_zero_bit(ctl->channel_map, ctl->params->nr_channels); in meson_gpio_irq_request_channel()
251 if (idx >= ctl->params->nr_channels) { in meson_gpio_irq_request_channel()
252 raw_spin_unlock_irqrestore(&ctl->lock, flags); in meson_gpio_irq_request_channel()
258 set_bit(idx, ctl->channel_map); in meson_gpio_irq_request_channel()
260 raw_spin_unlock_irqrestore(&ctl->lock, flags); in meson_gpio_irq_request_channel()
266 ctl->params->ops.gpio_irq_sel_pin(ctl, idx, hwirq); in meson_gpio_irq_request_channel()
274 *channel_hwirq = &(ctl->channel_irqs[idx]); in meson_gpio_irq_request_channel()
283 meson_gpio_irq_get_channel_idx(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_get_channel_idx() argument
286 return channel_hwirq - ctl->channel_irqs; in meson_gpio_irq_get_channel_idx()
290 meson_gpio_irq_release_channel(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_release_channel() argument
295 idx = meson_gpio_irq_get_channel_idx(ctl, channel_hwirq); in meson_gpio_irq_release_channel()
296 clear_bit(idx, ctl->channel_map); in meson_gpio_irq_release_channel()
299 static int meson8_gpio_irq_set_type(struct meson_gpio_irq_controller *ctl, in meson8_gpio_irq_set_type() argument
306 params = ctl->params; in meson8_gpio_irq_set_type()
307 idx = meson_gpio_irq_get_channel_idx(ctl, channel_hwirq); in meson8_gpio_irq_set_type()
335 meson_gpio_irq_update_bits(ctl, REG_EDGE_POL, in meson8_gpio_irq_set_type()
356 static int meson_s4_gpio_irq_set_type(struct meson_gpio_irq_controller *ctl, in meson_s4_gpio_irq_set_type() argument
362 idx = meson_gpio_irq_get_channel_idx(ctl, channel_hwirq); in meson_s4_gpio_irq_set_type()
366 meson_gpio_irq_update_bits(ctl, REG_EDGE_POL_S4, BIT(idx), 0); in meson_s4_gpio_irq_set_type()
369 val |= BIT(ctl->params->edge_both_offset + idx); in meson_s4_gpio_irq_set_type()
370 meson_gpio_irq_update_bits(ctl, REG_EDGE_POL_S4, in meson_s4_gpio_irq_set_type()
371 BIT(ctl->params->edge_both_offset + idx), val); in meson_s4_gpio_irq_set_type()
376 val |= BIT(ctl->params->pol_low_offset + idx); in meson_s4_gpio_irq_set_type()
379 val |= BIT(ctl->params->edge_single_offset + idx); in meson_s4_gpio_irq_set_type()
381 meson_gpio_irq_update_bits(ctl, REG_EDGE_POL, in meson_s4_gpio_irq_set_type()
406 struct meson_gpio_irq_controller *ctl = data->domain->host_data; in meson_gpio_irq_set_type() local
410 ret = ctl->params->ops.gpio_irq_set_type(ctl, type, channel_hwirq); in meson_gpio_irq_set_type()
467 struct meson_gpio_irq_controller *ctl = domain->host_data; in meson_gpio_irq_domain_alloc() local
480 ret = meson_gpio_irq_request_channel(ctl, hwirq, &channel_hwirq); in meson_gpio_irq_domain_alloc()
488 meson_gpio_irq_release_channel(ctl, channel_hwirq); in meson_gpio_irq_domain_alloc()
502 struct meson_gpio_irq_controller *ctl = domain->host_data; in meson_gpio_irq_domain_free() local
514 meson_gpio_irq_release_channel(ctl, channel_hwirq); in meson_gpio_irq_domain_free()
523 static int meson_gpio_irq_parse_dt(struct device_node *node, struct meson_gpio_irq_controller *ctl) in meson_gpio_irq_parse_dt() argument
532 ctl->params = match->data; in meson_gpio_irq_parse_dt()
536 ctl->channel_irqs, in meson_gpio_irq_parse_dt()
537 ctl->params->nr_channels, in meson_gpio_irq_parse_dt()
538 ctl->params->nr_channels); in meson_gpio_irq_parse_dt()
540 pr_err("can't get %d channel interrupts\n", ctl->params->nr_channels); in meson_gpio_irq_parse_dt()
544 ctl->params->ops.gpio_irq_init(ctl); in meson_gpio_irq_parse_dt()
552 struct meson_gpio_irq_controller *ctl; in meson_gpio_irq_of_init() local
566 ctl = kzalloc(sizeof(*ctl), GFP_KERNEL); in meson_gpio_irq_of_init()
567 if (!ctl) in meson_gpio_irq_of_init()
570 raw_spin_lock_init(&ctl->lock); in meson_gpio_irq_of_init()
572 ctl->base = of_iomap(node, 0); in meson_gpio_irq_of_init()
573 if (!ctl->base) { in meson_gpio_irq_of_init()
578 ret = meson_gpio_irq_parse_dt(node, ctl); in meson_gpio_irq_of_init()
583 ctl->params->nr_hwirq, in meson_gpio_irq_of_init()
586 ctl); in meson_gpio_irq_of_init()
594 ctl->params->nr_hwirq, ctl->params->nr_channels); in meson_gpio_irq_of_init()
599 iounmap(ctl->base); in meson_gpio_irq_of_init()
601 kfree(ctl); in meson_gpio_irq_of_init()