board-mityomapl138.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. /*
  2. * Critical Link MityOMAP-L138 SoM
  3. *
  4. * Copyright (C) 2010 Critical Link LLC - http://www.criticallink.com
  5. *
  6. * This file is licensed under the terms of the GNU General Public License
  7. * version 2. This program is licensed "as is" without any warranty of
  8. * any kind, whether express or implied.
  9. */
  10. #include <linux/kernel.h>
  11. #include <linux/init.h>
  12. #include <linux/console.h>
  13. #include <linux/platform_device.h>
  14. #include <linux/mtd/partitions.h>
  15. #include <linux/regulator/machine.h>
  16. #include <linux/i2c.h>
  17. #include <linux/i2c/at24.h>
  18. #include <linux/etherdevice.h>
  19. #include <asm/mach-types.h>
  20. #include <asm/mach/arch.h>
  21. #include <mach/common.h>
  22. #include <mach/cp_intc.h>
  23. #include <mach/da8xx.h>
  24. #include <mach/nand.h>
  25. #include <mach/mux.h>
  26. #define MITYOMAPL138_PHY_ID "0:03"
  27. #define FACTORY_CONFIG_MAGIC 0x012C0138
  28. #define FACTORY_CONFIG_VERSION 0x00010001
  29. /* Data Held in On-Board I2C device */
  30. struct factory_config {
  31. u32 magic;
  32. u32 version;
  33. u8 mac[6];
  34. u32 fpga_type;
  35. u32 spare;
  36. u32 serialnumber;
  37. char partnum[32];
  38. };
  39. static struct factory_config factory_config;
  40. static void read_factory_config(struct memory_accessor *a, void *context)
  41. {
  42. int ret;
  43. struct davinci_soc_info *soc_info = &davinci_soc_info;
  44. ret = a->read(a, (char *)&factory_config, 0, sizeof(factory_config));
  45. if (ret != sizeof(struct factory_config)) {
  46. pr_warning("MityOMAPL138: Read Factory Config Failed: %d\n",
  47. ret);
  48. return;
  49. }
  50. if (factory_config.magic != FACTORY_CONFIG_MAGIC) {
  51. pr_warning("MityOMAPL138: Factory Config Magic Wrong (%X)\n",
  52. factory_config.magic);
  53. return;
  54. }
  55. if (factory_config.version != FACTORY_CONFIG_VERSION) {
  56. pr_warning("MityOMAPL138: Factory Config Version Wrong (%X)\n",
  57. factory_config.version);
  58. return;
  59. }
  60. pr_info("MityOMAPL138: Found MAC = %pM\n", factory_config.mac);
  61. pr_info("MityOMAPL138: Part Number = %s\n", factory_config.partnum);
  62. if (is_valid_ether_addr(factory_config.mac))
  63. memcpy(soc_info->emac_pdata->mac_addr,
  64. factory_config.mac, ETH_ALEN);
  65. else
  66. pr_warning("MityOMAPL138: Invalid MAC found "
  67. "in factory config block\n");
  68. }
  69. static struct at24_platform_data mityomapl138_fd_chip = {
  70. .byte_len = 256,
  71. .page_size = 8,
  72. .flags = AT24_FLAG_READONLY | AT24_FLAG_IRUGO,
  73. .setup = read_factory_config,
  74. .context = NULL,
  75. };
  76. static struct davinci_i2c_platform_data mityomap_i2c_0_pdata = {
  77. .bus_freq = 100, /* kHz */
  78. .bus_delay = 0, /* usec */
  79. };
  80. /* TPS65023 voltage regulator support */
  81. /* 1.2V Core */
  82. static struct regulator_consumer_supply tps65023_dcdc1_consumers[] = {
  83. {
  84. .supply = "cvdd",
  85. },
  86. };
  87. /* 1.8V */
  88. static struct regulator_consumer_supply tps65023_dcdc2_consumers[] = {
  89. {
  90. .supply = "usb0_vdda18",
  91. },
  92. {
  93. .supply = "usb1_vdda18",
  94. },
  95. {
  96. .supply = "ddr_dvdd18",
  97. },
  98. {
  99. .supply = "sata_vddr",
  100. },
  101. };
  102. /* 1.2V */
  103. static struct regulator_consumer_supply tps65023_dcdc3_consumers[] = {
  104. {
  105. .supply = "sata_vdd",
  106. },
  107. {
  108. .supply = "usb_cvdd",
  109. },
  110. {
  111. .supply = "pll0_vdda",
  112. },
  113. {
  114. .supply = "pll1_vdda",
  115. },
  116. };
  117. /* 1.8V Aux LDO, not used */
  118. static struct regulator_consumer_supply tps65023_ldo1_consumers[] = {
  119. {
  120. .supply = "1.8v_aux",
  121. },
  122. };
  123. /* FPGA VCC Aux (2.5 or 3.3) LDO */
  124. static struct regulator_consumer_supply tps65023_ldo2_consumers[] = {
  125. {
  126. .supply = "vccaux",
  127. },
  128. };
  129. static struct regulator_init_data tps65023_regulator_data[] = {
  130. /* dcdc1 */
  131. {
  132. .constraints = {
  133. .min_uV = 1150000,
  134. .max_uV = 1350000,
  135. .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
  136. REGULATOR_CHANGE_STATUS,
  137. .boot_on = 1,
  138. },
  139. .num_consumer_supplies = ARRAY_SIZE(tps65023_dcdc1_consumers),
  140. .consumer_supplies = tps65023_dcdc1_consumers,
  141. },
  142. /* dcdc2 */
  143. {
  144. .constraints = {
  145. .min_uV = 1800000,
  146. .max_uV = 1800000,
  147. .valid_ops_mask = REGULATOR_CHANGE_STATUS,
  148. .boot_on = 1,
  149. },
  150. .num_consumer_supplies = ARRAY_SIZE(tps65023_dcdc2_consumers),
  151. .consumer_supplies = tps65023_dcdc2_consumers,
  152. },
  153. /* dcdc3 */
  154. {
  155. .constraints = {
  156. .min_uV = 1200000,
  157. .max_uV = 1200000,
  158. .valid_ops_mask = REGULATOR_CHANGE_STATUS,
  159. .boot_on = 1,
  160. },
  161. .num_consumer_supplies = ARRAY_SIZE(tps65023_dcdc3_consumers),
  162. .consumer_supplies = tps65023_dcdc3_consumers,
  163. },
  164. /* ldo1 */
  165. {
  166. .constraints = {
  167. .min_uV = 1800000,
  168. .max_uV = 1800000,
  169. .valid_ops_mask = REGULATOR_CHANGE_STATUS,
  170. .boot_on = 1,
  171. },
  172. .num_consumer_supplies = ARRAY_SIZE(tps65023_ldo1_consumers),
  173. .consumer_supplies = tps65023_ldo1_consumers,
  174. },
  175. /* ldo2 */
  176. {
  177. .constraints = {
  178. .min_uV = 2500000,
  179. .max_uV = 3300000,
  180. .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
  181. REGULATOR_CHANGE_STATUS,
  182. .boot_on = 1,
  183. },
  184. .num_consumer_supplies = ARRAY_SIZE(tps65023_ldo2_consumers),
  185. .consumer_supplies = tps65023_ldo2_consumers,
  186. },
  187. };
  188. static struct i2c_board_info __initdata mityomap_tps65023_info[] = {
  189. {
  190. I2C_BOARD_INFO("tps65023", 0x48),
  191. .platform_data = &tps65023_regulator_data[0],
  192. },
  193. {
  194. I2C_BOARD_INFO("24c02", 0x50),
  195. .platform_data = &mityomapl138_fd_chip,
  196. },
  197. };
  198. static int __init pmic_tps65023_init(void)
  199. {
  200. return i2c_register_board_info(1, mityomap_tps65023_info,
  201. ARRAY_SIZE(mityomap_tps65023_info));
  202. }
  203. /*
  204. * MityDSP-L138 includes a 256 MByte large-page NAND flash
  205. * (128K blocks).
  206. */
  207. static struct mtd_partition mityomapl138_nandflash_partition[] = {
  208. {
  209. .name = "rootfs",
  210. .offset = 0,
  211. .size = SZ_128M,
  212. .mask_flags = 0, /* MTD_WRITEABLE, */
  213. },
  214. {
  215. .name = "homefs",
  216. .offset = MTDPART_OFS_APPEND,
  217. .size = MTDPART_SIZ_FULL,
  218. .mask_flags = 0,
  219. },
  220. };
  221. static struct davinci_nand_pdata mityomapl138_nandflash_data = {
  222. .parts = mityomapl138_nandflash_partition,
  223. .nr_parts = ARRAY_SIZE(mityomapl138_nandflash_partition),
  224. .ecc_mode = NAND_ECC_HW,
  225. .options = NAND_USE_FLASH_BBT | NAND_BUSWIDTH_16,
  226. .ecc_bits = 1, /* 4 bit mode is not supported with 16 bit NAND */
  227. };
  228. static struct resource mityomapl138_nandflash_resource[] = {
  229. {
  230. .start = DA8XX_AEMIF_CS3_BASE,
  231. .end = DA8XX_AEMIF_CS3_BASE + SZ_512K + 2 * SZ_1K - 1,
  232. .flags = IORESOURCE_MEM,
  233. },
  234. {
  235. .start = DA8XX_AEMIF_CTL_BASE,
  236. .end = DA8XX_AEMIF_CTL_BASE + SZ_32K - 1,
  237. .flags = IORESOURCE_MEM,
  238. },
  239. };
  240. static struct platform_device mityomapl138_nandflash_device = {
  241. .name = "davinci_nand",
  242. .id = 0,
  243. .dev = {
  244. .platform_data = &mityomapl138_nandflash_data,
  245. },
  246. .num_resources = ARRAY_SIZE(mityomapl138_nandflash_resource),
  247. .resource = mityomapl138_nandflash_resource,
  248. };
  249. static struct platform_device *mityomapl138_devices[] __initdata = {
  250. &mityomapl138_nandflash_device,
  251. };
  252. static void __init mityomapl138_setup_nand(void)
  253. {
  254. platform_add_devices(mityomapl138_devices,
  255. ARRAY_SIZE(mityomapl138_devices));
  256. }
  257. static struct davinci_uart_config mityomapl138_uart_config __initdata = {
  258. .enabled_uarts = 0x7,
  259. };
  260. static const short mityomap_mii_pins[] = {
  261. DA850_MII_TXEN, DA850_MII_TXCLK, DA850_MII_COL, DA850_MII_TXD_3,
  262. DA850_MII_TXD_2, DA850_MII_TXD_1, DA850_MII_TXD_0, DA850_MII_RXER,
  263. DA850_MII_CRS, DA850_MII_RXCLK, DA850_MII_RXDV, DA850_MII_RXD_3,
  264. DA850_MII_RXD_2, DA850_MII_RXD_1, DA850_MII_RXD_0, DA850_MDIO_CLK,
  265. DA850_MDIO_D,
  266. -1
  267. };
  268. static const short mityomap_rmii_pins[] = {
  269. DA850_RMII_TXD_0, DA850_RMII_TXD_1, DA850_RMII_TXEN,
  270. DA850_RMII_CRS_DV, DA850_RMII_RXD_0, DA850_RMII_RXD_1,
  271. DA850_RMII_RXER, DA850_RMII_MHZ_50_CLK, DA850_MDIO_CLK,
  272. DA850_MDIO_D,
  273. -1
  274. };
  275. static void __init mityomapl138_config_emac(void)
  276. {
  277. void __iomem *cfg_chip3_base;
  278. int ret;
  279. u32 val;
  280. struct davinci_soc_info *soc_info = &davinci_soc_info;
  281. soc_info->emac_pdata->rmii_en = 0; /* hardcoded for now */
  282. cfg_chip3_base = DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG);
  283. val = __raw_readl(cfg_chip3_base);
  284. if (soc_info->emac_pdata->rmii_en) {
  285. val |= BIT(8);
  286. ret = davinci_cfg_reg_list(mityomap_rmii_pins);
  287. pr_info("RMII PHY configured\n");
  288. } else {
  289. val &= ~BIT(8);
  290. ret = davinci_cfg_reg_list(mityomap_mii_pins);
  291. pr_info("MII PHY configured\n");
  292. }
  293. if (ret) {
  294. pr_warning("mii/rmii mux setup failed: %d\n", ret);
  295. return;
  296. }
  297. /* configure the CFGCHIP3 register for RMII or MII */
  298. __raw_writel(val, cfg_chip3_base);
  299. soc_info->emac_pdata->phy_id = MITYOMAPL138_PHY_ID;
  300. ret = da8xx_register_emac();
  301. if (ret)
  302. pr_warning("emac registration failed: %d\n", ret);
  303. }
  304. static struct davinci_pm_config da850_pm_pdata = {
  305. .sleepcount = 128,
  306. };
  307. static struct platform_device da850_pm_device = {
  308. .name = "pm-davinci",
  309. .dev = {
  310. .platform_data = &da850_pm_pdata,
  311. },
  312. .id = -1,
  313. };
  314. static void __init mityomapl138_init(void)
  315. {
  316. int ret;
  317. /* for now, no special EDMA channels are reserved */
  318. ret = da850_register_edma(NULL);
  319. if (ret)
  320. pr_warning("edma registration failed: %d\n", ret);
  321. ret = da8xx_register_watchdog();
  322. if (ret)
  323. pr_warning("watchdog registration failed: %d\n", ret);
  324. davinci_serial_init(&mityomapl138_uart_config);
  325. ret = da8xx_register_i2c(0, &mityomap_i2c_0_pdata);
  326. if (ret)
  327. pr_warning("i2c0 registration failed: %d\n", ret);
  328. ret = pmic_tps65023_init();
  329. if (ret)
  330. pr_warning("TPS65023 PMIC init failed: %d\n", ret);
  331. mityomapl138_setup_nand();
  332. mityomapl138_config_emac();
  333. ret = da8xx_register_rtc();
  334. if (ret)
  335. pr_warning("rtc setup failed: %d\n", ret);
  336. ret = da850_register_cpufreq("pll0_sysclk3");
  337. if (ret)
  338. pr_warning("cpufreq registration failed: %d\n", ret);
  339. ret = da8xx_register_cpuidle();
  340. if (ret)
  341. pr_warning("cpuidle registration failed: %d\n", ret);
  342. ret = da850_register_pm(&da850_pm_device);
  343. if (ret)
  344. pr_warning("da850_evm_init: suspend registration failed: %d\n",
  345. ret);
  346. }
  347. #ifdef CONFIG_SERIAL_8250_CONSOLE
  348. static int __init mityomapl138_console_init(void)
  349. {
  350. if (!machine_is_mityomapl138())
  351. return 0;
  352. return add_preferred_console("ttyS", 1, "115200");
  353. }
  354. console_initcall(mityomapl138_console_init);
  355. #endif
  356. static void __init mityomapl138_map_io(void)
  357. {
  358. da850_init();
  359. }
  360. MACHINE_START(MITYOMAPL138, "MityDSP-L138/MityARM-1808")
  361. .boot_params = (DA8XX_DDR_BASE + 0x100),
  362. .map_io = mityomapl138_map_io,
  363. .init_irq = cp_intc_init,
  364. .timer = &davinci_timer,
  365. .init_machine = mityomapl138_init,
  366. MACHINE_END