diff options
Diffstat (limited to 'arch/arm/mach-omap2/omap_l3_smx.c')
-rw-r--r-- | arch/arm/mach-omap2/omap_l3_smx.c | 91 |
1 files changed, 44 insertions, 47 deletions
diff --git a/arch/arm/mach-omap2/omap_l3_smx.c b/arch/arm/mach-omap2/omap_l3_smx.c index 873c0e33b512..a05a62f9ee5b 100644 --- a/arch/arm/mach-omap2/omap_l3_smx.c +++ b/arch/arm/mach-omap2/omap_l3_smx.c | |||
@@ -1,26 +1,26 @@ | |||
1 | /* | 1 | /* |
2 | * OMAP3XXX L3 Interconnect Driver | 2 | * OMAP3XXX L3 Interconnect Driver |
3 | * | 3 | * |
4 | * Copyright (C) 2011 Texas Corporation | 4 | * Copyright (C) 2011 Texas Corporation |
5 | * Felipe Balbi <balbi@ti.com> | 5 | * Felipe Balbi <balbi@ti.com> |
6 | * Santosh Shilimkar <santosh.shilimkar@ti.com> | 6 | * Santosh Shilimkar <santosh.shilimkar@ti.com> |
7 | * Sricharan <r.sricharan@ti.com> | 7 | * Sricharan <r.sricharan@ti.com> |
8 | * | 8 | * |
9 | * This program is free software; you can redistribute it and/or modify | 9 | * This program is free software; you can redistribute it and/or modify |
10 | * it under the terms of the GNU General Public License as published by | 10 | * it under the terms of the GNU General Public License as published by |
11 | * the Free Software Foundation; either version 2 of the License, or | 11 | * the Free Software Foundation; either version 2 of the License, or |
12 | * (at your option) any later version. | 12 | * (at your option) any later version. |
13 | * | 13 | * |
14 | * This program is distributed in the hope that it will be useful, | 14 | * This program is distributed in the hope that it will be useful, |
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17 | * GNU General Public License for more details. | 17 | * GNU General Public License for more details. |
18 | * | 18 | * |
19 | * You should have received a copy of the GNU General Public License | 19 | * You should have received a copy of the GNU General Public License |
20 | * along with this program; if not, write to the Free Software | 20 | * along with this program; if not, write to the Free Software |
21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | 21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
22 | * USA | 22 | * USA |
23 | */ | 23 | */ |
24 | 24 | ||
25 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
26 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
@@ -135,7 +135,7 @@ static char *omap3_l3_initiator_string(u8 initid) | |||
135 | } | 135 | } |
136 | } | 136 | } |
137 | 137 | ||
138 | /** | 138 | /* |
139 | * omap3_l3_block_irq - handles a register block's irq | 139 | * omap3_l3_block_irq - handles a register block's irq |
140 | * @l3: struct omap3_l3 * | 140 | * @l3: struct omap3_l3 * |
141 | * @base: register block base address | 141 | * @base: register block base address |
@@ -150,30 +150,29 @@ static char *omap3_l3_initiator_string(u8 initid) | |||
150 | static irqreturn_t omap3_l3_block_irq(struct omap3_l3 *l3, | 150 | static irqreturn_t omap3_l3_block_irq(struct omap3_l3 *l3, |
151 | u64 error, int error_addr) | 151 | u64 error, int error_addr) |
152 | { | 152 | { |
153 | u8 code = omap3_l3_decode_error_code(error); | 153 | u8 code = omap3_l3_decode_error_code(error); |
154 | u8 initid = omap3_l3_decode_initid(error); | 154 | u8 initid = omap3_l3_decode_initid(error); |
155 | u8 multi = error & L3_ERROR_LOG_MULTI; | 155 | u8 multi = error & L3_ERROR_LOG_MULTI; |
156 | u32 address = omap3_l3_decode_addr(error_addr); | 156 | u32 address = omap3_l3_decode_addr(error_addr); |
157 | 157 | ||
158 | WARN(true, "%s seen by %s %s at address %x\n", | 158 | WARN(true, "%s seen by %s %s at address %x\n", |
159 | omap3_l3_code_string(code), | 159 | omap3_l3_code_string(code), |
160 | omap3_l3_initiator_string(initid), | 160 | omap3_l3_initiator_string(initid), |
161 | multi ? "Multiple Errors" : "", | 161 | multi ? "Multiple Errors" : "", address); |
162 | address); | ||
163 | 162 | ||
164 | return IRQ_HANDLED; | 163 | return IRQ_HANDLED; |
165 | } | 164 | } |
166 | 165 | ||
167 | static irqreturn_t omap3_l3_app_irq(int irq, void *_l3) | 166 | static irqreturn_t omap3_l3_app_irq(int irq, void *_l3) |
168 | { | 167 | { |
169 | struct omap3_l3 *l3 = _l3; | 168 | struct omap3_l3 *l3 = _l3; |
170 | u64 status, clear; | 169 | u64 status, clear; |
171 | u64 error; | 170 | u64 error; |
172 | u64 error_addr; | 171 | u64 error_addr; |
173 | u64 err_source = 0; | 172 | u64 err_source = 0; |
174 | void __iomem *base; | 173 | void __iomem *base; |
175 | int int_type; | 174 | int int_type; |
176 | irqreturn_t ret = IRQ_NONE; | 175 | irqreturn_t ret = IRQ_NONE; |
177 | 176 | ||
178 | int_type = irq == l3->app_irq ? L3_APPLICATION_ERROR : L3_DEBUG_ERROR; | 177 | int_type = irq == l3->app_irq ? L3_APPLICATION_ERROR : L3_DEBUG_ERROR; |
179 | if (!int_type) { | 178 | if (!int_type) { |
@@ -191,14 +190,12 @@ static irqreturn_t omap3_l3_app_irq(int irq, void *_l3) | |||
191 | } | 190 | } |
192 | 191 | ||
193 | /* identify the error source */ | 192 | /* identify the error source */ |
194 | for (err_source = 0; !(status & (1 << err_source)); err_source++) | 193 | err_source = __ffs(status); |
195 | ; | ||
196 | 194 | ||
197 | base = l3->rt + *(omap3_l3_bases[int_type] + err_source); | 195 | base = l3->rt + omap3_l3_bases[int_type][err_source]; |
198 | error = omap3_l3_readll(base, L3_ERROR_LOG); | 196 | error = omap3_l3_readll(base, L3_ERROR_LOG); |
199 | if (error) { | 197 | if (error) { |
200 | error_addr = omap3_l3_readll(base, L3_ERROR_LOG_ADDR); | 198 | error_addr = omap3_l3_readll(base, L3_ERROR_LOG_ADDR); |
201 | |||
202 | ret |= omap3_l3_block_irq(l3, error, error_addr); | 199 | ret |= omap3_l3_block_irq(l3, error, error_addr); |
203 | } | 200 | } |
204 | 201 | ||
@@ -215,9 +212,9 @@ static irqreturn_t omap3_l3_app_irq(int irq, void *_l3) | |||
215 | 212 | ||
216 | static int __init omap3_l3_probe(struct platform_device *pdev) | 213 | static int __init omap3_l3_probe(struct platform_device *pdev) |
217 | { | 214 | { |
218 | struct omap3_l3 *l3; | 215 | struct omap3_l3 *l3; |
219 | struct resource *res; | 216 | struct resource *res; |
220 | int ret; | 217 | int ret; |
221 | 218 | ||
222 | l3 = kzalloc(sizeof(*l3), GFP_KERNEL); | 219 | l3 = kzalloc(sizeof(*l3), GFP_KERNEL); |
223 | if (!l3) | 220 | if (!l3) |