.. | .. |
---|
62 | 62 | __this_cpu_write(cached_irq_mask, |
---|
63 | 63 | XCHAL_INTTYPE_MASK_EXTERN_EDGE | |
---|
64 | 64 | XCHAL_INTTYPE_MASK_EXTERN_LEVEL); |
---|
65 | | - set_sr(XCHAL_INTTYPE_MASK_EXTERN_EDGE | |
---|
| 65 | + xtensa_set_sr(XCHAL_INTTYPE_MASK_EXTERN_EDGE | |
---|
66 | 66 | XCHAL_INTTYPE_MASK_EXTERN_LEVEL, intenable); |
---|
67 | 67 | } |
---|
68 | 68 | |
---|
.. | .. |
---|
71 | 71 | unsigned int mask = 1u << d->hwirq; |
---|
72 | 72 | |
---|
73 | 73 | 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 | + } |
---|
81 | 81 | } |
---|
| 82 | + mask = __this_cpu_read(cached_irq_mask) & ~mask; |
---|
| 83 | + __this_cpu_write(cached_irq_mask, mask); |
---|
| 84 | + xtensa_set_sr(mask, intenable); |
---|
82 | 85 | } |
---|
83 | 86 | |
---|
84 | 87 | static void xtensa_mx_irq_unmask(struct irq_data *d) |
---|
.. | .. |
---|
86 | 89 | unsigned int mask = 1u << d->hwirq; |
---|
87 | 90 | |
---|
88 | 91 | 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 | + } |
---|
96 | 99 | } |
---|
| 100 | + mask |= __this_cpu_read(cached_irq_mask); |
---|
| 101 | + __this_cpu_write(cached_irq_mask, mask); |
---|
| 102 | + xtensa_set_sr(mask, intenable); |
---|
97 | 103 | } |
---|
98 | 104 | |
---|
99 | 105 | static void xtensa_mx_irq_enable(struct irq_data *d) |
---|
.. | .. |
---|
108 | 114 | |
---|
109 | 115 | static void xtensa_mx_irq_ack(struct irq_data *d) |
---|
110 | 116 | { |
---|
111 | | - set_sr(1 << d->hwirq, intclear); |
---|
| 117 | + xtensa_set_sr(1 << d->hwirq, intclear); |
---|
112 | 118 | } |
---|
113 | 119 | |
---|
114 | 120 | static int xtensa_mx_irq_retrigger(struct irq_data *d) |
---|
115 | 121 | { |
---|
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); |
---|
117 | 127 | return 1; |
---|
118 | 128 | } |
---|
119 | 129 | |
---|
.. | .. |
---|
141 | 151 | .irq_set_affinity = xtensa_mx_irq_set_affinity, |
---|
142 | 152 | }; |
---|
143 | 153 | |
---|
| 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 | + |
---|
144 | 166 | int __init xtensa_mx_init_legacy(struct device_node *interrupt_parent) |
---|
145 | 167 | { |
---|
146 | 168 | struct irq_domain *root_domain = |
---|
147 | 169 | irq_domain_add_legacy(NULL, NR_IRQS - 1, 1, 0, |
---|
148 | 170 | &xtensa_mx_irq_domain_ops, |
---|
149 | 171 | &xtensa_mx_irq_chip); |
---|
150 | | - irq_set_default_host(root_domain); |
---|
151 | | - secondary_init_irq(); |
---|
| 172 | + xtensa_mx_init_common(root_domain); |
---|
152 | 173 | return 0; |
---|
153 | 174 | } |
---|
154 | 175 | |
---|
.. | .. |
---|
158 | 179 | struct irq_domain *root_domain = |
---|
159 | 180 | irq_domain_add_linear(np, NR_IRQS, &xtensa_mx_irq_domain_ops, |
---|
160 | 181 | &xtensa_mx_irq_chip); |
---|
161 | | - irq_set_default_host(root_domain); |
---|
162 | | - secondary_init_irq(); |
---|
| 182 | + xtensa_mx_init_common(root_domain); |
---|
163 | 183 | return 0; |
---|
164 | 184 | } |
---|
165 | 185 | IRQCHIP_DECLARE(xtensa_mx_irq_chip, "cdns,xtensa-mx", xtensa_mx_init); |
---|