Blame view
arch/arm/mach-tegra/irq.c
4.1 KB
5ad36c5f0 [ARM] tegra: Add ... |
1 2 3 4 5 6 |
/* * Copyright (C) 2010 Google, Inc. * * Author: * Colin Cross <ccross@google.com> * |
460907bc2 [ARM] tegra: add ... |
7 8 |
* Copyright (C) 2010, NVIDIA Corporation * |
5ad36c5f0 [ARM] tegra: Add ... |
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
* This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and * may be copied, distributed, and modified under those terms. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include <linux/kernel.h> #include <linux/init.h> #include <linux/interrupt.h> #include <linux/irq.h> #include <linux/io.h> #include <asm/hardware/gic.h> #include <mach/iomap.h> #include "board.h" |
460907bc2 [ARM] tegra: add ... |
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
#define INT_SYS_NR (INT_GPIO_BASE - INT_PRI_BASE) #define INT_SYS_SZ (INT_SEC_BASE - INT_PRI_BASE) #define PPI_NR ((INT_SYS_NR+INT_SYS_SZ-1)/INT_SYS_SZ) #define APBDMA_IRQ_STA_CPU 0x14 #define APBDMA_IRQ_MASK_SET 0x20 #define APBDMA_IRQ_MASK_CLR 0x24 #define ICTLR_CPU_IER 0x20 #define ICTLR_CPU_IER_SET 0x24 #define ICTLR_CPU_IER_CLR 0x28 #define ICTLR_CPU_IEP_CLASS 0x2c #define ICTLR_COP_IER 0x30 #define ICTLR_COP_IER_SET 0x34 #define ICTLR_COP_IER_CLR 0x38 #define ICTLR_COP_IEP_CLASS 0x3c static void (*gic_mask_irq)(unsigned int irq); static void (*gic_unmask_irq)(unsigned int irq); #define irq_to_ictlr(irq) (((irq)-32) >> 5) static void __iomem *tegra_ictlr_base = IO_ADDRESS(TEGRA_PRIMARY_ICTLR_BASE); #define ictlr_to_virt(ictlr) (tegra_ictlr_base + (ictlr)*0x100) static void tegra_mask(unsigned int irq) { void __iomem *addr = ictlr_to_virt(irq_to_ictlr(irq)); gic_mask_irq(irq); writel(1<<(irq&31), addr+ICTLR_CPU_IER_CLR); } static void tegra_unmask(unsigned int irq) { void __iomem *addr = ictlr_to_virt(irq_to_ictlr(irq)); gic_unmask_irq(irq); writel(1<<(irq&31), addr+ICTLR_CPU_IER_SET); } #ifdef CONFIG_PM static int tegra_set_wake(unsigned int irq, unsigned int on) { return 0; } #endif static struct irq_chip tegra_irq = { .name = "PPI", .mask = tegra_mask, .unmask = tegra_unmask, #ifdef CONFIG_PM .set_wake = tegra_set_wake, #endif }; |
5ad36c5f0 [ARM] tegra: Add ... |
85 86 |
void __init tegra_init_irq(void) { |
460907bc2 [ARM] tegra: add ... |
87 88 89 90 91 92 93 |
struct irq_chip *gic; unsigned int i; for (i = 0; i < PPI_NR; i++) { writel(~0, ictlr_to_virt(i) + ICTLR_CPU_IER_CLR); writel(0, ictlr_to_virt(i) + ICTLR_CPU_IEP_CLASS); } |
b580b899d ARM: GIC: provide... |
94 95 |
gic_init(0, 29, IO_ADDRESS(TEGRA_ARM_INT_DIST_BASE), IO_ADDRESS(TEGRA_ARM_PERIF_BASE + 0x100)); |
460907bc2 [ARM] tegra: add ... |
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
gic = get_irq_chip(29); gic_unmask_irq = gic->unmask; gic_mask_irq = gic->mask; tegra_irq.ack = gic->ack; #ifdef CONFIG_SMP tegra_irq.set_affinity = gic->set_affinity; #endif for (i = INT_PRI_BASE; i < INT_GPIO_BASE; i++) { set_irq_chip(i, &tegra_irq); set_irq_handler(i, handle_level_irq); set_irq_flags(i, IRQF_VALID); } } #ifdef CONFIG_PM static u32 cop_ier[PPI_NR]; static u32 cpu_ier[PPI_NR]; static u32 cpu_iep[PPI_NR]; void tegra_irq_suspend(void) { unsigned long flags; int i; for (i = INT_PRI_BASE; i < INT_GPIO_BASE; i++) { struct irq_desc *desc = irq_to_desc(i); if (!desc) continue; if (desc->status & IRQ_WAKEUP) { pr_debug("irq %d is wakeup ", i); continue; } disable_irq(i); } local_irq_save(flags); for (i = 0; i < PPI_NR; i++) { void __iomem *ictlr = ictlr_to_virt(i); cpu_ier[i] = readl(ictlr + ICTLR_CPU_IER); cpu_iep[i] = readl(ictlr + ICTLR_CPU_IEP_CLASS); cop_ier[i] = readl(ictlr + ICTLR_COP_IER); writel(~0, ictlr + ICTLR_COP_IER_CLR); } local_irq_restore(flags); } void tegra_irq_resume(void) { unsigned long flags; int i; local_irq_save(flags); for (i = 0; i < PPI_NR; i++) { void __iomem *ictlr = ictlr_to_virt(i); writel(cpu_iep[i], ictlr + ICTLR_CPU_IEP_CLASS); writel(~0ul, ictlr + ICTLR_CPU_IER_CLR); writel(cpu_ier[i], ictlr + ICTLR_CPU_IER_SET); writel(0, ictlr + ICTLR_COP_IEP_CLASS); writel(~0ul, ictlr + ICTLR_COP_IER_CLR); writel(cop_ier[i], ictlr + ICTLR_COP_IER_SET); } local_irq_restore(flags); for (i = INT_PRI_BASE; i < INT_GPIO_BASE; i++) { struct irq_desc *desc = irq_to_desc(i); if (!desc || (desc->status & IRQ_WAKEUP)) continue; enable_irq(i); } |
5ad36c5f0 [ARM] tegra: Add ... |
168 |
} |
460907bc2 [ARM] tegra: add ... |
169 |
#endif |