mach-apx4devkit.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. /*
  2. * Copyright (C) 2011-2012
  3. * Lauri Hintsala, Bluegiga, <lauri.hintsala@bluegiga.com>
  4. * Veli-Pekka Peltola, Bluegiga, <veli-pekka.peltola@bluegiga.com>
  5. *
  6. * based on: mach-mx28evk.c
  7. * Copyright 2010 Freescale Semiconductor, Inc. All Rights Reserved.
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation; either version 2 of the License, or
  12. * (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. */
  19. #include <linux/delay.h>
  20. #include <linux/platform_device.h>
  21. #include <linux/gpio.h>
  22. #include <linux/leds.h>
  23. #include <linux/clk.h>
  24. #include <linux/i2c.h>
  25. #include <linux/regulator/machine.h>
  26. #include <linux/regulator/fixed.h>
  27. #include <linux/micrel_phy.h>
  28. #include <asm/mach-types.h>
  29. #include <asm/mach/arch.h>
  30. #include <asm/mach/time.h>
  31. #include <mach/common.h>
  32. #include <mach/digctl.h>
  33. #include <mach/iomux-mx28.h>
  34. #include "devices-mx28.h"
  35. #define APX4DEVKIT_GPIO_USERLED MXS_GPIO_NR(3, 28)
  36. static const iomux_cfg_t apx4devkit_pads[] __initconst = {
  37. /* duart */
  38. MX28_PAD_PWM0__DUART_RX | MXS_PAD_CTRL,
  39. MX28_PAD_PWM1__DUART_TX | MXS_PAD_CTRL,
  40. /* auart0 */
  41. MX28_PAD_AUART0_RX__AUART0_RX | MXS_PAD_CTRL,
  42. MX28_PAD_AUART0_TX__AUART0_TX | MXS_PAD_CTRL,
  43. MX28_PAD_AUART0_CTS__AUART0_CTS | MXS_PAD_CTRL,
  44. MX28_PAD_AUART0_RTS__AUART0_RTS | MXS_PAD_CTRL,
  45. /* auart1 */
  46. MX28_PAD_AUART1_RX__AUART1_RX | MXS_PAD_CTRL,
  47. MX28_PAD_AUART1_TX__AUART1_TX | MXS_PAD_CTRL,
  48. /* auart2 */
  49. MX28_PAD_SSP2_SCK__AUART2_RX | MXS_PAD_CTRL,
  50. MX28_PAD_SSP2_MOSI__AUART2_TX | MXS_PAD_CTRL,
  51. /* auart3 */
  52. MX28_PAD_SSP2_MISO__AUART3_RX | MXS_PAD_CTRL,
  53. MX28_PAD_SSP2_SS0__AUART3_TX | MXS_PAD_CTRL,
  54. #define MXS_PAD_FEC (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP)
  55. /* fec0 */
  56. MX28_PAD_ENET0_MDC__ENET0_MDC | MXS_PAD_FEC,
  57. MX28_PAD_ENET0_MDIO__ENET0_MDIO | MXS_PAD_FEC,
  58. MX28_PAD_ENET0_RX_EN__ENET0_RX_EN | MXS_PAD_FEC,
  59. MX28_PAD_ENET0_RXD0__ENET0_RXD0 | MXS_PAD_FEC,
  60. MX28_PAD_ENET0_RXD1__ENET0_RXD1 | MXS_PAD_FEC,
  61. MX28_PAD_ENET0_TX_EN__ENET0_TX_EN | MXS_PAD_FEC,
  62. MX28_PAD_ENET0_TXD0__ENET0_TXD0 | MXS_PAD_FEC,
  63. MX28_PAD_ENET0_TXD1__ENET0_TXD1 | MXS_PAD_FEC,
  64. MX28_PAD_ENET_CLK__CLKCTRL_ENET | MXS_PAD_FEC,
  65. /* i2c */
  66. MX28_PAD_I2C0_SCL__I2C0_SCL,
  67. MX28_PAD_I2C0_SDA__I2C0_SDA,
  68. /* mmc0 */
  69. MX28_PAD_SSP0_DATA0__SSP0_D0 |
  70. (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
  71. MX28_PAD_SSP0_DATA1__SSP0_D1 |
  72. (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
  73. MX28_PAD_SSP0_DATA2__SSP0_D2 |
  74. (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
  75. MX28_PAD_SSP0_DATA3__SSP0_D3 |
  76. (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
  77. MX28_PAD_SSP0_DATA4__SSP0_D4 |
  78. (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
  79. MX28_PAD_SSP0_DATA5__SSP0_D5 |
  80. (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
  81. MX28_PAD_SSP0_DATA6__SSP0_D6 |
  82. (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
  83. MX28_PAD_SSP0_DATA7__SSP0_D7 |
  84. (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
  85. MX28_PAD_SSP0_CMD__SSP0_CMD |
  86. (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
  87. MX28_PAD_SSP0_DETECT__SSP0_CARD_DETECT |
  88. (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
  89. MX28_PAD_SSP0_SCK__SSP0_SCK |
  90. (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
  91. /* led */
  92. MX28_PAD_PWM3__GPIO_3_28 | MXS_PAD_CTRL,
  93. /* saif0 & saif1 */
  94. MX28_PAD_SAIF0_MCLK__SAIF0_MCLK |
  95. (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
  96. MX28_PAD_SAIF0_LRCLK__SAIF0_LRCLK |
  97. (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
  98. MX28_PAD_SAIF0_BITCLK__SAIF0_BITCLK |
  99. (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
  100. MX28_PAD_SAIF0_SDATA0__SAIF0_SDATA0 |
  101. (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
  102. MX28_PAD_SAIF1_SDATA0__SAIF1_SDATA0 |
  103. (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
  104. };
  105. /* led */
  106. static const struct gpio_led apx4devkit_leds[] __initconst = {
  107. {
  108. .name = "user-led",
  109. .default_trigger = "heartbeat",
  110. .gpio = APX4DEVKIT_GPIO_USERLED,
  111. },
  112. };
  113. static const struct gpio_led_platform_data apx4devkit_led_data __initconst = {
  114. .leds = apx4devkit_leds,
  115. .num_leds = ARRAY_SIZE(apx4devkit_leds),
  116. };
  117. static const struct fec_platform_data mx28_fec_pdata __initconst = {
  118. .phy = PHY_INTERFACE_MODE_RMII,
  119. };
  120. static const struct mxs_mmc_platform_data apx4devkit_mmc_pdata __initconst = {
  121. .wp_gpio = -EINVAL,
  122. .flags = SLOTF_4_BIT_CAPABLE,
  123. };
  124. static const struct i2c_board_info apx4devkit_i2c_boardinfo[] __initconst = {
  125. { I2C_BOARD_INFO("sgtl5000", 0x0a) }, /* ASoC */
  126. { I2C_BOARD_INFO("pcf8563", 0x51) }, /* RTC */
  127. };
  128. #if defined(CONFIG_REGULATOR_FIXED_VOLTAGE) || \
  129. defined(CONFIG_REGULATOR_FIXED_VOLTAGE_MODULE)
  130. static struct regulator_consumer_supply apx4devkit_audio_consumer_supplies[] = {
  131. REGULATOR_SUPPLY("VDDA", "0-000a"),
  132. REGULATOR_SUPPLY("VDDIO", "0-000a"),
  133. };
  134. static struct regulator_init_data apx4devkit_vdd_reg_init_data = {
  135. .constraints = {
  136. .name = "3V3",
  137. .always_on = 1,
  138. },
  139. .consumer_supplies = apx4devkit_audio_consumer_supplies,
  140. .num_consumer_supplies = ARRAY_SIZE(apx4devkit_audio_consumer_supplies),
  141. };
  142. static struct fixed_voltage_config apx4devkit_vdd_pdata = {
  143. .supply_name = "board-3V3",
  144. .microvolts = 3300000,
  145. .gpio = -EINVAL,
  146. .enabled_at_boot = 1,
  147. .init_data = &apx4devkit_vdd_reg_init_data,
  148. };
  149. static struct platform_device apx4devkit_voltage_regulator = {
  150. .name = "reg-fixed-voltage",
  151. .id = -1,
  152. .num_resources = 0,
  153. .dev = {
  154. .platform_data = &apx4devkit_vdd_pdata,
  155. },
  156. };
  157. static void __init apx4devkit_add_regulators(void)
  158. {
  159. platform_device_register(&apx4devkit_voltage_regulator);
  160. }
  161. #else
  162. static void __init apx4devkit_add_regulators(void) {}
  163. #endif
  164. static const struct mxs_saif_platform_data
  165. apx4devkit_mxs_saif_pdata[] __initconst = {
  166. /* working on EXTMSTR0 mode (saif0 master, saif1 slave) */
  167. {
  168. .master_mode = 1,
  169. .master_id = 0,
  170. }, {
  171. .master_mode = 0,
  172. .master_id = 0,
  173. },
  174. };
  175. static int apx4devkit_phy_fixup(struct phy_device *phy)
  176. {
  177. phy->dev_flags |= MICREL_PHY_50MHZ_CLK;
  178. return 0;
  179. }
  180. static void __init apx4devkit_init(void)
  181. {
  182. mxs_iomux_setup_multiple_pads(apx4devkit_pads,
  183. ARRAY_SIZE(apx4devkit_pads));
  184. mx28_add_duart();
  185. mx28_add_auart0();
  186. mx28_add_auart1();
  187. mx28_add_auart2();
  188. mx28_add_auart3();
  189. /*
  190. * Register fixup for the Micrel KS8031 PHY clock
  191. * (shares same ID with KS8051)
  192. */
  193. phy_register_fixup_for_uid(PHY_ID_KS8051, MICREL_PHY_ID_MASK,
  194. apx4devkit_phy_fixup);
  195. mx28_add_fec(0, &mx28_fec_pdata);
  196. mx28_add_mxs_mmc(0, &apx4devkit_mmc_pdata);
  197. gpio_led_register_device(0, &apx4devkit_led_data);
  198. mxs_saif_clkmux_select(MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR0);
  199. mx28_add_saif(0, &apx4devkit_mxs_saif_pdata[0]);
  200. mx28_add_saif(1, &apx4devkit_mxs_saif_pdata[1]);
  201. apx4devkit_add_regulators();
  202. mx28_add_mxs_i2c(0);
  203. i2c_register_board_info(0, apx4devkit_i2c_boardinfo,
  204. ARRAY_SIZE(apx4devkit_i2c_boardinfo));
  205. mxs_add_platform_device("mxs-sgtl5000", 0, NULL, 0, NULL, 0);
  206. }
  207. static void __init apx4devkit_timer_init(void)
  208. {
  209. mx28_clocks_init();
  210. }
  211. static struct sys_timer apx4devkit_timer = {
  212. .init = apx4devkit_timer_init,
  213. };
  214. MACHINE_START(APX4DEVKIT, "Bluegiga APX4 Development Kit")
  215. .map_io = mx28_map_io,
  216. .init_irq = mx28_init_irq,
  217. .timer = &apx4devkit_timer,
  218. .init_machine = apx4devkit_init,
  219. .restart = mxs_restart,
  220. MACHINE_END