Subversion Repositories freemyipod

Rev

Blame | Last modification | View Log | RSS feed

#include "global.h"
#include "soc/s5l87xx/irq.h"
#include "soc/s5l87xx/regs.h"
#include "cpu/arm/old/armutil.h"
#include "sys/util.h"

__attribute__((weak)) void unhandled_irq_handler()
{
    fault_handler();
}

__attribute__((weak,alias("unhandled_irq_handler"))) void ext0_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void ext1_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void ext2_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void eint_vbus_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void eintg_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_timer_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_wdt_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_unk1_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_unk2_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_unk3_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_dma_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_alarm_rtc_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_pri_rtc_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void reserved1_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_uart_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_usb_host_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_usb_func_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_lcdc_0_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_lcdc_1_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_calm_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_ata_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_uart0_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_spdif_out_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_ecc_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_sdci_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_lcd_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_wheel_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_iic_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void reserved2_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_mstick_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_adc_wakeup_irqhandler();
__attribute__((weak,alias("unhandled_irq_handler"))) void int_adc_irqhandler();

static void (* s5l8701_irq_vector[])(void) =
{
    ext0_irqhandler,
    ext1_irqhandler,
    ext2_irqhandler,
    eint_vbus_irqhandler,
    eintg_irqhandler,
    int_timer_irqhandler,
    int_wdt_irqhandler,
    int_unk1_irqhandler,
    int_unk2_irqhandler,
    int_unk3_irqhandler,
    int_dma_irqhandler,
    int_alarm_rtc_irqhandler,
    int_pri_rtc_irqhandler,
    reserved1_irqhandler,
    int_uart_irqhandler,
    int_usb_host_irqhandler,
    int_usb_func_irqhandler,
    int_lcdc_0_irqhandler,
    int_lcdc_1_irqhandler,
    int_calm_irqhandler,
    int_ata_irqhandler,
    int_uart0_irqhandler,
    int_spdif_out_irqhandler,
    int_ecc_irqhandler,
    int_sdci_irqhandler,
    int_lcd_irqhandler,
    int_wheel_irqhandler,
    int_iic_irqhandler,
    reserved2_irqhandler,
    int_mstick_irqhandler,
    int_adc_wakeup_irqhandler,
    int_adc_irqhandler,
};

__attribute__((interrupt("IRQ"))) void _irq_handler(void)
{
    int irq_no = INTOFFSET;
    s5l8701_irq_vector[irq_no]();
    SRCPND = (1 << irq_no);
    INTPND = INTPND;
}

void s5l87xx_irq_enable(int irq, bool state)
{
    enter_critical_section();
    if (state) INTMSK |= 1 << irq;
    else INTMSK &= ~(1 << irq);
    leave_critical_section();
}