Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
board-dm355-leopard.c
Go to the documentation of this file.
1 /*
2  * DM355 leopard board support
3  *
4  * Based on board-dm355-evm.c
5  *
6  * This file is licensed under the terms of the GNU General Public
7  * License version 2. This program is licensed "as is" without any
8  * warranty of any kind, whether express or implied.
9  */
10 #include <linux/kernel.h>
11 #include <linux/init.h>
12 #include <linux/err.h>
13 #include <linux/platform_device.h>
14 #include <linux/mtd/mtd.h>
15 #include <linux/mtd/partitions.h>
16 #include <linux/mtd/nand.h>
17 #include <linux/i2c.h>
18 #include <linux/gpio.h>
19 #include <linux/clk.h>
20 #include <linux/spi/spi.h>
21 #include <linux/spi/eeprom.h>
22 
23 #include <asm/mach-types.h>
24 #include <asm/mach/arch.h>
25 
27 #include <mach/serial.h>
31 
32 #include "davinci.h"
33 
34 /* NOTE: this is geared for the standard config, with a socketed
35  * 2 GByte Micron NAND (MT29F16G08FAA) using 128KB sectors. If you
36  * swap chips, maybe with a different block size, partitioning may
37  * need to be changed.
38  */
39 #define NAND_BLOCK_SIZE SZ_128K
40 
41 static struct mtd_partition davinci_nand_partitions[] = {
42  {
43  /* UBL (a few copies) plus U-Boot */
44  .name = "bootloader",
45  .offset = 0,
46  .size = 15 * NAND_BLOCK_SIZE,
47  .mask_flags = MTD_WRITEABLE, /* force read-only */
48  }, {
49  /* U-Boot environment */
50  .name = "params",
51  .offset = MTDPART_OFS_APPEND,
52  .size = 1 * NAND_BLOCK_SIZE,
53  .mask_flags = 0,
54  }, {
55  .name = "kernel",
56  .offset = MTDPART_OFS_APPEND,
57  .size = SZ_4M,
58  .mask_flags = 0,
59  }, {
60  .name = "filesystem1",
61  .offset = MTDPART_OFS_APPEND,
62  .size = SZ_512M,
63  .mask_flags = 0,
64  }, {
65  .name = "filesystem2",
66  .offset = MTDPART_OFS_APPEND,
67  .size = MTDPART_SIZ_FULL,
68  .mask_flags = 0,
69  }
70  /* two blocks with bad block table (and mirror) at the end */
71 };
72 
73 static struct davinci_nand_pdata davinci_nand_data = {
74  .mask_chipsel = BIT(14),
75  .parts = davinci_nand_partitions,
76  .nr_parts = ARRAY_SIZE(davinci_nand_partitions),
77  .ecc_mode = NAND_ECC_HW_SYNDROME,
78  .bbt_options = NAND_BBT_USE_FLASH,
79 };
80 
81 static struct resource davinci_nand_resources[] = {
82  {
85  .flags = IORESOURCE_MEM,
86  }, {
89  .flags = IORESOURCE_MEM,
90  },
91 };
92 
93 static struct platform_device davinci_nand_device = {
94  .name = "davinci_nand",
95  .id = 0,
96 
97  .num_resources = ARRAY_SIZE(davinci_nand_resources),
98  .resource = davinci_nand_resources,
99 
100  .dev = {
101  .platform_data = &davinci_nand_data,
102  },
103 };
104 
105 static struct davinci_i2c_platform_data i2c_pdata = {
106  .bus_freq = 400 /* kHz */,
107  .bus_delay = 0 /* usec */,
108 };
109 
110 static int leopard_mmc_gpio = -EINVAL;
111 
112 static void dm355leopard_mmcsd_gpios(unsigned gpio)
113 {
114  gpio_request(gpio + 0, "mmc0_ro");
115  gpio_request(gpio + 1, "mmc0_cd");
116  gpio_request(gpio + 2, "mmc1_ro");
117  gpio_request(gpio + 3, "mmc1_cd");
118 
119  /* we "know" these are input-only so we don't
120  * need to call gpio_direction_input()
121  */
122 
123  leopard_mmc_gpio = gpio;
124 }
125 
126 static struct i2c_board_info dm355leopard_i2c_info[] = {
127  { I2C_BOARD_INFO("dm355leopard_msp", 0x25),
128  .platform_data = dm355leopard_mmcsd_gpios,
129  /* plus irq */ },
130  /* { I2C_BOARD_INFO("tlv320aic3x", 0x1b), }, */
131  /* { I2C_BOARD_INFO("tvp5146", 0x5d), }, */
132 };
133 
134 static void __init leopard_init_i2c(void)
135 {
136  davinci_init_i2c(&i2c_pdata);
137 
138  gpio_request(5, "dm355leopard_msp");
140  dm355leopard_i2c_info[0].irq = gpio_to_irq(5);
141 
142  i2c_register_board_info(1, dm355leopard_i2c_info,
143  ARRAY_SIZE(dm355leopard_i2c_info));
144 }
145 
146 static struct resource dm355leopard_dm9000_rsrc[] = {
147  {
148  /* addr */
149  .start = 0x04000000,
150  .end = 0x04000001,
151  .flags = IORESOURCE_MEM,
152  }, {
153  /* data */
154  .start = 0x04000016,
155  .end = 0x04000017,
156  .flags = IORESOURCE_MEM,
157  }, {
158  .flags = IORESOURCE_IRQ
159  | IORESOURCE_IRQ_HIGHEDGE /* rising (active high) */,
160  },
161 };
162 
163 static struct platform_device dm355leopard_dm9000 = {
164  .name = "dm9000",
165  .id = -1,
166  .resource = dm355leopard_dm9000_rsrc,
167  .num_resources = ARRAY_SIZE(dm355leopard_dm9000_rsrc),
168 };
169 
170 static struct platform_device *davinci_leopard_devices[] __initdata = {
171  &dm355leopard_dm9000,
172  &davinci_nand_device,
173 };
174 
175 static struct davinci_uart_config uart_config __initdata = {
176  .enabled_uarts = (1 << 0),
177 };
178 
179 static void __init dm355_leopard_map_io(void)
180 {
181  dm355_init();
182 }
183 
184 static int dm355leopard_mmc_get_cd(int module)
185 {
186  if (!gpio_is_valid(leopard_mmc_gpio))
187  return -ENXIO;
188  /* low == card present */
189  return !gpio_get_value_cansleep(leopard_mmc_gpio + 2 * module + 1);
190 }
191 
192 static int dm355leopard_mmc_get_ro(int module)
193 {
194  if (!gpio_is_valid(leopard_mmc_gpio))
195  return -ENXIO;
196  /* high == card's write protect switch active */
197  return gpio_get_value_cansleep(leopard_mmc_gpio + 2 * module + 0);
198 }
199 
200 static struct davinci_mmc_config dm355leopard_mmc_config = {
201  .get_cd = dm355leopard_mmc_get_cd,
202  .get_ro = dm355leopard_mmc_get_ro,
203  .wires = 4,
204  .max_freq = 50000000,
206 };
207 
208 /* Don't connect anything to J10 unless you're only using USB host
209  * mode *and* have to do so with some kind of gender-bender. If
210  * you have proper Mini-B or Mini-A cables (or Mini-A adapters)
211  * the ID pin won't need any help.
212  */
213 #ifdef CONFIG_USB_MUSB_PERIPHERAL
214 #define USB_ID_VALUE 0 /* ID pulled high; *should* float */
215 #else
216 #define USB_ID_VALUE 1 /* ID pulled low */
217 #endif
218 
219 static struct spi_eeprom at25640a = {
220  .byte_len = SZ_64K / 8,
221  .name = "at25640a",
222  .page_size = 32,
223  .flags = EE_ADDR2,
224 };
225 
226 static struct spi_board_info dm355_leopard_spi_info[] __initconst = {
227  {
228  .modalias = "at25",
229  .platform_data = &at25640a,
230  .max_speed_hz = 10 * 1000 * 1000, /* at 3v3 */
231  .bus_num = 0,
232  .chip_select = 0,
233  .mode = SPI_MODE_0,
234  },
235 };
236 
237 static __init void dm355_leopard_init(void)
238 {
239  struct clk *aemif;
240 
241  gpio_request(9, "dm9000");
243  dm355leopard_dm9000_rsrc[2].start = gpio_to_irq(9);
244 
245  aemif = clk_get(&dm355leopard_dm9000.dev, "aemif");
246  if (IS_ERR(aemif))
247  WARN("%s: unable to get AEMIF clock\n", __func__);
248  else
249  clk_enable(aemif);
250 
251  platform_add_devices(davinci_leopard_devices,
252  ARRAY_SIZE(davinci_leopard_devices));
253  leopard_init_i2c();
254  davinci_serial_init(&uart_config);
255 
256  /* NOTE: NAND flash timings set by the UBL are slower than
257  * needed by MT29F16G08FAA chips ... EMIF.A1CR is 0x40400204
258  * but could be 0x0400008c for about 25% faster page reads.
259  */
260 
261  gpio_request(2, "usb_id_toggle");
263  /* irlml6401 switches over 1A in under 8 msec */
264  davinci_setup_usb(1000, 8);
265 
266  davinci_setup_mmc(0, &dm355leopard_mmc_config);
267  davinci_setup_mmc(1, &dm355leopard_mmc_config);
268 
269  dm355_init_spi0(BIT(0), dm355_leopard_spi_info,
270  ARRAY_SIZE(dm355_leopard_spi_info));
271 }
272 
273 MACHINE_START(DM355_LEOPARD, "DaVinci DM355 leopard")
274  .atag_offset = 0x100,
275  .map_io = dm355_leopard_map_io,
276  .init_irq = davinci_irq_init,
277  .timer = &davinci_timer,
278  .init_machine = dm355_leopard_init,
279  .init_late = davinci_init_late,
280  .dma_zone_size = SZ_128M,
281  .restart = davinci_restart,