From 8ae483f0b9d16a70a09f46bc7d114087c6cce383 Mon Sep 17 00:00:00 2001 From: lhh Date: Thu, 9 Dec 2010 10:53:06 +0800 Subject: [PATCH] update rk29 sdmmc --- arch/arm/mach-rk29/board-rk29sdk.c | 10 +++++++--- drivers/mmc/host/rk29_sdmmc.c | 17 +++++++++-------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/arch/arm/mach-rk29/board-rk29sdk.c b/arch/arm/mach-rk29/board-rk29sdk.c index 37035443ef12..d3ed7b226f1b 100755 --- a/arch/arm/mach-rk29/board-rk29sdk.c +++ b/arch/arm/mach-rk29/board-rk29sdk.c @@ -736,12 +736,16 @@ static int rk29_sdmmc0_cfg_gpio(void) rk29_mux_api_set(GPIO1D3_SDMMC0DATA1_NAME, GPIO1H_SDMMC0_DATA1); rk29_mux_api_set(GPIO1D4_SDMMC0DATA2_NAME, GPIO1H_SDMMC0_DATA2); rk29_mux_api_set(GPIO1D5_SDMMC0DATA3_NAME, GPIO1H_SDMMC0_DATA3); - rk29_mux_api_set(GPIO2A2_SDMMC0DETECTN_NAME, GPIO2L_SDMMC0_DETECT_N); - rk29_mux_api_set(GPIO5D5_SDMMC0PWREN_NAME, GPIO5H_GPIO5D5); + rk29_mux_api_set(GPIO2A2_SDMMC0DETECTN_NAME, GPIO2L_SDMMC0_DETECT_N); + rk29_mux_api_set(GPIO5D5_SDMMC0PWREN_NAME, GPIO5H_GPIO5D5); ///GPIO5H_SDMMC0_PWR_EN); ///GPIO5H_GPIO5D5); + gpio_request(RK29_PIN5_PD5,"sdmmc"); + //gpio_set_value(RK29_PIN5_PD5,GPIO_HIGH); + //mdelay(100); + gpio_set_value(RK29_PIN5_PD5,GPIO_LOW); return 0; } -#define CONFIG_SDMMC0_USE_DMA +//#define CONFIG_SDMMC0_USE_DMA struct rk29_sdmmc_platform_data default_sdmmc0_data = { .host_ocr_avail = (MMC_VDD_25_26|MMC_VDD_26_27|MMC_VDD_27_28|MMC_VDD_28_29|MMC_VDD_29_30| MMC_VDD_30_31|MMC_VDD_31_32|MMC_VDD_32_33| diff --git a/drivers/mmc/host/rk29_sdmmc.c b/drivers/mmc/host/rk29_sdmmc.c index 65e8c1f346e0..28360d3016bd 100644 --- a/drivers/mmc/host/rk29_sdmmc.c +++ b/drivers/mmc/host/rk29_sdmmc.c @@ -413,6 +413,7 @@ static int rk29_sdmmc_submit_data_dma(struct rk29_sdmmc *host, struct mmc_data * struct scatterlist *sg; unsigned int i,direction; int dma_len=0; + if(host->use_dma == 0) return -ENOSYS; /* If we don't have a channel, we can't do DMA */ @@ -435,8 +436,7 @@ static int rk29_sdmmc_submit_data_dma(struct rk29_sdmmc *host, struct mmc_data * if (data->flags & MMC_DATA_READ) direction = RK29_DMASRC_HW; else - direction = RK29_DMASRC_MEM; - + direction = RK29_DMASRC_MEM; rk29_dma_devconfig(host->dma_chn, direction, (unsigned long )(host->dma_addr)); rk29_dma_ctrl(host->dma_chn, RK29_DMAOP_FLUSH); dma_len = dma_map_sg(&host->pdev->dev, data->sg, data->sg_len, @@ -754,7 +754,7 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv) case STATE_IDLE: break; - case STATE_SENDING_CMD: + case STATE_SENDING_CMD: if (!rk29_sdmmc_test_and_clear_pending(host, EVENT_CMD_COMPLETE)) break; @@ -1128,7 +1128,7 @@ static void rk29_sdmmc_detect_change(unsigned long data) /* FIFO threshold settings */ rk29_sdmmc_write(host->regs, SDMMC_FIFOTH, ((0x3 << 28) | (0x0f << 16) | (0x10 << 0))); // RXMark = 15, TXMark = 16, DMA Size = 16 rk29_sdmmc_write(host->regs, SDMMC_PWREN, 1); - rk29_sdmmc_write(host->regs, SDMMC_CTRL, SDMMC_CTRL_INT_ENABLE); + rk29_sdmmc_write(host->regs, SDMMC_CTRL, rk29_sdmmc_read(host->regs, SDMMC_CTRL) | SDMMC_CTRL_INT_ENABLE); host->data = NULL; host->cmd = NULL; @@ -1223,12 +1223,13 @@ static int rk29_sdmmc_probe(struct platform_device *pdev) rk29_dma_config(host->dma_chn, 16); rk29_dma_set_buffdone_fn(host->dma_chn, rk29_sdmmc_dma_complete); host->dma_addr = regs->start + SDMMC_DATA; - } - clk_set_rate(host->clk,52000000); + } host->clk = clk_get(&pdev->dev, "sdmmc"); + clk_set_rate(host->clk,52000000); clk_enable(host->clk); clk_enable(clk_get(&pdev->dev, "sdmmc_ahb")); host->bus_hz = clk_get_rate(host->clk); ///40000000; ////cgu_get_clk_freq(CGU_SB_SD_MMC_CCLK_IN_ID); + printk("Enter:%s %d host->bus_hz =%d\n",__FUNCTION__,__LINE__,host->bus_hz); /* reset all blocks */ rk29_sdmmc_write(host->regs, SDMMC_CTRL,(SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET | SDMMC_CTRL_DMA_RESET)); @@ -1253,7 +1254,7 @@ static int rk29_sdmmc_probe(struct platform_device *pdev) platform_set_drvdata(pdev, host); mmc->ops = &rk29_sdmmc_ops[pdev->id]; mmc->f_min = host->bus_hz/510; - mmc->f_max = host->bus_hz/10; //2; ///20; //max f is clock to mmc_clk/2 + mmc->f_max = host->bus_hz/2; //2; ///20; //max f is clock to mmc_clk/2 mmc->ocr_avail = pdata->host_ocr_avail; mmc->caps = pdata->host_caps; mmc->max_phys_segs = 64; @@ -1375,4 +1376,4 @@ module_exit(rk29_sdmmc_exit); MODULE_DESCRIPTION("Rk29 Multimedia Card Interface driver"); MODULE_AUTHOR("Rockchips"); MODULE_LICENSE("GPL v2"); - \ No newline at end of file + -- 2.34.1