board-da830-evm.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. /*
  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>
  13. #include <linux/module.h>
  14. #include <linux/init.h>
  15. #include <linux/console.h>
  16. #include <linux/i2c.h>
  17. #include <linux/i2c/at24.h>
  18. #include <asm/mach-types.h>
  19. #include <asm/mach/arch.h>
  20. #include <mach/common.h>
  21. #include <mach/irqs.h>
  22. #include <mach/cp_intc.h>
  23. #include <mach/mux.h>
  24. #include <mach/gpio.h>
  25. #include <mach/da8xx.h>
  26. #include <mach/asp.h>
  27. #define DA830_EVM_PHY_MASK 0x0
  28. #define DA830_EVM_MDIO_FREQUENCY 2200000 /* PHY bus frequency */
  29. static struct at24_platform_data da830_evm_i2c_eeprom_info = {
  30. .byte_len = SZ_256K / 8,
  31. .page_size = 64,
  32. .flags = AT24_FLAG_ADDR16,
  33. .setup = davinci_get_mac_addr,
  34. .context = (void *)0x7f00,
  35. };
  36. static struct i2c_board_info __initdata da830_evm_i2c_devices[] = {
  37. {
  38. I2C_BOARD_INFO("24c256", 0x50),
  39. .platform_data = &da830_evm_i2c_eeprom_info,
  40. },
  41. {
  42. I2C_BOARD_INFO("tlv320aic3x", 0x18),
  43. }
  44. };
  45. static struct davinci_i2c_platform_data da830_evm_i2c_0_pdata = {
  46. .bus_freq = 100, /* kHz */
  47. .bus_delay = 0, /* usec */
  48. };
  49. static struct davinci_uart_config da830_evm_uart_config __initdata = {
  50. .enabled_uarts = 0x7,
  51. };
  52. static const short da830_evm_mcasp1_pins[] = {
  53. DA830_AHCLKX1, DA830_ACLKX1, DA830_AFSX1, DA830_AHCLKR1, DA830_AFSR1,
  54. DA830_AMUTE1, DA830_AXR1_0, DA830_AXR1_1, DA830_AXR1_2, DA830_AXR1_5,
  55. DA830_ACLKR1, DA830_AXR1_6, DA830_AXR1_7, DA830_AXR1_8, DA830_AXR1_10,
  56. DA830_AXR1_11,
  57. -1
  58. };
  59. static u8 da830_iis_serializer_direction[] = {
  60. RX_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
  61. INACTIVE_MODE, TX_MODE, INACTIVE_MODE, INACTIVE_MODE,
  62. INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
  63. };
  64. static struct snd_platform_data da830_evm_snd_data = {
  65. .tx_dma_offset = 0x2000,
  66. .rx_dma_offset = 0x2000,
  67. .op_mode = DAVINCI_MCASP_IIS_MODE,
  68. .num_serializer = ARRAY_SIZE(da830_iis_serializer_direction),
  69. .tdm_slots = 2,
  70. .serial_dir = da830_iis_serializer_direction,
  71. .eventq_no = EVENTQ_0,
  72. .version = MCASP_VERSION_2,
  73. .txnumevt = 1,
  74. .rxnumevt = 1,
  75. };
  76. /*
  77. * GPIO2[1] is used as MMC_SD_WP and GPIO2[2] as MMC_SD_INS.
  78. */
  79. static const short da830_evm_mmc_sd_pins[] = {
  80. DA830_MMCSD_DAT_0, DA830_MMCSD_DAT_1, DA830_MMCSD_DAT_2,
  81. DA830_MMCSD_DAT_3, DA830_MMCSD_DAT_4, DA830_MMCSD_DAT_5,
  82. DA830_MMCSD_DAT_6, DA830_MMCSD_DAT_7, DA830_MMCSD_CLK,
  83. DA830_MMCSD_CMD, DA830_GPIO2_1, DA830_GPIO2_2,
  84. -1
  85. };
  86. #define DA830_MMCSD_WP_PIN GPIO_TO_PIN(2, 1)
  87. static int da830_evm_mmc_get_ro(int index)
  88. {
  89. return gpio_get_value(DA830_MMCSD_WP_PIN);
  90. }
  91. static struct davinci_mmc_config da830_evm_mmc_config = {
  92. .get_ro = da830_evm_mmc_get_ro,
  93. .wires = 4,
  94. .version = MMC_CTLR_VERSION_2,
  95. };
  96. static inline void da830_evm_init_mmc(void)
  97. {
  98. int ret;
  99. ret = da8xx_pinmux_setup(da830_evm_mmc_sd_pins);
  100. if (ret) {
  101. pr_warning("da830_evm_init: mmc/sd mux setup failed: %d\n",
  102. ret);
  103. return;
  104. }
  105. ret = gpio_request(DA830_MMCSD_WP_PIN, "MMC WP");
  106. if (ret) {
  107. pr_warning("da830_evm_init: can not open GPIO %d\n",
  108. DA830_MMCSD_WP_PIN);
  109. return;
  110. }
  111. gpio_direction_input(DA830_MMCSD_WP_PIN);
  112. ret = da8xx_register_mmcsd0(&da830_evm_mmc_config);
  113. if (ret) {
  114. pr_warning("da830_evm_init: mmc/sd registration failed: %d\n",
  115. ret);
  116. gpio_free(DA830_MMCSD_WP_PIN);
  117. }
  118. }
  119. static __init void da830_evm_init(void)
  120. {
  121. struct davinci_soc_info *soc_info = &davinci_soc_info;
  122. int ret;
  123. ret = da8xx_register_edma();
  124. if (ret)
  125. pr_warning("da830_evm_init: edma registration failed: %d\n",
  126. ret);
  127. ret = da8xx_pinmux_setup(da830_i2c0_pins);
  128. if (ret)
  129. pr_warning("da830_evm_init: i2c0 mux setup failed: %d\n",
  130. ret);
  131. ret = da8xx_register_i2c(0, &da830_evm_i2c_0_pdata);
  132. if (ret)
  133. pr_warning("da830_evm_init: i2c0 registration failed: %d\n",
  134. ret);
  135. soc_info->emac_pdata->phy_mask = DA830_EVM_PHY_MASK;
  136. soc_info->emac_pdata->mdio_max_freq = DA830_EVM_MDIO_FREQUENCY;
  137. soc_info->emac_pdata->rmii_en = 1;
  138. ret = da8xx_pinmux_setup(da830_cpgmac_pins);
  139. if (ret)
  140. pr_warning("da830_evm_init: cpgmac mux setup failed: %d\n",
  141. ret);
  142. ret = da8xx_register_emac();
  143. if (ret)
  144. pr_warning("da830_evm_init: emac registration failed: %d\n",
  145. ret);
  146. ret = da8xx_register_watchdog();
  147. if (ret)
  148. pr_warning("da830_evm_init: watchdog registration failed: %d\n",
  149. ret);
  150. davinci_serial_init(&da830_evm_uart_config);
  151. i2c_register_board_info(1, da830_evm_i2c_devices,
  152. ARRAY_SIZE(da830_evm_i2c_devices));
  153. ret = da8xx_pinmux_setup(da830_evm_mcasp1_pins);
  154. if (ret)
  155. pr_warning("da830_evm_init: mcasp1 mux setup failed: %d\n",
  156. ret);
  157. da8xx_register_mcasp(1, &da830_evm_snd_data);
  158. da830_evm_init_mmc();
  159. }
  160. #ifdef CONFIG_SERIAL_8250_CONSOLE
  161. static int __init da830_evm_console_init(void)
  162. {
  163. return add_preferred_console("ttyS", 2, "115200");
  164. }
  165. console_initcall(da830_evm_console_init);
  166. #endif
  167. static __init void da830_evm_irq_init(void)
  168. {
  169. struct davinci_soc_info *soc_info = &davinci_soc_info;
  170. cp_intc_init((void __iomem *)DA8XX_CP_INTC_VIRT, DA830_N_CP_INTC_IRQ,
  171. soc_info->intc_irq_prios);
  172. }
  173. static void __init da830_evm_map_io(void)
  174. {
  175. da830_init();
  176. }
  177. MACHINE_START(DAVINCI_DA830_EVM, "DaVinci DA830/OMAP L137 EVM")
  178. .phys_io = IO_PHYS,
  179. .io_pg_offst = (__IO_ADDRESS(IO_PHYS) >> 18) & 0xfffc,
  180. .boot_params = (DA8XX_DDR_BASE + 0x100),
  181. .map_io = da830_evm_map_io,
  182. .init_irq = da830_evm_irq_init,
  183. .timer = &davinci_timer,
  184. .init_machine = da830_evm_init,
  185. MACHINE_END