1 /* 2 * linux/kernel/irq/manage.c 3 * 4 * Copyright (C) 1992, 1998-2006 Linus Torvalds, Ingo Molnar 5 * Copyright (C) 2005-2006 Thomas Gleixner 6 * 7 * This file contains driver APIs to the irq subsystem. 8 */ 9 10 #include <linux/irq.h> 11 #include <linux/module.h> 12 #include <linux/random.h> 13 #include <linux/interrupt.h> 14 15 #include "internals.h" 16 17 #ifdef CONFIG_SMP 18 19 /** 20 * synchronize_irq - wait for pending IRQ handlers (on other CPUs) 21 * @irq: interrupt number to wait for 22 * 23 * This function waits for any pending IRQ handlers for this interrupt 24 * to complete before returning. If you use this function while 25 * holding a resource the IRQ handler may need you will deadlock. 26 * 27 * This function may be called - with care - from IRQ context. 28 */ 29 void synchronize_irq(unsigned int irq) 30 { 31 struct irq_desc *desc = irq_desc + irq; 32 33 if (irq >= NR_IRQS) 34 return; 35 36 while (desc->status & IRQ_INPROGRESS) 37 cpu_relax(); 38 } 39 EXPORT_SYMBOL(synchronize_irq); 40 41 #endif 42 43 /** 44 * disable_irq_nosync - disable an irq without waiting 45 * @irq: Interrupt to disable 46 * 47 * Disable the selected interrupt line. Disables and Enables are 48 * nested. 49 * Unlike disable_irq(), this function does not ensure existing 50 * instances of the IRQ handler have completed before returning. 51 * 52 * This function may be called from IRQ context. 53 */ 54 void disable_irq_nosync(unsigned int irq) 55 { 56 struct irq_desc *desc = irq_desc + irq; 57 unsigned long flags; 58 59 if (irq >= NR_IRQS) 60 return; 61 62 spin_lock_irqsave(&desc->lock, flags); 63 if (!desc->depth++) { 64 desc->status |= IRQ_DISABLED; 65 desc->chip->disable(irq); 66 } 67 spin_unlock_irqrestore(&desc->lock, flags); 68 } 69 EXPORT_SYMBOL(disable_irq_nosync); 70 71 /** 72 * disable_irq - disable an irq and wait for completion 73 * @irq: Interrupt to disable 74 * 75 * Disable the selected interrupt line. Enables and Disables are 76 * nested. 77 * This function waits for any pending IRQ handlers for this interrupt 78 * to complete before returning. If you use this function while 79 * holding a resource the IRQ handler may need you will deadlock. 80 * 81 * This function may be called - with care - from IRQ context. 82 */ 83 void disable_irq(unsigned int irq) 84 { 85 struct irq_desc *desc = irq_desc + irq; 86 87 if (irq >= NR_IRQS) 88 return; 89 90 disable_irq_nosync(irq); 91 if (desc->action) 92 synchronize_irq(irq); 93 } 94 EXPORT_SYMBOL(disable_irq); 95 96 /** 97 * enable_irq - enable handling of an irq 98 * @irq: Interrupt to enable 99 * 100 * Undoes the effect of one call to disable_irq(). If this 101 * matches the last disable, processing of interrupts on this 102 * IRQ line is re-enabled. 103 * 104 * This function may be called from IRQ context. 105 */ 106 void enable_irq(unsigned int irq) 107 { 108 struct irq_desc *desc = irq_desc + irq; 109 unsigned long flags; 110 111 if (irq >= NR_IRQS) 112 return; 113 114 spin_lock_irqsave(&desc->lock, flags); 115 switch (desc->depth) { 116 case 0: 117 printk(KERN_WARNING "Unbalanced enable for IRQ %d\n", irq); 118 WARN_ON(1); 119 break; 120 case 1: { 121 unsigned int status = desc->status & ~IRQ_DISABLED; 122 123 /* Prevent probing on this irq: */ 124 desc->status = status | IRQ_NOPROBE; 125 check_irq_resend(desc, irq); 126 /* fall-through */ 127 } 128 default: 129 desc->depth--; 130 } 131 spin_unlock_irqrestore(&desc->lock, flags); 132 } 133 EXPORT_SYMBOL(enable_irq); 134 135 /** 136 * set_irq_wake - control irq power management wakeup 137 * @irq: interrupt to control 138 * @on: enable/disable power management wakeup 139 * 140 * Enable/disable power management wakeup mode 141 */ 142 int set_irq_wake(unsigned int irq, unsigned int on) 143 { 144 struct irq_desc *desc = irq_desc + irq; 145 unsigned long flags; 146 int ret = -ENXIO; 147 148 spin_lock_irqsave(&desc->lock, flags); 149 if (desc->chip->set_wake) 150 ret = desc->chip->set_wake(irq, on); 151 spin_unlock_irqrestore(&desc->lock, flags); 152 return ret; 153 } 154 EXPORT_SYMBOL(set_irq_wake); 155 156 /* 157 * Internal function that tells the architecture code whether a 158 * particular irq has been exclusively allocated or is available 159 * for driver use. 160 */ 161 int can_request_irq(unsigned int irq, unsigned long irqflags) 162 { 163 struct irqaction *action; 164 165 if (irq >= NR_IRQS || irq_desc[irq].status & IRQ_NOREQUEST) 166 return 0; 167 168 action = irq_desc[irq].action; 169 if (action) 170 if (irqflags & action->flags & IRQF_SHARED) 171 action = NULL; 172 173 return !action; 174 } 175 176 void compat_irq_chip_set_default_handler(struct irq_desc *desc) 177 { 178 /* 179 * If the architecture still has not overriden 180 * the flow handler then zap the default. This 181 * should catch incorrect flow-type setting. 182 */ 183 if (desc->handle_irq == &handle_bad_irq) 184 desc->handle_irq = NULL; 185 } 186 187 /* 188 * Internal function to register an irqaction - typically used to 189 * allocate special interrupts that are part of the architecture. 190 */ 191 int setup_irq(unsigned int irq, struct irqaction *new) 192 { 193 struct irq_desc *desc = irq_desc + irq; 194 struct irqaction *old, **p; 195 unsigned long flags; 196 int shared = 0; 197 198 if (irq >= NR_IRQS) 199 return -EINVAL; 200 201 if (desc->chip == &no_irq_chip) 202 return -ENOSYS; 203 /* 204 * Some drivers like serial.c use request_irq() heavily, 205 * so we have to be careful not to interfere with a 206 * running system. 207 */ 208 if (new->flags & IRQF_SAMPLE_RANDOM) { 209 /* 210 * This function might sleep, we want to call it first, 211 * outside of the atomic block. 212 * Yes, this might clear the entropy pool if the wrong 213 * driver is attempted to be loaded, without actually 214 * installing a new handler, but is this really a problem, 215 * only the sysadmin is able to do this. 216 */ 217 rand_initialize_irq(irq); 218 } 219 220 /* 221 * The following block of code has to be executed atomically 222 */ 223 spin_lock_irqsave(&desc->lock, flags); 224 p = &desc->action; 225 old = *p; 226 if (old) { 227 /* 228 * Can't share interrupts unless both agree to and are 229 * the same type (level, edge, polarity). So both flag 230 * fields must have IRQF_SHARED set and the bits which 231 * set the trigger type must match. 232 */ 233 if (!((old->flags & new->flags) & IRQF_SHARED) || 234 ((old->flags ^ new->flags) & IRQF_TRIGGER_MASK)) 235 goto mismatch; 236 237 #if defined(CONFIG_IRQ_PER_CPU) 238 /* All handlers must agree on per-cpuness */ 239 if ((old->flags & IRQF_PERCPU) != 240 (new->flags & IRQF_PERCPU)) 241 goto mismatch; 242 #endif 243 244 /* add new interrupt at end of irq queue */ 245 do { 246 p = &old->next; 247 old = *p; 248 } while (old); 249 shared = 1; 250 } 251 252 *p = new; 253 #if defined(CONFIG_IRQ_PER_CPU) 254 if (new->flags & IRQF_PERCPU) 255 desc->status |= IRQ_PER_CPU; 256 #endif 257 if (!shared) { 258 irq_chip_set_defaults(desc->chip); 259 260 /* Setup the type (level, edge polarity) if configured: */ 261 if (new->flags & IRQF_TRIGGER_MASK) { 262 if (desc->chip && desc->chip->set_type) 263 desc->chip->set_type(irq, 264 new->flags & IRQF_TRIGGER_MASK); 265 else 266 /* 267 * IRQF_TRIGGER_* but the PIC does not support 268 * multiple flow-types? 269 */ 270 printk(KERN_WARNING "No IRQF_TRIGGER set_type " 271 "function for IRQ %d (%s)\n", irq, 272 desc->chip ? desc->chip->name : 273 "unknown"); 274 } else 275 compat_irq_chip_set_default_handler(desc); 276 277 desc->status &= ~(IRQ_AUTODETECT | IRQ_WAITING | 278 IRQ_INPROGRESS); 279 280 if (!(desc->status & IRQ_NOAUTOEN)) { 281 desc->depth = 0; 282 desc->status &= ~IRQ_DISABLED; 283 if (desc->chip->startup) 284 desc->chip->startup(irq); 285 else 286 desc->chip->enable(irq); 287 } else 288 /* Undo nested disables: */ 289 desc->depth = 1; 290 } 291 spin_unlock_irqrestore(&desc->lock, flags); 292 293 new->irq = irq; 294 register_irq_proc(irq); 295 new->dir = NULL; 296 register_handler_proc(irq, new); 297 298 return 0; 299 300 mismatch: 301 spin_unlock_irqrestore(&desc->lock, flags); 302 if (!(new->flags & IRQF_PROBE_SHARED)) { 303 printk(KERN_ERR "IRQ handler type mismatch for IRQ %d\n", irq); 304 dump_stack(); 305 } 306 return -EBUSY; 307 } 308 309 /** 310 * free_irq - free an interrupt 311 * @irq: Interrupt line to free 312 * @dev_id: Device identity to free 313 * 314 * Remove an interrupt handler. The handler is removed and if the 315 * interrupt line is no longer in use by any driver it is disabled. 316 * On a shared IRQ the caller must ensure the interrupt is disabled 317 * on the card it drives before calling this function. The function 318 * does not return until any executing interrupts for this IRQ 319 * have completed. 320 * 321 * This function must not be called from interrupt context. 322 */ 323 void free_irq(unsigned int irq, void *dev_id) 324 { 325 struct irq_desc *desc; 326 struct irqaction **p; 327 unsigned long flags; 328 329 WARN_ON(in_interrupt()); 330 if (irq >= NR_IRQS) 331 return; 332 333 desc = irq_desc + irq; 334 spin_lock_irqsave(&desc->lock, flags); 335 p = &desc->action; 336 for (;;) { 337 struct irqaction *action = *p; 338 339 if (action) { 340 struct irqaction **pp = p; 341 342 p = &action->next; 343 if (action->dev_id != dev_id) 344 continue; 345 346 /* Found it - now remove it from the list of entries */ 347 *pp = action->next; 348 349 /* Currently used only by UML, might disappear one day.*/ 350 #ifdef CONFIG_IRQ_RELEASE_METHOD 351 if (desc->chip->release) 352 desc->chip->release(irq, dev_id); 353 #endif 354 355 if (!desc->action) { 356 desc->status |= IRQ_DISABLED; 357 if (desc->chip->shutdown) 358 desc->chip->shutdown(irq); 359 else 360 desc->chip->disable(irq); 361 } 362 spin_unlock_irqrestore(&desc->lock, flags); 363 unregister_handler_proc(irq, action); 364 365 /* Make sure it's not being used on another CPU */ 366 synchronize_irq(irq); 367 kfree(action); 368 return; 369 } 370 printk(KERN_ERR "Trying to free already-free IRQ %d\n", irq); 371 spin_unlock_irqrestore(&desc->lock, flags); 372 return; 373 } 374 } 375 EXPORT_SYMBOL(free_irq); 376 377 /** 378 * request_irq - allocate an interrupt line 379 * @irq: Interrupt line to allocate 380 * @handler: Function to be called when the IRQ occurs 381 * @irqflags: Interrupt type flags 382 * @devname: An ascii name for the claiming device 383 * @dev_id: A cookie passed back to the handler function 384 * 385 * This call allocates interrupt resources and enables the 386 * interrupt line and IRQ handling. From the point this 387 * call is made your handler function may be invoked. Since 388 * your handler function must clear any interrupt the board 389 * raises, you must take care both to initialise your hardware 390 * and to set up the interrupt handler in the right order. 391 * 392 * Dev_id must be globally unique. Normally the address of the 393 * device data structure is used as the cookie. Since the handler 394 * receives this value it makes sense to use it. 395 * 396 * If your interrupt is shared you must pass a non NULL dev_id 397 * as this is required when freeing the interrupt. 398 * 399 * Flags: 400 * 401 * IRQF_SHARED Interrupt is shared 402 * IRQF_DISABLED Disable local interrupts while processing 403 * IRQF_SAMPLE_RANDOM The interrupt can be used for entropy 404 * 405 */ 406 int request_irq(unsigned int irq, 407 irqreturn_t (*handler)(int, void *, struct pt_regs *), 408 unsigned long irqflags, const char *devname, void *dev_id) 409 { 410 struct irqaction *action; 411 int retval; 412 413 #ifdef CONFIG_LOCKDEP 414 /* 415 * Lockdep wants atomic interrupt handlers: 416 */ 417 irqflags |= SA_INTERRUPT; 418 #endif 419 /* 420 * Sanity-check: shared interrupts must pass in a real dev-ID, 421 * otherwise we'll have trouble later trying to figure out 422 * which interrupt is which (messes up the interrupt freeing 423 * logic etc). 424 */ 425 if ((irqflags & IRQF_SHARED) && !dev_id) 426 return -EINVAL; 427 if (irq >= NR_IRQS) 428 return -EINVAL; 429 if (irq_desc[irq].status & IRQ_NOREQUEST) 430 return -EINVAL; 431 if (!handler) 432 return -EINVAL; 433 434 action = kmalloc(sizeof(struct irqaction), GFP_ATOMIC); 435 if (!action) 436 return -ENOMEM; 437 438 action->handler = handler; 439 action->flags = irqflags; 440 cpus_clear(action->mask); 441 action->name = devname; 442 action->next = NULL; 443 action->dev_id = dev_id; 444 445 select_smp_affinity(irq); 446 447 retval = setup_irq(irq, action); 448 if (retval) 449 kfree(action); 450 451 return retval; 452 } 453 EXPORT_SYMBOL(request_irq); 454 455