diff options
Diffstat (limited to 'arch/powerpc/sysdev/axonram.c')
-rw-r--r-- | arch/powerpc/sysdev/axonram.c | 46 |
1 files changed, 11 insertions, 35 deletions
diff --git a/arch/powerpc/sysdev/axonram.c b/arch/powerpc/sysdev/axonram.c index 2326d5dc5752..ab037a3a40db 100644 --- a/arch/powerpc/sysdev/axonram.c +++ b/arch/powerpc/sysdev/axonram.c | |||
@@ -59,8 +59,7 @@ | |||
59 | struct axon_ram_bank { | 59 | struct axon_ram_bank { |
60 | struct of_device *device; | 60 | struct of_device *device; |
61 | struct gendisk *disk; | 61 | struct gendisk *disk; |
62 | unsigned int irq_correctable; | 62 | unsigned int irq_id; |
63 | unsigned int irq_uncorrectable; | ||
64 | unsigned long ph_addr; | 63 | unsigned long ph_addr; |
65 | unsigned long io_addr; | 64 | unsigned long io_addr; |
66 | unsigned long size; | 65 | unsigned long size; |
@@ -93,16 +92,9 @@ axon_ram_irq_handler(int irq, void *dev) | |||
93 | 92 | ||
94 | BUG_ON(!bank); | 93 | BUG_ON(!bank); |
95 | 94 | ||
96 | if (irq == bank->irq_correctable) { | 95 | dev_err(&device->dev, "Correctable memory error occured\n"); |
97 | dev_err(&device->dev, "Correctable memory error occured\n"); | 96 | bank->ecc_counter++; |
98 | bank->ecc_counter++; | 97 | return IRQ_HANDLED; |
99 | return IRQ_HANDLED; | ||
100 | } else if (irq == bank->irq_uncorrectable) { | ||
101 | dev_err(&device->dev, "Uncorrectable memory error occured\n"); | ||
102 | panic("Critical ECC error on %s", device->node->full_name); | ||
103 | } | ||
104 | |||
105 | return IRQ_NONE; | ||
106 | } | 98 | } |
107 | 99 | ||
108 | /** | 100 | /** |
@@ -259,28 +251,18 @@ axon_ram_probe(struct of_device *device, const struct of_device_id *device_id) | |||
259 | blk_queue_hardsect_size(bank->disk->queue, AXON_RAM_SECTOR_SIZE); | 251 | blk_queue_hardsect_size(bank->disk->queue, AXON_RAM_SECTOR_SIZE); |
260 | add_disk(bank->disk); | 252 | add_disk(bank->disk); |
261 | 253 | ||
262 | bank->irq_correctable = irq_of_parse_and_map(device->node, 0); | 254 | bank->irq_id = irq_of_parse_and_map(device->node, 0); |
263 | bank->irq_uncorrectable = irq_of_parse_and_map(device->node, 1); | 255 | if (bank->irq_id == NO_IRQ) { |
264 | if ((bank->irq_correctable <= 0) || (bank->irq_uncorrectable <= 0)) { | ||
265 | dev_err(&device->dev, "Cannot access ECC interrupt ID\n"); | 256 | dev_err(&device->dev, "Cannot access ECC interrupt ID\n"); |
266 | rc = -EFAULT; | 257 | rc = -EFAULT; |
267 | goto failed; | 258 | goto failed; |
268 | } | 259 | } |
269 | 260 | ||
270 | rc = request_irq(bank->irq_correctable, axon_ram_irq_handler, | 261 | rc = request_irq(bank->irq_id, axon_ram_irq_handler, |
271 | AXON_RAM_IRQ_FLAGS, bank->disk->disk_name, device); | ||
272 | if (rc != 0) { | ||
273 | dev_err(&device->dev, "Cannot register ECC interrupt handler\n"); | ||
274 | bank->irq_correctable = bank->irq_uncorrectable = 0; | ||
275 | rc = -EFAULT; | ||
276 | goto failed; | ||
277 | } | ||
278 | |||
279 | rc = request_irq(bank->irq_uncorrectable, axon_ram_irq_handler, | ||
280 | AXON_RAM_IRQ_FLAGS, bank->disk->disk_name, device); | 262 | AXON_RAM_IRQ_FLAGS, bank->disk->disk_name, device); |
281 | if (rc != 0) { | 263 | if (rc != 0) { |
282 | dev_err(&device->dev, "Cannot register ECC interrupt handler\n"); | 264 | dev_err(&device->dev, "Cannot register ECC interrupt handler\n"); |
283 | bank->irq_uncorrectable = 0; | 265 | bank->irq_id = NO_IRQ; |
284 | rc = -EFAULT; | 266 | rc = -EFAULT; |
285 | goto failed; | 267 | goto failed; |
286 | } | 268 | } |
@@ -296,13 +278,9 @@ axon_ram_probe(struct of_device *device, const struct of_device_id *device_id) | |||
296 | 278 | ||
297 | failed: | 279 | failed: |
298 | if (bank != NULL) { | 280 | if (bank != NULL) { |
299 | if (bank->irq_uncorrectable > 0) | 281 | if (bank->irq_id != NO_IRQ) |
300 | free_irq(bank->irq_uncorrectable, device); | 282 | free_irq(bank->irq_id, device); |
301 | if (bank->irq_correctable > 0) | ||
302 | free_irq(bank->irq_correctable, device); | ||
303 | if (bank->disk != NULL) { | 283 | if (bank->disk != NULL) { |
304 | if (bank->disk->queue != NULL) | ||
305 | blk_cleanup_queue(bank->disk->queue); | ||
306 | if (bank->disk->major > 0) | 284 | if (bank->disk->major > 0) |
307 | unregister_blkdev(bank->disk->major, | 285 | unregister_blkdev(bank->disk->major, |
308 | bank->disk->disk_name); | 286 | bank->disk->disk_name); |
@@ -329,9 +307,7 @@ axon_ram_remove(struct of_device *device) | |||
329 | BUG_ON(!bank || !bank->disk); | 307 | BUG_ON(!bank || !bank->disk); |
330 | 308 | ||
331 | device_remove_file(&device->dev, &dev_attr_ecc); | 309 | device_remove_file(&device->dev, &dev_attr_ecc); |
332 | free_irq(bank->irq_uncorrectable, device); | 310 | free_irq(bank->irq_id, device); |
333 | free_irq(bank->irq_correctable, device); | ||
334 | blk_cleanup_queue(bank->disk->queue); | ||
335 | unregister_blkdev(bank->disk->major, bank->disk->disk_name); | 311 | unregister_blkdev(bank->disk->major, bank->disk->disk_name); |
336 | del_gendisk(bank->disk); | 312 | del_gendisk(bank->disk); |
337 | iounmap((void __iomem *) bank->io_addr); | 313 | iounmap((void __iomem *) bank->io_addr); |