del i2c-boardinfo printk and open sdmmc dma
authorlhh <lhh@rock-chips.com>
Thu, 9 Dec 2010 13:22:10 +0000 (21:22 +0800)
committerlhh <lhh@rock-chips.com>
Thu, 9 Dec 2010 13:22:10 +0000 (21:22 +0800)
arch/arm/mach-rk29/board-rk29sdk.c
drivers/i2c/i2c-boardinfo.c
drivers/mmc/host/rk29_sdmmc.c

index 61f83fe9f75fda593a5c079ab0f20b15eaa52756..5d865fd3611cc6854a41ab150417a72efce3eead 100755 (executable)
@@ -740,13 +740,13 @@ static int rk29_sdmmc0_cfg_gpio(void)
        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
@@ -1294,7 +1294,7 @@ static void __init machine_rk29_init_irq(void)
 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
 
index 837f97d88d9dddbaadeb53fbec97eaef0568ffa4..a3517e957dc5deec1249119288cd98e11a3e39a1 100755 (executable)
@@ -65,7 +65,6 @@ i2c_register_board_info(int busnum,
        int status;
 
        down_write(&__i2c_board_lock);
-       printk("busnum = %d, len = %d>>>>>>>>>>>>>>>>>>\n", busnum, len);
        /* dynamic bus numbers will be assigned after the last static one */
        if (busnum >= __i2c_first_dynamic_bus_num)
                __i2c_first_dynamic_bus_num = busnum + 1;
@@ -82,7 +81,6 @@ i2c_register_board_info(int busnum,
 
                devinfo->busnum = busnum;
                devinfo->board_info = *info;
-               printk("busnum = %d>>>>>>>>>>>>>>>>>>\n", busnum);
                list_add_tail(&devinfo->list, &__i2c_board_list);
        }
 
index e287e316354e0a19ce632883d5fbf3fc78140f45..a1a26b9b74cd7550e4514154523cbf3dedb0723b 100755 (executable)
@@ -396,10 +396,9 @@ static void rk29_sdmmc_dma_complete(void *arg, int size, enum rk29_dma_buffresul
                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.
@@ -521,8 +520,31 @@ static void rk29_sdmmc_start_request(struct rk29_sdmmc *host)
        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;
@@ -663,10 +685,33 @@ static void rk29_sdmmc_request_end(struct rk29_sdmmc *host, struct mmc_request *
        __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);
@@ -1312,7 +1357,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/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;
@@ -1339,7 +1384,6 @@ static int rk29_sdmmc_probe(struct platform_device *pdev)
        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: