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,
174 static void meson_gpio_irq_update_bits(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_update_bits() argument
180 spin_lock_irqsave(&ctl->lock, flags); in meson_gpio_irq_update_bits()
182 tmp = readl_relaxed(ctl->base + reg); in meson_gpio_irq_update_bits()
185 writel_relaxed(tmp, ctl->base + reg); in meson_gpio_irq_update_bits()
187 spin_unlock_irqrestore(&ctl->lock, flags); in meson_gpio_irq_update_bits()
190 static void meson_gpio_irq_init_dummy(struct meson_gpio_irq_controller *ctl) in meson_gpio_irq_init_dummy() argument
194 static void meson8_gpio_irq_sel_pin(struct meson_gpio_irq_controller *ctl, in meson8_gpio_irq_sel_pin() argument
203 meson_gpio_irq_update_bits(ctl, reg_offset, in meson8_gpio_irq_sel_pin()
204 ctl->params->pin_sel_mask << bit_offset, in meson8_gpio_irq_sel_pin()
208 static void meson_a1_gpio_irq_sel_pin(struct meson_gpio_irq_controller *ctl, in meson_a1_gpio_irq_sel_pin() argument
218 meson_gpio_irq_update_bits(ctl, reg_offset, in meson_a1_gpio_irq_sel_pin()
219 ctl->params->pin_sel_mask << bit_offset, in meson_a1_gpio_irq_sel_pin()
224 static void meson_a1_gpio_irq_init(struct meson_gpio_irq_controller *ctl) in meson_a1_gpio_irq_init() argument
226 meson_gpio_irq_update_bits(ctl, REG_EDGE_POL, BIT(31), BIT(31)); in meson_a1_gpio_irq_init()
230 meson_gpio_irq_request_channel(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_request_channel() argument
237 spin_lock_irqsave(&ctl->lock, flags); in meson_gpio_irq_request_channel()
240 idx = find_first_zero_bit(ctl->channel_map, ctl->params->nr_channels); in meson_gpio_irq_request_channel()
241 if (idx >= ctl->params->nr_channels) { in meson_gpio_irq_request_channel()
242 spin_unlock_irqrestore(&ctl->lock, flags); in meson_gpio_irq_request_channel()
248 set_bit(idx, ctl->channel_map); in meson_gpio_irq_request_channel()
250 spin_unlock_irqrestore(&ctl->lock, flags); in meson_gpio_irq_request_channel()
256 ctl->params->ops.gpio_irq_sel_pin(ctl, idx, hwirq); in meson_gpio_irq_request_channel()
264 *channel_hwirq = &(ctl->channel_irqs[idx]); in meson_gpio_irq_request_channel()
273 meson_gpio_irq_get_channel_idx(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_get_channel_idx() argument
276 return channel_hwirq - ctl->channel_irqs; in meson_gpio_irq_get_channel_idx()
280 meson_gpio_irq_release_channel(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_release_channel() argument
285 idx = meson_gpio_irq_get_channel_idx(ctl, channel_hwirq); in meson_gpio_irq_release_channel()
286 clear_bit(idx, ctl->channel_map); in meson_gpio_irq_release_channel()
289 static int meson8_gpio_irq_set_type(struct meson_gpio_irq_controller *ctl, in meson8_gpio_irq_set_type() argument
296 params = ctl->params; in meson8_gpio_irq_set_type()
297 idx = meson_gpio_irq_get_channel_idx(ctl, channel_hwirq); in meson8_gpio_irq_set_type()
325 meson_gpio_irq_update_bits(ctl, REG_EDGE_POL, in meson8_gpio_irq_set_type()
346 static int meson_s4_gpio_irq_set_type(struct meson_gpio_irq_controller *ctl, in meson_s4_gpio_irq_set_type() argument
352 idx = meson_gpio_irq_get_channel_idx(ctl, channel_hwirq); in meson_s4_gpio_irq_set_type()
356 meson_gpio_irq_update_bits(ctl, REG_EDGE_POL_S4, BIT(idx), 0); in meson_s4_gpio_irq_set_type()
359 val |= BIT(ctl->params->edge_both_offset + idx); in meson_s4_gpio_irq_set_type()
360 meson_gpio_irq_update_bits(ctl, REG_EDGE_POL_S4, in meson_s4_gpio_irq_set_type()
361 BIT(ctl->params->edge_both_offset + idx), val); in meson_s4_gpio_irq_set_type()
366 val |= BIT(ctl->params->pol_low_offset + idx); in meson_s4_gpio_irq_set_type()
369 val |= BIT(ctl->params->edge_single_offset + idx); in meson_s4_gpio_irq_set_type()
371 meson_gpio_irq_update_bits(ctl, REG_EDGE_POL, in meson_s4_gpio_irq_set_type()
396 struct meson_gpio_irq_controller *ctl = data->domain->host_data; in meson_gpio_irq_set_type() local
400 ret = ctl->params->ops.gpio_irq_set_type(ctl, type, channel_hwirq); in meson_gpio_irq_set_type()
457 struct meson_gpio_irq_controller *ctl = domain->host_data; in meson_gpio_irq_domain_alloc() local
470 ret = meson_gpio_irq_request_channel(ctl, hwirq, &channel_hwirq); in meson_gpio_irq_domain_alloc()
478 meson_gpio_irq_release_channel(ctl, channel_hwirq); in meson_gpio_irq_domain_alloc()
492 struct meson_gpio_irq_controller *ctl = domain->host_data; in meson_gpio_irq_domain_free() local
504 meson_gpio_irq_release_channel(ctl, channel_hwirq); in meson_gpio_irq_domain_free()
513 static int meson_gpio_irq_parse_dt(struct device_node *node, struct meson_gpio_irq_controller *ctl) in meson_gpio_irq_parse_dt() argument
522 ctl->params = match->data; in meson_gpio_irq_parse_dt()
526 ctl->channel_irqs, in meson_gpio_irq_parse_dt()
527 ctl->params->nr_channels, in meson_gpio_irq_parse_dt()
528 ctl->params->nr_channels); in meson_gpio_irq_parse_dt()
530 pr_err("can't get %d channel interrupts\n", ctl->params->nr_channels); in meson_gpio_irq_parse_dt()
534 ctl->params->ops.gpio_irq_init(ctl); in meson_gpio_irq_parse_dt()
542 struct meson_gpio_irq_controller *ctl; in meson_gpio_irq_of_init() local
556 ctl = kzalloc(sizeof(*ctl), GFP_KERNEL); in meson_gpio_irq_of_init()
557 if (!ctl) in meson_gpio_irq_of_init()
560 spin_lock_init(&ctl->lock); in meson_gpio_irq_of_init()
562 ctl->base = of_iomap(node, 0); in meson_gpio_irq_of_init()
563 if (!ctl->base) { in meson_gpio_irq_of_init()
568 ret = meson_gpio_irq_parse_dt(node, ctl); in meson_gpio_irq_of_init()
573 ctl->params->nr_hwirq, in meson_gpio_irq_of_init()
576 ctl); in meson_gpio_irq_of_init()
584 ctl->params->nr_hwirq, ctl->params->nr_channels); in meson_gpio_irq_of_init()
589 iounmap(ctl->base); in meson_gpio_irq_of_init()
591 kfree(ctl); in meson_gpio_irq_of_init()