blob: 3675e844b9b1be62bf45d5c133a55146cc680237 [file] [log] [blame]
Sandeep Paulraj37dd0092009-06-09 16:28:15 -04001/*
2 * TI DaVinci DM365 EVM board support
3 *
4 * Copyright (C) 2009 Texas Instruments Incorporated
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation version 2.
9 *
10 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
11 * kind, whether express or implied; without even the implied warranty
12 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 */
15#include <linux/kernel.h>
16#include <linux/module.h>
17#include <linux/init.h>
18#include <linux/dma-mapping.h>
19#include <linux/i2c.h>
20#include <linux/io.h>
21#include <linux/clk.h>
Sandeep Paulraj8ed0a9d2009-06-20 12:23:39 -040022#include <linux/i2c/at24.h>
Sandeep Paulraj37b798d2009-06-20 14:15:51 -040023#include <linux/mtd/mtd.h>
24#include <linux/mtd/partitions.h>
25#include <linux/mtd/nand.h>
Sandeep Paulraj37dd0092009-06-09 16:28:15 -040026#include <asm/setup.h>
27#include <asm/mach-types.h>
28#include <asm/mach/arch.h>
29#include <asm/mach/map.h>
Sandeep Paulraj8ed0a9d2009-06-20 12:23:39 -040030#include <mach/mux.h>
Sandeep Paulraj37dd0092009-06-09 16:28:15 -040031#include <mach/hardware.h>
32#include <mach/dm365.h>
33#include <mach/psc.h>
34#include <mach/common.h>
35#include <mach/i2c.h>
36#include <linux/i2c.h>
37#include <mach/serial.h>
38#include <mach/common.h>
Sandeep Paulraja45c8ba2009-06-20 14:00:52 -040039#include <mach/mmc.h>
Sandeep Paulraj37b798d2009-06-20 14:15:51 -040040#include <mach/nand.h>
41
42#define DM365_ASYNC_EMIF_CONTROL_BASE 0x01d10000
43#define DM365_ASYNC_EMIF_DATA_CE0_BASE 0x02000000
Sandeep Paulraj37dd0092009-06-09 16:28:15 -040044
Sandeep Paulraj8ed0a9d2009-06-20 12:23:39 -040045#define DM365_EVM_PHY_MASK (0x2)
46#define DM365_EVM_MDIO_FREQUENCY (2200000) /* PHY bus frequency */
47
Sandeep Paulraj37b798d2009-06-20 14:15:51 -040048/* NOTE: this is geared for the standard config, with a socketed
49 * 2 GByte Micron NAND (MT29F16G08FAA) using 128KB sectors. If you
50 * swap chips with a different block size, partitioning will
51 * need to be changed. This NAND chip MT29F16G08FAA is the default
52 * NAND shipped with the Spectrum Digital DM365 EVM
53 */
54#define NAND_BLOCK_SIZE SZ_128K
55
56static struct mtd_partition davinci_nand_partitions[] = {
57 {
58 /* UBL (a few copies) plus U-Boot */
59 .name = "bootloader",
60 .offset = 0,
61 .size = 28 * NAND_BLOCK_SIZE,
62 .mask_flags = MTD_WRITEABLE, /* force read-only */
63 }, {
64 /* U-Boot environment */
65 .name = "params",
66 .offset = MTDPART_OFS_APPEND,
67 .size = 2 * NAND_BLOCK_SIZE,
68 .mask_flags = 0,
69 }, {
70 .name = "kernel",
71 .offset = MTDPART_OFS_APPEND,
72 .size = SZ_4M,
73 .mask_flags = 0,
74 }, {
75 .name = "filesystem1",
76 .offset = MTDPART_OFS_APPEND,
77 .size = SZ_512M,
78 .mask_flags = 0,
79 }, {
80 .name = "filesystem2",
81 .offset = MTDPART_OFS_APPEND,
82 .size = MTDPART_SIZ_FULL,
83 .mask_flags = 0,
84 }
85 /* two blocks with bad block table (and mirror) at the end */
86};
87
88static struct davinci_nand_pdata davinci_nand_data = {
89 .mask_chipsel = BIT(14),
90 .parts = davinci_nand_partitions,
91 .nr_parts = ARRAY_SIZE(davinci_nand_partitions),
92 .ecc_mode = NAND_ECC_HW,
93 .options = NAND_USE_FLASH_BBT,
94};
95
96static struct resource davinci_nand_resources[] = {
97 {
98 .start = DM365_ASYNC_EMIF_DATA_CE0_BASE,
99 .end = DM365_ASYNC_EMIF_DATA_CE0_BASE + SZ_32M - 1,
100 .flags = IORESOURCE_MEM,
101 }, {
102 .start = DM365_ASYNC_EMIF_CONTROL_BASE,
103 .end = DM365_ASYNC_EMIF_CONTROL_BASE + SZ_4K - 1,
104 .flags = IORESOURCE_MEM,
105 },
106};
107
108static struct platform_device davinci_nand_device = {
109 .name = "davinci_nand",
110 .id = 0,
111 .num_resources = ARRAY_SIZE(davinci_nand_resources),
112 .resource = davinci_nand_resources,
113 .dev = {
114 .platform_data = &davinci_nand_data,
115 },
116};
117
Sandeep Paulraj8ed0a9d2009-06-20 12:23:39 -0400118static struct at24_platform_data eeprom_info = {
119 .byte_len = (256*1024) / 8,
120 .page_size = 64,
121 .flags = AT24_FLAG_ADDR16,
122 .setup = davinci_get_mac_addr,
123 .context = (void *)0x7f00,
124};
125
126static struct i2c_board_info i2c_info[] = {
127 {
128 I2C_BOARD_INFO("24c256", 0x50),
129 .platform_data = &eeprom_info,
130 },
131};
132
Sandeep Paulraj37dd0092009-06-09 16:28:15 -0400133static struct davinci_i2c_platform_data i2c_pdata = {
134 .bus_freq = 400 /* kHz */,
135 .bus_delay = 0 /* usec */,
136};
137
Sandeep Paulraja45c8ba2009-06-20 14:00:52 -0400138static struct davinci_mmc_config dm365evm_mmc_config = {
139 .wires = 4,
140 .max_freq = 50000000,
141 .caps = MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
142 .version = MMC_CTLR_VERSION_2,
143};
144
Sandeep Paulraj8ed0a9d2009-06-20 12:23:39 -0400145static void dm365evm_emac_configure(void)
146{
147 /*
148 * EMAC pins are multiplexed with GPIO and UART
149 * Further details are available at the DM365 ARM
150 * Subsystem Users Guide(sprufg5.pdf) pages 125 - 127
151 */
152 davinci_cfg_reg(DM365_EMAC_TX_EN);
153 davinci_cfg_reg(DM365_EMAC_TX_CLK);
154 davinci_cfg_reg(DM365_EMAC_COL);
155 davinci_cfg_reg(DM365_EMAC_TXD3);
156 davinci_cfg_reg(DM365_EMAC_TXD2);
157 davinci_cfg_reg(DM365_EMAC_TXD1);
158 davinci_cfg_reg(DM365_EMAC_TXD0);
159 davinci_cfg_reg(DM365_EMAC_RXD3);
160 davinci_cfg_reg(DM365_EMAC_RXD2);
161 davinci_cfg_reg(DM365_EMAC_RXD1);
162 davinci_cfg_reg(DM365_EMAC_RXD0);
163 davinci_cfg_reg(DM365_EMAC_RX_CLK);
164 davinci_cfg_reg(DM365_EMAC_RX_DV);
165 davinci_cfg_reg(DM365_EMAC_RX_ER);
166 davinci_cfg_reg(DM365_EMAC_CRS);
167 davinci_cfg_reg(DM365_EMAC_MDIO);
168 davinci_cfg_reg(DM365_EMAC_MDCLK);
169
170 /*
171 * EMAC interrupts are multiplexed with GPIO interrupts
172 * Details are available at the DM365 ARM
173 * Subsystem Users Guide(sprufg5.pdf) pages 133 - 134
174 */
175 davinci_cfg_reg(DM365_INT_EMAC_RXTHRESH);
176 davinci_cfg_reg(DM365_INT_EMAC_RXPULSE);
177 davinci_cfg_reg(DM365_INT_EMAC_TXPULSE);
178 davinci_cfg_reg(DM365_INT_EMAC_MISCPULSE);
179}
180
Sandeep Paulraja45c8ba2009-06-20 14:00:52 -0400181static void dm365evm_mmc_configure(void)
182{
183 /*
184 * MMC/SD pins are multiplexed with GPIO and EMIF
185 * Further details are available at the DM365 ARM
186 * Subsystem Users Guide(sprufg5.pdf) pages 118, 128 - 131
187 */
188 davinci_cfg_reg(DM365_SD1_CLK);
189 davinci_cfg_reg(DM365_SD1_CMD);
190 davinci_cfg_reg(DM365_SD1_DATA3);
191 davinci_cfg_reg(DM365_SD1_DATA2);
192 davinci_cfg_reg(DM365_SD1_DATA1);
193 davinci_cfg_reg(DM365_SD1_DATA0);
194}
195
Sandeep Paulraj37dd0092009-06-09 16:28:15 -0400196static void __init evm_init_i2c(void)
197{
198 davinci_init_i2c(&i2c_pdata);
Sandeep Paulraj8ed0a9d2009-06-20 12:23:39 -0400199 i2c_register_board_info(1, i2c_info, ARRAY_SIZE(i2c_info));
Sandeep Paulraj37dd0092009-06-09 16:28:15 -0400200}
201
Sandeep Paulraj37b798d2009-06-20 14:15:51 -0400202static struct platform_device *dm365_evm_devices[] __initdata = {
203 &davinci_nand_device,
204};
205
Sandeep Paulraj37dd0092009-06-09 16:28:15 -0400206static struct davinci_uart_config uart_config __initdata = {
207 .enabled_uarts = (1 << 0),
208};
209
210static void __init dm365_evm_map_io(void)
211{
212 dm365_init();
213}
214
215static __init void dm365_evm_init(void)
216{
Sandeep Paulraj8ed0a9d2009-06-20 12:23:39 -0400217 struct davinci_soc_info *soc_info = &davinci_soc_info;
218
Sandeep Paulraj37b798d2009-06-20 14:15:51 -0400219 platform_add_devices(dm365_evm_devices,
220 ARRAY_SIZE(dm365_evm_devices));
221
Sandeep Paulraj37dd0092009-06-09 16:28:15 -0400222 evm_init_i2c();
223 davinci_serial_init(&uart_config);
Sandeep Paulraj8ed0a9d2009-06-20 12:23:39 -0400224
225 dm365evm_emac_configure();
Sandeep Paulraja45c8ba2009-06-20 14:00:52 -0400226 dm365evm_mmc_configure();
227
228 davinci_setup_mmc(0, &dm365evm_mmc_config);
229 davinci_setup_mmc(1, &dm365evm_mmc_config);
Sandeep Paulraj8ed0a9d2009-06-20 12:23:39 -0400230
231 soc_info->emac_pdata->phy_mask = DM365_EVM_PHY_MASK;
232 soc_info->emac_pdata->mdio_max_freq = DM365_EVM_MDIO_FREQUENCY;
Sandeep Paulraj37dd0092009-06-09 16:28:15 -0400233}
234
235static __init void dm365_evm_irq_init(void)
236{
237 davinci_irq_init();
238}
239
240MACHINE_START(DAVINCI_DM365_EVM, "DaVinci DM365 EVM")
241 .phys_io = IO_PHYS,
242 .io_pg_offst = (__IO_ADDRESS(IO_PHYS) >> 18) & 0xfffc,
243 .boot_params = (0x80000100),
244 .map_io = dm365_evm_map_io,
245 .init_irq = dm365_evm_irq_init,
246 .timer = &davinci_timer,
247 .init_machine = dm365_evm_init,
248MACHINE_END
249