rk29_mux_api_set(GPIO2A2_SDMMC0DETECTN_NAME, GPIO2L_SDMMC0_DETECT_N); \r
rk29_mux_api_set(GPIO5D5_SDMMC0PWREN_NAME, GPIO5H_GPIO5D5); ///GPIO5H_SDMMC0_PWR_EN); ///GPIO5H_GPIO5D5);\r
gpio_request(RK29_PIN5_PD5,"sdmmc");\r
- //gpio_set_value(RK29_PIN5_PD5,GPIO_HIGH);\r
- //mdelay(100);\r
+ gpio_set_value(RK29_PIN5_PD5,GPIO_HIGH);\r
+ mdelay(100);\r
gpio_set_value(RK29_PIN5_PD5,GPIO_LOW);\r
return 0;\r
}\r
\r
-//#define CONFIG_SDMMC0_USE_DMA\r
+#define CONFIG_SDMMC0_USE_DMA\r
struct rk29_sdmmc_platform_data default_sdmmc0_data = {\r
.host_ocr_avail = (MMC_VDD_25_26|MMC_VDD_26_27|MMC_VDD_27_28|MMC_VDD_28_29|MMC_VDD_29_30|\r
MMC_VDD_30_31|MMC_VDD_31_32|MMC_VDD_32_33|\r
static void __init machine_rk29_board_init(void)\r
{\r
rk29_board_iomux_init();\r
-\r
+ gpio_request(POWER_ON_PIN,"poweronpin"); \r
gpio_set_value(POWER_ON_PIN, 1);\r
gpio_direction_output(POWER_ON_PIN, 1);\r
return;
dev_vdbg(&host->pdev->dev, "DMA complete\n");
if(result != RK29_RES_OK)
- printk("%s: sdio dma complete err\n",__FUNCTION__);
+ printk("%s: sdio dma complete err\n",__FUNCTION__);
spin_lock(&host->lock);
rk29_sdmmc_dma_cleanup(host);
-
/*
* If the card was removed, data will be NULL. No point trying
* to send the stop command or waiting for NBUSY in this case.
struct mmc_command *cmd;
struct mmc_data *data;
u32 cmdflags;
-
+ int time_out =60;
+ unsigned long flags;
+
mrq = host->mrq;
+ /*µÈ´ýÇ°Ãæ´«Êä´¦ÀíÍê³É*/
+ while(rk29_sdmmc_read(host->regs, SDMMC_STATUS) & (SDMMC_STAUTS_DATA_BUSY)) {
+ mdelay(5);
+ time_out --;
+ if(!time_out){
+ time_out =60;
+ local_irq_save(flags);
+ rk29_sdmmc_write( host->regs, SDMMC_CTRL, rk29_sdmmc_read(host->regs, SDMMC_CTRL) | ( SDMMC_CTRL_FIFO_RESET ));
+ /* wait till resets clear */
+ while (rk29_sdmmc_read(host->regs, SDMMC_CTRL) & ( SDMMC_CTRL_FIFO_RESET));
+ local_irq_restore(flags);
+ }
+ }
+ /*¼ì²éFIFO,Èç¹û²»Îª¿Õ£¬Çå¿Õ*/
+ if(!(rk29_sdmmc_read(host->regs, SDMMC_STATUS) & SDMMC_STAUTS_FIFO_EMPTY)) {
+ local_irq_save(flags);
+ rk29_sdmmc_write(host->regs, SDMMC_CTRL, rk29_sdmmc_read(host->regs, SDMMC_CTRL) | ( SDMMC_CTRL_FIFO_RESET ));
+ /* wait till resets clear */
+ while (readl(host->regs + SDMMC_CTRL) & ( SDMMC_CTRL_FIFO_RESET));
+ local_irq_restore(flags);
+ }
/* Slot specific timing and width adjustment */
rk29_sdmmc_setup_bus(host);
host->curr_mrq = mrq;
__acquires(&host->lock)
{
struct mmc_host *prev_mmc = host->mmc;
+ unsigned long flags;
+ int time_out =60;
WARN_ON(host->cmd || host->data);
host->curr_mrq = NULL;
host->mrq = NULL;
+ /*µÈ´ýÇ°Ãæ´«Êä´¦ÀíÍê³É*/
+ while(rk29_sdmmc_read(host->regs, SDMMC_STATUS) & (SDMMC_STAUTS_DATA_BUSY)) {
+ mdelay(5);
+ time_out --;
+ if(!time_out){
+ time_out =60;
+ local_irq_save(flags);
+ rk29_sdmmc_write( host->regs, SDMMC_CTRL, rk29_sdmmc_read(host->regs, SDMMC_CTRL) | ( SDMMC_CTRL_FIFO_RESET ));
+ /* wait till resets clear */
+ while (rk29_sdmmc_read(host->regs, SDMMC_CTRL) & ( SDMMC_CTRL_FIFO_RESET));
+ local_irq_restore(flags);
+ }
+ }
+ /*¼ì²éFIFO,Èç¹û²»Îª¿Õ£¬Çå¿Õ*/
+ if(!(rk29_sdmmc_read(host->regs, SDMMC_STATUS) & SDMMC_STAUTS_FIFO_EMPTY)) {
+ local_irq_save(flags);
+ rk29_sdmmc_write(host->regs, SDMMC_CTRL, rk29_sdmmc_read(host->regs, SDMMC_CTRL) | ( SDMMC_CTRL_FIFO_RESET ));
+ /* wait till resets clear */
+ while (readl(host->regs + SDMMC_CTRL) & ( SDMMC_CTRL_FIFO_RESET));
+ local_irq_restore(flags);
+ }
if (!list_empty(&host->queue)) {
host = list_entry(host->queue.next,
struct rk29_sdmmc, queue_node);
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/4; //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;
rk29_sdmmc_write(host->regs, SDMMC_INTMASK,SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | SDMMC_INT_TXDR | SDMMC_INT_RXDR | RK29_SDMMC_ERROR_FLAGS | SDMMC_INT_CD);
rk29_sdmmc_write(host->regs, SDMMC_CTRL,SDMMC_CTRL_INT_ENABLE); // enable mci interrupt
rk29_sdmmc_write(host->regs, SDMMC_CLKENA,1);
- ///rk29_sdmmc_write(host->regs, SDMMC_CLKDIV,2);
dev_info(&pdev->dev, "RK29 SDMMC controller at irq %d\n", irq);
return 0;
err_dmaunmap: