1e5723e0eSPaul Mundt /* 2ac919986SMagnus Damm * SH3 Setup code for SH7710, SH7712 3e5723e0eSPaul Mundt * 456d604deSPaul Mundt * Copyright (C) 2006 - 2009 Paul Mundt 59465a54fSNobuhiro Iwamatsu * Copyright (C) 2007 Nobuhiro Iwamatsu 6e5723e0eSPaul Mundt * 7e5723e0eSPaul Mundt * This file is subject to the terms and conditions of the GNU General Public 8e5723e0eSPaul Mundt * License. See the file "COPYING" in the main directory of this archive 9e5723e0eSPaul Mundt * for more details. 10e5723e0eSPaul Mundt */ 11e5723e0eSPaul Mundt #include <linux/platform_device.h> 12e5723e0eSPaul Mundt #include <linux/init.h> 1328b146c8SMagnus Damm #include <linux/irq.h> 14e5723e0eSPaul Mundt #include <linux/serial.h> 1596de1a8fSPaul Mundt #include <linux/serial_sci.h> 16e5ad0089SMagnus Damm #include <linux/sh_timer.h> 175d0af769SPaul Mundt #include <linux/sh_intc.h> 18ad89f87aSPaul Mundt #include <asm/rtc.h> 19e5723e0eSPaul Mundt 2028b146c8SMagnus Damm enum { 2128b146c8SMagnus Damm UNUSED = 0, 2228b146c8SMagnus Damm 2328b146c8SMagnus Damm /* interrupt sources */ 2428b146c8SMagnus Damm IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, 2556d604deSPaul Mundt DMAC1, SCIF0, SCIF1, DMAC2, IPSEC, 2628b146c8SMagnus Damm EDMAC0, EDMAC1, EDMAC2, 2756d604deSPaul Mundt SIOF0, SIOF1, 2828b146c8SMagnus Damm 2956d604deSPaul Mundt TMU0, TMU1, TMU2, 3056d604deSPaul Mundt RTC, WDT, REF, 3128b146c8SMagnus Damm }; 3228b146c8SMagnus Damm 335c37e025SMagnus Damm static struct intc_vect vectors[] __initdata = { 34a276e588SMagnus Damm /* IRQ0->5 are handled in setup-sh3.c */ 3556d604deSPaul Mundt INTC_VECT(DMAC1, 0x800), INTC_VECT(DMAC1, 0x820), 3656d604deSPaul Mundt INTC_VECT(DMAC1, 0x840), INTC_VECT(DMAC1, 0x860), 3756d604deSPaul Mundt INTC_VECT(SCIF0, 0x880), INTC_VECT(SCIF0, 0x8a0), 3856d604deSPaul Mundt INTC_VECT(SCIF0, 0x8c0), INTC_VECT(SCIF0, 0x8e0), 3956d604deSPaul Mundt INTC_VECT(SCIF1, 0x900), INTC_VECT(SCIF1, 0x920), 4056d604deSPaul Mundt INTC_VECT(SCIF1, 0x940), INTC_VECT(SCIF1, 0x960), 4156d604deSPaul Mundt INTC_VECT(DMAC2, 0xb80), INTC_VECT(DMAC2, 0xba0), 42ac919986SMagnus Damm #ifdef CONFIG_CPU_SUBTYPE_SH7710 4328b146c8SMagnus Damm INTC_VECT(IPSEC, 0xbe0), 44ac919986SMagnus Damm #endif 4528b146c8SMagnus Damm INTC_VECT(EDMAC0, 0xc00), INTC_VECT(EDMAC1, 0xc20), 4628b146c8SMagnus Damm INTC_VECT(EDMAC2, 0xc40), 4756d604deSPaul Mundt INTC_VECT(SIOF0, 0xe00), INTC_VECT(SIOF0, 0xe20), 4856d604deSPaul Mundt INTC_VECT(SIOF0, 0xe40), INTC_VECT(SIOF0, 0xe60), 4956d604deSPaul Mundt INTC_VECT(SIOF1, 0xe80), INTC_VECT(SIOF1, 0xea0), 5056d604deSPaul Mundt INTC_VECT(SIOF1, 0xec0), INTC_VECT(SIOF1, 0xee0), 5128b146c8SMagnus Damm INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420), 5228b146c8SMagnus Damm INTC_VECT(TMU2, 0x440), 5356d604deSPaul Mundt INTC_VECT(RTC, 0x480), INTC_VECT(RTC, 0x4a0), 5456d604deSPaul Mundt INTC_VECT(RTC, 0x4c0), 5528b146c8SMagnus Damm INTC_VECT(WDT, 0x560), 5628b146c8SMagnus Damm INTC_VECT(REF, 0x580), 5728b146c8SMagnus Damm }; 5828b146c8SMagnus Damm 595c37e025SMagnus Damm static struct intc_prio_reg prio_registers[] __initdata = { 606ef5fb2cSMagnus Damm { 0xfffffee2, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } }, 616ef5fb2cSMagnus Damm { 0xfffffee4, 0, 16, 4, /* IPRB */ { WDT, REF, 0, 0 } }, 626ef5fb2cSMagnus Damm { 0xa4000016, 0, 16, 4, /* IPRC */ { IRQ3, IRQ2, IRQ1, IRQ0 } }, 636ef5fb2cSMagnus Damm { 0xa4000018, 0, 16, 4, /* IPRD */ { 0, 0, IRQ5, IRQ4 } }, 646ef5fb2cSMagnus Damm { 0xa400001a, 0, 16, 4, /* IPRE */ { DMAC1, SCIF0, SCIF1 } }, 65995d538aSMagnus Damm { 0xa4080000, 0, 16, 4, /* IPRF */ { IPSEC, DMAC2 } }, 666ef5fb2cSMagnus Damm { 0xa4080002, 0, 16, 4, /* IPRG */ { EDMAC0, EDMAC1, EDMAC2 } }, 676ef5fb2cSMagnus Damm { 0xa4080004, 0, 16, 4, /* IPRH */ { 0, 0, 0, SIOF0 } }, 686ef5fb2cSMagnus Damm { 0xa4080006, 0, 16, 4, /* IPRI */ { 0, 0, SIOF1 } }, 6928b146c8SMagnus Damm }; 7028b146c8SMagnus Damm 7156d604deSPaul Mundt static DECLARE_INTC_DESC(intc_desc, "sh7710", vectors, NULL, 727f3edee8SMagnus Damm NULL, prio_registers, NULL); 7328b146c8SMagnus Damm 7428b146c8SMagnus Damm static struct resource rtc_resources[] = { 7528b146c8SMagnus Damm [0] = { 7628b146c8SMagnus Damm .start = 0xa413fec0, 7728b146c8SMagnus Damm .end = 0xa413fec0 + 0x1e, 7828b146c8SMagnus Damm .flags = IORESOURCE_IO, 7928b146c8SMagnus Damm }, 8028b146c8SMagnus Damm [1] = { 815d0af769SPaul Mundt .start = evt2irq(0x480), 8228b146c8SMagnus Damm .flags = IORESOURCE_IRQ, 8328b146c8SMagnus Damm }, 8428b146c8SMagnus Damm }; 8528b146c8SMagnus Damm 86ad89f87aSPaul Mundt static struct sh_rtc_platform_info rtc_info = { 87ad89f87aSPaul Mundt .capabilities = RTC_CAP_4_DIGIT_YEAR, 88ad89f87aSPaul Mundt }; 89ad89f87aSPaul Mundt 9028b146c8SMagnus Damm static struct platform_device rtc_device = { 9128b146c8SMagnus Damm .name = "sh-rtc", 9228b146c8SMagnus Damm .id = -1, 9328b146c8SMagnus Damm .num_resources = ARRAY_SIZE(rtc_resources), 9428b146c8SMagnus Damm .resource = rtc_resources, 95ad89f87aSPaul Mundt .dev = { 96ad89f87aSPaul Mundt .platform_data = &rtc_info, 97ad89f87aSPaul Mundt }, 9828b146c8SMagnus Damm }; 9928b146c8SMagnus Damm 10044658dfbSMagnus Damm static struct plat_sci_port scif0_platform_data = { 101e5723e0eSPaul Mundt .flags = UPF_BOOT_AUTOCONF, 10200b9de9cSPaul Mundt .scscr = SCSCR_TE | SCSCR_RE | SCSCR_REIE | 10300b9de9cSPaul Mundt SCSCR_CKE1 | SCSCR_CKE0, 104e5723e0eSPaul Mundt .type = PORT_SCIF, 105d850acf9SLaurent Pinchart }; 106d850acf9SLaurent Pinchart 107d850acf9SLaurent Pinchart static struct resource scif0_resources[] = { 108d850acf9SLaurent Pinchart DEFINE_RES_MEM(0xa4400000, 0x100), 109d850acf9SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0x880)), 11044658dfbSMagnus Damm }; 11144658dfbSMagnus Damm 11244658dfbSMagnus Damm static struct platform_device scif0_device = { 11344658dfbSMagnus Damm .name = "sh-sci", 11444658dfbSMagnus Damm .id = 0, 115d850acf9SLaurent Pinchart .resource = scif0_resources, 116d850acf9SLaurent Pinchart .num_resources = ARRAY_SIZE(scif0_resources), 11744658dfbSMagnus Damm .dev = { 11844658dfbSMagnus Damm .platform_data = &scif0_platform_data, 11944658dfbSMagnus Damm }, 12044658dfbSMagnus Damm }; 12144658dfbSMagnus Damm 12244658dfbSMagnus Damm static struct plat_sci_port scif1_platform_data = { 1239465a54fSNobuhiro Iwamatsu .flags = UPF_BOOT_AUTOCONF, 12400b9de9cSPaul Mundt .scscr = SCSCR_TE | SCSCR_RE | SCSCR_REIE | 12500b9de9cSPaul Mundt SCSCR_CKE1 | SCSCR_CKE0, 1269465a54fSNobuhiro Iwamatsu .type = PORT_SCIF, 127d850acf9SLaurent Pinchart }; 128d850acf9SLaurent Pinchart 129d850acf9SLaurent Pinchart static struct resource scif1_resources[] = { 130d850acf9SLaurent Pinchart DEFINE_RES_MEM(0xa4410000, 0x100), 131d850acf9SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0x900)), 132e5723e0eSPaul Mundt }; 133e5723e0eSPaul Mundt 13444658dfbSMagnus Damm static struct platform_device scif1_device = { 135e5723e0eSPaul Mundt .name = "sh-sci", 13644658dfbSMagnus Damm .id = 1, 137d850acf9SLaurent Pinchart .resource = scif1_resources, 138d850acf9SLaurent Pinchart .num_resources = ARRAY_SIZE(scif1_resources), 139e5723e0eSPaul Mundt .dev = { 14044658dfbSMagnus Damm .platform_data = &scif1_platform_data, 141e5723e0eSPaul Mundt }, 142e5723e0eSPaul Mundt }; 143e5723e0eSPaul Mundt 144e5ad0089SMagnus Damm static struct sh_timer_config tmu0_platform_data = { 145*1399c195SLaurent Pinchart .channels_mask = 7, 146e5ad0089SMagnus Damm }; 147e5ad0089SMagnus Damm 148e5ad0089SMagnus Damm static struct resource tmu0_resources[] = { 149*1399c195SLaurent Pinchart DEFINE_RES_MEM(0xa412fe90, 0x28), 150*1399c195SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0x400)), 151*1399c195SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0x420)), 152*1399c195SLaurent Pinchart DEFINE_RES_IRQ(evt2irq(0x440)), 153e5ad0089SMagnus Damm }; 154e5ad0089SMagnus Damm 155e5ad0089SMagnus Damm static struct platform_device tmu0_device = { 156*1399c195SLaurent Pinchart .name = "sh-tmu-sh3", 157e5ad0089SMagnus Damm .id = 0, 158e5ad0089SMagnus Damm .dev = { 159e5ad0089SMagnus Damm .platform_data = &tmu0_platform_data, 160e5ad0089SMagnus Damm }, 161e5ad0089SMagnus Damm .resource = tmu0_resources, 162e5ad0089SMagnus Damm .num_resources = ARRAY_SIZE(tmu0_resources), 163e5ad0089SMagnus Damm }; 164e5ad0089SMagnus Damm 165e5723e0eSPaul Mundt static struct platform_device *sh7710_devices[] __initdata = { 16644658dfbSMagnus Damm &scif0_device, 16744658dfbSMagnus Damm &scif1_device, 168e5ad0089SMagnus Damm &tmu0_device, 16928b146c8SMagnus Damm &rtc_device, 170e5723e0eSPaul Mundt }; 171e5723e0eSPaul Mundt 172e5723e0eSPaul Mundt static int __init sh7710_devices_setup(void) 173e5723e0eSPaul Mundt { 174e5723e0eSPaul Mundt return platform_add_devices(sh7710_devices, 175e5723e0eSPaul Mundt ARRAY_SIZE(sh7710_devices)); 176e5723e0eSPaul Mundt } 177ba9a6337SMagnus Damm arch_initcall(sh7710_devices_setup); 1789465a54fSNobuhiro Iwamatsu 179e5ad0089SMagnus Damm static struct platform_device *sh7710_early_devices[] __initdata = { 18044658dfbSMagnus Damm &scif0_device, 18144658dfbSMagnus Damm &scif1_device, 182e5ad0089SMagnus Damm &tmu0_device, 183e5ad0089SMagnus Damm }; 184e5ad0089SMagnus Damm 185e5ad0089SMagnus Damm void __init plat_early_device_setup(void) 186e5ad0089SMagnus Damm { 187e5ad0089SMagnus Damm early_platform_add_devices(sh7710_early_devices, 188e5ad0089SMagnus Damm ARRAY_SIZE(sh7710_early_devices)); 189e5ad0089SMagnus Damm } 190e5ad0089SMagnus Damm 19190015c89SMagnus Damm void __init plat_irq_setup(void) 1929465a54fSNobuhiro Iwamatsu { 19328b146c8SMagnus Damm register_intc_controller(&intc_desc); 194a276e588SMagnus Damm plat_irq_setup_sh3(); 1959465a54fSNobuhiro Iwamatsu } 196