1 /*
2  * (C) Copyright 2011 Freescale Semiconductor, Inc.
3  *
4  * Author: Fabio Estevam <fabio.estevam@freescale.com>
5  *
6  * See file CREDITS for list of people who contributed to this
7  * project.
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License as
11  * published by the Free Software Foundation; either version 2 of
12  * the License, or (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 
20 #include <common.h>
21 #include <asm/io.h>
22 #include <asm/gpio.h>
23 #include <asm/arch/imx-regs.h>
24 #include <asm/arch/imx25-pinmux.h>
25 #include <asm/arch/sys_proto.h>
26 #include <asm/arch/clock.h>
27 #include <mmc.h>
28 #include <fsl_esdhc.h>
29 
30 #define CARD_DETECT		IMX_GPIO_NR(2, 1)
31 
32 DECLARE_GLOBAL_DATA_PTR;
33 
34 #ifdef CONFIG_FSL_ESDHC
35 struct fsl_esdhc_cfg esdhc_cfg[1] = {
36 	{IMX_MMC_SDHC1_BASE},
37 };
38 #endif
39 
40 int dram_init(void)
41 {
42 	/* dram_init must store complete ramsize in gd->ram_size */
43 	gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE,
44 				PHYS_SDRAM_1_SIZE);
45 	return 0;
46 }
47 
48 int board_early_init_f(void)
49 {
50 	mx25_uart1_init_pins();
51 
52 	return 0;
53 }
54 
55 int board_init(void)
56 {
57 	/* address of boot parameters */
58 	gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
59 
60 	return 0;
61 }
62 
63 #ifdef CONFIG_FSL_ESDHC
64 int board_mmc_getcd(struct mmc *mmc)
65 {
66 	struct iomuxc_mux_ctl *muxctl;
67 	struct iomuxc_pad_ctl *padctl;
68 	u32 gpio_mux_mode = MX25_PIN_MUX_MODE(5);
69 
70 	/*
71 	 * Set up the Card Detect pin.
72 	 *
73 	 * SD1_GPIO_CD: gpio2_1 is ALT 5 mode of pin A15
74 	 *
75 	 */
76 	muxctl = (struct iomuxc_mux_ctl *)IMX_IOPADMUX_BASE;
77 	padctl = (struct iomuxc_pad_ctl *)IMX_IOPADCTL_BASE;
78 
79 	writel(gpio_mux_mode, &muxctl->pad_a15);
80 	writel(0x0, &padctl->pad_a15);
81 
82 	gpio_direction_input(CARD_DETECT);
83 	return !gpio_get_value(CARD_DETECT);
84 }
85 
86 int board_mmc_init(bd_t *bis)
87 {
88 	struct iomuxc_mux_ctl *muxctl;
89 	u32 sdhc1_mux_mode = MX25_PIN_MUX_MODE(0) | MX25_PIN_MUX_SION;
90 
91 	muxctl = (struct iomuxc_mux_ctl *)IMX_IOPADMUX_BASE;
92 	writel(sdhc1_mux_mode, &muxctl->pad_sd1_cmd);
93 	writel(sdhc1_mux_mode, &muxctl->pad_sd1_clk);
94 	writel(sdhc1_mux_mode, &muxctl->pad_sd1_data0);
95 	writel(sdhc1_mux_mode, &muxctl->pad_sd1_data1);
96 	writel(sdhc1_mux_mode, &muxctl->pad_sd1_data2);
97 	writel(sdhc1_mux_mode, &muxctl->pad_sd1_data3);
98 
99 	esdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC1_CLK);
100 	return fsl_esdhc_initialize(bis, &esdhc_cfg[0]);
101 }
102 #endif
103 
104 int checkboard(void)
105 {
106 	puts("Board: MX25PDK\n");
107 
108 	return 0;
109 }
110