/* * SH7750/SH7751 Setup * * Copyright (C) 2006 Paul Mundt * Copyright (C) 2006 Jamie Lenehan * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. */ #include #include #include #include #include static struct resource rtc_resources[] = { [0] = { .start = 0xffc80000, .end = 0xffc80000 + 0x58 - 1, .flags = IORESOURCE_IO, }, [1] = { /* Period IRQ */ .start = 21, .flags = IORESOURCE_IRQ, }, [2] = { /* Carry IRQ */ .start = 22, .flags = IORESOURCE_IRQ, }, [3] = { /* Alarm IRQ */ .start = 20, .flags = IORESOURCE_IRQ, }, }; static struct platform_device rtc_device = { .name = "sh-rtc", .id = -1, .num_resources = ARRAY_SIZE(rtc_resources), .resource = rtc_resources, }; static struct plat_sci_port sci_platform_data[] = { { .mapbase = 0xffe00000, .flags = UPF_BOOT_AUTOCONF, .type = PORT_SCI, .irqs = { 23, 24, 25, 0 }, }, { .mapbase = 0xffe80000, .flags = UPF_BOOT_AUTOCONF, .type = PORT_SCIF, .irqs = { 40, 41, 43, 42 }, }, { .flags = 0, } }; static struct platform_device sci_device = { .name = "sh-sci", .id = -1, .dev = { .platform_data = sci_platform_data, }, }; static struct platform_device *sh7750_devices[] __initdata = { &rtc_device, &sci_device, }; static int __init sh7750_devices_setup(void) { return platform_add_devices(sh7750_devices, ARRAY_SIZE(sh7750_devices)); } __initcall(sh7750_devices_setup); static struct ipr_data sh7750_ipr_map[] = { /* IRQ, IPR-idx, shift, priority */ { 16, 0, 12, 2 }, /* TMU0 TUNI*/ { 17, 0, 12, 2 }, /* TMU1 TUNI */ { 18, 0, 4, 2 }, /* TMU2 TUNI */ { 19, 0, 4, 2 }, /* TMU2 TIPCI */ { 27, 1, 12, 2 }, /* WDT ITI */ { 20, 0, 0, 2 }, /* RTC ATI (alarm) */ { 21, 0, 0, 2 }, /* RTC PRI (period) */ { 22, 0, 0, 2 }, /* RTC CUI (carry) */ { 23, 1, 4, 3 }, /* SCI ERI */ { 24, 1, 4, 3 }, /* SCI RXI */ { 25, 1, 4, 3 }, /* SCI TXI */ { 40, 2, 4, 3 }, /* SCIF ERI */ { 41, 2, 4, 3 }, /* SCIF RXI */ { 42, 2, 4, 3 }, /* SCIF BRI */ { 43, 2, 4, 3 }, /* SCIF TXI */ { 34, 2, 8, 7 }, /* DMAC DMTE0 */ { 35, 2, 8, 7 }, /* DMAC DMTE1 */ { 36, 2, 8, 7 }, /* DMAC DMTE2 */ { 37, 2, 8, 7 }, /* DMAC DMTE3 */ { 28, 2, 8, 7 }, /* DMAC DMAE */ }; static struct ipr_data sh7751_ipr_map[] = { { 44, 2, 8, 7 }, /* DMAC DMTE4 */ { 45, 2, 8, 7 }, /* DMAC DMTE5 */ { 46, 2, 8, 7 }, /* DMAC DMTE6 */ { 47, 2, 8, 7 }, /* DMAC DMTE7 */ /* The following use INTC_INPRI00 for masking, which is a 32-bit register, not a 16-bit register like the IPRx registers, so it would need special support */ /*{ 72, INTPRI00, 8, ? },*/ /* TMU3 TUNI */ /*{ 76, INTPRI00, 12, ? },*/ /* TMU4 TUNI */ }; static unsigned long ipr_offsets[] = { 0xffd00004UL, /* 0: IPRA */ 0xffd00008UL, /* 1: IPRB */ 0xffd0000cUL, /* 2: IPRC */ 0xffd00010UL, /* 3: IPRD */ }; /* given the IPR index return the address of the IPR register */ unsigned int map_ipridx_to_addr(int idx) { if (idx >= ARRAY_SIZE(ipr_offsets)) return 0; return ipr_offsets[idx]; } #define INTC_ICR 0xffd00000UL #define INTC_ICR_IRLM (1<<7) /* enable individual interrupt mode for external interupts */ void ipr_irq_enable_irlm(void) { ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR); } void __init init_IRQ_ipr() { make_ipr_irq(sh7750_ipr_map, ARRAY_SIZE(sh7750_ipr_map)); #ifdef CONFIG_CPU_SUBTYPE_SH7751 make_ipr_irq(sh7751_ipr_map, ARRAY_SIZE(sh7751_ipr_map)); #endif }