rx_icu.c (d88d5a3806d78dcfca648c62dae9d88d3e803bd2) | rx_icu.c (d73415a315471ac0b127ed3fad45c8ec5d711de1) |
---|---|
1/* 2 * RX Interrupt Control Unit 3 * 4 * Warning: Only ICUa is supported. 5 * 6 * Datasheet: RX62N Group, RX621 Group User's Manual: Hardware 7 * (Rev.1.40 R01UH0033EJ0140) 8 * --- 67 unchanged lines hidden (view full) --- 76 return (icu->ipr[icu->map[n]] << 8) | n; 77} 78 79static void rxicu_request(RXICUState *icu, int n_IRQ) 80{ 81 int enable; 82 83 enable = icu->ier[n_IRQ / 8] & (1 << (n_IRQ & 7)); | 1/* 2 * RX Interrupt Control Unit 3 * 4 * Warning: Only ICUa is supported. 5 * 6 * Datasheet: RX62N Group, RX621 Group User's Manual: Hardware 7 * (Rev.1.40 R01UH0033EJ0140) 8 * --- 67 unchanged lines hidden (view full) --- 76 return (icu->ipr[icu->map[n]] << 8) | n; 77} 78 79static void rxicu_request(RXICUState *icu, int n_IRQ) 80{ 81 int enable; 82 83 enable = icu->ier[n_IRQ / 8] & (1 << (n_IRQ & 7)); |
84 if (n_IRQ > 0 && enable != 0 && atomic_read(&icu->req_irq) < 0) { 85 atomic_set(&icu->req_irq, n_IRQ); | 84 if (n_IRQ > 0 && enable != 0 && qatomic_read(&icu->req_irq) < 0) { 85 qatomic_set(&icu->req_irq, n_IRQ); |
86 set_irq(icu, n_IRQ, rxicu_level(icu, n_IRQ)); 87 } 88} 89 90static void rxicu_set_irq(void *opaque, int n_IRQ, int level) 91{ 92 RXICUState *icu = opaque; 93 struct IRQSource *src; --- 25 unchanged lines hidden (view full) --- 119 issue = ((level ^ src->level) & 1); 120 src->level = level; 121 break; 122 default: 123 g_assert_not_reached(); 124 } 125 if (issue == 0 && src->sense == TRG_LEVEL) { 126 icu->ir[n_IRQ] = 0; | 86 set_irq(icu, n_IRQ, rxicu_level(icu, n_IRQ)); 87 } 88} 89 90static void rxicu_set_irq(void *opaque, int n_IRQ, int level) 91{ 92 RXICUState *icu = opaque; 93 struct IRQSource *src; --- 25 unchanged lines hidden (view full) --- 119 issue = ((level ^ src->level) & 1); 120 src->level = level; 121 break; 122 default: 123 g_assert_not_reached(); 124 } 125 if (issue == 0 && src->sense == TRG_LEVEL) { 126 icu->ir[n_IRQ] = 0; |
127 if (atomic_read(&icu->req_irq) == n_IRQ) { | 127 if (qatomic_read(&icu->req_irq) == n_IRQ) { |
128 /* clear request */ 129 set_irq(icu, n_IRQ, 0); | 128 /* clear request */ 129 set_irq(icu, n_IRQ, 0); |
130 atomic_set(&icu->req_irq, -1); | 130 qatomic_set(&icu->req_irq, -1); |
131 } 132 return; 133 } 134 if (issue) { 135 icu->ir[n_IRQ] = 1; 136 rxicu_request(icu, n_IRQ); 137 } 138} 139 140static void rxicu_ack_irq(void *opaque, int no, int level) 141{ 142 RXICUState *icu = opaque; 143 int i; 144 int n_IRQ; 145 int max_pri; 146 | 131 } 132 return; 133 } 134 if (issue) { 135 icu->ir[n_IRQ] = 1; 136 rxicu_request(icu, n_IRQ); 137 } 138} 139 140static void rxicu_ack_irq(void *opaque, int no, int level) 141{ 142 RXICUState *icu = opaque; 143 int i; 144 int n_IRQ; 145 int max_pri; 146 |
147 n_IRQ = atomic_read(&icu->req_irq); | 147 n_IRQ = qatomic_read(&icu->req_irq); |
148 if (n_IRQ < 0) { 149 return; 150 } | 148 if (n_IRQ < 0) { 149 return; 150 } |
151 atomic_set(&icu->req_irq, -1); | 151 qatomic_set(&icu->req_irq, -1); |
152 if (icu->src[n_IRQ].sense != TRG_LEVEL) { 153 icu->ir[n_IRQ] = 0; 154 } 155 156 max_pri = 0; 157 n_IRQ = -1; 158 for (i = 0; i < NR_IRQS; i++) { 159 if (icu->ir[i]) { --- 238 unchanged lines hidden --- | 152 if (icu->src[n_IRQ].sense != TRG_LEVEL) { 153 icu->ir[n_IRQ] = 0; 154 } 155 156 max_pri = 0; 157 n_IRQ = -1; 158 for (i = 0; i < NR_IRQS; i++) { 159 if (icu->ir[i]) { --- 238 unchanged lines hidden --- |