|
23 | 23 |
|
24 | 24 | #include <dt-bindings/interrupt-controller/arm-gic.h>
|
25 | 25 |
|
26 |
| -#define IRQS_PER_BANK 32 |
| 26 | +#define IRQS_PER_BANK 32 |
27 | 27 |
|
28 |
| -#define HWSPNLCK_TIMEOUT 1000 /* usec */ |
| 28 | +#define HWSPNLCK_TIMEOUT 1000 /* usec */ |
| 29 | + |
| 30 | +#define EXTI_EnCIDCFGR(n) (0x180 + (n) * 4) |
| 31 | +#define EXTI_HWCFGR1 0x3f0 |
| 32 | + |
| 33 | +/* Register: EXTI_EnCIDCFGR(n) */ |
| 34 | +#define EXTI_CIDCFGR_CFEN_MASK BIT(0) |
| 35 | +#define EXTI_CIDCFGR_CID_MASK GENMASK(6, 4) |
| 36 | +#define EXTI_CIDCFGR_CID_SHIFT 4 |
| 37 | + |
| 38 | +/* Register: EXTI_HWCFGR1 */ |
| 39 | +#define EXTI_HWCFGR1_CIDWIDTH_MASK GENMASK(27, 24) |
| 40 | + |
| 41 | +#define EXTI_CID1 1 |
29 | 42 |
|
30 | 43 | struct stm32_exti_bank {
|
31 | 44 | u32 imr_ofst;
|
@@ -907,6 +920,27 @@ static const struct irq_domain_ops stm32_exti_h_domain_ops = {
|
907 | 920 | .xlate = irq_domain_xlate_twocell,
|
908 | 921 | };
|
909 | 922 |
|
| 923 | +static void stm32_exti_check_rif(struct stm32_exti_host_data *host_data) |
| 924 | +{ |
| 925 | + unsigned int bank, i, event; |
| 926 | + u32 cid, cidcfgr, hwcfgr1; |
| 927 | + |
| 928 | + /* quit on CID not supported */ |
| 929 | + hwcfgr1 = readl_relaxed(host_data->base + EXTI_HWCFGR1); |
| 930 | + if ((hwcfgr1 & EXTI_HWCFGR1_CIDWIDTH_MASK) == 0) |
| 931 | + return; |
| 932 | + |
| 933 | + for (bank = 0; bank < host_data->drv_data->bank_nr; bank++) { |
| 934 | + for (i = 0; i < IRQS_PER_BANK; i++) { |
| 935 | + event = bank * IRQS_PER_BANK + i; |
| 936 | + cidcfgr = readl_relaxed(host_data->base + EXTI_EnCIDCFGR(event)); |
| 937 | + cid = (cidcfgr & EXTI_CIDCFGR_CID_MASK) >> EXTI_CIDCFGR_CID_SHIFT; |
| 938 | + if ((cidcfgr & EXTI_CIDCFGR_CFEN_MASK) && cid != EXTI_CID1) |
| 939 | + host_data->chips_data[bank].event_reserved |= BIT(i); |
| 940 | + } |
| 941 | + } |
| 942 | +} |
| 943 | + |
910 | 944 | static void stm32_exti_remove_irq(void *data)
|
911 | 945 | {
|
912 | 946 | struct irq_domain *domain = data;
|
@@ -969,6 +1003,8 @@ static int stm32_exti_probe(struct platform_device *pdev)
|
969 | 1003 | for (i = 0; i < drv_data->bank_nr; i++)
|
970 | 1004 | stm32_exti_chip_init(host_data, i, np);
|
971 | 1005 |
|
| 1006 | + stm32_exti_check_rif(host_data); |
| 1007 | + |
972 | 1008 | parent_domain = irq_find_host(of_irq_find_parent(np));
|
973 | 1009 | if (!parent_domain) {
|
974 | 1010 | dev_err(dev, "GIC interrupt-parent not found\n");
|
|
0 commit comments