Path: blob/master/arch/sh/kernel/cpu/sh2a/setup-sh7203.c
17498 views
/*1* SH7203 and SH7263 Setup2*3* Copyright (C) 2007 - 2009 Paul Mundt4*5* This file is subject to the terms and conditions of the GNU General Public6* License. See the file "COPYING" in the main directory of this archive7* for more details.8*/9#include <linux/platform_device.h>10#include <linux/init.h>11#include <linux/serial.h>12#include <linux/serial_sci.h>13#include <linux/sh_timer.h>14#include <linux/io.h>1516enum {17UNUSED = 0,1819/* interrupt sources */20IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,21PINT0, PINT1, PINT2, PINT3, PINT4, PINT5, PINT6, PINT7,22DMAC0, DMAC1, DMAC2, DMAC3, DMAC4, DMAC5, DMAC6, DMAC7,23USB, LCDC, CMT0, CMT1, BSC, WDT,2425MTU0_ABCD, MTU0_VEF, MTU1_AB, MTU1_VU, MTU2_AB, MTU2_VU,26MTU3_ABCD, MTU4_ABCD, MTU2_TCI3V, MTU2_TCI4V,2728ADC_ADI,2930IIC30, IIC31, IIC32, IIC33,31SCIF0, SCIF1, SCIF2, SCIF3,3233SSU0, SSU1,3435SSI0_SSII, SSI1_SSII, SSI2_SSII, SSI3_SSII,3637/* ROM-DEC, SDHI, SRC, and IEB are SH7263 specific */38ROMDEC, FLCTL, SDHI, RTC, RCAN0, RCAN1,39SRC, IEBI,4041/* interrupt groups */42PINT,43};4445static struct intc_vect vectors[] __initdata = {46INTC_IRQ(IRQ0, 64), INTC_IRQ(IRQ1, 65),47INTC_IRQ(IRQ2, 66), INTC_IRQ(IRQ3, 67),48INTC_IRQ(IRQ4, 68), INTC_IRQ(IRQ5, 69),49INTC_IRQ(IRQ6, 70), INTC_IRQ(IRQ7, 71),50INTC_IRQ(PINT0, 80), INTC_IRQ(PINT1, 81),51INTC_IRQ(PINT2, 82), INTC_IRQ(PINT3, 83),52INTC_IRQ(PINT4, 84), INTC_IRQ(PINT5, 85),53INTC_IRQ(PINT6, 86), INTC_IRQ(PINT7, 87),54INTC_IRQ(DMAC0, 108), INTC_IRQ(DMAC0, 109),55INTC_IRQ(DMAC1, 112), INTC_IRQ(DMAC1, 113),56INTC_IRQ(DMAC2, 116), INTC_IRQ(DMAC2, 117),57INTC_IRQ(DMAC3, 120), INTC_IRQ(DMAC3, 121),58INTC_IRQ(DMAC4, 124), INTC_IRQ(DMAC4, 125),59INTC_IRQ(DMAC5, 128), INTC_IRQ(DMAC5, 129),60INTC_IRQ(DMAC6, 132), INTC_IRQ(DMAC6, 133),61INTC_IRQ(DMAC7, 136), INTC_IRQ(DMAC7, 137),62INTC_IRQ(USB, 140), INTC_IRQ(LCDC, 141),63INTC_IRQ(CMT0, 142), INTC_IRQ(CMT1, 143),64INTC_IRQ(BSC, 144), INTC_IRQ(WDT, 145),65INTC_IRQ(MTU0_ABCD, 146), INTC_IRQ(MTU0_ABCD, 147),66INTC_IRQ(MTU0_ABCD, 148), INTC_IRQ(MTU0_ABCD, 149),67INTC_IRQ(MTU0_VEF, 150),68INTC_IRQ(MTU0_VEF, 151), INTC_IRQ(MTU0_VEF, 152),69INTC_IRQ(MTU1_AB, 153), INTC_IRQ(MTU1_AB, 154),70INTC_IRQ(MTU1_VU, 155), INTC_IRQ(MTU1_VU, 156),71INTC_IRQ(MTU2_AB, 157), INTC_IRQ(MTU2_AB, 158),72INTC_IRQ(MTU2_VU, 159), INTC_IRQ(MTU2_VU, 160),73INTC_IRQ(MTU3_ABCD, 161), INTC_IRQ(MTU3_ABCD, 162),74INTC_IRQ(MTU3_ABCD, 163), INTC_IRQ(MTU3_ABCD, 164),75INTC_IRQ(MTU2_TCI3V, 165),76INTC_IRQ(MTU4_ABCD, 166), INTC_IRQ(MTU4_ABCD, 167),77INTC_IRQ(MTU4_ABCD, 168), INTC_IRQ(MTU4_ABCD, 169),78INTC_IRQ(MTU2_TCI4V, 170),79INTC_IRQ(ADC_ADI, 171),80INTC_IRQ(IIC30, 172), INTC_IRQ(IIC30, 173),81INTC_IRQ(IIC30, 174), INTC_IRQ(IIC30, 175),82INTC_IRQ(IIC30, 176),83INTC_IRQ(IIC31, 177), INTC_IRQ(IIC31, 178),84INTC_IRQ(IIC31, 179), INTC_IRQ(IIC31, 180),85INTC_IRQ(IIC31, 181),86INTC_IRQ(IIC32, 182), INTC_IRQ(IIC32, 183),87INTC_IRQ(IIC32, 184), INTC_IRQ(IIC32, 185),88INTC_IRQ(IIC32, 186),89INTC_IRQ(IIC33, 187), INTC_IRQ(IIC33, 188),90INTC_IRQ(IIC33, 189), INTC_IRQ(IIC33, 190),91INTC_IRQ(IIC33, 191),92INTC_IRQ(SCIF0, 192), INTC_IRQ(SCIF0, 193),93INTC_IRQ(SCIF0, 194), INTC_IRQ(SCIF0, 195),94INTC_IRQ(SCIF1, 196), INTC_IRQ(SCIF1, 197),95INTC_IRQ(SCIF1, 198), INTC_IRQ(SCIF1, 199),96INTC_IRQ(SCIF2, 200), INTC_IRQ(SCIF2, 201),97INTC_IRQ(SCIF2, 202), INTC_IRQ(SCIF2, 203),98INTC_IRQ(SCIF3, 204), INTC_IRQ(SCIF3, 205),99INTC_IRQ(SCIF3, 206), INTC_IRQ(SCIF3, 207),100INTC_IRQ(SSU0, 208), INTC_IRQ(SSU0, 209),101INTC_IRQ(SSU0, 210),102INTC_IRQ(SSU1, 211), INTC_IRQ(SSU1, 212),103INTC_IRQ(SSU1, 213),104INTC_IRQ(SSI0_SSII, 214), INTC_IRQ(SSI1_SSII, 215),105INTC_IRQ(SSI2_SSII, 216), INTC_IRQ(SSI3_SSII, 217),106INTC_IRQ(FLCTL, 224), INTC_IRQ(FLCTL, 225),107INTC_IRQ(FLCTL, 226), INTC_IRQ(FLCTL, 227),108INTC_IRQ(RTC, 231), INTC_IRQ(RTC, 232),109INTC_IRQ(RTC, 233),110INTC_IRQ(RCAN0, 234), INTC_IRQ(RCAN0, 235),111INTC_IRQ(RCAN0, 236), INTC_IRQ(RCAN0, 237),112INTC_IRQ(RCAN0, 238),113INTC_IRQ(RCAN1, 239), INTC_IRQ(RCAN1, 240),114INTC_IRQ(RCAN1, 241), INTC_IRQ(RCAN1, 242),115INTC_IRQ(RCAN1, 243),116117/* SH7263-specific trash */118#ifdef CONFIG_CPU_SUBTYPE_SH7263119INTC_IRQ(ROMDEC, 218), INTC_IRQ(ROMDEC, 219),120INTC_IRQ(ROMDEC, 220), INTC_IRQ(ROMDEC, 221),121INTC_IRQ(ROMDEC, 222), INTC_IRQ(ROMDEC, 223),122123INTC_IRQ(SDHI, 228), INTC_IRQ(SDHI, 229),124INTC_IRQ(SDHI, 230),125126INTC_IRQ(SRC, 244), INTC_IRQ(SRC, 245),127INTC_IRQ(SRC, 246),128129INTC_IRQ(IEBI, 247),130#endif131};132133static struct intc_group groups[] __initdata = {134INTC_GROUP(PINT, PINT0, PINT1, PINT2, PINT3,135PINT4, PINT5, PINT6, PINT7),136};137138static struct intc_prio_reg prio_registers[] __initdata = {139{ 0xfffe0818, 0, 16, 4, /* IPR01 */ { IRQ0, IRQ1, IRQ2, IRQ3 } },140{ 0xfffe081a, 0, 16, 4, /* IPR02 */ { IRQ4, IRQ5, IRQ6, IRQ7 } },141{ 0xfffe0820, 0, 16, 4, /* IPR05 */ { PINT, 0, 0, 0 } },142{ 0xfffe0c00, 0, 16, 4, /* IPR06 */ { DMAC0, DMAC1, DMAC2, DMAC3 } },143{ 0xfffe0c02, 0, 16, 4, /* IPR07 */ { DMAC4, DMAC5, DMAC6, DMAC7 } },144{ 0xfffe0c04, 0, 16, 4, /* IPR08 */ { USB, LCDC, CMT0, CMT1 } },145{ 0xfffe0c06, 0, 16, 4, /* IPR09 */ { BSC, WDT, MTU0_ABCD, MTU0_VEF } },146{ 0xfffe0c08, 0, 16, 4, /* IPR10 */ { MTU1_AB, MTU1_VU, MTU2_AB,147MTU2_VU } },148{ 0xfffe0c0a, 0, 16, 4, /* IPR11 */ { MTU3_ABCD, MTU2_TCI3V, MTU4_ABCD,149MTU2_TCI4V } },150{ 0xfffe0c0c, 0, 16, 4, /* IPR12 */ { ADC_ADI, IIC30, IIC31, IIC32 } },151{ 0xfffe0c0e, 0, 16, 4, /* IPR13 */ { IIC33, SCIF0, SCIF1, SCIF2 } },152{ 0xfffe0c10, 0, 16, 4, /* IPR14 */ { SCIF3, SSU0, SSU1, SSI0_SSII } },153#ifdef CONFIG_CPU_SUBTYPE_SH7203154{ 0xfffe0c12, 0, 16, 4, /* IPR15 */ { SSI1_SSII, SSI2_SSII,155SSI3_SSII, 0 } },156{ 0xfffe0c14, 0, 16, 4, /* IPR16 */ { FLCTL, 0, RTC, RCAN0 } },157{ 0xfffe0c16, 0, 16, 4, /* IPR17 */ { RCAN1, 0, 0, 0 } },158#else159{ 0xfffe0c12, 0, 16, 4, /* IPR15 */ { SSI1_SSII, SSI2_SSII,160SSI3_SSII, ROMDEC } },161{ 0xfffe0c14, 0, 16, 4, /* IPR16 */ { FLCTL, SDHI, RTC, RCAN0 } },162{ 0xfffe0c16, 0, 16, 4, /* IPR17 */ { RCAN1, SRC, IEBI, 0 } },163#endif164};165166static struct intc_mask_reg mask_registers[] __initdata = {167{ 0xfffe0808, 0, 16, /* PINTER */168{ 0, 0, 0, 0, 0, 0, 0, 0,169PINT7, PINT6, PINT5, PINT4, PINT3, PINT2, PINT1, PINT0 } },170};171172static DECLARE_INTC_DESC(intc_desc, "sh7203", vectors, groups,173mask_registers, prio_registers, NULL);174175static struct plat_sci_port scif0_platform_data = {176.mapbase = 0xfffe8000,177.flags = UPF_BOOT_AUTOCONF,178.scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE,179.scbrr_algo_id = SCBRR_ALGO_2,180.type = PORT_SCIF,181.irqs = { 192, 192, 192, 192 },182};183184static struct platform_device scif0_device = {185.name = "sh-sci",186.id = 0,187.dev = {188.platform_data = &scif0_platform_data,189},190};191192static struct plat_sci_port scif1_platform_data = {193.mapbase = 0xfffe8800,194.flags = UPF_BOOT_AUTOCONF,195.scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE,196.scbrr_algo_id = SCBRR_ALGO_2,197.type = PORT_SCIF,198.irqs = { 196, 196, 196, 196 },199};200201static struct platform_device scif1_device = {202.name = "sh-sci",203.id = 1,204.dev = {205.platform_data = &scif1_platform_data,206},207};208209static struct plat_sci_port scif2_platform_data = {210.mapbase = 0xfffe9000,211.flags = UPF_BOOT_AUTOCONF,212.scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE,213.scbrr_algo_id = SCBRR_ALGO_2,214.type = PORT_SCIF,215.irqs = { 200, 200, 200, 200 },216};217218static struct platform_device scif2_device = {219.name = "sh-sci",220.id = 2,221.dev = {222.platform_data = &scif2_platform_data,223},224};225226static struct plat_sci_port scif3_platform_data = {227.mapbase = 0xfffe9800,228.flags = UPF_BOOT_AUTOCONF,229.scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE,230.scbrr_algo_id = SCBRR_ALGO_2,231.type = PORT_SCIF,232.irqs = { 204, 204, 204, 204 },233};234235static struct platform_device scif3_device = {236.name = "sh-sci",237.id = 3,238.dev = {239.platform_data = &scif3_platform_data,240},241};242243static struct sh_timer_config cmt0_platform_data = {244.channel_offset = 0x02,245.timer_bit = 0,246.clockevent_rating = 125,247.clocksource_rating = 0, /* disabled due to code generation issues */248};249250static struct resource cmt0_resources[] = {251[0] = {252.start = 0xfffec002,253.end = 0xfffec007,254.flags = IORESOURCE_MEM,255},256[1] = {257.start = 142,258.flags = IORESOURCE_IRQ,259},260};261262static struct platform_device cmt0_device = {263.name = "sh_cmt",264.id = 0,265.dev = {266.platform_data = &cmt0_platform_data,267},268.resource = cmt0_resources,269.num_resources = ARRAY_SIZE(cmt0_resources),270};271272static struct sh_timer_config cmt1_platform_data = {273.channel_offset = 0x08,274.timer_bit = 1,275.clockevent_rating = 125,276.clocksource_rating = 0, /* disabled due to code generation issues */277};278279static struct resource cmt1_resources[] = {280[0] = {281.start = 0xfffec008,282.end = 0xfffec00d,283.flags = IORESOURCE_MEM,284},285[1] = {286.start = 143,287.flags = IORESOURCE_IRQ,288},289};290291static struct platform_device cmt1_device = {292.name = "sh_cmt",293.id = 1,294.dev = {295.platform_data = &cmt1_platform_data,296},297.resource = cmt1_resources,298.num_resources = ARRAY_SIZE(cmt1_resources),299};300301static struct sh_timer_config mtu2_0_platform_data = {302.channel_offset = -0x80,303.timer_bit = 0,304.clockevent_rating = 200,305};306307static struct resource mtu2_0_resources[] = {308[0] = {309.start = 0xfffe4300,310.end = 0xfffe4326,311.flags = IORESOURCE_MEM,312},313[1] = {314.start = 146,315.flags = IORESOURCE_IRQ,316},317};318319static struct platform_device mtu2_0_device = {320.name = "sh_mtu2",321.id = 0,322.dev = {323.platform_data = &mtu2_0_platform_data,324},325.resource = mtu2_0_resources,326.num_resources = ARRAY_SIZE(mtu2_0_resources),327};328329static struct sh_timer_config mtu2_1_platform_data = {330.channel_offset = -0x100,331.timer_bit = 1,332.clockevent_rating = 200,333};334335static struct resource mtu2_1_resources[] = {336[0] = {337.start = 0xfffe4380,338.end = 0xfffe4390,339.flags = IORESOURCE_MEM,340},341[1] = {342.start = 153,343.flags = IORESOURCE_IRQ,344},345};346347static struct platform_device mtu2_1_device = {348.name = "sh_mtu2",349.id = 1,350.dev = {351.platform_data = &mtu2_1_platform_data,352},353.resource = mtu2_1_resources,354.num_resources = ARRAY_SIZE(mtu2_1_resources),355};356357static struct resource rtc_resources[] = {358[0] = {359.start = 0xffff2000,360.end = 0xffff2000 + 0x58 - 1,361.flags = IORESOURCE_IO,362},363[1] = {364/* Shared Period/Carry/Alarm IRQ */365.start = 231,366.flags = IORESOURCE_IRQ,367},368};369370static struct platform_device rtc_device = {371.name = "sh-rtc",372.id = -1,373.num_resources = ARRAY_SIZE(rtc_resources),374.resource = rtc_resources,375};376377static struct platform_device *sh7203_devices[] __initdata = {378&scif0_device,379&scif1_device,380&scif2_device,381&scif3_device,382&cmt0_device,383&cmt1_device,384&mtu2_0_device,385&mtu2_1_device,386&rtc_device,387};388389static int __init sh7203_devices_setup(void)390{391return platform_add_devices(sh7203_devices,392ARRAY_SIZE(sh7203_devices));393}394arch_initcall(sh7203_devices_setup);395396void __init plat_irq_setup(void)397{398register_intc_controller(&intc_desc);399}400401static struct platform_device *sh7203_early_devices[] __initdata = {402&scif0_device,403&scif1_device,404&scif2_device,405&scif3_device,406&cmt0_device,407&cmt1_device,408&mtu2_0_device,409&mtu2_1_device,410};411412#define STBCR3 0xfffe0408413#define STBCR4 0xfffe040c414415void __init plat_early_device_setup(void)416{417/* enable CMT clock */418__raw_writeb(__raw_readb(STBCR4) & ~0x04, STBCR4);419420/* enable MTU2 clock */421__raw_writeb(__raw_readb(STBCR3) & ~0x20, STBCR3);422423early_platform_add_devices(sh7203_early_devices,424ARRAY_SIZE(sh7203_early_devices));425}426427428