Lines Matching refs: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);
56 void (*gpio_irq_sel_pin)(struct meson_gpio_irq_controller *ctl,
58 void (*gpio_irq_init)(struct meson_gpio_irq_controller *ctl);
144 static void meson_gpio_irq_update_bits(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_update_bits() argument
150 spin_lock_irqsave(&ctl->lock, flags); in meson_gpio_irq_update_bits()
152 tmp = readl_relaxed(ctl->base + reg); in meson_gpio_irq_update_bits()
155 writel_relaxed(tmp, ctl->base + reg); in meson_gpio_irq_update_bits()
157 spin_unlock_irqrestore(&ctl->lock, flags); in meson_gpio_irq_update_bits()
160 static void meson_gpio_irq_init_dummy(struct meson_gpio_irq_controller *ctl) in meson_gpio_irq_init_dummy() argument
164 static void meson8_gpio_irq_sel_pin(struct meson_gpio_irq_controller *ctl, in meson8_gpio_irq_sel_pin() argument
173 meson_gpio_irq_update_bits(ctl, reg_offset, in meson8_gpio_irq_sel_pin()
174 ctl->params->pin_sel_mask << bit_offset, in meson8_gpio_irq_sel_pin()
178 static void meson_a1_gpio_irq_sel_pin(struct meson_gpio_irq_controller *ctl, in meson_a1_gpio_irq_sel_pin() argument
188 meson_gpio_irq_update_bits(ctl, reg_offset, in meson_a1_gpio_irq_sel_pin()
189 ctl->params->pin_sel_mask << bit_offset, in meson_a1_gpio_irq_sel_pin()
194 static void meson_a1_gpio_irq_init(struct meson_gpio_irq_controller *ctl) in meson_a1_gpio_irq_init() argument
196 meson_gpio_irq_update_bits(ctl, REG_EDGE_POL, BIT(31), BIT(31)); in meson_a1_gpio_irq_init()
200 meson_gpio_irq_request_channel(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_request_channel() argument
207 spin_lock_irqsave(&ctl->lock, flags); in meson_gpio_irq_request_channel()
210 idx = find_first_zero_bit(ctl->channel_map, NUM_CHANNEL); in meson_gpio_irq_request_channel()
212 spin_unlock_irqrestore(&ctl->lock, flags); in meson_gpio_irq_request_channel()
218 set_bit(idx, ctl->channel_map); in meson_gpio_irq_request_channel()
220 spin_unlock_irqrestore(&ctl->lock, flags); in meson_gpio_irq_request_channel()
226 ctl->params->ops.gpio_irq_sel_pin(ctl, idx, hwirq); in meson_gpio_irq_request_channel()
234 *channel_hwirq = &(ctl->channel_irqs[idx]); in meson_gpio_irq_request_channel()
243 meson_gpio_irq_get_channel_idx(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_get_channel_idx() argument
246 return channel_hwirq - ctl->channel_irqs; in meson_gpio_irq_get_channel_idx()
250 meson_gpio_irq_release_channel(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_release_channel() argument
255 idx = meson_gpio_irq_get_channel_idx(ctl, channel_hwirq); in meson_gpio_irq_release_channel()
256 clear_bit(idx, ctl->channel_map); in meson_gpio_irq_release_channel()
259 static int meson_gpio_irq_type_setup(struct meson_gpio_irq_controller *ctl, in meson_gpio_irq_type_setup() argument
267 params = ctl->params; in meson_gpio_irq_type_setup()
268 idx = meson_gpio_irq_get_channel_idx(ctl, channel_hwirq); in meson_gpio_irq_type_setup()
296 meson_gpio_irq_update_bits(ctl, REG_EDGE_POL, in meson_gpio_irq_type_setup()
322 struct meson_gpio_irq_controller *ctl = data->domain->host_data; in meson_gpio_irq_set_type() local
326 ret = meson_gpio_irq_type_setup(ctl, type, channel_hwirq); in meson_gpio_irq_set_type()
383 struct meson_gpio_irq_controller *ctl = domain->host_data; in meson_gpio_irq_domain_alloc() local
396 ret = meson_gpio_irq_request_channel(ctl, hwirq, &channel_hwirq); in meson_gpio_irq_domain_alloc()
404 meson_gpio_irq_release_channel(ctl, channel_hwirq); in meson_gpio_irq_domain_alloc()
418 struct meson_gpio_irq_controller *ctl = domain->host_data; in meson_gpio_irq_domain_free() local
430 meson_gpio_irq_release_channel(ctl, channel_hwirq); in meson_gpio_irq_domain_free()
440 struct meson_gpio_irq_controller *ctl) in meson_gpio_irq_parse_dt() argument
449 ctl->params = match->data; in meson_gpio_irq_parse_dt()
453 ctl->channel_irqs, in meson_gpio_irq_parse_dt()
461 ctl->params->ops.gpio_irq_init(ctl); in meson_gpio_irq_parse_dt()
470 struct meson_gpio_irq_controller *ctl; in meson_gpio_irq_of_init() local
484 ctl = kzalloc(sizeof(*ctl), GFP_KERNEL); in meson_gpio_irq_of_init()
485 if (!ctl) in meson_gpio_irq_of_init()
488 spin_lock_init(&ctl->lock); in meson_gpio_irq_of_init()
490 ctl->base = of_iomap(node, 0); in meson_gpio_irq_of_init()
491 if (!ctl->base) { in meson_gpio_irq_of_init()
496 ret = meson_gpio_irq_parse_dt(node, ctl); in meson_gpio_irq_of_init()
501 ctl->params->nr_hwirq, in meson_gpio_irq_of_init()
504 ctl); in meson_gpio_irq_of_init()
512 ctl->params->nr_hwirq, NUM_CHANNEL); in meson_gpio_irq_of_init()
517 iounmap(ctl->base); in meson_gpio_irq_of_init()
519 kfree(ctl); in meson_gpio_irq_of_init()