setup.c 5.3 KB
Newer Older
1
/*
2
 *  linux/arch/m32r/platforms/mappi3/setup.c
3 4 5
 *
 *  Setup routines for Renesas MAPPI-III(M3A-2170) Board
 *
6 7
 *  Copyright (c) 2001-2005  Hiroyuki Kondo, Hirokazu Takata,
 *                           Hitoshi Yamamoto, Mamoru Sakugawa
8 9 10 11 12
 */

#include <linux/irq.h>
#include <linux/kernel.h>
#include <linux/init.h>
13
#include <linux/platform_device.h>
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

#include <asm/system.h>
#include <asm/m32r.h>
#include <asm/io.h>

#define irq2port(x) (M32R_ICU_CR1_PORTL + ((x - 1) * sizeof(unsigned long)))

icu_data_t icu_data[NR_IRQS];

static void disable_mappi3_irq(unsigned int irq)
{
	unsigned long port, data;

	if ((irq == 0) ||(irq >= NR_IRQS))  {
		printk("bad irq 0x%08x\n", irq);
		return;
	}
	port = irq2port(irq);
	data = icu_data[irq].icucr|M32R_ICUCR_ILEVEL7;
	outl(data, port);
}

static void enable_mappi3_irq(unsigned int irq)
{
	unsigned long port, data;

	if ((irq == 0) ||(irq >= NR_IRQS))  {
		printk("bad irq 0x%08x\n", irq);
		return;
	}
	port = irq2port(irq);
	data = icu_data[irq].icucr|M32R_ICUCR_IEN|M32R_ICUCR_ILEVEL6;
	outl(data, port);
}

T
Thomas Gleixner 已提交
49
static void mask_mappi3(struct irq_data *data)
50
{
T
Thomas Gleixner 已提交
51
	disable_mappi3_irq(data->irq);
52 53
}

T
Thomas Gleixner 已提交
54
static void unmask_mappi3(struct irq_data *data)
55
{
T
Thomas Gleixner 已提交
56
	enable_mappi3_irq(data->irq);
57 58
}

T
Thomas Gleixner 已提交
59
static void shutdown_mappi3(struct irq_data *data)
60 61 62
{
	unsigned long port;

T
Thomas Gleixner 已提交
63
	port = irq2port(data->irq);
64 65 66
	outl(M32R_ICUCR_ILEVEL7, port);
}

T
Thomas Gleixner 已提交
67 68 69 70 71
static struct irq_chip mappi3_irq_type = {
	.name		= "MAPPI3-IRQ",
	.irq_shutdown	= shutdown_mappi3,
	.irq_mask	= mask_mappi3,
	.irq_unmask	= unmask_mappi3,
72 73 74 75 76 77
};

void __init init_IRQ(void)
{
#if defined(CONFIG_SMC91X)
	/* INT0 : LAN controller (SMC91111) */
T
Thomas Gleixner 已提交
78 79
	set_irq_chip_and_handler(M32R_IRQ_INT0, &mappi3_irq_type,
				 handle_level_irq);
80 81 82 83 84
	icu_data[M32R_IRQ_INT0].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10;
	disable_mappi3_irq(M32R_IRQ_INT0);
#endif  /* CONFIG_SMC91X */

	/* MFT2 : system timer */
T
Thomas Gleixner 已提交
85 86
	set_irq_chip_and_handler(M32R_IRQ_MFT2, &mappi3_irq_type,
				 handle_level_irq);
87 88 89 90 91
	icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN;
	disable_mappi3_irq(M32R_IRQ_MFT2);

#ifdef CONFIG_SERIAL_M32R_SIO
	/* SIO0_R : uart receive data */
T
Thomas Gleixner 已提交
92 93
	set_irq_chip_and_handler(M32R_IRQ_SIO0_R, &mappi3_irq_type,
				 handle_level_irq);
94 95 96 97
	icu_data[M32R_IRQ_SIO0_R].icucr = 0;
	disable_mappi3_irq(M32R_IRQ_SIO0_R);

	/* SIO0_S : uart send data */
T
Thomas Gleixner 已提交
98 99
	set_irq_chip_and_handler(M32R_IRQ_SIO0_S, &mappi3_irq_type,
				 handle_level_irq);
100 101 102
	icu_data[M32R_IRQ_SIO0_S].icucr = 0;
	disable_mappi3_irq(M32R_IRQ_SIO0_S);
	/* SIO1_R : uart receive data */
T
Thomas Gleixner 已提交
103 104
	set_irq_chip_and_handler(M32R_IRQ_SIO1_R, &mappi3_irq_type,
				 handle_level_irq);
105 106 107 108
	icu_data[M32R_IRQ_SIO1_R].icucr = 0;
	disable_mappi3_irq(M32R_IRQ_SIO1_R);

	/* SIO1_S : uart send data */
T
Thomas Gleixner 已提交
109 110
	set_irq_chip_and_handler(M32R_IRQ_SIO1_S, &mappi3_irq_type,
				 handle_level_irq);
111 112 113 114 115 116
	icu_data[M32R_IRQ_SIO1_S].icucr = 0;
	disable_mappi3_irq(M32R_IRQ_SIO1_S);
#endif  /* CONFIG_M32R_USE_DBG_CONSOLE */

#if defined(CONFIG_USB)
	/* INT1 : USB Host controller interrupt */
T
Thomas Gleixner 已提交
117 118
	set_irq_chip_and_handler(M32R_IRQ_INT1, &mappi3_irq_type,
				 handle_level_irq);
119 120 121 122
	icu_data[M32R_IRQ_INT1].icucr = M32R_ICUCR_ISMOD01;
	disable_mappi3_irq(M32R_IRQ_INT1);
#endif /* CONFIG_USB */

123
	/* CFC IREQ */
T
Thomas Gleixner 已提交
124 125
	set_irq_chip_and_handler(PLD_IRQ_CFIREQ, &mappi3_irq_type,
				 handle_level_irq);
126 127 128 129
	icu_data[PLD_IRQ_CFIREQ].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD01;
	disable_mappi3_irq(PLD_IRQ_CFIREQ);

#if defined(CONFIG_M32R_CFC)
130
	/* ICUCR41: CFC Insert & eject */
T
Thomas Gleixner 已提交
131 132
	set_irq_chip_and_handler(PLD_IRQ_CFC_INSERT, &mappi3_irq_type,
				 handle_level_irq);
133 134 135 136
	icu_data[PLD_IRQ_CFC_INSERT].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD00;
	disable_mappi3_irq(PLD_IRQ_CFC_INSERT);

#endif /* CONFIG_M32R_CFC */
137 138

	/* IDE IREQ */
T
Thomas Gleixner 已提交
139 140
	set_irq_chip_and_handler(PLD_IRQ_IDEIREQ, &mappi3_irq_type,
				 handle_level_irq);
141 142 143
	icu_data[PLD_IRQ_IDEIREQ].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10;
	disable_mappi3_irq(PLD_IRQ_IDEIREQ);

144 145
}

146 147
#if defined(CONFIG_SMC91X)

148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
#define LAN_IOSTART     0x300
#define LAN_IOEND       0x320
static struct resource smc91x_resources[] = {
	[0] = {
		.start  = (LAN_IOSTART),
		.end    = (LAN_IOEND),
		.flags  = IORESOURCE_MEM,
	},
	[1] = {
		.start  = M32R_IRQ_INT0,
		.end    = M32R_IRQ_INT0,
		.flags  = IORESOURCE_IRQ,
	}
};

static struct platform_device smc91x_device = {
	.name		= "smc91x",
	.id		= 0,
	.num_resources  = ARRAY_SIZE(smc91x_resources),
	.resource       = smc91x_resources,
};

170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
#endif

#if defined(CONFIG_FB_S1D13XXX)

#include <video/s1d13xxxfb.h>
#include <asm/s1d13806.h>

static struct s1d13xxxfb_pdata s1d13xxxfb_data = {
	.initregs		= s1d13xxxfb_initregs,
	.initregssize		= ARRAY_SIZE(s1d13xxxfb_initregs),
	.platform_init_video	= NULL,
#ifdef CONFIG_PM
	.platform_suspend_video	= NULL,
	.platform_resume_video	= NULL,
#endif
};

static struct resource s1d13xxxfb_resources[] = {
	[0] = {
		.start  = 0x1d600000UL,
		.end    = 0x1d73FFFFUL,
		.flags  = IORESOURCE_MEM,
	},
	[1] = {
		.start  = 0x1d400000UL,
		.end    = 0x1d4001FFUL,
		.flags  = IORESOURCE_MEM,
	}
};

static struct platform_device s1d13xxxfb_device = {
	.name		= S1D_DEVICENAME,
	.id		= 0,
	.dev            = {
		.platform_data  = &s1d13xxxfb_data,
	},
	.num_resources  = ARRAY_SIZE(s1d13xxxfb_resources),
	.resource       = s1d13xxxfb_resources,
};
#endif

211 212
static int __init platform_init(void)
{
213
#if defined(CONFIG_SMC91X)
214
	platform_device_register(&smc91x_device);
215 216 217 218
#endif
#if defined(CONFIG_FB_S1D13XXX)
	platform_device_register(&s1d13xxxfb_device);
#endif
219 220 221
	return 0;
}
arch_initcall(platform_init);