d92ef29a6f
The current h8300 GPIO implementation doesn't provide the standard GPIO API, and in fact provides only direction control rather than normal GPIO functionality. Currently this is only used by the platform interrupt implementation rather than by a range of drivers so in preparation for moving over to gpiolib move the header out of the way of the gpiolib header, allowing a default GPIO implementation to be provided. For actual use of these GPIOs with gpiolib a real driver would still need to be written but there appears to be no current need for this. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
83 lines
1.6 KiB
C
83 lines
1.6 KiB
C
/*
|
|
* Interrupt handling H8/300H depend.
|
|
* Yoshinori Sato <ysato@users.sourceforge.jp>
|
|
*
|
|
*/
|
|
|
|
#include <linux/init.h>
|
|
#include <linux/errno.h>
|
|
|
|
#include <asm/ptrace.h>
|
|
#include <asm/traps.h>
|
|
#include <asm/irq.h>
|
|
#include <asm/io.h>
|
|
#include <asm/gpio-internal.h>
|
|
#include <asm/regs306x.h>
|
|
|
|
const int __initdata h8300_saved_vectors[] = {
|
|
#if defined(CONFIG_GDB_DEBUG)
|
|
TRAP3_VEC, /* TRAPA #3 is GDB breakpoint */
|
|
#endif
|
|
-1,
|
|
};
|
|
|
|
const h8300_vector __initdata h8300_trap_table[] = {
|
|
0, 0, 0, 0, 0, 0, 0, 0,
|
|
system_call,
|
|
0,
|
|
0,
|
|
trace_break,
|
|
};
|
|
|
|
int h8300_enable_irq_pin(unsigned int irq)
|
|
{
|
|
int bitmask;
|
|
if (irq < EXT_IRQ0 || irq > EXT_IRQ5)
|
|
return 0;
|
|
|
|
/* initialize IRQ pin */
|
|
bitmask = 1 << (irq - EXT_IRQ0);
|
|
switch(irq) {
|
|
case EXT_IRQ0:
|
|
case EXT_IRQ1:
|
|
case EXT_IRQ2:
|
|
case EXT_IRQ3:
|
|
if (H8300_GPIO_RESERVE(H8300_GPIO_P8, bitmask) == 0)
|
|
return -EBUSY;
|
|
H8300_GPIO_DDR(H8300_GPIO_P8, bitmask, H8300_GPIO_INPUT);
|
|
break;
|
|
case EXT_IRQ4:
|
|
case EXT_IRQ5:
|
|
if (H8300_GPIO_RESERVE(H8300_GPIO_P9, bitmask) == 0)
|
|
return -EBUSY;
|
|
H8300_GPIO_DDR(H8300_GPIO_P9, bitmask, H8300_GPIO_INPUT);
|
|
break;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void h8300_disable_irq_pin(unsigned int irq)
|
|
{
|
|
int bitmask;
|
|
if (irq < EXT_IRQ0 || irq > EXT_IRQ5)
|
|
return;
|
|
|
|
/* disable interrupt & release IRQ pin */
|
|
bitmask = 1 << (irq - EXT_IRQ0);
|
|
switch(irq) {
|
|
case EXT_IRQ0:
|
|
case EXT_IRQ1:
|
|
case EXT_IRQ2:
|
|
case EXT_IRQ3:
|
|
*(volatile unsigned char *)IER &= ~bitmask;
|
|
H8300_GPIO_FREE(H8300_GPIO_P8, bitmask);
|
|
break ;
|
|
case EXT_IRQ4:
|
|
case EXT_IRQ5:
|
|
*(volatile unsigned char *)IER &= ~bitmask;
|
|
H8300_GPIO_FREE(H8300_GPIO_P9, bitmask);
|
|
break;
|
|
}
|
|
}
|