mtk-eint.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Copyright (c) 2014-2025 MediaTek Inc.
  3. /*
  4. * Library for MediaTek External Interrupt Support
  5. *
  6. * Author: Maoguang Meng <maoguang.meng@mediatek.com>
  7. * Sean Wang <sean.wang@mediatek.com>
  8. * Hao Chang <ot_chhao.chang@mediatek.com>
  9. * Qingliang Li <qingliang.li@mediatek.com>
  10. *
  11. */
  12. #include <linux/delay.h>
  13. #include <linux/err.h>
  14. #include <linux/gpio/driver.h>
  15. #include <linux/io.h>
  16. #include <linux/irqchip/chained_irq.h>
  17. #include <linux/irqdomain.h>
  18. #include <linux/module.h>
  19. #include <linux/of_irq.h>
  20. #include <linux/platform_device.h>
  21. #include "mtk-eint.h"
  22. #define MTK_EINT_EDGE_SENSITIVE 0
  23. #define MTK_EINT_LEVEL_SENSITIVE 1
  24. #define MTK_EINT_DBNC_SET_DBNC_BITS 4
  25. #define MTK_EINT_DBNC_MAX 16
  26. #define MTK_EINT_DBNC_RST_BIT (0x1 << 1)
  27. #define MTK_EINT_DBNC_SET_EN (0x1 << 0)
  28. static const struct mtk_eint_regs mtk_generic_eint_regs = {
  29. .stat = 0x000,
  30. .ack = 0x040,
  31. .mask = 0x080,
  32. .mask_set = 0x0c0,
  33. .mask_clr = 0x100,
  34. .sens = 0x140,
  35. .sens_set = 0x180,
  36. .sens_clr = 0x1c0,
  37. .soft = 0x200,
  38. .soft_set = 0x240,
  39. .soft_clr = 0x280,
  40. .pol = 0x300,
  41. .pol_set = 0x340,
  42. .pol_clr = 0x380,
  43. .dom_en = 0x400,
  44. .dbnc_ctrl = 0x500,
  45. .dbnc_set = 0x600,
  46. .dbnc_clr = 0x700,
  47. };
  48. const unsigned int debounce_time_mt2701[] = {
  49. 500, 1000, 16000, 32000, 64000, 128000, 256000, 0
  50. };
  51. EXPORT_SYMBOL_GPL(debounce_time_mt2701);
  52. const unsigned int debounce_time_mt6765[] = {
  53. 125, 250, 500, 1000, 16000, 32000, 64000, 128000, 256000, 512000, 0
  54. };
  55. EXPORT_SYMBOL_GPL(debounce_time_mt6765);
  56. const unsigned int debounce_time_mt6795[] = {
  57. 500, 1000, 16000, 32000, 64000, 128000, 256000, 512000, 0
  58. };
  59. EXPORT_SYMBOL_GPL(debounce_time_mt6795);
  60. const unsigned int debounce_time_mt6878[] = {
  61. 156, 313, 625, 1250, 20000, 40000, 80000, 160000, 320000, 640000, 0
  62. };
  63. EXPORT_SYMBOL_GPL(debounce_time_mt6878);
  64. static void __iomem *mtk_eint_get_offset(struct mtk_eint *eint,
  65. unsigned int eint_num,
  66. unsigned int offset)
  67. {
  68. unsigned int idx = eint->pins[eint_num].index;
  69. unsigned int inst = eint->pins[eint_num].instance;
  70. void __iomem *reg;
  71. reg = eint->base[inst] + offset + (idx / 32 * 4);
  72. return reg;
  73. }
  74. static unsigned int mtk_eint_can_en_debounce(struct mtk_eint *eint,
  75. unsigned int eint_num)
  76. {
  77. unsigned int sens;
  78. unsigned int bit = BIT(eint->pins[eint_num].index % 32);
  79. void __iomem *reg = mtk_eint_get_offset(eint, eint_num,
  80. eint->regs->sens);
  81. if (readl(reg) & bit)
  82. sens = MTK_EINT_LEVEL_SENSITIVE;
  83. else
  84. sens = MTK_EINT_EDGE_SENSITIVE;
  85. if (eint->pins[eint_num].debounce && sens != MTK_EINT_EDGE_SENSITIVE)
  86. return 1;
  87. else
  88. return 0;
  89. }
  90. static int mtk_eint_flip_edge(struct mtk_eint *eint, int hwirq)
  91. {
  92. int start_level, curr_level;
  93. unsigned int reg_offset;
  94. unsigned int mask = BIT(eint->pins[hwirq].index & 0x1f);
  95. unsigned int port = (eint->pins[hwirq].index >> 5) & eint->hw->port_mask;
  96. void __iomem *reg = eint->base[eint->pins[hwirq].instance] + (port << 2);
  97. curr_level = eint->gpio_xlate->get_gpio_state(eint->pctl, hwirq);
  98. do {
  99. start_level = curr_level;
  100. if (start_level)
  101. reg_offset = eint->regs->pol_clr;
  102. else
  103. reg_offset = eint->regs->pol_set;
  104. writel(mask, reg + reg_offset);
  105. curr_level = eint->gpio_xlate->get_gpio_state(eint->pctl,
  106. hwirq);
  107. } while (start_level != curr_level);
  108. return start_level;
  109. }
  110. static void mtk_eint_mask(struct irq_data *d)
  111. {
  112. struct mtk_eint *eint = irq_data_get_irq_chip_data(d);
  113. unsigned int idx = eint->pins[d->hwirq].index;
  114. unsigned int inst = eint->pins[d->hwirq].instance;
  115. unsigned int mask = BIT(idx & 0x1f);
  116. void __iomem *reg = mtk_eint_get_offset(eint, d->hwirq,
  117. eint->regs->mask_set);
  118. eint->cur_mask[inst][idx >> 5] &= ~mask;
  119. writel(mask, reg);
  120. }
  121. static void mtk_eint_unmask(struct irq_data *d)
  122. {
  123. struct mtk_eint *eint = irq_data_get_irq_chip_data(d);
  124. unsigned int idx = eint->pins[d->hwirq].index;
  125. unsigned int inst = eint->pins[d->hwirq].instance;
  126. unsigned int mask = BIT(idx & 0x1f);
  127. void __iomem *reg = mtk_eint_get_offset(eint, d->hwirq,
  128. eint->regs->mask_clr);
  129. eint->cur_mask[inst][idx >> 5] |= mask;
  130. writel(mask, reg);
  131. if (eint->pins[d->hwirq].dual_edge)
  132. mtk_eint_flip_edge(eint, d->hwirq);
  133. }
  134. static unsigned int mtk_eint_get_mask(struct mtk_eint *eint,
  135. unsigned int eint_num)
  136. {
  137. unsigned int bit = BIT(eint->pins[eint_num].index % 32);
  138. void __iomem *reg = mtk_eint_get_offset(eint, eint_num,
  139. eint->regs->mask);
  140. return !!(readl(reg) & bit);
  141. }
  142. static void mtk_eint_ack(struct irq_data *d)
  143. {
  144. struct mtk_eint *eint = irq_data_get_irq_chip_data(d);
  145. unsigned int mask = BIT(eint->pins[d->hwirq].index & 0x1f);
  146. void __iomem *reg = mtk_eint_get_offset(eint, d->hwirq,
  147. eint->regs->ack);
  148. writel(mask, reg);
  149. }
  150. static int mtk_eint_set_type(struct irq_data *d, unsigned int type)
  151. {
  152. struct mtk_eint *eint = irq_data_get_irq_chip_data(d);
  153. bool masked;
  154. unsigned int mask = BIT(eint->pins[d->hwirq].index & 0x1f);
  155. void __iomem *reg;
  156. if (((type & IRQ_TYPE_EDGE_BOTH) && (type & IRQ_TYPE_LEVEL_MASK)) ||
  157. ((type & IRQ_TYPE_LEVEL_MASK) == IRQ_TYPE_LEVEL_MASK)) {
  158. dev_err(eint->dev,
  159. "Can't configure IRQ%d (EINT%lu) for type 0x%X\n",
  160. d->irq, d->hwirq, type);
  161. return -EINVAL;
  162. }
  163. if ((type & IRQ_TYPE_EDGE_BOTH) == IRQ_TYPE_EDGE_BOTH)
  164. eint->pins[d->hwirq].dual_edge = 1;
  165. else
  166. eint->pins[d->hwirq].dual_edge = 0;
  167. if (!mtk_eint_get_mask(eint, d->hwirq)) {
  168. mtk_eint_mask(d);
  169. masked = false;
  170. } else {
  171. masked = true;
  172. }
  173. if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_EDGE_FALLING)) {
  174. reg = mtk_eint_get_offset(eint, d->hwirq, eint->regs->pol_clr);
  175. writel(mask, reg);
  176. } else {
  177. reg = mtk_eint_get_offset(eint, d->hwirq, eint->regs->pol_set);
  178. writel(mask, reg);
  179. }
  180. if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
  181. reg = mtk_eint_get_offset(eint, d->hwirq, eint->regs->sens_clr);
  182. writel(mask, reg);
  183. } else {
  184. reg = mtk_eint_get_offset(eint, d->hwirq, eint->regs->sens_set);
  185. writel(mask, reg);
  186. }
  187. mtk_eint_ack(d);
  188. if (!masked)
  189. mtk_eint_unmask(d);
  190. return 0;
  191. }
  192. static int mtk_eint_irq_set_wake(struct irq_data *d, unsigned int on)
  193. {
  194. struct mtk_eint *eint = irq_data_get_irq_chip_data(d);
  195. unsigned int idx = eint->pins[d->hwirq].index;
  196. unsigned int inst = eint->pins[d->hwirq].instance;
  197. unsigned int shift = idx & 0x1f;
  198. unsigned int port = idx >> 5;
  199. if (on)
  200. eint->wake_mask[inst][port] |= BIT(shift);
  201. else
  202. eint->wake_mask[inst][port] &= ~BIT(shift);
  203. return 0;
  204. }
  205. static void mtk_eint_chip_write_mask(const struct mtk_eint *eint,
  206. void __iomem *base, unsigned int **buf)
  207. {
  208. int inst, port, port_num;
  209. void __iomem *reg;
  210. for (inst = 0; inst < eint->nbase; inst++) {
  211. port_num = DIV_ROUND_UP(eint->base_pin_num[inst], 32);
  212. for (port = 0; port < port_num; port++) {
  213. reg = eint->base[inst] + (port << 2);
  214. writel_relaxed(~buf[inst][port], reg + eint->regs->mask_set);
  215. writel_relaxed(buf[inst][port], reg + eint->regs->mask_clr);
  216. }
  217. }
  218. }
  219. static int mtk_eint_irq_request_resources(struct irq_data *d)
  220. {
  221. struct mtk_eint *eint = irq_data_get_irq_chip_data(d);
  222. struct gpio_chip *gpio_c;
  223. unsigned int gpio_n;
  224. int err;
  225. err = eint->gpio_xlate->get_gpio_n(eint->pctl, d->hwirq,
  226. &gpio_n, &gpio_c);
  227. if (err < 0) {
  228. dev_err(eint->dev, "Can not find pin\n");
  229. return err;
  230. }
  231. err = gpiochip_lock_as_irq(gpio_c, gpio_n);
  232. if (err < 0) {
  233. dev_err(eint->dev, "unable to lock HW IRQ %lu for IRQ\n",
  234. irqd_to_hwirq(d));
  235. return err;
  236. }
  237. err = eint->gpio_xlate->set_gpio_as_eint(eint->pctl, d->hwirq);
  238. if (err < 0) {
  239. dev_err(eint->dev, "Can not eint mode\n");
  240. return err;
  241. }
  242. return 0;
  243. }
  244. static void mtk_eint_irq_release_resources(struct irq_data *d)
  245. {
  246. struct mtk_eint *eint = irq_data_get_irq_chip_data(d);
  247. struct gpio_chip *gpio_c;
  248. unsigned int gpio_n;
  249. eint->gpio_xlate->get_gpio_n(eint->pctl, d->hwirq, &gpio_n,
  250. &gpio_c);
  251. gpiochip_unlock_as_irq(gpio_c, gpio_n);
  252. }
  253. static struct irq_chip mtk_eint_irq_chip = {
  254. .name = "mt-eint",
  255. .irq_disable = mtk_eint_mask,
  256. .irq_mask = mtk_eint_mask,
  257. .irq_unmask = mtk_eint_unmask,
  258. .irq_ack = mtk_eint_ack,
  259. .irq_set_type = mtk_eint_set_type,
  260. .irq_set_wake = mtk_eint_irq_set_wake,
  261. .irq_request_resources = mtk_eint_irq_request_resources,
  262. .irq_release_resources = mtk_eint_irq_release_resources,
  263. };
  264. static unsigned int mtk_eint_hw_init(struct mtk_eint *eint)
  265. {
  266. void __iomem *dom_reg, *mask_reg;
  267. unsigned int i, j;
  268. for (i = 0; i < eint->nbase; i++) {
  269. dom_reg = eint->base[i] + eint->regs->dom_en;
  270. mask_reg = eint->base[i] + eint->regs->mask_set;
  271. for (j = 0; j < eint->base_pin_num[i]; j += 32) {
  272. writel(0xffffffff, dom_reg);
  273. writel(0xffffffff, mask_reg);
  274. dom_reg += 4;
  275. mask_reg += 4;
  276. }
  277. }
  278. return 0;
  279. }
  280. static inline void
  281. mtk_eint_debounce_process(struct mtk_eint *eint, int index)
  282. {
  283. unsigned int rst, ctrl_offset;
  284. unsigned int bit, dbnc;
  285. unsigned int inst = eint->pins[index].instance;
  286. unsigned int idx = eint->pins[index].index;
  287. ctrl_offset = (idx / 4) * 4 + eint->regs->dbnc_ctrl;
  288. dbnc = readl(eint->base[inst] + ctrl_offset);
  289. bit = MTK_EINT_DBNC_SET_EN << ((idx % 4) * 8);
  290. if ((bit & dbnc) > 0) {
  291. ctrl_offset = (idx / 4) * 4 + eint->regs->dbnc_set;
  292. rst = MTK_EINT_DBNC_RST_BIT << ((idx % 4) * 8);
  293. writel(rst, eint->base[inst] + ctrl_offset);
  294. }
  295. }
  296. static void mtk_eint_irq_handler(struct irq_desc *desc)
  297. {
  298. struct irq_chip *chip = irq_desc_get_chip(desc);
  299. struct mtk_eint *eint = irq_desc_get_handler_data(desc);
  300. unsigned int i, j, port, status, shift, mask, eint_num;
  301. void __iomem *reg;
  302. int dual_edge, start_level, curr_level;
  303. chained_irq_enter(chip, desc);
  304. for (i = 0; i < eint->nbase; i++) {
  305. for (j = 0; j < eint->base_pin_num[i]; j += 32) {
  306. port = j >> 5;
  307. status = readl(eint->base[i] + port * 4 + eint->regs->stat);
  308. while (status) {
  309. shift = __ffs(status);
  310. status &= ~BIT(shift);
  311. mask = BIT(shift);
  312. eint_num = eint->pin_list[i][shift + j];
  313. /*
  314. * If we get an interrupt on pin that was only required
  315. * for wake (but no real interrupt requested), mask the
  316. * interrupt (as would mtk_eint_resume do anyway later
  317. * in the resume sequence).
  318. */
  319. if (eint->wake_mask[i][port] & mask &&
  320. !(eint->cur_mask[i][port] & mask)) {
  321. reg = mtk_eint_get_offset(eint, eint_num,
  322. eint->regs->mask_set);
  323. writel_relaxed(mask, reg);
  324. }
  325. dual_edge = eint->pins[eint_num].dual_edge;
  326. if (dual_edge) {
  327. /*
  328. * Clear soft-irq in case we raised it last
  329. * time.
  330. */
  331. reg = mtk_eint_get_offset(eint, eint_num,
  332. eint->regs->soft_clr);
  333. writel(mask, reg);
  334. start_level =
  335. eint->gpio_xlate->get_gpio_state(eint->pctl,
  336. eint_num);
  337. }
  338. generic_handle_domain_irq(eint->domain, eint_num);
  339. if (dual_edge) {
  340. curr_level = mtk_eint_flip_edge(eint, eint_num);
  341. /*
  342. * If level changed, we might lost one edge
  343. * interrupt, raised it through soft-irq.
  344. */
  345. if (start_level != curr_level) {
  346. reg = mtk_eint_get_offset(eint, eint_num,
  347. eint->regs->soft_set);
  348. writel(mask, reg);
  349. }
  350. }
  351. if (eint->pins[eint_num].debounce)
  352. mtk_eint_debounce_process(eint, eint_num);
  353. }
  354. }
  355. }
  356. chained_irq_exit(chip, desc);
  357. }
  358. int mtk_eint_do_suspend(struct mtk_eint *eint)
  359. {
  360. mtk_eint_chip_write_mask(eint, eint->base, eint->wake_mask);
  361. return 0;
  362. }
  363. EXPORT_SYMBOL_GPL(mtk_eint_do_suspend);
  364. int mtk_eint_do_resume(struct mtk_eint *eint)
  365. {
  366. mtk_eint_chip_write_mask(eint, eint->base, eint->cur_mask);
  367. return 0;
  368. }
  369. EXPORT_SYMBOL_GPL(mtk_eint_do_resume);
  370. int mtk_eint_set_debounce(struct mtk_eint *eint, unsigned long eint_num,
  371. unsigned int debounce)
  372. {
  373. int virq, eint_offset;
  374. unsigned int set_offset, bit, clr_bit, clr_offset, rst, i, unmask,
  375. dbnc;
  376. unsigned int inst = eint->pins[eint_num].instance;
  377. unsigned int idx = eint->pins[eint_num].index;
  378. struct irq_data *d;
  379. if (!eint->hw->db_time)
  380. return -EOPNOTSUPP;
  381. virq = irq_find_mapping(eint->domain, eint_num);
  382. eint_offset = (idx % 4) * 8;
  383. d = irq_get_irq_data(virq);
  384. set_offset = (idx / 4) * 4 + eint->regs->dbnc_set;
  385. clr_offset = (idx / 4) * 4 + eint->regs->dbnc_clr;
  386. if (!mtk_eint_can_en_debounce(eint, eint_num))
  387. return -EINVAL;
  388. dbnc = eint->num_db_time;
  389. for (i = 0; i < eint->num_db_time; i++) {
  390. if (debounce <= eint->hw->db_time[i]) {
  391. dbnc = i;
  392. break;
  393. }
  394. }
  395. if (!mtk_eint_get_mask(eint, eint_num)) {
  396. mtk_eint_mask(d);
  397. unmask = 1;
  398. } else {
  399. unmask = 0;
  400. }
  401. clr_bit = 0xff << eint_offset;
  402. writel(clr_bit, eint->base[inst] + clr_offset);
  403. bit = ((dbnc << MTK_EINT_DBNC_SET_DBNC_BITS) | MTK_EINT_DBNC_SET_EN) <<
  404. eint_offset;
  405. rst = MTK_EINT_DBNC_RST_BIT << eint_offset;
  406. writel(rst | bit, eint->base[inst] + set_offset);
  407. /*
  408. * Delay a while (more than 2T) to wait for hw debounce counter reset
  409. * work correctly.
  410. */
  411. udelay(1);
  412. if (unmask == 1)
  413. mtk_eint_unmask(d);
  414. return 0;
  415. }
  416. EXPORT_SYMBOL_GPL(mtk_eint_set_debounce);
  417. int mtk_eint_find_irq(struct mtk_eint *eint, unsigned long eint_n)
  418. {
  419. int irq;
  420. irq = irq_find_mapping(eint->domain, eint_n);
  421. if (!irq)
  422. return -EINVAL;
  423. return irq;
  424. }
  425. EXPORT_SYMBOL_GPL(mtk_eint_find_irq);
  426. int mtk_eint_do_init(struct mtk_eint *eint, struct mtk_eint_pin *eint_pin)
  427. {
  428. unsigned int size, i, port, virq, inst = 0;
  429. /* If clients don't assign a specific regs, let's use generic one */
  430. if (!eint->regs)
  431. eint->regs = &mtk_generic_eint_regs;
  432. eint->base_pin_num = devm_kmalloc_array(eint->dev, eint->nbase, sizeof(u16),
  433. GFP_KERNEL | __GFP_ZERO);
  434. if (!eint->base_pin_num)
  435. return -ENOMEM;
  436. if (eint_pin) {
  437. eint->pins = eint_pin;
  438. for (i = 0; i < eint->hw->ap_num; i++) {
  439. inst = eint->pins[i].instance;
  440. if (inst >= eint->nbase)
  441. continue;
  442. eint->base_pin_num[inst]++;
  443. }
  444. } else {
  445. size = eint->hw->ap_num * sizeof(struct mtk_eint_pin);
  446. eint->pins = devm_kmalloc(eint->dev, size, GFP_KERNEL);
  447. if (!eint->pins)
  448. goto err_pins;
  449. eint->base_pin_num[inst] = eint->hw->ap_num;
  450. for (i = 0; i < eint->hw->ap_num; i++) {
  451. eint->pins[i].instance = inst;
  452. eint->pins[i].index = i;
  453. eint->pins[i].debounce = (i < eint->hw->db_cnt) ? 1 : 0;
  454. }
  455. }
  456. eint->pin_list = devm_kcalloc(eint->dev, eint->nbase,
  457. sizeof(*eint->pin_list), GFP_KERNEL);
  458. if (!eint->pin_list)
  459. goto err_pin_list;
  460. eint->wake_mask = devm_kcalloc(eint->dev, eint->nbase,
  461. sizeof(*eint->wake_mask), GFP_KERNEL);
  462. if (!eint->wake_mask)
  463. goto err_wake_mask;
  464. eint->cur_mask = devm_kcalloc(eint->dev, eint->nbase,
  465. sizeof(*eint->cur_mask), GFP_KERNEL);
  466. if (!eint->cur_mask)
  467. goto err_cur_mask;
  468. for (i = 0; i < eint->nbase; i++) {
  469. eint->pin_list[i] = devm_kzalloc(eint->dev,
  470. eint->base_pin_num[i] * sizeof(**eint->pin_list),
  471. GFP_KERNEL);
  472. port = DIV_ROUND_UP(eint->base_pin_num[i], 32);
  473. eint->wake_mask[i] = devm_kzalloc(eint->dev,
  474. port * sizeof(**eint->wake_mask),
  475. GFP_KERNEL);
  476. eint->cur_mask[i] = devm_kzalloc(eint->dev,
  477. port * sizeof(**eint->cur_mask),
  478. GFP_KERNEL);
  479. if (!eint->pin_list[i] || !eint->wake_mask[i] || !eint->cur_mask[i])
  480. goto err_eint;
  481. }
  482. eint->domain = irq_domain_create_linear(dev_fwnode(eint->dev), eint->hw->ap_num,
  483. &irq_domain_simple_ops, NULL);
  484. if (!eint->domain)
  485. goto err_eint;
  486. if (eint->hw->db_time) {
  487. for (i = 0; i < MTK_EINT_DBNC_MAX; i++)
  488. if (eint->hw->db_time[i] == 0)
  489. break;
  490. eint->num_db_time = i;
  491. }
  492. mtk_eint_hw_init(eint);
  493. for (i = 0; i < eint->hw->ap_num; i++) {
  494. inst = eint->pins[i].instance;
  495. if (inst >= eint->nbase)
  496. continue;
  497. eint->pin_list[inst][eint->pins[i].index] = i;
  498. virq = irq_create_mapping(eint->domain, i);
  499. irq_set_chip_and_handler(virq, &mtk_eint_irq_chip,
  500. handle_level_irq);
  501. irq_set_chip_data(virq, eint);
  502. }
  503. irq_set_chained_handler_and_data(eint->irq, mtk_eint_irq_handler,
  504. eint);
  505. return 0;
  506. err_eint:
  507. for (i = 0; i < eint->nbase; i++) {
  508. devm_kfree(eint->dev, eint->cur_mask[i]);
  509. devm_kfree(eint->dev, eint->wake_mask[i]);
  510. devm_kfree(eint->dev, eint->pin_list[i]);
  511. }
  512. devm_kfree(eint->dev, eint->cur_mask);
  513. err_cur_mask:
  514. devm_kfree(eint->dev, eint->wake_mask);
  515. err_wake_mask:
  516. devm_kfree(eint->dev, eint->pin_list);
  517. err_pin_list:
  518. if (!eint_pin)
  519. devm_kfree(eint->dev, eint->pins);
  520. err_pins:
  521. devm_kfree(eint->dev, eint->base_pin_num);
  522. return -ENOMEM;
  523. }
  524. EXPORT_SYMBOL_GPL(mtk_eint_do_init);
  525. MODULE_LICENSE("GPL v2");
  526. MODULE_DESCRIPTION("MediaTek EINT Driver");