[glsdk/meta-ti-glsdk.git] / recipes-bsp / u-boot / u-boot / 0001-OMAP-mmc-add-support-for-second-and-third-mmc-chan.patch
1 From 7252b81ec10aea48672f66e33cb6962b98fb0782 Mon Sep 17 00:00:00 2001
2 From: Steve Sakoman <steve@sakoman.com>
3 Date: Thu, 29 Apr 2010 10:28:14 -0700
4 Subject: [PATCH] OMAP: mmc: add support for second and third mmc channels
6 Boards wishing to use this feature should define CONFIG_SYS_MMC_SET_DEV
8 Signed-off-by: Jason Kridner <jkridner@beagleboard.org>
9 ---
10 drivers/mmc/omap3_mmc.c | 39 +++++++++++++++++++++++++++-
11 include/asm-arm/arch-omap3/mmc_host_def.h | 15 +++++++++--
12 2 files changed, 49 insertions(+), 5 deletions(-)
14 diff --git a/drivers/mmc/omap3_mmc.c b/drivers/mmc/omap3_mmc.c
15 index 96c0e65..bf650ba 100644
16 --- a/drivers/mmc/omap3_mmc.c
17 +++ b/drivers/mmc/omap3_mmc.c
18 @@ -52,7 +52,27 @@ const unsigned short mmc_transspeed_val[15][4] = {
20 mmc_card_data cur_card_data;
21 static block_dev_desc_t mmc_blk_dev;
22 -static hsmmc_t *mmc_base = (hsmmc_t *)OMAP_HSMMC_BASE;
23 +static hsmmc_t *mmc_base = (hsmmc_t *)OMAP_HSMMC1_BASE;
24 +
25 +unsigned char mmc_set_dev(int dev)
26 +{
27 + switch (dev) {
28 + case 1:
29 + mmc_base = (hsmmc_t *)OMAP_HSMMC1_BASE;
30 + break;
31 + case 2:
32 + mmc_base = (hsmmc_t *)OMAP_HSMMC2_BASE;
33 + break;
34 + case 3:
35 + mmc_base = (hsmmc_t *)OMAP_HSMMC3_BASE;
36 + break;
37 + default:
38 + mmc_base = (hsmmc_t *)OMAP_HSMMC1_BASE;
39 + return 1;
40 + }
41 +
42 + return 0;
43 +}
45 block_dev_desc_t *mmc_get_dev(int dev)
46 {
47 @@ -62,6 +82,7 @@ block_dev_desc_t *mmc_get_dev(int dev)
48 unsigned char mmc_board_init(void)
49 {
50 t2_t *t2_base = (t2_t *)T2_BASE;
51 + struct prcm *prcm_base = (struct prcm *)PRCM_BASE;
53 #if defined(CONFIG_TWL4030_POWER)
54 twl4030_power_mmc_init();
55 @@ -74,6 +95,17 @@ unsigned char mmc_board_init(void)
56 writel(readl(&t2_base->devconf0) | MMCSDIO1ADPCLKISEL,
57 &t2_base->devconf0);
59 + writel(readl(&t2_base->devconf1) | MMCSDIO2ADPCLKISEL,
60 + &t2_base->devconf1);
61 +
62 + writel(readl(&prcm_base->fclken1_core) |
63 + EN_MMC1 | EN_MMC2 | EN_MMC3,
64 + &prcm_base->fclken1_core);
65 +
66 + writel(readl(&prcm_base->iclken1_core) |
67 + EN_MMC1 | EN_MMC2 | EN_MMC3,
68 + &prcm_base->iclken1_core);
69 +
70 return 1;
71 }
73 @@ -512,8 +544,11 @@ unsigned long mmc_bread(int dev_num, unsigned long blknr, lbaint_t blkcnt,
74 return 1;
75 }
77 -int mmc_legacy_init(int verbose)
78 +int mmc_legacy_init(int dev)
79 {
80 + if (mmc_set_dev(dev) != 0)
81 + return 1;
82 +
83 if (configure_mmc(&cur_card_data) != 1)
84 return 1;
86 diff --git a/include/asm-arm/arch-omap3/mmc_host_def.h b/include/asm-arm/arch-omap3/mmc_host_def.h
87 index aa751c9..43dd705 100644
88 --- a/include/asm-arm/arch-omap3/mmc_host_def.h
89 +++ b/include/asm-arm/arch-omap3/mmc_host_def.h
90 @@ -29,13 +29,20 @@
91 #define T2_BASE 0x48002000
93 typedef struct t2 {
94 - unsigned char res1[0x274];
95 + unsigned char res1[0x274]; /* 0x000 */
96 unsigned int devconf0; /* 0x274 */
97 - unsigned char res2[0x2A8];
98 + unsigned char res2[0x060]; /* 0x278 */
99 + unsigned int devconf1; /* 0x2D8 */
100 + unsigned char res3[0x244]; /* 0x2DC */
101 unsigned int pbias_lite; /* 0x520 */
102 } t2_t;
104 #define MMCSDIO1ADPCLKISEL (1 << 24)
105 +#define MMCSDIO2ADPCLKISEL (1 << 6)
106 +
107 +#define EN_MMC1 (1 << 24)
108 +#define EN_MMC2 (1 << 25)
109 +#define EN_MMC3 (1 << 30)
111 #define PBIASLITEPWRDNZ0 (1 << 1)
112 #define PBIASSPEEDCTRL0 (1 << 2)
113 @@ -44,7 +51,9 @@ typedef struct t2 {
114 /*
115 * OMAP HSMMC register definitions
116 */
117 -#define OMAP_HSMMC_BASE 0x4809C000
118 +#define OMAP_HSMMC1_BASE 0x4809C000
119 +#define OMAP_HSMMC2_BASE 0x480B4000
120 +#define OMAP_HSMMC3_BASE 0x480AD000
122 typedef struct hsmmc {
123 unsigned char res1[0x10];
124 --
125 1.5.6.4