Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pinctrl: mediatek: Add EINT support for multiple addresses

For flexible routing, eint will be divided into 5 bases,
and it will obtain the operation address through the pins array.

Signed-off-by: Hao Chang <ot_chhao.chang@mediatek.com>
Signed-off-by: Qingliang Li <qingliang.li@mediatek.com>
Link: https://lore.kernel.org/20250322035307.4811-2-ot_chhao.chang@mediatek.com
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

authored by

Hao Chang and committed by
Linus Walleij
3ef9f710 5df0211a

+252 -125
+195 -114
drivers/pinctrl/mediatek/mtk-eint.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 2 - // Copyright (c) 2014-2018 MediaTek Inc. 2 + // Copyright (c) 2014-2025 MediaTek Inc. 3 3 4 4 /* 5 5 * Library for MediaTek External Interrupt Support 6 6 * 7 7 * Author: Maoguang Meng <maoguang.meng@mediatek.com> 8 8 * Sean Wang <sean.wang@mediatek.com> 9 + * Hao Chang <ot_chhao.chang@mediatek.com> 10 + * Qingliang Li <qingliang.li@mediatek.com> 9 11 * 10 12 */ 11 13 ··· 22 20 #include <linux/platform_device.h> 23 21 24 22 #include "mtk-eint.h" 23 + #include "pinctrl-mtk-common-v2.h" 25 24 26 25 #define MTK_EINT_EDGE_SENSITIVE 0 27 26 #define MTK_EINT_LEVEL_SENSITIVE 1 ··· 71 68 unsigned int eint_num, 72 69 unsigned int offset) 73 70 { 74 - unsigned int eint_base = 0; 71 + unsigned int idx = eint->pins[eint_num].index; 72 + unsigned int inst = eint->pins[eint_num].instance; 75 73 void __iomem *reg; 76 74 77 - if (eint_num >= eint->hw->ap_num) 78 - eint_base = eint->hw->ap_num; 79 - 80 - reg = eint->base + offset + ((eint_num - eint_base) / 32) * 4; 75 + reg = eint->base[inst] + offset + (idx / 32 * 4); 81 76 82 77 return reg; 83 78 } ··· 84 83 unsigned int eint_num) 85 84 { 86 85 unsigned int sens; 87 - unsigned int bit = BIT(eint_num % 32); 86 + unsigned int bit = BIT(eint->pins[eint_num].index % 32); 88 87 void __iomem *reg = mtk_eint_get_offset(eint, eint_num, 89 88 eint->regs->sens); 90 89 ··· 93 92 else 94 93 sens = MTK_EINT_EDGE_SENSITIVE; 95 94 96 - if (eint_num < eint->hw->db_cnt && sens != MTK_EINT_EDGE_SENSITIVE) 95 + if (eint->pins[eint_num].debounce && sens != MTK_EINT_EDGE_SENSITIVE) 97 96 return 1; 98 97 else 99 98 return 0; ··· 103 102 { 104 103 int start_level, curr_level; 105 104 unsigned int reg_offset; 106 - u32 mask = BIT(hwirq & 0x1f); 107 - u32 port = (hwirq >> 5) & eint->hw->port_mask; 108 - void __iomem *reg = eint->base + (port << 2); 105 + unsigned int mask = BIT(eint->pins[hwirq].index & 0x1f); 106 + unsigned int port = (eint->pins[hwirq].index >> 5) & eint->hw->port_mask; 107 + void __iomem *reg = eint->base[eint->pins[hwirq].instance] + (port << 2); 109 108 110 109 curr_level = eint->gpio_xlate->get_gpio_state(eint->pctl, hwirq); 111 110 ··· 127 126 static void mtk_eint_mask(struct irq_data *d) 128 127 { 129 128 struct mtk_eint *eint = irq_data_get_irq_chip_data(d); 130 - u32 mask = BIT(d->hwirq & 0x1f); 129 + unsigned int idx = eint->pins[d->hwirq].index; 130 + unsigned int inst = eint->pins[d->hwirq].instance; 131 + unsigned int mask = BIT(idx & 0x1f); 131 132 void __iomem *reg = mtk_eint_get_offset(eint, d->hwirq, 132 133 eint->regs->mask_set); 133 134 134 - eint->cur_mask[d->hwirq >> 5] &= ~mask; 135 + eint->cur_mask[inst][idx >> 5] &= ~mask; 135 136 136 137 writel(mask, reg); 137 138 } ··· 141 138 static void mtk_eint_unmask(struct irq_data *d) 142 139 { 143 140 struct mtk_eint *eint = irq_data_get_irq_chip_data(d); 144 - u32 mask = BIT(d->hwirq & 0x1f); 141 + unsigned int idx = eint->pins[d->hwirq].index; 142 + unsigned int inst = eint->pins[d->hwirq].instance; 143 + unsigned int mask = BIT(idx & 0x1f); 145 144 void __iomem *reg = mtk_eint_get_offset(eint, d->hwirq, 146 145 eint->regs->mask_clr); 147 146 148 - eint->cur_mask[d->hwirq >> 5] |= mask; 147 + eint->cur_mask[inst][idx >> 5] |= mask; 149 148 150 149 writel(mask, reg); 151 150 152 - if (eint->dual_edge[d->hwirq]) 151 + if (eint->pins[d->hwirq].dual_edge) 153 152 mtk_eint_flip_edge(eint, d->hwirq); 154 153 } 155 154 156 155 static unsigned int mtk_eint_get_mask(struct mtk_eint *eint, 157 156 unsigned int eint_num) 158 157 { 159 - unsigned int bit = BIT(eint_num % 32); 158 + unsigned int bit = BIT(eint->pins[eint_num].index % 32); 160 159 void __iomem *reg = mtk_eint_get_offset(eint, eint_num, 161 160 eint->regs->mask); 162 161 ··· 168 163 static void mtk_eint_ack(struct irq_data *d) 169 164 { 170 165 struct mtk_eint *eint = irq_data_get_irq_chip_data(d); 171 - u32 mask = BIT(d->hwirq & 0x1f); 166 + unsigned int mask = BIT(eint->pins[d->hwirq].index & 0x1f); 172 167 void __iomem *reg = mtk_eint_get_offset(eint, d->hwirq, 173 168 eint->regs->ack); 174 169 ··· 179 174 { 180 175 struct mtk_eint *eint = irq_data_get_irq_chip_data(d); 181 176 bool masked; 182 - u32 mask = BIT(d->hwirq & 0x1f); 177 + unsigned int mask = BIT(eint->pins[d->hwirq].index & 0x1f); 183 178 void __iomem *reg; 184 179 185 180 if (((type & IRQ_TYPE_EDGE_BOTH) && (type & IRQ_TYPE_LEVEL_MASK)) || ··· 191 186 } 192 187 193 188 if ((type & IRQ_TYPE_EDGE_BOTH) == IRQ_TYPE_EDGE_BOTH) 194 - eint->dual_edge[d->hwirq] = 1; 189 + eint->pins[d->hwirq].dual_edge = 1; 195 190 else 196 - eint->dual_edge[d->hwirq] = 0; 191 + eint->pins[d->hwirq].dual_edge = 0; 197 192 198 193 if (!mtk_eint_get_mask(eint, d->hwirq)) { 199 194 mtk_eint_mask(d); ··· 228 223 static int mtk_eint_irq_set_wake(struct irq_data *d, unsigned int on) 229 224 { 230 225 struct mtk_eint *eint = irq_data_get_irq_chip_data(d); 231 - int shift = d->hwirq & 0x1f; 232 - int reg = d->hwirq >> 5; 226 + unsigned int idx = eint->pins[d->hwirq].index; 227 + unsigned int inst = eint->pins[d->hwirq].instance; 228 + unsigned int shift = idx & 0x1f; 229 + unsigned int port = idx >> 5; 233 230 234 231 if (on) 235 - eint->wake_mask[reg] |= BIT(shift); 232 + eint->wake_mask[inst][port] |= BIT(shift); 236 233 else 237 - eint->wake_mask[reg] &= ~BIT(shift); 234 + eint->wake_mask[inst][port] &= ~BIT(shift); 238 235 239 236 return 0; 240 237 } 241 238 242 239 static void mtk_eint_chip_write_mask(const struct mtk_eint *eint, 243 - void __iomem *base, u32 *buf) 240 + void __iomem *base, unsigned int **buf) 244 241 { 245 - int port; 242 + int inst, port, port_num; 246 243 void __iomem *reg; 247 244 248 - for (port = 0; port < eint->hw->ports; port++) { 249 - reg = base + (port << 2); 250 - writel_relaxed(~buf[port], reg + eint->regs->mask_set); 251 - writel_relaxed(buf[port], reg + eint->regs->mask_clr); 245 + for (inst = 0; inst < eint->nbase; inst++) { 246 + port_num = DIV_ROUND_UP(eint->base_pin_num[inst], 32); 247 + for (port = 0; port < port_num; port++) { 248 + reg = eint->base[inst] + (port << 2); 249 + writel_relaxed(~buf[inst][port], reg + eint->regs->mask_set); 250 + writel_relaxed(buf[inst][port], reg + eint->regs->mask_clr); 251 + } 252 252 } 253 253 } 254 254 ··· 313 303 314 304 static unsigned int mtk_eint_hw_init(struct mtk_eint *eint) 315 305 { 316 - void __iomem *dom_en = eint->base + eint->regs->dom_en; 317 - void __iomem *mask_set = eint->base + eint->regs->mask_set; 318 - unsigned int i; 306 + void __iomem *dom_reg, *mask_reg; 307 + unsigned int i, j; 319 308 320 - for (i = 0; i < eint->hw->ap_num; i += 32) { 321 - writel(0xffffffff, dom_en); 322 - writel(0xffffffff, mask_set); 323 - dom_en += 4; 324 - mask_set += 4; 309 + for (i = 0; i < eint->nbase; i++) { 310 + dom_reg = eint->base[i] + eint->regs->dom_en; 311 + mask_reg = eint->base[i] + eint->regs->mask_set; 312 + for (j = 0; j < eint->base_pin_num[i]; j += 32) { 313 + writel(0xffffffff, dom_reg); 314 + writel(0xffffffff, mask_reg); 315 + dom_reg += 4; 316 + mask_reg += 4; 317 + } 325 318 } 326 319 327 320 return 0; ··· 335 322 { 336 323 unsigned int rst, ctrl_offset; 337 324 unsigned int bit, dbnc; 325 + unsigned int inst = eint->pins[index].instance; 326 + unsigned int idx = eint->pins[index].index; 338 327 339 - ctrl_offset = (index / 4) * 4 + eint->regs->dbnc_ctrl; 340 - dbnc = readl(eint->base + ctrl_offset); 341 - bit = MTK_EINT_DBNC_SET_EN << ((index % 4) * 8); 328 + ctrl_offset = (idx / 4) * 4 + eint->regs->dbnc_ctrl; 329 + dbnc = readl(eint->base[inst] + ctrl_offset); 330 + bit = MTK_EINT_DBNC_SET_EN << ((idx % 4) * 8); 342 331 if ((bit & dbnc) > 0) { 343 - ctrl_offset = (index / 4) * 4 + eint->regs->dbnc_set; 344 - rst = MTK_EINT_DBNC_RST_BIT << ((index % 4) * 8); 345 - writel(rst, eint->base + ctrl_offset); 332 + ctrl_offset = (idx / 4) * 4 + eint->regs->dbnc_set; 333 + rst = MTK_EINT_DBNC_RST_BIT << ((idx % 4) * 8); 334 + writel(rst, eint->base[inst] + ctrl_offset); 346 335 } 347 336 } 348 337 ··· 352 337 { 353 338 struct irq_chip *chip = irq_desc_get_chip(desc); 354 339 struct mtk_eint *eint = irq_desc_get_handler_data(desc); 355 - unsigned int status, eint_num; 356 - int offset, mask_offset, index; 357 - void __iomem *reg = mtk_eint_get_offset(eint, 0, eint->regs->stat); 340 + unsigned int i, j, port, status, shift, mask, eint_num; 341 + void __iomem *reg; 358 342 int dual_edge, start_level, curr_level; 359 343 360 344 chained_irq_enter(chip, desc); 361 - for (eint_num = 0; eint_num < eint->hw->ap_num; eint_num += 32, 362 - reg += 4) { 363 - status = readl(reg); 364 - while (status) { 365 - offset = __ffs(status); 366 - mask_offset = eint_num >> 5; 367 - index = eint_num + offset; 368 - status &= ~BIT(offset); 369 - 370 - /* 371 - * If we get an interrupt on pin that was only required 372 - * for wake (but no real interrupt requested), mask the 373 - * interrupt (as would mtk_eint_resume do anyway later 374 - * in the resume sequence). 375 - */ 376 - if (eint->wake_mask[mask_offset] & BIT(offset) && 377 - !(eint->cur_mask[mask_offset] & BIT(offset))) { 378 - writel_relaxed(BIT(offset), reg - 379 - eint->regs->stat + 380 - eint->regs->mask_set); 381 - } 382 - 383 - dual_edge = eint->dual_edge[index]; 384 - if (dual_edge) { 385 - /* 386 - * Clear soft-irq in case we raised it last 387 - * time. 388 - */ 389 - writel(BIT(offset), reg - eint->regs->stat + 390 - eint->regs->soft_clr); 391 - 392 - start_level = 393 - eint->gpio_xlate->get_gpio_state(eint->pctl, 394 - index); 395 - } 396 - 397 - generic_handle_domain_irq(eint->domain, index); 398 - 399 - if (dual_edge) { 400 - curr_level = mtk_eint_flip_edge(eint, index); 345 + for (i = 0; i < eint->nbase; i++) { 346 + for (j = 0; j < eint->base_pin_num[i]; j += 32) { 347 + port = j >> 5; 348 + status = readl(eint->base[i] + port * 4 + eint->regs->stat); 349 + while (status) { 350 + shift = __ffs(status); 351 + status &= ~BIT(shift); 352 + mask = BIT(shift); 353 + eint_num = eint->pin_list[i][shift + j]; 401 354 402 355 /* 403 - * If level changed, we might lost one edge 404 - * interrupt, raised it through soft-irq. 356 + * If we get an interrupt on pin that was only required 357 + * for wake (but no real interrupt requested), mask the 358 + * interrupt (as would mtk_eint_resume do anyway later 359 + * in the resume sequence). 405 360 */ 406 - if (start_level != curr_level) 407 - writel(BIT(offset), reg - 408 - eint->regs->stat + 409 - eint->regs->soft_set); 410 - } 361 + if (eint->wake_mask[i][port] & mask && 362 + !(eint->cur_mask[i][port] & mask)) { 363 + reg = mtk_eint_get_offset(eint, eint_num, 364 + eint->regs->mask_set); 365 + writel_relaxed(mask, reg); 366 + } 411 367 412 - if (index < eint->hw->db_cnt) 413 - mtk_eint_debounce_process(eint, index); 368 + dual_edge = eint->pins[eint_num].dual_edge; 369 + if (dual_edge) { 370 + /* 371 + * Clear soft-irq in case we raised it last 372 + * time. 373 + */ 374 + reg = mtk_eint_get_offset(eint, eint_num, 375 + eint->regs->soft_clr); 376 + writel(mask, reg); 377 + 378 + start_level = 379 + eint->gpio_xlate->get_gpio_state(eint->pctl, 380 + eint_num); 381 + } 382 + 383 + generic_handle_domain_irq(eint->domain, eint_num); 384 + 385 + if (dual_edge) { 386 + curr_level = mtk_eint_flip_edge(eint, eint_num); 387 + 388 + /* 389 + * If level changed, we might lost one edge 390 + * interrupt, raised it through soft-irq. 391 + */ 392 + if (start_level != curr_level) { 393 + reg = mtk_eint_get_offset(eint, eint_num, 394 + eint->regs->soft_set); 395 + writel(mask, reg); 396 + } 397 + } 398 + 399 + if (eint->pins[eint_num].debounce) 400 + mtk_eint_debounce_process(eint, eint_num); 401 + } 414 402 } 415 403 } 416 404 chained_irq_exit(chip, desc); ··· 441 423 int virq, eint_offset; 442 424 unsigned int set_offset, bit, clr_bit, clr_offset, rst, i, unmask, 443 425 dbnc; 426 + unsigned int inst = eint->pins[eint_num].instance; 427 + unsigned int idx = eint->pins[eint_num].index; 444 428 struct irq_data *d; 445 429 446 430 if (!eint->hw->db_time) ··· 452 432 eint_offset = (eint_num % 4) * 8; 453 433 d = irq_get_irq_data(virq); 454 434 455 - set_offset = (eint_num / 4) * 4 + eint->regs->dbnc_set; 456 - clr_offset = (eint_num / 4) * 4 + eint->regs->dbnc_clr; 435 + set_offset = (idx / 4) * 4 + eint->regs->dbnc_set; 436 + clr_offset = (idx / 4) * 4 + eint->regs->dbnc_clr; 457 437 458 438 if (!mtk_eint_can_en_debounce(eint, eint_num)) 459 439 return -EINVAL; ··· 474 454 } 475 455 476 456 clr_bit = 0xff << eint_offset; 477 - writel(clr_bit, eint->base + clr_offset); 457 + writel(clr_bit, eint->base[inst] + clr_offset); 478 458 479 459 bit = ((dbnc << MTK_EINT_DBNC_SET_DBNC_BITS) | MTK_EINT_DBNC_SET_EN) << 480 460 eint_offset; 481 461 rst = MTK_EINT_DBNC_RST_BIT << eint_offset; 482 - writel(rst | bit, eint->base + set_offset); 462 + writel(rst | bit, eint->base[inst] + set_offset); 483 463 484 464 /* 485 465 * Delay a while (more than 2T) to wait for hw debounce counter reset ··· 507 487 508 488 int mtk_eint_do_init(struct mtk_eint *eint) 509 489 { 510 - int i; 490 + unsigned int size, i, port, inst = 0; 491 + struct mtk_pinctrl *hw = (struct mtk_pinctrl *)eint->pctl; 511 492 512 493 /* If clients don't assign a specific regs, let's use generic one */ 513 494 if (!eint->regs) 514 495 eint->regs = &mtk_generic_eint_regs; 515 496 516 - eint->wake_mask = devm_kcalloc(eint->dev, eint->hw->ports, 517 - sizeof(*eint->wake_mask), GFP_KERNEL); 497 + eint->base_pin_num = devm_kmalloc_array(eint->dev, eint->nbase, sizeof(u16), 498 + GFP_KERNEL | __GFP_ZERO); 499 + if (!eint->base_pin_num) 500 + return -ENOMEM; 501 + 502 + if (eint->nbase == 1) { 503 + size = eint->hw->ap_num * sizeof(struct mtk_eint_pin); 504 + eint->pins = devm_kmalloc(eint->dev, size, GFP_KERNEL); 505 + if (!eint->pins) 506 + goto err_pins; 507 + 508 + eint->base_pin_num[inst] = eint->hw->ap_num; 509 + for (i = 0; i < eint->hw->ap_num; i++) { 510 + eint->pins[i].instance = inst; 511 + eint->pins[i].index = i; 512 + eint->pins[i].debounce = (i < eint->hw->db_cnt) ? 1 : 0; 513 + } 514 + } 515 + 516 + if (hw && hw->soc && hw->soc->eint_pin) { 517 + eint->pins = hw->soc->eint_pin; 518 + for (i = 0; i < eint->hw->ap_num; i++) { 519 + inst = eint->pins[i].instance; 520 + if (inst >= eint->nbase) 521 + continue; 522 + eint->base_pin_num[inst]++; 523 + } 524 + } 525 + 526 + eint->pin_list = devm_kmalloc(eint->dev, eint->nbase * sizeof(u16 *), GFP_KERNEL); 527 + if (!eint->pin_list) 528 + goto err_pin_list; 529 + 530 + eint->wake_mask = devm_kmalloc(eint->dev, eint->nbase * sizeof(u32 *), GFP_KERNEL); 518 531 if (!eint->wake_mask) 519 - return -ENOMEM; 532 + goto err_wake_mask; 520 533 521 - eint->cur_mask = devm_kcalloc(eint->dev, eint->hw->ports, 522 - sizeof(*eint->cur_mask), GFP_KERNEL); 534 + eint->cur_mask = devm_kmalloc(eint->dev, eint->nbase * sizeof(u32 *), GFP_KERNEL); 523 535 if (!eint->cur_mask) 524 - return -ENOMEM; 536 + goto err_cur_mask; 525 537 526 - eint->dual_edge = devm_kcalloc(eint->dev, eint->hw->ap_num, 527 - sizeof(int), GFP_KERNEL); 528 - if (!eint->dual_edge) 529 - return -ENOMEM; 538 + for (i = 0; i < eint->nbase; i++) { 539 + eint->pin_list[i] = devm_kzalloc(eint->dev, eint->base_pin_num[i] * sizeof(u16), 540 + GFP_KERNEL); 541 + port = DIV_ROUND_UP(eint->base_pin_num[i], 32); 542 + eint->wake_mask[i] = devm_kzalloc(eint->dev, port * sizeof(u32), GFP_KERNEL); 543 + eint->cur_mask[i] = devm_kzalloc(eint->dev, port * sizeof(u32), GFP_KERNEL); 544 + if (!eint->pin_list[i] || !eint->wake_mask[i] || !eint->cur_mask[i]) 545 + goto err_eint; 546 + } 530 547 531 548 eint->domain = irq_domain_add_linear(eint->dev->of_node, 532 549 eint->hw->ap_num, 533 550 &irq_domain_simple_ops, NULL); 534 551 if (!eint->domain) 535 - return -ENOMEM; 552 + goto err_eint; 536 553 537 554 if (eint->hw->db_time) { 538 555 for (i = 0; i < MTK_EINT_DBNC_MAX; i++) ··· 580 523 581 524 mtk_eint_hw_init(eint); 582 525 for (i = 0; i < eint->hw->ap_num; i++) { 526 + inst = eint->pins[i].instance; 527 + if (inst >= eint->nbase) 528 + continue; 529 + eint->pin_list[inst][eint->pins[i].index] = i; 583 530 int virq = irq_create_mapping(eint->domain, i); 584 - 585 531 irq_set_chip_and_handler(virq, &mtk_eint_irq_chip, 586 532 handle_level_irq); 587 533 irq_set_chip_data(virq, eint); ··· 594 534 eint); 595 535 596 536 return 0; 537 + 538 + err_eint: 539 + for (i = 0; i < eint->nbase; i++) { 540 + if (eint->cur_mask[i]) 541 + devm_kfree(eint->dev, eint->cur_mask[i]); 542 + if (eint->wake_mask[i]) 543 + devm_kfree(eint->dev, eint->wake_mask[i]); 544 + if (eint->pin_list[i]) 545 + devm_kfree(eint->dev, eint->pin_list[i]); 546 + } 547 + devm_kfree(eint->dev, eint->cur_mask); 548 + err_cur_mask: 549 + devm_kfree(eint->dev, eint->wake_mask); 550 + err_wake_mask: 551 + devm_kfree(eint->dev, eint->pin_list); 552 + err_pin_list: 553 + if (eint->nbase == 1) 554 + devm_kfree(eint->dev, eint->pins); 555 + err_pins: 556 + devm_kfree(eint->dev, eint->base_pin_num); 557 + return -ENOMEM; 597 558 } 598 559 EXPORT_SYMBOL_GPL(mtk_eint_do_init); 599 560
+18 -5
drivers/pinctrl/mediatek/mtk-eint.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 */ 2 2 /* 3 - * Copyright (C) 2014-2018 MediaTek Inc. 3 + * Copyright (C) 2014-2025 MediaTek Inc. 4 4 * 5 5 * Author: Maoguang Meng <maoguang.meng@mediatek.com> 6 6 * Sean Wang <sean.wang@mediatek.com> 7 - * 7 + * Hao Chang <ot_chhao.chang@mediatek.com> 8 + * Qingliang Li <qingliang.li@mediatek.com> 8 9 */ 9 10 #ifndef __MTK_EINT_H 10 11 #define __MTK_EINT_H ··· 41 40 const unsigned int *db_time; 42 41 }; 43 42 43 + struct mtk_eint_pin { 44 + u16 number; 45 + u8 instance; 46 + u8 index; 47 + bool debounce; 48 + bool dual_edge; 49 + }; 50 + 44 51 extern const unsigned int debounce_time_mt2701[]; 45 52 extern const unsigned int debounce_time_mt6765[]; 46 53 extern const unsigned int debounce_time_mt6795[]; ··· 65 56 66 57 struct mtk_eint { 67 58 struct device *dev; 68 - void __iomem *base; 59 + void __iomem **base; 60 + u8 nbase; 61 + u16 *base_pin_num; 69 62 struct irq_domain *domain; 70 63 int irq; 71 64 72 65 int *dual_edge; 73 - u32 *wake_mask; 74 - u32 *cur_mask; 66 + u16 **pin_list; 67 + u32 **wake_mask; 68 + u32 **cur_mask; 75 69 76 70 /* Used to fit into various EINT device */ 77 71 const struct mtk_eint_hw *hw; 78 72 const struct mtk_eint_regs *regs; 73 + struct mtk_eint_pin *pins; 79 74 u16 num_db_time; 80 75 81 76 /* Used to fit into various pinctrl device */
+31 -6
drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c
··· 13 13 #include <linux/platform_device.h> 14 14 #include <linux/io.h> 15 15 #include <linux/module.h> 16 + #include <linux/of_address.h> 16 17 #include <linux/of_irq.h> 17 18 18 19 #include "mtk-eint.h" ··· 368 367 int mtk_build_eint(struct mtk_pinctrl *hw, struct platform_device *pdev) 369 368 { 370 369 struct device_node *np = pdev->dev.of_node; 371 - int ret; 370 + int ret, i, j, count_reg_names; 372 371 373 372 if (!IS_ENABLED(CONFIG_EINT_MTK)) 374 373 return 0; ··· 380 379 if (!hw->eint) 381 380 return -ENOMEM; 382 381 383 - hw->eint->base = devm_platform_ioremap_resource_byname(pdev, "eint"); 384 - if (IS_ERR(hw->eint->base)) { 385 - ret = PTR_ERR(hw->eint->base); 386 - goto err_free_eint; 382 + count_reg_names = of_property_count_strings(np, "reg-names"); 383 + if (count_reg_names < hw->soc->nbase_names) 384 + return -EINVAL; 385 + 386 + hw->eint->nbase = count_reg_names - hw->soc->nbase_names; 387 + hw->eint->base = devm_kmalloc_array(&pdev->dev, hw->eint->nbase, 388 + sizeof(*hw->eint->base), GFP_KERNEL | __GFP_ZERO); 389 + if (!hw->eint->base) { 390 + ret = -ENOMEM; 391 + goto err_free_base; 392 + } 393 + 394 + for (i = hw->soc->nbase_names, j = 0; i < count_reg_names; i++, j++) { 395 + hw->eint->base[j] = of_iomap(np, i); 396 + if (IS_ERR(hw->eint->base[j])) { 397 + ret = PTR_ERR(hw->eint->base[j]); 398 + goto err_free_eint; 399 + } 387 400 } 388 401 389 402 hw->eint->irq = irq_of_parse_and_map(np, 0); ··· 416 401 hw->eint->pctl = hw; 417 402 hw->eint->gpio_xlate = &mtk_eint_xt; 418 403 419 - return mtk_eint_do_init(hw->eint); 404 + ret = mtk_eint_do_init(hw->eint); 405 + if (ret) 406 + goto err_free_eint; 407 + 408 + return 0; 420 409 421 410 err_free_eint: 411 + for (j = 0; j < hw->eint->nbase; j++) { 412 + if (hw->eint->base[j]) 413 + iounmap(hw->eint->base[j]); 414 + } 415 + devm_kfree(hw->dev, hw->eint->base); 416 + err_free_base: 422 417 devm_kfree(hw->dev, hw->eint); 423 418 hw->eint = NULL; 424 419 return ret;
+1
drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.h
··· 242 242 unsigned int nfuncs; 243 243 const struct mtk_eint_regs *eint_regs; 244 244 const struct mtk_eint_hw *eint_hw; 245 + struct mtk_eint_pin *eint_pin; 245 246 246 247 /* Specific parameters per SoC */ 247 248 u8 gpio_m;
+7
drivers/pinctrl/mediatek/pinctrl-paris.h
··· 49 49 __VA_ARGS__, { } }, \ 50 50 } 51 51 52 + #define MTK_EINT_PIN(_number, _instance, _index, _debounce) { \ 53 + .number = _number, \ 54 + .instance = _instance, \ 55 + .index = _index, \ 56 + .debounce = _debounce, \ 57 + } 58 + 52 59 #define PINCTRL_PIN_GROUP(_name_, id) \ 53 60 { \ 54 61 .grp = PINCTRL_PINGROUP(_name_,id##_pins, ARRAY_SIZE(id##_pins)), \