]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
mmc: access mxcmmc from mx31 boards
authorHelmut Raiger <helmut.raiger@hale.at>
Wed, 11 Jan 2012 03:59:22 +0000 (03:59 +0000)
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>
Sun, 12 Feb 2012 09:11:26 +0000 (10:11 +0100)
This patch modifies mxcmmc.c to be used
not only by i.MX27 but also by i.MX31 boards.
Both use the same SD controller, but have different
clock set-ups.
The i.MX27 imx_get_XXXclock functions are made static to
generic.c and a public mxc_get_clock() function
is provided.  Pins, base address and prototypes for
an i.MX31 specific board_init_mmc() are provided.
Some of the i.MX27 clock getters are unused and marked
as such to avoid warnings (./MAKEALL -s mx27), but
the code was left in for future use.

Signed-off-by: Helmut Raiger <helmut.raiger@hale.at>
Acked-by: Stefano Babic <sbabic@denx.de>
arch/arm/cpu/arm1136/mx31/generic.c
arch/arm/cpu/arm926ejs/mx27/generic.c
arch/arm/include/asm/arch-mx27/clock.h
arch/arm/include/asm/arch-mx31/clock.h
arch/arm/include/asm/arch-mx31/imx-regs.h
arch/arm/include/asm/arch-mx31/sys_proto.h
drivers/mmc/mxcmmc.c

index f45828141e6013ecdcc67de2382ebb54716dcd0d..d60afc9a33f57bee8efc17b16782ea1cf388bbd9 100644 (file)
@@ -101,6 +101,7 @@ unsigned int mxc_get_clock(enum mxc_clock clk)
        case MXC_IPG_PERCLK:
        case MXC_CSPI_CLK:
        case MXC_UART_CLK:
+       case MXC_ESDHC_CLK:
                return mx31_get_ipg_clk();
        case MXC_IPU_CLK:
                return mx31_get_hsp_clk();
index 34c20e1bae5a1d2e97132e4489d304f7ee5fe5b6..65c481378418eca6341d350ef176a5583ea01f81 100644 (file)
@@ -23,6 +23,7 @@
 #include <netdev.h>
 #include <asm/io.h>
 #include <asm/arch/imx-regs.h>
+#include <asm/arch/clock.h>
 #ifdef CONFIG_MXC_MMC
 #include <asm/arch/mxcmmc.h>
 #endif
@@ -34,7 +35,7 @@
  *  f = 2 * f_ref * --------------------
  *                        pd + 1
  */
-unsigned int imx_decode_pll(unsigned int pll, unsigned int f_ref)
+static unsigned int imx_decode_pll(unsigned int pll, unsigned int f_ref)
 {
        unsigned int mfi = (pll >> 10) & 0xf;
        unsigned int mfn = pll & 0x3ff;
@@ -64,7 +65,7 @@ static ulong clk_in_26m(void)
        }
 }
 
-ulong imx_get_mpllclk(void)
+static ulong imx_get_mpllclk(void)
 {
        struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE;
        ulong cscr = readl(&pll->cscr);
@@ -78,7 +79,7 @@ ulong imx_get_mpllclk(void)
        return imx_decode_pll(readl(&pll->mpctl0), fref);
 }
 
-ulong imx_get_armclk(void)
+static ulong imx_get_armclk(void)
 {
        struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE;
        ulong cscr = readl(&pll->cscr);
@@ -93,7 +94,7 @@ ulong imx_get_armclk(void)
        return lldiv(fref, div);
 }
 
-ulong imx_get_ahbclk(void)
+static ulong imx_get_ahbclk(void)
 {
        struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE;
        ulong cscr = readl(&pll->cscr);
@@ -105,7 +106,7 @@ ulong imx_get_ahbclk(void)
        return lldiv(fref * 2, 3 * div);
 }
 
-ulong imx_get_spllclk(void)
+static __attribute__((unused)) ulong imx_get_spllclk(void)
 {
        struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE;
        ulong cscr = readl(&pll->cscr);
@@ -124,34 +125,50 @@ static ulong imx_decode_perclk(ulong div)
        return lldiv((imx_get_mpllclk() * 2), (div * 3));
 }
 
-ulong imx_get_perclk1(void)
+static ulong imx_get_perclk1(void)
 {
        struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE;
 
        return imx_decode_perclk((readl(&pll->pcdr1) & 0x3f) + 1);
 }
 
-ulong imx_get_perclk2(void)
+static ulong imx_get_perclk2(void)
 {
        struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE;
 
        return imx_decode_perclk(((readl(&pll->pcdr1) >> 8) & 0x3f) + 1);
 }
 
-ulong imx_get_perclk3(void)
+static __attribute__((unused)) ulong imx_get_perclk3(void)
 {
        struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE;
 
        return imx_decode_perclk(((readl(&pll->pcdr1) >> 16) & 0x3f) + 1);
 }
 
-ulong imx_get_perclk4(void)
+static __attribute__((unused)) ulong imx_get_perclk4(void)
 {
        struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE;
 
        return imx_decode_perclk(((readl(&pll->pcdr1) >> 24) & 0x3f) + 1);
 }
 
+unsigned int mxc_get_clock(enum mxc_clock clk)
+{
+       switch (clk) {
+       case MXC_ARM_CLK:
+               return imx_get_armclk();
+       case MXC_UART_CLK:
+               return imx_get_perclk1();
+       case MXC_FEC_CLK:
+               return imx_get_ahbclk();
+       case MXC_ESDHC_CLK:
+               return imx_get_perclk2();
+       }
+       return -1;
+}
+
+
 #if defined(CONFIG_DISPLAY_CPUINFO)
 int print_cpuinfo (void)
 {
index 7e9c7aabb00cc71554eeb40a91e068d058886b21..fd062d3e896ac687798b5c8418bf383e6dc1dc93 100644 (file)
 
 #ifndef __ASM_ARCH_CLOCK_H
 #define __ASM_ARCH_CLOCK_H
-unsigned int imx_decode_pll(unsigned int pll, unsigned int f_ref);
 
-ulong imx_get_mpllclk(void);
-ulong imx_get_armclk(void);
-ulong imx_get_spllclk(void);
-ulong imx_get_fclk(void);
-ulong imx_get_hclk(void);
-ulong imx_get_bclk(void);
-ulong imx_get_perclk1(void);
-ulong imx_get_perclk2(void);
-ulong imx_get_perclk3(void);
-ulong imx_get_ahbclk(void);
+enum mxc_clock {
+       MXC_ARM_CLK,
+       MXC_UART_CLK,
+       MXC_ESDHC_CLK,
+       MXC_FEC_CLK,
+};
 
-#define imx_get_uartclk imx_get_perclk1
-#define imx_get_fecclk imx_get_ahbclk
+unsigned int mxc_get_clock(enum mxc_clock clk);
+#define imx_get_uartclk() mxc_get_clock(MXC_UART_CLK)
+#define imx_get_fecclk() mxc_get_clock(MXC_FEC_CLK)
 
 #endif /* __ASM_ARCH_CLOCK_H */
index 253a0e158481ef6338aa4c3d8472e0ce19b28959..852c19c1a74c45acd296001aa5749cc0f0351c45 100644 (file)
@@ -30,7 +30,8 @@ enum mxc_clock {
        MXC_IPG_PERCLK,
        MXC_CSPI_CLK,
        MXC_UART_CLK,
-       MXC_IPU_CLK
+       MXC_IPU_CLK,
+       MXC_ESDHC_CLK,
 };
 
 unsigned int mxc_get_clock(enum mxc_clock clk);
index 6a517ddd931ca0d1e598bd7456c4c611741602eb..798cc746722a0eec31f4b74d2554bb0d00a8c122 100644 (file)
@@ -709,6 +709,13 @@ struct esdc_regs {
 #define MUX_CTL_CSPI3_SPI_RDY  0x0e
 #define MUX_CTL_CSPI3_MOSI             0x13
 
+#define MUX_CTL_SD1_DATA1      0x18
+#define MUX_CTL_SD1_DATA2      0x19
+#define MUX_CTL_SD1_DATA3      0x1a
+#define MUX_CTL_SD1_CMD                0x1d
+#define MUX_CTL_SD1_CLK                0x1e
+#define MUX_CTL_SD1_DATA0      0x1f
+
 #define MUX_CTL_USBH2_DATA1    0x40
 #define MUX_CTL_USBH2_DIR      0x44
 #define MUX_CTL_USBH2_STP      0x45
@@ -855,6 +862,10 @@ struct esdc_regs {
  */
 #define NFC_BASE_ADDR  0xB8000000
 
+/* SD card controller */
+#define SDHC1_BASE_ADDR        0x50004000
+#define SDHC2_BASE_ADDR        0x50008000
+
 /*
  * Internal RAM (16KB)
  */
index 76003030d77815849956bf00f402151f684c485e..ded481c4339e77d3aafd69cf84ae5f915104e492 100644 (file)
@@ -31,5 +31,5 @@ struct mxc_weimcs {
 };
 
 void mxc_setup_weimcs(int cs, const struct mxc_weimcs *weimcs);
-
+int mxc_mmc_init(bd_t *bis);
 #endif
index 8afb22159ab518e5ea3ed9acbba769220523c943..d58c18bc2a5b9ff05671172cab1d261efd15b781 100644 (file)
@@ -25,9 +25,7 @@
 #include <mmc.h>
 #include <asm/errno.h>
 #include <asm/io.h>
-#ifdef CONFIG_MX27
 #include <asm/arch/clock.h>
-#endif
 
 #define DRIVER_NAME "mxc-mmc"
 
@@ -422,7 +420,7 @@ static void mxcmci_set_clk_rate(struct mxcmci_host *host, unsigned int clk_ios)
 {
        unsigned int divider;
        int prescaler = 0;
-       unsigned long clk_in = imx_get_perclk2();
+       unsigned long clk_in = mxc_get_clock(MXC_ESDHC_CLK);
 
        while (prescaler <= 0x800) {
                for (divider = 1; divider <= 0xF; divider++) {
@@ -509,8 +507,8 @@ static int mxcmci_initialize(bd_t *bis)
 
        mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
 
-       mmc->f_min = imx_get_perclk2() >> 7;
-       mmc->f_max = imx_get_perclk2() >> 1;
+       mmc->f_min = mxc_get_clock(MXC_ESDHC_CLK) >> 7;
+       mmc->f_max = mxc_get_clock(MXC_ESDHC_CLK) >> 1;
 
        mmc->b_max = 0;