blob: 008d51407cd71dbe5d3ad5c8cce4d3f27a85aa76 [file] [log] [blame]
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -04001/*
2 * TI DA850/OMAP-L138 EVM board
3 *
4 * Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/
5 *
6 * Derived from: arch/arm/mach-davinci/board-da830-evm.c
7 * Original Copyrights follow:
8 *
9 * 2007, 2009 (c) MontaVista Software, Inc. This file is licensed under
10 * the terms of the GNU General Public License version 2. This program
11 * is licensed "as is" without any warranty of any kind, whether express
12 * or implied.
13 */
14#include <linux/kernel.h>
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -040015#include <linux/init.h>
16#include <linux/console.h>
17#include <linux/i2c.h>
18#include <linux/i2c/at24.h>
Chaithrika U S75e2ea62009-09-30 17:00:28 -040019#include <linux/i2c/pca953x.h>
Ben Gardiner75929f52010-12-09 16:51:04 -050020#include <linux/input.h>
Todd Fischer0bc20bb2010-04-05 20:23:57 -060021#include <linux/mfd/tps6507x.h>
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -040022#include <linux/gpio.h>
Ben Gardiner75929f52010-12-09 16:51:04 -050023#include <linux/gpio_keys.h>
Sudhakar Rajashekhara38beb922009-08-13 16:21:11 -040024#include <linux/platform_device.h>
25#include <linux/mtd/mtd.h>
26#include <linux/mtd/nand.h>
27#include <linux/mtd/partitions.h>
Sudhakar Rajashekhara7c5ec602009-08-13 17:36:25 -040028#include <linux/mtd/physmap.h>
Sekhar Noria9eb1f62009-09-22 21:14:04 +053029#include <linux/regulator/machine.h>
Sekhar Nori8b245992010-07-12 17:56:21 +053030#include <linux/regulator/tps6507x.h>
Todd Fischerda1e3682010-04-05 17:53:13 -060031#include <linux/input/tps6507x-ts.h>
Sekhar Norifdce5562011-02-24 10:39:27 +053032#include <linux/spi/spi.h>
33#include <linux/spi/flash.h>
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -040034
35#include <asm/mach-types.h>
36#include <asm/mach/arch.h>
37
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -040038#include <mach/cp_intc.h>
39#include <mach/da8xx.h>
Sudhakar Rajashekhara38beb922009-08-13 16:21:11 -040040#include <mach/nand.h>
Sudhakar Rajashekhara7761ef62009-09-15 17:46:14 -040041#include <mach/mux.h>
Sekhar Nori18a85052010-08-09 15:46:39 +053042#include <mach/aemif.h>
Sekhar Norifdce5562011-02-24 10:39:27 +053043#include <mach/spi.h>
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -040044
Cyril Chemparathy782f2d72010-09-15 10:11:25 -040045#define DA850_EVM_PHY_ID "0:00"
Sudhakar Rajashekhara7761ef62009-09-15 17:46:14 -040046#define DA850_LCD_PWR_PIN GPIO_TO_PIN(2, 8)
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -040047#define DA850_LCD_BL_PIN GPIO_TO_PIN(2, 15)
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -040048
Sudhakar Rajashekhara700691f2009-08-13 15:16:23 -040049#define DA850_MMCSD_CD_PIN GPIO_TO_PIN(4, 0)
50#define DA850_MMCSD_WP_PIN GPIO_TO_PIN(4, 1)
51
Chaithrika U S22067712009-09-30 17:00:53 -040052#define DA850_MII_MDIO_CLKEN_PIN GPIO_TO_PIN(2, 6)
53
Sekhar Norifdce5562011-02-24 10:39:27 +053054static struct mtd_partition da850evm_spiflash_part[] = {
55 [0] = {
56 .name = "UBL",
57 .offset = 0,
58 .size = SZ_64K,
59 .mask_flags = MTD_WRITEABLE,
60 },
61 [1] = {
62 .name = "U-Boot",
63 .offset = MTDPART_OFS_APPEND,
64 .size = SZ_512K,
65 .mask_flags = MTD_WRITEABLE,
66 },
67 [2] = {
68 .name = "U-Boot-Env",
69 .offset = MTDPART_OFS_APPEND,
70 .size = SZ_64K,
71 .mask_flags = MTD_WRITEABLE,
72 },
73 [3] = {
74 .name = "Kernel",
75 .offset = MTDPART_OFS_APPEND,
76 .size = SZ_2M + SZ_512K,
77 .mask_flags = 0,
78 },
79 [4] = {
80 .name = "Filesystem",
81 .offset = MTDPART_OFS_APPEND,
82 .size = SZ_4M,
83 .mask_flags = 0,
84 },
85 [5] = {
86 .name = "MAC-Address",
87 .offset = SZ_8M - SZ_64K,
88 .size = SZ_64K,
89 .mask_flags = MTD_WRITEABLE,
90 },
91};
92
93static struct flash_platform_data da850evm_spiflash_data = {
94 .name = "m25p80",
95 .parts = da850evm_spiflash_part,
96 .nr_parts = ARRAY_SIZE(da850evm_spiflash_part),
97 .type = "m25p64",
98};
99
100static struct davinci_spi_config da850evm_spiflash_cfg = {
101 .io_type = SPI_IO_TYPE_DMA,
102 .c2tdelay = 8,
103 .t2cdelay = 8,
104};
105
106static struct spi_board_info da850evm_spi_info[] = {
107 {
108 .modalias = "m25p80",
109 .platform_data = &da850evm_spiflash_data,
110 .controller_data = &da850evm_spiflash_cfg,
111 .mode = SPI_MODE_0,
112 .max_speed_hz = 30000000,
113 .bus_num = 1,
114 .chip_select = 0,
115 },
116};
117
Rajashekhara, Sudhakar810198b2011-07-12 15:58:53 +0530118#ifdef CONFIG_MTD
119static void da850_evm_m25p80_notify_add(struct mtd_info *mtd)
120{
121 char *mac_addr = davinci_soc_info.emac_pdata->mac_addr;
122 size_t retlen;
123
124 if (!strcmp(mtd->name, "MAC-Address")) {
125 mtd->read(mtd, 0, ETH_ALEN, &retlen, mac_addr);
126 if (retlen == ETH_ALEN)
127 pr_info("Read MAC addr from SPI Flash: %pM\n",
128 mac_addr);
129 }
130}
131
132static struct mtd_notifier da850evm_spi_notifier = {
133 .add = da850_evm_m25p80_notify_add,
134};
135
136static void da850_evm_setup_mac_addr(void)
137{
138 register_mtd_user(&da850evm_spi_notifier);
139}
140#else
141static void da850_evm_setup_mac_addr(void) { }
142#endif
143
Sudhakar Rajashekhara7c5ec602009-08-13 17:36:25 -0400144static struct mtd_partition da850_evm_norflash_partition[] = {
145 {
Sudhakar Rajashekharae2abd5a2009-11-18 11:48:37 +0530146 .name = "bootloaders + env",
Sudhakar Rajashekhara7c5ec602009-08-13 17:36:25 -0400147 .offset = 0,
Sudhakar Rajashekharae2abd5a2009-11-18 11:48:37 +0530148 .size = SZ_512K,
149 .mask_flags = MTD_WRITEABLE,
150 },
151 {
152 .name = "kernel",
153 .offset = MTDPART_OFS_APPEND,
154 .size = SZ_2M,
155 .mask_flags = 0,
156 },
157 {
158 .name = "filesystem",
159 .offset = MTDPART_OFS_APPEND,
Sudhakar Rajashekhara7c5ec602009-08-13 17:36:25 -0400160 .size = MTDPART_SIZ_FULL,
161 .mask_flags = 0,
162 },
163};
164
165static struct physmap_flash_data da850_evm_norflash_data = {
166 .width = 2,
167 .parts = da850_evm_norflash_partition,
168 .nr_parts = ARRAY_SIZE(da850_evm_norflash_partition),
169};
170
171static struct resource da850_evm_norflash_resource[] = {
172 {
173 .start = DA8XX_AEMIF_CS2_BASE,
174 .end = DA8XX_AEMIF_CS2_BASE + SZ_32M - 1,
175 .flags = IORESOURCE_MEM,
176 },
177};
178
179static struct platform_device da850_evm_norflash_device = {
180 .name = "physmap-flash",
181 .id = 0,
182 .dev = {
183 .platform_data = &da850_evm_norflash_data,
184 },
185 .num_resources = 1,
186 .resource = da850_evm_norflash_resource,
187};
188
Sekhar Nori63534442009-12-17 18:29:33 +0530189static struct davinci_pm_config da850_pm_pdata = {
190 .sleepcount = 128,
191};
192
193static struct platform_device da850_pm_device = {
194 .name = "pm-davinci",
195 .dev = {
196 .platform_data = &da850_pm_pdata,
197 },
198 .id = -1,
199};
200
Sudhakar Rajashekhara38beb922009-08-13 16:21:11 -0400201/* DA850/OMAP-L138 EVM includes a 512 MByte large-page NAND flash
202 * (128K blocks). It may be used instead of the (default) SPI flash
203 * to boot, using TI's tools to install the secondary boot loader
204 * (UBL) and U-Boot.
205 */
Sekhar Noridb549d22010-06-28 17:16:38 +0530206static struct mtd_partition da850_evm_nandflash_partition[] = {
Sudhakar Rajashekhara38beb922009-08-13 16:21:11 -0400207 {
208 .name = "u-boot env",
209 .offset = 0,
210 .size = SZ_128K,
211 .mask_flags = MTD_WRITEABLE,
212 },
213 {
214 .name = "UBL",
215 .offset = MTDPART_OFS_APPEND,
216 .size = SZ_128K,
217 .mask_flags = MTD_WRITEABLE,
218 },
219 {
220 .name = "u-boot",
221 .offset = MTDPART_OFS_APPEND,
222 .size = 4 * SZ_128K,
223 .mask_flags = MTD_WRITEABLE,
224 },
225 {
226 .name = "kernel",
227 .offset = 0x200000,
228 .size = SZ_2M,
229 .mask_flags = 0,
230 },
231 {
232 .name = "filesystem",
233 .offset = MTDPART_OFS_APPEND,
234 .size = MTDPART_SIZ_FULL,
235 .mask_flags = 0,
236 },
237};
238
Sekhar Nori18a85052010-08-09 15:46:39 +0530239static struct davinci_aemif_timing da850_evm_nandflash_timing = {
240 .wsetup = 24,
241 .wstrobe = 21,
242 .whold = 14,
243 .rsetup = 19,
244 .rstrobe = 50,
245 .rhold = 0,
246 .ta = 20,
247};
248
Sudhakar Rajashekhara38beb922009-08-13 16:21:11 -0400249static struct davinci_nand_pdata da850_evm_nandflash_data = {
250 .parts = da850_evm_nandflash_partition,
251 .nr_parts = ARRAY_SIZE(da850_evm_nandflash_partition),
252 .ecc_mode = NAND_ECC_HW,
Sudhakar Rajashekharafc42e332009-11-18 12:11:41 +0530253 .ecc_bits = 4,
Sudhakar Rajashekhara38beb922009-08-13 16:21:11 -0400254 .options = NAND_USE_FLASH_BBT,
Sekhar Nori18a85052010-08-09 15:46:39 +0530255 .timing = &da850_evm_nandflash_timing,
Sudhakar Rajashekhara38beb922009-08-13 16:21:11 -0400256};
257
258static struct resource da850_evm_nandflash_resource[] = {
259 {
260 .start = DA8XX_AEMIF_CS3_BASE,
261 .end = DA8XX_AEMIF_CS3_BASE + SZ_512K + 2 * SZ_1K - 1,
262 .flags = IORESOURCE_MEM,
263 },
264 {
265 .start = DA8XX_AEMIF_CTL_BASE,
266 .end = DA8XX_AEMIF_CTL_BASE + SZ_32K - 1,
267 .flags = IORESOURCE_MEM,
268 },
269};
270
271static struct platform_device da850_evm_nandflash_device = {
272 .name = "davinci_nand",
273 .id = 1,
274 .dev = {
275 .platform_data = &da850_evm_nandflash_data,
276 },
277 .num_resources = ARRAY_SIZE(da850_evm_nandflash_resource),
278 .resource = da850_evm_nandflash_resource,
279};
280
Sudhakar Rajashekhara039c5ee2009-11-03 11:51:09 +0530281static struct platform_device *da850_evm_devices[] __initdata = {
282 &da850_evm_nandflash_device,
283 &da850_evm_norflash_device,
284};
285
286#define DA8XX_AEMIF_CE2CFG_OFFSET 0x10
287#define DA8XX_AEMIF_ASIZE_16BIT 0x1
288
289static void __init da850_evm_init_nor(void)
290{
291 void __iomem *aemif_addr;
292
293 aemif_addr = ioremap(DA8XX_AEMIF_CTL_BASE, SZ_32K);
294
295 /* Configure data bus width of CS2 to 16 bit */
296 writel(readl(aemif_addr + DA8XX_AEMIF_CE2CFG_OFFSET) |
297 DA8XX_AEMIF_ASIZE_16BIT,
298 aemif_addr + DA8XX_AEMIF_CE2CFG_OFFSET);
299
300 iounmap(aemif_addr);
301}
302
Sergei Shtylyovf48ecc22010-08-01 21:15:16 +0400303static const short da850_evm_nand_pins[] = {
304 DA850_EMA_D_0, DA850_EMA_D_1, DA850_EMA_D_2, DA850_EMA_D_3,
305 DA850_EMA_D_4, DA850_EMA_D_5, DA850_EMA_D_6, DA850_EMA_D_7,
306 DA850_EMA_A_1, DA850_EMA_A_2, DA850_NEMA_CS_3, DA850_NEMA_CS_4,
307 DA850_NEMA_WE, DA850_NEMA_OE,
308 -1
309};
310
311static const short da850_evm_nor_pins[] = {
312 DA850_EMA_BA_1, DA850_EMA_CLK, DA850_EMA_WAIT_1, DA850_NEMA_CS_2,
313 DA850_NEMA_WE, DA850_NEMA_OE, DA850_EMA_D_0, DA850_EMA_D_1,
314 DA850_EMA_D_2, DA850_EMA_D_3, DA850_EMA_D_4, DA850_EMA_D_5,
315 DA850_EMA_D_6, DA850_EMA_D_7, DA850_EMA_D_8, DA850_EMA_D_9,
316 DA850_EMA_D_10, DA850_EMA_D_11, DA850_EMA_D_12, DA850_EMA_D_13,
317 DA850_EMA_D_14, DA850_EMA_D_15, DA850_EMA_A_0, DA850_EMA_A_1,
318 DA850_EMA_A_2, DA850_EMA_A_3, DA850_EMA_A_4, DA850_EMA_A_5,
319 DA850_EMA_A_6, DA850_EMA_A_7, DA850_EMA_A_8, DA850_EMA_A_9,
320 DA850_EMA_A_10, DA850_EMA_A_11, DA850_EMA_A_12, DA850_EMA_A_13,
321 DA850_EMA_A_14, DA850_EMA_A_15, DA850_EMA_A_16, DA850_EMA_A_17,
322 DA850_EMA_A_18, DA850_EMA_A_19, DA850_EMA_A_20, DA850_EMA_A_21,
323 DA850_EMA_A_22, DA850_EMA_A_23,
324 -1
325};
326
Sudhakar Rajashekhara039c5ee2009-11-03 11:51:09 +0530327#if defined(CONFIG_MMC_DAVINCI) || \
328 defined(CONFIG_MMC_DAVINCI_MODULE)
329#define HAS_MMC 1
330#else
331#define HAS_MMC 0
332#endif
333
Sergei Shtylyovf48ecc22010-08-01 21:15:16 +0400334static inline void da850_evm_setup_nor_nand(void)
Sudhakar Rajashekhara039c5ee2009-11-03 11:51:09 +0530335{
336 int ret = 0;
337
Sergei Shtylyovb688c2f2011-02-25 12:26:36 +0530338 if (!HAS_MMC) {
Sergei Shtylyovf48ecc22010-08-01 21:15:16 +0400339 ret = davinci_cfg_reg_list(da850_evm_nand_pins);
Sudhakar Rajashekhara039c5ee2009-11-03 11:51:09 +0530340 if (ret)
341 pr_warning("da850_evm_init: nand mux setup failed: "
342 "%d\n", ret);
343
Sergei Shtylyovf48ecc22010-08-01 21:15:16 +0400344 ret = davinci_cfg_reg_list(da850_evm_nor_pins);
Sudhakar Rajashekhara039c5ee2009-11-03 11:51:09 +0530345 if (ret)
346 pr_warning("da850_evm_init: nor mux setup failed: %d\n",
347 ret);
348
349 da850_evm_init_nor();
350
351 platform_add_devices(da850_evm_devices,
352 ARRAY_SIZE(da850_evm_devices));
353 }
354}
Chaithrika U S75e2ea62009-09-30 17:00:28 -0400355
Sekhar Noribae10582009-10-21 21:18:22 +0530356#ifdef CONFIG_DA850_UI_RMII
357static inline void da850_evm_setup_emac_rmii(int rmii_sel)
358{
359 struct davinci_soc_info *soc_info = &davinci_soc_info;
360
361 soc_info->emac_pdata->rmii_en = 1;
Ben Gardiner47e7cb12010-11-15 09:42:52 -0500362 gpio_set_value_cansleep(rmii_sel, 0);
Sekhar Noribae10582009-10-21 21:18:22 +0530363}
364#else
365static inline void da850_evm_setup_emac_rmii(int rmii_sel) { }
366#endif
367
Ben Gardiner75929f52010-12-09 16:51:04 -0500368
369#define DA850_KEYS_DEBOUNCE_MS 10
370/*
371 * At 200ms polling interval it is possible to miss an
372 * event by tapping very lightly on the push button but most
373 * pushes do result in an event; longer intervals require the
374 * user to hold the button whereas shorter intervals require
375 * more CPU time for polling.
376 */
377#define DA850_GPIO_KEYS_POLL_MS 200
378
379enum da850_evm_ui_exp_pins {
380 DA850_EVM_UI_EXP_SEL_C = 5,
381 DA850_EVM_UI_EXP_SEL_B,
382 DA850_EVM_UI_EXP_SEL_A,
383 DA850_EVM_UI_EXP_PB8,
384 DA850_EVM_UI_EXP_PB7,
385 DA850_EVM_UI_EXP_PB6,
386 DA850_EVM_UI_EXP_PB5,
387 DA850_EVM_UI_EXP_PB4,
388 DA850_EVM_UI_EXP_PB3,
389 DA850_EVM_UI_EXP_PB2,
390 DA850_EVM_UI_EXP_PB1,
391};
392
393static const char const *da850_evm_ui_exp[] = {
394 [DA850_EVM_UI_EXP_SEL_C] = "sel_c",
395 [DA850_EVM_UI_EXP_SEL_B] = "sel_b",
396 [DA850_EVM_UI_EXP_SEL_A] = "sel_a",
397 [DA850_EVM_UI_EXP_PB8] = "pb8",
398 [DA850_EVM_UI_EXP_PB7] = "pb7",
399 [DA850_EVM_UI_EXP_PB6] = "pb6",
400 [DA850_EVM_UI_EXP_PB5] = "pb5",
401 [DA850_EVM_UI_EXP_PB4] = "pb4",
402 [DA850_EVM_UI_EXP_PB3] = "pb3",
403 [DA850_EVM_UI_EXP_PB2] = "pb2",
404 [DA850_EVM_UI_EXP_PB1] = "pb1",
405};
406
407#define DA850_N_UI_PB 8
408
409static struct gpio_keys_button da850_evm_ui_keys[] = {
410 [0 ... DA850_N_UI_PB - 1] = {
411 .type = EV_KEY,
412 .active_low = 1,
413 .wakeup = 0,
414 .debounce_interval = DA850_KEYS_DEBOUNCE_MS,
415 .code = -1, /* assigned at runtime */
416 .gpio = -1, /* assigned at runtime */
417 .desc = NULL, /* assigned at runtime */
418 },
419};
420
421static struct gpio_keys_platform_data da850_evm_ui_keys_pdata = {
422 .buttons = da850_evm_ui_keys,
423 .nbuttons = ARRAY_SIZE(da850_evm_ui_keys),
424 .poll_interval = DA850_GPIO_KEYS_POLL_MS,
425};
426
427static struct platform_device da850_evm_ui_keys_device = {
428 .name = "gpio-keys-polled",
429 .id = 0,
430 .dev = {
431 .platform_data = &da850_evm_ui_keys_pdata
432 },
433};
434
435static void da850_evm_ui_keys_init(unsigned gpio)
436{
437 int i;
438 struct gpio_keys_button *button;
439
440 for (i = 0; i < DA850_N_UI_PB; i++) {
441 button = &da850_evm_ui_keys[i];
442 button->code = KEY_F8 - i;
443 button->desc = (char *)
444 da850_evm_ui_exp[DA850_EVM_UI_EXP_PB8 + i];
445 button->gpio = gpio + DA850_EVM_UI_EXP_PB8 + i;
446 }
447}
448
Chaithrika U S75e2ea62009-09-30 17:00:28 -0400449static int da850_evm_ui_expander_setup(struct i2c_client *client, unsigned gpio,
450 unsigned ngpio, void *c)
451{
452 int sel_a, sel_b, sel_c, ret;
453
Ben Gardiner53c28972010-12-09 16:51:05 -0500454 sel_a = gpio + DA850_EVM_UI_EXP_SEL_A;
455 sel_b = gpio + DA850_EVM_UI_EXP_SEL_B;
456 sel_c = gpio + DA850_EVM_UI_EXP_SEL_C;
Chaithrika U S75e2ea62009-09-30 17:00:28 -0400457
Ben Gardiner53c28972010-12-09 16:51:05 -0500458 ret = gpio_request(sel_a, da850_evm_ui_exp[DA850_EVM_UI_EXP_SEL_A]);
Chaithrika U S75e2ea62009-09-30 17:00:28 -0400459 if (ret) {
460 pr_warning("Cannot open UI expander pin %d\n", sel_a);
461 goto exp_setup_sela_fail;
462 }
463
Ben Gardiner53c28972010-12-09 16:51:05 -0500464 ret = gpio_request(sel_b, da850_evm_ui_exp[DA850_EVM_UI_EXP_SEL_B]);
Chaithrika U S75e2ea62009-09-30 17:00:28 -0400465 if (ret) {
466 pr_warning("Cannot open UI expander pin %d\n", sel_b);
467 goto exp_setup_selb_fail;
468 }
469
Ben Gardiner53c28972010-12-09 16:51:05 -0500470 ret = gpio_request(sel_c, da850_evm_ui_exp[DA850_EVM_UI_EXP_SEL_C]);
Chaithrika U S75e2ea62009-09-30 17:00:28 -0400471 if (ret) {
472 pr_warning("Cannot open UI expander pin %d\n", sel_c);
473 goto exp_setup_selc_fail;
474 }
475
476 /* deselect all functionalities */
477 gpio_direction_output(sel_a, 1);
478 gpio_direction_output(sel_b, 1);
479 gpio_direction_output(sel_c, 1);
480
Ben Gardiner75929f52010-12-09 16:51:04 -0500481 da850_evm_ui_keys_init(gpio);
482 ret = platform_device_register(&da850_evm_ui_keys_device);
483 if (ret) {
484 pr_warning("Could not register UI GPIO expander push-buttons");
485 goto exp_setup_keys_fail;
486 }
487
Chaithrika U S75e2ea62009-09-30 17:00:28 -0400488 pr_info("DA850/OMAP-L138 EVM UI card detected\n");
489
490 da850_evm_setup_nor_nand();
491
Sekhar Noribae10582009-10-21 21:18:22 +0530492 da850_evm_setup_emac_rmii(sel_a);
Chaithrika U S22067712009-09-30 17:00:53 -0400493
Chaithrika U S75e2ea62009-09-30 17:00:28 -0400494 return 0;
495
Ben Gardiner75929f52010-12-09 16:51:04 -0500496exp_setup_keys_fail:
497 gpio_free(sel_c);
Chaithrika U S75e2ea62009-09-30 17:00:28 -0400498exp_setup_selc_fail:
499 gpio_free(sel_b);
500exp_setup_selb_fail:
501 gpio_free(sel_a);
502exp_setup_sela_fail:
503 return ret;
504}
505
506static int da850_evm_ui_expander_teardown(struct i2c_client *client,
507 unsigned gpio, unsigned ngpio, void *c)
508{
Ben Gardiner75929f52010-12-09 16:51:04 -0500509 platform_device_unregister(&da850_evm_ui_keys_device);
510
Chaithrika U S75e2ea62009-09-30 17:00:28 -0400511 /* deselect all functionalities */
Ben Gardiner53c28972010-12-09 16:51:05 -0500512 gpio_set_value_cansleep(gpio + DA850_EVM_UI_EXP_SEL_C, 1);
513 gpio_set_value_cansleep(gpio + DA850_EVM_UI_EXP_SEL_B, 1);
514 gpio_set_value_cansleep(gpio + DA850_EVM_UI_EXP_SEL_A, 1);
Chaithrika U S75e2ea62009-09-30 17:00:28 -0400515
Ben Gardiner53c28972010-12-09 16:51:05 -0500516 gpio_free(gpio + DA850_EVM_UI_EXP_SEL_C);
517 gpio_free(gpio + DA850_EVM_UI_EXP_SEL_B);
518 gpio_free(gpio + DA850_EVM_UI_EXP_SEL_A);
Chaithrika U S75e2ea62009-09-30 17:00:28 -0400519
520 return 0;
521}
522
Ben Gardiner70b30932010-12-09 16:51:06 -0500523/* assign the baseboard expander's GPIOs after the UI board's */
524#define DA850_UI_EXPANDER_N_GPIOS ARRAY_SIZE(da850_evm_ui_exp)
525#define DA850_BB_EXPANDER_GPIO_BASE (DAVINCI_N_GPIO + DA850_UI_EXPANDER_N_GPIOS)
526
527enum da850_evm_bb_exp_pins {
528 DA850_EVM_BB_EXP_DEEP_SLEEP_EN = 0,
529 DA850_EVM_BB_EXP_SW_RST,
530 DA850_EVM_BB_EXP_TP_23,
531 DA850_EVM_BB_EXP_TP_22,
532 DA850_EVM_BB_EXP_TP_21,
533 DA850_EVM_BB_EXP_USER_PB1,
534 DA850_EVM_BB_EXP_USER_LED2,
535 DA850_EVM_BB_EXP_USER_LED1,
536 DA850_EVM_BB_EXP_USER_SW1,
537 DA850_EVM_BB_EXP_USER_SW2,
538 DA850_EVM_BB_EXP_USER_SW3,
539 DA850_EVM_BB_EXP_USER_SW4,
540 DA850_EVM_BB_EXP_USER_SW5,
541 DA850_EVM_BB_EXP_USER_SW6,
542 DA850_EVM_BB_EXP_USER_SW7,
543 DA850_EVM_BB_EXP_USER_SW8
544};
545
546static const char const *da850_evm_bb_exp[] = {
547 [DA850_EVM_BB_EXP_DEEP_SLEEP_EN] = "deep_sleep_en",
548 [DA850_EVM_BB_EXP_SW_RST] = "sw_rst",
549 [DA850_EVM_BB_EXP_TP_23] = "tp_23",
550 [DA850_EVM_BB_EXP_TP_22] = "tp_22",
551 [DA850_EVM_BB_EXP_TP_21] = "tp_21",
552 [DA850_EVM_BB_EXP_USER_PB1] = "user_pb1",
553 [DA850_EVM_BB_EXP_USER_LED2] = "user_led2",
554 [DA850_EVM_BB_EXP_USER_LED1] = "user_led1",
555 [DA850_EVM_BB_EXP_USER_SW1] = "user_sw1",
556 [DA850_EVM_BB_EXP_USER_SW2] = "user_sw2",
557 [DA850_EVM_BB_EXP_USER_SW3] = "user_sw3",
558 [DA850_EVM_BB_EXP_USER_SW4] = "user_sw4",
559 [DA850_EVM_BB_EXP_USER_SW5] = "user_sw5",
560 [DA850_EVM_BB_EXP_USER_SW6] = "user_sw6",
561 [DA850_EVM_BB_EXP_USER_SW7] = "user_sw7",
562 [DA850_EVM_BB_EXP_USER_SW8] = "user_sw8",
563};
564
565#define DA850_N_BB_USER_SW 8
566
567static struct gpio_keys_button da850_evm_bb_keys[] = {
568 [0] = {
569 .type = EV_KEY,
570 .active_low = 1,
571 .wakeup = 0,
572 .debounce_interval = DA850_KEYS_DEBOUNCE_MS,
573 .code = KEY_PROG1,
574 .desc = NULL, /* assigned at runtime */
575 .gpio = -1, /* assigned at runtime */
576 },
577 [1 ... DA850_N_BB_USER_SW] = {
578 .type = EV_SW,
579 .active_low = 1,
580 .wakeup = 0,
581 .debounce_interval = DA850_KEYS_DEBOUNCE_MS,
582 .code = -1, /* assigned at runtime */
583 .desc = NULL, /* assigned at runtime */
584 .gpio = -1, /* assigned at runtime */
585 },
586};
587
588static struct gpio_keys_platform_data da850_evm_bb_keys_pdata = {
589 .buttons = da850_evm_bb_keys,
590 .nbuttons = ARRAY_SIZE(da850_evm_bb_keys),
591 .poll_interval = DA850_GPIO_KEYS_POLL_MS,
592};
593
594static struct platform_device da850_evm_bb_keys_device = {
595 .name = "gpio-keys-polled",
596 .id = 1,
597 .dev = {
598 .platform_data = &da850_evm_bb_keys_pdata
599 },
600};
601
602static void da850_evm_bb_keys_init(unsigned gpio)
603{
604 int i;
605 struct gpio_keys_button *button;
606
607 button = &da850_evm_bb_keys[0];
608 button->desc = (char *)
609 da850_evm_bb_exp[DA850_EVM_BB_EXP_USER_PB1];
610 button->gpio = gpio + DA850_EVM_BB_EXP_USER_PB1;
611
612 for (i = 0; i < DA850_N_BB_USER_SW; i++) {
613 button = &da850_evm_bb_keys[i + 1];
614 button->code = SW_LID + i;
615 button->desc = (char *)
616 da850_evm_bb_exp[DA850_EVM_BB_EXP_USER_SW1 + i];
617 button->gpio = gpio + DA850_EVM_BB_EXP_USER_SW1 + i;
618 }
619}
620
621#define DA850_N_BB_USER_LED 2
622
623static struct gpio_led da850_evm_bb_leds[] = {
624 [0 ... DA850_N_BB_USER_LED - 1] = {
625 .active_low = 1,
626 .gpio = -1, /* assigned at runtime */
627 .name = NULL, /* assigned at runtime */
628 },
629};
630
631static struct gpio_led_platform_data da850_evm_bb_leds_pdata = {
632 .leds = da850_evm_bb_leds,
633 .num_leds = ARRAY_SIZE(da850_evm_bb_leds),
634};
635
636static struct platform_device da850_evm_bb_leds_device = {
637 .name = "leds-gpio",
638 .id = -1,
639 .dev = {
640 .platform_data = &da850_evm_bb_leds_pdata
641 }
642};
643
644static void da850_evm_bb_leds_init(unsigned gpio)
645{
646 int i;
647 struct gpio_led *led;
648
649 for (i = 0; i < DA850_N_BB_USER_LED; i++) {
650 led = &da850_evm_bb_leds[i];
651
652 led->gpio = gpio + DA850_EVM_BB_EXP_USER_LED2 + i;
653 led->name =
654 da850_evm_bb_exp[DA850_EVM_BB_EXP_USER_LED2 + i];
655 }
656}
657
658static int da850_evm_bb_expander_setup(struct i2c_client *client,
659 unsigned gpio, unsigned ngpio,
660 void *c)
661{
662 int ret;
663
664 /*
665 * Register the switches and pushbutton on the baseboard as a gpio-keys
666 * device.
667 */
668 da850_evm_bb_keys_init(gpio);
669 ret = platform_device_register(&da850_evm_bb_keys_device);
670 if (ret) {
671 pr_warning("Could not register baseboard GPIO expander keys");
672 goto io_exp_setup_sw_fail;
673 }
674
675 da850_evm_bb_leds_init(gpio);
676 ret = platform_device_register(&da850_evm_bb_leds_device);
677 if (ret) {
678 pr_warning("Could not register baseboard GPIO expander LEDS");
679 goto io_exp_setup_leds_fail;
680 }
681
682 return 0;
683
684io_exp_setup_leds_fail:
685 platform_device_unregister(&da850_evm_bb_keys_device);
686io_exp_setup_sw_fail:
687 return ret;
688}
689
690static int da850_evm_bb_expander_teardown(struct i2c_client *client,
691 unsigned gpio, unsigned ngpio, void *c)
692{
693 platform_device_unregister(&da850_evm_bb_leds_device);
694 platform_device_unregister(&da850_evm_bb_keys_device);
695
696 return 0;
697}
698
Chaithrika U S75e2ea62009-09-30 17:00:28 -0400699static struct pca953x_platform_data da850_evm_ui_expander_info = {
700 .gpio_base = DAVINCI_N_GPIO,
701 .setup = da850_evm_ui_expander_setup,
702 .teardown = da850_evm_ui_expander_teardown,
Ben Gardiner75929f52010-12-09 16:51:04 -0500703 .names = da850_evm_ui_exp,
Chaithrika U S75e2ea62009-09-30 17:00:28 -0400704};
705
Ben Gardiner70b30932010-12-09 16:51:06 -0500706static struct pca953x_platform_data da850_evm_bb_expander_info = {
707 .gpio_base = DA850_BB_EXPANDER_GPIO_BASE,
708 .setup = da850_evm_bb_expander_setup,
709 .teardown = da850_evm_bb_expander_teardown,
710 .names = da850_evm_bb_exp,
711};
712
Chaithrika U S1a7ff8f2009-08-25 15:20:05 +0300713static struct i2c_board_info __initdata da850_evm_i2c_devices[] = {
714 {
715 I2C_BOARD_INFO("tlv320aic3x", 0x18),
Chaithrika U S75e2ea62009-09-30 17:00:28 -0400716 },
717 {
718 I2C_BOARD_INFO("tca6416", 0x20),
719 .platform_data = &da850_evm_ui_expander_info,
720 },
Ben Gardiner70b30932010-12-09 16:51:06 -0500721 {
722 I2C_BOARD_INFO("tca6416", 0x21),
723 .platform_data = &da850_evm_bb_expander_info,
724 },
Chaithrika U S1a7ff8f2009-08-25 15:20:05 +0300725};
726
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -0400727static struct davinci_i2c_platform_data da850_evm_i2c_0_pdata = {
728 .bus_freq = 100, /* kHz */
729 .bus_delay = 0, /* usec */
730};
731
732static struct davinci_uart_config da850_evm_uart_config __initdata = {
733 .enabled_uarts = 0x7,
734};
735
Chaithrika U S491214e2009-08-11 17:03:25 -0400736/* davinci da850 evm audio machine driver */
737static u8 da850_iis_serializer_direction[] = {
738 INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
739 INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
740 INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, TX_MODE,
741 RX_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
742};
743
744static struct snd_platform_data da850_evm_snd_data = {
745 .tx_dma_offset = 0x2000,
746 .rx_dma_offset = 0x2000,
747 .op_mode = DAVINCI_MCASP_IIS_MODE,
748 .num_serializer = ARRAY_SIZE(da850_iis_serializer_direction),
749 .tdm_slots = 2,
750 .serial_dir = da850_iis_serializer_direction,
Sekhar Nori48519f02010-07-19 12:31:16 +0530751 .asp_chan_q = EVENTQ_1,
Chaithrika U S491214e2009-08-11 17:03:25 -0400752 .version = MCASP_VERSION_2,
753 .txnumevt = 1,
754 .rxnumevt = 1,
755};
756
Michael Williamsonc840fc72011-01-18 12:21:44 -0500757static const short da850_evm_mcasp_pins[] __initconst = {
758 DA850_AHCLKX, DA850_ACLKX, DA850_AFSX,
759 DA850_AHCLKR, DA850_ACLKR, DA850_AFSR, DA850_AMUTE,
760 DA850_AXR_11, DA850_AXR_12,
761 -1
762};
763
Sudhakar Rajashekhara700691f2009-08-13 15:16:23 -0400764static int da850_evm_mmc_get_ro(int index)
765{
766 return gpio_get_value(DA850_MMCSD_WP_PIN);
767}
768
769static int da850_evm_mmc_get_cd(int index)
770{
771 return !gpio_get_value(DA850_MMCSD_CD_PIN);
772}
773
774static struct davinci_mmc_config da850_mmc_config = {
775 .get_ro = da850_evm_mmc_get_ro,
776 .get_cd = da850_evm_mmc_get_cd,
777 .wires = 4,
Chaithrika U S0046d0b2009-11-03 15:46:14 +0530778 .max_freq = 50000000,
779 .caps = MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
Sudhakar Rajashekhara700691f2009-08-13 15:16:23 -0400780 .version = MMC_CTLR_VERSION_2,
781};
782
Michael Williamson5a0d80ea2011-01-18 12:21:45 -0500783static const short da850_evm_mmcsd0_pins[] __initconst = {
784 DA850_MMCSD0_DAT_0, DA850_MMCSD0_DAT_1, DA850_MMCSD0_DAT_2,
785 DA850_MMCSD0_DAT_3, DA850_MMCSD0_CLK, DA850_MMCSD0_CMD,
786 DA850_GPIO4_0, DA850_GPIO4_1,
787 -1
788};
789
Chaithrika U Sd52f2352009-12-15 16:46:46 -0800790static void da850_panel_power_ctrl(int val)
791{
792 /* lcd backlight */
793 gpio_set_value(DA850_LCD_BL_PIN, val);
794
795 /* lcd power */
796 gpio_set_value(DA850_LCD_PWR_PIN, val);
797}
798
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -0400799static int da850_lcd_hw_init(void)
800{
801 int status;
802
803 status = gpio_request(DA850_LCD_BL_PIN, "lcd bl\n");
804 if (status < 0)
805 return status;
806
807 status = gpio_request(DA850_LCD_PWR_PIN, "lcd pwr\n");
808 if (status < 0) {
809 gpio_free(DA850_LCD_BL_PIN);
810 return status;
811 }
812
813 gpio_direction_output(DA850_LCD_BL_PIN, 0);
814 gpio_direction_output(DA850_LCD_PWR_PIN, 0);
815
Chaithrika U Sd52f2352009-12-15 16:46:46 -0800816 /* Switch off panel power and backlight */
817 da850_panel_power_ctrl(0);
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -0400818
Chaithrika U Sd52f2352009-12-15 16:46:46 -0800819 /* Switch on panel power and backlight */
820 da850_panel_power_ctrl(1);
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -0400821
822 return 0;
823}
Chaithrika U S491214e2009-08-11 17:03:25 -0400824
Sekhar Noria9eb1f62009-09-22 21:14:04 +0530825/* TPS65070 voltage regulator support */
826
827/* 3.3V */
Sekhar Noridb549d22010-06-28 17:16:38 +0530828static struct regulator_consumer_supply tps65070_dcdc1_consumers[] = {
Sekhar Noria9eb1f62009-09-22 21:14:04 +0530829 {
830 .supply = "usb0_vdda33",
831 },
832 {
833 .supply = "usb1_vdda33",
834 },
835};
836
837/* 3.3V or 1.8V */
Sekhar Noridb549d22010-06-28 17:16:38 +0530838static struct regulator_consumer_supply tps65070_dcdc2_consumers[] = {
Sekhar Noria9eb1f62009-09-22 21:14:04 +0530839 {
840 .supply = "dvdd3318_a",
841 },
842 {
843 .supply = "dvdd3318_b",
844 },
845 {
846 .supply = "dvdd3318_c",
847 },
848};
849
850/* 1.2V */
Sekhar Noridb549d22010-06-28 17:16:38 +0530851static struct regulator_consumer_supply tps65070_dcdc3_consumers[] = {
Sekhar Noria9eb1f62009-09-22 21:14:04 +0530852 {
853 .supply = "cvdd",
854 },
855};
856
857/* 1.8V LDO */
Sekhar Noridb549d22010-06-28 17:16:38 +0530858static struct regulator_consumer_supply tps65070_ldo1_consumers[] = {
Sekhar Noria9eb1f62009-09-22 21:14:04 +0530859 {
860 .supply = "sata_vddr",
861 },
862 {
863 .supply = "usb0_vdda18",
864 },
865 {
866 .supply = "usb1_vdda18",
867 },
868 {
869 .supply = "ddr_dvdd18",
870 },
871};
872
873/* 1.2V LDO */
Sekhar Noridb549d22010-06-28 17:16:38 +0530874static struct regulator_consumer_supply tps65070_ldo2_consumers[] = {
Sekhar Noria9eb1f62009-09-22 21:14:04 +0530875 {
876 .supply = "sata_vdd",
877 },
878 {
879 .supply = "pll0_vdda",
880 },
881 {
882 .supply = "pll1_vdda",
883 },
884 {
885 .supply = "usbs_cvdd",
886 },
887 {
888 .supply = "vddarnwa1",
889 },
890};
891
Sekhar Nori8b245992010-07-12 17:56:21 +0530892/* We take advantage of the fact that both defdcdc{2,3} are tied high */
893static struct tps6507x_reg_platform_data tps6507x_platform_data = {
894 .defdcdc_default = true,
895};
896
Sekhar Noridb549d22010-06-28 17:16:38 +0530897static struct regulator_init_data tps65070_regulator_data[] = {
Sekhar Noria9eb1f62009-09-22 21:14:04 +0530898 /* dcdc1 */
899 {
900 .constraints = {
901 .min_uV = 3150000,
902 .max_uV = 3450000,
903 .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
904 REGULATOR_CHANGE_STATUS),
905 .boot_on = 1,
906 },
907 .num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc1_consumers),
908 .consumer_supplies = tps65070_dcdc1_consumers,
909 },
910
911 /* dcdc2 */
912 {
913 .constraints = {
914 .min_uV = 1710000,
915 .max_uV = 3450000,
916 .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
917 REGULATOR_CHANGE_STATUS),
918 .boot_on = 1,
919 },
920 .num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc2_consumers),
921 .consumer_supplies = tps65070_dcdc2_consumers,
Sekhar Nori8b245992010-07-12 17:56:21 +0530922 .driver_data = &tps6507x_platform_data,
Sekhar Noria9eb1f62009-09-22 21:14:04 +0530923 },
924
925 /* dcdc3 */
926 {
927 .constraints = {
928 .min_uV = 950000,
Sekhar Nori28bd2c32010-12-20 21:31:34 +0530929 .max_uV = 1350000,
Sekhar Noria9eb1f62009-09-22 21:14:04 +0530930 .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
931 REGULATOR_CHANGE_STATUS),
932 .boot_on = 1,
933 },
934 .num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc3_consumers),
935 .consumer_supplies = tps65070_dcdc3_consumers,
Sekhar Nori8b245992010-07-12 17:56:21 +0530936 .driver_data = &tps6507x_platform_data,
Sekhar Noria9eb1f62009-09-22 21:14:04 +0530937 },
938
939 /* ldo1 */
940 {
941 .constraints = {
942 .min_uV = 1710000,
943 .max_uV = 1890000,
944 .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
945 REGULATOR_CHANGE_STATUS),
946 .boot_on = 1,
947 },
948 .num_consumer_supplies = ARRAY_SIZE(tps65070_ldo1_consumers),
949 .consumer_supplies = tps65070_ldo1_consumers,
950 },
951
952 /* ldo2 */
953 {
954 .constraints = {
955 .min_uV = 1140000,
956 .max_uV = 1320000,
957 .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
958 REGULATOR_CHANGE_STATUS),
959 .boot_on = 1,
960 },
961 .num_consumer_supplies = ARRAY_SIZE(tps65070_ldo2_consumers),
962 .consumer_supplies = tps65070_ldo2_consumers,
963 },
964};
965
Todd Fischerda1e3682010-04-05 17:53:13 -0600966static struct touchscreen_init_data tps6507x_touchscreen_data = {
967 .poll_period = 30, /* ms between touch samples */
968 .min_pressure = 0x30, /* minimum pressure to trigger touch */
969 .vref = 0, /* turn off vref when not using A/D */
970 .vendor = 0, /* /sys/class/input/input?/id/vendor */
971 .product = 65070, /* /sys/class/input/input?/id/product */
972 .version = 0x100, /* /sys/class/input/input?/id/version */
973};
974
Todd Fischer0bc20bb2010-04-05 20:23:57 -0600975static struct tps6507x_board tps_board = {
976 .tps6507x_pmic_init_data = &tps65070_regulator_data[0],
Todd Fischerda1e3682010-04-05 17:53:13 -0600977 .tps6507x_ts_init_data = &tps6507x_touchscreen_data,
Todd Fischer0bc20bb2010-04-05 20:23:57 -0600978};
979
Ben Gardiner3506f272010-11-19 16:43:04 -0500980static struct i2c_board_info __initdata da850_evm_tps65070_info[] = {
Sekhar Noria9eb1f62009-09-22 21:14:04 +0530981 {
982 I2C_BOARD_INFO("tps6507x", 0x48),
Todd Fischer0bc20bb2010-04-05 20:23:57 -0600983 .platform_data = &tps_board,
Sekhar Noria9eb1f62009-09-22 21:14:04 +0530984 },
985};
986
987static int __init pmic_tps65070_init(void)
988{
Ben Gardiner3506f272010-11-19 16:43:04 -0500989 return i2c_register_board_info(1, da850_evm_tps65070_info,
990 ARRAY_SIZE(da850_evm_tps65070_info));
Sekhar Noria9eb1f62009-09-22 21:14:04 +0530991}
992
Sudhakar Rajashekhara7761ef62009-09-15 17:46:14 -0400993static const short da850_evm_lcdc_pins[] = {
994 DA850_GPIO2_8, DA850_GPIO2_15,
995 -1
996};
997
Sergei Shtylyov85b83072010-08-01 21:17:00 +0400998static const short da850_evm_mii_pins[] = {
999 DA850_MII_TXEN, DA850_MII_TXCLK, DA850_MII_COL, DA850_MII_TXD_3,
1000 DA850_MII_TXD_2, DA850_MII_TXD_1, DA850_MII_TXD_0, DA850_MII_RXER,
1001 DA850_MII_CRS, DA850_MII_RXCLK, DA850_MII_RXDV, DA850_MII_RXD_3,
1002 DA850_MII_RXD_2, DA850_MII_RXD_1, DA850_MII_RXD_0, DA850_MDIO_CLK,
1003 DA850_MDIO_D,
1004 -1
1005};
1006
1007static const short da850_evm_rmii_pins[] = {
1008 DA850_RMII_TXD_0, DA850_RMII_TXD_1, DA850_RMII_TXEN,
1009 DA850_RMII_CRS_DV, DA850_RMII_RXD_0, DA850_RMII_RXD_1,
1010 DA850_RMII_RXER, DA850_RMII_MHZ_50_CLK, DA850_MDIO_CLK,
1011 DA850_MDIO_D,
1012 -1
1013};
1014
Sekhar Noribae10582009-10-21 21:18:22 +05301015static int __init da850_evm_config_emac(void)
Chaithrika U S22067712009-09-30 17:00:53 -04001016{
1017 void __iomem *cfg_chip3_base;
1018 int ret;
1019 u32 val;
Sekhar Noribae10582009-10-21 21:18:22 +05301020 struct davinci_soc_info *soc_info = &davinci_soc_info;
1021 u8 rmii_en = soc_info->emac_pdata->rmii_en;
1022
1023 if (!machine_is_davinci_da850_evm())
1024 return 0;
Chaithrika U S22067712009-09-30 17:00:53 -04001025
Sekhar Norid2de0582009-11-16 17:21:32 +05301026 cfg_chip3_base = DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG);
Chaithrika U S22067712009-09-30 17:00:53 -04001027
Chaithrika U S22067712009-09-30 17:00:53 -04001028 val = __raw_readl(cfg_chip3_base);
Sekhar Nori17fadd92009-10-21 21:18:24 +05301029
1030 if (rmii_en) {
Chaithrika U S22067712009-09-30 17:00:53 -04001031 val |= BIT(8);
Sergei Shtylyov85b83072010-08-01 21:17:00 +04001032 ret = davinci_cfg_reg_list(da850_evm_rmii_pins);
Sekhar Nori17fadd92009-10-21 21:18:24 +05301033 pr_info("EMAC: RMII PHY configured, MII PHY will not be"
1034 " functional\n");
1035 } else {
1036 val &= ~BIT(8);
Sergei Shtylyov85b83072010-08-01 21:17:00 +04001037 ret = davinci_cfg_reg_list(da850_evm_mii_pins);
Sekhar Nori17fadd92009-10-21 21:18:24 +05301038 pr_info("EMAC: MII PHY configured, RMII PHY will not be"
1039 " functional\n");
1040 }
1041
Chaithrika U S22067712009-09-30 17:00:53 -04001042 if (ret)
1043 pr_warning("da850_evm_init: cpgmac/rmii mux setup failed: %d\n",
1044 ret);
1045
Sekhar Nori17fadd92009-10-21 21:18:24 +05301046 /* configure the CFGCHIP3 register for RMII or MII */
1047 __raw_writel(val, cfg_chip3_base);
1048
Chaithrika U S22067712009-09-30 17:00:53 -04001049 ret = davinci_cfg_reg(DA850_GPIO2_6);
1050 if (ret)
1051 pr_warning("da850_evm_init:GPIO(2,6) mux setup "
1052 "failed\n");
1053
1054 ret = gpio_request(DA850_MII_MDIO_CLKEN_PIN, "mdio_clk_en");
1055 if (ret) {
1056 pr_warning("Cannot open GPIO %d\n",
1057 DA850_MII_MDIO_CLKEN_PIN);
1058 return ret;
1059 }
1060
Sekhar Nori17fadd92009-10-21 21:18:24 +05301061 /* Enable/Disable MII MDIO clock */
1062 gpio_direction_output(DA850_MII_MDIO_CLKEN_PIN, rmii_en);
Chaithrika U S22067712009-09-30 17:00:53 -04001063
Cyril Chemparathy782f2d72010-09-15 10:11:25 -04001064 soc_info->emac_pdata->phy_id = DA850_EVM_PHY_ID;
Sekhar Noribae10582009-10-21 21:18:22 +05301065
1066 ret = da8xx_register_emac();
1067 if (ret)
1068 pr_warning("da850_evm_init: emac registration failed: %d\n",
1069 ret);
1070
Chaithrika U S22067712009-09-30 17:00:53 -04001071 return 0;
1072}
Sekhar Noribae10582009-10-21 21:18:22 +05301073device_initcall(da850_evm_config_emac);
Chaithrika U S22067712009-09-30 17:00:53 -04001074
Rajashekhara, Sudhakara941c502010-06-29 11:35:14 +05301075/*
1076 * The following EDMA channels/slots are not being used by drivers (for
1077 * example: Timer, GPIO, UART events etc) on da850/omap-l138 EVM, hence
1078 * they are being reserved for codecs on the DSP side.
1079 */
1080static const s16 da850_dma0_rsv_chans[][2] = {
1081 /* (offset, number) */
1082 { 8, 6},
1083 {24, 4},
1084 {30, 2},
1085 {-1, -1}
1086};
1087
1088static const s16 da850_dma0_rsv_slots[][2] = {
1089 /* (offset, number) */
1090 { 8, 6},
1091 {24, 4},
1092 {30, 50},
1093 {-1, -1}
1094};
1095
1096static const s16 da850_dma1_rsv_chans[][2] = {
1097 /* (offset, number) */
1098 { 0, 28},
1099 {30, 2},
1100 {-1, -1}
1101};
1102
1103static const s16 da850_dma1_rsv_slots[][2] = {
1104 /* (offset, number) */
1105 { 0, 28},
1106 {30, 90},
1107 {-1, -1}
1108};
1109
1110static struct edma_rsv_info da850_edma_cc0_rsv = {
1111 .rsv_chans = da850_dma0_rsv_chans,
1112 .rsv_slots = da850_dma0_rsv_slots,
1113};
1114
1115static struct edma_rsv_info da850_edma_cc1_rsv = {
1116 .rsv_chans = da850_dma1_rsv_chans,
1117 .rsv_slots = da850_dma1_rsv_slots,
1118};
1119
1120static struct edma_rsv_info *da850_edma_rsv[2] = {
1121 &da850_edma_cc0_rsv,
1122 &da850_edma_cc1_rsv,
1123};
1124
Sekhar Nori28bd2c32010-12-20 21:31:34 +05301125#ifdef CONFIG_CPU_FREQ
1126static __init int da850_evm_init_cpufreq(void)
1127{
1128 switch (system_rev & 0xF) {
1129 case 3:
1130 da850_max_speed = 456000;
1131 break;
1132 case 2:
1133 da850_max_speed = 408000;
1134 break;
1135 case 1:
1136 da850_max_speed = 372000;
1137 break;
1138 }
1139
1140 return da850_register_cpufreq("pll0_sysclk3");
1141}
1142#else
1143static __init int da850_evm_init_cpufreq(void) { return 0; }
1144#endif
1145
Sekhar Nori8bb2c482011-07-06 06:01:24 +00001146#define DA850EVM_SATA_REFCLKPN_RATE (100 * 1000 * 1000)
1147
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -04001148static __init void da850_evm_init(void)
1149{
1150 int ret;
1151
Sekhar Noria9eb1f62009-09-22 21:14:04 +05301152 ret = pmic_tps65070_init();
1153 if (ret)
1154 pr_warning("da850_evm_init: TPS65070 PMIC init failed: %d\n",
1155 ret);
1156
Rajashekhara, Sudhakara941c502010-06-29 11:35:14 +05301157 ret = da850_register_edma(da850_edma_rsv);
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -04001158 if (ret)
1159 pr_warning("da850_evm_init: edma registration failed: %d\n",
1160 ret);
1161
Cyril Chemparathy3821d102010-03-25 17:43:48 -04001162 ret = davinci_cfg_reg_list(da850_i2c0_pins);
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -04001163 if (ret)
1164 pr_warning("da850_evm_init: i2c0 mux setup failed: %d\n",
1165 ret);
1166
1167 ret = da8xx_register_i2c(0, &da850_evm_i2c_0_pdata);
1168 if (ret)
1169 pr_warning("da850_evm_init: i2c0 registration failed: %d\n",
1170 ret);
1171
Sudhakar Rajashekhara5a4b1312009-07-17 04:47:10 -04001172
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -04001173 ret = da8xx_register_watchdog();
1174 if (ret)
1175 pr_warning("da830_evm_init: watchdog registration failed: %d\n",
1176 ret);
1177
Sudhakar Rajashekhara820c4fe2009-08-13 18:16:28 -04001178 if (HAS_MMC) {
Michael Williamson5a0d80ea2011-01-18 12:21:45 -05001179 ret = davinci_cfg_reg_list(da850_evm_mmcsd0_pins);
Sudhakar Rajashekhara820c4fe2009-08-13 18:16:28 -04001180 if (ret)
1181 pr_warning("da850_evm_init: mmcsd0 mux setup failed:"
1182 " %d\n", ret);
Sudhakar Rajashekhara700691f2009-08-13 15:16:23 -04001183
Sudhakar Rajashekhara820c4fe2009-08-13 18:16:28 -04001184 ret = gpio_request(DA850_MMCSD_CD_PIN, "MMC CD\n");
1185 if (ret)
1186 pr_warning("da850_evm_init: can not open GPIO %d\n",
1187 DA850_MMCSD_CD_PIN);
1188 gpio_direction_input(DA850_MMCSD_CD_PIN);
Sudhakar Rajashekhara700691f2009-08-13 15:16:23 -04001189
Sudhakar Rajashekhara820c4fe2009-08-13 18:16:28 -04001190 ret = gpio_request(DA850_MMCSD_WP_PIN, "MMC WP\n");
1191 if (ret)
1192 pr_warning("da850_evm_init: can not open GPIO %d\n",
1193 DA850_MMCSD_WP_PIN);
1194 gpio_direction_input(DA850_MMCSD_WP_PIN);
1195
1196 ret = da8xx_register_mmcsd0(&da850_mmc_config);
1197 if (ret)
1198 pr_warning("da850_evm_init: mmcsd0 registration failed:"
1199 " %d\n", ret);
1200 }
Sudhakar Rajashekhara700691f2009-08-13 15:16:23 -04001201
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -04001202 davinci_serial_init(&da850_evm_uart_config);
1203
Chaithrika U S1a7ff8f2009-08-25 15:20:05 +03001204 i2c_register_board_info(1, da850_evm_i2c_devices,
1205 ARRAY_SIZE(da850_evm_i2c_devices));
1206
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -04001207 /*
1208 * shut down uart 0 and 1; they are not used on the board and
1209 * accessing them causes endless "too much work in irq53" messages
1210 * with arago fs
1211 */
1212 __raw_writel(0, IO_ADDRESS(DA8XX_UART1_BASE) + 0x30);
1213 __raw_writel(0, IO_ADDRESS(DA8XX_UART0_BASE) + 0x30);
Chaithrika U S491214e2009-08-11 17:03:25 -04001214
Michael Williamsonc840fc72011-01-18 12:21:44 -05001215 ret = davinci_cfg_reg_list(da850_evm_mcasp_pins);
Chaithrika U S491214e2009-08-11 17:03:25 -04001216 if (ret)
1217 pr_warning("da850_evm_init: mcasp mux setup failed: %d\n",
1218 ret);
1219
Mark A. Greerb8864aa2009-08-28 15:05:02 -07001220 da8xx_register_mcasp(0, &da850_evm_snd_data);
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -04001221
Cyril Chemparathy3821d102010-03-25 17:43:48 -04001222 ret = davinci_cfg_reg_list(da850_lcdcntl_pins);
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -04001223 if (ret)
1224 pr_warning("da850_evm_init: lcdcntl mux setup failed: %d\n",
1225 ret);
1226
Sudhakar Rajashekhara7761ef62009-09-15 17:46:14 -04001227 /* Handle board specific muxing for LCD here */
Cyril Chemparathy3821d102010-03-25 17:43:48 -04001228 ret = davinci_cfg_reg_list(da850_evm_lcdc_pins);
Sudhakar Rajashekhara7761ef62009-09-15 17:46:14 -04001229 if (ret)
1230 pr_warning("da850_evm_init: evm specific lcd mux setup "
1231 "failed: %d\n", ret);
1232
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -04001233 ret = da850_lcd_hw_init();
1234 if (ret)
1235 pr_warning("da850_evm_init: lcd initialization failed: %d\n",
1236 ret);
1237
Chaithrika U Sd52f2352009-12-15 16:46:46 -08001238 sharp_lk043t1dg01_pdata.panel_power_ctrl = da850_panel_power_ctrl,
Mark A. Greerb9e63422009-09-15 18:14:19 -07001239 ret = da8xx_register_lcdc(&sharp_lk043t1dg01_pdata);
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -04001240 if (ret)
1241 pr_warning("da850_evm_init: lcdc registration failed: %d\n",
1242 ret);
Mark A. Greerc51df702009-09-15 18:15:54 -07001243
1244 ret = da8xx_register_rtc();
1245 if (ret)
1246 pr_warning("da850_evm_init: rtc setup failed: %d\n", ret);
Sekhar Nori09dc2d42009-09-22 21:14:03 +05301247
Sekhar Nori28bd2c32010-12-20 21:31:34 +05301248 ret = da850_evm_init_cpufreq();
Sekhar Nori09dc2d42009-09-22 21:14:03 +05301249 if (ret)
1250 pr_warning("da850_evm_init: cpufreq registration failed: %d\n",
1251 ret);
Sekhar Nori5aeb15a2009-10-22 15:12:15 +05301252
1253 ret = da8xx_register_cpuidle();
1254 if (ret)
1255 pr_warning("da850_evm_init: cpuidle registration failed: %d\n",
1256 ret);
Sekhar Nori63534442009-12-17 18:29:33 +05301257
1258 ret = da850_register_pm(&da850_pm_device);
1259 if (ret)
1260 pr_warning("da850_evm_init: suspend registration failed: %d\n",
1261 ret);
Sekhar Norifdce5562011-02-24 10:39:27 +05301262
1263 ret = da8xx_register_spi(1, da850evm_spi_info,
1264 ARRAY_SIZE(da850evm_spi_info));
1265 if (ret)
1266 pr_warning("da850_evm_init: spi 1 registration failed: %d\n",
1267 ret);
Sekhar Nori8bb2c482011-07-06 06:01:24 +00001268
1269 ret = da850_register_sata(DA850EVM_SATA_REFCLKPN_RATE);
1270 if (ret)
1271 pr_warning("da850_evm_init: sata registration failed: %d\n",
1272 ret);
Rajashekhara, Sudhakar810198b2011-07-12 15:58:53 +05301273
1274 da850_evm_setup_mac_addr();
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -04001275}
1276
1277#ifdef CONFIG_SERIAL_8250_CONSOLE
1278static int __init da850_evm_console_init(void)
1279{
Michael Williamson1aa5f2a2010-08-31 14:30:15 -04001280 if (!machine_is_davinci_da850_evm())
1281 return 0;
1282
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -04001283 return add_preferred_console("ttyS", 2, "115200");
1284}
1285console_initcall(da850_evm_console_init);
1286#endif
1287
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -04001288static void __init da850_evm_map_io(void)
1289{
1290 da850_init();
1291}
1292
Sekhar Nori48ea89e2010-07-01 19:00:50 +05301293MACHINE_START(DAVINCI_DA850_EVM, "DaVinci DA850/OMAP-L138/AM18x EVM")
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -04001294 .boot_params = (DA8XX_DDR_BASE + 0x100),
1295 .map_io = da850_evm_map_io,
Cyril Chemparathybd808942010-05-07 17:06:37 -04001296 .init_irq = cp_intc_init,
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -04001297 .timer = &davinci_timer,
1298 .init_machine = da850_evm_init,
Nicolas Pitref68deab2011-07-05 22:28:08 -04001299 .dma_zone_size = SZ_128M,
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -04001300MACHINE_END