1 /* drivers/mmc/host/rk29_sdmmc.c
3 * Copyright (C) 2010 ROCKCHIP, Inc.
5 * This software is licensed under the terms of the GNU General Public
6 * License version 2, as published by the Free Software Foundation, and
7 * may be copied, distributed, and modified under those terms.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * mount -t debugfs debugfs /data/debugfs;cat /data/debugfs/mmc0/status
15 * echo 't' >/proc/sysrq-trigger
16 * echo 19 >/sys/module/wakelock/parameters/debug_mask
17 * vdc volume uevent on
20 #include <linux/blkdev.h>
21 #include <linux/clk.h>
22 #include <linux/debugfs.h>
23 #include <linux/device.h>
24 #include <linux/dma-mapping.h>
25 #include <linux/err.h>
26 #include <linux/init.h>
27 #include <linux/interrupt.h>
28 #include <linux/ioport.h>
29 #include <linux/module.h>
30 #include <linux/platform_device.h>
31 #include <linux/scatterlist.h>
32 #include <linux/seq_file.h>
33 #include <linux/stat.h>
34 #include <linux/delay.h>
35 #include <linux/irq.h>
36 #include <linux/slab.h>
37 #include <linux/version.h>
38 #include <linux/mmc/host.h>
39 #include <linux/mmc/mmc.h>
40 #include <linux/mmc/card.h>
42 #include <mach/board.h>
43 #include <mach/rk29_iomap.h>
44 #include <mach/gpio.h>
45 #include <mach/iomux.h>
48 #include <mach/rk29-dma-pl330.h>
49 #include <asm/scatterlist.h>
51 #include "rk29_sdmmc.h"
54 #define RK29_SDMMC_xbw_Debug 0
56 #if RK29_SDMMC_xbw_Debug
58 #define xbwprintk(n, format, arg...) \
59 if (n <= debug_level) { \
60 printk(format,##arg); \
63 #define xbwprintk(n, arg...)
66 #define RK29_SDMMC_ERROR_FLAGS (SDMMC_INT_FRUN | SDMMC_INT_HLE )
68 #define RK29_SDMMC_INTMASK_USEDMA (SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS | SDMMC_INT_CD)
69 #define RK29_SDMMC_INTMASK_USEIO (SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS | SDMMC_INT_CD| SDMMC_INT_TXDR | SDMMC_INT_RXDR )
72 #define RK29_SDMMC_SEND_START_TIMEOUT 3000 //The time interval from the time SEND_CMD to START_CMD_BIT cleared.
73 #define RK29_ERROR_PRINTK_INTERVAL 200 //The time interval between the two printk for the same error.
74 #define RK29_SDMMC_WAIT_DTO_INTERNVAL 4500 //The time interval from the CMD_DONE_INT to DTO_INT
75 #define RK29_SDMMC_REMOVAL_DELAY 2000 //The time interval from the CD_INT to detect_timer react.
77 #define RK29_SDMMC_VERSION "Ver.2.13 The last modify date is 2011-10-19,modifyed by XBW."
79 #if !defined(CONFIG_USE_SDMMC0_FOR_WIFI_DEVELOP_BOARD)
80 #define RK29_CTRL_SDMMC_ID 0 //mainly used by SDMMC
81 #define RK29_CTRL_SDIO1_ID 1 //mainly used by sdio-wifi
82 #define RK29_CTRL_SDIO2_ID 2 //mainly used by sdio-card
84 #define RK29_CTRL_SDMMC_ID 5
85 #define RK29_CTRL_SDIO1_ID 1
86 #define RK29_CTRL_SDIO2_ID 2
89 #define RK29_SDMMC_NOTIFY_REMOVE_INSERTION /* use sysfs to notify the removal or insertion of sd-card*/
90 //#define RK29_SDMMC_LIST_QUEUE /* use list-queue for multi-card*/
92 #define RK29_SDMMC_DEFAULT_SDIO_FREQ 0 // 1--run in default frequency(50Mhz); 0---run in 25Mhz,
93 #define RK29_MAX_SDIO_FREQ 25000000 //set max-sdio-frequency 25Mhz at the present time¡£
96 EVENT_CMD_COMPLETE = 0,
102 enum rk29_sdmmc_state {
109 struct rk29_sdmmc_dma_info {
112 struct rk29_dma_client client;
115 static struct rk29_sdmmc_dma_info rk29_sdmmc_dma_infos[]= {
119 .name = "rk29-dma-sdmmc0",
125 .name = "rk29-dma-sdio1",
132 .name = "rk29-dma-sdio2",
138 /* Interrupt Information */
139 typedef struct TagSDC_INT_INFO
141 u32 transLen; //the length of data sent.
142 u32 desLen; //the total length of the all data.
143 u32 *pBuf; //the data buffer for interrupt read or write.
152 struct mmc_request *mrq;
153 struct mmc_request *new_mrq;
154 struct mmc_command *cmd;
155 struct mmc_data *data;
157 dma_addr_t dma_addr;;
158 unsigned int use_dma:1;
165 u32 cmdr; //the value setted into command-register
166 u32 dodma; //sign the DMA used for transfer.
167 u32 errorstep;//record the error point.
169 SDC_INT_INFO_T intInfo;
170 struct rk29_sdmmc_dma_info dma_info;
175 struct tasklet_struct tasklet;
176 unsigned long pending_events;
177 unsigned long completed_events;
178 enum rk29_sdmmc_state state;
180 #ifdef RK29_SDMMC_LIST_QUEUE
181 struct list_head queue;
182 struct list_head queue_node;
186 struct platform_device *pdev;
187 struct mmc_host *mmc;
192 #define RK29_SDMMC_CARD_PRESENT 0
196 struct timer_list detect_timer;
197 struct timer_list request_timer; //the timer for INT_CMD_DONE
198 struct timer_list DTO_timer; //the timer for INT_DTO
199 struct mmc_command stopcmd;
201 /* flag for current bus settings */
204 unsigned int oldstatus;
205 unsigned int complete_done;
206 unsigned int retryfunc;
213 #if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) || defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT)
217 void (*set_iomux)(int device_id, unsigned int bus_width);
222 #ifdef RK29_SDMMC_NOTIFY_REMOVE_INSERTION
223 static struct rk29_sdmmc *globalSDhost[3];
226 #define rk29_sdmmc_test_and_clear_pending(host, event) \
227 test_and_clear_bit(event, &host->pending_events)
228 #define rk29_sdmmc_test_pending(host, event) \
229 test_bit(event, &host->pending_events)
230 #define rk29_sdmmc_set_completed(host, event) \
231 set_bit(event, &host->completed_events)
233 #define rk29_sdmmc_set_pending(host, event) \
234 set_bit(event, &host->pending_events)
236 static void rk29_sdmmc_start_error(struct rk29_sdmmc *host);
237 static int rk29_sdmmc_clear_fifo(struct rk29_sdmmc *host);
238 int rk29_sdmmc_hw_init(void *data);
240 static void rk29_sdmmc_write(unsigned char __iomem *regbase, unsigned int regOff,unsigned int val)
242 __raw_writel(val,regbase + regOff);
245 static unsigned int rk29_sdmmc_read(unsigned char __iomem *regbase, unsigned int regOff)
247 return __raw_readl(regbase + regOff);
250 static int rk29_sdmmc_regs_printk(struct rk29_sdmmc *host)
252 printk("SDMMC_CTRL: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CTRL));
253 printk("SDMMC_PWREN: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_PWREN));
254 printk("SDMMC_CLKDIV: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKDIV));
255 printk("SDMMC_CLKSRC: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKSRC));
256 printk("SDMMC_CLKENA: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKENA));
257 printk("SDMMC_TMOUT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TMOUT));
258 printk("SDMMC_CTYPE: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CTYPE));
259 printk("SDMMC_BLKSIZ: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_BLKSIZ));
260 printk("SDMMC_BYTCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_BYTCNT));
261 printk("SDMMC_INTMASK:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_INTMASK));
262 printk("SDMMC_CMDARG: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CMDARG));
263 printk("SDMMC_CMD: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CMD));
264 printk("SDMMC_RESP0: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP0));
265 printk("SDMMC_RESP1: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP1));
266 printk("SDMMC_RESP2: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP2));
267 printk("SDMMC_RESP3: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP3));
268 printk("SDMMC_MINTSTS:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_MINTSTS));
269 printk("SDMMC_RINTSTS:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RINTSTS));
270 printk("SDMMC_STATUS: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_STATUS));
271 printk("SDMMC_FIFOTH: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_FIFOTH));
272 printk("SDMMC_CDETECT:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CDETECT));
273 printk("SDMMC_WRTPRT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_WRTPRT));
274 printk("SDMMC_TCBCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TCBCNT));
275 printk("SDMMC_TBBCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TBBCNT));
276 printk("SDMMC_DEBNCE: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_DEBNCE));
277 printk("=======printk %s-register end =========\n", host->dma_name);
282 #ifdef RK29_SDMMC_NOTIFY_REMOVE_INSERTION
283 ssize_t rk29_sdmmc_progress_store(struct kobject *kobj, struct kobj_attribute *attr,
284 const char *buf, size_t count)
286 struct rk29_sdmmc *host = NULL;
287 static u32 unmounting_times = 0;
288 static char oldbuf[64];
290 if( !strncmp(buf,"version" , strlen("version")))
292 printk("\n The driver SDMMC named 'rk29_sdmmc.c' is %s. ==xbw==\n", RK29_SDMMC_VERSION);
296 spin_lock(&host->lock);
298 //envalue the address of host base on input-parameter.
299 if( !strncmp(buf,"sd-" , strlen("sd-")) )
301 host = (struct rk29_sdmmc *)globalSDhost[0];
304 printk("%s..%d.. fail to call progress_store because the host is null. ==xbw==\n",__FUNCTION__,__LINE__);
305 goto progress_store_out;
308 else if( !strncmp(buf,"sdio1-" , strlen("sdio1-")) )
310 host = (struct rk29_sdmmc *)globalSDhost[RK29_CTRL_SDIO1_ID];
313 printk("%s..%d.. fail to call progress_store because the host-sdio1 is null. ==xbw==\n",__FUNCTION__,__LINE__);
314 goto progress_store_out;
317 else if( !strncmp(buf,"sdio2-" , strlen("sdio2-")) )
319 host = (struct rk29_sdmmc *)globalSDhost[RK29_CTRL_SDIO2_ID];
322 printk("%s..%d.. fail to call progress_store because the host-sdio2 is null. ==xbw==\n",__FUNCTION__,__LINE__);
323 goto progress_store_out;
328 printk("%s..%d.. You want to use sysfs for SDMMC but input-parameter is wrong.====xbw====\n",__FUNCTION__,__LINE__);
329 goto progress_store_out;//return count;
332 if(strncmp(buf,oldbuf , strlen(buf)))
334 printk(".%d.. MMC0 receive the message %s from VOLD.====xbw[%s]====\n", __LINE__, buf, host->dma_name);
339 * //deal with the message
340 * insert card state-change: No-Media ==> Pending ==> Idle-Unmounted ==> Checking ==>Mounted
341 * remove card state-change: Unmounting ==> Idle-Unmounted ==> No-Media
343 #if !defined(CONFIG_USE_SDMMC0_FOR_WIFI_DEVELOP_BOARD)
344 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
346 if(!strncmp(buf, "sd-Unmounting", strlen("sd-Unmounting")))
348 if(unmounting_times++%10 == 0)
350 printk(".%d.. MMC0 receive the message Unmounting(waitTimes=%d) from VOLD.====xbw[%s]====\n", \
351 __LINE__, unmounting_times, host->dma_name);
353 host->mmc->re_initialized_flags = 0;
354 mod_timer(&host->detect_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_REMOVAL_DELAY*2));
356 else if( !strncmp(buf, "sd-No-Media", strlen("sd-No-Media")))
358 printk(".%d.. MMC0 receive the message No-Media from VOLD. waitTimes=%d ====xbw[%s]====\n" ,\
359 __LINE__,unmounting_times, host->dma_name);
361 del_timer_sync(&host->detect_timer);
362 host->mmc->re_initialized_flags = 1;
363 unmounting_times = 0;
365 if(test_bit(RK29_SDMMC_CARD_PRESENT, &host->flags))
367 mmc_detect_change(host->mmc, 0);
370 else if( !strncmp(buf, "sd-Ready", strlen("sd-Ready")))
372 printk(".%d.. MMC0 receive the message Ready(ReInitFlag=%d) from VOLD. waitTimes=%d====xbw[%s]====\n" ,\
373 __LINE__, host->mmc->re_initialized_flags, unmounting_times, host->dma_name);
375 unmounting_times = 0;
376 host->mmc->re_initialized_flags = 1;
378 else if( !strncmp(buf,"sd-reset" , strlen("sd-reset")) )
380 printk(".%d.. Now manual reset for SDMMC0. ====xbw[%s]====\n",__LINE__, host->dma_name);
381 rk29_sdmmc_hw_init(host);
382 mmc_detect_change(host->mmc, 0);
384 else if( !strncmp(buf, "sd-regs", strlen("sd-regs")))
386 printk(".%d.. Now printk the register of SDMMC0. ====xbw[%s]====\n",__LINE__, host->dma_name);
387 rk29_sdmmc_regs_printk(host);
392 if(0 == host->pdev->id)
394 if( !strncmp(buf,"sd-reset" , strlen("sd-reset")) )
396 printk(".%d.. Now manual reset for SDMMC0. ====xbw[%s]====\n",__LINE__, host->dma_name);
397 rk29_sdmmc_hw_init(host);
398 mmc_detect_change(host->mmc, 0);
400 else if( !strncmp(buf, "sd-regs", strlen("sd-regs")))
402 printk(".%d.. Now printk the register of SDMMC0. ====xbw[%s]====\n",__LINE__, host->dma_name);
403 rk29_sdmmc_regs_printk(host);
407 else if(RK29_CTRL_SDIO1_ID == host->pdev->id)
409 if( !strncmp(buf, "sdio1-regs", strlen("sdio1-regs")))
411 printk(".%d.. Now printk the register of SDMMC1. ====xbw[%s]====\n",__LINE__, host->dma_name);
412 rk29_sdmmc_regs_printk(host);
414 else if( !strncmp(buf,"sdio1-reset" , strlen("sdio1-reset")) )
416 printk(".%d.. Now manual reset for SDMMC1. ====xbw[%s]====\n",__LINE__, host->dma_name);
417 rk29_sdmmc_hw_init(host);
418 mmc_detect_change(host->mmc, 0);
421 else if(RK29_CTRL_SDIO2_ID == host->pdev->id)
423 if( !strncmp(buf, "sdio2-regs", strlen("sdio2-regs")))
425 printk(".%d.. Now printk the register of SDMMC2. ====xbw[%s]====\n",__LINE__, host->dma_name);
426 rk29_sdmmc_regs_printk(host);
428 else if( !strncmp(buf,"sdio2-reset" , strlen("sdio2-reset")) )
430 printk(".%d.. Now manual reset for SDMMC2. ====xbw[%s]====\n",__LINE__, host->dma_name);
431 rk29_sdmmc_hw_init(host);
432 mmc_detect_change(host->mmc, 0);
437 spin_unlock(&host->lock);
444 struct kobj_attribute mmc_reset_attrs =
450 .store = rk29_sdmmc_progress_store,
452 struct attribute *mmc_attrs[] =
454 &mmc_reset_attrs.attr,
458 static struct kobj_type mmc_kset_ktype = {
459 .sysfs_ops = &kobj_sysfs_ops,
460 .default_attrs = &mmc_attrs[0],
463 static int rk29_sdmmc_progress_add_attr( struct platform_device *pdev )
466 struct kobject *parentkobject;
467 struct kobject * me = kmalloc(sizeof(struct kobject) , GFP_KERNEL );
472 memset(me ,0,sizeof(struct kobject));
473 kobject_init( me , &mmc_kset_ktype );
475 parentkobject = &pdev->dev.kobj ;
476 result = kobject_add( me , parentkobject->parent->parent->parent,"%s", "sd-sdio" );
482 #if defined (CONFIG_DEBUG_FS)
483 static int rk29_sdmmc_regs_show(struct seq_file *s, void *v)
485 struct rk29_sdmmc *host = s->private;
487 seq_printf(s, "SDMMC_CTRL: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CTRL));
488 seq_printf(s, "SDMMC_PWREN: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_PWREN));
489 seq_printf(s, "SDMMC_CLKDIV: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKDIV));
490 seq_printf(s, "SDMMC_CLKSRC: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKSRC));
491 seq_printf(s, "SDMMC_CLKENA: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKENA));
492 seq_printf(s, "SDMMC_TMOUT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TMOUT));
493 seq_printf(s, "SDMMC_CTYPE: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CTYPE));
494 seq_printf(s, "SDMMC_BLKSIZ: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_BLKSIZ));
495 seq_printf(s, "SDMMC_BYTCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_BYTCNT));
496 seq_printf(s, "SDMMC_INTMASK:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_INTMASK));
497 seq_printf(s, "SDMMC_CMDARG: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CMDARG));
498 seq_printf(s, "SDMMC_CMD: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CMD));
499 seq_printf(s, "SDMMC_RESP0: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP0));
500 seq_printf(s, "SDMMC_RESP1: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP1));
501 seq_printf(s, "SDMMC_RESP2: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP2));
502 seq_printf(s, "SDMMC_RESP3: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP3));
503 seq_printf(s, "SDMMC_MINTSTS:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_MINTSTS));
504 seq_printf(s, "SDMMC_RINTSTS:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RINTSTS));
505 seq_printf(s, "SDMMC_STATUS: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_STATUS));
506 seq_printf(s, "SDMMC_FIFOTH: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_FIFOTH));
507 seq_printf(s, "SDMMC_CDETECT:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CDETECT));
508 seq_printf(s, "SDMMC_WRTPRT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_WRTPRT));
509 seq_printf(s, "SDMMC_TCBCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TCBCNT));
510 seq_printf(s, "SDMMC_TBBCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TBBCNT));
511 seq_printf(s, "SDMMC_DEBNCE: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_DEBNCE));
518 * The debugfs stuff below is mostly optimized away when
519 * CONFIG_DEBUG_FS is not set.
521 static int rk29_sdmmc_req_show(struct seq_file *s, void *v)
523 struct rk29_sdmmc *host = s->private;
524 struct mmc_request *mrq;
525 struct mmc_command *cmd;
526 struct mmc_command *stop;
527 struct mmc_data *data;
529 /* Make sure we get a consistent snapshot */
530 spin_lock(&host->lock);
540 "CMD%u(0x%x) flg %x rsp %x %x %x %x err %d\n",
541 cmd->opcode, cmd->arg, cmd->flags,
542 cmd->resp[0], cmd->resp[1], cmd->resp[2],
543 cmd->resp[2], cmd->error);
545 seq_printf(s, "DATA %u / %u * %u flg %x err %d\n",
546 data->bytes_xfered, data->blocks,
547 data->blksz, data->flags, data->error);
550 "CMD%u(0x%x) flg %x rsp %x %x %x %x err %d\n",
551 stop->opcode, stop->arg, stop->flags,
552 stop->resp[0], stop->resp[1], stop->resp[2],
553 stop->resp[2], stop->error);
556 spin_unlock(&host->lock);
561 static int rk29_sdmmc_req_open(struct inode *inode, struct file *file)
563 return single_open(file, rk29_sdmmc_req_show, inode->i_private);
566 static const struct file_operations rk29_sdmmc_req_fops = {
567 .owner = THIS_MODULE,
568 .open = rk29_sdmmc_req_open,
571 .release = single_release,
575 static int rk29_sdmmc_regs_open(struct inode *inode, struct file *file)
577 return single_open(file, rk29_sdmmc_regs_show, inode->i_private);
580 static const struct file_operations rk29_sdmmc_regs_fops = {
581 .owner = THIS_MODULE,
582 .open = rk29_sdmmc_regs_open,
585 .release = single_release,
588 static void rk29_sdmmc_init_debugfs(struct rk29_sdmmc *host)
590 struct mmc_host *mmc = host->mmc;
594 root = mmc->debugfs_root;
598 node = debugfs_create_file("regs", S_IRUSR, root, host,
599 &rk29_sdmmc_regs_fops);
605 node = debugfs_create_file("req", S_IRUSR, root, host, &rk29_sdmmc_req_fops);
609 node = debugfs_create_u32("state", S_IRUSR, root, (u32 *)&host->state);
613 node = debugfs_create_x32("pending_events", S_IRUSR, root,
614 (u32 *)&host->pending_events);
618 node = debugfs_create_x32("completed_events", S_IRUSR, root,
619 (u32 *)&host->completed_events);
626 dev_err(&mmc->class_dev, "failed to initialize debugfs for host\n");
631 static u32 rk29_sdmmc_prepare_command(struct mmc_command *cmd)
633 u32 cmdr = cmd->opcode;
637 case MMC_GO_IDLE_STATE:
638 cmdr |= (SDMMC_CMD_INIT | SDMMC_CMD_PRV_DAT_NO_WAIT);
641 case MMC_STOP_TRANSMISSION:
642 cmdr |= (SDMMC_CMD_STOP | SDMMC_CMD_PRV_DAT_NO_WAIT);
644 case MMC_SEND_STATUS:
645 case MMC_GO_INACTIVE_STATE:
646 cmdr |= SDMMC_CMD_PRV_DAT_NO_WAIT;
650 cmdr |= SDMMC_CMD_PRV_DAT_WAIT;
655 switch(mmc_resp_type(cmd))
659 // case MMC_RSP_R5: //R5,R6,R7 is same with the R1
663 cmdr |= (SDMMC_CMD_RESP_CRC | SDMMC_CMD_RESP_SHORT | SDMMC_CMD_RESP_EXP);
667 /* these response not contain crc7, so don't care crc error and response error */
668 cmdr |= (SDMMC_CMD_RESP_NO_CRC | SDMMC_CMD_RESP_SHORT | SDMMC_CMD_RESP_EXP);
671 cmdr |= (SDMMC_CMD_RESP_CRC | SDMMC_CMD_RESP_LONG | SDMMC_CMD_RESP_EXP);
674 cmdr |= (SDMMC_CMD_RESP_CRC_NOCARE | SDMMC_CMD_RESP_NOCARE | SDMMC_CMD_RESP_NO_EXP);
677 cmdr |= (SDMMC_CMD_RESP_CRC_NOCARE | SDMMC_CMD_RESP_NOCARE | SDMMC_CMD_RESP_NO_EXP);
684 void rk29_sdmmc_set_frq(struct rk29_sdmmc *host)
686 struct mmc_host *mmchost = platform_get_drvdata(host->pdev);
687 struct mmc_card *card;
689 unsigned int max_dtr;
691 extern void mmc_set_clock(struct mmc_host *host, unsigned int hz);
696 card = (struct mmc_card *)mmchost->card;
697 ios = ( struct mmc_ios *)&mmchost->ios;
702 if(MMC_POWER_ON == ios->power_mode)
705 max_dtr = (unsigned int)-1;
707 if (mmc_card_highspeed(card))
709 if (max_dtr > card->ext_csd.hs_max_dtr)
710 max_dtr = card->ext_csd.hs_max_dtr;
713 else if (max_dtr > card->csd.max_dtr)
715 if(MMC_TYPE_SD == card->type)
717 max_dtr = (card->csd.max_dtr > SD_FPP_FREQ) ? SD_FPP_FREQ : (card->csd.max_dtr);
721 max_dtr = (card->csd.max_dtr > MMC_FPP_FREQ) ? MMC_FPP_FREQ : (card->csd.max_dtr);
725 xbwprintk(7, "%s..%d... call mmc_set_clock() set clk=%d ===xbw[%s]===\n", \
726 __FUNCTION__, __LINE__, max_dtr, host->dma_name);
729 mmc_set_clock(mmchost, max_dtr);
734 static int rk29_sdmmc_start_command(struct rk29_sdmmc *host, struct mmc_command *cmd, u32 cmd_flags)
736 int tmo = RK29_SDMMC_SEND_START_TIMEOUT*10;//wait 60ms cycle.
739 host->old_cmd = cmd->opcode;
741 host->pending_events = 0;
742 host->completed_events = 0;
743 host->complete_done = 0;
745 host->cmd_status = 0;
747 if(MMC_STOP_TRANSMISSION != cmd->opcode)
749 host->data_status = 0;
752 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
754 //adjust the frequency division control of SDMMC0 every time.
755 rk29_sdmmc_set_frq(host);
758 rk29_sdmmc_write(host->regs, SDMMC_CMDARG, cmd->arg); // write to SDMMC_CMDARG register
759 rk29_sdmmc_write(host->regs, SDMMC_CMD, cmd_flags | SDMMC_CMD_START); // write to SDMMC_CMD register
762 xbwprintk(5, "\n%s..%d..************.start cmd=%d, arg=0x%x ********=====xbw[%s]=======\n", \
763 __FUNCTION__, __LINE__, cmd->opcode, cmd->arg, host->dma_name);
765 host->mmc->doneflag = 1;
767 /* wait until CIU accepts the command */
768 while (--tmo && (rk29_sdmmc_read(host->regs, SDMMC_CMD) & SDMMC_CMD_START))
770 udelay(2);//cpu_relax();
777 printk("%s..%d.. CMD_START timeout! CMD%d(arg=0x%x, retries=%d) ======xbw[%s]======\n",\
778 __FUNCTION__,__LINE__, cmd->opcode, cmd->arg, cmd->retries,host->dma_name);
781 cmd->error = -ETIMEDOUT;
782 host->mrq->cmd->error = -ETIMEDOUT;
783 del_timer_sync(&host->request_timer);
785 host->errorstep = 0x1;
786 return SDM_WAIT_FOR_CMDSTART_TIMEOUT;
788 host->errorstep = 0xfe;
793 static int rk29_sdmmc_reset_fifo(struct rk29_sdmmc *host)
797 int ret = SDM_SUCCESS;
799 value = rk29_sdmmc_read(host->regs, SDMMC_STATUS);
800 if (!(value & SDMMC_STAUTS_FIFO_EMPTY))
802 value = rk29_sdmmc_read(host->regs, SDMMC_CTRL);
803 value |= SDMMC_CTRL_FIFO_RESET;
804 rk29_sdmmc_write(host->regs, SDMMC_CTRL, value);
807 while (((value = rk29_sdmmc_read(host->regs, SDMMC_CTRL)) & (SDMMC_CTRL_FIFO_RESET)) && (timeout > 0))
814 host->errorstep = 0x2;
815 ret = SDM_WAIT_FOR_FIFORESET_TIMEOUT;
823 static int rk29_sdmmc_wait_unbusy(struct rk29_sdmmc *host)
825 int time_out = 500000;//250000; //max is 250ms; //adapt the value to the sick card. modify at 2011-10-08
827 while (rk29_sdmmc_read(host->regs, SDMMC_STATUS) & (SDMMC_STAUTS_DATA_BUSY|SDMMC_STAUTS_MC_BUSY))
834 host->errorstep = 0x3;
835 return SDM_BUSY_TIMEOUT;
842 static void rk29_sdmmc_dma_cleanup(struct rk29_sdmmc *host)
846 dma_unmap_sg(&host->pdev->dev, host->data->sg, host->data->sg_len,
847 ((host->data->flags & MMC_DATA_WRITE)
848 ? DMA_TO_DEVICE : DMA_FROM_DEVICE));
852 static void rk29_sdmmc_stop_dma(struct rk29_sdmmc *host)
856 if(host->use_dma == 0)
859 if (host->dma_info.chn> 0)
861 rk29_sdmmc_dma_cleanup(host);
863 ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_STOP);
866 printk("%s..%d...rk29_dma_ctrl STOP error!===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
867 host->errorstep = 0x95;
871 ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_FLUSH);
874 printk("%s..%d...rk29_dma_ctrl FLUSH error!===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
875 host->errorstep = 0x96;
882 /* Data transfer was stopped by the interrupt handler */
883 rk29_sdmmc_set_pending(host, EVENT_DATA_COMPLETE);
887 static void rk29_sdmmc_control_host_dma(struct rk29_sdmmc *host, bool enable)
889 u32 value = rk29_sdmmc_read(host->regs, SDMMC_CTRL);
893 value |= SDMMC_CTRL_DMA_ENABLE;
897 value &= ~(SDMMC_CTRL_DMA_ENABLE);
900 rk29_sdmmc_write(host->regs, SDMMC_CTRL, value);
903 static void send_stop_cmd(struct rk29_sdmmc *host)
907 if(host->mrq->cmd->error)
912 rk29_sdmmc_stop_dma(host);
913 rk29_sdmmc_control_host_dma(host, FALSE);
918 ret= rk29_sdmmc_clear_fifo(host);
919 if(SDM_SUCCESS != ret)
921 xbwprintk(3, "%s..%d.. clear fifo error before call CMD_STOP ====xbw[%s]====\n", \
922 __FUNCTION__, __LINE__, host->dma_name);
926 mod_timer(&host->request_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_SEND_START_TIMEOUT+1500));
928 host->stopcmd.opcode = MMC_STOP_TRANSMISSION;
929 host->stopcmd.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC;;
930 host->stopcmd.arg = 0;
931 host->stopcmd.data = NULL;
932 host->stopcmd.mrq = NULL;
933 host->stopcmd.retries = 0;
934 host->stopcmd.error = 0;
935 if(host->mrq && host->mrq->stop)
937 host->mrq->stop->error = 0;
940 host->cmdr = rk29_sdmmc_prepare_command(&host->stopcmd);
942 ret = rk29_sdmmc_start_command(host, &host->stopcmd, host->cmdr);
943 if(SDM_SUCCESS != ret)
945 rk29_sdmmc_start_error(host);
947 host->state = STATE_IDLE;
948 host->complete_done = 4;
953 /* This function is called by the DMA driver from tasklet context. */
954 static void rk29_sdmmc_dma_complete(void *arg, int size, enum rk29_dma_buffresult result)
956 struct rk29_sdmmc *host = arg;
958 if(host->use_dma == 0)
961 host->intInfo.transLen = host->intInfo.desLen;
964 static int rk29_sdmmc_submit_data_dma(struct rk29_sdmmc *host, struct mmc_data *data)
966 struct scatterlist *sg;
967 unsigned int i,direction, sgDirection;
970 if(host->use_dma == 0)
972 printk("%s..%d...setup DMA fail!!!!!!. host->use_dma=0 ===xbw=[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
973 host->errorstep = 0x4;
976 /* If we don't have a channel, we can't do DMA */
977 if (host->dma_info.chn < 0)
979 printk("%s..%d...setup DMA fail!!!!!!!. dma_info.chn < 0 ===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
980 host->errorstep = 0x5;
986 for_each_sg(data->sg, sg, data->sg_len, i)
988 if (sg->offset & 3 || sg->length & 3)
990 printk("%s..%d...call for_each_sg() fail !!===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
991 host->errorstep = 0x7;
995 if (data->flags & MMC_DATA_READ)
997 direction = RK29_DMASRC_HW;
998 sgDirection = DMA_FROM_DEVICE;
1002 direction = RK29_DMASRC_MEM;
1003 sgDirection = DMA_TO_DEVICE;
1006 ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_STOP);
1009 printk("%s..%d...rk29_dma_ctrl stop error!===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
1010 host->errorstep = 0x91;
1014 ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_FLUSH);
1017 printk("%s..%d...rk29_dma_ctrl flush error!===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
1018 host->errorstep = 0x91;
1023 ret = rk29_dma_devconfig(host->dma_info.chn, direction, (unsigned long )(host->dma_addr));
1026 printk("%s..%d...call rk29_dma_devconfig() fail !!!!===xbw=[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
1027 host->errorstep = 0x8;
1031 dma_len = dma_map_sg(&host->pdev->dev, data->sg, data->sg_len, sgDirection);
1032 for (i = 0; i < dma_len; i++)
1034 ret = rk29_dma_enqueue(host->dma_info.chn, host, sg_dma_address(&data->sg[i]),sg_dma_len(&data->sg[i]));
1037 printk("%s..%d...call rk29_dma_devconfig() fail !!!!===xbw=[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
1038 host->errorstep = 0x93;
1043 rk29_sdmmc_control_host_dma(host, TRUE);// enable dma
1044 ret = rk29_dma_ctrl(host->dma_info.chn, RK29_DMAOP_START);
1047 printk("%s..%d...rk29_dma_ctrl start error!===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
1048 host->errorstep = 0x94;
1056 static int rk29_sdmmc_prepare_write_data(struct rk29_sdmmc *host, struct mmc_data *data)
1062 u32 count, *pBuf = (u32 *)host->pbuf;
1064 output = SDM_SUCCESS;
1065 dataLen = data->blocks*data->blksz;
1067 host->dodma = 0; //DMA still no request;
1069 //SDMMC controller request the data is multiple of 4.
1070 count = (dataLen >> 2) + ((dataLen & 0x3) ? 1:0);
1072 if (count <= FIFO_DEPTH)
1074 for (i=0; i<count; i++)
1076 rk29_sdmmc_write(host->regs, SDMMC_DATA, pBuf[i]);
1081 host->intInfo.desLen = count;
1082 host->intInfo.transLen = 0;
1083 host->intInfo.pBuf = (u32 *)pBuf;
1085 if(0)//(host->intInfo.desLen <= 512 )
1092 xbwprintk(7, "%s..%d... trace data, ======xbw=[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
1093 output = rk29_sdmmc_submit_data_dma(host, data);
1098 printk("%s..%d... CMD%d setupDMA failure!!!!! ==xbw[%s]==\n", \
1099 __FUNCTION__, __LINE__, host->cmd->opcode, host->dma_name);
1101 host->errorstep = 0x81;
1103 rk29_sdmmc_control_host_dma(host, FALSE);
1119 static int rk29_sdmmc_prepare_read_data(struct rk29_sdmmc *host, struct mmc_data *data)
1125 output = SDM_SUCCESS;
1126 dataLen = data->blocks*data->blksz;
1128 host->dodma = 0;//DMA still no request;
1130 //SDMMC controller request the data is multiple of 4.
1131 count = (dataLen >> 2) ;//+ ((dataLen & 0x3) ? 1:0);
1133 host->intInfo.desLen = (dataLen >> 2);
1134 host->intInfo.transLen = 0;
1135 host->intInfo.pBuf = (u32 *)host->pbuf;
1137 if (count > (RX_WMARK+1)) //datasheet error.actually, it can nont waken the interrupt when less and equal than RX_WMARK+1
1139 if(0) //(host->intInfo.desLen <= 512 )
1146 output = rk29_sdmmc_submit_data_dma(host, data);
1151 printk("%s..%d... CMD%d setupDMA failure!!! ==xbw[%s]==\n", \
1152 __FUNCTION__, __LINE__, host->cmd->opcode, host->dma_name);
1154 host->errorstep = 0x82;
1156 rk29_sdmmc_control_host_dma(host, FALSE);
1170 static int rk29_sdmmc_read_remain_data(struct rk29_sdmmc *host, u32 originalLen, void *pDataBuf)
1175 u32 *pBuf = (u32 *)pDataBuf;
1176 u8 *pByteBuf = (u8 *)pDataBuf;
1179 //SDMMC controller must be multiple of 32. so if transfer 13, then actuall we should write or read 16 byte.
1180 u32 count = (originalLen >> 2) + ((originalLen & 0x3) ? 1:0);
1182 if(1 == host->dodma)
1184 //when use DMA, there are remain data only when datalen/4 less than RX_WMARK+1 same as equaltion. or not multiple of 4
1185 if (!((value = rk29_sdmmc_read(host->regs, SDMMC_STATUS)) & SDMMC_STAUTS_FIFO_EMPTY))
1187 if (count <= (RX_WMARK+1))
1190 while ((i<(originalLen >> 2))&&(!(value & SDMMC_STAUTS_FIFO_EMPTY)))
1192 pBuf[i++] = rk29_sdmmc_read(host->regs, SDMMC_DATA);
1193 value = rk29_sdmmc_read(host->regs, SDMMC_STATUS);
1197 if (count > (originalLen >> 2))
1199 lastData = rk29_sdmmc_read(host->regs, SDMMC_DATA);
1201 //fill the 1 to 3 byte.
1202 for (i=0; i<(originalLen & 0x3); i++)
1204 pByteBuf[(originalLen & 0xFFFFFFFC) + i] = (u8)((lastData >> (i << 3)) & 0xFF); //default little-endian
1211 if (!((value = rk29_sdmmc_read(host->regs, SDMMC_STATUS)) & SDMMC_STAUTS_FIFO_EMPTY))
1213 while ( (host->intInfo.transLen < host->intInfo.desLen) && (!(value & SDMMC_STAUTS_FIFO_EMPTY)) )
1215 pBuf[host->intInfo.transLen++] = rk29_sdmmc_read(host->regs, SDMMC_DATA);
1216 value = rk29_sdmmc_read(host->regs, SDMMC_STATUS);
1219 if (count > (originalLen >> 2))
1221 lastData = rk29_sdmmc_read(host->regs, SDMMC_DATA);
1223 //fill the 1 to 3 byte.
1224 for (i=0; i<(originalLen & 0x3); i++)
1226 pByteBuf[(originalLen & 0xFFFFFFFC) + i] = (u8)((lastData >> (i << 3)) & 0xFF); //default little-endian
1236 static void rk29_sdmmc_do_pio_read(struct rk29_sdmmc *host)
1239 for (i=0; i<(RX_WMARK+1); i++)
1241 host->intInfo.pBuf[host->intInfo.transLen + i] = rk29_sdmmc_read(host->regs, SDMMC_DATA);
1243 host->intInfo.transLen += (RX_WMARK+1);
1246 static void rk29_sdmmc_do_pio_write(struct rk29_sdmmc *host)
1249 if ( (host->intInfo.desLen - host->intInfo.transLen) > (FIFO_DEPTH - TX_WMARK) )
1251 for (i=0; i<(FIFO_DEPTH - TX_WMARK); i++)
1253 rk29_sdmmc_write(host->regs, SDMMC_DATA, host->intInfo.pBuf[host->intInfo.transLen + i]);
1255 host->intInfo.transLen += (FIFO_DEPTH - TX_WMARK);
1259 for (i=0; i<(host->intInfo.desLen - host->intInfo.transLen); i++)
1261 rk29_sdmmc_write(host->regs, SDMMC_DATA, host->intInfo.pBuf[host->intInfo.transLen + i]);
1263 host->intInfo.transLen = host->intInfo.desLen;
1269 static void rk29_sdmmc_submit_data(struct rk29_sdmmc *host, struct mmc_data *data)
1277 host->cmd->data = data;
1279 data->bytes_xfered = 0;
1280 host->pbuf = (u32*)sg_virt(data->sg);
1282 if (data->flags & MMC_DATA_STREAM)
1284 host->cmdr |= SDMMC_CMD_STRM_MODE; //set stream mode
1288 host->cmdr |= SDMMC_CMD_BLOCK_MODE; //set block mode
1291 //set the blocks and blocksize
1292 rk29_sdmmc_write(host->regs, SDMMC_BYTCNT,data->blksz*data->blocks);
1293 rk29_sdmmc_write(host->regs, SDMMC_BLKSIZ,data->blksz);
1295 xbwprintk(6, "%s..%d..CMD%d(arg=0x%x), data->blksz=%d, data->blocks=%d ==xbw=[%s]==\n", \
1296 __FUNCTION__, __LINE__, host->cmd->opcode,host->cmd->arg,data->blksz, data->blocks, host->dma_name);
1298 if (data->flags & MMC_DATA_WRITE)
1300 host->cmdr |= (SDMMC_CMD_DAT_WRITE | SDMMC_CMD_DAT_EXP);
1301 xbwprintk(7, "%s..%d... write data, len=%d ======xbw=[%s]====\n", \
1302 __FUNCTION__, __LINE__, data->blksz*data->blocks, host->dma_name);
1304 ret = rk29_sdmmc_prepare_write_data(host, data);
1308 host->cmdr |= (SDMMC_CMD_DAT_READ | SDMMC_CMD_DAT_EXP);
1309 xbwprintk(7, "%s..%d... read data len=%d ======xbw=[%s]====\n", \
1310 __FUNCTION__, __LINE__, data->blksz*data->blocks, host->dma_name);
1312 ret = rk29_sdmmc_prepare_read_data(host, data);
1318 rk29_sdmmc_write(host->regs, SDMMC_BLKSIZ, 0);
1319 rk29_sdmmc_write(host->regs, SDMMC_BYTCNT, 0);
1324 static int sdmmc_send_cmd_start(struct rk29_sdmmc *host, unsigned int cmd)
1326 int tmo = RK29_SDMMC_SEND_START_TIMEOUT*10;//wait 60ms cycle.
1328 rk29_sdmmc_write(host->regs, SDMMC_CMD, SDMMC_CMD_START | cmd);
1329 while (--tmo && (rk29_sdmmc_read(host->regs, SDMMC_CMD) & SDMMC_CMD_START))
1336 printk("%s.. %d set cmd(value=0x%x) register timeout error ! ====xbw[%s]====\n",\
1337 __FUNCTION__,__LINE__, cmd, host->dma_name);
1339 host->errorstep = 0x9;
1340 return SDM_START_CMD_FAIL;
1346 static int rk29_sdmmc_get_cd(struct mmc_host *mmc)
1348 struct rk29_sdmmc *host = mmc_priv(mmc);
1351 switch(host->pdev->id)
1356 if(host->gpio_det == INVALID_GPIO)
1360 cdetect = rk29_sdmmc_read(host->regs, SDMMC_CDETECT);
1362 cdetect = (cdetect & SDMMC_CARD_DETECT_N)?0:1;
1369 #if defined(CONFIG_USE_SDMMC1_FOR_WIFI_DEVELOP_BOARD)
1372 cdetect = test_bit(RK29_SDMMC_CARD_PRESENT, &host->flags)?1:0;
1387 /****************************************************************/
1388 //reset the SDMMC controller of the current host
1389 /****************************************************************/
1390 int rk29_sdmmc_reset_controller(struct rk29_sdmmc *host)
1395 rk29_sdmmc_write(host->regs, SDMMC_PWREN, POWER_ENABLE);
1397 /* reset SDMMC IP */
1398 //SDPAM_SDCClkEnable(host, TRUE);
1401 for(timeOut=0; timeOut<FIFO_DEPTH; timeOut++)
1403 if(rk29_sdmmc_read(host->regs, SDMMC_STATUS) & SDMMC_STAUTS_FIFO_EMPTY)
1406 value = rk29_sdmmc_read(host->regs, SDMMC_DATA);
1410 rk29_sdmmc_write(host->regs, SDMMC_CTRL,(SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET ));
1413 value = rk29_sdmmc_read(host->regs, SDMMC_CTRL);
1414 while (( value & (SDMMC_CTRL_FIFO_RESET | SDMMC_CTRL_RESET)) && (timeOut > 0))
1418 value = rk29_sdmmc_read(host->regs, SDMMC_CTRL);
1423 printk("%s..%s..%d.. reset controller fail!!! =====xbw[%s]=====\n",\
1424 __FILE__, __FUNCTION__,__LINE__, host->dma_name);
1426 host->errorstep = 0x0A;
1427 return SDM_WAIT_FOR_FIFORESET_TIMEOUT;
1430 /* FIFO threshold settings */
1431 rk29_sdmmc_write(host->regs, SDMMC_FIFOTH, (SD_MSIZE_16 | (RX_WMARK << RX_WMARK_SHIFT) | (TX_WMARK << TX_WMARK_SHIFT)));
1433 rk29_sdmmc_write(host->regs, SDMMC_CTYPE, SDMMC_CTYPE_1BIT);
1434 rk29_sdmmc_write(host->regs, SDMMC_CLKSRC, CLK_DIV_SRC_0);
1435 /* config debounce */
1436 host->bus_hz = clk_get_rate(host->clk);
1437 if((host->bus_hz > 52000000) || (host->bus_hz <= 0))
1439 printk("%s..%s..%d..****Error!!!!!! Bus clock %d hz is beyond the prescribed limits ====xbw[%s]===\n",\
1440 __FILE__, __FUNCTION__,__LINE__,host->bus_hz, host->dma_name);
1442 host->errorstep = 0x0B;
1443 return SDM_PARAM_ERROR;
1446 rk29_sdmmc_write(host->regs, SDMMC_DEBNCE, (DEBOUNCE_TIME*host->bus_hz)&0xFFFFFF);
1448 /* config interrupt */
1449 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS, 0xFFFFFFFF);
1453 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
1455 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEDMA);
1459 if(0== host->pdev->id)
1461 #if !defined(CONFIG_USE_SDMMC0_FOR_WIFI_DEVELOP_BOARD)
1462 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEDMA | SDMMC_INT_SDIO);
1464 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEDMA);
1467 else if(1== host->pdev->id)
1469 #if !defined(CONFIG_USE_SDMMC1_FOR_WIFI_DEVELOP_BOARD)
1470 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEDMA | SDMMC_INT_SDIO);
1472 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEDMA);
1477 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEDMA | SDMMC_INT_SDIO);
1483 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
1485 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEIO);
1489 if(0== host->pdev->id)
1491 #if !defined(CONFIG_USE_SDMMC0_FOR_WIFI_DEVELOP_BOARD)
1492 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEIO | SDMMC_INT_SDIO);
1494 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEIO);
1497 else if(1== host->pdev->id)
1499 #if !defined(CONFIG_USE_SDMMC1_FOR_WIFI_DEVELOP_BOARD)
1500 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEIO | SDMMC_INT_SDIO);
1502 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEIO);
1507 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEDMA | SDMMC_INT_SDIO);
1512 rk29_sdmmc_write(host->regs, SDMMC_PWREN, POWER_ENABLE);
1514 rk29_sdmmc_write(host->regs, SDMMC_CTRL,SDMMC_CTRL_INT_ENABLE); // enable mci interrupt
1522 //enable/disnable the clk.
1523 static int rk29_sdmmc_control_clock(struct rk29_sdmmc *host, bool enable)
1527 int ret = SDM_SUCCESS;
1529 //wait previous start to clear
1531 while (--tmo && (rk29_sdmmc_read(host->regs, SDMMC_CMD) & SDMMC_CMD_START))
1533 udelay(1);//cpu_relax();
1537 host->errorstep = 0x0C;
1538 ret = SDM_START_CMD_FAIL;
1542 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
1544 //SDMMC use low-power mode
1547 value = (SDMMC_CLKEN_LOW_PWR | SDMMC_CLKEN_ENABLE);
1551 value = (SDMMC_CLKEN_LOW_PWR | SDMMC_CLKEN_DISABLE);
1556 //SDIO-card use non-low-power mode
1559 value = (SDMMC_CLKEN_ENABLE);
1563 value = (SDMMC_CLKEN_DISABLE);
1567 rk29_sdmmc_write(host->regs, SDMMC_CLKENA, value);
1570 ret = sdmmc_send_cmd_start(host, SDMMC_CMD_UPD_CLK | SDMMC_CMD_PRV_DAT_WAIT);
1571 if(ret != SDM_SUCCESS)
1579 printk("\n%s....%d.. control clock fail!!! Enable=%d, ret=0x%x ===xbw[%s]====\n",\
1580 __FILE__,__LINE__,enable,ret, host->dma_name);
1587 //adjust the frequency.ie, to set the frequency division control
1588 int rk29_sdmmc_change_clk_div(struct rk29_sdmmc *host, u32 freqHz)
1592 int ret = SDM_SUCCESS;
1596 ret = SDM_PARAM_ERROR;
1600 ret = rk29_sdmmc_control_clock(host, FALSE);
1601 if (ret != SDM_SUCCESS)
1607 host->bus_hz = clk_get_rate(host->clk);
1608 if((host->bus_hz > 52000000) || (host->bus_hz <= 0))
1610 printk("%s..%s..%d..****Error!!!!!! Bus clock %d hz is beyond the prescribed limits ====xbw[%s]===\n",\
1611 __FILE__, __FUNCTION__,__LINE__,host->bus_hz, host->dma_name);
1613 host->errorstep = 0x0D;
1614 ret = SDM_PARAM_ERROR;
1618 //calculate the divider
1619 div = host->bus_hz/freqHz + ((( host->bus_hz%freqHz ) > 0) ? 1:0 );
1620 if( (div & 0x01) && (1 != div) )
1622 //It is sure that the value of div is even.
1628 host->clock = host->bus_hz/div;
1632 host->clock = host->bus_hz;
1636 //wait previous start to clear
1638 while (--tmo && (rk29_sdmmc_read(host->regs, SDMMC_CMD) & SDMMC_CMD_START))
1640 udelay(1);//cpu_relax();
1644 host->errorstep = 0x0E;
1645 ret = SDM_START_CMD_FAIL;
1649 /* set clock to desired speed */
1650 rk29_sdmmc_write(host->regs, SDMMC_CLKDIV, div);
1653 ret = sdmmc_send_cmd_start(host, SDMMC_CMD_UPD_CLK | SDMMC_CMD_PRV_DAT_WAIT);
1654 if(ret != SDM_SUCCESS)
1656 host->errorstep = 0x0E1;
1660 if(host->old_div != div)
1662 printk("%s..%d.. newDiv=%u, newCLK=%uKhz====xbw[%s]=====\n", \
1663 __FUNCTION__, __LINE__,div, host->clock/1000, host->dma_name);
1666 ret = rk29_sdmmc_control_clock(host, TRUE);
1667 if(ret != SDM_SUCCESS)
1671 host->old_div = div;
1677 printk("%s..%d.. change division fail, errorStep=0x%x,ret=%d !!! ====xbw[%s]====\n",\
1678 __FILE__, __LINE__,host->errorstep,ret, host->dma_name);
1684 int rk29_sdmmc_hw_init(void *data)
1686 struct rk29_sdmmc *host = (struct rk29_sdmmc *)data;
1689 host->ctype = SDMMC_CTYPE_1BIT;
1690 host->set_iomux(host->pdev->id, host->ctype);
1692 /* reset controller */
1693 rk29_sdmmc_reset_controller(host);
1695 rk29_sdmmc_change_clk_div(host, FOD_FREQ);
1702 int rk29_sdmmc_set_buswidth(struct rk29_sdmmc *host)
1705 switch (host->ctype)
1707 case SDMMC_CTYPE_1BIT:
1708 case SDMMC_CTYPE_4BIT:
1710 case SDMMC_CTYPE_8BIT:
1711 return SDM_PARAM_ERROR; //Now, not support 8 bit width
1713 return SDM_PARAM_ERROR;
1716 host->set_iomux(host->pdev->id, host->ctype);
1718 /* Set the current bus width */
1719 rk29_sdmmc_write(host->regs, SDMMC_CTYPE, host->ctype);
1725 static void rk29_sdmmc_dealwith_timeout(struct rk29_sdmmc *host)
1727 if(0 == host->mmc->doneflag)
1728 return; //not to generate error flag if the command has been over.
1740 host->cmd->error = -EIO;
1744 host->cmd->data->error = -EILSEQ;
1746 host->state = STATE_SENDING_CMD;
1751 case STATE_SENDING_CMD:
1752 host->cmd_status |= SDMMC_INT_RTO;
1753 host->cmd->error = -ETIME;
1754 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,(SDMMC_INT_CMD_DONE | SDMMC_INT_RTO)); // clear interrupt
1755 rk29_sdmmc_set_pending(host, EVENT_CMD_COMPLETE);
1756 tasklet_schedule(&host->tasklet);
1758 case STATE_DATA_BUSY:
1759 host->data_status |= (SDMMC_INT_DCRC|SDMMC_INT_EBE);
1760 host->cmd->data->error = -EILSEQ;
1761 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_DTO); // clear interrupt
1762 rk29_sdmmc_set_pending(host, EVENT_DATA_COMPLETE);
1763 tasklet_schedule(&host->tasklet);
1765 case STATE_SENDING_STOP:
1766 host->cmd_status |= SDMMC_INT_RTO;
1767 host->cmd->error = -ETIME;
1768 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,(SDMMC_INT_CMD_DONE | SDMMC_INT_RTO)); // clear interrupt
1769 rk29_sdmmc_set_pending(host, EVENT_CMD_COMPLETE);
1770 tasklet_schedule(&host->tasklet);
1776 static void rk29_sdmmc_INT_CMD_DONE_timeout(unsigned long host_data)
1778 struct rk29_sdmmc *host = (struct rk29_sdmmc *) host_data;
1779 unsigned long iflags;
1781 spin_lock_irqsave(&host->lock, iflags);
1783 if(STATE_SENDING_CMD == host->state)
1785 if(0==host->cmd->retries)
1787 printk("%s..%d... cmd=%d, INT_CMD_DONE timeout, errorStep=0x%x, host->state=%x ===xbw[%s]===\n",\
1788 __FUNCTION__, __LINE__,host->cmd->opcode, host->errorstep,host->state,host->dma_name);
1791 rk29_sdmmc_dealwith_timeout(host);
1793 spin_unlock_irqrestore(&host->lock, iflags);
1798 static void rk29_sdmmc_INT_DTO_timeout(unsigned long host_data)
1800 struct rk29_sdmmc *host = (struct rk29_sdmmc *) host_data;
1801 unsigned long iflags;
1803 spin_lock_irqsave(&host->lock, iflags);
1806 if( (host->cmdr & SDMMC_CMD_DAT_EXP) && (STATE_DATA_BUSY == host->state))
1808 if(0==host->cmd->retries)
1810 printk("%s..%d...cmd=%d DTO_timeout,cmdr=0x%x, errorStep=0x%x, Hoststate=%x===xbw[%s]===\n", \
1811 __FUNCTION__, __LINE__,host->cmd->opcode,host->cmdr ,host->errorstep,host->state,host->dma_name);
1814 rk29_sdmmc_dealwith_timeout(host);
1816 spin_unlock_irqrestore(&host->lock, iflags);
1822 //to excute a request
1823 static int rk29_sdmmc_start_request(struct mmc_host *mmc )
1825 struct rk29_sdmmc *host = mmc_priv(mmc);
1826 struct mmc_request *mrq;
1827 struct mmc_command *cmd;
1830 unsigned long iflags;
1832 spin_lock_irqsave(&host->lock, iflags);
1834 mrq = host->new_mrq;
1838 cmdr = rk29_sdmmc_prepare_command(cmd);
1842 /*clean FIFO if it is a new request*/
1843 if((RK29_CTRL_SDMMC_ID == host->pdev->id) && ( !(cmdr & SDMMC_CMD_STOP)))
1845 ret = rk29_sdmmc_reset_fifo(host);
1846 if(SDM_SUCCESS != ret)
1848 host->mrq = host->new_mrq;///
1849 cmd->error = -ENOMEDIUM;
1850 host->errorstep = 0x0F;
1852 goto start_request_Err;
1856 //check data-busy if the current command has the bit13 in command register.
1857 if( cmdr & SDMMC_CMD_PRV_DAT_WAIT )
1859 if(rk29_sdmmc_read(host->regs, SDMMC_STATUS) & SDMMC_STAUTS_DATA_BUSY)
1861 host->mrq = host->new_mrq;///
1862 cmd->error = -ETIMEDOUT;
1863 ret = SDM_BUSY_TIMEOUT;
1864 host->errorstep = 0x10;
1865 if(0 == cmd->retries)
1867 printk("%s..Error happen in CMD_PRV_DAT_WAIT. STATUS-reg=0x%x ===xbw[%s]===\n", \
1868 __FUNCTION__, rk29_sdmmc_read(host->regs, SDMMC_STATUS),host->dma_name);
1870 rk29_sdmmc_clear_fifo(host);
1871 goto start_request_Err;
1875 host->state = STATE_SENDING_CMD;
1876 host->mrq = host->new_mrq;
1884 host->data_status = 0;
1887 host->errorstep = 0;
1892 //setting for the data
1893 rk29_sdmmc_submit_data(host, mrq->data);
1894 host->errorstep = 0xff;
1896 xbwprintk(7, "%s..%d... CMD%d begin to call rk29_sdmmc_start_command() ===xbw[%s]===\n", \
1897 __FUNCTION__, __LINE__ , cmd->opcode,host->dma_name);
1899 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
1901 mod_timer(&host->request_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_SEND_START_TIMEOUT+700));
1905 mod_timer(&host->request_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_SEND_START_TIMEOUT+500));
1909 ret = rk29_sdmmc_start_command(host, cmd, host->cmdr);
1910 if(SDM_SUCCESS != ret)
1912 cmd->error = -ETIMEDOUT;
1915 printk("%s..%d... start_command(CMD%d, arg=%x, retries=%d) fail! ret=%d =========xbw=[%s]===\n",\
1916 __FUNCTION__, __LINE__ , cmd->opcode,cmd->arg, cmd->retries,ret, host->dma_name);
1918 host->errorstep = 0x11;
1919 del_timer_sync(&host->request_timer);
1921 goto start_request_Err;
1923 host->errorstep = 0xfd;
1925 xbwprintk(7, "%s..%d... CMD=%d, wait for INT_CMD_DONE, ret=%d , \n \
1926 host->state=0x%x, cmdINT=0x%x \n host->pendingEvent=0x%lu, host->completeEvents=0x%lu =========xbw=[%s]=====\n\n",\
1927 __FUNCTION__, __LINE__, host->cmd->opcode,ret, \
1928 host->state,host->cmd_status, host->pending_events,host->completed_events,host->dma_name);
1930 spin_unlock_irqrestore(&host->lock, iflags);
1934 rk29_sdmmc_start_error(host);
1936 if(0 == cmd->retries)
1938 printk("%s: CMD%d(arg=%x) fail to start request. err=%d, Errorstep=0x%x ===xbw[%s]==\n\n",\
1939 __FUNCTION__, cmd->opcode, cmd->arg,ret,host->errorstep,host->dma_name);
1942 host->state = STATE_IDLE; //modifyed by xbw at 2011-08-15
1944 if(host->mrq && host->mmc->doneflag)
1946 host->mmc->doneflag = 0;
1947 spin_unlock_irqrestore(&host->lock, iflags);
1949 mmc_request_done(host->mmc, host->mrq);
1953 spin_unlock_irqrestore(&host->lock, iflags);
1961 static void rk29_sdmmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
1963 unsigned long iflags;
1964 struct rk29_sdmmc *host = mmc_priv(mmc);
1966 spin_lock_irqsave(&host->lock, iflags);
1969 //set 1 to close the controller for Debug.
1970 if(RK29_CTRL_SDIO1_ID==host->pdev->id)//if(RK29_CTRL_SDMMC_ID==host->pdev->id)//
1972 mrq->cmd->error = -ENOMEDIUM;
1973 printk("%s..%d.. ==== The %s had been closed by myself for the experiment. ====xbw[%s]===\n",\
1974 __FUNCTION__, __LINE__, host->dma_name, host->dma_name);
1976 host->state = STATE_IDLE;
1977 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS, 0xFFFFFFFF);
1978 spin_unlock_irqrestore(&host->lock, iflags);
1979 mmc_request_done(mmc, mrq);
1984 xbwprintk(6, "\n%s..%d..New cmd=%2d(arg=0x%8x)=== cardPresent=0x%lu, state=0x%x ==xbw[%s]==\n", \
1985 __FUNCTION__, __LINE__,mrq->cmd->opcode, mrq->cmd->arg,host->flags,host->state, host->dma_name);
1987 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
1989 if(!rk29_sdmmc_get_cd(mmc) || ((0==mmc->re_initialized_flags)&&(MMC_GO_IDLE_STATE != mrq->cmd->opcode)))
1991 mrq->cmd->error = -ENOMEDIUM;
1993 if((RK29_CTRL_SDMMC_ID == host->pdev->id)&&(0==mrq->cmd->retries))
1995 if(host->old_cmd != mrq->cmd->opcode)
1997 if( ((17==host->old_cmd)&&(18==mrq->cmd->opcode)) || ((18==host->old_cmd)&&(17==mrq->cmd->opcode)) ||\
1998 ((24==host->old_cmd)&&(25==mrq->cmd->opcode)) || ((25==host->old_cmd)&&(24==mrq->cmd->opcode)))
2000 host->old_cmd = mrq->cmd->opcode;
2001 if(host->error_times++ %RK29_ERROR_PRINTK_INTERVAL ==0)
2003 printk("%s: Refuse to run CMD%2d(arg=0x%8x) due to the removal of card. 1==xbw[%s]==\n", \
2004 __FUNCTION__, mrq->cmd->opcode, mrq->cmd->arg, host->dma_name);
2009 host->old_cmd = mrq->cmd->opcode;
2010 host->error_times = 0;
2011 printk("%s: Refuse to run CMD%2d(arg=0x%8x) due to the removal of card. 2==xbw[%s]==\n", \
2012 __FUNCTION__, mrq->cmd->opcode, mrq->cmd->arg, host->dma_name);
2017 if(host->error_times++ % (RK29_ERROR_PRINTK_INTERVAL*3) ==0)
2019 printk("%s: Refuse to run CMD%2d(arg=0x%8x) due to the removal of card. 3==xbw[%s]==\n", \
2020 __FUNCTION__, mrq->cmd->opcode, mrq->cmd->arg, host->dma_name);
2022 host->old_cmd = mrq->cmd->opcode;
2025 host->state = STATE_IDLE;
2026 spin_unlock_irqrestore(&host->lock, iflags);
2027 mmc_request_done(mmc, mrq);
2032 if(host->old_cmd != mrq->cmd->opcode)
2034 host->old_cmd = mrq->cmd->opcode;
2035 host->error_times = 0;
2041 host->old_cmd = mrq->cmd->opcode;
2042 host->error_times = 0;
2044 if(!test_bit(RK29_SDMMC_CARD_PRESENT, &host->flags))
2046 host->state = STATE_IDLE;
2047 mrq->cmd->error = -ENOMEDIUM;
2048 spin_unlock_irqrestore(&host->lock, iflags);
2049 mmc_request_done(mmc, mrq);
2056 host->new_mrq = mrq;
2058 spin_unlock_irqrestore(&host->lock, iflags);
2060 rk29_sdmmc_start_request(mmc);
2063 if (host->state == STATE_IDLE)
2065 spin_unlock_irqrestore(&host->lock, iflags);
2067 host->new_mrq = mrq;
2068 rk29_sdmmc_start_request(mmc);
2072 #ifdef RK29_SDMMC_LIST_QUEUE
2074 printk("%s..%d...Danger! Danger! New request was added to queue. ===xbw[%s]===\n", \
2075 __FUNCTION__, __LINE__,host->dma_name);
2076 list_add_tail(&host->queue_node, &host->queue);
2080 printk("%s..%d..state Error! ,old_state=%d, OldCMD=%d ,NewCMD%2d,arg=0x%x ===xbw[%s]===\n", \
2081 __FUNCTION__, __LINE__, host->state, host->cmd->opcode,mrq->cmd->opcode,mrq->cmd->arg, host->dma_name);
2083 mrq->cmd->error = -ENOMEDIUM;
2085 spin_unlock_irqrestore(&host->lock, iflags);
2086 mmc_request_done(mmc, mrq);
2098 static void rk29_sdmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
2102 unsigned long iflags;
2103 struct rk29_sdmmc *host = mmc_priv(mmc);
2105 spin_lock_irqsave(&host->lock, iflags);
2107 if(test_bit(RK29_SDMMC_CARD_PRESENT, &host->flags) || (RK29_CTRL_SDMMC_ID == host->pdev->id))
2110 * Waiting SDIO controller to be IDLE.
2112 while (timeout-- > 0)
2114 value = rk29_sdmmc_read(host->regs, SDMMC_STATUS);
2115 if ((value & SDMMC_STAUTS_DATA_BUSY) == 0 &&(value & SDMMC_CMD_FSM_MASK) == SDMMC_CMD_FSM_IDLE)
2124 printk("%s..%d...Waiting for SDMMC%d controller to be IDLE timeout.==xbw[%s]===\n", \
2125 __FUNCTION__, __LINE__, host->pdev->id, host->dma_name);
2131 //if(host->bus_mode != ios->power_mode)
2133 switch (ios->power_mode)
2136 rk29_sdmmc_write(host->regs, SDMMC_PWREN, POWER_ENABLE);
2138 //reset the controller if it is SDMMC0
2139 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
2141 xbwprintk(7, "%s..%d..POWER_UP, call reset_controller, initialized_flags=%d ====xbw[%s]=====\n",\
2142 __FUNCTION__, __LINE__, host->mmc->re_initialized_flags,host->dma_name);
2146 rk29_sdmmc_hw_init(host);
2152 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
2154 rk29_sdmmc_control_clock(host, FALSE);
2155 rk29_sdmmc_write(host->regs, SDMMC_PWREN, POWER_DISABLE);
2157 if(5 == host->bus_mode)
2160 xbwprintk(7, "%s..%d..Fisrt powerOFF, call reset_controller ======xbw[%s]====\n", \
2161 __FUNCTION__, __LINE__,host->dma_name);
2163 rk29_sdmmc_reset_controller(host);
2173 host->bus_mode = ios->power_mode;
2177 if(!(test_bit(RK29_SDMMC_CARD_PRESENT, &host->flags) || (RK29_CTRL_SDIO1_ID != host->pdev->id)))
2178 goto out; //exit the set_ios directly if the SDIO is not present.
2180 if(host->ctype != ios->bus_width)
2182 switch (ios->bus_width)
2184 case MMC_BUS_WIDTH_1:
2185 host->ctype = SDMMC_CTYPE_1BIT;
2187 case MMC_BUS_WIDTH_4:
2188 host->ctype = SDMMC_CTYPE_4BIT;
2190 case MMC_BUS_WIDTH_8:
2191 host->ctype = SDMMC_CTYPE_8BIT;
2198 rk29_sdmmc_set_buswidth(host);
2202 if (ios->clock && (ios->clock != host->clock))
2205 * Use mirror of ios->clock to prevent race with mmc
2206 * core ios update when finding the minimum.
2208 //host->clock = ios->clock;
2209 rk29_sdmmc_change_clk_div(host, ios->clock);
2213 spin_unlock_irqrestore(&host->lock, iflags);
2216 static int rk29_sdmmc_get_ro(struct mmc_host *mmc)
2218 struct rk29_sdmmc *host = mmc_priv(mmc);
2221 switch(host->pdev->id)
2225 #if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) || defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT)
2226 if(INVALID_GPIO == host->write_protect)
2227 ret = 0;//no write-protect
2229 ret = gpio_get_value(host->write_protect)?1:0;
2231 xbwprintk(7,"%s..%d.. write_prt_pin=%d, get_ro=%d ===xbw[%s]===\n",\
2232 __FUNCTION__, __LINE__,host->write_protect, ret, host->dma_name);
2235 u32 wrtprt = rk29_sdmmc_read(host->regs, SDMMC_WRTPRT);
2237 ret = (wrtprt & SDMMC_WRITE_PROTECT)?1:0;
2244 ret = 0;//no write-protect
2257 static void rk29_sdmmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
2260 unsigned long flags;
2261 struct rk29_sdmmc *host = mmc_priv(mmc);
2263 spin_lock_irqsave(&host->lock, flags);
2264 intmask = rk29_sdmmc_read(host->regs, SDMMC_INTMASK);
2267 rk29_sdmmc_write(host->regs, SDMMC_INTMASK, intmask | SDMMC_INT_SDIO);
2269 rk29_sdmmc_write(host->regs, SDMMC_INTMASK, intmask & ~SDMMC_INT_SDIO);
2270 spin_unlock_irqrestore(&host->lock, flags);
2273 static void rk29_sdmmc_init_card(struct mmc_host *mmc, struct mmc_card *card)
2275 card->quirks = MMC_QUIRK_BLKSZ_FOR_BYTE_MODE;
2279 static int rk29_sdmmc_clear_fifo(struct rk29_sdmmc *host)
2281 unsigned int timeout, value;
2282 int ret = SDM_SUCCESS;
2284 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
2286 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS, 0xFFFFFFFF);
2289 rk29_sdmmc_stop_dma(host);
2290 rk29_sdmmc_control_host_dma(host, FALSE);
2294 for(timeout=0; timeout<FIFO_DEPTH; timeout++)
2296 if(rk29_sdmmc_read(host->regs, SDMMC_STATUS) & SDMMC_STAUTS_FIFO_EMPTY)
2299 value = rk29_sdmmc_read(host->regs, SDMMC_DATA);
2304 value = rk29_sdmmc_read(host->regs, SDMMC_CTRL);
2305 value |= (SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET | SDMMC_CTRL_DMA_RESET);
2306 rk29_sdmmc_write(host->regs, SDMMC_CTRL, value);
2308 value = rk29_sdmmc_read(host->regs, SDMMC_CTRL);
2310 while( (value & (SDMMC_CTRL_FIFO_RESET | SDMMC_CTRL_RESET | SDMMC_CTRL_DMA_RESET)) && (timeout > 0))
2314 value = rk29_sdmmc_read(host->regs, SDMMC_CTRL);
2319 host->errorstep = 0x0A;
2320 ret = SDM_WAIT_FOR_FIFORESET_TIMEOUT;
2328 static const struct mmc_host_ops rk29_sdmmc_ops[] = {
2330 .request = rk29_sdmmc_request,
2331 .set_ios = rk29_sdmmc_set_ios,
2332 .get_ro = rk29_sdmmc_get_ro,
2333 .get_cd = rk29_sdmmc_get_cd,
2336 .request = rk29_sdmmc_request,
2337 .set_ios = rk29_sdmmc_set_ios,
2338 .get_ro = rk29_sdmmc_get_ro,
2339 .get_cd = rk29_sdmmc_get_cd,
2340 .enable_sdio_irq = rk29_sdmmc_enable_sdio_irq,
2341 .init_card = rk29_sdmmc_init_card,
2345 static void rk29_sdmmc_request_end(struct rk29_sdmmc *host, struct mmc_command *cmd)
2347 u32 status = host->data_status;
2348 int output=SDM_SUCCESS;
2350 xbwprintk(7, "%s..%d... cmd=%d, host->state=0x%x,\n pendingEvent=0x%lu, completeEvents=0x%lu ====xbw=[%s]====\n\n",\
2351 __FUNCTION__, __LINE__,cmd->opcode,host->state, host->pending_events,host->completed_events,host->dma_name);
2353 del_timer_sync(&host->DTO_timer);
2355 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
2357 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS, 0xFFFFFFFF); //added by xbw at 2011-08-15
2363 rk29_sdmmc_stop_dma(host);
2364 rk29_sdmmc_control_host_dma(host, FALSE);
2370 goto exit;//It need not to wait-for-busy if the CMD-ERROR happen.
2372 host->errorstep = 0xf7;
2375 if(host->cmdr & SDMMC_CMD_DAT_WRITE)
2377 if(status & (SDMMC_INT_DCRC | SDMMC_INT_EBE))
2379 cmd->data->error = -EILSEQ;
2380 output = SDM_DATA_CRC_ERROR;
2381 host->errorstep = 0x16;
2385 output = rk29_sdmmc_wait_unbusy(host);
2386 if(SDM_SUCCESS != output)
2388 host->errorstep = 0x17;
2389 cmd->data->error = -ETIMEDOUT;
2392 host->data->bytes_xfered = host->data->blocks * host->data->blksz;
2397 if( status & SDMMC_INT_SBE)
2399 cmd->data->error = -EIO;
2400 host->errorstep = 0x18;
2401 output = SDM_START_BIT_ERROR;
2403 else if((status & SDMMC_INT_EBE) && (cmd->opcode != 14)) //MMC4.0, BUSTEST_R, A host read the reserved bus testing data parttern from a card.
2405 cmd->data->error = -EILSEQ;
2406 host->errorstep = 0x19;
2407 output = SDM_END_BIT_ERROR;
2409 else if(status & SDMMC_INT_DRTO)
2411 cmd->data->error = -ETIMEDOUT;
2412 host->errorstep = 0x1A;
2413 output = SDM_DATA_READ_TIMEOUT;
2415 else if(status & SDMMC_INT_DCRC)
2417 host->errorstep = 0x1B;
2418 cmd->data->error = -EILSEQ;
2419 output = SDM_DATA_CRC_ERROR;
2423 output = rk29_sdmmc_read_remain_data(host, (host->data->blocks * host->data->blksz), host->pbuf);
2424 if(SDM_SUCCESS == output)
2426 host->data->bytes_xfered = host->data->blocks * host->data->blksz;
2432 if(SDM_SUCCESS == output)
2434 if ((mmc_resp_type(cmd) == MMC_RSP_R1B) || (MMC_STOP_TRANSMISSION == cmd->opcode))
2436 output = rk29_sdmmc_wait_unbusy(host);
2437 if((SDM_SUCCESS != output) && (!host->mrq->cmd->error))
2439 printk("%s..%d... CMD12 wait busy timeout!!!!! errorStep=0x%x ====xbw=[%s]====\n", \
2440 __FUNCTION__, __LINE__, host->errorstep, host->dma_name);
2441 rk29_sdmmc_clear_fifo(host);
2442 cmd->error = -ETIMEDOUT;
2443 host->mrq->cmd->error = -ETIMEDOUT;
2444 host->errorstep = 0x1C;
2448 host->errorstep = 0xf6;
2451 if(cmd->data && cmd->data->error)
2453 if( (!cmd->error) && (0==cmd->retries))
2455 printk("%s..%d......CMD=%d error!!!(arg=0x%x,cmdretry=%d,blksize=%d, blocks=%d), \n \
2456 statusReg=0x%x, ctrlReg=0x%x, nerrorTimes=%d, errorStep=0x%x ====xbw[%s]====\n",\
2457 __FUNCTION__, __LINE__, cmd->opcode, cmd->arg, cmd->retries,cmd->data->blksz, cmd->data->blocks,
2458 rk29_sdmmc_read(host->regs, SDMMC_STATUS),
2459 rk29_sdmmc_read(host->regs, SDMMC_CTRL),
2460 host->error_times,host->errorstep, host->dma_name);
2462 cmd->error = -ENODATA;
2464 host->errorstep = 0xf5;
2468 #ifdef RK29_SDMMC_LIST_QUEUE
2469 if (!list_empty(&host->queue))
2471 printk("%s..%d.. Danger!Danger!. continue the next request in the queue. ====xbw[%s]====\n",\
2472 __FUNCTION__, __LINE__, host->dma_name);
2474 host = list_entry(host->queue.next,
2475 struct rk29_sdmmc, queue_node);
2476 list_del(&host->queue_node);
2477 host->state = STATE_SENDING_CMD;
2478 rk29_sdmmc_start_request(host->mmc);
2482 dev_vdbg(&host->pdev->dev, "list empty\n");
2483 host->state = STATE_IDLE;
2486 dev_vdbg(&host->pdev->dev, "list empty\n");
2487 host->state = STATE_IDLE;
2492 static int rk29_sdmmc_command_complete(struct rk29_sdmmc *host,
2493 struct mmc_command *cmd)
2495 u32 value, status = host->cmd_status;
2496 int timeout, output= SDM_SUCCESS;
2498 xbwprintk(7, "%s..%d. cmd=%d, host->state=0x%x, cmdINT=0x%x\n,pendingEvent=0x%lu,completeEvents=0x%lu ===xbw[%s]===\n\n",\
2499 __FUNCTION__, __LINE__,cmd->opcode,host->state,status, host->pending_events,host->completed_events,host->dma_name);
2502 del_timer_sync(&host->request_timer);
2504 host->cmd_status = 0;
2506 if((RK29_CTRL_SDMMC_ID == host->pdev->id) && (host->cmdr & SDMMC_CMD_STOP))
2508 output = rk29_sdmmc_reset_fifo(host);
2509 if (SDM_SUCCESS != output)
2511 printk("%s..%d......reset fifo fail! CMD%d(arg=0x%x, Retries=%d) =======xbw[%s]=====\n",__FUNCTION__, __LINE__, \
2512 cmd->opcode, cmd->arg, cmd->retries,host->dma_name);
2514 cmd->error = -ETIMEDOUT;
2515 host->mrq->cmd->error = cmd->error;
2517 host->errorstep = 0x1C;
2522 if(status & SDMMC_INT_RTO)
2524 cmd->error = -ENOMEM;
2525 host->mrq->cmd->error = cmd->error;
2526 output = SDM_BUSY_TIMEOUT;
2528 //rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_RTO);
2529 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,0xFFFFFFFF); //modifyed by xbw at 2011-08-15
2531 if(host->use_dma)//if(host->dodma)
2535 rk29_sdmmc_stop_dma(host);
2536 rk29_sdmmc_control_host_dma(host, FALSE);
2540 value = rk29_sdmmc_read(host->regs, SDMMC_CTRL);
2541 value |= SDMMC_CTRL_FIFO_RESET;
2542 rk29_sdmmc_write(host->regs, SDMMC_CTRL, value);
2545 while (((value = rk29_sdmmc_read(host->regs, SDMMC_CTRL)) & (SDMMC_CTRL_FIFO_RESET)) && (timeout > 0))
2553 host->errorstep = 0x1D;
2554 printk("%s..%d......reset CTRL fail! CMD%d(arg=0x%x, Retries=%d) ===xbw[%s]===\n",\
2555 __FUNCTION__, __LINE__, cmd->opcode, cmd->arg, cmd->retries,host->dma_name);
2563 if(cmd->flags & MMC_RSP_PRESENT)
2565 if(cmd->flags & MMC_RSP_136)
2567 cmd->resp[3] = rk29_sdmmc_read(host->regs, SDMMC_RESP0);
2568 cmd->resp[2] = rk29_sdmmc_read(host->regs, SDMMC_RESP1);
2569 cmd->resp[1] = rk29_sdmmc_read(host->regs, SDMMC_RESP2);
2570 cmd->resp[0] = rk29_sdmmc_read(host->regs, SDMMC_RESP3);
2574 cmd->resp[0] = rk29_sdmmc_read(host->regs, SDMMC_RESP0);
2580 del_timer_sync(&host->DTO_timer);
2583 if((0==cmd->retries) && (host->error_times++%RK29_ERROR_PRINTK_INTERVAL == 0) && (12 != cmd->opcode))
2585 if( ((RK29_CTRL_SDMMC_ID==host->pdev->id)&&(MMC_SLEEP_AWAKE!=cmd->opcode)) ||
2586 ((RK29_CTRL_SDMMC_ID!=host->pdev->id)&&(MMC_SEND_EXT_CSD!=cmd->opcode)) )
2588 printk("%s..%d...CMD%d(arg=0x%x), hoststate=%d, errorTimes=%d, errorStep=0x%x ! ===xbw[%s]===\n",\
2589 __FUNCTION__, __LINE__, cmd->opcode, cmd->arg, host->state,host->error_times,host->errorstep, host->dma_name);
2594 del_timer_sync(&host->request_timer);
2600 del_timer_sync(&host->request_timer);
2601 del_timer_sync(&host->DTO_timer);
2603 if((0==cmd->retries) && (host->error_times++%RK29_ERROR_PRINTK_INTERVAL == 0))
2605 printk("%s..%d....command_complete(CMD=%d, arg=%x) error=%d =======xbw[%s]=====\n",\
2606 __FUNCTION__, __LINE__, host->cmd->opcode,host->cmd->arg, output, host->dma_name);
2614 static void rk29_sdmmc_start_error(struct rk29_sdmmc *host)
2616 host->cmd->error = -EIO;
2617 host->mrq->cmd->error = -EIO;
2618 host->cmd_status |= SDMMC_INT_RTO;
2620 del_timer_sync(&host->request_timer);
2622 rk29_sdmmc_command_complete(host, host->mrq->cmd);
2623 rk29_sdmmc_request_end(host, host->mrq->cmd);
2627 static void rk29_sdmmc_tasklet_func(unsigned long priv)
2629 struct rk29_sdmmc *host = (struct rk29_sdmmc *)priv;
2630 struct mmc_data *data = host->cmd->data;
2631 enum rk29_sdmmc_state state = host->state;
2632 int pending_flag, stopflag;
2633 unsigned long iflags;
2635 spin_lock_irqsave(&host->lock, iflags);
2637 state = host->state;
2647 xbwprintk(7, "%s..%d.. prev_state= STATE_IDLE ====xbw[%s]====\n", \
2648 __FUNCTION__, __LINE__, host->dma_name);
2652 case STATE_SENDING_CMD:
2654 xbwprintk(7, "%s..%d.. prev_state= STATE_SENDING_CMD, pendingEvernt=0x%lu ====xbw[%s]====\n",\
2655 __FUNCTION__, __LINE__,host->completed_events, host->dma_name);
2657 if (!rk29_sdmmc_test_and_clear_pending(host, EVENT_CMD_COMPLETE))
2659 host->errorstep = 0xfb;
2661 del_timer_sync(&host->request_timer); //delete the timer for INT_COME_DONE
2663 rk29_sdmmc_set_completed(host, EVENT_CMD_COMPLETE);
2664 rk29_sdmmc_command_complete(host, host->cmd);
2669 rk29_sdmmc_request_end(host, host->cmd);
2671 xbwprintk(7, "%s..%d.. CMD%d call mmc_request_done()====xbw[%s]====\n", \
2672 __FUNCTION__, __LINE__,host->cmd->opcode,host->dma_name);
2674 host->complete_done = 1;
2677 host->errorstep = 0xfa;
2678 if(host->cmd->error)
2680 del_timer_sync(&host->DTO_timer); //delete the timer for INT_DTO
2684 xbwprintk(7, "%s..%d.. cmderr, so call send_stop_cmd() ====xbw[%s]====\n", \
2685 __FUNCTION__, __LINE__, host->dma_name);
2688 state = STATE_SENDING_CMD;//STATE_SENDING_STOP;
2689 send_stop_cmd(host);
2691 stopflag = 1; //Moidfyed by xbw at 2011-09-08
2696 rk29_sdmmc_set_pending(host, EVENT_DATA_COMPLETE);
2699 host->errorstep = 0xf9;
2700 state = STATE_DATA_BUSY;
2704 case STATE_DATA_BUSY:
2706 xbwprintk(7, "%s..%d.. prev_state= STATE_DATA_BUSY, pendingEvernt=0x%lu ====xbw[%s]====\n", \
2707 __FUNCTION__, __LINE__,host->pending_events, host->dma_name);
2709 if (!rk29_sdmmc_test_and_clear_pending(host, EVENT_DATA_COMPLETE))
2711 host->errorstep = 0xf8;
2712 rk29_sdmmc_set_completed(host, EVENT_DATA_COMPLETE);
2713 del_timer_sync(&host->DTO_timer); //delete the timer for INT_DTO
2715 rk29_sdmmc_request_end(host, host->cmd);
2717 if (data && !data->stop)
2719 xbwprintk(7, "%s..%d.. CMD%d call mmc_request_done()====xbw[%s]====\n", \
2720 __FUNCTION__, __LINE__,host->cmd->opcode,host->dma_name);
2722 if(!( (MMC_READ_SINGLE_BLOCK == host->cmd->opcode)&&( -EIO == data->error))) //deal with START_BIT_ERROR
2724 host->complete_done = 2;
2729 host->errorstep = 0xf4;
2730 xbwprintk(7, "%s..%d.. after DATA_COMPLETE, so call send_stop_cmd() ====xbw[%s]====\n", \
2731 __FUNCTION__, __LINE__, host->dma_name);
2734 state = STATE_SENDING_CMD;
2735 send_stop_cmd(host);
2737 stopflag = 2; //Moidfyed by xbw at 2011-09-08
2743 case STATE_SENDING_STOP:
2745 xbwprintk(7, "%s..%d.. prev_state= STATE_SENDING_STOP, pendingEvernt=0x%lu ====xbw[%s]====\n", \
2746 __FUNCTION__, __LINE__, host->pending_events, host->dma_name);
2748 if (!rk29_sdmmc_test_and_clear_pending(host, EVENT_CMD_COMPLETE))
2751 rk29_sdmmc_command_complete(host, host->cmd);
2752 del_timer_sync(&host->request_timer); //delete the timer for INT_CMD_DONE int CMD12
2753 rk29_sdmmc_request_end(host, host->cmd);
2755 host->complete_done = 3;
2761 pending_flag = (host->complete_done > 0) && (host->retryfunc<50) \
2762 && (rk29_sdmmc_test_pending(host, EVENT_CMD_COMPLETE)|| rk29_sdmmc_test_pending(host, EVENT_DATA_COMPLETE) );
2765 xbwprintk(7, "%s..%d... cmd=%d(arg=0x%x),completedone=%d, retrycount=%d, doneflag=%d, \n \
2766 host->state=0x%x, switchstate=%x, \n \
2767 pendingEvent=0x%lu, completeEvents=0x%lu, \n \
2768 mrqCMD=%d, arg=0x%x \n ====xbw[%s]====\n",\
2770 __FUNCTION__, __LINE__,host->cmd->opcode, host->cmd->arg, host->complete_done,\
2771 host->retryfunc, host->mmc->doneflag,host->state, state, \
2772 host->pending_events,host->completed_events,\
2773 host->mrq->cmd->opcode, host->mrq->cmd->arg, host->dma_name);
2778 } while(pending_flag && ++host->retryfunc); //while(0);
2782 if(host->cmd->error)
2783 xbwprintk(3,"%d: call send_stop_cmd== %d, completedone=%d, doneflag=%d, hoststate=%x, statusReg=0x%x \n", \
2784 __LINE__,stopflag, host->complete_done, host->mmc->doneflag, state, rk29_sdmmc_read(host->regs, SDMMC_STATUS));
2786 state = STATE_SENDING_CMD;
2787 send_stop_cmd(host); //Moidfyed by xbw at 2011-09-08
2790 host->state = state;
2792 if(0==host->complete_done)
2794 host->errorstep = 0xf2;
2795 spin_unlock_irqrestore(&host->lock, iflags);
2798 host->errorstep = 0xf3;
2799 host->state = STATE_IDLE;
2801 if(host->mrq && host->mmc->doneflag)
2803 host->mmc->doneflag = 0;
2804 spin_unlock_irqrestore(&host->lock, iflags);
2806 mmc_request_done(host->mmc, host->mrq);
2810 spin_unlock_irqrestore(&host->lock, iflags);
2815 static inline void rk29_sdmmc_cmd_interrupt(struct rk29_sdmmc *host, u32 status)
2819 host->cmd_status |= status;
2820 host->errorstep = 0xfc;
2821 if((MMC_STOP_TRANSMISSION != host->cmd->opcode) && (host->cmdr & SDMMC_CMD_DAT_EXP))
2824 multi = rk29_sdmmc_read(host->regs, SDMMC_BYTCNT)/unit;
2825 multi += ((rk29_sdmmc_read(host->regs, SDMMC_BYTCNT)%unit) ? 1 :0 );
2826 multi = (multi>0) ? multi : 1;
2827 multi += (host->cmd->retries>2)?2:host->cmd->retries;
2828 mod_timer(&host->DTO_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_WAIT_DTO_INTERNVAL*multi));//max wait 8s larger
2832 rk29_sdmmc_set_pending(host, EVENT_CMD_COMPLETE);
2833 tasklet_schedule(&host->tasklet);
2836 static irqreturn_t rk29_sdmmc_interrupt(int irq, void *dev_id)
2838 struct rk29_sdmmc *host = dev_id;
2839 u32 status, pending;
2842 unsigned long iflags;
2844 spin_lock_irqsave(&host->lock, iflags);
2846 status = rk29_sdmmc_read(host->regs, SDMMC_RINTSTS);
2847 pending = rk29_sdmmc_read(host->regs, SDMMC_MINTSTS);// read only mask reg
2854 if(pending & SDMMC_INT_CD)
2856 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS, SDMMC_INT_CD); // clear sd detect int
2857 present = rk29_sdmmc_get_cd(host->mmc);
2858 present_old = test_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
2860 if(present != present_old)
2862 printk("\n******************\n%s:INT_CD=0x%x,INT-En=%d,hostState=%d, present Old=%d ==> New=%d ==xbw[%s]==\n",\
2863 __FUNCTION__, pending, host->mmc->re_initialized_flags, host->state, present_old, present, host->dma_name);
2865 rk28_send_wakeup_key(); //wake up backlight
2866 host->error_times = 0;
2869 del_timer_sync(&host->request_timer);
2870 del_timer_sync(&host->DTO_timer);
2871 rk29_sdmmc_dealwith_timeout(host);
2876 set_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
2878 if(host->mmc->re_initialized_flags)
2880 mod_timer(&host->detect_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_REMOVAL_DELAY));
2884 mod_timer(&host->detect_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_REMOVAL_DELAY*2));
2889 clear_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
2890 host->mmc->re_initialized_flags = 0;
2892 mmc_detect_change(host->mmc, 200);
2902 if (pending & SDMMC_INT_CMD_DONE) {
2904 xbwprintk(6, "%s..%d.. CMD%d INT_CMD_DONE INT=0x%x ====xbw[%s]====\n", \
2905 __FUNCTION__, __LINE__, host->cmd->opcode,pending, host->dma_name);
2907 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_CMD_DONE); // clear interrupt
2909 rk29_sdmmc_cmd_interrupt(host, status);
2914 if(pending & SDMMC_INT_SDIO)
2916 xbwprintk(7, "%s..%d.. INT_SDIO INT=0x%x ====xbw[%s]====\n", \
2917 __FUNCTION__, __LINE__, pending, host->dma_name);
2919 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_SDIO);
2920 mmc_signal_sdio_irq(host->mmc);
2926 if(pending & SDMMC_INT_RTO)
2928 xbwprintk(7, "%s..%d.. CMD%d CMD_ERROR_FLAGS INT=0x%x ====xbw[%s]====\n", \
2929 __FUNCTION__, __LINE__, host->cmd->opcode,pending, host->dma_name);
2931 //rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_RTO);
2932 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,0xFFFFFFFF); //Modifyed by xbw at 2011-08-15
2933 host->cmd_status = status;
2935 rk29_sdmmc_set_pending(host, EVENT_CMD_COMPLETE);
2937 if(!(pending & SDMMC_INT_CMD_DONE))
2938 tasklet_schedule(&host->tasklet);
2944 if(pending & SDMMC_INT_HLE)
2946 printk("%s: Error due to hardware locked. Please check your hardware. INT=0x%x, CMD%d(arg=0x%x, retries=%d)==xbw[%s]==\n",\
2947 __FUNCTION__, pending,host->cmd->opcode, host->cmd->arg, host->cmd->retries, host->dma_name);
2949 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_HLE);
2954 if(pending & SDMMC_INT_DTO)
2956 xbwprintk(7, "%s..%d.. CMD%d INT_DTO INT=0x%x ==xbw[%s]==\n", \
2957 __FUNCTION__, __LINE__,host->cmd->opcode,pending, host->dma_name);
2959 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_DTO);
2960 del_timer_sync(&host->DTO_timer); //delete the timer for INT_DTO
2962 host->data_status |= status;
2966 rk29_sdmmc_set_pending(host, EVENT_DATA_COMPLETE);
2967 tasklet_schedule(&host->tasklet);
2972 if (pending & SDMMC_INT_FRUN)
2974 printk("%s: INT=0x%x Oh!My God,let me see!What happened?Why?Where? CMD%d(arg=0x%x, retries=%d) ==xbw[%s]==\n", \
2975 __FUNCTION__, pending, host->cmd->opcode, host->cmd->arg, host->cmd->retries,host->dma_name);
2977 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_FRUN);
2981 if (pending & SDMMC_INT_RXDR)
2983 xbwprintk(6, "%s..%d.. SDMMC_INT_RXDR INT=0x%x ====xbw[%s]====\n", \
2984 __FUNCTION__, __LINE__, pending, host->dma_name);
2986 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_RXDR); // clear interrupt
2987 rk29_sdmmc_do_pio_read(host);
2990 if (pending & SDMMC_INT_TXDR)
2992 xbwprintk(6, "%s..%d.. SDMMC_INT_TXDR INT=0x%x ====xbw[%s]====\n", \
2993 __FUNCTION__, __LINE__, pending, host->dma_name);
2995 rk29_sdmmc_do_pio_write(host);
2997 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_TXDR); // clear interrupt
3002 spin_unlock_irqrestore(&host->lock, iflags);
3008 * MMC card detect thread, kicked off from detect interrupt, 1 timer
3011 static void rk29_sdmmc_detect_change(unsigned long data)
3013 struct rk29_sdmmc *host = (struct rk29_sdmmc *)data;
3020 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
3022 host->mmc->re_initialized_flags =1;
3025 mmc_detect_change(host->mmc, 0);
3029 static void rk29_sdmmc1_check_status(unsigned long data)
3031 struct rk29_sdmmc *host = (struct rk29_sdmmc *)data;
3032 struct rk29_sdmmc_platform_data *pdata = host->pdev->dev.platform_data;
3033 unsigned int status;
3035 status = pdata->status(mmc_dev(host->mmc));
3037 pr_info("%s: slot status change detected(%d-%d)\n",mmc_hostname(host->mmc), host->oldstatus, status);
3039 if (status ^ host->oldstatus)
3043 rk29_sdmmc_hw_init(host);
3044 set_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
3045 mod_timer(&host->detect_timer, jiffies + msecs_to_jiffies(200));
3049 clear_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
3050 rk29_sdmmc_detect_change((unsigned long)host);
3054 host->oldstatus = status;
3057 static void rk29_sdmmc1_status_notify_cb(int card_present, void *dev_id)
3059 struct rk29_sdmmc *host = dev_id;
3060 //printk(KERN_INFO "%s, card_present %d\n", mmc_hostname(host->mmc), card_present);
3061 rk29_sdmmc1_check_status((unsigned long)host);
3065 static int rk29_sdmmc_probe(struct platform_device *pdev)
3067 struct mmc_host *mmc;
3068 struct rk29_sdmmc *host;
3069 struct resource *regs;
3070 struct rk29_sdmmc_platform_data *pdata;
3074 /* must have platform data */
3075 pdata = pdev->dev.platform_data;
3077 dev_err(&pdev->dev, "Platform data missing\n");
3079 host->errorstep = 0x87;
3083 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
3086 host->errorstep = 0x88;
3090 mmc = mmc_alloc_host(sizeof(struct rk29_sdmmc), &pdev->dev);
3093 host->errorstep = 0x89;
3098 host = mmc_priv(mmc);
3102 host->ctype = 0; // set default 1 bit mode
3103 host->errorstep = 0;
3105 host->old_cmd = 100;
3107 host->old_div = 0xFF;
3108 host->error_times = 0;
3109 host->state = STATE_IDLE;
3110 host->complete_done = 0;
3111 host->retryfunc = 0;
3113 host->new_mrq = NULL;
3116 host->gpio_det = pdata->detect_irq;
3118 host->set_iomux = pdata->set_iomux;
3123 spin_lock_init(&host->lock);
3125 #ifdef RK29_SDMMC_LIST_QUEUE
3126 INIT_LIST_HEAD(&host->queue);
3129 host->clk = clk_get(&pdev->dev, "mmc");
3131 #if RK29_SDMMC_DEFAULT_SDIO_FREQ
3132 clk_set_rate(host->clk,SDHC_FPP_FREQ);
3134 if(RK29_CTRL_SDMMC_ID== host->pdev->id)
3135 clk_set_rate(host->clk,SDHC_FPP_FREQ);
3137 clk_set_rate(host->clk,RK29_MAX_SDIO_FREQ);
3141 clk_enable(host->clk);
3142 clk_enable(clk_get(&pdev->dev, "hclk_mmc"));
3145 host->regs = ioremap(regs->start, regs->end - regs->start + 1);
3148 host->errorstep = 0x8A;
3152 mmc->ops = &rk29_sdmmc_ops[pdev->id];
3153 mmc->pm_flags |= MMC_PM_IGNORE_PM_NOTIFY;
3154 mmc->f_min = FOD_FREQ;
3156 #if RK29_SDMMC_DEFAULT_SDIO_FREQ
3157 mmc->f_max = SDHC_FPP_FREQ;
3159 if(RK29_CTRL_SDMMC_ID== host->pdev->id)
3161 mmc->f_max = SDHC_FPP_FREQ;
3165 mmc->f_max = RK29_MAX_SDIO_FREQ;
3169 //mmc->ocr_avail = pdata->host_ocr_avail;
3170 mmc->ocr_avail = MMC_VDD_27_28|MMC_VDD_28_29|MMC_VDD_29_30|MMC_VDD_30_31
3171 | MMC_VDD_31_32|MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_34_35| MMC_VDD_35_36; ///set valid volage 2.7---3.6v
3172 mmc->caps = pdata->host_caps;
3173 mmc->re_initialized_flags = 1;
3175 mmc->sdmmc_host_hw_init = rk29_sdmmc_hw_init;
3180 mmc->max_phys_segs = 64;
3181 mmc->max_hw_segs = 64;
3184 * Block size can be up to 2048 bytes, but must be a power of two.
3186 mmc->max_blk_size = 4095;
3189 * No limit on the number of blocks transferred.
3191 mmc->max_blk_count = 4096;
3194 * Since we only have a 16-bit data length register, we must
3195 * ensure that we don't exceed 2^16-1 bytes in a single request.
3197 mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count; //8M bytes(2K*4K)
3200 * Set the maximum segment size. Since we aren't doing DMA
3201 * (yet) we are only limited by the data length register.
3203 mmc->max_seg_size = mmc->max_req_size;
3205 tasklet_init(&host->tasklet, rk29_sdmmc_tasklet_func, (unsigned long)host);
3207 /* Create card detect handler thread */
3208 setup_timer(&host->detect_timer, rk29_sdmmc_detect_change,(unsigned long)host);
3209 setup_timer(&host->request_timer,rk29_sdmmc_INT_CMD_DONE_timeout,(unsigned long)host);
3210 setup_timer(&host->DTO_timer,rk29_sdmmc_INT_DTO_timeout,(unsigned long)host);
3212 irq = platform_get_irq(pdev, 0);
3215 host->errorstep = 0x8B;
3220 memcpy(host->dma_name, pdata->dma_name, 8);
3221 host->use_dma = pdata->use_dma;
3226 host->dma_info = rk29_sdmmc_dma_infos[host->pdev->id];
3227 ret = rk29_dma_request(host->dma_info.chn, &(host->dma_info.client), NULL);
3230 printk("%s..%d...rk29_dma_request error=%d.===xbw[%s]====\n", \
3231 __FUNCTION__, __LINE__,ret, host->dma_name);
3232 host->errorstep = 0x97;
3236 #if 0 //deal with the old API of DMA-module
3237 ret = rk29_dma_config(host->dma_info.chn, 4);
3238 #else //deal with the new API of DMA-module
3239 if(RK29_CTRL_SDMMC_ID== host->pdev->id)
3241 ret = rk29_dma_config(host->dma_info.chn, 4, 16);
3245 ret = rk29_dma_config(host->dma_info.chn, 4, 1);
3250 printk("%s..%d.. rk29_dma_config error=%d ====xbw[%s]====\n", \
3251 __FUNCTION__, __LINE__, ret, host->dma_name);
3252 host->errorstep = 0x98;
3256 ret = rk29_dma_set_buffdone_fn(host->dma_info.chn, rk29_sdmmc_dma_complete);
3259 printk("%s..%d.. dma_set_buffdone_fn error=%d ====xbw[%s]====\n", \
3260 __FUNCTION__, __LINE__, ret, host->dma_name);
3261 host->errorstep = 0x99;
3265 host->dma_addr = regs->start + SDMMC_DATA;
3268 #if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) || defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT)
3269 host->write_protect = pdata->write_prt;
3272 rk29_sdmmc_hw_init(host);
3274 ret = request_irq(irq, rk29_sdmmc_interrupt, 0, dev_name(&pdev->dev), host);
3278 printk("%s..%d.. request_irq error=%d ====xbw[%s]====\n", \
3279 __FUNCTION__, __LINE__, ret, host->dma_name);
3280 host->errorstep = 0x8C;
3284 /* setup sdmmc1 wifi card detect change */
3285 if (pdata->register_status_notify) {
3286 pdata->register_status_notify(rk29_sdmmc1_status_notify_cb, host);
3289 if(RK29_CTRL_SDMMC_ID== host->pdev->id)
3291 if(rk29_sdmmc_get_cd(host->mmc))
3293 set_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
3297 clear_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
3302 #if defined(CONFIG_USE_SDMMC0_FOR_WIFI_DEVELOP_BOARD)
3303 if(0== host->pdev->id)
3305 set_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
3309 #if defined(CONFIG_USE_SDMMC1_FOR_WIFI_DEVELOP_BOARD)
3310 if(1== host->pdev->id)
3312 set_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
3318 /* sdmmc1 wifi card slot status initially */
3319 if (pdata->status) {
3320 host->oldstatus = pdata->status(mmc_dev(host->mmc));
3321 if (host->oldstatus) {
3322 set_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
3324 clear_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
3329 platform_set_drvdata(pdev, mmc);
3333 #ifdef RK29_SDMMC_NOTIFY_REMOVE_INSERTION
3335 globalSDhost[pdev->id] = (struct rk29_sdmmc *)host;
3336 if(0== host->pdev->id)
3338 rk29_sdmmc_progress_add_attr(pdev);
3342 #if defined (CONFIG_DEBUG_FS)
3343 rk29_sdmmc_init_debugfs(host);
3346 printk(".Line%d..The End of SDMMC-probe %s ===xbw[%s]===\n\n", __LINE__, RK29_SDMMC_VERSION,host->dma_name);
3353 rk29_dma_free(host->dma_info.chn, &host->dma_info.client);
3357 iounmap(host->regs);
3369 static int __exit rk29_sdmmc_remove(struct platform_device *pdev)
3372 struct mmc_host *mmc = platform_get_drvdata(pdev);
3373 struct rk29_sdmmc *host;
3374 struct resource *regs;
3379 host = mmc_priv(mmc);
3382 rk29_sdmmc_control_clock(host, 0);
3384 /* Shutdown detect IRQ and kill detect thread */
3385 del_timer_sync(&host->detect_timer);
3386 del_timer_sync(&host->request_timer);
3387 del_timer_sync(&host->DTO_timer);
3389 tasklet_disable(&host->tasklet);
3390 free_irq(platform_get_irq(pdev, 0), host);
3393 rk29_dma_free(host->dma_info.chn, &host->dma_info.client);
3396 mmc_remove_host(mmc);
3398 iounmap(host->regs);
3400 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
3401 release_mem_region(regs->start,resource_size(regs));
3404 platform_set_drvdata(pdev, NULL);
3412 static irqreturn_t det_keys_isr(int irq, void *dev_id)
3414 struct rk29_sdmmc *host = dev_id;
3415 dev_info(&host->pdev->dev, "sd det_gpio changed(%s), send wakeup key!\n",
3416 gpio_get_value(RK29_PIN2_PA2)?"removed":"insert");
3417 rk29_sdmmc_detect_change((unsigned long)dev_id);
3422 static int rk29_sdmmc_sdcard_suspend(struct rk29_sdmmc *host)
3425 rk29_mux_api_set(GPIO2A2_SDMMC0DETECTN_NAME, GPIO2L_GPIO2A2);
3426 gpio_request(RK29_PIN2_PA2, "sd_detect");
3427 gpio_direction_input(RK29_PIN2_PA2);
3429 host->gpio_irq = gpio_to_irq(RK29_PIN2_PA2);
3430 ret = request_irq(host->gpio_irq, det_keys_isr,
3431 (gpio_get_value(RK29_PIN2_PA2))?IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING,
3435 enable_irq_wake(host->gpio_irq);
3439 static void rk29_sdmmc_sdcard_resume(struct rk29_sdmmc *host)
3441 disable_irq_wake(host->gpio_irq);
3442 free_irq(host->gpio_irq,host);
3443 gpio_free(RK29_PIN2_PA2);
3444 rk29_mux_api_set(GPIO2A2_SDMMC0DETECTN_NAME, GPIO2L_SDMMC0_DETECT_N);
3449 static int rk29_sdmmc_suspend(struct platform_device *pdev, pm_message_t state)
3451 struct mmc_host *mmc = platform_get_drvdata(pdev);
3452 struct rk29_sdmmc *host = mmc_priv(mmc);
3455 if(host && host->pdev && (RK29_CTRL_SDMMC_ID == host->pdev->id)) //only the SDMMC0 have suspend-resume; noted by xbw
3458 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))
3459 ret = mmc_suspend_host(mmc);
3461 ret = mmc_suspend_host(mmc, state);
3464 if(rk29_sdmmc_sdcard_suspend(host) < 0)
3465 dev_info(&host->pdev->dev, "rk29_sdmmc_sdcard_suspend error\n");
3471 static int rk29_sdmmc_resume(struct platform_device *pdev)
3473 struct mmc_host *mmc = platform_get_drvdata(pdev);
3474 struct rk29_sdmmc *host = mmc_priv(mmc);
3477 if(host && host->pdev && (RK29_CTRL_SDMMC_ID == host->pdev->id)) //only the SDMMC0 have suspend-resume; noted by xbw
3481 rk29_sdmmc_sdcard_resume(host);
3482 ret = mmc_resume_host(mmc);
3489 #define rk29_sdmmc_suspend NULL
3490 #define rk29_sdmmc_resume NULL
3493 static struct platform_driver rk29_sdmmc_driver = {
3494 .suspend = rk29_sdmmc_suspend,
3495 .resume = rk29_sdmmc_resume,
3496 .remove = __exit_p(rk29_sdmmc_remove),
3498 .name = "rk29_sdmmc",
3502 static int __init rk29_sdmmc_init(void)
3504 return platform_driver_probe(&rk29_sdmmc_driver, rk29_sdmmc_probe);
3507 static void __exit rk29_sdmmc_exit(void)
3509 platform_driver_unregister(&rk29_sdmmc_driver);
3512 module_init(rk29_sdmmc_init);
3513 module_exit(rk29_sdmmc_exit);
3515 MODULE_DESCRIPTION("Rk29 Multimedia Card Interface driver");
3516 MODULE_AUTHOR("xbw@rock-chips.com");
3517 MODULE_LICENSE("GPL v2");