cgtqmx6eval.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /*
  2. * Copyright (C) 2010-2011 Freescale Semiconductor, Inc.
  3. * Based on mx6qsabrelite.c file
  4. * Copyright (C) 2013, Adeneo Embedded <www.adeneo-embedded.com>
  5. * Leo Sartre, <lsartre@adeneo-embedded.com>
  6. *
  7. * This program is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU General Public License as
  9. * published by the Free Software Foundation; either version 2 of
  10. * the License, or (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  20. * MA 02111-1307 USA
  21. */
  22. #include <common.h>
  23. #include <asm/io.h>
  24. #include <asm/arch/clock.h>
  25. #include <asm/arch/imx-regs.h>
  26. #include <asm/arch/iomux.h>
  27. #include <asm/arch/mx6-pins.h>
  28. #include <asm/gpio.h>
  29. #include <asm/imx-common/iomux-v3.h>
  30. #include <asm/imx-common/boot_mode.h>
  31. #include <mmc.h>
  32. #include <fsl_esdhc.h>
  33. DECLARE_GLOBAL_DATA_PTR;
  34. #define UART_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED |\
  35. PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST | PAD_CTL_HYS)
  36. #define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP | PAD_CTL_SPEED_LOW |\
  37. PAD_CTL_DSE_80ohm | PAD_CTL_SRE_FAST | PAD_CTL_HYS)
  38. int dram_init(void)
  39. {
  40. gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
  41. return 0;
  42. }
  43. iomux_v3_cfg_t const uart2_pads[] = {
  44. MX6_PAD_EIM_D26__UART2_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),
  45. MX6_PAD_EIM_D27__UART2_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
  46. };
  47. iomux_v3_cfg_t const usdhc2_pads[] = {
  48. MX6_PAD_SD2_CLK__USDHC2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
  49. MX6_PAD_SD2_CMD__USDHC2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
  50. MX6_PAD_SD2_DAT0__USDHC2_DAT0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
  51. MX6_PAD_SD2_DAT1__USDHC2_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
  52. MX6_PAD_SD2_DAT2__USDHC2_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
  53. MX6_PAD_SD2_DAT3__USDHC2_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
  54. MX6_PAD_GPIO_4__GPIO_1_4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
  55. };
  56. iomux_v3_cfg_t const usdhc4_pads[] = {
  57. MX6_PAD_SD4_CLK__USDHC4_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
  58. MX6_PAD_SD4_CMD__USDHC4_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
  59. MX6_PAD_SD4_DAT0__USDHC4_DAT0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
  60. MX6_PAD_SD4_DAT1__USDHC4_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
  61. MX6_PAD_SD4_DAT2__USDHC4_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
  62. MX6_PAD_SD4_DAT3__USDHC4_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
  63. MX6_PAD_SD4_DAT4__USDHC4_DAT4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
  64. MX6_PAD_SD4_DAT5__USDHC4_DAT5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
  65. MX6_PAD_SD4_DAT6__USDHC4_DAT6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
  66. MX6_PAD_SD4_DAT7__USDHC4_DAT7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
  67. MX6_PAD_NANDF_D6__GPIO_2_6 | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */
  68. };
  69. static void setup_iomux_uart(void)
  70. {
  71. imx_iomux_v3_setup_multiple_pads(uart2_pads, ARRAY_SIZE(uart2_pads));
  72. }
  73. #ifdef CONFIG_FSL_ESDHC
  74. struct fsl_esdhc_cfg usdhc_cfg[] = {
  75. {USDHC2_BASE_ADDR},
  76. {USDHC4_BASE_ADDR},
  77. };
  78. int board_mmc_getcd(struct mmc *mmc)
  79. {
  80. struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
  81. int ret = 0;
  82. switch (cfg->esdhc_base) {
  83. case USDHC2_BASE_ADDR:
  84. gpio_direction_input(IMX_GPIO_NR(1, 4));
  85. ret = !gpio_get_value(IMX_GPIO_NR(1, 4));
  86. break;
  87. case USDHC4_BASE_ADDR:
  88. gpio_direction_input(IMX_GPIO_NR(2, 6));
  89. ret = !gpio_get_value(IMX_GPIO_NR(2, 6));
  90. break;
  91. default:
  92. printf("Bad USDHC interface\n");
  93. }
  94. return ret;
  95. }
  96. int board_mmc_init(bd_t *bis)
  97. {
  98. s32 status = 0;
  99. usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
  100. usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
  101. imx_iomux_v3_setup_multiple_pads(
  102. usdhc2_pads, ARRAY_SIZE(usdhc2_pads));
  103. imx_iomux_v3_setup_multiple_pads(
  104. usdhc4_pads, ARRAY_SIZE(usdhc4_pads));
  105. status = fsl_esdhc_initialize(bis, &usdhc_cfg[0]) |
  106. fsl_esdhc_initialize(bis, &usdhc_cfg[1]);
  107. return status;
  108. }
  109. #endif
  110. int board_early_init_f(void)
  111. {
  112. setup_iomux_uart();
  113. return 0;
  114. }
  115. int board_init(void)
  116. {
  117. /* address of boot parameters */
  118. gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
  119. return 0;
  120. }
  121. int checkboard(void)
  122. {
  123. puts("Board: Conga-QEVAL QMX6 Quad\n");
  124. return 0;
  125. }
  126. #ifdef CONFIG_CMD_BMODE
  127. static const struct boot_mode board_boot_modes[] = {
  128. /* 4 bit bus width */
  129. {"mmc0", MAKE_CFGVAL(0x50, 0x20, 0x00, 0x00)},
  130. {"mmc1", MAKE_CFGVAL(0x50, 0x38, 0x00, 0x00)},
  131. {NULL, 0},
  132. };
  133. #endif
  134. int misc_init_r(void)
  135. {
  136. #ifdef CONFIG_CMD_BMODE
  137. add_board_boot_modes(board_boot_modes);
  138. #endif
  139. return 0;
  140. }