blob: 5db09014f55a9c1674313747eff9cc75046a6626 [file] [log] [blame]
Mark A. Greer85937902009-06-03 18:41:53 -07001/*
2 * TI DA830/OMAP L137 EVM board
3 *
4 * Author: Mark A. Greer <mgreer@mvista.com>
5 * Derived from: arch/arm/mach-davinci/board-dm644x-evm.c
6 *
7 * 2007, 2009 (c) MontaVista Software, Inc. This file is licensed under
8 * the terms of the GNU General Public License version 2. This program
9 * is licensed "as is" without any warranty of any kind, whether express
10 * or implied.
11 */
12#include <linux/kernel.h>
Mark A. Greer85937902009-06-03 18:41:53 -070013#include <linux/init.h>
14#include <linux/console.h>
Sergei Shtylyov0e9a3dd2009-09-25 23:28:13 +040015#include <linux/interrupt.h>
Steve Chen13e1f042009-09-15 18:15:06 -070016#include <linux/gpio.h>
David A. Griego733975a2009-09-18 14:15:18 -070017#include <linux/platform_device.h>
Mark A. Greer85937902009-06-03 18:41:53 -070018#include <linux/i2c.h>
Steve Chen13e1f042009-09-15 18:15:06 -070019#include <linux/i2c/pcf857x.h>
Vivien Didelot25f73ed2013-09-27 15:06:28 -040020#include <linux/platform_data/at24.h>
David A. Griego733975a2009-09-18 14:15:18 -070021#include <linux/mtd/mtd.h>
22#include <linux/mtd/partitions.h>
Sekhar Nori16a3c832011-02-24 10:53:27 +053023#include <linux/spi/spi.h>
24#include <linux/spi/flash.h>
Philip Avinashb856671e2013-08-18 10:49:01 +053025#include <linux/platform_data/gpio-davinci.h>
26#include <linux/platform_data/mtd-davinci.h>
27#include <linux/platform_data/mtd-davinci-aemif.h>
28#include <linux/platform_data/spi-davinci.h>
29#include <linux/platform_data/usb-davinci.h>
Axel Haslam40a17ab2016-10-26 21:41:55 +020030#include <linux/regulator/machine.h>
Mark A. Greer85937902009-06-03 18:41:53 -070031
32#include <asm/mach-types.h>
33#include <asm/mach/arch.h>
34
Philip Avinashb856671e2013-08-18 10:49:01 +053035#include <mach/common.h>
Arnd Bergmann3acf7312015-01-30 10:45:33 +010036#include "cp_intc.h"
Mark A. Greer32bf0782009-08-28 15:05:21 -070037#include <mach/mux.h>
Mark A. Greer85937902009-06-03 18:41:53 -070038#include <mach/da8xx.h>
39
Cyril Chemparathy782f2d72010-09-15 10:11:25 -040040#define DA830_EVM_PHY_ID ""
Sergei Shtylyov0e9a3dd2009-09-25 23:28:13 +040041/*
42 * USB1 VBUS is controlled by GPIO1[15], over-current is reported on GPIO2[4].
43 */
44#define ON_BD_USB_DRV GPIO_TO_PIN(1, 15)
45#define ON_BD_USB_OVC GPIO_TO_PIN(2, 4)
46
47static const short da830_evm_usb11_pins[] = {
48 DA830_GPIO1_15, DA830_GPIO2_4,
49 -1
50};
51
52static da8xx_ocic_handler_t da830_evm_usb_ocic_handler;
53
54static int da830_evm_usb_set_power(unsigned port, int on)
55{
56 gpio_set_value(ON_BD_USB_DRV, on);
57 return 0;
58}
59
60static int da830_evm_usb_get_power(unsigned port)
61{
62 return gpio_get_value(ON_BD_USB_DRV);
63}
64
65static int da830_evm_usb_get_oci(unsigned port)
66{
67 return !gpio_get_value(ON_BD_USB_OVC);
68}
69
70static irqreturn_t da830_evm_usb_ocic_irq(int, void *);
71
72static int da830_evm_usb_ocic_notify(da8xx_ocic_handler_t handler)
73{
74 int irq = gpio_to_irq(ON_BD_USB_OVC);
75 int error = 0;
76
77 if (handler != NULL) {
78 da830_evm_usb_ocic_handler = handler;
79
Michael Opdenacker1091a652013-09-07 09:07:13 +020080 error = request_irq(irq, da830_evm_usb_ocic_irq,
Sergei Shtylyov0e9a3dd2009-09-25 23:28:13 +040081 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
82 "OHCI over-current indicator", NULL);
83 if (error)
Joe Perchesa7ca2bc2014-10-31 17:51:51 -070084 pr_err("%s: could not request IRQ to watch over-current indicator changes\n",
85 __func__);
Sergei Shtylyov0e9a3dd2009-09-25 23:28:13 +040086 } else
87 free_irq(irq, NULL);
88
89 return error;
90}
91
92static struct da8xx_ohci_root_hub da830_evm_usb11_pdata = {
93 .set_power = da830_evm_usb_set_power,
94 .get_power = da830_evm_usb_get_power,
95 .get_oci = da830_evm_usb_get_oci,
96 .ocic_notify = da830_evm_usb_ocic_notify,
97
98 /* TPS2065 switch @ 5V */
99 .potpgt = (3 + 1) / 2, /* 3 ms max */
100};
101
102static irqreturn_t da830_evm_usb_ocic_irq(int irq, void *dev_id)
103{
104 da830_evm_usb_ocic_handler(&da830_evm_usb11_pdata, 1);
105 return IRQ_HANDLED;
106}
107
108static __init void da830_evm_usb_init(void)
109{
Sergei Shtylyov0e9a3dd2009-09-25 23:28:13 +0400110 int ret;
111
Sergei Shtylyovca6a2722009-10-30 23:52:04 +0400112 /* USB_REFCLKIN is not used. */
David Lechner0004b022016-10-31 15:47:20 -0500113 ret = da8xx_register_usb20_phy_clk(false);
114 if (ret)
115 pr_warn("%s: USB 2.0 PHY CLK registration failed: %d\n",
116 __func__, ret);
117
118 ret = da8xx_register_usb11_phy_clk(false);
119 if (ret)
120 pr_warn("%s: USB 1.1 PHY CLK registration failed: %d\n",
121 __func__, ret);
David Lechner9b504752016-10-26 19:18:15 -0500122
123 ret = da8xx_register_usb_phy();
124 if (ret)
125 pr_warn("%s: USB PHY registration failed: %d\n",
126 __func__, ret);
127
Sergei Shtylyovca6a2722009-10-30 23:52:04 +0400128 ret = davinci_cfg_reg(DA830_USB0_DRVVBUS);
129 if (ret)
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700130 pr_warn("%s: USB 2.0 PinMux setup failed: %d\n", __func__, ret);
Sergei Shtylyovca6a2722009-10-30 23:52:04 +0400131 else {
132 /*
133 * TPS2065 switch @ 5V supplies 1 A (sustains 1.5 A),
134 * with the power on to power good time of 3 ms.
135 */
136 ret = da8xx_register_usb20(1000, 3);
137 if (ret)
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700138 pr_warn("%s: USB 2.0 registration failed: %d\n",
139 __func__, ret);
Sergei Shtylyovca6a2722009-10-30 23:52:04 +0400140 }
141
Cyril Chemparathy3821d102010-03-25 17:43:48 -0400142 ret = davinci_cfg_reg_list(da830_evm_usb11_pins);
Sergei Shtylyov0e9a3dd2009-09-25 23:28:13 +0400143 if (ret) {
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700144 pr_warn("%s: USB 1.1 PinMux setup failed: %d\n", __func__, ret);
Sergei Shtylyov0e9a3dd2009-09-25 23:28:13 +0400145 return;
146 }
147
148 ret = gpio_request(ON_BD_USB_DRV, "ON_BD_USB_DRV");
149 if (ret) {
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700150 pr_err("%s: failed to request GPIO for USB 1.1 port power control: %d\n",
151 __func__, ret);
Sergei Shtylyov0e9a3dd2009-09-25 23:28:13 +0400152 return;
153 }
154 gpio_direction_output(ON_BD_USB_DRV, 0);
155
156 ret = gpio_request(ON_BD_USB_OVC, "ON_BD_USB_OVC");
157 if (ret) {
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700158 pr_err("%s: failed to request GPIO for USB 1.1 port over-current indicator: %d\n",
159 __func__, ret);
Sergei Shtylyov0e9a3dd2009-09-25 23:28:13 +0400160 return;
161 }
162 gpio_direction_input(ON_BD_USB_OVC);
163
164 ret = da8xx_register_usb11(&da830_evm_usb11_pdata);
165 if (ret)
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700166 pr_warn("%s: USB 1.1 registration failed: %d\n", __func__, ret);
Sergei Shtylyov0e9a3dd2009-09-25 23:28:13 +0400167}
168
Mark A. Greer32bf0782009-08-28 15:05:21 -0700169static const short da830_evm_mcasp1_pins[] = {
170 DA830_AHCLKX1, DA830_ACLKX1, DA830_AFSX1, DA830_AHCLKR1, DA830_AFSR1,
171 DA830_AMUTE1, DA830_AXR1_0, DA830_AXR1_1, DA830_AXR1_2, DA830_AXR1_5,
172 DA830_ACLKR1, DA830_AXR1_6, DA830_AXR1_7, DA830_AXR1_8, DA830_AXR1_10,
173 DA830_AXR1_11,
174 -1
175};
176
Chaithrika U Se33ef5e2009-08-11 17:01:59 -0400177static u8 da830_iis_serializer_direction[] = {
178 RX_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
179 INACTIVE_MODE, TX_MODE, INACTIVE_MODE, INACTIVE_MODE,
180 INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
181};
182
183static struct snd_platform_data da830_evm_snd_data = {
184 .tx_dma_offset = 0x2000,
185 .rx_dma_offset = 0x2000,
186 .op_mode = DAVINCI_MCASP_IIS_MODE,
187 .num_serializer = ARRAY_SIZE(da830_iis_serializer_direction),
188 .tdm_slots = 2,
189 .serial_dir = da830_iis_serializer_direction,
Sekhar Nori48519f02010-07-19 12:31:16 +0530190 .asp_chan_q = EVENTQ_0,
Chaithrika U Se33ef5e2009-08-11 17:01:59 -0400191 .version = MCASP_VERSION_2,
192 .txnumevt = 1,
193 .rxnumevt = 1,
194};
195
David A. Griego2eb30c82009-09-15 18:10:20 -0700196/*
197 * GPIO2[1] is used as MMC_SD_WP and GPIO2[2] as MMC_SD_INS.
198 */
199static const short da830_evm_mmc_sd_pins[] = {
200 DA830_MMCSD_DAT_0, DA830_MMCSD_DAT_1, DA830_MMCSD_DAT_2,
201 DA830_MMCSD_DAT_3, DA830_MMCSD_DAT_4, DA830_MMCSD_DAT_5,
202 DA830_MMCSD_DAT_6, DA830_MMCSD_DAT_7, DA830_MMCSD_CLK,
203 DA830_MMCSD_CMD, DA830_GPIO2_1, DA830_GPIO2_2,
204 -1
205};
206
207#define DA830_MMCSD_WP_PIN GPIO_TO_PIN(2, 1)
Vipin Bhandari8ccfd3f2010-03-10 14:03:01 +0530208#define DA830_MMCSD_CD_PIN GPIO_TO_PIN(2, 2)
David A. Griego2eb30c82009-09-15 18:10:20 -0700209
210static int da830_evm_mmc_get_ro(int index)
211{
212 return gpio_get_value(DA830_MMCSD_WP_PIN);
213}
214
Vipin Bhandari8ccfd3f2010-03-10 14:03:01 +0530215static int da830_evm_mmc_get_cd(int index)
216{
217 return !gpio_get_value(DA830_MMCSD_CD_PIN);
218}
219
David A. Griego2eb30c82009-09-15 18:10:20 -0700220static struct davinci_mmc_config da830_evm_mmc_config = {
221 .get_ro = da830_evm_mmc_get_ro,
Vipin Bhandari8ccfd3f2010-03-10 14:03:01 +0530222 .get_cd = da830_evm_mmc_get_cd,
Vipin Bhandarid154fed2010-03-10 14:03:02 +0530223 .wires = 8,
Chaithrika U S0046d0b2009-11-03 15:46:14 +0530224 .max_freq = 50000000,
225 .caps = MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
David A. Griego2eb30c82009-09-15 18:10:20 -0700226};
227
228static inline void da830_evm_init_mmc(void)
229{
230 int ret;
231
Cyril Chemparathy3821d102010-03-25 17:43:48 -0400232 ret = davinci_cfg_reg_list(da830_evm_mmc_sd_pins);
David A. Griego2eb30c82009-09-15 18:10:20 -0700233 if (ret) {
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700234 pr_warn("%s: mmc/sd mux setup failed: %d\n", __func__, ret);
David A. Griego2eb30c82009-09-15 18:10:20 -0700235 return;
236 }
237
238 ret = gpio_request(DA830_MMCSD_WP_PIN, "MMC WP");
239 if (ret) {
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700240 pr_warn("%s: can not open GPIO %d\n",
241 __func__, DA830_MMCSD_WP_PIN);
David A. Griego2eb30c82009-09-15 18:10:20 -0700242 return;
243 }
244 gpio_direction_input(DA830_MMCSD_WP_PIN);
245
Vipin Bhandari8ccfd3f2010-03-10 14:03:01 +0530246 ret = gpio_request(DA830_MMCSD_CD_PIN, "MMC CD\n");
247 if (ret) {
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700248 pr_warn("%s: can not open GPIO %d\n",
249 __func__, DA830_MMCSD_CD_PIN);
Vipin Bhandari8ccfd3f2010-03-10 14:03:01 +0530250 return;
251 }
252 gpio_direction_input(DA830_MMCSD_CD_PIN);
253
David A. Griego2eb30c82009-09-15 18:10:20 -0700254 ret = da8xx_register_mmcsd0(&da830_evm_mmc_config);
255 if (ret) {
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700256 pr_warn("%s: mmc/sd registration failed: %d\n", __func__, ret);
David A. Griego2eb30c82009-09-15 18:10:20 -0700257 gpio_free(DA830_MMCSD_WP_PIN);
258 }
259}
260
Sekhar Noria0433ac2009-10-09 20:55:43 +0530261/*
262 * UI board NAND/NOR flashes only use 8-bit data bus.
263 */
264static const short da830_evm_emif25_pins[] = {
265 DA830_EMA_D_0, DA830_EMA_D_1, DA830_EMA_D_2, DA830_EMA_D_3,
266 DA830_EMA_D_4, DA830_EMA_D_5, DA830_EMA_D_6, DA830_EMA_D_7,
267 DA830_EMA_A_0, DA830_EMA_A_1, DA830_EMA_A_2, DA830_EMA_A_3,
268 DA830_EMA_A_4, DA830_EMA_A_5, DA830_EMA_A_6, DA830_EMA_A_7,
269 DA830_EMA_A_8, DA830_EMA_A_9, DA830_EMA_A_10, DA830_EMA_A_11,
270 DA830_EMA_A_12, DA830_EMA_BA_0, DA830_EMA_BA_1, DA830_NEMA_WE,
271 DA830_NEMA_CS_2, DA830_NEMA_CS_3, DA830_NEMA_OE, DA830_EMA_WAIT_0,
272 -1
273};
274
Lad, Prabhakara0a56db2013-04-01 12:43:44 +0530275#define HAS_MMC IS_ENABLED(CONFIG_MMC_DAVINCI)
Sekhar Norib5ebe4e2009-10-21 21:18:21 +0530276
David A. Griego733975a2009-09-18 14:15:18 -0700277#ifdef CONFIG_DA830_UI_NAND
278static struct mtd_partition da830_evm_nand_partitions[] = {
279 /* bootloader (U-Boot, etc) in first sector */
280 [0] = {
281 .name = "bootloader",
282 .offset = 0,
283 .size = SZ_128K,
284 .mask_flags = MTD_WRITEABLE, /* force read-only */
285 },
286 /* bootloader params in the next sector */
287 [1] = {
288 .name = "params",
289 .offset = MTDPART_OFS_APPEND,
290 .size = SZ_128K,
291 .mask_flags = MTD_WRITEABLE, /* force read-only */
292 },
293 /* kernel */
294 [2] = {
295 .name = "kernel",
296 .offset = MTDPART_OFS_APPEND,
297 .size = SZ_2M,
298 .mask_flags = 0,
299 },
300 /* file system */
301 [3] = {
302 .name = "filesystem",
303 .offset = MTDPART_OFS_APPEND,
304 .size = MTDPART_SIZ_FULL,
305 .mask_flags = 0,
306 }
307};
308
309/* flash bbt decriptors */
310static uint8_t da830_evm_nand_bbt_pattern[] = { 'B', 'b', 't', '0' };
311static uint8_t da830_evm_nand_mirror_pattern[] = { '1', 't', 'b', 'B' };
312
313static struct nand_bbt_descr da830_evm_nand_bbt_main_descr = {
314 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE |
315 NAND_BBT_WRITE | NAND_BBT_2BIT |
316 NAND_BBT_VERSION | NAND_BBT_PERCHIP,
317 .offs = 2,
318 .len = 4,
319 .veroffs = 16,
320 .maxblocks = 4,
321 .pattern = da830_evm_nand_bbt_pattern
322};
323
324static struct nand_bbt_descr da830_evm_nand_bbt_mirror_descr = {
325 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE |
326 NAND_BBT_WRITE | NAND_BBT_2BIT |
327 NAND_BBT_VERSION | NAND_BBT_PERCHIP,
328 .offs = 2,
329 .len = 4,
330 .veroffs = 16,
331 .maxblocks = 4,
332 .pattern = da830_evm_nand_mirror_pattern
333};
334
Sudhakar Rajashekhara217f1362010-08-09 15:46:38 +0530335static struct davinci_aemif_timing da830_evm_nandflash_timing = {
336 .wsetup = 24,
337 .wstrobe = 21,
338 .whold = 14,
339 .rsetup = 19,
340 .rstrobe = 50,
341 .rhold = 0,
342 .ta = 20,
343};
344
David A. Griego733975a2009-09-18 14:15:18 -0700345static struct davinci_nand_pdata da830_evm_nand_pdata = {
346 .parts = da830_evm_nand_partitions,
347 .nr_parts = ARRAY_SIZE(da830_evm_nand_partitions),
348 .ecc_mode = NAND_ECC_HW,
349 .ecc_bits = 4,
Brian Norrisbb9ebd42011-05-31 16:31:23 -0700350 .bbt_options = NAND_BBT_USE_FLASH,
David A. Griego733975a2009-09-18 14:15:18 -0700351 .bbt_td = &da830_evm_nand_bbt_main_descr,
352 .bbt_md = &da830_evm_nand_bbt_mirror_descr,
Sudhakar Rajashekhara217f1362010-08-09 15:46:38 +0530353 .timing = &da830_evm_nandflash_timing,
David A. Griego733975a2009-09-18 14:15:18 -0700354};
355
356static struct resource da830_evm_nand_resources[] = {
357 [0] = { /* First memory resource is NAND I/O window */
Sergei Shtylyov002cb2d2010-04-16 21:29:20 +0400358 .start = DA8XX_AEMIF_CS3_BASE,
359 .end = DA8XX_AEMIF_CS3_BASE + PAGE_SIZE - 1,
David A. Griego733975a2009-09-18 14:15:18 -0700360 .flags = IORESOURCE_MEM,
361 },
362 [1] = { /* Second memory resource is AEMIF control registers */
Sergei Shtylyov002cb2d2010-04-16 21:29:20 +0400363 .start = DA8XX_AEMIF_CTL_BASE,
364 .end = DA8XX_AEMIF_CTL_BASE + SZ_32K - 1,
David A. Griego733975a2009-09-18 14:15:18 -0700365 .flags = IORESOURCE_MEM,
366 },
367};
368
369static struct platform_device da830_evm_nand_device = {
370 .name = "davinci_nand",
371 .id = 1,
372 .dev = {
373 .platform_data = &da830_evm_nand_pdata,
374 },
375 .num_resources = ARRAY_SIZE(da830_evm_nand_resources),
376 .resource = da830_evm_nand_resources,
377};
Sekhar Noria0433ac2009-10-09 20:55:43 +0530378
Sekhar Nori77316f02009-10-21 21:18:20 +0530379static inline void da830_evm_init_nand(int mux_mode)
Sekhar Noria0433ac2009-10-09 20:55:43 +0530380{
381 int ret;
382
Sekhar Norib5ebe4e2009-10-21 21:18:21 +0530383 if (HAS_MMC) {
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700384 pr_warn("WARNING: both MMC/SD and NAND are enabled, but they share AEMIF pins\n"
385 "\tDisable MMC/SD for NAND support\n");
Sekhar Norib5ebe4e2009-10-21 21:18:21 +0530386 return;
387 }
388
Cyril Chemparathy3821d102010-03-25 17:43:48 -0400389 ret = davinci_cfg_reg_list(da830_evm_emif25_pins);
Sekhar Noria0433ac2009-10-09 20:55:43 +0530390 if (ret)
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700391 pr_warn("%s: emif25 mux setup failed: %d\n", __func__, ret);
Sekhar Noria0433ac2009-10-09 20:55:43 +0530392
393 ret = platform_device_register(&da830_evm_nand_device);
394 if (ret)
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700395 pr_warn("%s: NAND device not registered\n", __func__);
Sekhar Nori77316f02009-10-21 21:18:20 +0530396
Ivan Khoronzhuk67f51852014-01-30 13:03:40 +0200397 if (davinci_aemif_setup(&da830_evm_nand_device))
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700398 pr_warn("%s: Cannot configure AEMIF\n", __func__);
Ivan Khoronzhuk67f51852014-01-30 13:03:40 +0200399
Sekhar Nori77316f02009-10-21 21:18:20 +0530400 gpio_direction_output(mux_mode, 1);
Sekhar Noria0433ac2009-10-09 20:55:43 +0530401}
402#else
Sekhar Nori77316f02009-10-21 21:18:20 +0530403static inline void da830_evm_init_nand(int mux_mode) { }
David A. Griego733975a2009-09-18 14:15:18 -0700404#endif
405
Sekhar Noria0433ac2009-10-09 20:55:43 +0530406#ifdef CONFIG_DA830_UI_LCD
Sekhar Nori77316f02009-10-21 21:18:20 +0530407static inline void da830_evm_init_lcdc(int mux_mode)
Sekhar Noria0433ac2009-10-09 20:55:43 +0530408{
409 int ret;
410
Cyril Chemparathy3821d102010-03-25 17:43:48 -0400411 ret = davinci_cfg_reg_list(da830_lcdcntl_pins);
Sekhar Noria0433ac2009-10-09 20:55:43 +0530412 if (ret)
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700413 pr_warn("%s: lcdcntl mux setup failed: %d\n", __func__, ret);
Sekhar Noria0433ac2009-10-09 20:55:43 +0530414
415 ret = da8xx_register_lcdc(&sharp_lcd035q3dg01_pdata);
416 if (ret)
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700417 pr_warn("%s: lcd setup failed: %d\n", __func__, ret);
Sekhar Nori77316f02009-10-21 21:18:20 +0530418
419 gpio_direction_output(mux_mode, 0);
Sekhar Noria0433ac2009-10-09 20:55:43 +0530420}
421#else
Sekhar Nori77316f02009-10-21 21:18:20 +0530422static inline void da830_evm_init_lcdc(int mux_mode) { }
Sekhar Noria0433ac2009-10-09 20:55:43 +0530423#endif
David A. Griego733975a2009-09-18 14:15:18 -0700424
Sekhar Nori77316f02009-10-21 21:18:20 +0530425static struct at24_platform_data da830_evm_i2c_eeprom_info = {
426 .byte_len = SZ_256K / 8,
427 .page_size = 64,
428 .flags = AT24_FLAG_ADDR16,
429 .setup = davinci_get_mac_addr,
430 .context = (void *)0x7f00,
431};
432
Sudhakar Rajashekhara1ef203c2009-11-03 11:51:19 +0530433static int __init da830_evm_ui_expander_setup(struct i2c_client *client,
434 int gpio, unsigned ngpio, void *context)
Sekhar Nori77316f02009-10-21 21:18:20 +0530435{
436 gpio_request(gpio + 6, "UI MUX_MODE");
437
Sekhar Norib5ebe4e2009-10-21 21:18:21 +0530438 /* Drive mux mode low to match the default without UI card */
439 gpio_direction_output(gpio + 6, 0);
440
Sekhar Nori77316f02009-10-21 21:18:20 +0530441 da830_evm_init_lcdc(gpio + 6);
442
443 da830_evm_init_nand(gpio + 6);
444
445 return 0;
446}
447
448static int da830_evm_ui_expander_teardown(struct i2c_client *client, int gpio,
449 unsigned ngpio, void *context)
450{
451 gpio_free(gpio + 6);
452 return 0;
453}
454
Sudhakar Rajashekhara1ef203c2009-11-03 11:51:19 +0530455static struct pcf857x_platform_data __initdata da830_evm_ui_expander_info = {
Sekhar Nori77316f02009-10-21 21:18:20 +0530456 .gpio_base = DAVINCI_N_GPIO,
457 .setup = da830_evm_ui_expander_setup,
458 .teardown = da830_evm_ui_expander_teardown,
459};
460
461static struct i2c_board_info __initdata da830_evm_i2c_devices[] = {
462 {
463 I2C_BOARD_INFO("24c256", 0x50),
464 .platform_data = &da830_evm_i2c_eeprom_info,
465 },
466 {
467 I2C_BOARD_INFO("tlv320aic3x", 0x18),
468 },
469 {
470 I2C_BOARD_INFO("pcf8574", 0x3f),
471 .platform_data = &da830_evm_ui_expander_info,
472 },
473};
474
475static struct davinci_i2c_platform_data da830_evm_i2c_0_pdata = {
476 .bus_freq = 100, /* kHz */
477 .bus_delay = 0, /* usec */
478};
479
Rajashekhara, Sudhakara941c502010-06-29 11:35:14 +0530480/*
481 * The following EDMA channels/slots are not being used by drivers (for
482 * example: Timer, GPIO, UART events etc) on da830/omap-l137 EVM, hence
483 * they are being reserved for codecs on the DSP side.
484 */
485static const s16 da830_dma_rsv_chans[][2] = {
486 /* (offset, number) */
487 { 8, 2},
488 {12, 2},
489 {24, 4},
490 {30, 2},
491 {-1, -1}
492};
493
494static const s16 da830_dma_rsv_slots[][2] = {
495 /* (offset, number) */
496 { 8, 2},
497 {12, 2},
498 {24, 4},
499 {30, 26},
500 {-1, -1}
501};
502
503static struct edma_rsv_info da830_edma_rsv[] = {
504 {
505 .rsv_chans = da830_dma_rsv_chans,
506 .rsv_slots = da830_dma_rsv_slots,
507 },
508};
509
Sekhar Nori16a3c832011-02-24 10:53:27 +0530510static struct mtd_partition da830evm_spiflash_part[] = {
511 [0] = {
512 .name = "DSP-UBL",
513 .offset = 0,
514 .size = SZ_8K,
515 .mask_flags = MTD_WRITEABLE,
516 },
517 [1] = {
518 .name = "ARM-UBL",
519 .offset = MTDPART_OFS_APPEND,
520 .size = SZ_16K + SZ_8K,
521 .mask_flags = MTD_WRITEABLE,
522 },
523 [2] = {
524 .name = "U-Boot",
525 .offset = MTDPART_OFS_APPEND,
526 .size = SZ_256K - SZ_32K,
527 .mask_flags = MTD_WRITEABLE,
528 },
529 [3] = {
530 .name = "U-Boot-Environment",
531 .offset = MTDPART_OFS_APPEND,
532 .size = SZ_16K,
533 .mask_flags = 0,
534 },
535 [4] = {
536 .name = "Kernel",
537 .offset = MTDPART_OFS_APPEND,
538 .size = MTDPART_SIZ_FULL,
539 .mask_flags = 0,
540 },
541};
542
543static struct flash_platform_data da830evm_spiflash_data = {
544 .name = "m25p80",
545 .parts = da830evm_spiflash_part,
546 .nr_parts = ARRAY_SIZE(da830evm_spiflash_part),
547 .type = "w25x32",
548};
549
550static struct davinci_spi_config da830evm_spiflash_cfg = {
551 .io_type = SPI_IO_TYPE_DMA,
552 .c2tdelay = 8,
553 .t2cdelay = 8,
554};
555
556static struct spi_board_info da830evm_spi_info[] = {
557 {
558 .modalias = "m25p80",
559 .platform_data = &da830evm_spiflash_data,
560 .controller_data = &da830evm_spiflash_cfg,
561 .mode = SPI_MODE_0,
562 .max_speed_hz = 30000000,
563 .bus_num = 0,
564 .chip_select = 0,
565 },
566};
567
Mark A. Greer85937902009-06-03 18:41:53 -0700568static __init void da830_evm_init(void)
569{
570 struct davinci_soc_info *soc_info = &davinci_soc_info;
571 int ret;
572
David Lechner0fcd5412016-10-25 22:06:48 -0500573 ret = da8xx_register_cfgchip();
574 if (ret)
575 pr_warn("%s: CFGCHIP registration failed: %d\n", __func__, ret);
576
Philip Avinashb856671e2013-08-18 10:49:01 +0530577 ret = da830_register_gpio();
578 if (ret)
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700579 pr_warn("%s: GPIO init failed: %d\n", __func__, ret);
Philip Avinashb856671e2013-08-18 10:49:01 +0530580
Rajashekhara, Sudhakara941c502010-06-29 11:35:14 +0530581 ret = da830_register_edma(da830_edma_rsv);
Mark A. Greer85937902009-06-03 18:41:53 -0700582 if (ret)
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700583 pr_warn("%s: edma registration failed: %d\n", __func__, ret);
Mark A. Greer85937902009-06-03 18:41:53 -0700584
Cyril Chemparathy3821d102010-03-25 17:43:48 -0400585 ret = davinci_cfg_reg_list(da830_i2c0_pins);
Mark A. Greer85937902009-06-03 18:41:53 -0700586 if (ret)
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700587 pr_warn("%s: i2c0 mux setup failed: %d\n", __func__, ret);
Mark A. Greer85937902009-06-03 18:41:53 -0700588
589 ret = da8xx_register_i2c(0, &da830_evm_i2c_0_pdata);
590 if (ret)
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700591 pr_warn("%s: i2c0 registration failed: %d\n", __func__, ret);
Mark A. Greer85937902009-06-03 18:41:53 -0700592
Sergei Shtylyov0e9a3dd2009-09-25 23:28:13 +0400593 da830_evm_usb_init();
594
Mark A. Greer85937902009-06-03 18:41:53 -0700595 soc_info->emac_pdata->rmii_en = 1;
Cyril Chemparathy782f2d72010-09-15 10:11:25 -0400596 soc_info->emac_pdata->phy_id = DA830_EVM_PHY_ID;
Mark A. Greer85937902009-06-03 18:41:53 -0700597
Cyril Chemparathy3821d102010-03-25 17:43:48 -0400598 ret = davinci_cfg_reg_list(da830_cpgmac_pins);
Mark A. Greer85937902009-06-03 18:41:53 -0700599 if (ret)
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700600 pr_warn("%s: cpgmac mux setup failed: %d\n", __func__, ret);
Mark A. Greer85937902009-06-03 18:41:53 -0700601
602 ret = da8xx_register_emac();
603 if (ret)
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700604 pr_warn("%s: emac registration failed: %d\n", __func__, ret);
Mark A. Greer85937902009-06-03 18:41:53 -0700605
606 ret = da8xx_register_watchdog();
607 if (ret)
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700608 pr_warn("%s: watchdog registration failed: %d\n",
609 __func__, ret);
Mark A. Greer85937902009-06-03 18:41:53 -0700610
Manjunathappa, Prakashfcf71572013-06-19 14:45:42 +0530611 davinci_serial_init(da8xx_serial_device);
Mark A. Greer85937902009-06-03 18:41:53 -0700612 i2c_register_board_info(1, da830_evm_i2c_devices,
613 ARRAY_SIZE(da830_evm_i2c_devices));
Chaithrika U Se33ef5e2009-08-11 17:01:59 -0400614
Cyril Chemparathy3821d102010-03-25 17:43:48 -0400615 ret = davinci_cfg_reg_list(da830_evm_mcasp1_pins);
Chaithrika U Se33ef5e2009-08-11 17:01:59 -0400616 if (ret)
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700617 pr_warn("%s: mcasp1 mux setup failed: %d\n", __func__, ret);
Chaithrika U Se33ef5e2009-08-11 17:01:59 -0400618
Mark A. Greerb8864aa2009-08-28 15:05:02 -0700619 da8xx_register_mcasp(1, &da830_evm_snd_data);
David A. Griego2eb30c82009-09-15 18:10:20 -0700620
621 da830_evm_init_mmc();
Steve Chen13e1f042009-09-15 18:15:06 -0700622
Mark A. Greerc51df702009-09-15 18:15:54 -0700623 ret = da8xx_register_rtc();
624 if (ret)
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700625 pr_warn("%s: rtc setup failed: %d\n", __func__, ret);
Sekhar Nori16a3c832011-02-24 10:53:27 +0530626
Vivien Didelot02736122012-09-10 20:29:13 -0400627 ret = spi_register_board_info(da830evm_spi_info,
628 ARRAY_SIZE(da830evm_spi_info));
629 if (ret)
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700630 pr_warn("%s: spi info registration failed: %d\n",
631 __func__, ret);
Vivien Didelot02736122012-09-10 20:29:13 -0400632
633 ret = da8xx_register_spi_bus(0, ARRAY_SIZE(da830evm_spi_info));
Sekhar Nori16a3c832011-02-24 10:53:27 +0530634 if (ret)
Joe Perchesa7ca2bc2014-10-31 17:51:51 -0700635 pr_warn("%s: spi 0 registration failed: %d\n", __func__, ret);
Axel Haslam40a17ab2016-10-26 21:41:55 +0200636
637 regulator_has_full_constraints();
Mark A. Greer85937902009-06-03 18:41:53 -0700638}
639
640#ifdef CONFIG_SERIAL_8250_CONSOLE
641static int __init da830_evm_console_init(void)
642{
Michael Williamson1aa5f2a2010-08-31 14:30:15 -0400643 if (!machine_is_davinci_da830_evm())
644 return 0;
645
Mark A. Greer85937902009-06-03 18:41:53 -0700646 return add_preferred_console("ttyS", 2, "115200");
647}
648console_initcall(da830_evm_console_init);
649#endif
650
Mark A. Greer85937902009-06-03 18:41:53 -0700651static void __init da830_evm_map_io(void)
652{
653 da830_init();
654}
655
Sekhar Nori48ea89e2010-07-01 19:00:50 +0530656MACHINE_START(DAVINCI_DA830_EVM, "DaVinci DA830/OMAP-L137/AM17x EVM")
Nicolas Pitree7e56012011-07-05 22:38:11 -0400657 .atag_offset = 0x100,
Mark A. Greer85937902009-06-03 18:41:53 -0700658 .map_io = da830_evm_map_io,
Cyril Chemparathybd808942010-05-07 17:06:37 -0400659 .init_irq = cp_intc_init,
Stephen Warren6bb27d72012-11-08 12:40:59 -0700660 .init_time = davinci_timer_init,
Mark A. Greer85937902009-06-03 18:41:53 -0700661 .init_machine = da830_evm_init,
Shawn Guo3aa3e842012-04-26 09:45:39 +0800662 .init_late = davinci_init_late,
Nicolas Pitref68deab2011-07-05 22:28:08 -0400663 .dma_zone_size = SZ_128M,
Sekhar Noric6121dd2011-12-05 11:29:46 +0100664 .restart = da8xx_restart,
Mark A. Greer85937902009-06-03 18:41:53 -0700665MACHINE_END