board-omap4panda.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740
  1. /*
  2. * Board support file for OMAP4430 based PandaBoard.
  3. *
  4. * Copyright (C) 2010 Texas Instruments
  5. *
  6. * Author: David Anders <x0132446@ti.com>
  7. *
  8. * Based on mach-omap2/board-4430sdp.c
  9. *
  10. * Author: Santosh Shilimkar <santosh.shilimkar@ti.com>
  11. *
  12. * Based on mach-omap2/board-3430sdp.c
  13. *
  14. * This program is free software; you can redistribute it and/or modify
  15. * it under the terms of the GNU General Public License version 2 as
  16. * published by the Free Software Foundation.
  17. */
  18. #include <linux/kernel.h>
  19. #include <linux/init.h>
  20. #include <linux/platform_device.h>
  21. #include <linux/clk.h>
  22. #include <linux/io.h>
  23. #include <linux/leds.h>
  24. #include <linux/gpio.h>
  25. #include <linux/usb/otg.h>
  26. #include <linux/i2c/twl.h>
  27. #include <linux/regulator/machine.h>
  28. #include <linux/regulator/fixed.h>
  29. #include <linux/wl12xx.h>
  30. #include <mach/hardware.h>
  31. #include <mach/omap4-common.h>
  32. #include <asm/mach-types.h>
  33. #include <asm/mach/arch.h>
  34. #include <asm/mach/map.h>
  35. #include <plat/display.h>
  36. #include <plat/board.h>
  37. #include <plat/common.h>
  38. #include <plat/usb.h>
  39. #include <plat/mmc.h>
  40. #include <plat/panel-generic-dpi.h>
  41. #include "timer-gp.h"
  42. #include "hsmmc.h"
  43. #include "control.h"
  44. #include "mux.h"
  45. #include "common-board-devices.h"
  46. #define GPIO_HUB_POWER 1
  47. #define GPIO_HUB_NRESET 62
  48. #define GPIO_WIFI_PMENA 43
  49. #define GPIO_WIFI_IRQ 53
  50. #define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */
  51. #define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */
  52. /* wl127x BT, FM, GPS connectivity chip */
  53. static int wl1271_gpios[] = {46, -1, -1};
  54. static struct platform_device wl1271_device = {
  55. .name = "kim",
  56. .id = -1,
  57. .dev = {
  58. .platform_data = &wl1271_gpios,
  59. },
  60. };
  61. static struct gpio_led gpio_leds[] = {
  62. {
  63. .name = "pandaboard::status1",
  64. .default_trigger = "heartbeat",
  65. .gpio = 7,
  66. },
  67. {
  68. .name = "pandaboard::status2",
  69. .default_trigger = "mmc0",
  70. .gpio = 8,
  71. },
  72. };
  73. static struct gpio_led_platform_data gpio_led_info = {
  74. .leds = gpio_leds,
  75. .num_leds = ARRAY_SIZE(gpio_leds),
  76. };
  77. static struct platform_device leds_gpio = {
  78. .name = "leds-gpio",
  79. .id = -1,
  80. .dev = {
  81. .platform_data = &gpio_led_info,
  82. },
  83. };
  84. static struct platform_device *panda_devices[] __initdata = {
  85. &leds_gpio,
  86. &wl1271_device,
  87. };
  88. static void __init omap4_panda_init_early(void)
  89. {
  90. omap2_init_common_infrastructure();
  91. omap2_init_common_devices(NULL, NULL);
  92. }
  93. static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
  94. .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
  95. .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED,
  96. .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
  97. .phy_reset = false,
  98. .reset_gpio_port[0] = -EINVAL,
  99. .reset_gpio_port[1] = -EINVAL,
  100. .reset_gpio_port[2] = -EINVAL
  101. };
  102. static void __init omap4_ehci_init(void)
  103. {
  104. int ret;
  105. struct clk *phy_ref_clk;
  106. /* FREF_CLK3 provides the 19.2 MHz reference clock to the PHY */
  107. phy_ref_clk = clk_get(NULL, "auxclk3_ck");
  108. if (IS_ERR(phy_ref_clk)) {
  109. pr_err("Cannot request auxclk3\n");
  110. goto error1;
  111. }
  112. clk_set_rate(phy_ref_clk, 19200000);
  113. clk_enable(phy_ref_clk);
  114. /* disable the power to the usb hub prior to init */
  115. ret = gpio_request(GPIO_HUB_POWER, "hub_power");
  116. if (ret) {
  117. pr_err("Cannot request GPIO %d\n", GPIO_HUB_POWER);
  118. goto error1;
  119. }
  120. gpio_export(GPIO_HUB_POWER, 0);
  121. gpio_direction_output(GPIO_HUB_POWER, 0);
  122. gpio_set_value(GPIO_HUB_POWER, 0);
  123. /* reset phy+hub */
  124. ret = gpio_request(GPIO_HUB_NRESET, "hub_nreset");
  125. if (ret) {
  126. pr_err("Cannot request GPIO %d\n", GPIO_HUB_NRESET);
  127. goto error2;
  128. }
  129. gpio_export(GPIO_HUB_NRESET, 0);
  130. gpio_direction_output(GPIO_HUB_NRESET, 0);
  131. gpio_set_value(GPIO_HUB_NRESET, 0);
  132. gpio_set_value(GPIO_HUB_NRESET, 1);
  133. usbhs_init(&usbhs_bdata);
  134. /* enable power to hub */
  135. gpio_set_value(GPIO_HUB_POWER, 1);
  136. return;
  137. error2:
  138. gpio_free(GPIO_HUB_POWER);
  139. error1:
  140. pr_err("Unable to initialize EHCI power/reset\n");
  141. return;
  142. }
  143. static struct omap_musb_board_data musb_board_data = {
  144. .interface_type = MUSB_INTERFACE_UTMI,
  145. .mode = MUSB_OTG,
  146. .power = 100,
  147. };
  148. static struct twl4030_usb_data omap4_usbphy_data = {
  149. .phy_init = omap4430_phy_init,
  150. .phy_exit = omap4430_phy_exit,
  151. .phy_power = omap4430_phy_power,
  152. .phy_set_clock = omap4430_phy_set_clk,
  153. .phy_suspend = omap4430_phy_suspend,
  154. };
  155. static struct omap2_hsmmc_info mmc[] = {
  156. {
  157. .mmc = 1,
  158. .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
  159. .gpio_wp = -EINVAL,
  160. .gpio_cd = -EINVAL,
  161. },
  162. {
  163. .name = "wl1271",
  164. .mmc = 5,
  165. .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD,
  166. .gpio_wp = -EINVAL,
  167. .gpio_cd = -EINVAL,
  168. .ocr_mask = MMC_VDD_165_195,
  169. .nonremovable = true,
  170. },
  171. {} /* Terminator */
  172. };
  173. static struct regulator_consumer_supply omap4_panda_vmmc_supply[] = {
  174. {
  175. .supply = "vmmc",
  176. .dev_name = "omap_hsmmc.0",
  177. },
  178. };
  179. static struct regulator_consumer_supply omap4_panda_vmmc5_supply = {
  180. .supply = "vmmc",
  181. .dev_name = "omap_hsmmc.4",
  182. };
  183. static struct regulator_init_data panda_vmmc5 = {
  184. .constraints = {
  185. .valid_ops_mask = REGULATOR_CHANGE_STATUS,
  186. },
  187. .num_consumer_supplies = 1,
  188. .consumer_supplies = &omap4_panda_vmmc5_supply,
  189. };
  190. static struct fixed_voltage_config panda_vwlan = {
  191. .supply_name = "vwl1271",
  192. .microvolts = 1800000, /* 1.8V */
  193. .gpio = GPIO_WIFI_PMENA,
  194. .startup_delay = 70000, /* 70msec */
  195. .enable_high = 1,
  196. .enabled_at_boot = 0,
  197. .init_data = &panda_vmmc5,
  198. };
  199. static struct platform_device omap_vwlan_device = {
  200. .name = "reg-fixed-voltage",
  201. .id = 1,
  202. .dev = {
  203. .platform_data = &panda_vwlan,
  204. },
  205. };
  206. struct wl12xx_platform_data omap_panda_wlan_data __initdata = {
  207. .irq = OMAP_GPIO_IRQ(GPIO_WIFI_IRQ),
  208. /* PANDA ref clock is 38.4 MHz */
  209. .board_ref_clock = 2,
  210. };
  211. static int omap4_twl6030_hsmmc_late_init(struct device *dev)
  212. {
  213. int ret = 0;
  214. struct platform_device *pdev = container_of(dev,
  215. struct platform_device, dev);
  216. struct omap_mmc_platform_data *pdata = dev->platform_data;
  217. if (!pdata) {
  218. dev_err(dev, "%s: NULL platform data\n", __func__);
  219. return -EINVAL;
  220. }
  221. /* Setting MMC1 Card detect Irq */
  222. if (pdev->id == 0) {
  223. ret = twl6030_mmc_card_detect_config();
  224. if (ret)
  225. dev_err(dev, "%s: Error card detect config(%d)\n",
  226. __func__, ret);
  227. else
  228. pdata->slots[0].card_detect = twl6030_mmc_card_detect;
  229. }
  230. return ret;
  231. }
  232. static __init void omap4_twl6030_hsmmc_set_late_init(struct device *dev)
  233. {
  234. struct omap_mmc_platform_data *pdata;
  235. /* dev can be null if CONFIG_MMC_OMAP_HS is not set */
  236. if (!dev) {
  237. pr_err("Failed omap4_twl6030_hsmmc_set_late_init\n");
  238. return;
  239. }
  240. pdata = dev->platform_data;
  241. pdata->init = omap4_twl6030_hsmmc_late_init;
  242. }
  243. static int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers)
  244. {
  245. struct omap2_hsmmc_info *c;
  246. omap2_hsmmc_init(controllers);
  247. for (c = controllers; c->mmc; c++)
  248. omap4_twl6030_hsmmc_set_late_init(c->dev);
  249. return 0;
  250. }
  251. static struct regulator_init_data omap4_panda_vaux2 = {
  252. .constraints = {
  253. .min_uV = 1200000,
  254. .max_uV = 2800000,
  255. .apply_uV = true,
  256. .valid_modes_mask = REGULATOR_MODE_NORMAL
  257. | REGULATOR_MODE_STANDBY,
  258. .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
  259. | REGULATOR_CHANGE_MODE
  260. | REGULATOR_CHANGE_STATUS,
  261. },
  262. };
  263. static struct regulator_init_data omap4_panda_vaux3 = {
  264. .constraints = {
  265. .min_uV = 1000000,
  266. .max_uV = 3000000,
  267. .apply_uV = true,
  268. .valid_modes_mask = REGULATOR_MODE_NORMAL
  269. | REGULATOR_MODE_STANDBY,
  270. .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
  271. | REGULATOR_CHANGE_MODE
  272. | REGULATOR_CHANGE_STATUS,
  273. },
  274. };
  275. /* VMMC1 for MMC1 card */
  276. static struct regulator_init_data omap4_panda_vmmc = {
  277. .constraints = {
  278. .min_uV = 1200000,
  279. .max_uV = 3000000,
  280. .apply_uV = true,
  281. .valid_modes_mask = REGULATOR_MODE_NORMAL
  282. | REGULATOR_MODE_STANDBY,
  283. .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
  284. | REGULATOR_CHANGE_MODE
  285. | REGULATOR_CHANGE_STATUS,
  286. },
  287. .num_consumer_supplies = 1,
  288. .consumer_supplies = omap4_panda_vmmc_supply,
  289. };
  290. static struct regulator_init_data omap4_panda_vpp = {
  291. .constraints = {
  292. .min_uV = 1800000,
  293. .max_uV = 2500000,
  294. .apply_uV = true,
  295. .valid_modes_mask = REGULATOR_MODE_NORMAL
  296. | REGULATOR_MODE_STANDBY,
  297. .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
  298. | REGULATOR_CHANGE_MODE
  299. | REGULATOR_CHANGE_STATUS,
  300. },
  301. };
  302. static struct regulator_init_data omap4_panda_vana = {
  303. .constraints = {
  304. .min_uV = 2100000,
  305. .max_uV = 2100000,
  306. .valid_modes_mask = REGULATOR_MODE_NORMAL
  307. | REGULATOR_MODE_STANDBY,
  308. .valid_ops_mask = REGULATOR_CHANGE_MODE
  309. | REGULATOR_CHANGE_STATUS,
  310. },
  311. };
  312. static struct regulator_init_data omap4_panda_vcxio = {
  313. .constraints = {
  314. .min_uV = 1800000,
  315. .max_uV = 1800000,
  316. .valid_modes_mask = REGULATOR_MODE_NORMAL
  317. | REGULATOR_MODE_STANDBY,
  318. .valid_ops_mask = REGULATOR_CHANGE_MODE
  319. | REGULATOR_CHANGE_STATUS,
  320. },
  321. };
  322. static struct regulator_init_data omap4_panda_vdac = {
  323. .constraints = {
  324. .min_uV = 1800000,
  325. .max_uV = 1800000,
  326. .valid_modes_mask = REGULATOR_MODE_NORMAL
  327. | REGULATOR_MODE_STANDBY,
  328. .valid_ops_mask = REGULATOR_CHANGE_MODE
  329. | REGULATOR_CHANGE_STATUS,
  330. },
  331. };
  332. static struct regulator_init_data omap4_panda_vusb = {
  333. .constraints = {
  334. .min_uV = 3300000,
  335. .max_uV = 3300000,
  336. .apply_uV = true,
  337. .valid_modes_mask = REGULATOR_MODE_NORMAL
  338. | REGULATOR_MODE_STANDBY,
  339. .valid_ops_mask = REGULATOR_CHANGE_MODE
  340. | REGULATOR_CHANGE_STATUS,
  341. },
  342. };
  343. static struct regulator_init_data omap4_panda_clk32kg = {
  344. .constraints = {
  345. .valid_ops_mask = REGULATOR_CHANGE_STATUS,
  346. },
  347. };
  348. static struct twl4030_platform_data omap4_panda_twldata = {
  349. .irq_base = TWL6030_IRQ_BASE,
  350. .irq_end = TWL6030_IRQ_END,
  351. /* Regulators */
  352. .vmmc = &omap4_panda_vmmc,
  353. .vpp = &omap4_panda_vpp,
  354. .vana = &omap4_panda_vana,
  355. .vcxio = &omap4_panda_vcxio,
  356. .vdac = &omap4_panda_vdac,
  357. .vusb = &omap4_panda_vusb,
  358. .vaux2 = &omap4_panda_vaux2,
  359. .vaux3 = &omap4_panda_vaux3,
  360. .clk32kg = &omap4_panda_clk32kg,
  361. .usb = &omap4_usbphy_data,
  362. };
  363. /*
  364. * Display monitor features are burnt in their EEPROM as EDID data. The EEPROM
  365. * is connected as I2C slave device, and can be accessed at address 0x50
  366. */
  367. static struct i2c_board_info __initdata panda_i2c_eeprom[] = {
  368. {
  369. I2C_BOARD_INFO("eeprom", 0x50),
  370. },
  371. };
  372. static int __init omap4_panda_i2c_init(void)
  373. {
  374. omap4_pmic_init("twl6030", &omap4_panda_twldata);
  375. omap_register_i2c_bus(2, 400, NULL, 0);
  376. /*
  377. * Bus 3 is attached to the DVI port where devices like the pico DLP
  378. * projector don't work reliably with 400kHz
  379. */
  380. omap_register_i2c_bus(3, 100, panda_i2c_eeprom,
  381. ARRAY_SIZE(panda_i2c_eeprom));
  382. omap_register_i2c_bus(4, 400, NULL, 0);
  383. return 0;
  384. }
  385. #ifdef CONFIG_OMAP_MUX
  386. static struct omap_board_mux board_mux[] __initdata = {
  387. /* WLAN IRQ - GPIO 53 */
  388. OMAP4_MUX(GPMC_NCS3, OMAP_MUX_MODE3 | OMAP_PIN_INPUT),
  389. /* WLAN POWER ENABLE - GPIO 43 */
  390. OMAP4_MUX(GPMC_A19, OMAP_MUX_MODE3 | OMAP_PIN_OUTPUT),
  391. /* WLAN SDIO: MMC5 CMD */
  392. OMAP4_MUX(SDMMC5_CMD, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),
  393. /* WLAN SDIO: MMC5 CLK */
  394. OMAP4_MUX(SDMMC5_CLK, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),
  395. /* WLAN SDIO: MMC5 DAT[0-3] */
  396. OMAP4_MUX(SDMMC5_DAT0, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),
  397. OMAP4_MUX(SDMMC5_DAT1, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),
  398. OMAP4_MUX(SDMMC5_DAT2, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),
  399. OMAP4_MUX(SDMMC5_DAT3, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP),
  400. /* gpio 0 - TFP410 PD */
  401. OMAP4_MUX(KPD_COL1, OMAP_PIN_OUTPUT | OMAP_MUX_MODE3),
  402. /* dispc2_data23 */
  403. OMAP4_MUX(USBB2_ULPITLL_STP, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  404. /* dispc2_data22 */
  405. OMAP4_MUX(USBB2_ULPITLL_DIR, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  406. /* dispc2_data21 */
  407. OMAP4_MUX(USBB2_ULPITLL_NXT, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  408. /* dispc2_data20 */
  409. OMAP4_MUX(USBB2_ULPITLL_DAT0, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  410. /* dispc2_data19 */
  411. OMAP4_MUX(USBB2_ULPITLL_DAT1, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  412. /* dispc2_data18 */
  413. OMAP4_MUX(USBB2_ULPITLL_DAT2, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  414. /* dispc2_data15 */
  415. OMAP4_MUX(USBB2_ULPITLL_DAT3, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  416. /* dispc2_data14 */
  417. OMAP4_MUX(USBB2_ULPITLL_DAT4, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  418. /* dispc2_data13 */
  419. OMAP4_MUX(USBB2_ULPITLL_DAT5, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  420. /* dispc2_data12 */
  421. OMAP4_MUX(USBB2_ULPITLL_DAT6, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  422. /* dispc2_data11 */
  423. OMAP4_MUX(USBB2_ULPITLL_DAT7, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  424. /* dispc2_data10 */
  425. OMAP4_MUX(DPM_EMU3, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  426. /* dispc2_data9 */
  427. OMAP4_MUX(DPM_EMU4, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  428. /* dispc2_data16 */
  429. OMAP4_MUX(DPM_EMU5, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  430. /* dispc2_data17 */
  431. OMAP4_MUX(DPM_EMU6, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  432. /* dispc2_hsync */
  433. OMAP4_MUX(DPM_EMU7, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  434. /* dispc2_pclk */
  435. OMAP4_MUX(DPM_EMU8, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  436. /* dispc2_vsync */
  437. OMAP4_MUX(DPM_EMU9, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  438. /* dispc2_de */
  439. OMAP4_MUX(DPM_EMU10, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  440. /* dispc2_data8 */
  441. OMAP4_MUX(DPM_EMU11, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  442. /* dispc2_data7 */
  443. OMAP4_MUX(DPM_EMU12, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  444. /* dispc2_data6 */
  445. OMAP4_MUX(DPM_EMU13, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  446. /* dispc2_data5 */
  447. OMAP4_MUX(DPM_EMU14, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  448. /* dispc2_data4 */
  449. OMAP4_MUX(DPM_EMU15, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  450. /* dispc2_data3 */
  451. OMAP4_MUX(DPM_EMU16, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  452. /* dispc2_data2 */
  453. OMAP4_MUX(DPM_EMU17, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  454. /* dispc2_data1 */
  455. OMAP4_MUX(DPM_EMU18, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  456. /* dispc2_data0 */
  457. OMAP4_MUX(DPM_EMU19, OMAP_PIN_OUTPUT | OMAP_MUX_MODE5),
  458. { .reg_offset = OMAP_MUX_TERMINATOR },
  459. };
  460. static struct omap_device_pad serial2_pads[] __initdata = {
  461. OMAP_MUX_STATIC("uart2_cts.uart2_cts",
  462. OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
  463. OMAP_MUX_STATIC("uart2_rts.uart2_rts",
  464. OMAP_PIN_OUTPUT | OMAP_MUX_MODE0),
  465. OMAP_MUX_STATIC("uart2_rx.uart2_rx",
  466. OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
  467. OMAP_MUX_STATIC("uart2_tx.uart2_tx",
  468. OMAP_PIN_OUTPUT | OMAP_MUX_MODE0),
  469. };
  470. static struct omap_device_pad serial3_pads[] __initdata = {
  471. OMAP_MUX_STATIC("uart3_cts_rctx.uart3_cts_rctx",
  472. OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
  473. OMAP_MUX_STATIC("uart3_rts_sd.uart3_rts_sd",
  474. OMAP_PIN_OUTPUT | OMAP_MUX_MODE0),
  475. OMAP_MUX_STATIC("uart3_rx_irrx.uart3_rx_irrx",
  476. OMAP_PIN_INPUT | OMAP_MUX_MODE0),
  477. OMAP_MUX_STATIC("uart3_tx_irtx.uart3_tx_irtx",
  478. OMAP_PIN_OUTPUT | OMAP_MUX_MODE0),
  479. };
  480. static struct omap_device_pad serial4_pads[] __initdata = {
  481. OMAP_MUX_STATIC("uart4_rx.uart4_rx",
  482. OMAP_PIN_INPUT | OMAP_MUX_MODE0),
  483. OMAP_MUX_STATIC("uart4_tx.uart4_tx",
  484. OMAP_PIN_OUTPUT | OMAP_MUX_MODE0),
  485. };
  486. static struct omap_board_data serial2_data = {
  487. .id = 1,
  488. .pads = serial2_pads,
  489. .pads_cnt = ARRAY_SIZE(serial2_pads),
  490. };
  491. static struct omap_board_data serial3_data = {
  492. .id = 2,
  493. .pads = serial3_pads,
  494. .pads_cnt = ARRAY_SIZE(serial3_pads),
  495. };
  496. static struct omap_board_data serial4_data = {
  497. .id = 3,
  498. .pads = serial4_pads,
  499. .pads_cnt = ARRAY_SIZE(serial4_pads),
  500. };
  501. static inline void board_serial_init(void)
  502. {
  503. struct omap_board_data bdata;
  504. bdata.flags = 0;
  505. bdata.pads = NULL;
  506. bdata.pads_cnt = 0;
  507. bdata.id = 0;
  508. /* pass dummy data for UART1 */
  509. omap_serial_init_port(&bdata);
  510. omap_serial_init_port(&serial2_data);
  511. omap_serial_init_port(&serial3_data);
  512. omap_serial_init_port(&serial4_data);
  513. }
  514. #else
  515. #define board_mux NULL
  516. static inline void board_serial_init(void)
  517. {
  518. omap_serial_init();
  519. }
  520. #endif
  521. /* Display DVI */
  522. #define PANDA_DVI_TFP410_POWER_DOWN_GPIO 0
  523. static int omap4_panda_enable_dvi(struct omap_dss_device *dssdev)
  524. {
  525. gpio_set_value(dssdev->reset_gpio, 1);
  526. return 0;
  527. }
  528. static void omap4_panda_disable_dvi(struct omap_dss_device *dssdev)
  529. {
  530. gpio_set_value(dssdev->reset_gpio, 0);
  531. }
  532. /* Using generic display panel */
  533. static struct panel_generic_dpi_data omap4_dvi_panel = {
  534. .name = "generic",
  535. .platform_enable = omap4_panda_enable_dvi,
  536. .platform_disable = omap4_panda_disable_dvi,
  537. };
  538. struct omap_dss_device omap4_panda_dvi_device = {
  539. .type = OMAP_DISPLAY_TYPE_DPI,
  540. .name = "dvi",
  541. .driver_name = "generic_dpi_panel",
  542. .data = &omap4_dvi_panel,
  543. .phy.dpi.data_lines = 24,
  544. .reset_gpio = PANDA_DVI_TFP410_POWER_DOWN_GPIO,
  545. .channel = OMAP_DSS_CHANNEL_LCD2,
  546. };
  547. int __init omap4_panda_dvi_init(void)
  548. {
  549. int r;
  550. /* Requesting TFP410 DVI GPIO and disabling it, at bootup */
  551. r = gpio_request_one(omap4_panda_dvi_device.reset_gpio,
  552. GPIOF_OUT_INIT_LOW, "DVI PD");
  553. if (r)
  554. pr_err("Failed to get DVI powerdown GPIO\n");
  555. return r;
  556. }
  557. static void omap4_panda_hdmi_mux_init(void)
  558. {
  559. /* PAD0_HDMI_HPD_PAD1_HDMI_CEC */
  560. omap_mux_init_signal("hdmi_hpd",
  561. OMAP_PIN_INPUT_PULLUP);
  562. omap_mux_init_signal("hdmi_cec",
  563. OMAP_PIN_INPUT_PULLUP);
  564. /* PAD0_HDMI_DDC_SCL_PAD1_HDMI_DDC_SDA */
  565. omap_mux_init_signal("hdmi_ddc_scl",
  566. OMAP_PIN_INPUT_PULLUP);
  567. omap_mux_init_signal("hdmi_ddc_sda",
  568. OMAP_PIN_INPUT_PULLUP);
  569. }
  570. static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev)
  571. {
  572. int status;
  573. status = gpio_request_one(HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH,
  574. "hdmi_gpio_hpd");
  575. if (status) {
  576. pr_err("Cannot request GPIO %d\n", HDMI_GPIO_HPD);
  577. return status;
  578. }
  579. status = gpio_request_one(HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH,
  580. "hdmi_gpio_ls_oe");
  581. if (status) {
  582. pr_err("Cannot request GPIO %d\n", HDMI_GPIO_LS_OE);
  583. goto error1;
  584. }
  585. return 0;
  586. error1:
  587. gpio_free(HDMI_GPIO_HPD);
  588. return status;
  589. }
  590. static void omap4_panda_panel_disable_hdmi(struct omap_dss_device *dssdev)
  591. {
  592. gpio_free(HDMI_GPIO_LS_OE);
  593. gpio_free(HDMI_GPIO_HPD);
  594. }
  595. static struct omap_dss_device omap4_panda_hdmi_device = {
  596. .name = "hdmi",
  597. .driver_name = "hdmi_panel",
  598. .type = OMAP_DISPLAY_TYPE_HDMI,
  599. .platform_enable = omap4_panda_panel_enable_hdmi,
  600. .platform_disable = omap4_panda_panel_disable_hdmi,
  601. .channel = OMAP_DSS_CHANNEL_DIGIT,
  602. };
  603. static struct omap_dss_device *omap4_panda_dss_devices[] = {
  604. &omap4_panda_dvi_device,
  605. &omap4_panda_hdmi_device,
  606. };
  607. static struct omap_dss_board_info omap4_panda_dss_data = {
  608. .num_devices = ARRAY_SIZE(omap4_panda_dss_devices),
  609. .devices = omap4_panda_dss_devices,
  610. .default_device = &omap4_panda_dvi_device,
  611. };
  612. void omap4_panda_display_init(void)
  613. {
  614. int r;
  615. r = omap4_panda_dvi_init();
  616. if (r)
  617. pr_err("error initializing panda DVI\n");
  618. omap4_panda_hdmi_mux_init();
  619. omap_display_init(&omap4_panda_dss_data);
  620. }
  621. static void __init omap4_panda_init(void)
  622. {
  623. int package = OMAP_PACKAGE_CBS;
  624. if (omap_rev() == OMAP4430_REV_ES1_0)
  625. package = OMAP_PACKAGE_CBL;
  626. omap4_mux_init(board_mux, package);
  627. if (wl12xx_set_platform_data(&omap_panda_wlan_data))
  628. pr_err("error setting wl12xx data\n");
  629. omap4_panda_i2c_init();
  630. platform_add_devices(panda_devices, ARRAY_SIZE(panda_devices));
  631. platform_device_register(&omap_vwlan_device);
  632. board_serial_init();
  633. omap4_twl6030_hsmmc_init(mmc);
  634. omap4_ehci_init();
  635. usb_musb_init(&musb_board_data);
  636. omap4_panda_display_init();
  637. }
  638. static void __init omap4_panda_map_io(void)
  639. {
  640. omap2_set_globals_443x();
  641. omap44xx_map_common_io();
  642. }
  643. MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board")
  644. /* Maintainer: David Anders - Texas Instruments Inc */
  645. .boot_params = 0x80000100,
  646. .reserve = omap_reserve,
  647. .map_io = omap4_panda_map_io,
  648. .init_early = omap4_panda_init_early,
  649. .init_irq = gic_init_irq,
  650. .init_machine = omap4_panda_init,
  651. .timer = &omap_timer,
  652. MACHINE_END