Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit af575e2d authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mattst88/alpha-2.6:
  alpha: fix WARN_ON in __local_bh_enable()
  alpha: fix breakage caused by df9ee292
  alpha: add GENERIC_HARDIRQS_NO__DO_IRQ to Kconfig
  alpha/osf_sys: remove unused MAX_SELECT_SECONDS
  alpha: change to new Makefile flag variables
  alpha: kill off alpha_do_IRQ
  alpha: irq clean up
  alpha: use set_irq_chip and push down __do_IRQ to the machine types
parents 584ef2cd f5de6ecc
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -68,6 +68,9 @@ config GENERIC_IOMAP
	bool
	bool
	default n
	default n


config GENERIC_HARDIRQS_NO__DO_IRQ
	def_bool y

config GENERIC_HARDIRQS
config GENERIC_HARDIRQS
	bool
	bool
	default y
	default y
+5 −3
Original line number Original line Diff line number Diff line
@@ -37,8 +37,9 @@
 */
 */
extern inline void __set_hae(unsigned long new_hae)
extern inline void __set_hae(unsigned long new_hae)
{
{
	unsigned long flags;
	unsigned long flags = swpipl(IPL_MAX);
	local_irq_save(flags);

	barrier();


	alpha_mv.hae_cache = new_hae;
	alpha_mv.hae_cache = new_hae;
	*alpha_mv.hae_register = new_hae;
	*alpha_mv.hae_register = new_hae;
@@ -46,7 +47,8 @@ extern inline void __set_hae(unsigned long new_hae)
	/* Re-read to make sure it was written.  */
	/* Re-read to make sure it was written.  */
	new_hae = *alpha_mv.hae_register;
	new_hae = *alpha_mv.hae_register;


	local_irq_restore(flags);
	setipl(flags);
	barrier();
}
}


extern inline void set_hae(unsigned long new_hae)
extern inline void set_hae(unsigned long new_hae)
+2 −2
Original line number Original line Diff line number Diff line
@@ -3,8 +3,8 @@
#
#


extra-y		:= head.o vmlinux.lds
extra-y		:= head.o vmlinux.lds
EXTRA_AFLAGS	:= $(KBUILD_CFLAGS)
asflags-y	:= $(KBUILD_CFLAGS)
EXTRA_CFLAGS	:= -Werror -Wno-sign-compare
ccflags-y	:= -Werror -Wno-sign-compare


obj-y    := entry.o traps.o process.o init_task.o osf_sys.o irq.o \
obj-y    := entry.o traps.o process.o init_task.o osf_sys.o irq.o \
	    irq_alpha.o signal.o setup.o ptrace.o time.o \
	    irq_alpha.o signal.o setup.o ptrace.o time.o \
+20 −11
Original line number Original line Diff line number Diff line
@@ -44,10 +44,11 @@ static char irq_user_affinity[NR_IRQS];


int irq_select_affinity(unsigned int irq)
int irq_select_affinity(unsigned int irq)
{
{
	struct irq_desc *desc = irq_to_desc[irq];
	static int last_cpu;
	static int last_cpu;
	int cpu = last_cpu + 1;
	int cpu = last_cpu + 1;


	if (!irq_desc[irq].chip->set_affinity || irq_user_affinity[irq])
	if (!desc || !get_irq_desc_chip(desc)->set_affinity || irq_user_affinity[irq])
		return 1;
		return 1;


	while (!cpu_possible(cpu) ||
	while (!cpu_possible(cpu) ||
@@ -55,8 +56,8 @@ int irq_select_affinity(unsigned int irq)
		cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0);
		cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0);
	last_cpu = cpu;
	last_cpu = cpu;


	cpumask_copy(irq_desc[irq].affinity, cpumask_of(cpu));
	cpumask_copy(desc->affinity, cpumask_of(cpu));
	irq_desc[irq].chip->set_affinity(irq, cpumask_of(cpu));
	get_irq_desc_chip(desc)->set_affinity(irq, cpumask_of(cpu));
	return 0;
	return 0;
}
}
#endif /* CONFIG_SMP */
#endif /* CONFIG_SMP */
@@ -67,6 +68,7 @@ show_interrupts(struct seq_file *p, void *v)
	int j;
	int j;
	int irq = *(loff_t *) v;
	int irq = *(loff_t *) v;
	struct irqaction * action;
	struct irqaction * action;
	struct irq_desc *desc;
	unsigned long flags;
	unsigned long flags;


#ifdef CONFIG_SMP
#ifdef CONFIG_SMP
@@ -79,8 +81,13 @@ show_interrupts(struct seq_file *p, void *v)
#endif
#endif


	if (irq < ACTUAL_NR_IRQS) {
	if (irq < ACTUAL_NR_IRQS) {
		raw_spin_lock_irqsave(&irq_desc[irq].lock, flags);
		desc = irq_to_desc(irq);
		action = irq_desc[irq].action;

		if (!desc)
			return 0;

		raw_spin_lock_irqsave(&desc->lock, flags);
		action = desc->action;
		if (!action) 
		if (!action) 
			goto unlock;
			goto unlock;
		seq_printf(p, "%3d: ", irq);
		seq_printf(p, "%3d: ", irq);
@@ -90,7 +97,7 @@ show_interrupts(struct seq_file *p, void *v)
		for_each_online_cpu(j)
		for_each_online_cpu(j)
			seq_printf(p, "%10u ", kstat_irqs_cpu(irq, j));
			seq_printf(p, "%10u ", kstat_irqs_cpu(irq, j));
#endif
#endif
		seq_printf(p, " %14s", irq_desc[irq].chip->name);
		seq_printf(p, " %14s", get_irq_desc_chip(desc)->name);
		seq_printf(p, "  %c%s",
		seq_printf(p, "  %c%s",
			(action->flags & IRQF_DISABLED)?'+':' ',
			(action->flags & IRQF_DISABLED)?'+':' ',
			action->name);
			action->name);
@@ -103,7 +110,7 @@ show_interrupts(struct seq_file *p, void *v)


		seq_putc(p, '\n');
		seq_putc(p, '\n');
unlock:
unlock:
		raw_spin_unlock_irqrestore(&irq_desc[irq].lock, flags);
		raw_spin_unlock_irqrestore(&desc->lock, flags);
	} else if (irq == ACTUAL_NR_IRQS) {
	} else if (irq == ACTUAL_NR_IRQS) {
#ifdef CONFIG_SMP
#ifdef CONFIG_SMP
		seq_puts(p, "IPI: ");
		seq_puts(p, "IPI: ");
@@ -142,8 +149,10 @@ handle_irq(int irq)
	 * handled by some other CPU. (or is disabled)
	 * handled by some other CPU. (or is disabled)
	 */
	 */
	static unsigned int illegal_count=0;
	static unsigned int illegal_count=0;
	struct irq_desc *desc = irq_to_desc(irq);
	
	
	if ((unsigned) irq > ACTUAL_NR_IRQS && illegal_count < MAX_ILLEGAL_IRQS ) {
	if (!desc || ((unsigned) irq > ACTUAL_NR_IRQS &&
	    illegal_count < MAX_ILLEGAL_IRQS)) {
		irq_err_count++;
		irq_err_count++;
		illegal_count++;
		illegal_count++;
		printk(KERN_CRIT "device_interrupt: invalid interrupt %d\n",
		printk(KERN_CRIT "device_interrupt: invalid interrupt %d\n",
@@ -151,14 +160,14 @@ handle_irq(int irq)
		return;
		return;
	}
	}


	irq_enter();
	/*
	/*
	 * __do_IRQ() must be called with IPL_MAX. Note that we do not
	 * From here we must proceed with IPL_MAX. Note that we do not
	 * explicitly enable interrupts afterwards - some MILO PALcode
	 * explicitly enable interrupts afterwards - some MILO PALcode
	 * (namely LX164 one) seems to have severe problems with RTI
	 * (namely LX164 one) seems to have severe problems with RTI
	 * at IPL 0.
	 * at IPL 0.
	 */
	 */
	local_irq_disable();
	local_irq_disable();
	__do_IRQ(irq);
	irq_enter();
	generic_handle_irq_desc(irq, desc);
	irq_exit();
	irq_exit();
}
}
+8 −16
Original line number Original line Diff line number Diff line
@@ -219,32 +219,24 @@ process_mcheck_info(unsigned long vector, unsigned long la_ptr,
 * processed by PALcode, and comes in via entInt vector 1.
 * processed by PALcode, and comes in via entInt vector 1.
 */
 */


static void rtc_enable_disable(unsigned int irq) { }
static unsigned int rtc_startup(unsigned int irq) { return 0; }

struct irqaction timer_irqaction = {
struct irqaction timer_irqaction = {
	.handler	= timer_interrupt,
	.handler	= timer_interrupt,
	.flags		= IRQF_DISABLED,
	.flags		= IRQF_DISABLED,
	.name		= "timer",
	.name		= "timer",
};
};


static struct irq_chip rtc_irq_type = {
	.name		= "RTC",
	.startup	= rtc_startup,
	.shutdown	= rtc_enable_disable,
	.enable		= rtc_enable_disable,
	.disable	= rtc_enable_disable,
	.ack		= rtc_enable_disable,
	.end		= rtc_enable_disable,
};

void __init
void __init
init_rtc_irq(void)
init_rtc_irq(void)
{
{
	irq_desc[RTC_IRQ].status = IRQ_DISABLED;
	struct irq_desc *desc = irq_to_desc(RTC_IRQ);
	irq_desc[RTC_IRQ].chip = &rtc_irq_type;

	if (desc) {
		desc->status |= IRQ_DISABLED;
		set_irq_chip_and_handler_name(RTC_IRQ, &no_irq_chip,
			handle_simple_irq, "RTC");
		setup_irq(RTC_IRQ, &timer_irqaction);
		setup_irq(RTC_IRQ, &timer_irqaction);
	}
	}
}


/* Dummy irqactions.  */
/* Dummy irqactions.  */
struct irqaction isa_cascade_irqaction = {
struct irqaction isa_cascade_irqaction = {
Loading