Lines Matching defs:eint
22 #include "mtk-eint.h"
67 static void __iomem *mtk_eint_get_offset(struct mtk_eint *eint,
74 if (eint_num >= eint->hw->ap_num)
75 eint_base = eint->hw->ap_num;
77 reg = eint->base + offset + ((eint_num - eint_base) / 32) * 4;
82 static unsigned int mtk_eint_can_en_debounce(struct mtk_eint *eint,
87 void __iomem *reg = mtk_eint_get_offset(eint, eint_num,
88 eint->regs->sens);
95 if (eint_num < eint->hw->db_cnt && sens != MTK_EINT_EDGE_SENSITIVE)
101 static int mtk_eint_flip_edge(struct mtk_eint *eint, int hwirq)
106 u32 port = (hwirq >> 5) & eint->hw->port_mask;
107 void __iomem *reg = eint->base + (port << 2);
109 curr_level = eint->gpio_xlate->get_gpio_state(eint->pctl, hwirq);
114 reg_offset = eint->regs->pol_clr;
116 reg_offset = eint->regs->pol_set;
119 curr_level = eint->gpio_xlate->get_gpio_state(eint->pctl,
128 struct mtk_eint *eint = irq_data_get_irq_chip_data(d);
130 void __iomem *reg = mtk_eint_get_offset(eint, d->hwirq,
131 eint->regs->mask_set);
133 eint->cur_mask[d->hwirq >> 5] &= ~mask;
140 struct mtk_eint *eint = irq_data_get_irq_chip_data(d);
142 void __iomem *reg = mtk_eint_get_offset(eint, d->hwirq,
143 eint->regs->mask_clr);
145 eint->cur_mask[d->hwirq >> 5] |= mask;
149 if (eint->dual_edge[d->hwirq])
150 mtk_eint_flip_edge(eint, d->hwirq);
153 static unsigned int mtk_eint_get_mask(struct mtk_eint *eint,
157 void __iomem *reg = mtk_eint_get_offset(eint, eint_num,
158 eint->regs->mask);
165 struct mtk_eint *eint = irq_data_get_irq_chip_data(d);
167 void __iomem *reg = mtk_eint_get_offset(eint, d->hwirq,
168 eint->regs->ack);
175 struct mtk_eint *eint = irq_data_get_irq_chip_data(d);
182 dev_err(eint->dev,
189 eint->dual_edge[d->hwirq] = 1;
191 eint->dual_edge[d->hwirq] = 0;
193 if (!mtk_eint_get_mask(eint, d->hwirq)) {
201 reg = mtk_eint_get_offset(eint, d->hwirq, eint->regs->pol_clr);
204 reg = mtk_eint_get_offset(eint, d->hwirq, eint->regs->pol_set);
209 reg = mtk_eint_get_offset(eint, d->hwirq, eint->regs->sens_clr);
212 reg = mtk_eint_get_offset(eint, d->hwirq, eint->regs->sens_set);
225 struct mtk_eint *eint = irq_data_get_irq_chip_data(d);
230 eint->wake_mask[reg] |= BIT(shift);
232 eint->wake_mask[reg] &= ~BIT(shift);
237 static void mtk_eint_chip_write_mask(const struct mtk_eint *eint,
243 for (port = 0; port < eint->hw->ports; port++) {
245 writel_relaxed(~buf[port], reg + eint->regs->mask_set);
246 writel_relaxed(buf[port], reg + eint->regs->mask_clr);
252 struct mtk_eint *eint = irq_data_get_irq_chip_data(d);
257 err = eint->gpio_xlate->get_gpio_n(eint->pctl, d->hwirq,
260 dev_err(eint->dev, "Can not find pin\n");
266 dev_err(eint->dev, "unable to lock HW IRQ %lu for IRQ\n",
271 err = eint->gpio_xlate->set_gpio_as_eint(eint->pctl, d->hwirq);
273 dev_err(eint->dev, "Can not eint mode\n");
282 struct mtk_eint *eint = irq_data_get_irq_chip_data(d);
286 eint->gpio_xlate->get_gpio_n(eint->pctl, d->hwirq, &gpio_n,
293 .name = "mt-eint",
304 static unsigned int mtk_eint_hw_init(struct mtk_eint *eint)
306 void __iomem *dom_en = eint->base + eint->regs->dom_en;
307 void __iomem *mask_set = eint->base + eint->regs->mask_set;
310 for (i = 0; i < eint->hw->ap_num; i += 32) {
321 mtk_eint_debounce_process(struct mtk_eint *eint, int index)
326 ctrl_offset = (index / 4) * 4 + eint->regs->dbnc_ctrl;
327 dbnc = readl(eint->base + ctrl_offset);
330 ctrl_offset = (index / 4) * 4 + eint->regs->dbnc_set;
332 writel(rst, eint->base + ctrl_offset);
339 struct mtk_eint *eint = irq_desc_get_handler_data(desc);
342 void __iomem *reg = mtk_eint_get_offset(eint, 0, eint->regs->stat);
346 for (eint_num = 0; eint_num < eint->hw->ap_num; eint_num += 32,
361 if (eint->wake_mask[mask_offset] & BIT(offset) &&
362 !(eint->cur_mask[mask_offset] & BIT(offset))) {
364 eint->regs->stat +
365 eint->regs->mask_set);
368 dual_edge = eint->dual_edge[index];
374 writel(BIT(offset), reg - eint->regs->stat +
375 eint->regs->soft_clr);
378 eint->gpio_xlate->get_gpio_state(eint->pctl,
382 generic_handle_domain_irq(eint->domain, index);
385 curr_level = mtk_eint_flip_edge(eint, index);
393 eint->regs->stat +
394 eint->regs->soft_set);
397 if (index < eint->hw->db_cnt)
398 mtk_eint_debounce_process(eint, index);
404 int mtk_eint_do_suspend(struct mtk_eint *eint)
406 mtk_eint_chip_write_mask(eint, eint->base, eint->wake_mask);
412 int mtk_eint_do_resume(struct mtk_eint *eint)
414 mtk_eint_chip_write_mask(eint, eint->base, eint->cur_mask);
420 int mtk_eint_set_debounce(struct mtk_eint *eint, unsigned long eint_num,
428 if (!eint->hw->db_time)
431 virq = irq_find_mapping(eint->domain, eint_num);
435 set_offset = (eint_num / 4) * 4 + eint->regs->dbnc_set;
436 clr_offset = (eint_num / 4) * 4 + eint->regs->dbnc_clr;
438 if (!mtk_eint_can_en_debounce(eint, eint_num))
441 dbnc = eint->num_db_time;
442 for (i = 0; i < eint->num_db_time; i++) {
443 if (debounce <= eint->hw->db_time[i]) {
449 if (!mtk_eint_get_mask(eint, eint_num)) {
457 writel(clr_bit, eint->base + clr_offset);
462 writel(rst | bit, eint->base + set_offset);
476 int mtk_eint_find_irq(struct mtk_eint *eint, unsigned long eint_n)
480 irq = irq_find_mapping(eint->domain, eint_n);
488 int mtk_eint_do_init(struct mtk_eint *eint)
493 if (!eint->regs)
494 eint->regs = &mtk_generic_eint_regs;
496 eint->wake_mask = devm_kcalloc(eint->dev, eint->hw->ports,
497 sizeof(*eint->wake_mask), GFP_KERNEL);
498 if (!eint->wake_mask)
501 eint->cur_mask = devm_kcalloc(eint->dev, eint->hw->ports,
502 sizeof(*eint->cur_mask), GFP_KERNEL);
503 if (!eint->cur_mask)
506 eint->dual_edge = devm_kcalloc(eint->dev, eint->hw->ap_num,
508 if (!eint->dual_edge)
511 eint->domain = irq_domain_add_linear(eint->dev->of_node,
512 eint->hw->ap_num,
514 if (!eint->domain)
517 if (eint->hw->db_time) {
519 if (eint->hw->db_time[i] == 0)
521 eint->num_db_time = i;
524 mtk_eint_hw_init(eint);
525 for (i = 0; i < eint->hw->ap_num; i++) {
526 int virq = irq_create_mapping(eint->domain, i);
530 irq_set_chip_data(virq, eint);
533 irq_set_chained_handler_and_data(eint->irq, mtk_eint_irq_handler,
534 eint);