board-mx51_efikamx.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. /*
  2. * Copyright (C) 2010 Linaro Limited
  3. *
  4. * based on code from the following
  5. * Copyright 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved.
  6. * Copyright 2009-2010 Pegatron Corporation. All Rights Reserved.
  7. * Copyright 2009-2010 Genesi USA, Inc. All Rights Reserved.
  8. *
  9. * The code contained herein is licensed under the GNU General Public
  10. * License. You may obtain a copy of the GNU General Public License
  11. * Version 2 or later at the following locations:
  12. *
  13. * http://www.opensource.org/licenses/gpl-license.html
  14. * http://www.gnu.org/copyleft/gpl.html
  15. */
  16. #include <linux/init.h>
  17. #include <linux/platform_device.h>
  18. #include <linux/i2c.h>
  19. #include <linux/gpio.h>
  20. #include <linux/leds.h>
  21. #include <linux/input.h>
  22. #include <linux/delay.h>
  23. #include <linux/io.h>
  24. #include <linux/fsl_devices.h>
  25. #include <mach/common.h>
  26. #include <mach/hardware.h>
  27. #include <mach/iomux-mx51.h>
  28. #include <mach/i2c.h>
  29. #include <mach/mxc_ehci.h>
  30. #include <asm/irq.h>
  31. #include <asm/setup.h>
  32. #include <asm/mach-types.h>
  33. #include <asm/mach/arch.h>
  34. #include <asm/mach/time.h>
  35. #include "devices-imx51.h"
  36. #include "devices.h"
  37. #define MX51_USB_PLL_DIV_24_MHZ 0x01
  38. #define EFIKAMX_PCBID0 (2*32 + 16)
  39. #define EFIKAMX_PCBID1 (2*32 + 17)
  40. #define EFIKAMX_PCBID2 (2*32 + 11)
  41. #define EFIKAMX_BLUE_LED (2*32 + 13)
  42. #define EFIKAMX_GREEN_LED (2*32 + 14)
  43. #define EFIKAMX_RED_LED (2*32 + 15)
  44. #define EFIKAMX_POWER_KEY (1*32 + 31)
  45. /* the pci ids pin have pull up. they're driven low according to board id */
  46. #define MX51_PAD_PCBID0 IOMUX_PAD(0x518, 0x130, 3, 0x0, 0, PAD_CTL_PUS_100K_UP)
  47. #define MX51_PAD_PCBID1 IOMUX_PAD(0x51C, 0x134, 3, 0x0, 0, PAD_CTL_PUS_100K_UP)
  48. #define MX51_PAD_PCBID2 IOMUX_PAD(0x504, 0x128, 3, 0x0, 0, PAD_CTL_PUS_100K_UP)
  49. #define MX51_PAD_PWRKEY IOMUX_PAD(0x48c, 0x0f8, 1, 0x0, 0, PAD_CTL_PUS_100K_UP | PAD_CTL_PKE)
  50. static iomux_v3_cfg_t mx51efikamx_pads[] = {
  51. /* UART1 */
  52. MX51_PAD_UART1_RXD__UART1_RXD,
  53. MX51_PAD_UART1_TXD__UART1_TXD,
  54. MX51_PAD_UART1_RTS__UART1_RTS,
  55. MX51_PAD_UART1_CTS__UART1_CTS,
  56. /* board id */
  57. MX51_PAD_PCBID0,
  58. MX51_PAD_PCBID1,
  59. MX51_PAD_PCBID2,
  60. /* SD 1 */
  61. MX51_PAD_SD1_CMD__SD1_CMD,
  62. MX51_PAD_SD1_CLK__SD1_CLK,
  63. MX51_PAD_SD1_DATA0__SD1_DATA0,
  64. MX51_PAD_SD1_DATA1__SD1_DATA1,
  65. MX51_PAD_SD1_DATA2__SD1_DATA2,
  66. MX51_PAD_SD1_DATA3__SD1_DATA3,
  67. /* SD 2 */
  68. MX51_PAD_SD2_CMD__SD2_CMD,
  69. MX51_PAD_SD2_CLK__SD2_CLK,
  70. MX51_PAD_SD2_DATA0__SD2_DATA0,
  71. MX51_PAD_SD2_DATA1__SD2_DATA1,
  72. MX51_PAD_SD2_DATA2__SD2_DATA2,
  73. MX51_PAD_SD2_DATA3__SD2_DATA3,
  74. /* SD/MMC WP/CD */
  75. MX51_PAD_GPIO_1_0__ESDHC1_CD,
  76. MX51_PAD_GPIO_1_1__ESDHC1_WP,
  77. MX51_PAD_GPIO_1_7__ESDHC2_WP,
  78. MX51_PAD_GPIO_1_8__ESDHC2_CD,
  79. /* leds */
  80. MX51_PAD_CSI1_D9__GPIO_3_13,
  81. MX51_PAD_CSI1_VSYNC__GPIO_3_14,
  82. MX51_PAD_CSI1_HSYNC__GPIO_3_15,
  83. /* power key */
  84. MX51_PAD_PWRKEY,
  85. };
  86. /* Serial ports */
  87. #if defined(CONFIG_SERIAL_IMX) || defined(CONFIG_SERIAL_IMX_MODULE)
  88. static const struct imxuart_platform_data uart_pdata = {
  89. .flags = IMXUART_HAVE_RTSCTS,
  90. };
  91. static inline void mxc_init_imx_uart(void)
  92. {
  93. imx51_add_imx_uart(0, &uart_pdata);
  94. imx51_add_imx_uart(1, &uart_pdata);
  95. imx51_add_imx_uart(2, &uart_pdata);
  96. }
  97. #else /* !SERIAL_IMX */
  98. static inline void mxc_init_imx_uart(void)
  99. {
  100. }
  101. #endif /* SERIAL_IMX */
  102. /* This function is board specific as the bit mask for the plldiv will also
  103. * be different for other Freescale SoCs, thus a common bitmask is not
  104. * possible and cannot get place in /plat-mxc/ehci.c.
  105. */
  106. static int initialize_otg_port(struct platform_device *pdev)
  107. {
  108. u32 v;
  109. void __iomem *usb_base;
  110. void __iomem *usbother_base;
  111. usb_base = ioremap(MX51_OTG_BASE_ADDR, SZ_4K);
  112. usbother_base = (void __iomem *)(usb_base + MX5_USBOTHER_REGS_OFFSET);
  113. /* Set the PHY clock to 19.2MHz */
  114. v = __raw_readl(usbother_base + MXC_USB_PHY_CTR_FUNC2_OFFSET);
  115. v &= ~MX5_USB_UTMI_PHYCTRL1_PLLDIV_MASK;
  116. v |= MX51_USB_PLL_DIV_24_MHZ;
  117. __raw_writel(v, usbother_base + MXC_USB_PHY_CTR_FUNC2_OFFSET);
  118. iounmap(usb_base);
  119. return 0;
  120. }
  121. static struct mxc_usbh_platform_data dr_utmi_config = {
  122. .init = initialize_otg_port,
  123. .portsc = MXC_EHCI_UTMI_16BIT,
  124. .flags = MXC_EHCI_INTERNAL_PHY,
  125. };
  126. /* PCBID2 PCBID1 PCBID0 STATE
  127. 1 1 1 ER1:rev1.1
  128. 1 1 0 ER2:rev1.2
  129. 1 0 1 ER3:rev1.3
  130. 1 0 0 ER4:rev1.4
  131. */
  132. static void __init mx51_efikamx_board_id(void)
  133. {
  134. int id;
  135. /* things are taking time to settle */
  136. msleep(150);
  137. gpio_request(EFIKAMX_PCBID0, "pcbid0");
  138. gpio_direction_input(EFIKAMX_PCBID0);
  139. gpio_request(EFIKAMX_PCBID1, "pcbid1");
  140. gpio_direction_input(EFIKAMX_PCBID1);
  141. gpio_request(EFIKAMX_PCBID2, "pcbid2");
  142. gpio_direction_input(EFIKAMX_PCBID2);
  143. id = gpio_get_value(EFIKAMX_PCBID0);
  144. id |= gpio_get_value(EFIKAMX_PCBID1) << 1;
  145. id |= gpio_get_value(EFIKAMX_PCBID2) << 2;
  146. switch (id) {
  147. case 7:
  148. system_rev = 0x11;
  149. break;
  150. case 6:
  151. system_rev = 0x12;
  152. break;
  153. case 5:
  154. system_rev = 0x13;
  155. break;
  156. case 4:
  157. system_rev = 0x14;
  158. break;
  159. default:
  160. system_rev = 0x10;
  161. break;
  162. }
  163. if ((system_rev == 0x10)
  164. || (system_rev == 0x12)
  165. || (system_rev == 0x14)) {
  166. printk(KERN_WARNING
  167. "EfikaMX: Unsupported board revision 1.%u!\n",
  168. system_rev & 0xf);
  169. }
  170. }
  171. static struct gpio_led mx51_efikamx_leds[] = {
  172. {
  173. .name = "efikamx:green",
  174. .default_trigger = "default-on",
  175. .gpio = EFIKAMX_GREEN_LED,
  176. },
  177. {
  178. .name = "efikamx:red",
  179. .default_trigger = "ide-disk",
  180. .gpio = EFIKAMX_RED_LED,
  181. },
  182. {
  183. .name = "efikamx:blue",
  184. .default_trigger = "mmc0",
  185. .gpio = EFIKAMX_BLUE_LED,
  186. },
  187. };
  188. static struct gpio_led_platform_data mx51_efikamx_leds_data = {
  189. .leds = mx51_efikamx_leds,
  190. .num_leds = ARRAY_SIZE(mx51_efikamx_leds),
  191. };
  192. static struct platform_device mx51_efikamx_leds_device = {
  193. .name = "leds-gpio",
  194. .id = -1,
  195. .dev = {
  196. .platform_data = &mx51_efikamx_leds_data,
  197. },
  198. };
  199. static struct gpio_keys_button mx51_efikamx_powerkey[] = {
  200. {
  201. .code = KEY_POWER,
  202. .gpio = EFIKAMX_POWER_KEY,
  203. .type = EV_PWR,
  204. .desc = "Power Button (CM)",
  205. .wakeup = 1,
  206. .debounce_interval = 10, /* ms */
  207. },
  208. };
  209. static const struct gpio_keys_platform_data mx51_efikamx_powerkey_data __initconst = {
  210. .buttons = mx51_efikamx_powerkey,
  211. .nbuttons = ARRAY_SIZE(mx51_efikamx_powerkey),
  212. };
  213. static void __init mxc_board_init(void)
  214. {
  215. mxc_iomux_v3_setup_multiple_pads(mx51efikamx_pads,
  216. ARRAY_SIZE(mx51efikamx_pads));
  217. mx51_efikamx_board_id();
  218. mxc_register_device(&mxc_usbdr_host_device, &dr_utmi_config);
  219. mxc_init_imx_uart();
  220. imx51_add_esdhc(0, NULL);
  221. /* on < 1.2 boards both SD controllers are used */
  222. if (system_rev < 0x12) {
  223. imx51_add_esdhc(1, NULL);
  224. mx51_efikamx_leds[2].default_trigger = "mmc1";
  225. }
  226. platform_device_register(&mx51_efikamx_leds_device);
  227. imx51_add_gpio_keys(&mx51_efikamx_powerkey_data);
  228. }
  229. static void __init mx51_efikamx_timer_init(void)
  230. {
  231. mx51_clocks_init(32768, 24000000, 22579200, 24576000);
  232. }
  233. static struct sys_timer mxc_timer = {
  234. .init = mx51_efikamx_timer_init,
  235. };
  236. MACHINE_START(MX51_EFIKAMX, "Genesi EfikaMX nettop")
  237. /* Maintainer: Amit Kucheria <amit.kucheria@linaro.org> */
  238. .boot_params = MX51_PHYS_OFFSET + 0x100,
  239. .map_io = mx51_map_io,
  240. .init_irq = mx51_init_irq,
  241. .init_machine = mxc_board_init,
  242. .timer = &mxc_timer,
  243. MACHINE_END