colibri-pxa270.c 6.0 KB
Newer Older
1
/*
2
 *  linux/arch/arm/mach-pxa/colibri-pxa270.c
3
 *
4
 *  Support for Toradex PXA270 based Colibri module
5
 *  Daniel Mack <daniel@caiaq.de>
6
 *  Marek Vasut <marek.vasut@gmail.com>
7 8 9 10 11 12 13 14
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 as
 *  published by the Free Software Foundation.
 */

#include <linux/init.h>
#include <linux/interrupt.h>
15
#include <linux/kernel.h>
16 17 18
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
19 20
#include <linux/platform_device.h>
#include <linux/sysdev.h>
21
#include <linux/ucb1400.h>
22

23 24
#include <asm/mach/arch.h>
#include <asm/mach/flash.h>
25 26
#include <asm/mach-types.h>
#include <asm/sizes.h>
27

28
#include <mach/audio.h>
29
#include <mach/colibri.h>
30
#include <mach/pxa27x.h>
31 32

#include "devices.h"
33
#include "generic.h"
34

35 36 37
/******************************************************************************
 * Pin configuration
 ******************************************************************************/
38
static mfp_cfg_t colibri_pxa270_pin_config[] __initdata = {
39
	/* Ethernet */
40 41
	GPIO78_nCS_2,	/* Ethernet CS */
	GPIO114_GPIO,	/* Ethernet IRQ */
42

43 44 45 46 47 48 49 50
	/* AC97 */
	GPIO28_AC97_BITCLK,
	GPIO29_AC97_SDATA_IN_0,
	GPIO30_AC97_SDATA_OUT,
	GPIO31_AC97_SYNC,
	GPIO95_AC97_nRESET,
	GPIO98_AC97_SYSCLK,
	GPIO113_GPIO,	/* Touchscreen IRQ */
51 52
};

53 54 55 56
/******************************************************************************
 * NOR Flash
 ******************************************************************************/
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
57 58 59 60 61
static struct mtd_partition colibri_partitions[] = {
	{
		.name =		"Bootloader",
		.offset =	0x00000000,
		.size =		0x00040000,
62
		.mask_flags =	MTD_WRITEABLE	/* force read-only */
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
	}, {
		.name =		"Kernel",
		.offset =	0x00040000,
		.size =		0x00400000,
		.mask_flags =	0
	}, {
		.name =		"Rootfs",
		.offset =	0x00440000,
		.size =		MTDPART_SIZ_FULL,
		.mask_flags =	0
	}
};

static struct physmap_flash_data colibri_flash_data[] = {
	{
		.width		= 4,			/* bankwidth in bytes */
		.parts		= colibri_partitions,
		.nr_parts	= ARRAY_SIZE(colibri_partitions)
	}
};

84
static struct resource colibri_pxa270_flash_resource = {
85 86 87 88 89
	.start	= PXA_CS0_PHYS,
	.end	= PXA_CS0_PHYS + SZ_32M - 1,
	.flags	= IORESOURCE_MEM,
};

90
static struct platform_device colibri_pxa270_flash_device = {
91 92 93 94 95
	.name	= "physmap-flash",
	.id	= 0,
	.dev 	= {
		.platform_data = colibri_flash_data,
	},
96
	.resource = &colibri_pxa270_flash_resource,
97 98 99
	.num_resources = 1,
};

100 101 102 103 104 105 106 107 108 109 110 111 112
static void __init colibri_pxa270_nor_init(void)
{
	platform_device_register(&colibri_pxa270_flash_device);
}
#else
static inline void colibri_pxa270_nor_init(void) {}
#endif

/******************************************************************************
 * Ethernet
 ******************************************************************************/
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
static struct resource colibri_pxa270_dm9000_resources[] = {
113
	{
114 115
		.start	= PXA_CS2_PHYS,
		.end	= PXA_CS2_PHYS + 3,
116 117
		.flags	= IORESOURCE_MEM,
	},
118
	{
119 120
		.start	= PXA_CS2_PHYS + 4,
		.end	= PXA_CS2_PHYS + 4 + 500,
121 122
		.flags	= IORESOURCE_MEM,
	},
123
	{
124 125
		.start	= gpio_to_irq(GPIO114_COLIBRI_PXA270_ETH_IRQ),
		.end	= gpio_to_irq(GPIO114_COLIBRI_PXA270_ETH_IRQ),
126
		.flags	= IORESOURCE_IRQ | IRQF_TRIGGER_RISING,
127 128 129
	},
};

130
static struct platform_device colibri_pxa270_dm9000_device = {
131 132
	.name		= "dm9000",
	.id		= -1,
133 134
	.num_resources	= ARRAY_SIZE(colibri_pxa270_dm9000_resources),
	.resource	= colibri_pxa270_dm9000_resources,
135 136
};

137 138 139 140 141 142
static void __init colibri_pxa270_eth_init(void)
{
	platform_device_register(&colibri_pxa270_dm9000_device);
}
#else
static inline void colibri_pxa270_eth_init(void) {}
143
#endif
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
/******************************************************************************
 * Audio and Touchscreen
 ******************************************************************************/
#if	defined(CONFIG_TOUCHSCREEN_UCB1400) || \
	defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE)
static pxa2xx_audio_ops_t colibri_pxa270_ac97_pdata = {
	.reset_gpio	= 95,
};

static struct ucb1400_pdata colibri_pxa270_ucb1400_pdata = {
	.irq		= gpio_to_irq(GPIO113_COLIBRI_PXA270_TS_IRQ),
};

static struct platform_device colibri_pxa270_ucb1400_device = {
	.name		= "ucb1400_core",
	.id		= -1,
	.dev		= {
		.platform_data = &colibri_pxa270_ucb1400_pdata,
	},
};

static void __init colibri_pxa270_tsc_init(void)
{
	pxa_set_ac97_info(&colibri_pxa270_ac97_pdata);
	platform_device_register(&colibri_pxa270_ucb1400_device);
}
#else
static inline void colibri_pxa270_tsc_init(void) {}
#endif

175 176 177
static int colibri_pxa270_baseboard;
core_param(colibri_pxa270_baseboard, colibri_pxa270_baseboard, int, 0444);

178
static void __init colibri_pxa270_init(void)
179
{
180
	pxa2xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa270_pin_config));
181 182 183

	colibri_pxa270_nor_init();
	colibri_pxa270_eth_init();
184
	colibri_pxa270_tsc_init();
185 186 187 188 189

	switch (colibri_pxa270_baseboard) {
	case COLIBRI_PXA270_EVALBOARD:
		colibri_pxa270_evalboard_init();
		break;
190 191 192
	case COLIBRI_PXA270_INCOME:
		colibri_pxa270_income_boardinit();
		break;
193 194 195 196
	default:
		printk(KERN_ERR "Illegal colibri_pxa270_baseboard type %d\n",
				colibri_pxa270_baseboard);
	}
197 198
}

199 200 201 202 203 204 205 206 207 208
/* The "Income s.r.o. SH-Dmaster PXA270 SBC" board can be booted either
 * with the INCOME mach type or with COLIBRI and the kernel parameter
 * "colibri_pxa270_baseboard=1"
 */
static void __init colibri_pxa270_income_init(void)
{
	colibri_pxa270_baseboard = COLIBRI_PXA270_INCOME;
	colibri_pxa270_init();
}

209
MACHINE_START(COLIBRI, "Toradex Colibri PXA270")
210 211 212
	.phys_io	= 0x40000000,
	.io_pg_offst	= (io_p2v(0x40000000) >> 18) & 0xfffc,
	.boot_params	= COLIBRI_SDRAM_BASE + 0x100,
213
	.init_machine	= colibri_pxa270_init,
214 215 216 217
	.map_io		= pxa_map_io,
	.init_irq	= pxa27x_init_irq,
	.timer		= &pxa_timer,
MACHINE_END
218

219 220 221 222 223 224 225 226 227 228
MACHINE_START(INCOME, "Income s.r.o. SH-Dmaster PXA270 SBC")
	.phys_io	= 0x40000000,
	.io_pg_offst	= (io_p2v(0x40000000) >> 18) & 0xfffc,
	.boot_params	= 0xa0000100,
	.init_machine	= colibri_pxa270_income_init,
	.map_io		= pxa_map_io,
	.init_irq	= pxa27x_init_irq,
	.timer		= &pxa_timer,
MACHINE_END