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