Changeset 546 for GPL/branches/uniaud32-2.1.x/lib32/irq.c
- Timestamp:
- Mar 3, 2011, 8:59:04 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GPL/branches/uniaud32-2.1.x/lib32/irq.c
r519 r546 45 45 46 46 static IRQ_SLOT arSlots[MAX_IRQ_SLOTS] = { 0 }; 47 static ULONG 47 static ULONG eoiIrq[255] = {0}; 48 48 49 49 … … 52 52 static IRQ_SLOT *FindSlot(unsigned irq) 53 53 { 54 IRQ_SLOT*pSlot;55 56 57 58 if( pSlot->irqNo == irq )return pSlot;59 60 61 54 IRQ_SLOT *pSlot; 55 56 for( pSlot = arSlots; pSlot != &arSlots[MAX_IRQ_SLOTS]; pSlot++ ) 57 { 58 if( pSlot->irqNo == irq ) return pSlot; 59 } 60 61 return NULL; 62 62 } 63 63 … … 67 67 68 68 int request_irq(unsigned irq, irq_handler_t handler, 69 unsigned long x0, const char *x1, void *x2) 70 { 71 IRQ_SLOT *pSlot = FindSlot(irq & 0xff); 72 unsigned u, uSlotNo = (unsigned)-1; 73 if( !pSlot ) 74 { 75 // find empty slot 76 for( uSlotNo = 0; uSlotNo < MAX_IRQ_SLOTS; uSlotNo++ ) 77 { 78 if( arSlots[uSlotNo].flHandlers == 0 ) 79 { 80 pSlot = &arSlots[uSlotNo]; break; 81 } 82 } 83 84 } 85 86 if( pSlot ) 87 { 88 if(RMRequestIRQ(/*hResMgr,*/ irq , (x0 & SA_SHIRQ) != 0) == FALSE) { 89 rprintf(("RMRequestIRQ failed for irq %d", irq)); 90 // return 0; 91 } 92 93 for( u = 0; u < MAX_SHAREDIRQS; u++ ) 94 { 95 if( pSlot->irqHandlers[u].handler == NULL ) 96 { 97 pSlot->irqNo = irq & 0xff; 98 pSlot->irqHandlers[u].handler = handler; 99 pSlot->irqHandlers[u].x0 = x0; 100 pSlot->irqHandlers[u].x1 = (char *)x1; 101 pSlot->irqHandlers[u].x2 = x2; 102 103 if( pSlot->flHandlers != 0 || 104 ALSA_SetIrq( irq & 0xff, uSlotNo, (x0 & SA_SHIRQ) != 0) ) 105 { 106 pSlot->flHandlers |= 1 << u; 107 return 0; 108 } 109 110 break; 111 } 112 } 113 } 114 115 rprintf(("request_irq: Unable to register irq handler for irq %d\n", irq & 0xff )); 116 return 1; 69 unsigned long ulSharedFlag, const char *pchName, void *pUserData) 70 { 71 IRQ_SLOT *pSlot = FindSlot(irq & 0xff); 72 unsigned u, uSlotNo = (unsigned)-1; 73 ULONG hRes; 74 75 dprintf(("request_irq: Enter for irq %d", irq & 0xff )); 76 if ( !pSlot ) { 77 // find empty slot 78 for( uSlotNo = 0; uSlotNo < MAX_IRQ_SLOTS; uSlotNo++ ) { 79 if( arSlots[uSlotNo].flHandlers == 0 ) { 80 pSlot = &arSlots[uSlotNo]; 81 break; 82 } 83 } 84 } 85 86 if ( pSlot ) { 87 hRes = NULL; 88 if (RMRequestIRQ(irq, (ulSharedFlag & SA_SHIRQ) != 0, &hRes) == FALSE) { 89 rprintf(("RMRequestIRQ failed for irq %d", irq)); 90 // return 0; 91 } 92 pSlot->irqNo = irq & 0xff; 93 pSlot->hRes = hRes; 94 95 for ( u = 0; u < MAX_SHAREDIRQS; u++ ) { 96 if ( pSlot->irqHandlers[u].handler == NULL ) { 97 pSlot->irqHandlers[u].handler = handler; 98 pSlot->irqHandlers[u].x0 = ulSharedFlag; 99 pSlot->irqHandlers[u].x1 = (char *)pchName; 100 pSlot->irqHandlers[u].x2 = pUserData; 101 102 if( pSlot->flHandlers != 0 || ALSA_SetIrq( irq & 0xff, uSlotNo, (ulSharedFlag & SA_SHIRQ) != 0) ) { 103 pSlot->flHandlers |= 1 << u; 104 return 0; 105 } 106 107 break; 108 } 109 } 110 } 111 112 rprintf(("request_irq: Unable to register irq handler for irq %d", irq & 0xff )); 113 return 1; 117 114 } 118 115 … … 122 119 void free_irq(unsigned int irq, void *userdata) 123 120 { 124 unsigned u; 125 IRQ_SLOT *pSlot; 126 127 if( (pSlot = FindSlot(irq)) != NULL ) 128 { 129 for( u = 0; u < MAX_SHAREDIRQS; u++ ) 130 { 131 if( pSlot->irqHandlers[u].x2 == userdata ) 132 { 133 pSlot->flHandlers &= ~(1 << u); 134 if( pSlot->flHandlers == 0 ) 135 { 136 ALSA_FreeIrq(pSlot->irqNo); 137 pSlot->irqNo = 0; 138 // pSlot->fEOI = 0; 139 } 140 141 pSlot->irqHandlers[u].handler = NULL; 142 pSlot->irqHandlers[u].x0 = 0; 143 pSlot->irqHandlers[u].x1 = NULL; 144 pSlot->irqHandlers[u].x2 = NULL; 145 146 return; 147 148 } 149 } 150 } 121 unsigned u; 122 IRQ_SLOT *pSlot; 123 124 if( (pSlot = FindSlot(irq&0xff)) != NULL ) { 125 for( u = 0; u < MAX_SHAREDIRQS; u++ ) { 126 if( pSlot->irqHandlers[u].x2 == userdata ) { 127 pSlot->flHandlers &= ~(1 << u); 128 if( pSlot->flHandlers == 0 ) { 129 dprintf(("free_irq: irq %d", irq & 0xff )); 130 ALSA_FreeIrq(pSlot->irqNo); 131 pSlot->irqNo = 0; 132 RMDeallocateIRQ(pSlot->hRes); 133 pSlot->hRes = NULL; 134 // pSlot->fEOI = 0; 135 } 136 137 pSlot->irqHandlers[u].handler = NULL; 138 pSlot->irqHandlers[u].x0 = 0; 139 pSlot->irqHandlers[u].x1 = NULL; 140 pSlot->irqHandlers[u].x2 = NULL; 141 142 return; 143 144 } 145 } 146 } 151 147 } 152 148 … … 156 152 void eoi_irq(unsigned int irq) 157 153 { 158 159 160 161 162 163 164 154 /*(void)irq; */ 155 /* 156 IRQ_SLOT *pSlot = FindSlot(irq); 157 158 if( pSlot ) pSlot->fEOI = 1; 159 */ 160 eoiIrq[irq & 0xff]++; 165 161 } 166 162 … … 170 166 BOOL process_interrupt(ULONG ulSlotNo, ULONG *pulIrq) 171 167 { 172 173 174 168 unsigned u; 169 int rc; 170 IRQ_SLOT *pSlot; 175 171 176 172 //dprintf(("enter int proc %d %d",ulSlotNo, *pulIrq)); 177 173 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 174 if(fSuspended) 175 {//If our device is suspended, then we can't receive interrupts, so it must 176 //be for some other device 177 //Don't pass it to the linux handler as the device doesn't respond as expected 178 //when suspended 179 dprintf(("Slot %d IRQ %d suspended",ulSlotNo, *pulIrq)); 180 return FALSE; 181 } 182 183 if( ulSlotNo < MAX_IRQ_SLOTS ) 184 { 185 pSlot = &arSlots[ulSlotNo]; 186 187 for( u = 0; u < MAX_SHAREDIRQS; u++ ) 188 { 189 if(pSlot && pSlot->irqHandlers[u].handler ) 190 { 191 fInInterrupt = TRUE; 196 192 #if 0 197 198 193 rc = pSlot->irqHandlers[u].handler(pSlot->irqNo, 194 pSlot->irqHandlers[u].x2, 0); 199 195 #else 200 201 196 rc = pSlot->irqHandlers[u].handler(pSlot->irqNo, 197 pSlot->irqHandlers[u].x2); 202 198 #endif 203 199 204 205 206 207 200 // HDA Hardware generates controller interrupts and stream interrupts 201 // the uniaud16 driver only cares about stream interrupts. 202 // azx_interrupt in alsa-kernel/pci/hda/hda_intel.c will return rc 2 if 203 // the interrupt is from the controller. There is no need to call uniaud16 208 204 // for these interrupts 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 //pSlot->fEOI = 0;224 225 226 205 if ( rc == 2 ) { 206 fInInterrupt = FALSE; 207 *pulIrq = pSlot->irqNo; 208 eoiIrq[pSlot->irqNo] = 0; 209 return TRUE; 210 } 211 212 if (rc == 1) eoi_irq(pSlot->irqNo); 213 rc = (eoiIrq[pSlot->irqNo] > 0); 214 fInInterrupt = FALSE; 215 216 if( rc /*== 1 || pSlot->fEOI*/ ) { 217 218 *pulIrq = pSlot->irqNo; 219 // pSlot->fEOI = 0; 220 221 //ok, this interrupt was intended for us; notify the 16 bits MMPM/2 driver 222 OSS32_ProcessIRQ(); 227 223 //dprintf(("exit(1) int proc %d %d",ulSlotNo, *pulIrq)); 228 229 230 231 232 233 224 eoiIrq[pSlot->irqNo] = 0; 225 return TRUE; 226 } 227 } 228 } 229 } 234 230 //dprintf(("exit(0) int proc %d %d",ulSlotNo, *pulIrq)); 235 231 236 232 return FALSE; 237 233 } 238 234 … … 242 238 int in_interrupt() 243 239 { 244 240 return fInInterrupt; 245 241 } 246 242 … … 250 246 void disable_irq(int irq) 251 247 { 252 253 } 254 255 //****************************************************************************** 256 //****************************************************************************** 257 248 dprintf(("disable_irq %d NOT implemented", irq)); 249 } 250 251 //****************************************************************************** 252 //****************************************************************************** 253
Note:
See TracChangeset
for help on using the changeset viewer.