Path: blob/master/arch/sh/kernel/cpu/sh4/setup-sh7750.c
37217 views
/*1* SH7750/SH7751 Setup2*3* Copyright (C) 2006 Paul Mundt4* Copyright (C) 2006 Jamie Lenehan5*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/io.h>14#include <linux/sh_timer.h>15#include <linux/serial_sci.h>16#include <generated/machtypes.h>1718static struct resource rtc_resources[] = {19[0] = {20.start = 0xffc80000,21.end = 0xffc80000 + 0x58 - 1,22.flags = IORESOURCE_IO,23},24[1] = {25/* Shared Period/Carry/Alarm IRQ */26.start = 20,27.flags = IORESOURCE_IRQ,28},29};3031static struct platform_device rtc_device = {32.name = "sh-rtc",33.id = -1,34.num_resources = ARRAY_SIZE(rtc_resources),35.resource = rtc_resources,36};3738static struct plat_sci_port sci_platform_data = {39.mapbase = 0xffe00000,40.flags = UPF_BOOT_AUTOCONF,41.scscr = SCSCR_TE | SCSCR_RE,42.scbrr_algo_id = SCBRR_ALGO_2,43.type = PORT_SCI,44.irqs = { 23, 23, 23, 0 },45};4647static struct platform_device sci_device = {48.name = "sh-sci",49.id = 0,50.dev = {51.platform_data = &sci_platform_data,52},53};5455static struct plat_sci_port scif_platform_data = {56.mapbase = 0xffe80000,57.flags = UPF_BOOT_AUTOCONF,58.scscr = SCSCR_TE | SCSCR_RE | SCSCR_REIE,59.scbrr_algo_id = SCBRR_ALGO_2,60.type = PORT_SCIF,61.irqs = { 40, 40, 40, 40 },62};6364static struct platform_device scif_device = {65.name = "sh-sci",66.id = 1,67.dev = {68.platform_data = &scif_platform_data,69},70};7172static struct sh_timer_config tmu0_platform_data = {73.channel_offset = 0x04,74.timer_bit = 0,75.clockevent_rating = 200,76};7778static struct resource tmu0_resources[] = {79[0] = {80.start = 0xffd80008,81.end = 0xffd80013,82.flags = IORESOURCE_MEM,83},84[1] = {85.start = 16,86.flags = IORESOURCE_IRQ,87},88};8990static struct platform_device tmu0_device = {91.name = "sh_tmu",92.id = 0,93.dev = {94.platform_data = &tmu0_platform_data,95},96.resource = tmu0_resources,97.num_resources = ARRAY_SIZE(tmu0_resources),98};99100static struct sh_timer_config tmu1_platform_data = {101.channel_offset = 0x10,102.timer_bit = 1,103.clocksource_rating = 200,104};105106static struct resource tmu1_resources[] = {107[0] = {108.start = 0xffd80014,109.end = 0xffd8001f,110.flags = IORESOURCE_MEM,111},112[1] = {113.start = 17,114.flags = IORESOURCE_IRQ,115},116};117118static struct platform_device tmu1_device = {119.name = "sh_tmu",120.id = 1,121.dev = {122.platform_data = &tmu1_platform_data,123},124.resource = tmu1_resources,125.num_resources = ARRAY_SIZE(tmu1_resources),126};127128static struct sh_timer_config tmu2_platform_data = {129.channel_offset = 0x1c,130.timer_bit = 2,131};132133static struct resource tmu2_resources[] = {134[0] = {135.start = 0xffd80020,136.end = 0xffd8002f,137.flags = IORESOURCE_MEM,138},139[1] = {140.start = 18,141.flags = IORESOURCE_IRQ,142},143};144145static struct platform_device tmu2_device = {146.name = "sh_tmu",147.id = 2,148.dev = {149.platform_data = &tmu2_platform_data,150},151.resource = tmu2_resources,152.num_resources = ARRAY_SIZE(tmu2_resources),153};154155/* SH7750R, SH7751 and SH7751R all have two extra timer channels */156#if defined(CONFIG_CPU_SUBTYPE_SH7750R) || \157defined(CONFIG_CPU_SUBTYPE_SH7751) || \158defined(CONFIG_CPU_SUBTYPE_SH7751R)159160static struct sh_timer_config tmu3_platform_data = {161.channel_offset = 0x04,162.timer_bit = 0,163};164165static struct resource tmu3_resources[] = {166[0] = {167.start = 0xfe100008,168.end = 0xfe100013,169.flags = IORESOURCE_MEM,170},171[1] = {172.start = 72,173.flags = IORESOURCE_IRQ,174},175};176177static struct platform_device tmu3_device = {178.name = "sh_tmu",179.id = 3,180.dev = {181.platform_data = &tmu3_platform_data,182},183.resource = tmu3_resources,184.num_resources = ARRAY_SIZE(tmu3_resources),185};186187static struct sh_timer_config tmu4_platform_data = {188.channel_offset = 0x10,189.timer_bit = 1,190};191192static struct resource tmu4_resources[] = {193[0] = {194.start = 0xfe100014,195.end = 0xfe10001f,196.flags = IORESOURCE_MEM,197},198[1] = {199.start = 76,200.flags = IORESOURCE_IRQ,201},202};203204static struct platform_device tmu4_device = {205.name = "sh_tmu",206.id = 4,207.dev = {208.platform_data = &tmu4_platform_data,209},210.resource = tmu4_resources,211.num_resources = ARRAY_SIZE(tmu4_resources),212};213214#endif215216static struct platform_device *sh7750_devices[] __initdata = {217&rtc_device,218&tmu0_device,219&tmu1_device,220&tmu2_device,221#if defined(CONFIG_CPU_SUBTYPE_SH7750R) || \222defined(CONFIG_CPU_SUBTYPE_SH7751) || \223defined(CONFIG_CPU_SUBTYPE_SH7751R)224&tmu3_device,225&tmu4_device,226#endif227};228229static int __init sh7750_devices_setup(void)230{231if (mach_is_rts7751r2d()) {232platform_device_register(&scif_device);233} else {234platform_device_register(&sci_device);235platform_device_register(&scif_device);236}237238return platform_add_devices(sh7750_devices,239ARRAY_SIZE(sh7750_devices));240}241arch_initcall(sh7750_devices_setup);242243static struct platform_device *sh7750_early_devices[] __initdata = {244&tmu0_device,245&tmu1_device,246&tmu2_device,247#if defined(CONFIG_CPU_SUBTYPE_SH7750R) || \248defined(CONFIG_CPU_SUBTYPE_SH7751) || \249defined(CONFIG_CPU_SUBTYPE_SH7751R)250&tmu3_device,251&tmu4_device,252#endif253};254255void __init plat_early_device_setup(void)256{257struct platform_device *dev[1];258259if (mach_is_rts7751r2d()) {260scif_platform_data.scscr |= SCSCR_CKE1;261dev[0] = &scif_device;262early_platform_add_devices(dev, 1);263} else {264dev[0] = &sci_device;265early_platform_add_devices(dev, 1);266dev[0] = &scif_device;267early_platform_add_devices(dev, 1);268}269270early_platform_add_devices(sh7750_early_devices,271ARRAY_SIZE(sh7750_early_devices));272}273274enum {275UNUSED = 0,276277/* interrupt sources */278IRL0, IRL1, IRL2, IRL3, /* only IRLM mode supported */279HUDI, GPIOI, DMAC,280PCIC0_PCISERR, PCIC1_PCIERR, PCIC1_PCIPWDWN, PCIC1_PCIPWON,281PCIC1_PCIDMA0, PCIC1_PCIDMA1, PCIC1_PCIDMA2, PCIC1_PCIDMA3,282TMU3, TMU4, TMU0, TMU1, TMU2, RTC, SCI1, SCIF, WDT, REF,283284/* interrupt groups */285PCIC1,286};287288static struct intc_vect vectors[] __initdata = {289INTC_VECT(HUDI, 0x600), INTC_VECT(GPIOI, 0x620),290INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420),291INTC_VECT(TMU2, 0x440), INTC_VECT(TMU2, 0x460),292INTC_VECT(RTC, 0x480), INTC_VECT(RTC, 0x4a0),293INTC_VECT(RTC, 0x4c0),294INTC_VECT(SCI1, 0x4e0), INTC_VECT(SCI1, 0x500),295INTC_VECT(SCI1, 0x520), INTC_VECT(SCI1, 0x540),296INTC_VECT(SCIF, 0x700), INTC_VECT(SCIF, 0x720),297INTC_VECT(SCIF, 0x740), INTC_VECT(SCIF, 0x760),298INTC_VECT(WDT, 0x560),299INTC_VECT(REF, 0x580), INTC_VECT(REF, 0x5a0),300};301302static struct intc_prio_reg prio_registers[] __initdata = {303{ 0xffd00004, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } },304{ 0xffd00008, 0, 16, 4, /* IPRB */ { WDT, REF, SCI1, 0 } },305{ 0xffd0000c, 0, 16, 4, /* IPRC */ { GPIOI, DMAC, SCIF, HUDI } },306{ 0xffd00010, 0, 16, 4, /* IPRD */ { IRL0, IRL1, IRL2, IRL3 } },307{ 0xfe080000, 0, 32, 4, /* INTPRI00 */ { 0, 0, 0, 0,308TMU4, TMU3,309PCIC1, PCIC0_PCISERR } },310};311312static DECLARE_INTC_DESC(intc_desc, "sh7750", vectors, NULL,313NULL, prio_registers, NULL);314315/* SH7750, SH7750S, SH7751 and SH7091 all have 4-channel DMA controllers */316#if defined(CONFIG_CPU_SUBTYPE_SH7750) || \317defined(CONFIG_CPU_SUBTYPE_SH7750S) || \318defined(CONFIG_CPU_SUBTYPE_SH7751) || \319defined(CONFIG_CPU_SUBTYPE_SH7091)320static struct intc_vect vectors_dma4[] __initdata = {321INTC_VECT(DMAC, 0x640), INTC_VECT(DMAC, 0x660),322INTC_VECT(DMAC, 0x680), INTC_VECT(DMAC, 0x6a0),323INTC_VECT(DMAC, 0x6c0),324};325326static DECLARE_INTC_DESC(intc_desc_dma4, "sh7750_dma4",327vectors_dma4, NULL,328NULL, prio_registers, NULL);329#endif330331/* SH7750R and SH7751R both have 8-channel DMA controllers */332#if defined(CONFIG_CPU_SUBTYPE_SH7750R) || defined(CONFIG_CPU_SUBTYPE_SH7751R)333static struct intc_vect vectors_dma8[] __initdata = {334INTC_VECT(DMAC, 0x640), INTC_VECT(DMAC, 0x660),335INTC_VECT(DMAC, 0x680), INTC_VECT(DMAC, 0x6a0),336INTC_VECT(DMAC, 0x780), INTC_VECT(DMAC, 0x7a0),337INTC_VECT(DMAC, 0x7c0), INTC_VECT(DMAC, 0x7e0),338INTC_VECT(DMAC, 0x6c0),339};340341static DECLARE_INTC_DESC(intc_desc_dma8, "sh7750_dma8",342vectors_dma8, NULL,343NULL, prio_registers, NULL);344#endif345346/* SH7750R, SH7751 and SH7751R all have two extra timer channels */347#if defined(CONFIG_CPU_SUBTYPE_SH7750R) || \348defined(CONFIG_CPU_SUBTYPE_SH7751) || \349defined(CONFIG_CPU_SUBTYPE_SH7751R)350static struct intc_vect vectors_tmu34[] __initdata = {351INTC_VECT(TMU3, 0xb00), INTC_VECT(TMU4, 0xb80),352};353354static struct intc_mask_reg mask_registers[] __initdata = {355{ 0xfe080040, 0xfe080060, 32, /* INTMSK00 / INTMSKCLR00 */356{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,3570, 0, 0, 0, 0, 0, TMU4, TMU3,358PCIC1_PCIERR, PCIC1_PCIPWDWN, PCIC1_PCIPWON,359PCIC1_PCIDMA0, PCIC1_PCIDMA1, PCIC1_PCIDMA2,360PCIC1_PCIDMA3, PCIC0_PCISERR } },361};362363static DECLARE_INTC_DESC(intc_desc_tmu34, "sh7750_tmu34",364vectors_tmu34, NULL,365mask_registers, prio_registers, NULL);366#endif367368/* SH7750S, SH7750R, SH7751 and SH7751R all have IRLM priority registers */369static struct intc_vect vectors_irlm[] __initdata = {370INTC_VECT(IRL0, 0x240), INTC_VECT(IRL1, 0x2a0),371INTC_VECT(IRL2, 0x300), INTC_VECT(IRL3, 0x360),372};373374static DECLARE_INTC_DESC(intc_desc_irlm, "sh7750_irlm", vectors_irlm, NULL,375NULL, prio_registers, NULL);376377/* SH7751 and SH7751R both have PCI */378#if defined(CONFIG_CPU_SUBTYPE_SH7751) || defined(CONFIG_CPU_SUBTYPE_SH7751R)379static struct intc_vect vectors_pci[] __initdata = {380INTC_VECT(PCIC0_PCISERR, 0xa00), INTC_VECT(PCIC1_PCIERR, 0xae0),381INTC_VECT(PCIC1_PCIPWDWN, 0xac0), INTC_VECT(PCIC1_PCIPWON, 0xaa0),382INTC_VECT(PCIC1_PCIDMA0, 0xa80), INTC_VECT(PCIC1_PCIDMA1, 0xa60),383INTC_VECT(PCIC1_PCIDMA2, 0xa40), INTC_VECT(PCIC1_PCIDMA3, 0xa20),384};385386static struct intc_group groups_pci[] __initdata = {387INTC_GROUP(PCIC1, PCIC1_PCIERR, PCIC1_PCIPWDWN, PCIC1_PCIPWON,388PCIC1_PCIDMA0, PCIC1_PCIDMA1, PCIC1_PCIDMA2, PCIC1_PCIDMA3),389};390391static DECLARE_INTC_DESC(intc_desc_pci, "sh7750_pci", vectors_pci, groups_pci,392mask_registers, prio_registers, NULL);393#endif394395#if defined(CONFIG_CPU_SUBTYPE_SH7750) || \396defined(CONFIG_CPU_SUBTYPE_SH7750S) || \397defined(CONFIG_CPU_SUBTYPE_SH7091)398void __init plat_irq_setup(void)399{400/*401* same vectors for SH7750, SH7750S and SH7091 except for IRLM,402* see below..403*/404register_intc_controller(&intc_desc);405register_intc_controller(&intc_desc_dma4);406}407#endif408409#if defined(CONFIG_CPU_SUBTYPE_SH7750R)410void __init plat_irq_setup(void)411{412register_intc_controller(&intc_desc);413register_intc_controller(&intc_desc_dma8);414register_intc_controller(&intc_desc_tmu34);415}416#endif417418#if defined(CONFIG_CPU_SUBTYPE_SH7751)419void __init plat_irq_setup(void)420{421register_intc_controller(&intc_desc);422register_intc_controller(&intc_desc_dma4);423register_intc_controller(&intc_desc_tmu34);424register_intc_controller(&intc_desc_pci);425}426#endif427428#if defined(CONFIG_CPU_SUBTYPE_SH7751R)429void __init plat_irq_setup(void)430{431register_intc_controller(&intc_desc);432register_intc_controller(&intc_desc_dma8);433register_intc_controller(&intc_desc_tmu34);434register_intc_controller(&intc_desc_pci);435}436#endif437438#define INTC_ICR 0xffd00000UL439#define INTC_ICR_IRLM (1<<7)440441void __init plat_irq_setup_pins(int mode)442{443#if defined(CONFIG_CPU_SUBTYPE_SH7750) || defined(CONFIG_CPU_SUBTYPE_SH7091)444BUG(); /* impossible to mask interrupts on SH7750 and SH7091 */445return;446#endif447448switch (mode) {449case IRQ_MODE_IRQ: /* individual interrupt mode for IRL3-0 */450__raw_writew(__raw_readw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR);451register_intc_controller(&intc_desc_irlm);452break;453default:454BUG();455}456}457458459