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