From: Sonic Zhang <[email protected]>

Add support for bf609-ezkit to board file and mmc driver.

Signed-off-by: Sonic Zhang <[email protected]>
Signed-off-by: Bob Liu <[email protected]>
---
 arch/blackfin/include/asm/config-pre.h           |    4 ++
 arch/blackfin/include/asm/mach-common/bits/dma.h |   47 +++++++++++++++++++++-
 arch/blackfin/include/asm/mach-common/bits/sdh.h |   38 ++++++++++++++++-
 board/bf609-ezkit/bf609-ezkit.c                  |    7 ++++
 drivers/mmc/bfin_sdh.c                           |   45 +++++++++++++++------
 include/configs/bf609-ezkit.h                    |    9 ++++-
 6 files changed, 132 insertions(+), 18 deletions(-)

diff --git a/arch/blackfin/include/asm/config-pre.h 
b/arch/blackfin/include/asm/config-pre.h
index 4ce67d4..88aa1da 100644
--- a/arch/blackfin/include/asm/config-pre.h
+++ b/arch/blackfin/include/asm/config-pre.h
@@ -31,6 +31,8 @@
 #define BFIN_BOOT_16HOST_DMA  11      /* boot ldr from 16-bit host dma */
 #define BFIN_BOOT_8HOST_DMA   12      /* boot ldr from 8-bit host dma */
 #define BFIN_BOOT_NAND        13      /* boot ldr from nand flash */
+#define BFIN_BOOT_RSI_MASTER  14      /* boot ldr from rsi */
+#define BFIN_BOOT_LP_SLAVE    15      /* boot ldr from link port */
 
 #ifndef __ASSEMBLY__
 static inline const char *get_bfin_boot_mode(int bfin_boot)
@@ -49,6 +51,8 @@ static inline const char *get_bfin_boot_mode(int bfin_boot)
        case BFIN_BOOT_16HOST_DMA: return "16bit dma";
        case BFIN_BOOT_8HOST_DMA:  return "8bit dma";
        case BFIN_BOOT_NAND:       return "nand flash";
+       case BFIN_BOOT_RSI_MASTER: return "rsi master";
+       case BFIN_BOOT_LP_SLAVE:   return "link port slave";
        default:                   return "INVALID";
        }
 }
diff --git a/arch/blackfin/include/asm/mach-common/bits/dma.h 
b/arch/blackfin/include/asm/mach-common/bits/dma.h
index ee209c6..1126c44 100644
--- a/arch/blackfin/include/asm/mach-common/bits/dma.h
+++ b/arch/blackfin/include/asm/mach-common/bits/dma.h
@@ -9,8 +9,48 @@
 #define DMAEN                  0x0001  /* DMA Channel Enable */
 #define WNR                    0x0002  /* Channel Direction (W/R*) */
 #define WDSIZE_8               0x0000  /* Transfer Word Size = 8 */
+
+#ifdef CONFIG_BF60x
+
+#define PSIZE_8                        0x00000000      /* Transfer Word Size = 
16 */
+#define PSIZE_16               0x00000010      /* Transfer Word Size = 16 */
+#define PSIZE_32               0x00000020      /* Transfer Word Size = 32 */
+#define PSIZE_64               0x00000030      /* Transfer Word Size = 32 */
+#define WDSIZE_16              0x00000100      /* Transfer Word Size = 16 */
+#define WDSIZE_32              0x00000200      /* Transfer Word Size = 32 */
+#define WDSIZE_64              0x00000300      /* Transfer Word Size = 32 */
+#define WDSIZE_128             0x00000400      /* Transfer Word Size = 32 */
+#define WDSIZE_256             0x00000500      /* Transfer Word Size = 32 */
+#define DMA2D                  0x04000000      /* DMA Mode (2D/1D*) */
+#define RESTART                        0x00000004      /* DMA Buffer Clear 
SYNC */
+#define DI_EN_X                        0x00100000      /* Data Interrupt 
Enable in X count */
+#define DI_EN_Y                        0x00200000      /* Data Interrupt 
Enable in Y count */
+#define DI_EN_P                        0x00300000      /* Data Interrupt 
Enable in Peripheral */
+#define DI_EN                  DI_EN_X         /* Data Interrupt Enable */
+#define NDSIZE_0               0x00000000      /* Next Descriptor Size = 0 
(Stop/Autobuffer) */
+#define NDSIZE_1               0x00010000      /* Next Descriptor Size = 1 */
+#define NDSIZE_2               0x00020000      /* Next Descriptor Size = 2 */
+#define NDSIZE_3               0x00030000      /* Next Descriptor Size = 3 */
+#define NDSIZE_4               0x00040000      /* Next Descriptor Size = 4 */
+#define NDSIZE_5               0x00050000      /* Next Descriptor Size = 5 */
+#define NDSIZE_6               0x00060000      /* Next Descriptor Size = 6 */
+#define NDSIZE                 0x00070000      /* Next Descriptor Size */
+#define NDSIZE_OFFSET          16              /* Next Descriptor Size Offset 
*/
+#define DMAFLOW_LIST           0x00004000      /* Descriptor List Mode */
+#define DMAFLOW_ARRAY          0x00005000      /* Descriptor Array Mode */
+#define DMAFLOW_LIST_DEMAND    0x00006000      /* Descriptor Demand List Mode 
*/
+#define DMAFLOW_ARRAY_DEMAND   0x00007000      /* Descriptor Demand Array Mode 
*/
+#define DMA_RUN_DFETCH         0x00000100      /* DMA Channel Running 
Indicator (DFETCH) */
+#define DMA_RUN                        0x00000200      /* DMA Channel Running 
Indicator */
+#define DMA_RUN_WAIT_TRIG      0x00000300      /* DMA Channel Running 
Indicator (WAIT TRIG) */
+#define DMA_RUN_WAIT_ACK       0x00000400      /* DMA Channel Running 
Indicator (WAIT ACK) */
+
+#else
+
 #define WDSIZE_16              0x0004  /* Transfer Word Size = 16 */
 #define WDSIZE_32              0x0008  /* Transfer Word Size = 32 */
+#define PSIZE_16               WDSIZE_16
+#define PSIZE_32               WDSIZE_32
 #define DMA2D                  0x0010  /* DMA Mode (2D/1D*) */
 #define RESTART                        0x0020  /* DMA Buffer Clear */
 #define DI_SEL                 0x0040  /* Data Interrupt Timing Select */
@@ -26,8 +66,6 @@
 #define NDSIZE_7               0x0700  /* Next Descriptor Size = 7 */
 #define NDSIZE_8               0x0800  /* Next Descriptor Size = 8 */
 #define NDSIZE_9               0x0900  /* Next Descriptor Size = 9 */
-#define FLOW_STOP              0x0000  /* Stop Mode */
-#define FLOW_AUTO              0x1000  /* Autobuffer Mode */
 #define FLOW_ARRAY             0x4000  /* Descriptor Array Mode */
 #define FLOW_SMALL             0x6000  /* Small Model Descriptor List Mode */
 #define FLOW_LARGE             0x7000  /* Large Model Descriptor List Mode */
@@ -46,6 +84,11 @@
 #define DFETCH                 0x0004  /* DMA Descriptor Fetch Indicator */
 #define DMA_RUN                        0x0008  /* DMA Channel Running 
Indicator */
 
+#endif
+#define DMAFLOW                        0x7000  /* Flow Control */
+#define FLOW_STOP              0x0000  /* Stop Mode */
+#define FLOW_AUTO              0x1000  /* Autobuffer Mode */
+
 #define DMA_DONE_P             0       /* DMA Done Indicator */
 #define DMA_ERR_P              1       /* DMA Error Indicator */
 #define DFETCH_P               2       /* Descriptor Fetch Indicator */
diff --git a/arch/blackfin/include/asm/mach-common/bits/sdh.h 
b/arch/blackfin/include/asm/mach-common/bits/sdh.h
index 8c5dd33..3495558 100644
--- a/arch/blackfin/include/asm/mach-common/bits/sdh.h
+++ b/arch/blackfin/include/asm/mach-common/bits/sdh.h
@@ -12,18 +12,35 @@
 #define                 CMD_INT_E  0x100      /* Command Interrupt */
 #define                CMD_PEND_E  0x200      /* Command Pending */
 #define                     CMD_E  0x400      /* Command Enable */
+#ifdef RSI_BLKSZ
+#define           CMD_CRC_CHECK_D  0x800      /* CRC Check is disabled */
+#define            CMD_DATA0_BUSY  0x1000     /* Check for Busy State on the 
DATA0 pin */
+#endif
 
 /* Bit masks for SDH_PWR_CTL */
+#ifndef RSI_BLKSZ
 #define                    PWR_ON  0x3        /* Power On */
 #define                 SD_CMD_OD  0x40       /* Open Drain Output */
 #define                   ROD_CTL  0x80       /* Rod Control */
+#endif
 
 /* Bit masks for SDH_CLK_CTL */
 #define                    CLKDIV  0xff       /* MC_CLK Divisor */
 #define                     CLK_E  0x100      /* MC_CLK Bus Clock Enable */
 #define                  PWR_SV_E  0x200      /* Power Save Enable */
 #define             CLKDIV_BYPASS  0x400      /* Bypass Divisor */
-#define                  WIDE_BUS  0x800      /* Wide Bus Mode Enable */
+#define             BUS_MODE_MASK  0x1800     /* Bus Mode Mask */
+#define                 STD_BUS_1  0x000      /* Standard Bus 1 bit mode */
+#define                WIDE_BUS_4  0x800      /* Wide Bus 4 bit mode */
+#define                BYTE_BUS_8  0x1000     /* Byte Bus 8 bit mode */
+#ifdef RSI_BLKSZ
+#define            CARD_TYPE_MASK  0xe000     /* Card type mask */
+#define          CARD_TYPE_OFFSET  13         /* Card type offset */
+#define            CARD_TYPE_SDIO  0
+#define            CARD_TYPE_eMMC  1
+#define              CARD_TYPE_SD  2
+#define           CARD_TYPE_CEATA  3
+#endif
 
 /* Bit masks for SDH_RESP_CMD */
 #define                  RESP_CMD  0x3f       /* Response Command */
@@ -33,7 +50,13 @@
 #define                   DTX_DIR  0x2        /* Data Transfer Direction */
 #define                  DTX_MODE  0x4        /* Data Transfer Mode */
 #define                 DTX_DMA_E  0x8        /* Data Transfer DMA Enable */
+#ifndef RSI_BLKSZ
 #define              DTX_BLK_LGTH  0xf0       /* Data Transfer Block Length */
+#else
+
+/* Bit masks for SDH_BLK_SIZE */
+#define              DTX_BLK_LGTH  0x1fff     /* Data Transfer Block Length */
+#endif
 
 /* Bit masks for SDH_STATUS */
 #define              CMD_CRC_FAIL  0x1        /* CMD CRC Fail */
@@ -102,10 +125,13 @@
 /* Bit masks for SDH_E_STATUS */
 #define              SDIO_INT_DET  0x2        /* SDIO Int Detected */
 #define               SD_CARD_DET  0x10       /* SD Card Detect */
+#define          SD_CARD_BUSYMODE  0x80000000 /* Card is in Busy mode */
+#define           SD_CARD_SLPMODE  0x40000000 /* Card in Sleep Mode */
+#define             SD_CARD_READY  0x00020000 /* Card Ready */
 
 /* Bit masks for SDH_E_MASK */
 #define                  SDIO_MSK  0x2        /* Mask SDIO Int Detected */
-#define                   SCD_MSK  0x40       /* Mask Card Detect */
+#define                   SCD_MSK  0x10       /* Mask Card Detect */
 
 /* Bit masks for SDH_CFG */
 #define                   CLKS_EN  0x1        /* Clocks Enable */
@@ -114,7 +140,15 @@
 #define                    SD_RST  0x10       /* SDMMC Reset */
 #define                 PUP_SDDAT  0x20       /* Pull-up SD_DAT */
 #define                PUP_SDDAT3  0x40       /* Pull-up SD_DAT3 */
+#ifndef RSI_BLKSZ
 #define                 PD_SDDAT3  0x80       /* Pull-down SD_DAT3 */
+#else
+#define                    PWR_ON  0x600      /* Power On */
+#define                 SD_CMD_OD  0x800      /* Open Drain Output */
+#define                   BOOT_EN  0x1000     /* Boot Enable */
+#define                 BOOT_MODE  0x2000     /* Alternate Boot Mode */.
+#define               BOOT_ACK_EN  0x4000     /* Boot ACK is expected */
+#endif
 
 /* Bit masks for SDH_RD_WAIT_EN */
 #define                       RWR  0x1        /* Read Wait Request */
diff --git a/board/bf609-ezkit/bf609-ezkit.c b/board/bf609-ezkit/bf609-ezkit.c
index ceb2eb9..398a6b0 100644
--- a/board/bf609-ezkit/bf609-ezkit.c
+++ b/board/bf609-ezkit/bf609-ezkit.c
@@ -61,3 +61,10 @@ int board_eth_init(bd_t *bis)
        return ret;
 }
 #endif
+
+#ifdef CONFIG_BFIN_SDH
+int board_mmc_init(bd_t *bis)
+{
+       return bfin_mmc_init(bis);
+}
+#endif
diff --git a/drivers/mmc/bfin_sdh.c b/drivers/mmc/bfin_sdh.c
index 8d59d46..4dd9b78 100644
--- a/drivers/mmc/bfin_sdh.c
+++ b/drivers/mmc/bfin_sdh.c
@@ -19,9 +19,7 @@
 #include <asm/mach-common/bits/sdh.h>
 #include <asm/mach-common/bits/dma.h>
 
-#if defined(__ADSPBF50x__) || defined(__ADSPBF51x__)
-# define bfin_read_SDH_PWR_CTL         bfin_read_RSI_PWR_CONTROL
-# define bfin_write_SDH_PWR_CTL                bfin_write_RSI_PWR_CONTROL
+#if defined(__ADSPBF50x__) || defined(__ADSPBF51x__) || defined(__ADSPBF60x__)
 # define bfin_read_SDH_CLK_CTL         bfin_read_RSI_CLK_CONTROL
 # define bfin_write_SDH_CLK_CTL                bfin_write_RSI_CLK_CONTROL
 # define bfin_write_SDH_ARGUMENT       bfin_write_RSI_ARGUMENT
@@ -38,10 +36,21 @@
 # define bfin_write_SDH_STATUS_CLR     bfin_write_RSI_STATUSCL
 # define bfin_read_SDH_CFG             bfin_read_RSI_CONFIG
 # define bfin_write_SDH_CFG            bfin_write_RSI_CONFIG
+# if defined(__ADSPBF60x__)
+# define bfin_read_SDH_BLK_SIZE                bfin_read_RSI_BLKSZ
+# define bfin_write_SDH_BLK_SIZE       bfin_write_RSI_BLKSZ
+# define bfin_write_DMA_START_ADDR     bfin_write_DMA10_START_ADDR
+# define bfin_write_DMA_X_COUNT                bfin_write_DMA10_X_COUNT
+# define bfin_write_DMA_X_MODIFY       bfin_write_DMA10_X_MODIFY
+# define bfin_write_DMA_CONFIG         bfin_write_DMA10_CONFIG
+# else
+# define bfin_read_SDH_PWR_CTL         bfin_read_RSI_PWR_CONTROL
+# define bfin_write_SDH_PWR_CTL                bfin_write_RSI_PWR_CONTROL
 # define bfin_write_DMA_START_ADDR     bfin_write_DMA4_START_ADDR
 # define bfin_write_DMA_X_COUNT                bfin_write_DMA4_X_COUNT
 # define bfin_write_DMA_X_MODIFY       bfin_write_DMA4_X_MODIFY
 # define bfin_write_DMA_CONFIG         bfin_write_DMA4_CONFIG
+# endif
 # define PORTMUX_PINS \
        { P_RSI_DATA0, P_RSI_DATA1, P_RSI_DATA2, P_RSI_DATA3, P_RSI_CMD, 
P_RSI_CLK, 0 }
 #elif defined(__ADSPBF54x__)
@@ -119,10 +128,14 @@ static int sdh_setup_data(struct mmc *mmc, struct 
mmc_data *data)
        /* Don't support write yet. */
        if (data->flags & MMC_DATA_WRITE)
                return UNUSABLE_ERR;
+#ifndef RSI_BLKSZ
        data_ctl |= ((ffs(data_size) - 1) << 4);
+#else
+       bfin_write_SDH_BLK_SIZE(data_size);
+#endif
        data_ctl |= DTX_DIR;
        bfin_write_SDH_DATA_CTL(data_ctl);
-       dma_cfg = WDSIZE_32 | RESTART | WNR | DMAEN;
+       dma_cfg = WDSIZE_32 | PSIZE_32 | RESTART | WNR | DMAEN;
 
        bfin_write_SDH_DATA_TIMER(-1);
 
@@ -149,6 +162,8 @@ static int bfin_sdh_request(struct mmc *mmc, struct mmc_cmd 
*cmd,
 
        ret = sdh_send_cmd(mmc, cmd);
        if (ret) {
+               bfin_write_SDH_COMMAND(0);
+               SSYNC();
                printf("sending CMD%d failed\n", cmd->cmdidx);
                return ret;
        }
@@ -208,10 +223,12 @@ static void bfin_sdh_set_ios(struct mmc *mmc)
 
        if (mmc->bus_width == 4) {
                cfg = bfin_read_SDH_CFG();
-               cfg &= ~0x80;
-               cfg |= 0x40;
+#ifndef RSI_BLKSZ
+               cfg &= ~PD_SDDAT3;
+#endif
+               cfg |= PUP_SDDAT3;
                bfin_write_SDH_CFG(cfg);
-               clk_ctl |= WIDE_BUS;
+               clk_ctl |= WIDE_BUS_4;
        }
        bfin_write_SDH_CLK_CTL(clk_ctl);
        sdh_set_clk(mmc->clock);
@@ -220,20 +237,22 @@ static void bfin_sdh_set_ios(struct mmc *mmc)
 static int bfin_sdh_init(struct mmc *mmc)
 {
        const unsigned short pins[] = PORTMUX_PINS;
-       u16 pwr_ctl = 0;
+       int ret;
 
        /* Initialize sdh controller */
-       peripheral_request_list(pins, "bfin_sdh");
+       ret = peripheral_request_list(pins, "bfin_sdh");
+       if (ret < 0)
+               return ret;
 #if defined(__ADSPBF54x__)
        bfin_write_DMAC1_PERIMUX(bfin_read_DMAC1_PERIMUX() | 0x1);
 #endif
        bfin_write_SDH_CFG(bfin_read_SDH_CFG() | CLKS_EN);
        /* Disable card detect pin */
        bfin_write_SDH_CFG((bfin_read_SDH_CFG() & 0x1F) | 0x60);
-
-       pwr_ctl |= ROD_CTL;
-       pwr_ctl |= PWR_ON;
-       bfin_write_SDH_PWR_CTL(pwr_ctl);
+#ifndef RSI_BLKSZ
+       bfin_write_SDH_PWR_CTL(PWR_ON | ROD_CTL);
+#else
+       bfin_write_SDH_CFG(bfin_read_SDH_CFG() | PWR_ON);
        return 0;
 }
 
diff --git a/include/configs/bf609-ezkit.h b/include/configs/bf609-ezkit.h
index 1fc2a18..4dcfeca 100644
--- a/include/configs/bf609-ezkit.h
+++ b/include/configs/bf609-ezkit.h
@@ -72,7 +72,7 @@
 #define CONFIG_SMC_B1TIM_VAL   0x08070977
 #define CONFIG_SMC_B1ETIM_VAL  0x00092231
 
-#define CONFIG_SYS_MONITOR_LEN (256 * 1024)
+#define CONFIG_SYS_MONITOR_LEN (512 * 1024)
 #define CONFIG_SYS_MALLOC_LEN  (256 * 1024)
 
 /*
@@ -117,6 +117,13 @@
 #undef CONFIG_CMD_IMPORTENV
 
 /*
+ * SDH Settings
+ */
+#define CONFIG_GENERIC_MMC
+#define CONFIG_MMC
+#define CONFIG_BFIN_SDH
+
+/*
  * Misc Settings
  */
 #define CONFIG_BOARD_EARLY_INIT_F
-- 
1.7.9.5


_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to