12a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz/* Basic functions for adding/removing custom exception handlers 22a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz * 32a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz * Copyright 2004-2009 Analog Devices Inc. 42a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz * 52a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz * Licensed under the GPL-2 or later 62a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz */ 72a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz 82a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz#include <linux/module.h> 92a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz#include <asm/irq_handler.h> 102a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz 112a12c4632db1c0c548a7023e63869b27c7789a92Robin Getzint bfin_request_exception(unsigned int exception, void (*handler)(void)) 122a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz{ 132a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz void (*curr_handler)(void); 142a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz 152a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz if (exception > 0x3F) 162a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz return -EINVAL; 172a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz 182a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz curr_handler = ex_table[exception]; 192a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz 202a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz if (curr_handler != ex_replaceable) 212a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz return -EBUSY; 222a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz 232a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz ex_table[exception] = handler; 242a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz 252a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz return 0; 262a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz} 272a12c4632db1c0c548a7023e63869b27c7789a92Robin GetzEXPORT_SYMBOL(bfin_request_exception); 282a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz 292a12c4632db1c0c548a7023e63869b27c7789a92Robin Getzint bfin_free_exception(unsigned int exception, void (*handler)(void)) 302a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz{ 312a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz void (*curr_handler)(void); 322a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz 332a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz if (exception > 0x3F) 342a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz return -EINVAL; 352a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz 362a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz curr_handler = ex_table[exception]; 372a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz 382a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz if (curr_handler != handler) 392a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz return -EBUSY; 402a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz 412a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz ex_table[exception] = ex_replaceable; 422a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz 432a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz return 0; 442a12c4632db1c0c548a7023e63869b27c7789a92Robin Getz} 452a12c4632db1c0c548a7023e63869b27c7789a92Robin GetzEXPORT_SYMBOL(bfin_free_exception); 46