Path: blob/master/arch/m32r/platforms/usrv/setup.c
10819 views
/*1* linux/arch/m32r/platforms/usrv/setup.c2*3* Setup routines for MITSUBISHI uServer4*5* Copyright (c) 2001, 2002, 2003 Hiroyuki Kondo, Hirokazu Takata,6* Hitoshi Yamamoto7*/89#include <linux/irq.h>10#include <linux/kernel.h>11#include <linux/init.h>1213#include <asm/system.h>14#include <asm/m32r.h>15#include <asm/io.h>1617#define irq2port(x) (M32R_ICU_CR1_PORTL + ((x - 1) * sizeof(unsigned long)))1819icu_data_t icu_data[M32700UT_NUM_CPU_IRQ];2021static void disable_mappi_irq(unsigned int irq)22{23unsigned long port, data;2425port = irq2port(irq);26data = icu_data[irq].icucr|M32R_ICUCR_ILEVEL7;27outl(data, port);28}2930static void enable_mappi_irq(unsigned int irq)31{32unsigned long port, data;3334port = irq2port(irq);35data = icu_data[irq].icucr|M32R_ICUCR_IEN|M32R_ICUCR_ILEVEL6;36outl(data, port);37}3839static void mask_mappi(struct irq_data *data)40{41disable_mappi_irq(data->irq);42}4344static void unmask_mappi(struct irq_data *data)45{46enable_mappi_irq(data->irq);47}4849static void shutdown_mappi(struct irq_data *data)50{51unsigned long port;5253port = irq2port(data->irq);54outl(M32R_ICUCR_ILEVEL7, port);55}5657static struct irq_chip mappi_irq_type =58{59.name = "M32700-IRQ",60.irq_shutdown = shutdown_mappi,61.irq_mask = mask_mappi,62.irq_unmask = unmask_mappi,63};6465/*66* Interrupt Control Unit of PLD on M32700UT (Level 2)67*/68#define irq2pldirq(x) ((x) - M32700UT_PLD_IRQ_BASE)69#define pldirq2port(x) (unsigned long)((int)PLD_ICUCR1 + \70(((x) - 1) * sizeof(unsigned short)))7172typedef struct {73unsigned short icucr; /* ICU Control Register */74} pld_icu_data_t;7576static pld_icu_data_t pld_icu_data[M32700UT_NUM_PLD_IRQ];7778static void disable_m32700ut_pld_irq(unsigned int irq)79{80unsigned long port, data;81unsigned int pldirq;8283pldirq = irq2pldirq(irq);84port = pldirq2port(pldirq);85data = pld_icu_data[pldirq].icucr|PLD_ICUCR_ILEVEL7;86outw(data, port);87}8889static void enable_m32700ut_pld_irq(unsigned int irq)90{91unsigned long port, data;92unsigned int pldirq;9394pldirq = irq2pldirq(irq);95port = pldirq2port(pldirq);96data = pld_icu_data[pldirq].icucr|PLD_ICUCR_IEN|PLD_ICUCR_ILEVEL6;97outw(data, port);98}99100static void mask_m32700ut_pld(struct irq_data *data)101{102disable_m32700ut_pld_irq(data->irq);103}104105static void unmask_m32700ut_pld(struct irq_data *data)106{107enable_m32700ut_pld_irq(data->irq);108enable_mappi_irq(M32R_IRQ_INT1);109}110111static void shutdown_m32700ut_pld(struct irq_data *data)112{113unsigned long port;114unsigned int pldirq;115116pldirq = irq2pldirq(data->irq);117port = pldirq2port(pldirq);118outw(PLD_ICUCR_ILEVEL7, port);119}120121static struct irq_chip m32700ut_pld_irq_type =122{123.name = "USRV-PLD-IRQ",124.irq_shutdown = shutdown_m32700ut_pld,125.irq_mask = mask_m32700ut_pld,126.irq_unmask = unmask_m32700ut_pld,127};128129void __init init_IRQ(void)130{131static int once = 0;132int i;133134if (once)135return;136else137once++;138139/* MFT2 : system timer */140irq_set_chip_and_handler(M32R_IRQ_MFT2, &mappi_irq_type,141handle_level_irq);142icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN;143disable_mappi_irq(M32R_IRQ_MFT2);144145#if defined(CONFIG_SERIAL_M32R_SIO)146/* SIO0_R : uart receive data */147irq_set_chip_and_handler(M32R_IRQ_SIO0_R, &mappi_irq_type,148handle_level_irq);149icu_data[M32R_IRQ_SIO0_R].icucr = 0;150disable_mappi_irq(M32R_IRQ_SIO0_R);151152/* SIO0_S : uart send data */153irq_set_chip_and_handler(M32R_IRQ_SIO0_S, &mappi_irq_type,154handle_level_irq);155icu_data[M32R_IRQ_SIO0_S].icucr = 0;156disable_mappi_irq(M32R_IRQ_SIO0_S);157158/* SIO1_R : uart receive data */159irq_set_chip_and_handler(M32R_IRQ_SIO1_R, &mappi_irq_type,160handle_level_irq);161icu_data[M32R_IRQ_SIO1_R].icucr = 0;162disable_mappi_irq(M32R_IRQ_SIO1_R);163164/* SIO1_S : uart send data */165irq_set_chip_and_handler(M32R_IRQ_SIO1_S, &mappi_irq_type,166handle_level_irq);167icu_data[M32R_IRQ_SIO1_S].icucr = 0;168disable_mappi_irq(M32R_IRQ_SIO1_S);169#endif /* CONFIG_SERIAL_M32R_SIO */170171/* INT#67-#71: CFC#0 IREQ on PLD */172for (i = 0 ; i < CONFIG_M32R_CFC_NUM ; i++ ) {173irq_set_chip_and_handler(PLD_IRQ_CF0 + i,174&m32700ut_pld_irq_type,175handle_level_irq);176pld_icu_data[irq2pldirq(PLD_IRQ_CF0 + i)].icucr177= PLD_ICUCR_ISMOD01; /* 'L' level sense */178disable_m32700ut_pld_irq(PLD_IRQ_CF0 + i);179}180181#if defined(CONFIG_SERIAL_8250) || defined(CONFIG_SERIAL_8250_MODULE)182/* INT#76: 16552D#0 IREQ on PLD */183irq_set_chip_and_handler(PLD_IRQ_UART0, &m32700ut_pld_irq_type,184handle_level_irq);185pld_icu_data[irq2pldirq(PLD_IRQ_UART0)].icucr186= PLD_ICUCR_ISMOD03; /* 'H' level sense */187disable_m32700ut_pld_irq(PLD_IRQ_UART0);188189/* INT#77: 16552D#1 IREQ on PLD */190irq_set_chip_and_handler(PLD_IRQ_UART1, &m32700ut_pld_irq_type,191handle_level_irq);192pld_icu_data[irq2pldirq(PLD_IRQ_UART1)].icucr193= PLD_ICUCR_ISMOD03; /* 'H' level sense */194disable_m32700ut_pld_irq(PLD_IRQ_UART1);195#endif /* CONFIG_SERIAL_8250 || CONFIG_SERIAL_8250_MODULE */196197#if defined(CONFIG_IDC_AK4524) || defined(CONFIG_IDC_AK4524_MODULE)198/* INT#80: AK4524 IREQ on PLD */199irq_set_chip_and_handler(PLD_IRQ_SNDINT, &m32700ut_pld_irq_type,200handle_level_irq);201pld_icu_data[irq2pldirq(PLD_IRQ_SNDINT)].icucr202= PLD_ICUCR_ISMOD01; /* 'L' level sense */203disable_m32700ut_pld_irq(PLD_IRQ_SNDINT);204#endif /* CONFIG_IDC_AK4524 || CONFIG_IDC_AK4524_MODULE */205206/*207* INT1# is used for UART, MMC, CF Controller in FPGA.208* We enable it here.209*/210icu_data[M32R_IRQ_INT1].icucr = M32R_ICUCR_ISMOD11;211enable_mappi_irq(M32R_IRQ_INT1);212}213214215