Path: blob/master/arch/sh/kernel/cpu/sh2a/setup-sh7206.c
17498 views
/*1* SH7206 Setup2*3* Copyright (C) 2006 Yoshinori Sato4* Copyright (C) 2009 Paul Mundt5*6* This file is subject to the terms and conditions of the GNU General Public7* License. See the file "COPYING" in the main directory of this archive8* for more details.9*/10#include <linux/platform_device.h>11#include <linux/init.h>12#include <linux/serial.h>13#include <linux/serial_sci.h>14#include <linux/sh_timer.h>15#include <linux/io.h>1617enum {18UNUSED = 0,1920/* interrupt sources */21IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,22PINT0, PINT1, PINT2, PINT3, PINT4, PINT5, PINT6, PINT7,23ADC_ADI0, ADC_ADI1,2425DMAC0, DMAC1, DMAC2, DMAC3, DMAC4, DMAC5, DMAC6, DMAC7,2627MTU0_ABCD, MTU0_VEF, MTU1_AB, MTU1_VU, MTU2_AB, MTU2_VU,28MTU3_ABCD, MTU4_ABCD, MTU5, POE2_12, MTU3S_ABCD, MTU4S_ABCD, MTU5S,29IIC3,3031CMT0, CMT1, BSC, WDT,3233MTU2_TCI3V, MTU2_TCI4V, MTU2S_TCI3V, MTU2S_TCI4V,3435POE2_OEI3,3637SCIF0, SCIF1, SCIF2, SCIF3,3839/* interrupt groups */40PINT,41};4243static struct intc_vect vectors[] __initdata = {44INTC_IRQ(IRQ0, 64), INTC_IRQ(IRQ1, 65),45INTC_IRQ(IRQ2, 66), INTC_IRQ(IRQ3, 67),46INTC_IRQ(IRQ4, 68), INTC_IRQ(IRQ5, 69),47INTC_IRQ(IRQ6, 70), INTC_IRQ(IRQ7, 71),48INTC_IRQ(PINT0, 80), INTC_IRQ(PINT1, 81),49INTC_IRQ(PINT2, 82), INTC_IRQ(PINT3, 83),50INTC_IRQ(PINT4, 84), INTC_IRQ(PINT5, 85),51INTC_IRQ(PINT6, 86), INTC_IRQ(PINT7, 87),52INTC_IRQ(ADC_ADI0, 92), INTC_IRQ(ADC_ADI1, 96),53INTC_IRQ(DMAC0, 108), INTC_IRQ(DMAC0, 109),54INTC_IRQ(DMAC1, 112), INTC_IRQ(DMAC1, 113),55INTC_IRQ(DMAC2, 116), INTC_IRQ(DMAC2, 117),56INTC_IRQ(DMAC3, 120), INTC_IRQ(DMAC3, 121),57INTC_IRQ(DMAC4, 124), INTC_IRQ(DMAC4, 125),58INTC_IRQ(DMAC5, 128), INTC_IRQ(DMAC5, 129),59INTC_IRQ(DMAC6, 132), INTC_IRQ(DMAC6, 133),60INTC_IRQ(DMAC7, 136), INTC_IRQ(DMAC7, 137),61INTC_IRQ(CMT0, 140), INTC_IRQ(CMT1, 144),62INTC_IRQ(BSC, 148), INTC_IRQ(WDT, 152),63INTC_IRQ(MTU0_ABCD, 156), INTC_IRQ(MTU0_ABCD, 157),64INTC_IRQ(MTU0_ABCD, 158), INTC_IRQ(MTU0_ABCD, 159),65INTC_IRQ(MTU0_VEF, 160), INTC_IRQ(MTU0_VEF, 161),66INTC_IRQ(MTU0_VEF, 162),67INTC_IRQ(MTU1_AB, 164), INTC_IRQ(MTU1_AB, 165),68INTC_IRQ(MTU1_VU, 168), INTC_IRQ(MTU1_VU, 169),69INTC_IRQ(MTU2_AB, 172), INTC_IRQ(MTU2_AB, 173),70INTC_IRQ(MTU2_VU, 176), INTC_IRQ(MTU2_VU, 177),71INTC_IRQ(MTU3_ABCD, 180), INTC_IRQ(MTU3_ABCD, 181),72INTC_IRQ(MTU3_ABCD, 182), INTC_IRQ(MTU3_ABCD, 183),73INTC_IRQ(MTU2_TCI3V, 184),74INTC_IRQ(MTU4_ABCD, 188), INTC_IRQ(MTU4_ABCD, 189),75INTC_IRQ(MTU4_ABCD, 190), INTC_IRQ(MTU4_ABCD, 191),76INTC_IRQ(MTU2_TCI4V, 192),77INTC_IRQ(MTU5, 196), INTC_IRQ(MTU5, 197),78INTC_IRQ(MTU5, 198),79INTC_IRQ(POE2_12, 200), INTC_IRQ(POE2_12, 201),80INTC_IRQ(MTU3S_ABCD, 204), INTC_IRQ(MTU3S_ABCD, 205),81INTC_IRQ(MTU3S_ABCD, 206), INTC_IRQ(MTU3S_ABCD, 207),82INTC_IRQ(MTU2S_TCI3V, 208),83INTC_IRQ(MTU4S_ABCD, 212), INTC_IRQ(MTU4S_ABCD, 213),84INTC_IRQ(MTU4S_ABCD, 214), INTC_IRQ(MTU4S_ABCD, 215),85INTC_IRQ(MTU2S_TCI4V, 216),86INTC_IRQ(MTU5S, 220), INTC_IRQ(MTU5S, 221),87INTC_IRQ(MTU5S, 222),88INTC_IRQ(POE2_OEI3, 224),89INTC_IRQ(IIC3, 228), INTC_IRQ(IIC3, 229),90INTC_IRQ(IIC3, 230), INTC_IRQ(IIC3, 231),91INTC_IRQ(IIC3, 232),92INTC_IRQ(SCIF0, 240), INTC_IRQ(SCIF0, 241),93INTC_IRQ(SCIF0, 242), INTC_IRQ(SCIF0, 243),94INTC_IRQ(SCIF1, 244), INTC_IRQ(SCIF1, 245),95INTC_IRQ(SCIF1, 246), INTC_IRQ(SCIF1, 247),96INTC_IRQ(SCIF2, 248), INTC_IRQ(SCIF2, 249),97INTC_IRQ(SCIF2, 250), INTC_IRQ(SCIF2, 251),98INTC_IRQ(SCIF3, 252), INTC_IRQ(SCIF3, 253),99INTC_IRQ(SCIF3, 254), INTC_IRQ(SCIF3, 255),100};101102static struct intc_group groups[] __initdata = {103INTC_GROUP(PINT, PINT0, PINT1, PINT2, PINT3,104PINT4, PINT5, PINT6, PINT7),105};106107static struct intc_prio_reg prio_registers[] __initdata = {108{ 0xfffe0818, 0, 16, 4, /* IPR01 */ { IRQ0, IRQ1, IRQ2, IRQ3 } },109{ 0xfffe081a, 0, 16, 4, /* IPR02 */ { IRQ4, IRQ5, IRQ6, IRQ7 } },110{ 0xfffe0820, 0, 16, 4, /* IPR05 */ { PINT, 0, ADC_ADI0, ADC_ADI1 } },111{ 0xfffe0c00, 0, 16, 4, /* IPR06 */ { DMAC0, DMAC1, DMAC2, DMAC3 } },112{ 0xfffe0c02, 0, 16, 4, /* IPR07 */ { DMAC4, DMAC5, DMAC6, DMAC7 } },113{ 0xfffe0c04, 0, 16, 4, /* IPR08 */ { CMT0, CMT1, BSC, WDT } },114{ 0xfffe0c06, 0, 16, 4, /* IPR09 */ { MTU0_ABCD, MTU0_VEF,115MTU1_AB, MTU1_VU } },116{ 0xfffe0c08, 0, 16, 4, /* IPR10 */ { MTU2_AB, MTU2_VU,117MTU3_ABCD, MTU2_TCI3V } },118{ 0xfffe0c0a, 0, 16, 4, /* IPR11 */ { MTU4_ABCD, MTU2_TCI4V,119MTU5, POE2_12 } },120{ 0xfffe0c0c, 0, 16, 4, /* IPR12 */ { MTU3S_ABCD, MTU2S_TCI3V,121MTU4S_ABCD, MTU2S_TCI4V } },122{ 0xfffe0c0e, 0, 16, 4, /* IPR13 */ { MTU5S, POE2_OEI3, IIC3, 0 } },123{ 0xfffe0c10, 0, 16, 4, /* IPR14 */ { SCIF0, SCIF1, SCIF2, SCIF3 } },124};125126static struct intc_mask_reg mask_registers[] __initdata = {127{ 0xfffe0808, 0, 16, /* PINTER */128{ 0, 0, 0, 0, 0, 0, 0, 0,129PINT7, PINT6, PINT5, PINT4, PINT3, PINT2, PINT1, PINT0 } },130};131132static DECLARE_INTC_DESC(intc_desc, "sh7206", vectors, groups,133mask_registers, prio_registers, NULL);134135static struct plat_sci_port scif0_platform_data = {136.mapbase = 0xfffe8000,137.flags = UPF_BOOT_AUTOCONF,138.scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE,139.scbrr_algo_id = SCBRR_ALGO_2,140.type = PORT_SCIF,141.irqs = { 240, 240, 240, 240 },142};143144static struct platform_device scif0_device = {145.name = "sh-sci",146.id = 0,147.dev = {148.platform_data = &scif0_platform_data,149},150};151152static struct plat_sci_port scif1_platform_data = {153.mapbase = 0xfffe8800,154.flags = UPF_BOOT_AUTOCONF,155.scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE,156.scbrr_algo_id = SCBRR_ALGO_2,157.type = PORT_SCIF,158.irqs = { 244, 244, 244, 244 },159};160161static struct platform_device scif1_device = {162.name = "sh-sci",163.id = 1,164.dev = {165.platform_data = &scif1_platform_data,166},167};168169static struct plat_sci_port scif2_platform_data = {170.mapbase = 0xfffe9000,171.flags = UPF_BOOT_AUTOCONF,172.scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE,173.scbrr_algo_id = SCBRR_ALGO_2,174.type = PORT_SCIF,175.irqs = { 248, 248, 248, 248 },176};177178static struct platform_device scif2_device = {179.name = "sh-sci",180.id = 2,181.dev = {182.platform_data = &scif2_platform_data,183},184};185186static struct plat_sci_port scif3_platform_data = {187.mapbase = 0xfffe9800,188.flags = UPF_BOOT_AUTOCONF,189.scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE,190.scbrr_algo_id = SCBRR_ALGO_2,191.type = PORT_SCIF,192.irqs = { 252, 252, 252, 252 },193};194195static struct platform_device scif3_device = {196.name = "sh-sci",197.id = 3,198.dev = {199.platform_data = &scif3_platform_data,200},201};202203static struct sh_timer_config cmt0_platform_data = {204.channel_offset = 0x02,205.timer_bit = 0,206.clockevent_rating = 125,207.clocksource_rating = 0, /* disabled due to code generation issues */208};209210static struct resource cmt0_resources[] = {211[0] = {212.start = 0xfffec002,213.end = 0xfffec007,214.flags = IORESOURCE_MEM,215},216[1] = {217.start = 140,218.flags = IORESOURCE_IRQ,219},220};221222static struct platform_device cmt0_device = {223.name = "sh_cmt",224.id = 0,225.dev = {226.platform_data = &cmt0_platform_data,227},228.resource = cmt0_resources,229.num_resources = ARRAY_SIZE(cmt0_resources),230};231232static struct sh_timer_config cmt1_platform_data = {233.channel_offset = 0x08,234.timer_bit = 1,235.clockevent_rating = 125,236.clocksource_rating = 0, /* disabled due to code generation issues */237};238239static struct resource cmt1_resources[] = {240[0] = {241.start = 0xfffec008,242.end = 0xfffec00d,243.flags = IORESOURCE_MEM,244},245[1] = {246.start = 144,247.flags = IORESOURCE_IRQ,248},249};250251static struct platform_device cmt1_device = {252.name = "sh_cmt",253.id = 1,254.dev = {255.platform_data = &cmt1_platform_data,256},257.resource = cmt1_resources,258.num_resources = ARRAY_SIZE(cmt1_resources),259};260261static struct sh_timer_config mtu2_0_platform_data = {262.channel_offset = -0x80,263.timer_bit = 0,264.clockevent_rating = 200,265};266267static struct resource mtu2_0_resources[] = {268[0] = {269.start = 0xfffe4300,270.end = 0xfffe4326,271.flags = IORESOURCE_MEM,272},273[1] = {274.start = 156,275.flags = IORESOURCE_IRQ,276},277};278279static struct platform_device mtu2_0_device = {280.name = "sh_mtu2",281.id = 0,282.dev = {283.platform_data = &mtu2_0_platform_data,284},285.resource = mtu2_0_resources,286.num_resources = ARRAY_SIZE(mtu2_0_resources),287};288289static struct sh_timer_config mtu2_1_platform_data = {290.channel_offset = -0x100,291.timer_bit = 1,292.clockevent_rating = 200,293};294295static struct resource mtu2_1_resources[] = {296[0] = {297.start = 0xfffe4380,298.end = 0xfffe4390,299.flags = IORESOURCE_MEM,300},301[1] = {302.start = 164,303.flags = IORESOURCE_IRQ,304},305};306307static struct platform_device mtu2_1_device = {308.name = "sh_mtu2",309.id = 1,310.dev = {311.platform_data = &mtu2_1_platform_data,312},313.resource = mtu2_1_resources,314.num_resources = ARRAY_SIZE(mtu2_1_resources),315};316317static struct sh_timer_config mtu2_2_platform_data = {318.channel_offset = 0x80,319.timer_bit = 2,320.clockevent_rating = 200,321};322323static struct resource mtu2_2_resources[] = {324[0] = {325.start = 0xfffe4000,326.end = 0xfffe400a,327.flags = IORESOURCE_MEM,328},329[1] = {330.start = 180,331.flags = IORESOURCE_IRQ,332},333};334335static struct platform_device mtu2_2_device = {336.name = "sh_mtu2",337.id = 2,338.dev = {339.platform_data = &mtu2_2_platform_data,340},341.resource = mtu2_2_resources,342.num_resources = ARRAY_SIZE(mtu2_2_resources),343};344345static struct platform_device *sh7206_devices[] __initdata = {346&scif0_device,347&scif1_device,348&scif2_device,349&scif3_device,350&cmt0_device,351&cmt1_device,352&mtu2_0_device,353&mtu2_1_device,354&mtu2_2_device,355};356357static int __init sh7206_devices_setup(void)358{359return platform_add_devices(sh7206_devices,360ARRAY_SIZE(sh7206_devices));361}362arch_initcall(sh7206_devices_setup);363364void __init plat_irq_setup(void)365{366register_intc_controller(&intc_desc);367}368369static struct platform_device *sh7206_early_devices[] __initdata = {370&scif0_device,371&scif1_device,372&scif2_device,373&scif3_device,374&cmt0_device,375&cmt1_device,376&mtu2_0_device,377&mtu2_1_device,378&mtu2_2_device,379};380381#define STBCR3 0xfffe0408382#define STBCR4 0xfffe040c383384void __init plat_early_device_setup(void)385{386/* enable CMT clock */387__raw_writeb(__raw_readb(STBCR4) & ~0x04, STBCR4);388389/* enable MTU2 clock */390__raw_writeb(__raw_readb(STBCR3) & ~0x20, STBCR3);391392early_platform_add_devices(sh7206_early_devices,393ARRAY_SIZE(sh7206_early_devices));394}395396397