setup.c 4.1 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2
 *  linux/arch/m32r/platforms/mappi/setup.c
L
Linus Torvalds 已提交
3 4 5
 *
 *  Setup routines for Renesas MAPPI Board
 *
6 7
 *  Copyright (c) 2001-2005  Hiroyuki Kondo, Hirokazu Takata,
 *                           Hitoshi Yamamoto
L
Linus Torvalds 已提交
8 9 10 11 12
 */

#include <linux/irq.h>
#include <linux/kernel.h>
#include <linux/init.h>
13
#include <linux/platform_device.h>
L
Linus Torvalds 已提交
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

#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_mappi_irq(unsigned int irq)
{
	unsigned long port, data;

	port = irq2port(irq);
	data = icu_data[irq].icucr|M32R_ICUCR_ILEVEL7;
	outl(data, port);
}

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

	port = irq2port(irq);
	data = icu_data[irq].icucr|M32R_ICUCR_IEN|M32R_ICUCR_ILEVEL6;
	outl(data, port);
}

T
Thomas Gleixner 已提交
41
static void mask_mappi(struct irq_data *data)
L
Linus Torvalds 已提交
42
{
T
Thomas Gleixner 已提交
43
	disable_mappi_irq(data->irq);
L
Linus Torvalds 已提交
44 45
}

T
Thomas Gleixner 已提交
46
static void unmask_mappi(struct irq_data *data)
L
Linus Torvalds 已提交
47
{
T
Thomas Gleixner 已提交
48
	enable_mappi_irq(data->irq);
L
Linus Torvalds 已提交
49 50
}

T
Thomas Gleixner 已提交
51
static void shutdown_mappi(struct irq_data *data)
L
Linus Torvalds 已提交
52 53 54
{
	unsigned long port;

T
Thomas Gleixner 已提交
55
	port = irq2port(data->irq);
L
Linus Torvalds 已提交
56 57 58
	outl(M32R_ICUCR_ILEVEL7, port);
}

59
static struct irq_chip mappi_irq_type =
L
Linus Torvalds 已提交
60
{
T
Thomas Gleixner 已提交
61 62 63 64
	.name		= "MAPPI-IRQ",
	.irq_shutdown	= shutdown_mappi,
	.irq_mask	= mask_mappi,
	.irq_unmask	= unmask_mappi,
L
Linus Torvalds 已提交
65 66 67 68 69 70 71 72 73 74 75 76 77
};

void __init init_IRQ(void)
{
	static int once = 0;

	if (once)
		return;
	else
		once++;

#ifdef CONFIG_NE2000
	/* INT0 : LAN controller (RTL8019AS) */
T
Thomas Gleixner 已提交
78
	irq_set_chip_and_handler(M32R_IRQ_INT0, &mappi_irq_type,
T
Thomas Gleixner 已提交
79
				 handle_level_irq);
80
	icu_data[M32R_IRQ_INT0].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD11;
L
Linus Torvalds 已提交
81 82 83 84
	disable_mappi_irq(M32R_IRQ_INT0);
#endif /* CONFIG_M32R_NE2000 */

	/* MFT2 : system timer */
T
Thomas Gleixner 已提交
85
	irq_set_chip_and_handler(M32R_IRQ_MFT2, &mappi_irq_type,
T
Thomas Gleixner 已提交
86
				 handle_level_irq);
L
Linus Torvalds 已提交
87 88 89 90 91
	icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN;
	disable_mappi_irq(M32R_IRQ_MFT2);

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

	/* SIO0_S : uart send data */
T
Thomas Gleixner 已提交
98
	irq_set_chip_and_handler(M32R_IRQ_SIO0_S, &mappi_irq_type,
T
Thomas Gleixner 已提交
99
				 handle_level_irq);
L
Linus Torvalds 已提交
100 101 102 103
	icu_data[M32R_IRQ_SIO0_S].icucr = 0;
	disable_mappi_irq(M32R_IRQ_SIO0_S);

	/* SIO1_R : uart receive data */
T
Thomas Gleixner 已提交
104
	irq_set_chip_and_handler(M32R_IRQ_SIO1_R, &mappi_irq_type,
T
Thomas Gleixner 已提交
105
				 handle_level_irq);
L
Linus Torvalds 已提交
106 107 108 109
	icu_data[M32R_IRQ_SIO1_R].icucr = 0;
	disable_mappi_irq(M32R_IRQ_SIO1_R);

	/* SIO1_S : uart send data */
T
Thomas Gleixner 已提交
110
	irq_set_chip_and_handler(M32R_IRQ_SIO1_S, &mappi_irq_type,
T
Thomas Gleixner 已提交
111
				 handle_level_irq);
L
Linus Torvalds 已提交
112 113 114 115 116 117
	icu_data[M32R_IRQ_SIO1_S].icucr = 0;
	disable_mappi_irq(M32R_IRQ_SIO1_S);
#endif /* CONFIG_SERIAL_M32R_SIO */

#if defined(CONFIG_M32R_PCC)
	/* INT1 : pccard0 interrupt */
T
Thomas Gleixner 已提交
118
	irq_set_chip_and_handler(M32R_IRQ_INT1, &mappi_irq_type,
T
Thomas Gleixner 已提交
119
				 handle_level_irq);
L
Linus Torvalds 已提交
120 121 122 123
	icu_data[M32R_IRQ_INT1].icucr = M32R_ICUCR_IEN | M32R_ICUCR_ISMOD00;
	disable_mappi_irq(M32R_IRQ_INT1);

	/* INT2 : pccard1 interrupt */
T
Thomas Gleixner 已提交
124
	irq_set_chip_and_handler(M32R_IRQ_INT2, &mappi_irq_type,
T
Thomas Gleixner 已提交
125
				 handle_level_irq);
L
Linus Torvalds 已提交
126 127 128 129
	icu_data[M32R_IRQ_INT2].icucr = M32R_ICUCR_IEN | M32R_ICUCR_ISMOD00;
	disable_mappi_irq(M32R_IRQ_INT2);
#endif /* CONFIG_M32RPCC */
}
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175

#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  = 0x10200000UL,
		.end    = 0x1033FFFFUL,
		.flags  = IORESOURCE_MEM,
	},
	[1] = {
		.start  = 0x10000000UL,
		.end    = 0x100001FFUL,
		.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,
};

static int __init platform_init(void)
{
	platform_device_register(&s1d13xxxfb_device);
	return 0;
}
arch_initcall(platform_init);
#endif