update rk29 sdmmc
authorlhh <lhh@rock-chips.com>
Thu, 25 Nov 2010 14:24:36 +0000 (22:24 +0800)
committerlhh <lhh@rock-chips.com>
Thu, 25 Nov 2010 14:24:36 +0000 (22:24 +0800)
arch/arm/mach-rk29/board-rk29sdk.c
arch/arm/mach-rk29/include/mach/board.h
drivers/mmc/host/rk29_sdmmc.c

index 3fd347efa354d7ccc073b4448297b8f85252e187..e247da0c43276c83350ac538d483ca4d3e7bb83d 100644 (file)
@@ -439,13 +439,26 @@ static struct i2c_board_info __initdata board_i2c0_devices[] = {
 #ifdef CONFIG_I2C1_RK29\r
 static struct i2c_board_info __initdata board_i2c1_devices[] = {\r
 #if defined (CONFIG_RK1000_CONTROL1)\r
-               {\r
-                       .type                   = "rk1000_control",\r
-                       .addr                   = 0x40,\r
-                       .flags                  = 0,\r
-               },\r
+       {\r
+               .type                   = "rk1000_control",\r
+               .addr                   = 0x40,\r
+               .flags                  = 0,\r
+       },\r
+#endif\r
+#if defined (CONFIG_SENSORS_AK8973)\r
+       {\r
+               .type                   = "ak8973",\r
+               .addr           = 0x1c,\r
+               .flags                  = 0,\r
+       },\r
+#endif\r
+#if defined (CONFIG_SENSORS_AK8973)\r
+       {\r
+               .type                   = "ak8975",\r
+               .addr           = 0x1c,\r
+               .flags                  = 0,\r
+       },\r
 #endif\r
-\r
 };\r
 #endif\r
 \r
@@ -715,9 +728,8 @@ static int rk29_sdmmc0_cfg_gpio(void)
        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
-       .num_slots              = 1,\r
        .host_ocr_avail = (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
                                           MMC_VDD_33_34|MMC_VDD_34_35| MMC_VDD_35_36),\r
@@ -741,11 +753,11 @@ static int rk29_sdmmc1_cfg_gpio(void)
        rk29_mux_api_set(GPIO1C4_SDMMC1DATA1_NAME, GPIO1H_SDMMC1_DATA1);\r
        rk29_mux_api_set(GPIO1C5_SDMMC1DATA2_NAME, GPIO1H_SDMMC1_DATA2);\r
        rk29_mux_api_set(GPIO1C6_SDMMC1DATA3_NAME, GPIO1H_SDMMC1_DATA3);\r
+       rk29_mux_api_set(GPIO1C0_UART0CTSN_SDMMC1DETECTN_NAME, GPIO1H_SDMMC1_DETECT_N);\r
        return 0;\r
 }\r
 \r
 struct rk29_sdmmc_platform_data default_sdmmc1_data = {\r
-       .num_slots              = 1,\r
        .host_ocr_avail = (MMC_VDD_26_27|MMC_VDD_27_28|MMC_VDD_28_29|\r
                                           MMC_VDD_29_30|MMC_VDD_30_31|MMC_VDD_31_32|\r
                                           MMC_VDD_32_33|MMC_VDD_33_34),\r
index 31031a0c2a7c459e894046da6411949a9a68da46..87d598d19067c55db687e8e91983c26d5ece1614 100755 (executable)
@@ -78,7 +78,6 @@ struct rk29_bl_info{
 };
 
 struct rk29_sdmmc_platform_data {
-       unsigned int num_slots;
        unsigned int host_caps;
        unsigned int host_ocr_avail;
        unsigned int use_dma:1;
index 8d8ec2c19f43b2cc6ee838cee71eb36d83ae181f..edaefe2f639f2ec3b2776dd8d70edc4dc362e5a9 100644 (file)
@@ -389,7 +389,7 @@ static void rk29_sdmmc_dma_complete(void *arg, int size, enum rk29_dma_buffresul
 {
        struct rk29_sdmmc       *host = arg;
        struct mmc_data         *data = host->data;
-
+       printk("Enter:%s-----%d dma complete\n",__FUNCTION__,__LINE__);
        if(host->use_dma == 0)
                return;
        dev_vdbg(&host->pdev->dev, "DMA complete\n");
@@ -412,7 +412,7 @@ static void rk29_sdmmc_dma_complete(void *arg, int size, enum rk29_dma_buffresul
 static int rk29_sdmmc_submit_data_dma(struct rk29_sdmmc *host, struct mmc_data *data)
 {
        struct scatterlist              *sg;
-       unsigned int                    direction;
+       unsigned int                    i,direction;
 
        if(host->use_dma == 0)
                return -ENOSYS;
@@ -429,22 +429,20 @@ static int rk29_sdmmc_submit_data_dma(struct rk29_sdmmc *host, struct mmc_data *
                return -EINVAL;
        if (data->blksz & 3)
                return -EINVAL;
-
-       for_each_sg(data->sg, sg, data->sg_len, host->dma_chn) {
+       for_each_sg(data->sg, sg, data->sg_len, i) {
                if (sg->offset & 3 || sg->length & 3)
                        return -EINVAL;
        }
-
        if (data->flags & MMC_DATA_READ)
                direction = RK29_DMASRC_HW; 
        else
-               direction = RK29_DMASRC_MEM;  
+               direction = RK29_DMASRC_MEM;            
        dma_map_sg(&host->pdev->dev, data->sg, data->sg_len, 
-                       (data->flags & MMC_DATA_READ)? DMA_FROM_DEVICE : DMA_TO_DEVICE);
+                       (data->flags & MMC_DATA_READ)? DMA_FROM_DEVICE : DMA_TO_DEVICE);                                
     rk29_dma_devconfig(host->dma_chn, direction, (unsigned long )(host->regs+SDMMC_DATA));
     rk29_dma_enqueue(host->dma_chn, NULL, data->sg->dma_address, data->sg->length);    
        rk29_sdmmc_write(host->regs, SDMMC_CTRL, (rk29_sdmmc_read(host->regs, SDMMC_CTRL))|SDMMC_CTRL_DMA_ENABLE);// enable dma
-       rk29_dma_ctrl(host->dma_chn, RK29_DMAF_AUTOSTART);
+       rk29_dma_ctrl(host->dma_chn, RK29_DMAOP_START);
        printk("Enter:%s-----%d DMA DATA START\n",__FUNCTION__,__LINE__);
        return 0;
 }
@@ -1183,7 +1181,6 @@ static int rk29_sdmmc_probe(struct platform_device *pdev)
        if (!regs)
                return -ENXIO;
 
-
        irq = platform_get_irq(pdev, 0);
        if (irq < 0)
                return irq;
@@ -1209,14 +1206,18 @@ static int rk29_sdmmc_probe(struct platform_device *pdev)
        host->regs = ioremap(regs->start, regs->end - regs->start);
        if (!host->regs)
            goto err_freemap;   
+       memcpy(host->dma_name, pdata->dma_name, 8);    
        host->use_dma = pdata->use_dma;     
        if(host->use_dma){
-               if(strncmp(host->dma_name, "sdio", strlen("sdio")) == 1)
-                       host->dma_chn = rk29_dma_request(DMACH_SDIO, &rk29_dma_sdio1_client, NULL);
-               if(strncmp(host->dma_name, "sd_mmc", strlen("sd_mmc")) == 1)    
-                       host->dma_chn = rk29_dma_request(DMACH_SDMMC, &rk29_dma_sdmmc0_client, NULL);
+               if(strncmp(host->dma_name, "sdio", strlen("sdio")) == 0){
+                       rk29_dma_request(DMACH_SDIO, &rk29_dma_sdio1_client, NULL);
+                       host->dma_chn = DMACH_SDIO;
+               }
+               if(strncmp(host->dma_name, "sd_mmc", strlen("sd_mmc")) == 0){   
+                       rk29_dma_request(DMACH_SDMMC, &rk29_dma_sdmmc0_client, NULL);
+                       host->dma_chn = DMACH_SDMMC;
+               }       
                rk29_dma_config(host->dma_chn, 16);
-               rk29_dma_setflags(host->dma_chn, RK29_DMAF_AUTOSTART);
                rk29_dma_set_buffdone_fn(host->dma_chn, rk29_sdmmc_dma_complete);       
        }
        host->bus_hz = 25000000;  ////cgu_get_clk_freq(CGU_SB_SD_MMC_CCLK_IN_ID); 
@@ -1246,8 +1247,7 @@ static int rk29_sdmmc_probe(struct platform_device *pdev)
        if (ret)
            goto err_dmaunmap;
 
-       platform_set_drvdata(pdev, host); 
-       memcpy(host->dma_name, pdata->dma_name, 8);
+       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/20; //max f is clock to mmc_clk/2
@@ -1282,13 +1282,12 @@ static int rk29_sdmmc_probe(struct platform_device *pdev)
        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:
        if(host->use_dma){
-               if(strncmp(host->dma_name, "sdio", strlen("sdio")) == 1)
+               if(strncmp(host->dma_name, "sdio", strlen("sdio")) == 0)
                        rk29_dma_free(DMACH_SDIO, &rk29_dma_sdio1_client);
-               if(strncmp(host->dma_name, "sd_mmc", strlen("sd_mmc")) == 1)    
+               if(strncmp(host->dma_name, "sd_mmc", strlen("sd_mmc")) == 0)    
                        rk29_dma_free(DMACH_SDMMC, &rk29_dma_sdmmc0_client);
        }
 err_freemap:
@@ -1322,9 +1321,9 @@ static int __exit rk29_sdmmc_remove(struct platform_device *pdev)
        
        free_irq(platform_get_irq(pdev, 0), host);
        if(host->use_dma){
-               if(strncmp(host->dma_name, "sdio", strlen("sdio")) == 1)
+               if(strncmp(host->dma_name, "sdio", strlen("sdio")) == 0)
                        rk29_dma_free(DMACH_SDIO, &rk29_dma_sdio1_client);
-               if(strncmp(host->dma_name, "sd_mmc", strlen("sd_mmc")) == 1)    
+               if(strncmp(host->dma_name, "sd_mmc", strlen("sd_mmc")) == 0)    
                        rk29_dma_free(DMACH_SDMMC, &rk29_dma_sdmmc0_client);
        }
        iounmap(host->regs);