Path: blob/master/arch/mips/powertv/asic/irq_asic.c
10818 views
/*1* Portions copyright (C) 2005-2009 Scientific Atlanta2* Portions copyright (C) 2009 Cisco Systems, Inc.3*4* Modified from arch/mips/kernel/irq-rm7000.c:5* Copyright (C) 2003 Ralf Baechle6*7* This program is free software; you can redistribute it and/or modify it8* under the terms of the GNU General Public License as published by the9* Free Software Foundation; either version 2 of the License, or (at your10* option) any later version.11*/12#include <linux/init.h>13#include <linux/interrupt.h>14#include <linux/kernel.h>15#include <linux/irq.h>1617#include <asm/irq_cpu.h>18#include <asm/mipsregs.h>19#include <asm/system.h>2021#include <asm/mach-powertv/asic_regs.h>2223static inline void unmask_asic_irq(struct irq_data *d)24{25unsigned long enable_bit;26unsigned int irq = d->irq;2728enable_bit = (1 << (irq & 0x1f));2930switch (irq >> 5) {31case 0:32asic_write(asic_read(ien_int_0) | enable_bit, ien_int_0);33break;34case 1:35asic_write(asic_read(ien_int_1) | enable_bit, ien_int_1);36break;37case 2:38asic_write(asic_read(ien_int_2) | enable_bit, ien_int_2);39break;40case 3:41asic_write(asic_read(ien_int_3) | enable_bit, ien_int_3);42break;43default:44BUG();45}46}4748static inline void mask_asic_irq(struct irq_data *d)49{50unsigned long disable_mask;51unsigned int irq = d->irq;5253disable_mask = ~(1 << (irq & 0x1f));5455switch (irq >> 5) {56case 0:57asic_write(asic_read(ien_int_0) & disable_mask, ien_int_0);58break;59case 1:60asic_write(asic_read(ien_int_1) & disable_mask, ien_int_1);61break;62case 2:63asic_write(asic_read(ien_int_2) & disable_mask, ien_int_2);64break;65case 3:66asic_write(asic_read(ien_int_3) & disable_mask, ien_int_3);67break;68default:69BUG();70}71}7273static struct irq_chip asic_irq_chip = {74.name = "ASIC Level",75.irq_mask = mask_asic_irq,76.irq_unmask = unmask_asic_irq,77};7879void __init asic_irq_init(void)80{81int i;8283/* set priority to 0 */84write_c0_status(read_c0_status() & ~(0x0000fc00));8586asic_write(0, ien_int_0);87asic_write(0, ien_int_1);88asic_write(0, ien_int_2);89asic_write(0, ien_int_3);9091asic_write(0x0fffffff, int_level_3_3);92asic_write(0xffffffff, int_level_3_2);93asic_write(0xffffffff, int_level_3_1);94asic_write(0xffffffff, int_level_3_0);95asic_write(0xffffffff, int_level_2_3);96asic_write(0xffffffff, int_level_2_2);97asic_write(0xffffffff, int_level_2_1);98asic_write(0xffffffff, int_level_2_0);99asic_write(0xffffffff, int_level_1_3);100asic_write(0xffffffff, int_level_1_2);101asic_write(0xffffffff, int_level_1_1);102asic_write(0xffffffff, int_level_1_0);103asic_write(0xffffffff, int_level_0_3);104asic_write(0xffffffff, int_level_0_2);105asic_write(0xffffffff, int_level_0_1);106asic_write(0xffffffff, int_level_0_0);107108asic_write(0xf, int_int_scan);109110/*111* Initialize interrupt handlers.112*/113for (i = 0; i < NR_IRQS; i++)114irq_set_chip_and_handler(i, &asic_irq_chip, handle_level_irq);115}116117118