Path: blob/master/arch/m32r/platforms/m32700ut/setup.c
10818 views
/*1* linux/arch/m32r/platforms/m32700ut/setup.c2*3* Setup routines for Renesas M32700UT Board4*5* Copyright (c) 2002-2005 Hiroyuki Kondo, Hirokazu Takata,6* Hitoshi Yamamoto, Takeo Takahashi7*8* This file is subject to the terms and conditions of the GNU General9* Public License. See the file "COPYING" in the main directory of this10* archive for more details.11*/1213#include <linux/irq.h>14#include <linux/kernel.h>15#include <linux/init.h>16#include <linux/platform_device.h>1718#include <asm/system.h>19#include <asm/m32r.h>20#include <asm/io.h>2122/*23* M32700 Interrupt Control Unit (Level 1)24*/25#define irq2port(x) (M32R_ICU_CR1_PORTL + ((x - 1) * sizeof(unsigned long)))2627icu_data_t icu_data[M32700UT_NUM_CPU_IRQ];2829static void disable_m32700ut_irq(unsigned int irq)30{31unsigned long port, data;3233port = irq2port(irq);34data = icu_data[irq].icucr|M32R_ICUCR_ILEVEL7;35outl(data, port);36}3738static void enable_m32700ut_irq(unsigned int irq)39{40unsigned long port, data;4142port = irq2port(irq);43data = icu_data[irq].icucr|M32R_ICUCR_IEN|M32R_ICUCR_ILEVEL6;44outl(data, port);45}4647static void mask_m32700ut(struct irq_data *data)48{49disable_m32700ut_irq(data->irq);50}5152static void unmask_m32700ut(struct irq_data *data)53{54enable_m32700ut_irq(data->irq);55}5657static void shutdown_m32700ut(struct irq_data *data)58{59unsigned long port;6061port = irq2port(data->irq);62outl(M32R_ICUCR_ILEVEL7, port);63}6465static struct irq_chip m32700ut_irq_type =66{67.name = "M32700UT-IRQ",68.irq_shutdown = shutdown_m32700ut,69.irq_mask = mask_m32700ut,70.irq_unmask = unmask_m32700ut71};7273/*74* Interrupt Control Unit of PLD on M32700UT (Level 2)75*/76#define irq2pldirq(x) ((x) - M32700UT_PLD_IRQ_BASE)77#define pldirq2port(x) (unsigned long)((int)PLD_ICUCR1 + \78(((x) - 1) * sizeof(unsigned short)))7980typedef struct {81unsigned short icucr; /* ICU Control Register */82} pld_icu_data_t;8384static pld_icu_data_t pld_icu_data[M32700UT_NUM_PLD_IRQ];8586static void disable_m32700ut_pld_irq(unsigned int irq)87{88unsigned long port, data;89unsigned int pldirq;9091pldirq = irq2pldirq(irq);92port = pldirq2port(pldirq);93data = pld_icu_data[pldirq].icucr|PLD_ICUCR_ILEVEL7;94outw(data, port);95}9697static void enable_m32700ut_pld_irq(unsigned int irq)98{99unsigned long port, data;100unsigned int pldirq;101102pldirq = irq2pldirq(irq);103port = pldirq2port(pldirq);104data = pld_icu_data[pldirq].icucr|PLD_ICUCR_IEN|PLD_ICUCR_ILEVEL6;105outw(data, port);106}107108static void mask_m32700ut_pld(struct irq_data *data)109{110disable_m32700ut_pld_irq(data->irq);111}112113static void unmask_m32700ut_pld(struct irq_data *data)114{115enable_m32700ut_pld_irq(data->irq);116enable_m32700ut_irq(M32R_IRQ_INT1);117}118119static void shutdown_m32700ut_pld_irq(struct irq_data *data)120{121unsigned long port;122unsigned int pldirq;123124pldirq = irq2pldirq(data->irq);125port = pldirq2port(pldirq);126outw(PLD_ICUCR_ILEVEL7, port);127}128129static struct irq_chip m32700ut_pld_irq_type =130{131.name = "M32700UT-PLD-IRQ",132.irq_shutdown = shutdown_m32700ut_pld_irq,133.irq_mask = mask_m32700ut_pld,134.irq_unmask = unmask_m32700ut_pld,135};136137/*138* Interrupt Control Unit of PLD on M32700UT-LAN (Level 2)139*/140#define irq2lanpldirq(x) ((x) - M32700UT_LAN_PLD_IRQ_BASE)141#define lanpldirq2port(x) (unsigned long)((int)M32700UT_LAN_ICUCR1 + \142(((x) - 1) * sizeof(unsigned short)))143144static pld_icu_data_t lanpld_icu_data[M32700UT_NUM_LAN_PLD_IRQ];145146static void disable_m32700ut_lanpld_irq(unsigned int irq)147{148unsigned long port, data;149unsigned int pldirq;150151pldirq = irq2lanpldirq(irq);152port = lanpldirq2port(pldirq);153data = lanpld_icu_data[pldirq].icucr|PLD_ICUCR_ILEVEL7;154outw(data, port);155}156157static void enable_m32700ut_lanpld_irq(unsigned int irq)158{159unsigned long port, data;160unsigned int pldirq;161162pldirq = irq2lanpldirq(irq);163port = lanpldirq2port(pldirq);164data = lanpld_icu_data[pldirq].icucr|PLD_ICUCR_IEN|PLD_ICUCR_ILEVEL6;165outw(data, port);166}167168static void mask_m32700ut_lanpld(struct irq_data *data)169{170disable_m32700ut_lanpld_irq(data->irq);171}172173static void unmask_m32700ut_lanpld(struct irq_data *data)174{175enable_m32700ut_lanpld_irq(data->irq);176enable_m32700ut_irq(M32R_IRQ_INT0);177}178179static void shutdown_m32700ut_lanpld(struct irq_data *data)180{181unsigned long port;182unsigned int pldirq;183184pldirq = irq2lanpldirq(data->irq);185port = lanpldirq2port(pldirq);186outw(PLD_ICUCR_ILEVEL7, port);187}188189static struct irq_chip m32700ut_lanpld_irq_type =190{191.name = "M32700UT-PLD-LAN-IRQ",192.irq_shutdown = shutdown_m32700ut_lanpld,193.irq_mask = mask_m32700ut_lanpld,194.irq_unmask = unmask_m32700ut_lanpld,195};196197/*198* Interrupt Control Unit of PLD on M32700UT-LCD (Level 2)199*/200#define irq2lcdpldirq(x) ((x) - M32700UT_LCD_PLD_IRQ_BASE)201#define lcdpldirq2port(x) (unsigned long)((int)M32700UT_LCD_ICUCR1 + \202(((x) - 1) * sizeof(unsigned short)))203204static pld_icu_data_t lcdpld_icu_data[M32700UT_NUM_LCD_PLD_IRQ];205206static void disable_m32700ut_lcdpld_irq(unsigned int irq)207{208unsigned long port, data;209unsigned int pldirq;210211pldirq = irq2lcdpldirq(irq);212port = lcdpldirq2port(pldirq);213data = lcdpld_icu_data[pldirq].icucr|PLD_ICUCR_ILEVEL7;214outw(data, port);215}216217static void enable_m32700ut_lcdpld_irq(unsigned int irq)218{219unsigned long port, data;220unsigned int pldirq;221222pldirq = irq2lcdpldirq(irq);223port = lcdpldirq2port(pldirq);224data = lcdpld_icu_data[pldirq].icucr|PLD_ICUCR_IEN|PLD_ICUCR_ILEVEL6;225outw(data, port);226}227228static void mask_m32700ut_lcdpld(struct irq_data *data)229{230disable_m32700ut_lcdpld_irq(data->irq);231}232233static void unmask_m32700ut_lcdpld(struct irq_data *data)234{235enable_m32700ut_lcdpld_irq(data->irq);236enable_m32700ut_irq(M32R_IRQ_INT2);237}238239static void shutdown_m32700ut_lcdpld(struct irq_data *data)240{241unsigned long port;242unsigned int pldirq;243244pldirq = irq2lcdpldirq(data->irq);245port = lcdpldirq2port(pldirq);246outw(PLD_ICUCR_ILEVEL7, port);247}248249static struct irq_chip m32700ut_lcdpld_irq_type =250{251.name = "M32700UT-PLD-LCD-IRQ",252.irq_shutdown = shutdown_m32700ut_lcdpld,253.irq_mask = mask_m32700ut_lcdpld,254.irq_unmask = unmask_m32700ut_lcdpld,255};256257void __init init_IRQ(void)258{259#if defined(CONFIG_SMC91X)260/* INT#0: LAN controller on M32700UT-LAN (SMC91C111)*/261irq_set_chip_and_handler(M32700UT_LAN_IRQ_LAN,262&m32700ut_lanpld_irq_type, handle_level_irq);263lanpld_icu_data[irq2lanpldirq(M32700UT_LAN_IRQ_LAN)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02; /* "H" edge sense */264disable_m32700ut_lanpld_irq(M32700UT_LAN_IRQ_LAN);265#endif /* CONFIG_SMC91X */266267/* MFT2 : system timer */268irq_set_chip_and_handler(M32R_IRQ_MFT2, &m32700ut_irq_type,269handle_level_irq);270icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN;271disable_m32700ut_irq(M32R_IRQ_MFT2);272273/* SIO0 : receive */274irq_set_chip_and_handler(M32R_IRQ_SIO0_R, &m32700ut_irq_type,275handle_level_irq);276icu_data[M32R_IRQ_SIO0_R].icucr = 0;277disable_m32700ut_irq(M32R_IRQ_SIO0_R);278279/* SIO0 : send */280irq_set_chip_and_handler(M32R_IRQ_SIO0_S, &m32700ut_irq_type,281handle_level_irq);282icu_data[M32R_IRQ_SIO0_S].icucr = 0;283disable_m32700ut_irq(M32R_IRQ_SIO0_S);284285/* SIO1 : receive */286irq_set_chip_and_handler(M32R_IRQ_SIO1_R, &m32700ut_irq_type,287handle_level_irq);288icu_data[M32R_IRQ_SIO1_R].icucr = 0;289disable_m32700ut_irq(M32R_IRQ_SIO1_R);290291/* SIO1 : send */292irq_set_chip_and_handler(M32R_IRQ_SIO1_S, &m32700ut_irq_type,293handle_level_irq);294icu_data[M32R_IRQ_SIO1_S].icucr = 0;295disable_m32700ut_irq(M32R_IRQ_SIO1_S);296297/* DMA1 : */298irq_set_chip_and_handler(M32R_IRQ_DMA1, &m32700ut_irq_type,299handle_level_irq);300icu_data[M32R_IRQ_DMA1].icucr = 0;301disable_m32700ut_irq(M32R_IRQ_DMA1);302303#ifdef CONFIG_SERIAL_M32R_PLDSIO304/* INT#1: SIO0 Receive on PLD */305irq_set_chip_and_handler(PLD_IRQ_SIO0_RCV, &m32700ut_pld_irq_type,306handle_level_irq);307pld_icu_data[irq2pldirq(PLD_IRQ_SIO0_RCV)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD03;308disable_m32700ut_pld_irq(PLD_IRQ_SIO0_RCV);309310/* INT#1: SIO0 Send on PLD */311irq_set_chip_and_handler(PLD_IRQ_SIO0_SND, &m32700ut_pld_irq_type,312handle_level_irq);313pld_icu_data[irq2pldirq(PLD_IRQ_SIO0_SND)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD03;314disable_m32700ut_pld_irq(PLD_IRQ_SIO0_SND);315#endif /* CONFIG_SERIAL_M32R_PLDSIO */316317/* INT#1: CFC IREQ on PLD */318irq_set_chip_and_handler(PLD_IRQ_CFIREQ, &m32700ut_pld_irq_type,319handle_level_irq);320pld_icu_data[irq2pldirq(PLD_IRQ_CFIREQ)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD01; /* 'L' level sense */321disable_m32700ut_pld_irq(PLD_IRQ_CFIREQ);322323/* INT#1: CFC Insert on PLD */324irq_set_chip_and_handler(PLD_IRQ_CFC_INSERT, &m32700ut_pld_irq_type,325handle_level_irq);326pld_icu_data[irq2pldirq(PLD_IRQ_CFC_INSERT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD00; /* 'L' edge sense */327disable_m32700ut_pld_irq(PLD_IRQ_CFC_INSERT);328329/* INT#1: CFC Eject on PLD */330irq_set_chip_and_handler(PLD_IRQ_CFC_EJECT, &m32700ut_pld_irq_type,331handle_level_irq);332pld_icu_data[irq2pldirq(PLD_IRQ_CFC_EJECT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02; /* 'H' edge sense */333disable_m32700ut_pld_irq(PLD_IRQ_CFC_EJECT);334335/*336* INT0# is used for LAN, DIO337* We enable it here.338*/339icu_data[M32R_IRQ_INT0].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD11;340enable_m32700ut_irq(M32R_IRQ_INT0);341342/*343* INT1# is used for UART, MMC, CF Controller in FPGA.344* We enable it here.345*/346icu_data[M32R_IRQ_INT1].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD11;347enable_m32700ut_irq(M32R_IRQ_INT1);348349#if defined(CONFIG_USB)350outw(USBCR_OTGS, USBCR); /* USBCR: non-OTG */351irq_set_chip_and_handler(M32700UT_LCD_IRQ_USB_INT1,352&m32700ut_lcdpld_irq_type, handle_level_irq);353354lcdpld_icu_data[irq2lcdpldirq(M32700UT_LCD_IRQ_USB_INT1)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD01; /* "L" level sense */355disable_m32700ut_lcdpld_irq(M32700UT_LCD_IRQ_USB_INT1);356#endif357/*358* INT2# is used for BAT, USB, AUDIO359* We enable it here.360*/361icu_data[M32R_IRQ_INT2].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD01;362enable_m32700ut_irq(M32R_IRQ_INT2);363364#if defined(CONFIG_VIDEO_M32R_AR)365/*366* INT3# is used for AR367*/368irq_set_chip_and_handler(M32R_IRQ_INT3, &m32700ut_irq_type,369handle_level_irq);370icu_data[M32R_IRQ_INT3].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10;371disable_m32700ut_irq(M32R_IRQ_INT3);372#endif /* CONFIG_VIDEO_M32R_AR */373}374375#if defined(CONFIG_SMC91X)376377#define LAN_IOSTART 0x300378#define LAN_IOEND 0x320379static struct resource smc91x_resources[] = {380[0] = {381.start = (LAN_IOSTART),382.end = (LAN_IOEND),383.flags = IORESOURCE_MEM,384},385[1] = {386.start = M32700UT_LAN_IRQ_LAN,387.end = M32700UT_LAN_IRQ_LAN,388.flags = IORESOURCE_IRQ,389}390};391392static struct platform_device smc91x_device = {393.name = "smc91x",394.id = 0,395.num_resources = ARRAY_SIZE(smc91x_resources),396.resource = smc91x_resources,397};398#endif399400#if defined(CONFIG_FB_S1D13XXX)401402#include <video/s1d13xxxfb.h>403#include <asm/s1d13806.h>404405static struct s1d13xxxfb_pdata s1d13xxxfb_data = {406.initregs = s1d13xxxfb_initregs,407.initregssize = ARRAY_SIZE(s1d13xxxfb_initregs),408.platform_init_video = NULL,409#ifdef CONFIG_PM410.platform_suspend_video = NULL,411.platform_resume_video = NULL,412#endif413};414415static struct resource s1d13xxxfb_resources[] = {416[0] = {417.start = 0x10600000UL,418.end = 0x1073FFFFUL,419.flags = IORESOURCE_MEM,420},421[1] = {422.start = 0x10400000UL,423.end = 0x104001FFUL,424.flags = IORESOURCE_MEM,425}426};427428static struct platform_device s1d13xxxfb_device = {429.name = S1D_DEVICENAME,430.id = 0,431.dev = {432.platform_data = &s1d13xxxfb_data,433},434.num_resources = ARRAY_SIZE(s1d13xxxfb_resources),435.resource = s1d13xxxfb_resources,436};437#endif438439static int __init platform_init(void)440{441#if defined(CONFIG_SMC91X)442platform_device_register(&smc91x_device);443#endif444#if defined(CONFIG_FB_S1D13XXX)445platform_device_register(&s1d13xxxfb_device);446#endif447return 0;448}449arch_initcall(platform_init);450451452