hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/irqchip/irq-xtensa-mx.c
....@@ -62,7 +62,7 @@
6262 __this_cpu_write(cached_irq_mask,
6363 XCHAL_INTTYPE_MASK_EXTERN_EDGE |
6464 XCHAL_INTTYPE_MASK_EXTERN_LEVEL);
65
- set_sr(XCHAL_INTTYPE_MASK_EXTERN_EDGE |
65
+ xtensa_set_sr(XCHAL_INTTYPE_MASK_EXTERN_EDGE |
6666 XCHAL_INTTYPE_MASK_EXTERN_LEVEL, intenable);
6767 }
6868
....@@ -71,14 +71,17 @@
7171 unsigned int mask = 1u << d->hwirq;
7272
7373 if (mask & (XCHAL_INTTYPE_MASK_EXTERN_EDGE |
74
- XCHAL_INTTYPE_MASK_EXTERN_LEVEL)) {
75
- set_er(1u << (xtensa_get_ext_irq_no(d->hwirq) -
76
- HW_IRQ_MX_BASE), MIENG);
77
- } else {
78
- mask = __this_cpu_read(cached_irq_mask) & ~mask;
79
- __this_cpu_write(cached_irq_mask, mask);
80
- set_sr(mask, intenable);
74
+ XCHAL_INTTYPE_MASK_EXTERN_LEVEL)) {
75
+ unsigned int ext_irq = xtensa_get_ext_irq_no(d->hwirq);
76
+
77
+ if (ext_irq >= HW_IRQ_MX_BASE) {
78
+ set_er(1u << (ext_irq - HW_IRQ_MX_BASE), MIENG);
79
+ return;
80
+ }
8181 }
82
+ mask = __this_cpu_read(cached_irq_mask) & ~mask;
83
+ __this_cpu_write(cached_irq_mask, mask);
84
+ xtensa_set_sr(mask, intenable);
8285 }
8386
8487 static void xtensa_mx_irq_unmask(struct irq_data *d)
....@@ -86,14 +89,17 @@
8689 unsigned int mask = 1u << d->hwirq;
8790
8891 if (mask & (XCHAL_INTTYPE_MASK_EXTERN_EDGE |
89
- XCHAL_INTTYPE_MASK_EXTERN_LEVEL)) {
90
- set_er(1u << (xtensa_get_ext_irq_no(d->hwirq) -
91
- HW_IRQ_MX_BASE), MIENGSET);
92
- } else {
93
- mask |= __this_cpu_read(cached_irq_mask);
94
- __this_cpu_write(cached_irq_mask, mask);
95
- set_sr(mask, intenable);
92
+ XCHAL_INTTYPE_MASK_EXTERN_LEVEL)) {
93
+ unsigned int ext_irq = xtensa_get_ext_irq_no(d->hwirq);
94
+
95
+ if (ext_irq >= HW_IRQ_MX_BASE) {
96
+ set_er(1u << (ext_irq - HW_IRQ_MX_BASE), MIENGSET);
97
+ return;
98
+ }
9699 }
100
+ mask |= __this_cpu_read(cached_irq_mask);
101
+ __this_cpu_write(cached_irq_mask, mask);
102
+ xtensa_set_sr(mask, intenable);
97103 }
98104
99105 static void xtensa_mx_irq_enable(struct irq_data *d)
....@@ -108,12 +114,16 @@
108114
109115 static void xtensa_mx_irq_ack(struct irq_data *d)
110116 {
111
- set_sr(1 << d->hwirq, intclear);
117
+ xtensa_set_sr(1 << d->hwirq, intclear);
112118 }
113119
114120 static int xtensa_mx_irq_retrigger(struct irq_data *d)
115121 {
116
- set_sr(1 << d->hwirq, intset);
122
+ unsigned int mask = 1u << d->hwirq;
123
+
124
+ if (WARN_ON(mask & ~XCHAL_INTTYPE_MASK_SOFTWARE))
125
+ return 0;
126
+ xtensa_set_sr(mask, intset);
117127 return 1;
118128 }
119129
....@@ -141,14 +151,25 @@
141151 .irq_set_affinity = xtensa_mx_irq_set_affinity,
142152 };
143153
154
+static void __init xtensa_mx_init_common(struct irq_domain *root_domain)
155
+{
156
+ unsigned int i;
157
+
158
+ irq_set_default_host(root_domain);
159
+ secondary_init_irq();
160
+
161
+ /* Initialize default IRQ routing to CPU 0 */
162
+ for (i = 0; i < XCHAL_NUM_EXTINTERRUPTS; ++i)
163
+ set_er(1, MIROUT(i));
164
+}
165
+
144166 int __init xtensa_mx_init_legacy(struct device_node *interrupt_parent)
145167 {
146168 struct irq_domain *root_domain =
147169 irq_domain_add_legacy(NULL, NR_IRQS - 1, 1, 0,
148170 &xtensa_mx_irq_domain_ops,
149171 &xtensa_mx_irq_chip);
150
- irq_set_default_host(root_domain);
151
- secondary_init_irq();
172
+ xtensa_mx_init_common(root_domain);
152173 return 0;
153174 }
154175
....@@ -158,8 +179,7 @@
158179 struct irq_domain *root_domain =
159180 irq_domain_add_linear(np, NR_IRQS, &xtensa_mx_irq_domain_ops,
160181 &xtensa_mx_irq_chip);
161
- irq_set_default_host(root_domain);
162
- secondary_init_irq();
182
+ xtensa_mx_init_common(root_domain);
163183 return 0;
164184 }
165185 IRQCHIP_DECLARE(xtensa_mx_irq_chip, "cdns,xtensa-mx", xtensa_mx_init);