Commit 83161bf9 authored by Anton Blanchard's avatar Anton Blanchard Committed by Paul Mackerras

merge some irq.c fixes from x86

parent d411a891
...@@ -137,6 +137,8 @@ inline void synchronize_irq(unsigned int irq) ...@@ -137,6 +137,8 @@ inline void synchronize_irq(unsigned int irq)
cpu_relax(); cpu_relax();
} }
EXPORT_SYMBOL(synchronize_irq);
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
/* XXX Make this into free_irq() - Anton */ /* XXX Make this into free_irq() - Anton */
...@@ -241,7 +243,7 @@ EXPORT_SYMBOL(free_irq); ...@@ -241,7 +243,7 @@ EXPORT_SYMBOL(free_irq);
* This function may be called from IRQ context. * This function may be called from IRQ context.
*/ */
void disable_irq_nosync(unsigned int irq) inline void disable_irq_nosync(unsigned int irq)
{ {
irq_desc_t *desc = irq_desc + irq; irq_desc_t *desc = irq_desc + irq;
unsigned long flags; unsigned long flags;
...@@ -255,6 +257,8 @@ EXPORT_SYMBOL(free_irq); ...@@ -255,6 +257,8 @@ EXPORT_SYMBOL(free_irq);
spin_unlock_irqrestore(&desc->lock, flags); spin_unlock_irqrestore(&desc->lock, flags);
} }
EXPORT_SYMBOL(disable_irq_nosync);
/** /**
* disable_irq - disable an irq and wait for completion * disable_irq - disable an irq and wait for completion
* @irq: Interrupt to disable * @irq: Interrupt to disable
...@@ -276,6 +280,8 @@ void disable_irq(unsigned int irq) ...@@ -276,6 +280,8 @@ void disable_irq(unsigned int irq)
synchronize_irq(irq); synchronize_irq(irq);
} }
EXPORT_SYMBOL(disable_irq);
/** /**
* enable_irq - enable interrupt handling on an irq * enable_irq - enable interrupt handling on an irq
* @irq: Interrupt to enable * @irq: Interrupt to enable
...@@ -307,11 +313,14 @@ void enable_irq(unsigned int irq) ...@@ -307,11 +313,14 @@ void enable_irq(unsigned int irq)
desc->depth--; desc->depth--;
break; break;
case 0: case 0:
printk("enable_irq(%u) unbalanced\n", irq); printk("enable_irq(%u) unbalanced from %p\n", irq,
__builtin_return_address(0));
} }
spin_unlock_irqrestore(&desc->lock, flags); spin_unlock_irqrestore(&desc->lock, flags);
} }
EXPORT_SYMBOL(enable_irq);
int show_interrupts(struct seq_file *p, void *v) int show_interrupts(struct seq_file *p, void *v)
{ {
int i, j; int i, j;
...@@ -667,7 +676,7 @@ static int irq_affinity_read_proc (char *page, char **start, off_t off, ...@@ -667,7 +676,7 @@ static int irq_affinity_read_proc (char *page, char **start, off_t off,
static unsigned int parse_hex_value (const char *buffer, static unsigned int parse_hex_value (const char *buffer,
unsigned long count, cpumask_t *ret) unsigned long count, cpumask_t *ret)
{ {
unsigned char hexnum [HEX_DIGITS]; unsigned char hexnum[HEX_DIGITS];
cpumask_t value = CPU_MASK_NONE; cpumask_t value = CPU_MASK_NONE;
int i; int i;
...@@ -679,7 +688,7 @@ static unsigned int parse_hex_value (const char *buffer, ...@@ -679,7 +688,7 @@ static unsigned int parse_hex_value (const char *buffer,
return -EFAULT; return -EFAULT;
/* /*
* Parse the first 16 characters as a hex string, any non-hex char * Parse the first HEX_DIGITS characters as a hex string, any non-hex char
* is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same. * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
*/ */
...@@ -698,7 +707,6 @@ static unsigned int parse_hex_value (const char *buffer, ...@@ -698,7 +707,6 @@ static unsigned int parse_hex_value (const char *buffer,
for (k = 0; k < 4; ++k) for (k = 0; k < 4; ++k)
if (test_bit(k, (unsigned long *)&c)) if (test_bit(k, (unsigned long *)&c))
cpu_set(k, value); cpu_set(k, value);
} }
out: out:
*ret = value; *ret = value;
...@@ -715,6 +723,8 @@ static int irq_affinity_write_proc (struct file *file, const char *buffer, ...@@ -715,6 +723,8 @@ static int irq_affinity_write_proc (struct file *file, const char *buffer,
return -EIO; return -EIO;
err = parse_hex_value(buffer, count, &new_value); err = parse_hex_value(buffer, count, &new_value);
if (err)
return err;
/* /*
* Do not allow disabling IRQs completely - it's a too easy * Do not allow disabling IRQs completely - it's a too easy
...@@ -740,7 +750,7 @@ static int prof_cpu_mask_read_proc (char *page, char **start, off_t off, ...@@ -740,7 +750,7 @@ static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
return sprintf (page, "%08lx\n", *mask); return sprintf (page, "%08lx\n", *mask);
} }
static int prof_cpu_mask_write_proc (struct file *file, const char *buffer, static int prof_cpu_mask_write_proc (struct file *file, const char __user *buffer,
unsigned long count, void *data) unsigned long count, void *data)
{ {
cpumask_t *mask = (cpumask_t *)data; cpumask_t *mask = (cpumask_t *)data;
...@@ -788,10 +798,12 @@ static void register_irq_proc (unsigned int irq) ...@@ -788,10 +798,12 @@ static void register_irq_proc (unsigned int irq)
/* create /proc/irq/1234/smp_affinity */ /* create /proc/irq/1234/smp_affinity */
entry = create_proc_entry("smp_affinity", 0600, irq_dir[irq]); entry = create_proc_entry("smp_affinity", 0600, irq_dir[irq]);
entry->nlink = 1; if (entry) {
entry->data = (void *)(long)irq; entry->nlink = 1;
entry->read_proc = irq_affinity_read_proc; entry->data = (void *)(long)irq;
entry->write_proc = irq_affinity_write_proc; entry->read_proc = irq_affinity_read_proc;
entry->write_proc = irq_affinity_write_proc;
}
smp_affinity_entry[irq] = entry; smp_affinity_entry[irq] = entry;
} }
...@@ -809,6 +821,9 @@ void init_irq_proc (void) ...@@ -809,6 +821,9 @@ void init_irq_proc (void)
/* create /proc/irq/prof_cpu_mask */ /* create /proc/irq/prof_cpu_mask */
entry = create_proc_entry("prof_cpu_mask", 0600, root_irq_dir); entry = create_proc_entry("prof_cpu_mask", 0600, root_irq_dir);
if (!entry)
return;
entry->nlink = 1; entry->nlink = 1;
entry->data = (void *)&prof_cpu_mask; entry->data = (void *)&prof_cpu_mask;
entry->read_proc = prof_cpu_mask_read_proc; entry->read_proc = prof_cpu_mask_read_proc;
......
...@@ -57,12 +57,6 @@ extern struct pci_dev * iSeries_vio_dev; ...@@ -57,12 +57,6 @@ extern struct pci_dev * iSeries_vio_dev;
EXPORT_SYMBOL(do_signal); EXPORT_SYMBOL(do_signal);
EXPORT_SYMBOL(sys_ioctl); EXPORT_SYMBOL(sys_ioctl);
EXPORT_SYMBOL(enable_irq);
EXPORT_SYMBOL(disable_irq);
EXPORT_SYMBOL(disable_irq_nosync);
#ifdef CONFIG_SMP
EXPORT_SYMBOL(synchronize_irq);
#endif /* CONFIG_SMP */
EXPORT_SYMBOL(isa_io_base); EXPORT_SYMBOL(isa_io_base);
EXPORT_SYMBOL(pci_io_base); EXPORT_SYMBOL(pci_io_base);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment