| .. | .. |
|---|
| 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); |
|---|