setup-sh4-202.c 3.5 KB
Newer Older
1 2 3 4
/*
 * SH4-202 Setup
 *
 *  Copyright (C) 2006  Paul Mundt
M
Magnus Damm 已提交
5
 *  Copyright (C) 2009  Magnus Damm
6 7 8 9 10 11 12 13
 *
 * 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 <linux/platform_device.h>
#include <linux/init.h>
#include <linux/serial.h>
14
#include <linux/serial_sci.h>
M
Magnus Damm 已提交
15
#include <linux/sh_timer.h>
P
Paul Mundt 已提交
16
#include <linux/sh_intc.h>
M
Magnus Damm 已提交
17
#include <linux/io.h>
18

19 20
static struct plat_sci_port scif0_platform_data = {
	.flags		= UPF_BOOT_AUTOCONF,
P
Paul Mundt 已提交
21
	.scscr		= SCSCR_RE | SCSCR_TE | SCSCR_REIE,
22
	.type		= PORT_SCIF,
23 24 25 26 27 28 29 30
};

static struct resource scif0_resources[] = {
	DEFINE_RES_MEM(0xffe80000, 0x100),
	DEFINE_RES_IRQ(evt2irq(0x700)),
	DEFINE_RES_IRQ(evt2irq(0x720)),
	DEFINE_RES_IRQ(evt2irq(0x760)),
	DEFINE_RES_IRQ(evt2irq(0x740)),
31 32
};

33
static struct platform_device scif0_device = {
34
	.name		= "sh-sci",
35
	.id		= 0,
36 37
	.resource	= scif0_resources,
	.num_resources	= ARRAY_SIZE(scif0_resources),
38
	.dev		= {
39
		.platform_data	= &scif0_platform_data,
40 41 42
	},
};

M
Magnus Damm 已提交
43
static struct sh_timer_config tmu0_platform_data = {
44
	.channels_mask = 7,
M
Magnus Damm 已提交
45 46 47
};

static struct resource tmu0_resources[] = {
48 49 50 51
	DEFINE_RES_MEM(0xffd80000, 0x30),
	DEFINE_RES_IRQ(evt2irq(0x400)),
	DEFINE_RES_IRQ(evt2irq(0x420)),
	DEFINE_RES_IRQ(evt2irq(0x440)),
M
Magnus Damm 已提交
52 53 54
};

static struct platform_device tmu0_device = {
55
	.name		= "sh-tmu",
M
Magnus Damm 已提交
56 57 58 59 60 61 62 63
	.id		= 0,
	.dev = {
		.platform_data	= &tmu0_platform_data,
	},
	.resource	= tmu0_resources,
	.num_resources	= ARRAY_SIZE(tmu0_resources),
};

64
static struct platform_device *sh4202_devices[] __initdata = {
65
	&scif0_device,
M
Magnus Damm 已提交
66
	&tmu0_device,
67 68 69 70 71 72 73
};

static int __init sh4202_devices_setup(void)
{
	return platform_add_devices(sh4202_devices,
				    ARRAY_SIZE(sh4202_devices));
}
74
arch_initcall(sh4202_devices_setup);
M
Magnus Damm 已提交
75

M
Magnus Damm 已提交
76
static struct platform_device *sh4202_early_devices[] __initdata = {
77
	&scif0_device,
M
Magnus Damm 已提交
78 79 80 81 82 83 84 85 86
	&tmu0_device,
};

void __init plat_early_device_setup(void)
{
	early_platform_add_devices(sh4202_early_devices,
				   ARRAY_SIZE(sh4202_early_devices));
}

M
Magnus Damm 已提交
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
enum {
	UNUSED = 0,

	/* interrupt sources */
	IRL0, IRL1, IRL2, IRL3, /* only IRLM mode supported */
	HUDI, TMU0, TMU1, TMU2, RTC, SCIF, WDT,
};

static struct intc_vect vectors[] __initdata = {
	INTC_VECT(HUDI, 0x600),
	INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420),
	INTC_VECT(TMU2, 0x440), INTC_VECT(TMU2, 0x460),
	INTC_VECT(RTC, 0x480), INTC_VECT(RTC, 0x4a0),
	INTC_VECT(RTC, 0x4c0),
	INTC_VECT(SCIF, 0x700), INTC_VECT(SCIF, 0x720),
	INTC_VECT(SCIF, 0x740), INTC_VECT(SCIF, 0x760),
	INTC_VECT(WDT, 0x560),
};

static struct intc_prio_reg prio_registers[] __initdata = {
	{ 0xffd00004, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } },
	{ 0xffd00008, 0, 16, 4, /* IPRB */ { WDT, 0, 0, 0 } },
	{ 0xffd0000c, 0, 16, 4, /* IPRC */ { 0, 0, SCIF, HUDI } },
	{ 0xffd00010, 0, 16, 4, /* IPRD */ { IRL0, IRL1, IRL2, IRL3 } },
};

static DECLARE_INTC_DESC(intc_desc, "sh4-202", vectors, NULL,
			 NULL, prio_registers, NULL);

static struct intc_vect vectors_irlm[] __initdata = {
	INTC_VECT(IRL0, 0x240), INTC_VECT(IRL1, 0x2a0),
	INTC_VECT(IRL2, 0x300), INTC_VECT(IRL3, 0x360),
};

static DECLARE_INTC_DESC(intc_desc_irlm, "sh4-202_irlm", vectors_irlm, NULL,
			 NULL, prio_registers, NULL);

M
Magnus Damm 已提交
124 125
void __init plat_irq_setup(void)
{
M
Magnus Damm 已提交
126 127 128 129 130 131 132 133 134 135
	register_intc_controller(&intc_desc);
}

#define INTC_ICR	0xffd00000UL
#define INTC_ICR_IRLM   (1<<7)

void __init plat_irq_setup_pins(int mode)
{
	switch (mode) {
	case IRQ_MODE_IRQ: /* individual interrupt mode for IRL3-0 */
136
		__raw_writew(__raw_readw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR);
M
Magnus Damm 已提交
137 138 139 140 141
		register_intc_controller(&intc_desc_irlm);
		break;
	default:
		BUG();
	}
M
Magnus Damm 已提交
142
}