Path: blob/master/arch/sh/kernel/cpu/sh2/setup-sh7619.c
17498 views
/*1* SH7619 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,22WDT, EDMAC, CMT0, CMT1,23SCIF0, SCIF1, SCIF2,24HIF_HIFI, HIF_HIFBI,25DMAC0, DMAC1, DMAC2, DMAC3,26SIOF,27};2829static struct intc_vect vectors[] __initdata = {30INTC_IRQ(IRQ0, 64), INTC_IRQ(IRQ1, 65),31INTC_IRQ(IRQ2, 66), INTC_IRQ(IRQ3, 67),32INTC_IRQ(IRQ4, 80), INTC_IRQ(IRQ5, 81),33INTC_IRQ(IRQ6, 82), INTC_IRQ(IRQ7, 83),34INTC_IRQ(WDT, 84), INTC_IRQ(EDMAC, 85),35INTC_IRQ(CMT0, 86), INTC_IRQ(CMT1, 87),36INTC_IRQ(SCIF0, 88), INTC_IRQ(SCIF0, 89),37INTC_IRQ(SCIF0, 90), INTC_IRQ(SCIF0, 91),38INTC_IRQ(SCIF1, 92), INTC_IRQ(SCIF1, 93),39INTC_IRQ(SCIF1, 94), INTC_IRQ(SCIF1, 95),40INTC_IRQ(SCIF2, 96), INTC_IRQ(SCIF2, 97),41INTC_IRQ(SCIF2, 98), INTC_IRQ(SCIF2, 99),42INTC_IRQ(HIF_HIFI, 100), INTC_IRQ(HIF_HIFBI, 101),43INTC_IRQ(DMAC0, 104), INTC_IRQ(DMAC1, 105),44INTC_IRQ(DMAC2, 106), INTC_IRQ(DMAC3, 107),45INTC_IRQ(SIOF, 108),46};4748static struct intc_prio_reg prio_registers[] __initdata = {49{ 0xf8140006, 0, 16, 4, /* IPRA */ { IRQ0, IRQ1, IRQ2, IRQ3 } },50{ 0xf8140008, 0, 16, 4, /* IPRB */ { IRQ4, IRQ5, IRQ6, IRQ7 } },51{ 0xf8080000, 0, 16, 4, /* IPRC */ { WDT, EDMAC, CMT0, CMT1 } },52{ 0xf8080002, 0, 16, 4, /* IPRD */ { SCIF0, SCIF1, SCIF2 } },53{ 0xf8080004, 0, 16, 4, /* IPRE */ { HIF_HIFI, HIF_HIFBI } },54{ 0xf8080006, 0, 16, 4, /* IPRF */ { DMAC0, DMAC1, DMAC2, DMAC3 } },55{ 0xf8080008, 0, 16, 4, /* IPRG */ { SIOF } },56};5758static DECLARE_INTC_DESC(intc_desc, "sh7619", vectors, NULL,59NULL, prio_registers, NULL);6061static struct plat_sci_port scif0_platform_data = {62.mapbase = 0xf8400000,63.flags = UPF_BOOT_AUTOCONF,64.scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE,65.scbrr_algo_id = SCBRR_ALGO_2,66.type = PORT_SCIF,67.irqs = { 88, 88, 88, 88 },68};6970static struct platform_device scif0_device = {71.name = "sh-sci",72.id = 0,73.dev = {74.platform_data = &scif0_platform_data,75},76};7778static struct plat_sci_port scif1_platform_data = {79.mapbase = 0xf8410000,80.flags = UPF_BOOT_AUTOCONF,81.scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE,82.scbrr_algo_id = SCBRR_ALGO_2,83.type = PORT_SCIF,84.irqs = { 92, 92, 92, 92 },85};8687static struct platform_device scif1_device = {88.name = "sh-sci",89.id = 1,90.dev = {91.platform_data = &scif1_platform_data,92},93};9495static struct plat_sci_port scif2_platform_data = {96.mapbase = 0xf8420000,97.flags = UPF_BOOT_AUTOCONF,98.scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE,99.scbrr_algo_id = SCBRR_ALGO_2,100.type = PORT_SCIF,101.irqs = { 96, 96, 96, 96 },102};103104static struct platform_device scif2_device = {105.name = "sh-sci",106.id = 2,107.dev = {108.platform_data = &scif2_platform_data,109},110};111112static struct resource eth_resources[] = {113[0] = {114.start = 0xfb000000,115.end = 0xfb0001c8,116.flags = IORESOURCE_MEM,117},118[1] = {119.start = 85,120.end = 85,121.flags = IORESOURCE_IRQ,122},123};124125static struct platform_device eth_device = {126.name = "sh-eth",127.id = -1,128.dev = {129.platform_data = (void *)1,130},131.num_resources = ARRAY_SIZE(eth_resources),132.resource = eth_resources,133};134135static struct sh_timer_config cmt0_platform_data = {136.channel_offset = 0x02,137.timer_bit = 0,138.clockevent_rating = 125,139.clocksource_rating = 0, /* disabled due to code generation issues */140};141142static struct resource cmt0_resources[] = {143[0] = {144.start = 0xf84a0072,145.end = 0xf84a0077,146.flags = IORESOURCE_MEM,147},148[1] = {149.start = 86,150.flags = IORESOURCE_IRQ,151},152};153154static struct platform_device cmt0_device = {155.name = "sh_cmt",156.id = 0,157.dev = {158.platform_data = &cmt0_platform_data,159},160.resource = cmt0_resources,161.num_resources = ARRAY_SIZE(cmt0_resources),162};163164static struct sh_timer_config cmt1_platform_data = {165.channel_offset = 0x08,166.timer_bit = 1,167.clockevent_rating = 125,168.clocksource_rating = 0, /* disabled due to code generation issues */169};170171static struct resource cmt1_resources[] = {172[0] = {173.start = 0xf84a0078,174.end = 0xf84a007d,175.flags = IORESOURCE_MEM,176},177[1] = {178.start = 87,179.flags = IORESOURCE_IRQ,180},181};182183static struct platform_device cmt1_device = {184.name = "sh_cmt",185.id = 1,186.dev = {187.platform_data = &cmt1_platform_data,188},189.resource = cmt1_resources,190.num_resources = ARRAY_SIZE(cmt1_resources),191};192193static struct platform_device *sh7619_devices[] __initdata = {194&scif0_device,195&scif1_device,196&scif2_device,197ð_device,198&cmt0_device,199&cmt1_device,200};201202static int __init sh7619_devices_setup(void)203{204return platform_add_devices(sh7619_devices,205ARRAY_SIZE(sh7619_devices));206}207arch_initcall(sh7619_devices_setup);208209void __init plat_irq_setup(void)210{211register_intc_controller(&intc_desc);212}213214static struct platform_device *sh7619_early_devices[] __initdata = {215&scif0_device,216&scif1_device,217&scif2_device,218&cmt0_device,219&cmt1_device,220};221222#define STBCR3 0xf80a0000223224void __init plat_early_device_setup(void)225{226/* enable CMT clock */227__raw_writeb(__raw_readb(STBCR3) & ~0x10, STBCR3);228229early_platform_add_devices(sh7619_early_devices,230ARRAY_SIZE(sh7619_early_devices));231}232233234