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_RTO | 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 2000 //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 1500 //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.1.17 The last modify date is 2011-08-08,modifyed by XBW."
79 #define RK29_CTRL_SDMMC_ID 0 //mainly used by SDMMC
80 #define RK29_CTRL_SDIO1_ID 1 //mainly used by sdio-wifi
81 #define RK29_CTRL_SDIO2_ID 2 //mainly used by sdio-card
83 #define RK29_SDMMC_NOTIFY_REMOVE_INSERTION /* use sysfs to notify the removal or insertion of sd-card*/
84 //#define RK29_SDMMC_LIST_QUEUE /* use list-queue for multi-card*/
86 #define RK29_SDMMC_DEFAULT_SDIO_FREQ 0 // 1--run in default frequency(50Mhz); 0---run in 25Mhz,
87 #define RK29_MAX_SDIO_FREQ 25000000 //set max-sdio-frequency 25Mhz at the present time¡£
90 EVENT_CMD_COMPLETE = 0,
96 enum rk29_sdmmc_state {
103 struct rk29_sdmmc_dma_info {
106 struct rk29_dma_client client;
109 static struct rk29_sdmmc_dma_info rk29_sdmmc_dma_infos[]= {
113 .name = "rk29-dma-sdmmc0",
119 .name = "rk29-dma-sdio1",
126 .name = "rk29-dma-sdio2",
132 /* Interrupt Information */
133 typedef struct TagSDC_INT_INFO
135 u32 transLen; //the length of data sent.
136 u32 desLen; //the total length of the all data.
137 u32 *pBuf; //the data buffer for interrupt read or write.
146 struct mmc_request *mrq;
147 struct mmc_request *new_mrq;
148 struct mmc_command *cmd;
149 struct mmc_data *data;
151 dma_addr_t dma_addr;;
152 unsigned int use_dma:1;
159 u32 cmdr; //the value setted into command-register
160 u32 dodma; //sign the DMA used for transfer.
161 u32 errorstep;//record the error point.
163 SDC_INT_INFO_T intInfo;
164 struct rk29_sdmmc_dma_info dma_info;
169 struct tasklet_struct tasklet;
170 unsigned long pending_events;
171 unsigned long completed_events;
172 enum rk29_sdmmc_state state;
174 #ifdef RK29_SDMMC_LIST_QUEUE
175 struct list_head queue;
176 struct list_head queue_node;
180 struct platform_device *pdev;
181 struct mmc_host *mmc;
186 #define RK29_SDMMC_CARD_PRESENT 0
190 struct timer_list detect_timer;
191 struct timer_list request_timer; //the timer for INT_CMD_DONE
192 struct timer_list DTO_timer; //the timer for INT_DTO
193 struct mmc_command stopcmd;
195 /* flag for current bus settings */
198 unsigned int oldstatus;
207 #ifdef RK29_SDMMC_NOTIFY_REMOVE_INSERTION
208 static struct rk29_sdmmc *globalSDhost[3];
211 #define rk29_sdmmc_test_and_clear_pending(host, event) \
212 test_and_clear_bit(event, &host->pending_events)
213 #define rk29_sdmmc_set_completed(host, event) \
214 set_bit(event, &host->completed_events)
216 #define rk29_sdmmc_set_pending(host, event) \
217 set_bit(event, &host->pending_events)
219 static void rk29_sdmmc_start_error(struct rk29_sdmmc *host);
221 static void rk29_sdmmc_write(unsigned char __iomem *regbase, unsigned int regOff,unsigned int val)
223 __raw_writel(val,regbase + regOff);
226 static unsigned int rk29_sdmmc_read(unsigned char __iomem *regbase, unsigned int regOff)
228 return __raw_readl(regbase + regOff);
231 static int rk29_sdmmc_regs_printk(struct rk29_sdmmc *host)
233 printk("SDMMC_CTRL: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CTRL));
234 printk("SDMMC_PWREN: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_PWREN));
235 printk("SDMMC_CLKDIV: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKDIV));
236 printk("SDMMC_CLKSRC: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKSRC));
237 printk("SDMMC_CLKENA: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKENA));
238 printk("SDMMC_TMOUT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TMOUT));
239 printk("SDMMC_CTYPE: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CTYPE));
240 printk("SDMMC_BLKSIZ: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_BLKSIZ));
241 printk("SDMMC_BYTCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_BYTCNT));
242 printk("SDMMC_INTMASK:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_INTMASK));
243 printk("SDMMC_CMDARG: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CMDARG));
244 printk("SDMMC_CMD: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CMD));
245 printk("SDMMC_RESP0: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP0));
246 printk("SDMMC_RESP1: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP1));
247 printk("SDMMC_RESP2: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP2));
248 printk("SDMMC_RESP3: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP3));
249 printk("SDMMC_MINTSTS:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_MINTSTS));
250 printk("SDMMC_RINTSTS:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RINTSTS));
251 printk("SDMMC_STATUS: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_STATUS));
252 printk("SDMMC_FIFOTH: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_FIFOTH));
253 printk("SDMMC_CDETECT:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CDETECT));
254 printk("SDMMC_WRTPRT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_WRTPRT));
255 printk("SDMMC_TCBCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TCBCNT));
256 printk("SDMMC_TBBCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TBBCNT));
257 printk("SDMMC_DEBNCE: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_DEBNCE));
258 printk("=======printk %s-register end =========\n", host->dma_name);
263 #ifdef RK29_SDMMC_NOTIFY_REMOVE_INSERTION
264 ssize_t rk29_sdmmc_progress_store(struct kobject *kobj, struct kobj_attribute *attr,
265 const char *buf, size_t count)
267 struct rk29_sdmmc *host = NULL;
268 static u32 unmounting_times = 0;
270 if( !strncmp(buf,"version" , strlen("version")))
272 printk("The driver SDMMC named 'rk29_sdmmc.c' is %s. ====xbw====\n", RK29_SDMMC_VERSION);
276 spin_lock(&host->lock);
278 //envalue the address of host base on input-parameter.
279 if( !strncmp(buf,"sd-" , strlen("sd-")) )
281 host = (struct rk29_sdmmc *)globalSDhost[RK29_CTRL_SDMMC_ID];
284 printk("%s..%d.. fail to call progress_store because the host is null. ==xbw==\n",__FUNCTION__,__LINE__);
285 goto progress_store_out;
288 else if( !strncmp(buf,"sdio1-" , strlen("sdio1-")) )
290 host = (struct rk29_sdmmc *)globalSDhost[RK29_CTRL_SDIO1_ID];
293 printk("%s..%d.. fail to call progress_store because the host-sdio1 is null. ==xbw==\n",__FUNCTION__,__LINE__);
294 goto progress_store_out;
297 else if( !strncmp(buf,"sdio2-" , strlen("sdio2-")) )
299 host = (struct rk29_sdmmc *)globalSDhost[RK29_CTRL_SDIO2_ID];
302 printk("%s..%d.. fail to call progress_store because the host-sdio2 is null. ==xbw==\n",__FUNCTION__,__LINE__);
303 goto progress_store_out;
308 printk("%s..%d.. You want to use sysfs for SDMMC but input-parameter is wrong.====xbw====\n",__FUNCTION__,__LINE__);
309 goto progress_store_out;//return count;
312 //printk(".%d.. MMC0 receive the message %s from VOLD.====xbw[%s]====\n", __LINE__, buf, host->dma_name);
315 * //deal with the message
316 * insert card state-change: No-Media ==> Pending ==> Idle-Unmounted ==> Checking ==>Mounted
317 * remove card state-change: Unmounting ==> Idle-Unmounted ==> No-Media
319 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
321 if(!strncmp(buf, "sd-Unmounting", strlen("sd-Unmounting")))
323 if(unmounting_times++%10 == 0)
325 printk(".%d.. MMC0 receive the message Unmounting(waitTimes=%d) from VOLD.====xbw[%s]====\n", \
326 __LINE__, unmounting_times, host->dma_name);
328 host->mmc->re_initialized_flags = 0;
329 mod_timer(&host->detect_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_REMOVAL_DELAY));
331 else if( !strncmp(buf, "sd-No-Media", strlen("sd-No-Media")))
333 printk(".%d.. MMC0 receive the message No-Media from VOLD. waitTimes=%d ====xbw[%s]====\n" ,\
334 __LINE__,unmounting_times, host->dma_name);
336 del_timer_sync(&host->detect_timer);
337 host->mmc->re_initialized_flags = 1;
338 unmounting_times = 0;
340 if(test_bit(RK29_SDMMC_CARD_PRESENT, &host->flags))
342 mmc_detect_change(host->mmc, 0);
345 else if( !strncmp(buf, "sd-Ready", strlen("sd-Ready")))
347 printk(".%d.. MMC0 receive the message Ready(ReInitFlag=%d) from VOLD. waitTimes=%d====xbw[%s]====\n" ,\
348 __LINE__, host->mmc->re_initialized_flags, unmounting_times, host->dma_name);
350 unmounting_times = 0;
351 if(0==host->mmc->re_initialized_flags)
353 host->mmc->re_initialized_flags = 1;
356 else if( !strncmp(buf,"sd-reset" , strlen("sd-reset")) )
358 printk(".%d.. Now manual reset for SDMMC0. ====xbw[%s]====\n",__LINE__, host->dma_name);
359 mmc_detect_change(host->mmc, 0);
361 else if( !strncmp(buf, "sd-regs", strlen("sd-regs")))
363 printk(".%d.. Now printk the register of SDMMC0. ====xbw[%s]====\n",__LINE__, host->dma_name);
364 rk29_sdmmc_regs_printk(host);
368 else if(RK29_CTRL_SDIO1_ID == host->pdev->id)
370 if( !strncmp(buf, "sdio1-regs", strlen("sdio1-regs")))
372 printk(".%d.. Now printk the register of SDMMC1. ====xbw[%s]====\n",__LINE__, host->dma_name);
373 rk29_sdmmc_regs_printk(host);
375 else if( !strncmp(buf,"sdio1-reset" , strlen("sdio1-reset")) )
377 printk(".%d.. Now manual reset for SDMMC1. ====xbw[%s]====\n",__LINE__, host->dma_name);
378 mmc_detect_change(host->mmc, 0);
381 else if(RK29_CTRL_SDIO2_ID == host->pdev->id)
383 if( !strncmp(buf, "sdio2-regs", strlen("sdio2-regs")))
385 printk(".%d.. Now printk the register of SDMMC2. ====xbw[%s]====\n",__LINE__, host->dma_name);
386 rk29_sdmmc_regs_printk(host);
388 else if( !strncmp(buf,"sdio2-reset" , strlen("sdio2-reset")) )
390 printk(".%d.. Now manual reset for SDMMC2. ====xbw[%s]====\n",__LINE__, host->dma_name);
391 mmc_detect_change(host->mmc, 0);
396 spin_unlock(&host->lock);
403 struct kobj_attribute mmc_reset_attrs =
409 .store = rk29_sdmmc_progress_store,
411 struct attribute *mmc_attrs[] =
413 &mmc_reset_attrs.attr,
417 static struct kobj_type mmc_kset_ktype = {
418 .sysfs_ops = &kobj_sysfs_ops,
419 .default_attrs = &mmc_attrs[0],
422 static int rk29_sdmmc_progress_add_attr( struct platform_device *pdev )
425 struct kobject *parentkobject;
426 struct kobject * me = kmalloc(sizeof(struct kobject) , GFP_KERNEL );
431 memset(me ,0,sizeof(struct kobject));
432 kobject_init( me , &mmc_kset_ktype );
434 parentkobject = &pdev->dev.kobj ;
435 result = kobject_add( me , parentkobject->parent->parent->parent,"%s", "sd-sdio" );
441 #if defined (CONFIG_DEBUG_FS)
442 static int rk29_sdmmc_regs_show(struct seq_file *s, void *v)
444 struct rk29_sdmmc *host = s->private;
446 seq_printf(s, "SDMMC_CTRL: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CTRL));
447 seq_printf(s, "SDMMC_PWREN: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_PWREN));
448 seq_printf(s, "SDMMC_CLKDIV: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKDIV));
449 seq_printf(s, "SDMMC_CLKSRC: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKSRC));
450 seq_printf(s, "SDMMC_CLKENA: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKENA));
451 seq_printf(s, "SDMMC_TMOUT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TMOUT));
452 seq_printf(s, "SDMMC_CTYPE: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CTYPE));
453 seq_printf(s, "SDMMC_BLKSIZ: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_BLKSIZ));
454 seq_printf(s, "SDMMC_BYTCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_BYTCNT));
455 seq_printf(s, "SDMMC_INTMASK:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_INTMASK));
456 seq_printf(s, "SDMMC_CMDARG: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CMDARG));
457 seq_printf(s, "SDMMC_CMD: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CMD));
458 seq_printf(s, "SDMMC_RESP0: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP0));
459 seq_printf(s, "SDMMC_RESP1: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP1));
460 seq_printf(s, "SDMMC_RESP2: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP2));
461 seq_printf(s, "SDMMC_RESP3: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP3));
462 seq_printf(s, "SDMMC_MINTSTS:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_MINTSTS));
463 seq_printf(s, "SDMMC_RINTSTS:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RINTSTS));
464 seq_printf(s, "SDMMC_STATUS: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_STATUS));
465 seq_printf(s, "SDMMC_FIFOTH: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_FIFOTH));
466 seq_printf(s, "SDMMC_CDETECT:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CDETECT));
467 seq_printf(s, "SDMMC_WRTPRT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_WRTPRT));
468 seq_printf(s, "SDMMC_TCBCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TCBCNT));
469 seq_printf(s, "SDMMC_TBBCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TBBCNT));
470 seq_printf(s, "SDMMC_DEBNCE: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_DEBNCE));
477 * The debugfs stuff below is mostly optimized away when
478 * CONFIG_DEBUG_FS is not set.
480 static int rk29_sdmmc_req_show(struct seq_file *s, void *v)
482 struct rk29_sdmmc *host = s->private;
483 struct mmc_request *mrq;
484 struct mmc_command *cmd;
485 struct mmc_command *stop;
486 struct mmc_data *data;
488 /* Make sure we get a consistent snapshot */
489 spin_lock(&host->lock);
499 "CMD%u(0x%x) flg %x rsp %x %x %x %x err %d\n",
500 cmd->opcode, cmd->arg, cmd->flags,
501 cmd->resp[0], cmd->resp[1], cmd->resp[2],
502 cmd->resp[2], cmd->error);
504 seq_printf(s, "DATA %u / %u * %u flg %x err %d\n",
505 data->bytes_xfered, data->blocks,
506 data->blksz, data->flags, data->error);
509 "CMD%u(0x%x) flg %x rsp %x %x %x %x err %d\n",
510 stop->opcode, stop->arg, stop->flags,
511 stop->resp[0], stop->resp[1], stop->resp[2],
512 stop->resp[2], stop->error);
515 spin_unlock(&host->lock);
520 static int rk29_sdmmc_req_open(struct inode *inode, struct file *file)
522 return single_open(file, rk29_sdmmc_req_show, inode->i_private);
525 static const struct file_operations rk29_sdmmc_req_fops = {
526 .owner = THIS_MODULE,
527 .open = rk29_sdmmc_req_open,
530 .release = single_release,
534 static int rk29_sdmmc_regs_open(struct inode *inode, struct file *file)
536 return single_open(file, rk29_sdmmc_regs_show, inode->i_private);
539 static const struct file_operations rk29_sdmmc_regs_fops = {
540 .owner = THIS_MODULE,
541 .open = rk29_sdmmc_regs_open,
544 .release = single_release,
547 static void rk29_sdmmc_init_debugfs(struct rk29_sdmmc *host)
549 struct mmc_host *mmc = host->mmc;
553 root = mmc->debugfs_root;
557 node = debugfs_create_file("regs", S_IRUSR, root, host,
558 &rk29_sdmmc_regs_fops);
564 node = debugfs_create_file("req", S_IRUSR, root, host, &rk29_sdmmc_req_fops);
568 node = debugfs_create_u32("state", S_IRUSR, root, (u32 *)&host->state);
572 node = debugfs_create_x32("pending_events", S_IRUSR, root,
573 (u32 *)&host->pending_events);
577 node = debugfs_create_x32("completed_events", S_IRUSR, root,
578 (u32 *)&host->completed_events);
585 dev_err(&mmc->class_dev, "failed to initialize debugfs for host\n");
590 static u32 rk29_sdmmc_prepare_command(struct mmc_command *cmd)
592 u32 cmdr = cmd->opcode;
596 case MMC_GO_IDLE_STATE:
597 cmdr |= (SDMMC_CMD_INIT | SDMMC_CMD_PRV_DAT_NO_WAIT);
600 case MMC_STOP_TRANSMISSION:
601 cmdr |= (SDMMC_CMD_STOP | SDMMC_CMD_PRV_DAT_NO_WAIT);
603 case MMC_SEND_STATUS:
604 case MMC_GO_INACTIVE_STATE:
605 cmdr |= SDMMC_CMD_PRV_DAT_NO_WAIT;
609 cmdr |= SDMMC_CMD_PRV_DAT_WAIT;
614 switch(mmc_resp_type(cmd))
618 // case MMC_RSP_R5: //R5,R6,R7 is same with the R1
622 cmdr |= (SDMMC_CMD_RESP_CRC | SDMMC_CMD_RESP_SHORT | SDMMC_CMD_RESP_EXP);
626 /* these response not contain crc7, so don't care crc error and response error */
627 cmdr |= (SDMMC_CMD_RESP_NO_CRC | SDMMC_CMD_RESP_SHORT | SDMMC_CMD_RESP_EXP);
630 cmdr |= (SDMMC_CMD_RESP_CRC | SDMMC_CMD_RESP_LONG | SDMMC_CMD_RESP_EXP);
633 cmdr |= (SDMMC_CMD_RESP_CRC_NOCARE | SDMMC_CMD_RESP_NOCARE | SDMMC_CMD_RESP_NO_EXP);
636 cmdr |= (SDMMC_CMD_RESP_CRC_NOCARE | SDMMC_CMD_RESP_NOCARE | SDMMC_CMD_RESP_NO_EXP);
644 static int rk29_sdmmc_start_command(struct rk29_sdmmc *host, struct mmc_command *cmd, u32 cmd_flags)
646 int tmo = RK29_SDMMC_SEND_START_TIMEOUT*2;
649 host->old_cmd = cmd->opcode;
651 rk29_sdmmc_write(host->regs, SDMMC_CMDARG, cmd->arg); // write to SDMMC_CMDARG register
652 rk29_sdmmc_write(host->regs, SDMMC_CMD, cmd_flags | SDMMC_CMD_START); // write to SDMMC_CMD register
655 xbwprintk(5, "\n%s..%d..************.start cmd=%d, arg=0x%x ********=====xbw[%s]=======\n", \
656 __FUNCTION__, __LINE__, cmd->opcode, cmd->arg, host->dma_name);
658 /* wait until CIU accepts the command */
659 while (--tmo && (rk29_sdmmc_read(host->regs, SDMMC_CMD) & SDMMC_CMD_START))
661 udelay(2);//cpu_relax();
666 printk("%s..%d.. CMD_START timeout! CMD%d(arg=0x%x, retries=%d) ======xbw[%s]======\n",\
667 __FUNCTION__,__LINE__, cmd->opcode, cmd->arg, cmd->retries,host->dma_name);
669 cmd->error = -ETIMEDOUT;
670 host->mrq->cmd->error = -ETIMEDOUT;
671 del_timer_sync(&host->request_timer);
673 host->errorstep = 0x1;
674 return SDM_WAIT_FOR_CMDSTART_TIMEOUT;
680 static int rk29_sdmmc_reset_fifo(struct rk29_sdmmc *host)
684 int ret = SDM_SUCCESS;
686 value = rk29_sdmmc_read(host->regs, SDMMC_STATUS);
687 if (!(value & SDMMC_STAUTS_FIFO_EMPTY))
689 value = rk29_sdmmc_read(host->regs, SDMMC_CTRL);
690 value |= SDMMC_CTRL_FIFO_RESET;
691 rk29_sdmmc_write(host->regs, SDMMC_CTRL, value);
694 while (((value = rk29_sdmmc_read(host->regs, SDMMC_CTRL)) & (SDMMC_CTRL_FIFO_RESET)) && (timeout > 0))
701 host->errorstep = 0x2;
702 ret = SDM_WAIT_FOR_FIFORESET_TIMEOUT;
710 static int rk29_sdmmc_wait_unbusy(struct rk29_sdmmc *host)
712 int time_out = 250000; //max is 250ms
714 while (rk29_sdmmc_read(host->regs, SDMMC_STATUS) & SDMMC_STAUTS_DATA_BUSY)
721 host->errorstep = 0x3;
722 return SDM_BUSY_TIMEOUT;
729 static void send_stop_cmd(struct rk29_sdmmc *host)
731 mod_timer(&host->request_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_SEND_START_TIMEOUT+250));
733 host->stopcmd.opcode = MMC_STOP_TRANSMISSION;
734 host->stopcmd.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC;;
735 host->stopcmd.arg = 0;
736 host->stopcmd.data = NULL;
737 host->stopcmd.mrq = NULL;
738 host->stopcmd.retries = host->cmd->retries;
740 host->cmdr = rk29_sdmmc_prepare_command(&host->stopcmd);
741 rk29_sdmmc_start_command(host, &host->stopcmd, host->cmdr);
744 static void rk29_sdmmc_dma_cleanup(struct rk29_sdmmc *host)
748 dma_unmap_sg(&host->pdev->dev, host->data->sg, host->data->sg_len,
749 ((host->data->flags & MMC_DATA_WRITE)
750 ? DMA_TO_DEVICE : DMA_FROM_DEVICE));
754 static void rk29_sdmmc_stop_dma(struct rk29_sdmmc *host)
758 if(host->use_dma == 0)
761 if (host->dma_info.chn> 0)
763 rk29_sdmmc_dma_cleanup(host);
765 ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_STOP);
768 printk("%s..%d...rk29_dma_ctrl STOP error!===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
769 host->errorstep = 0x95;
773 ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_FLUSH);
776 printk("%s..%d...rk29_dma_ctrl FLUSH error!===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
777 host->errorstep = 0x96;
784 /* Data transfer was stopped by the interrupt handler */
785 rk29_sdmmc_set_pending(host, EVENT_DATA_COMPLETE);
789 static void rk29_sdmmc_control_host_dma(struct rk29_sdmmc *host, bool enable)
791 u32 value = rk29_sdmmc_read(host->regs, SDMMC_CTRL);
795 value |= SDMMC_CTRL_DMA_ENABLE;
799 value &= ~(SDMMC_CTRL_DMA_ENABLE);
802 rk29_sdmmc_write(host->regs, SDMMC_CTRL, value);
806 /* This function is called by the DMA driver from tasklet context. */
807 static void rk29_sdmmc_dma_complete(void *arg, int size, enum rk29_dma_buffresult result)
809 struct rk29_sdmmc *host = arg;
811 if(host->use_dma == 0)
814 host->intInfo.transLen = host->intInfo.desLen;
817 static int rk29_sdmmc_submit_data_dma(struct rk29_sdmmc *host, struct mmc_data *data)
819 struct scatterlist *sg;
820 unsigned int i,direction, sgDirection;
823 if(host->use_dma == 0)
825 printk("%s..%d...setup DMA fail!!!!!!. host->use_dma=0 ===xbw=[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
826 host->errorstep = 0x4;
829 /* If we don't have a channel, we can't do DMA */
830 if (host->dma_info.chn < 0)
832 printk("%s..%d...setup DMA fail!!!!!!!. dma_info.chn < 0 ===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
833 host->errorstep = 0x5;
839 for_each_sg(data->sg, sg, data->sg_len, i)
841 if (sg->offset & 3 || sg->length & 3)
843 printk("%s..%d...call for_each_sg() fail !!===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
844 host->errorstep = 0x7;
848 if (data->flags & MMC_DATA_READ)
850 direction = RK29_DMASRC_HW;
851 sgDirection = DMA_FROM_DEVICE;
855 direction = RK29_DMASRC_MEM;
856 sgDirection = DMA_TO_DEVICE;
859 ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_STOP);
862 printk("%s..%d...rk29_dma_ctrl stop error!===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
863 host->errorstep = 0x91;
867 ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_FLUSH);
870 printk("%s..%d...rk29_dma_ctrl flush error!===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
871 host->errorstep = 0x91;
876 ret = rk29_dma_devconfig(host->dma_info.chn, direction, (unsigned long )(host->dma_addr));
879 printk("%s..%d...call rk29_dma_devconfig() fail !!!!===xbw=[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
880 host->errorstep = 0x8;
884 dma_len = dma_map_sg(&host->pdev->dev, data->sg, data->sg_len, sgDirection);
885 for (i = 0; i < dma_len; i++)
887 ret = rk29_dma_enqueue(host->dma_info.chn, host, sg_dma_address(&data->sg[i]),sg_dma_len(&data->sg[i]));
890 printk("%s..%d...call rk29_dma_devconfig() fail !!!!===xbw=[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
891 host->errorstep = 0x93;
896 rk29_sdmmc_control_host_dma(host, TRUE);// enable dma
897 ret = rk29_dma_ctrl(host->dma_info.chn, RK29_DMAOP_START);
900 printk("%s..%d...rk29_dma_ctrl start error!===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
901 host->errorstep = 0x94;
909 static int rk29_sdmmc_prepare_write_data(struct rk29_sdmmc *host, struct mmc_data *data)
915 u32 count, *pBuf = (u32 *)host->pbuf;
917 output = SDM_SUCCESS;
918 dataLen = data->blocks*data->blksz;
920 host->dodma = 0; //DMA still no request;
922 //SDMMC controller request the data is multiple of 4.
923 count = (dataLen >> 2) + ((dataLen & 0x3) ? 1:0);
925 if (count <= FIFO_DEPTH)
927 for (i=0; i<count; i++)
929 rk29_sdmmc_write(host->regs, SDMMC_DATA, pBuf[i]);
934 host->intInfo.desLen = count;
935 host->intInfo.transLen = 0;
936 host->intInfo.pBuf = (u32 *)pBuf;
938 if(0)//(host->intInfo.desLen <= 512 )
945 xbwprintk(3, "%s..%d... trace data, ======xbw=[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
946 output = rk29_sdmmc_submit_data_dma(host, data);
951 printk("%s..%d... CMD%d setupDMA failure!!!!! ==xbw[%s]==\n", \
952 __FUNCTION__, __LINE__, host->cmd->opcode, host->dma_name);
954 host->errorstep = 0x81;
956 rk29_sdmmc_control_host_dma(host, FALSE);
972 static int rk29_sdmmc_prepare_read_data(struct rk29_sdmmc *host, struct mmc_data *data)
978 output = SDM_SUCCESS;
979 dataLen = data->blocks*data->blksz;
981 host->dodma = 0;//DMA still no request;
983 //SDMMC controller request the data is multiple of 4.
984 count = (dataLen >> 2) ;//+ ((dataLen & 0x3) ? 1:0);
986 host->intInfo.desLen = (dataLen >> 2);
987 host->intInfo.transLen = 0;
988 host->intInfo.pBuf = (u32 *)host->pbuf;
990 if (count > (RX_WMARK+1)) //datasheet error.actually, it can nont waken the interrupt when less and equal than RX_WMARK+1
992 if(0) //(host->intInfo.desLen <= 512 )
999 output = rk29_sdmmc_submit_data_dma(host, data);
1004 printk("%s..%d... CMD%d setupDMA failure!!! ==xbw[%s]==\n", \
1005 __FUNCTION__, __LINE__, host->cmd->opcode, host->dma_name);
1007 host->errorstep = 0x82;
1009 rk29_sdmmc_control_host_dma(host, FALSE);
1023 static int rk29_sdmmc_read_remain_data(struct rk29_sdmmc *host, u32 originalLen, void *pDataBuf)
1028 u32 *pBuf = (u32 *)pDataBuf;
1029 u8 *pByteBuf = (u8 *)pDataBuf;
1032 //SDMMC controller must be multiple of 32. so if transfer 13, then actuall we should write or read 16 byte.
1033 u32 count = (originalLen >> 2) + ((originalLen & 0x3) ? 1:0);
1035 if(1 == host->dodma)
1037 //when use DMA, there are remain data only when datalen/4 less than RX_WMARK+1 same as equaltion. or not multiple of 4
1038 if (!((value = rk29_sdmmc_read(host->regs, SDMMC_STATUS)) & SDMMC_STAUTS_FIFO_EMPTY))
1040 if (count <= (RX_WMARK+1))
1043 while ((i<(originalLen >> 2))&&(!(value & SDMMC_STAUTS_FIFO_EMPTY)))
1045 pBuf[i++] = rk29_sdmmc_read(host->regs, SDMMC_DATA);
1046 value = rk29_sdmmc_read(host->regs, SDMMC_STATUS);
1050 if (count > (originalLen >> 2))
1052 lastData = rk29_sdmmc_read(host->regs, SDMMC_DATA);
1054 //fill the 1 to 3 byte.
1055 for (i=0; i<(originalLen & 0x3); i++)
1057 pByteBuf[(originalLen & 0xFFFFFFFC) + i] = (u8)((lastData >> (i << 3)) & 0xFF); //default little-endian
1064 if (!((value = rk29_sdmmc_read(host->regs, SDMMC_STATUS)) & SDMMC_STAUTS_FIFO_EMPTY))
1066 while ( (host->intInfo.transLen < host->intInfo.desLen) && (!(value & SDMMC_STAUTS_FIFO_EMPTY)) )
1068 pBuf[host->intInfo.transLen++] = rk29_sdmmc_read(host->regs, SDMMC_DATA);
1069 value = rk29_sdmmc_read(host->regs, SDMMC_STATUS);
1072 if (count > (originalLen >> 2))
1074 lastData = rk29_sdmmc_read(host->regs, SDMMC_DATA);
1076 //fill the 1 to 3 byte.
1077 for (i=0; i<(originalLen & 0x3); i++)
1079 pByteBuf[(originalLen & 0xFFFFFFFC) + i] = (u8)((lastData >> (i << 3)) & 0xFF); //default little-endian
1089 static void rk29_sdmmc_do_pio_read(struct rk29_sdmmc *host)
1092 for (i=0; i<(RX_WMARK+1); i++)
1094 host->intInfo.pBuf[host->intInfo.transLen + i] = rk29_sdmmc_read(host->regs, SDMMC_DATA);
1096 host->intInfo.transLen += (RX_WMARK+1);
1099 static void rk29_sdmmc_do_pio_write(struct rk29_sdmmc *host)
1102 if ( (host->intInfo.desLen - host->intInfo.transLen) > (FIFO_DEPTH - TX_WMARK) )
1104 for (i=0; i<(FIFO_DEPTH - TX_WMARK); i++)
1106 rk29_sdmmc_write(host->regs, SDMMC_DATA, host->intInfo.pBuf[host->intInfo.transLen + i]);
1108 host->intInfo.transLen += (FIFO_DEPTH - TX_WMARK);
1112 for (i=0; i<(host->intInfo.desLen - host->intInfo.transLen); i++)
1114 rk29_sdmmc_write(host->regs, SDMMC_DATA, host->intInfo.pBuf[host->intInfo.transLen + i]);
1116 host->intInfo.transLen = host->intInfo.desLen;
1122 static void rk29_sdmmc_submit_data(struct rk29_sdmmc *host, struct mmc_data *data)
1131 data->bytes_xfered = 0;
1132 host->pbuf = (u32*)sg_virt(data->sg);
1134 if (data->flags & MMC_DATA_STREAM)
1136 host->cmdr |= SDMMC_CMD_STRM_MODE; //set stream mode
1140 host->cmdr |= SDMMC_CMD_BLOCK_MODE; //set block mode
1143 //set the blocks and blocksize
1144 rk29_sdmmc_write(host->regs, SDMMC_BYTCNT,data->blksz*data->blocks);
1145 rk29_sdmmc_write(host->regs, SDMMC_BLKSIZ,data->blksz);
1147 xbwprintk(3, "%s..%d... trace data, CMD%d, data->blksz=%d, data->blocks=%d ======xbw=[%s]====\n", \
1148 __FUNCTION__, __LINE__, host->cmd->opcode,data->blksz, data->blocks, host->dma_name);
1150 if (data->flags & MMC_DATA_WRITE)
1152 host->cmdr |= (SDMMC_CMD_DAT_WRITE | SDMMC_CMD_DAT_EXP);
1153 xbwprintk(3, "%s..%d... write data, len=%d ======xbw=[%s]====\n", \
1154 __FUNCTION__, __LINE__, data->blksz*data->blocks, host->dma_name);
1156 ret = rk29_sdmmc_prepare_write_data(host, data);
1160 host->cmdr |= (SDMMC_CMD_DAT_READ | SDMMC_CMD_DAT_EXP);
1161 xbwprintk(3, "%s..%d... read data len=%d ======xbw=[%s]====\n", \
1162 __FUNCTION__, __LINE__, data->blksz*data->blocks, host->dma_name);
1164 ret = rk29_sdmmc_prepare_read_data(host, data);
1170 rk29_sdmmc_write(host->regs, SDMMC_BLKSIZ, 0);
1171 rk29_sdmmc_write(host->regs, SDMMC_BYTCNT, 0);
1176 static int sdmmc_send_cmd_start(struct rk29_sdmmc *host, unsigned int cmd)
1180 rk29_sdmmc_write(host->regs, SDMMC_CMD, SDMMC_CMD_START | cmd);
1181 while (--tmo && readl(host->regs + SDMMC_CMD) & SDMMC_CMD_START)
1188 printk("%s.. %d set cmd(value=0x%x) register timeout error ! ====xbw[%s]====\n",\
1189 __FUNCTION__,__LINE__, cmd, host->dma_name);
1191 host->errorstep = 0x9;
1192 return SDM_START_CMD_FAIL;
1198 static int rk29_sdmmc_get_cd(struct mmc_host *mmc)
1200 struct rk29_sdmmc *host = mmc_priv(mmc);
1204 if(host->gpio_det == INVALID_GPIO)
1208 cdetect = rk29_sdmmc_read(host->regs, SDMMC_CDETECT);
1210 return (cdetect & SDMMC_CARD_DETECT_N)?0:1;
1214 /****************************************************************/
1215 //reset the SDMMC controller of the current host
1216 /****************************************************************/
1217 int rk29_sdmmc_reset_controller(struct rk29_sdmmc *host)
1222 rk29_sdmmc_write(host->regs, SDMMC_PWREN, POWER_ENABLE);
1224 /* reset SDMMC IP */
1225 //SDPAM_SDCClkEnable(host, TRUE);
1228 for(timeOut=0; timeOut<FIFO_DEPTH; timeOut++)
1230 if(rk29_sdmmc_read(host->regs, SDMMC_STATUS) & SDMMC_STAUTS_FIFO_EMPTY)
1233 value = rk29_sdmmc_read(host->regs, SDMMC_DATA);
1237 rk29_sdmmc_write(host->regs, SDMMC_CTRL,(SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET ));
1240 value = rk29_sdmmc_read(host->regs, SDMMC_CTRL);
1241 while (( value & (SDMMC_CTRL_FIFO_RESET | SDMMC_CTRL_RESET)) && (timeOut > 0))
1245 value = rk29_sdmmc_read(host->regs, SDMMC_CTRL);
1250 printk("%s..%s..%d.. reset controller fail!!! =====xbw[%s]=====\n",\
1251 __FILE__, __FUNCTION__,__LINE__, host->dma_name);
1253 host->errorstep = 0x0A;
1254 return SDM_WAIT_FOR_FIFORESET_TIMEOUT;
1257 /* FIFO threshold settings */
1258 rk29_sdmmc_write(host->regs, SDMMC_FIFOTH, (SD_MSIZE_16 | (RX_WMARK << RX_WMARK_SHIFT) | (TX_WMARK << TX_WMARK_SHIFT)));
1260 rk29_sdmmc_write(host->regs, SDMMC_CTYPE, SDMMC_CTYPE_1BIT);
1261 rk29_sdmmc_write(host->regs, SDMMC_CLKSRC, CLK_DIV_SRC_0);
1262 /* config debounce */
1263 host->bus_hz = clk_get_rate(host->clk);
1264 if((host->bus_hz > 52000000) || (host->bus_hz <= 0))
1266 printk("%s..%s..%d..****Error!!!!!! Bus clock %d hz is beyond the prescribed limits ====xbw[%s]===\n",\
1267 __FILE__, __FUNCTION__,__LINE__,host->bus_hz, host->dma_name);
1269 host->errorstep = 0x0B;
1270 return SDM_PARAM_ERROR;
1273 rk29_sdmmc_write(host->regs, SDMMC_DEBNCE, (DEBOUNCE_TIME*host->bus_hz)&0xFFFFFF);
1275 /* config interrupt */
1276 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS, 0xFFFFFFFF);
1280 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
1282 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEDMA);
1286 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEDMA | SDMMC_INT_SDIO);
1291 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
1293 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEIO);
1297 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEIO | SDMMC_INT_SDIO);
1301 rk29_sdmmc_write(host->regs, SDMMC_PWREN, POWER_ENABLE);
1303 rk29_sdmmc_write(host->regs, SDMMC_CTRL,SDMMC_CTRL_INT_ENABLE); // enable mci interrupt
1311 //enable/disnable the clk.
1312 static int rk29_sdmmc_control_clock(struct rk29_sdmmc *host, bool enable)
1316 int ret = SDM_SUCCESS;
1318 //wait previous start to clear
1320 while (--tmo && (rk29_sdmmc_read(host->regs, SDMMC_CMD) & SDMMC_CMD_START))
1326 host->errorstep = 0x0C;
1327 ret = SDM_START_CMD_FAIL;
1331 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
1333 //SDMMC use low-power mode
1336 value = (SDMMC_CLKEN_LOW_PWR | SDMMC_CLKEN_ENABLE);
1340 value = (SDMMC_CLKEN_LOW_PWR | SDMMC_CLKEN_DISABLE);
1345 //SDIO-card use non-low-power mode
1348 value = (SDMMC_CLKEN_ENABLE);
1352 value = (SDMMC_CLKEN_DISABLE);
1356 rk29_sdmmc_write(host->regs, SDMMC_CLKENA, value);
1359 ret = sdmmc_send_cmd_start(host, SDMMC_CMD_UPD_CLK | SDMMC_CMD_PRV_DAT_WAIT);
1360 if(ret != SDM_SUCCESS)
1368 printk("\n%s....%d.. control clock fail!!! Enable=%d, ret=%d ===xbw[%s]====\n",\
1369 __FILE__,__LINE__,enable,ret, host->dma_name);
1376 //adjust the frequency.ie, to set the frequency division control
1377 int rk29_sdmmc_change_clk_div(struct rk29_sdmmc *host, u32 freqHz)
1381 int ret = SDM_SUCCESS;
1385 ret = SDM_PARAM_ERROR;
1389 ret = rk29_sdmmc_control_clock(host, FALSE);
1390 if (ret != SDM_SUCCESS)
1396 host->bus_hz = clk_get_rate(host->clk);
1397 if((host->bus_hz > 52000000) || (host->bus_hz <= 0))
1399 printk("%s..%s..%d..****Error!!!!!! Bus clock %d hz is beyond the prescribed limits ====xbw[%s]===\n",\
1400 __FILE__, __FUNCTION__,__LINE__,host->bus_hz, host->dma_name);
1402 host->errorstep = 0x0D;
1403 ret = SDM_PARAM_ERROR;
1407 //calculate the divider
1408 div = host->bus_hz/freqHz + ((( host->bus_hz%freqHz ) > 0) ? 1:0 );
1409 if( (div & 0x01) && (1 != div) )
1411 //It is sure that the value of div is even.
1417 host->clock = host->bus_hz/div;
1421 host->clock = host->bus_hz;
1425 //wait previous start to clear
1427 while (--tmo && (rk29_sdmmc_read(host->regs, SDMMC_CMD) & SDMMC_CMD_START))
1433 host->errorstep = 0x0E;
1434 ret = SDM_START_CMD_FAIL;
1438 /* set clock to desired speed */
1439 rk29_sdmmc_write(host->regs, SDMMC_CLKDIV, div);
1442 ret = sdmmc_send_cmd_start(host, SDMMC_CMD_UPD_CLK | SDMMC_CMD_PRV_DAT_WAIT);
1443 if(ret != SDM_SUCCESS)
1445 host->errorstep = 0x0E1;
1449 if(host->old_div != div)
1451 printk("%s..%d.. newDiv=%u, newCLK=%uKhz====xbw[%s]=====\n", \
1452 __FUNCTION__, __LINE__,div, host->clock/1000, host->dma_name);
1455 ret = rk29_sdmmc_control_clock(host, TRUE);
1456 if(ret != SDM_SUCCESS)
1460 host->old_div = div;
1466 printk("%s..%s..%d.. change division fail, ret=%d !!! ====xbw[%s]====\n",\
1467 __FILE__, __FUNCTION__,__LINE__,ret, host->dma_name);
1475 static int rk29_sdmmc_hw_init(struct rk29_sdmmc *host)
1477 /* reset controller */
1478 rk29_sdmmc_reset_controller(host);
1479 rk29_sdmmc_change_clk_div(host, FOD_FREQ);
1486 int rk29_sdmmc_set_iomux(struct rk29_sdmmc *host)
1489 switch (host->busWidth)
1492 rk29_mux_api_set(GPIO1D1_SDMMC0CMD_NAME, GPIO1H_SDMMC0_CMD);
1493 rk29_mux_api_set(GPIO1D0_SDMMC0CLKOUT_NAME, GPIO1H_SDMMC0_CLKOUT);
1494 rk29_mux_api_set(GPIO1D2_SDMMC0DATA0_NAME, GPIO1H_SDMMC0_DATA0);
1495 rk29_mux_api_set(GPIO1D3_SDMMC0DATA1_NAME, GPIO1H_SDMMC0_DATA1);
1496 rk29_mux_api_set(GPIO1D4_SDMMC0DATA2_NAME, GPIO1H_SDMMC0_DATA2);
1503 int rk29_sdmmc_set_buswidth(struct rk29_sdmmc *host)
1506 switch (host->ctype)
1508 case SDMMC_CTYPE_1BIT:
1509 case SDMMC_CTYPE_4BIT:
1511 case SDMMC_CTYPE_8BIT:
1512 return SDM_PARAM_ERROR; //Now, not support 8 bit width
1514 return SDM_PARAM_ERROR;
1516 rk29_sdmmc_set_iomux(host);
1518 /* Set the current bus width */
1519 rk29_sdmmc_write(host->regs, SDMMC_CTYPE, host->ctype);
1525 void rk29_sdmmc_set_frq(struct rk29_sdmmc *host)
1527 struct mmc_host *mmchost = platform_get_drvdata(host->pdev);
1528 struct mmc_card *card;
1529 struct mmc_ios *ios;
1530 unsigned int max_dtr;
1532 extern void mmc_set_clock(struct mmc_host *host, unsigned int hz);
1537 card = (struct mmc_card *)mmchost->card;
1538 ios = ( struct mmc_ios *)&mmchost->ios;
1543 if(MMC_POWER_ON == ios->power_mode)
1546 max_dtr = (unsigned int)-1;
1548 if (mmc_card_highspeed(card))
1550 if (max_dtr > card->ext_csd.hs_max_dtr)
1551 max_dtr = card->ext_csd.hs_max_dtr;
1554 else if (max_dtr > card->csd.max_dtr)
1556 if(MMC_TYPE_SD == card->type)
1558 max_dtr = (card->csd.max_dtr > SD_FPP_FREQ) ? SD_FPP_FREQ : (card->csd.max_dtr);
1562 max_dtr = (card->csd.max_dtr > MMC_FPP_FREQ) ? MMC_FPP_FREQ : (card->csd.max_dtr);
1566 xbwprintk(7, "%s..%d... call mmc_set_clock() set clk=%d ===xbw[%s]===\n", \
1567 __FUNCTION__, __LINE__, max_dtr, host->dma_name);
1570 mmc_set_clock(mmchost, max_dtr);
1574 static void rk29_sdmmc_dealwith_timeout(struct rk29_sdmmc *host)
1586 host->cmd->error = -EIO;
1590 host->cmd->data->error = -EILSEQ;
1592 host->state = STATE_SENDING_CMD;
1597 case STATE_SENDING_CMD:
1598 host->cmd_status |= SDMMC_INT_RTO;
1599 host->cmd->error = -ETIME;
1600 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,(SDMMC_INT_CMD_DONE | SDMMC_INT_RTO)); // clear interrupt
1601 rk29_sdmmc_set_pending(host, EVENT_CMD_COMPLETE);
1602 tasklet_schedule(&host->tasklet);
1604 case STATE_DATA_BUSY:
1605 host->data_status |= (SDMMC_INT_DCRC|SDMMC_INT_EBE);
1606 host->cmd->data->error = -EILSEQ;
1607 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_DTO); // clear interrupt
1608 rk29_sdmmc_set_pending(host, EVENT_DATA_COMPLETE);
1609 tasklet_schedule(&host->tasklet);
1611 case STATE_SENDING_STOP:
1612 host->cmd_status |= SDMMC_INT_RTO;
1613 host->cmd->error = -ETIME;
1614 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,(SDMMC_INT_CMD_DONE | SDMMC_INT_RTO)); // clear interrupt
1615 rk29_sdmmc_set_pending(host, EVENT_CMD_COMPLETE);
1616 tasklet_schedule(&host->tasklet);
1622 static void rk29_sdmmc_INT_CMD_DONE_timeout(unsigned long host_data)
1624 struct rk29_sdmmc *host = (struct rk29_sdmmc *) host_data;
1626 if(STATE_SENDING_CMD == host->state)
1628 if(0==host->cmd->retries)
1630 printk("%s..%d... cmd=%d, INT_CMD_DONE timeout, errorStep=0x%x, host->state=%x ===xbw[%s]===\n",\
1631 __FUNCTION__, __LINE__,host->cmd->opcode, host->errorstep,host->state,host->dma_name);
1634 rk29_sdmmc_dealwith_timeout(host);
1640 static void rk29_sdmmc_INT_DTO_timeout(unsigned long host_data)
1642 struct rk29_sdmmc *host = (struct rk29_sdmmc *) host_data;
1645 if( (host->cmdr & SDMMC_CMD_DAT_EXP) && (STATE_DATA_BUSY == host->state))
1647 if(0==host->cmd->retries)
1649 printk("%s..%d...cmd=%d DTO_timeout,cmdr=0x%x, errorStep=0x%x, Hoststate=%x===xbw[%s]===\n", \
1650 __FUNCTION__, __LINE__,host->cmd->opcode,host->cmdr ,host->errorstep,host->state,host->dma_name);
1653 rk29_sdmmc_dealwith_timeout(host);
1659 //to excute a request
1660 static int rk29_sdmmc_start_request(struct mmc_host *mmc )
1662 struct rk29_sdmmc *host = mmc_priv(mmc);
1663 struct mmc_request *mrq;
1664 struct mmc_command *cmd;
1667 unsigned long iflags;
1669 spin_lock_irqsave(&host->lock, iflags);
1671 mrq = host->new_mrq;
1675 cmdr = rk29_sdmmc_prepare_command(cmd);
1679 /*clean FIFO if it is a new request*/
1680 if((RK29_CTRL_SDMMC_ID == host->pdev->id) && ( !(cmdr & SDMMC_CMD_STOP)))
1682 ret = rk29_sdmmc_reset_fifo(host);
1683 if(SDM_SUCCESS != ret)
1685 host->mrq = host->new_mrq;///
1686 cmd->error = -ENOMEDIUM;
1687 host->errorstep = 0x0F;
1689 goto start_request_Err;
1693 //check data-busy if the current command has the bit13 in command register.
1694 if( cmdr & SDMMC_CMD_PRV_DAT_WAIT )
1696 if(rk29_sdmmc_read(host->regs, SDMMC_STATUS) & SDMMC_STAUTS_DATA_BUSY)
1698 host->mrq = host->new_mrq;///
1699 cmd->error = -ETIMEDOUT;
1700 ret = SDM_BUSY_TIMEOUT;
1701 host->errorstep = 0x10;
1702 goto start_request_Err;
1706 host->state = STATE_SENDING_CMD;
1707 host->mrq = host->new_mrq;
1714 host->pending_events = 0;
1715 host->completed_events = 0;
1716 host->data_status = 0;
1719 host->errorstep = 0;
1722 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
1724 //adjust the frequency division control of SDMMC0 every time.
1725 rk29_sdmmc_set_frq(host);
1729 //setting for the data
1730 rk29_sdmmc_submit_data(host, mrq->data);
1733 xbwprintk(7, "%s..%d... CMD%d begin to call rk29_sdmmc_start_command() ===xbw[%s]===\n", \
1734 __FUNCTION__, __LINE__ , cmd->opcode,host->dma_name);
1736 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
1738 mod_timer(&host->request_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_SEND_START_TIMEOUT+700));
1742 mod_timer(&host->request_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_SEND_START_TIMEOUT+500));
1746 ret = rk29_sdmmc_start_command(host, cmd, host->cmdr);
1747 if(SDM_SUCCESS != ret)
1749 cmd->error = -ETIMEDOUT;
1750 printk("%s..%d... start_command(CMD%d, arg=%x, retries=%d) fail! ret=%d =========xbw=[%s]===\n",\
1751 __FUNCTION__, __LINE__ , cmd->opcode,cmd->arg, cmd->retries,ret, host->dma_name);
1752 host->errorstep = 0x11;
1753 del_timer_sync(&host->request_timer);
1755 goto start_request_Err;
1758 xbwprintk(7, "%s..%d... CMD=%d, wait for INT_CMD_DONE, ret=%d , \n \
1759 host->state=0x%x, cmdINT=0x%x \n host->pendingEvent=0x%lu, host->completeEvents=0x%lu =========xbw=[%s]=====\n\n",\
1760 __FUNCTION__, __LINE__, host->cmd->opcode,ret, \
1761 host->state,host->cmd_status, host->pending_events,host->completed_events,host->dma_name);
1763 spin_unlock_irqrestore(&host->lock, iflags);
1767 rk29_sdmmc_start_error(host);
1769 if(0 == cmd->retries)
1771 printk("%s: CMD%d(arg=%x) fail to start request. err=%d, Errorstep=0x%x ===xbw[%s]==\n\n",\
1772 __FUNCTION__, cmd->opcode, cmd->arg,ret,host->errorstep,host->dma_name);
1775 spin_unlock_irqrestore(&host->lock, iflags);
1777 host->state = STATE_IDLE;
1778 mmc_request_done(host->mmc, host->mrq);
1785 static void rk29_sdmmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
1787 unsigned long iflags;
1788 struct rk29_sdmmc *host = mmc_priv(mmc);
1790 spin_lock_irqsave(&host->lock, iflags);
1793 //set 1 to close the controller for Debug.
1794 if(RK29_CTRL_SDIO1_ID==host->pdev->id)//if(RK29_CTRL_SDMMC_ID==host->pdev->id)//
1796 mrq->cmd->error = -ENOMEDIUM;
1797 printk("%s..%d.. ==== The %s had been closed by myself for the experiment. ====xbw[%s]===\n",\
1798 __FUNCTION__, __LINE__, host->dma_name, host->dma_name);
1800 spin_unlock_irqrestore(&host->lock, iflags);
1801 mmc_request_done(mmc, mrq);
1806 xbwprintk(3, "\n%s..%d..New cmd=%2d(arg=0x%8x)=== cardPresent=0x%lu, state=0x%x ==xbw[%s]==\n", \
1807 __FUNCTION__, __LINE__,mrq->cmd->opcode, mrq->cmd->arg,host->flags,host->state, host->dma_name);
1809 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
1811 if(!rk29_sdmmc_get_cd(mmc) || ((0==mmc->re_initialized_flags)&&(MMC_GO_IDLE_STATE != mrq->cmd->opcode)))
1813 mrq->cmd->error = -ENOMEDIUM;
1815 if((RK29_CTRL_SDMMC_ID == host->pdev->id)&&(0==mrq->cmd->retries))
1817 if(host->old_cmd != mrq->cmd->opcode)
1819 if( ((17==host->old_cmd)&&(18==mrq->cmd->opcode)) || ((18==host->old_cmd)&&(17==mrq->cmd->opcode)) ||\
1820 ((24==host->old_cmd)&&(25==mrq->cmd->opcode)) || ((25==host->old_cmd)&&(24==mrq->cmd->opcode)))
1822 host->old_cmd = mrq->cmd->opcode;
1823 if(host->error_times++ %RK29_ERROR_PRINTK_INTERVAL ==0)
1825 printk("%s: Refuse to run CMD%2d(arg=0x%8x) due to the removal of card. 1==xbw[%s]==\n", \
1826 __FUNCTION__, mrq->cmd->opcode, mrq->cmd->arg, host->dma_name);
1831 host->old_cmd = mrq->cmd->opcode;
1832 host->error_times = 0;
1833 printk("%s: Refuse to run CMD%2d(arg=0x%8x) due to the removal of card. 2==xbw[%s]==\n", \
1834 __FUNCTION__, mrq->cmd->opcode, mrq->cmd->arg, host->dma_name);
1839 if(host->error_times++ % (RK29_ERROR_PRINTK_INTERVAL*2) ==0)
1841 printk("%s: Refuse to run CMD%2d(arg=0x%8x) due to the removal of card. 3==xbw[%s]==\n", \
1842 __FUNCTION__, mrq->cmd->opcode, mrq->cmd->arg, host->dma_name);
1847 spin_unlock_irqrestore(&host->lock, iflags);
1848 mmc_request_done(mmc, mrq);
1853 if(host->old_cmd != mrq->cmd->opcode)
1855 host->old_cmd = mrq->cmd->opcode;
1856 host->error_times = 0;
1862 host->old_cmd = mrq->cmd->opcode;
1863 host->error_times = 0;
1866 host->new_mrq = mrq;
1867 if (host->state == STATE_IDLE)
1869 spin_unlock_irqrestore(&host->lock, iflags);
1871 rk29_sdmmc_start_request(mmc);
1875 #ifdef RK29_SDMMC_LIST_QUEUE
1877 printk("%s..%d...Danger! Danger! New request was added to queue. ===xbw[%s]===\n", \
1878 __FUNCTION__, __LINE__,host->dma_name);
1879 list_add_tail(&host->queue_node, &host->queue);
1883 printk("%s..%d..state Error! ,old_state=%d, OldCMD=%d ,NewCMD%2d,arg=0x%x ===xbw[%s]===\n", \
1884 __FUNCTION__, __LINE__, host->state, host->cmd->opcode,mrq->cmd->opcode,mrq->cmd->arg, host->dma_name);
1886 mrq->cmd->error = -ENOMEDIUM;
1888 spin_unlock_irqrestore(&host->lock, iflags);
1889 mmc_request_done(mmc, mrq);
1898 static void rk29_sdmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
1902 unsigned long iflags;
1903 struct rk29_sdmmc *host = mmc_priv(mmc);
1905 spin_lock_irqsave(&host->lock, iflags);
1908 * Waiting SDIO controller to be IDLE.
1910 while (timeout-- > 0)
1912 value = rk29_sdmmc_read(host->regs, SDMMC_STATUS);
1913 if ((value & SDMMC_STAUTS_DATA_BUSY) == 0 &&(value & SDMMC_CMD_FSM_MASK) == SDMMC_CMD_FSM_IDLE)
1922 printk("%s..%d...Waiting for SDMMC%d controller to be IDLE timeout.==xbw[%s]===\n", \
1923 __FUNCTION__, __LINE__, host->pdev->id, host->dma_name);
1928 //if(host->bus_mode != ios->power_mode)
1930 switch (ios->power_mode)
1933 rk29_sdmmc_write(host->regs, SDMMC_PWREN, POWER_ENABLE);
1935 //reset the controller if it is SDMMC0
1936 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
1938 xbwprintk(7, "%s..%d..POWER_UP, call reset_controller, initialized_flags=%d ====xbw[%s]=====\n",\
1939 __FUNCTION__, __LINE__, host->mmc->re_initialized_flags,host->dma_name);
1943 rk29_sdmmc_hw_init(host);
1949 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
1951 rk29_sdmmc_control_clock(host, FALSE);
1952 rk29_sdmmc_write(host->regs, SDMMC_PWREN, POWER_DISABLE);
1954 if(5 == host->bus_mode)
1957 xbwprintk(7, "%s..%d..Fisrt powerOFF, call reset_controller ======xbw[%s]====\n", \
1958 __FUNCTION__, __LINE__,host->dma_name);
1960 rk29_sdmmc_reset_controller(host);
1970 host->bus_mode = ios->power_mode;
1975 if(host->ctype != ios->bus_width)
1977 switch (ios->bus_width)
1979 case MMC_BUS_WIDTH_1:
1980 host->ctype = SDMMC_CTYPE_1BIT;
1982 case MMC_BUS_WIDTH_4:
1983 host->ctype = SDMMC_CTYPE_4BIT;
1985 case MMC_BUS_WIDTH_8:
1986 host->ctype = SDMMC_CTYPE_8BIT;
1993 rk29_sdmmc_set_buswidth(host);
1997 if (ios->clock && (ios->clock != host->clock))
2000 * Use mirror of ios->clock to prevent race with mmc
2001 * core ios update when finding the minimum.
2003 //host->clock = ios->clock;
2004 rk29_sdmmc_change_clk_div(host, ios->clock);
2008 spin_unlock_irqrestore(&host->lock, iflags);
2011 static int rk29_sdmmc_get_ro(struct mmc_host *mmc)
2013 struct rk29_sdmmc *host = mmc_priv(mmc);
2014 u32 wrtprt = rk29_sdmmc_read(host->regs, SDMMC_WRTPRT);
2016 return (wrtprt & SDMMC_WRITE_PROTECT)?1:0;
2020 static void rk29_sdmmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
2023 unsigned long flags;
2024 struct rk29_sdmmc *host = mmc_priv(mmc);
2026 spin_lock_irqsave(&host->lock, flags);
2027 intmask = rk29_sdmmc_read(host->regs, SDMMC_INTMASK);
2030 rk29_sdmmc_write(host->regs, SDMMC_INTMASK, intmask | SDMMC_INT_SDIO);
2032 rk29_sdmmc_write(host->regs, SDMMC_INTMASK, intmask & ~SDMMC_INT_SDIO);
2033 spin_unlock_irqrestore(&host->lock, flags);
2036 static void rk29_sdmmc_init_card(struct mmc_host *mmc, struct mmc_card *card)
2038 card->quirks = MMC_QUIRK_BLKSZ_FOR_BYTE_MODE;
2043 static const struct mmc_host_ops rk29_sdmmc_ops[] = {
2045 .request = rk29_sdmmc_request,
2046 .set_ios = rk29_sdmmc_set_ios,
2047 .get_ro = rk29_sdmmc_get_ro,
2048 .get_cd = rk29_sdmmc_get_cd,
2051 .request = rk29_sdmmc_request,
2052 .set_ios = rk29_sdmmc_set_ios,
2053 .enable_sdio_irq = rk29_sdmmc_enable_sdio_irq,
2054 .init_card = rk29_sdmmc_init_card,
2058 static void rk29_sdmmc_request_end(struct rk29_sdmmc *host, struct mmc_command *cmd)
2061 int output=SDM_SUCCESS;
2063 xbwprintk(7, "%s..%d... cmd=%d, host->state=0x%x,\n pendingEvent=0x%lu, completeEvents=0x%lu ====xbw=[%s]====\n\n",\
2064 __FUNCTION__, __LINE__,cmd->opcode,host->state, host->pending_events,host->completed_events,host->dma_name);
2066 del_timer_sync(&host->DTO_timer);
2071 rk29_sdmmc_stop_dma(host);
2072 rk29_sdmmc_control_host_dma(host, FALSE);
2078 goto exit;//It need not to wait-for-busy if the CMD-ERROR happen.
2084 status = host->data_status;
2086 if(host->cmdr & SDMMC_CMD_DAT_WRITE)
2088 if(status & (SDMMC_INT_DCRC | SDMMC_INT_EBE))
2090 cmd->data->error = -EILSEQ;;//mrq->data->error = -EILSEQ;
2091 output = SDM_DATA_CRC_ERROR;
2092 host->errorstep = 0x16;
2096 output = rk29_sdmmc_wait_unbusy(host);
2097 if(SDM_SUCCESS != output)
2099 host->errorstep = 0x17;
2100 cmd->data->error = -ETIMEDOUT;
2103 host->data->bytes_xfered = host->data->blocks * host->data->blksz;
2108 if( status & SDMMC_INT_SBE)
2110 cmd->data->error = -EIO;
2111 host->errorstep = 0x18;
2112 output = SDM_START_BIT_ERROR;
2114 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.
2116 cmd->data->error = -EILSEQ;
2117 host->errorstep = 0x19;
2118 output = SDM_END_BIT_ERROR;
2120 else if(status & SDMMC_INT_DRTO)
2122 cmd->data->error = -ETIMEDOUT;
2123 host->errorstep = 0x1A;
2124 output = SDM_DATA_READ_TIMEOUT;
2126 else if(status & SDMMC_INT_DCRC)
2128 host->errorstep = 0x1B;
2129 cmd->data->error = -EILSEQ;
2130 output = SDM_DATA_CRC_ERROR;
2134 output = rk29_sdmmc_read_remain_data(host, (host->data->blocks * host->data->blksz), host->pbuf);
2135 if(SDM_SUCCESS == output)
2137 host->data->bytes_xfered = host->data->blocks * host->data->blksz;
2143 if(SDM_SUCCESS == output)
2145 if ((mmc_resp_type(cmd) == MMC_RSP_R1B) || (MMC_STOP_TRANSMISSION == cmd->opcode))
2147 output = rk29_sdmmc_wait_unbusy(host);
2148 if(SDM_SUCCESS != output)
2150 cmd->error = -ETIMEDOUT;
2151 host->mrq->cmd->error = -ETIMEDOUT;
2152 host->errorstep = 0x1C;
2153 printk("%s..%d... CMD12 wait busy timeout!!!!! ====xbw=[%s]====\n", \
2154 __FUNCTION__, __LINE__, host->dma_name);
2160 if(cmd->data && cmd->data->error)
2162 if( (!cmd->error) && (0==cmd->retries) && (host->error_times++%RK29_ERROR_PRINTK_INTERVAL == 0))
2164 printk("%s..%d......CMD=%d error!!!, arg=%x, errorTimes=%d, errorStep=0x%x ! ====xbw[%s]====\n",\
2165 __FUNCTION__, __LINE__, cmd->opcode, cmd->arg, host->error_times,host->errorstep, host->dma_name);
2171 #ifdef RK29_SDMMC_LIST_QUEUE
2172 if (!list_empty(&host->queue))
2174 printk("%s..%d.. Danger!Danger!. continue the next request in the queue. ====xbw[%s]====\n",\
2175 __FUNCTION__, __LINE__, host->dma_name);
2177 host = list_entry(host->queue.next,
2178 struct rk29_sdmmc, queue_node);
2179 list_del(&host->queue_node);
2180 host->state = STATE_SENDING_CMD;
2181 rk29_sdmmc_start_request(host->mmc);
2185 dev_vdbg(&host->pdev->dev, "list empty\n");
2186 host->state = STATE_IDLE;
2189 dev_vdbg(&host->pdev->dev, "list empty\n");
2190 host->state = STATE_IDLE;
2195 static int rk29_sdmmc_command_complete(struct rk29_sdmmc *host,
2196 struct mmc_command *cmd)
2198 u32 value, status = host->cmd_status;
2199 int timeout, output= SDM_SUCCESS;
2201 xbwprintk(7, "%s..%d. cmd=%d, host->state=0x%x, cmdINT=0x%x\n,pendingEvent=0x%lu,completeEvents=0x%lu ===xbw[%s]===\n\n",\
2202 __FUNCTION__, __LINE__,cmd->opcode,host->state,status, host->pending_events,host->completed_events,host->dma_name);
2205 del_timer_sync(&host->request_timer);
2207 host->cmd_status = 0;
2209 if((RK29_CTRL_SDMMC_ID == host->pdev->id) && (host->cmdr & SDMMC_CMD_STOP))
2211 output = rk29_sdmmc_reset_fifo(host);
2212 if (SDM_SUCCESS != output)
2214 printk("%s..%d......reset fifo fail! CMD%d(arg=0x%x, Retries=%d) =======xbw[%s]=====\n",__FUNCTION__, __LINE__, \
2215 cmd->opcode, cmd->arg, cmd->retries,host->dma_name);
2217 cmd->error = -ETIMEDOUT;
2218 host->mrq->cmd->error = cmd->error;
2220 host->errorstep = 0x1C;
2225 //status = rk29_sdmmc_read(host->regs, SDMMC_RINTSTS);
2226 if(status & SDMMC_INT_RTO)
2228 cmd->error = -ENOMEM;
2229 host->mrq->cmd->error = cmd->error;
2230 output = SDM_BUSY_TIMEOUT;
2232 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_RTO);
2234 if(host->use_dma)//if(host->dodma)
2238 rk29_sdmmc_stop_dma(host);
2239 rk29_sdmmc_control_host_dma(host, FALSE);
2243 value = rk29_sdmmc_read(host->regs, SDMMC_CTRL);
2244 value |= SDMMC_CTRL_FIFO_RESET;
2245 rk29_sdmmc_write(host->regs, SDMMC_CTRL, value);
2248 while (((value = rk29_sdmmc_read(host->regs, SDMMC_CTRL)) & (SDMMC_CTRL_FIFO_RESET)) && (timeout > 0))
2256 host->errorstep = 0x1D;
2257 printk("%s..%d......reset CTRL fail! CMD%d(arg=0x%x, Retries=%d) ===xbw[%s]===\n",\
2258 __FUNCTION__, __LINE__, cmd->opcode, cmd->arg, cmd->retries,host->dma_name);
2266 if(cmd->flags & MMC_RSP_PRESENT)
2268 if(cmd->flags & MMC_RSP_136)
2270 cmd->resp[3] = rk29_sdmmc_read(host->regs, SDMMC_RESP0);
2271 cmd->resp[2] = rk29_sdmmc_read(host->regs, SDMMC_RESP1);
2272 cmd->resp[1] = rk29_sdmmc_read(host->regs, SDMMC_RESP2);
2273 cmd->resp[0] = rk29_sdmmc_read(host->regs, SDMMC_RESP3);
2277 cmd->resp[0] = rk29_sdmmc_read(host->regs, SDMMC_RESP0);
2283 del_timer_sync(&host->DTO_timer);
2286 if((0==cmd->retries) && (host->error_times++%RK29_ERROR_PRINTK_INTERVAL == 0))
2288 if( ((RK29_CTRL_SDMMC_ID==host->pdev->id)&&(MMC_SLEEP_AWAKE!=cmd->opcode)) ||
2289 ((RK29_CTRL_SDMMC_ID!=host->pdev->id)&&(MMC_SEND_EXT_CSD!=cmd->opcode)) )
2291 printk("%s..%d...CMD=%d, arg=%x, errorTimes=%d, errorStep=0x%x !!!!!! =======xbw[%s]=====\n",\
2292 __FUNCTION__, __LINE__, cmd->opcode, cmd->arg,host->error_times,host->errorstep, host->dma_name);
2297 del_timer_sync(&host->request_timer);
2303 del_timer_sync(&host->request_timer);
2304 del_timer_sync(&host->DTO_timer);
2306 if((0==cmd->retries) && (host->error_times++%RK29_ERROR_PRINTK_INTERVAL == 0))
2308 printk("%s..%d....command_complete(CMD=%d, arg=%x) error=%d =======xbw[%s]=====\n",\
2309 __FUNCTION__, __LINE__, host->cmd->opcode,host->cmd->arg, output, host->dma_name);
2317 static void rk29_sdmmc_start_error(struct rk29_sdmmc *host)
2319 host->cmd->error = -EIO;
2320 host->mrq->cmd->error = -EIO;
2321 host->cmd_status = SDMMC_INT_RTO;
2323 del_timer_sync(&host->request_timer);
2325 rk29_sdmmc_command_complete(host, host->mrq->cmd);
2326 rk29_sdmmc_request_end(host, host->mrq->cmd);
2330 static void rk29_sdmmc_tasklet_func(unsigned long priv)
2332 struct rk29_sdmmc *host = (struct rk29_sdmmc *)priv;
2333 struct mmc_data *data = host->cmd->data;
2334 enum rk29_sdmmc_state state = host->state;
2337 spin_lock(&host->lock);
2339 state = host->state;
2348 xbwprintk(7, "%s..%d.. prev_state= STATE_IDLE ====xbw[%s]====\n", \
2349 __FUNCTION__, __LINE__, host->dma_name);
2353 case STATE_SENDING_CMD:
2355 xbwprintk(7, "%s..%d.. prev_state= STATE_SENDING_CMD, pendingEvernt=0x%lu ====xbw[%s]====\n",\
2356 __FUNCTION__, __LINE__,host->completed_events, host->dma_name);
2358 if (!rk29_sdmmc_test_and_clear_pending(host, EVENT_CMD_COMPLETE))
2361 del_timer_sync(&host->request_timer); //delete the timer for INT_COME_DONE
2363 rk29_sdmmc_set_completed(host, EVENT_CMD_COMPLETE);
2364 rk29_sdmmc_command_complete(host, host->cmd);
2369 rk29_sdmmc_request_end(host, host->cmd);
2371 xbwprintk(7, "%s..%d.. CMD%d call mmc_request_done()====xbw[%s]====\n", \
2372 __FUNCTION__, __LINE__,host->cmd->opcode,host->dma_name);
2378 if(host->cmd->error)
2380 del_timer_sync(&host->DTO_timer); //delete the timer for INT_DTO
2384 xbwprintk(7, "%s..%d.. cmderr, so call send_stop_cmd() ====xbw[%s]====\n", \
2385 __FUNCTION__, __LINE__, host->dma_name);
2387 state = STATE_SENDING_CMD;//STATE_SENDING_STOP;
2388 send_stop_cmd(host);
2392 rk29_sdmmc_set_pending(host, EVENT_DATA_COMPLETE);
2396 state = STATE_DATA_BUSY;
2400 case STATE_DATA_BUSY:
2402 xbwprintk(7, "%s..%d.. prev_state= STATE_DATA_BUSY, pendingEvernt=0x%lu ====xbw[%s]====\n", \
2403 __FUNCTION__, __LINE__,host->pending_events, host->dma_name);
2405 if (!rk29_sdmmc_test_and_clear_pending(host, EVENT_DATA_COMPLETE))
2408 rk29_sdmmc_set_completed(host, EVENT_DATA_COMPLETE);
2409 del_timer_sync(&host->DTO_timer); //delete the timer for INT_DTO
2411 rk29_sdmmc_request_end(host, host->cmd);
2413 if (data && !data->stop)
2415 xbwprintk(7, "%s..%d.. CMD%d call mmc_request_done()====xbw[%s]====\n", \
2416 __FUNCTION__, __LINE__,host->cmd->opcode,host->dma_name);
2418 if(!( (MMC_READ_SINGLE_BLOCK == host->cmd->opcode)&&( -EIO == data->error))) //deal with START_BIT_ERROR
2426 xbwprintk(7, "%s..%d.. after DATA_COMPLETE, so call send_stop_cmd() ====xbw[%s]====\n", \
2427 __FUNCTION__, __LINE__, host->dma_name);
2429 state = STATE_SENDING_CMD;
2430 send_stop_cmd(host);
2434 case STATE_SENDING_STOP:
2436 xbwprintk(7, "%s..%d.. prev_state= STATE_SENDING_STOP, pendingEvernt=0x%lu ====xbw[%s]====\n", \
2437 __FUNCTION__, __LINE__, host->pending_events, host->dma_name);
2439 if (!rk29_sdmmc_test_and_clear_pending(host, EVENT_CMD_COMPLETE))
2442 rk29_sdmmc_command_complete(host, host->cmd);
2443 del_timer_sync(&host->request_timer); //delete the timer for INT_CMD_DONE int CMD12
2444 rk29_sdmmc_request_end(host, host->cmd);
2453 host->state = state;
2458 spin_unlock(&host->lock);
2462 host->state = STATE_IDLE;
2463 spin_unlock(&host->lock);
2465 mmc_request_done(host->mmc, host->mrq);
2469 static inline void rk29_sdmmc_cmd_interrupt(struct rk29_sdmmc *host, u32 status)
2473 if(!host->cmd_status)
2474 host->cmd_status = status;
2476 if((MMC_STOP_TRANSMISSION != host->cmd->opcode) && (host->cmdr & SDMMC_CMD_DAT_EXP))
2479 multi = rk29_sdmmc_read(host->regs, SDMMC_BYTCNT)/unit;
2480 multi += ((rk29_sdmmc_read(host->regs, SDMMC_BYTCNT)%unit) ? 1 :0 );
2481 multi = (multi>0) ? multi : 1;
2482 mod_timer(&host->DTO_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_WAIT_DTO_INTERNVAL*multi));
2486 rk29_sdmmc_set_pending(host, EVENT_CMD_COMPLETE);
2487 tasklet_schedule(&host->tasklet);
2490 static irqreturn_t rk29_sdmmc_interrupt(int irq, void *dev_id)
2492 struct rk29_sdmmc *host = dev_id;
2493 u32 status, pending;
2496 unsigned long iflags;
2498 spin_lock_irqsave(&host->lock, iflags);
2500 status = rk29_sdmmc_read(host->regs, SDMMC_RINTSTS);
2501 pending = rk29_sdmmc_read(host->regs, SDMMC_MINTSTS);// read only mask reg
2504 spin_unlock_irqrestore(&host->lock, iflags);
2509 if(pending & SDMMC_INT_CD)
2511 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS, SDMMC_INT_CD); // clear sd detect int
2512 present = rk29_sdmmc_get_cd(host->mmc);
2513 present_old = test_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
2515 if(present != present_old)
2517 printk("\n******************\n%s:INT_CD=0x%x,INT-En=%d,hostState=%d, present Old=%d ==> New=%d ==xbw[%s]==\n",\
2518 __FUNCTION__, pending, host->mmc->re_initialized_flags, host->state, present_old, present, host->dma_name);
2520 rk28_send_wakeup_key(); //wake up backlight
2521 host->error_times = 0;
2524 rk29_sdmmc_dealwith_timeout(host);
2529 set_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
2531 if(host->mmc->re_initialized_flags)
2533 mod_timer(&host->detect_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_REMOVAL_DELAY/2));
2537 mod_timer(&host->detect_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_REMOVAL_DELAY*2));
2542 clear_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
2543 host->mmc->re_initialized_flags = 0;
2545 mmc_detect_change(host->mmc, 200);
2550 spin_unlock_irqrestore(&host->lock, iflags);
2556 if (pending & SDMMC_INT_CMD_DONE) {
2558 xbwprintk(6, "%s..%d.. CMD%d INT_CMD_DONE INT=0x%x ====xbw[%s]====\n", \
2559 __FUNCTION__, __LINE__, host->cmd->opcode,pending, host->dma_name);
2561 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_CMD_DONE); // clear interrupt
2563 rk29_sdmmc_cmd_interrupt(host, status);
2566 if(pending & SDMMC_INT_SDIO)
2568 xbwprintk(7, "%s..%d.. INT_SDIO INT=0x%x ====xbw[%s]====\n", \
2569 __FUNCTION__, __LINE__, pending, host->dma_name);
2571 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_SDIO);
2572 mmc_signal_sdio_irq(host->mmc);
2576 if(pending & SDMMC_INT_RTO)
2578 xbwprintk(7, "%s..%d.. CMD%d CMD_ERROR_FLAGS INT=0x%x ====xbw[%s]====\n", \
2579 __FUNCTION__, __LINE__, host->cmd->opcode,pending, host->dma_name);
2581 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_RTO);
2582 host->cmd_status = status;
2584 rk29_sdmmc_set_pending(host, EVENT_CMD_COMPLETE);
2586 if(!(pending & SDMMC_INT_CMD_DONE))
2587 tasklet_schedule(&host->tasklet);
2589 spin_unlock_irqrestore(&host->lock, iflags);
2594 if(pending & SDMMC_INT_HLE)
2596 printk("%s: Error due to hardware locked. Please check your hardware. INT=0x%x, CMD%d(arg=0x%x, retries=%d)==xbw[%s]==\n",\
2597 __FUNCTION__, pending,host->cmd->opcode, host->cmd->arg, host->cmd->retries, host->dma_name);
2599 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_HLE);
2600 spin_unlock_irqrestore(&host->lock, iflags);
2605 if(pending & SDMMC_INT_DTO)
2607 xbwprintk(7, "%s..%d.. CMD%d INT_DTO INT=0x%x ==xbw[%s]==\n", \
2608 __FUNCTION__, __LINE__,host->cmd->opcode,pending, host->dma_name);
2610 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_DTO);
2611 del_timer_sync(&host->DTO_timer); //delete the timer for INT_DTO
2613 if (!host->data_status)
2614 host->data_status = status;
2618 rk29_sdmmc_set_pending(host, EVENT_DATA_COMPLETE);
2619 tasklet_schedule(&host->tasklet);
2621 spin_unlock_irqrestore(&host->lock, iflags);
2626 if (pending & SDMMC_INT_FRUN)
2628 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", \
2629 __FUNCTION__, pending, host->cmd->opcode, host->cmd->arg, host->cmd->retries,host->dma_name);
2631 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_FRUN);
2632 spin_unlock_irqrestore(&host->lock, iflags);
2636 if (pending & SDMMC_INT_RXDR)
2638 xbwprintk(6, "%s..%d.. SDMMC_INT_RXDR INT=0x%x ====xbw[%s]====\n", \
2639 __FUNCTION__, __LINE__, pending, host->dma_name);
2641 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_RXDR); // clear interrupt
2642 rk29_sdmmc_do_pio_read(host);
2645 if (pending & SDMMC_INT_TXDR)
2647 xbwprintk(6, "%s..%d.. SDMMC_INT_TXDR INT=0x%x ====xbw[%s]====\n", \
2648 __FUNCTION__, __LINE__, pending, host->dma_name);
2650 rk29_sdmmc_do_pio_write(host);
2652 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_TXDR); // clear interrupt
2655 spin_unlock_irqrestore(&host->lock, iflags);
2661 * MMC card detect thread, kicked off from detect interrupt, 1 timer
2664 static void rk29_sdmmc_detect_change(unsigned long data)
2666 struct rk29_sdmmc *host = (struct rk29_sdmmc *)data;
2673 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
2675 host->mmc->re_initialized_flags =1;
2678 mmc_detect_change(host->mmc, 0);
2682 static void rk29_sdmmc1_check_status(unsigned long data)
2684 struct rk29_sdmmc *host = (struct rk29_sdmmc *)data;
2685 struct rk29_sdmmc_platform_data *pdata = host->pdev->dev.platform_data;
2686 unsigned int status;
2688 status = pdata->status(mmc_dev(host->mmc));
2690 if (status ^ host->oldstatus)
2692 pr_info("%s: slot status change detected(%d-%d)\n",mmc_hostname(host->mmc), host->oldstatus, status);
2695 set_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
2696 mod_timer(&host->detect_timer, jiffies + msecs_to_jiffies(200));
2700 clear_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
2701 rk29_sdmmc_detect_change((unsigned long)host);
2705 host->oldstatus = status;
2708 static void rk29_sdmmc1_status_notify_cb(int card_present, void *dev_id)
2710 struct rk29_sdmmc *host = dev_id;
2711 printk(KERN_INFO "%s, card_present %d\n", mmc_hostname(host->mmc), card_present);
2712 rk29_sdmmc1_check_status((unsigned long)host);
2716 static int rk29_sdmmc_probe(struct platform_device *pdev)
2718 struct mmc_host *mmc;
2719 struct rk29_sdmmc *host;
2720 struct resource *regs;
2721 struct rk29_sdmmc_platform_data *pdata;
2725 /* must have platform data */
2726 pdata = pdev->dev.platform_data;
2728 dev_err(&pdev->dev, "Platform data missing\n");
2730 host->errorstep = 0x87;
2734 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2737 host->errorstep = 0x88;
2741 mmc = mmc_alloc_host(sizeof(struct rk29_sdmmc), &pdev->dev);
2744 host->errorstep = 0x89;
2749 host = mmc_priv(mmc);
2753 host->ctype = 0; // set default 1 bit mode
2754 host->errorstep = 0;
2756 host->old_cmd = 100;
2758 host->old_div = 0xFF;
2759 host->error_times = 0;
2762 host->gpio_det = pdata->detect_irq;
2768 spin_lock_init(&host->lock);
2770 #ifdef RK29_SDMMC_LIST_QUEUE
2771 INIT_LIST_HEAD(&host->queue);
2774 host->clk = clk_get(&pdev->dev, "mmc");
2776 #if RK29_SDMMC_DEFAULT_SDIO_FREQ
2777 clk_set_rate(host->clk,SDHC_FPP_FREQ);
2779 if(RK29_CTRL_SDMMC_ID== host->pdev->id)
2780 clk_set_rate(host->clk,SDHC_FPP_FREQ);
2782 clk_set_rate(host->clk,RK29_MAX_SDIO_FREQ);
2786 clk_enable(host->clk);
2787 clk_enable(clk_get(&pdev->dev, "hclk_mmc"));
2790 host->regs = ioremap(regs->start, regs->end - regs->start + 1);
2793 host->errorstep = 0x8A;
2797 mmc->ops = &rk29_sdmmc_ops[pdev->id];
2798 mmc->pm_flags |= MMC_PM_IGNORE_PM_NOTIFY;
2799 mmc->f_min = FOD_FREQ;
2801 #if RK29_SDMMC_DEFAULT_SDIO_FREQ
2802 mmc->f_max = SDHC_FPP_FREQ;
2804 if(RK29_CTRL_SDMMC_ID== host->pdev->id)
2806 mmc->f_max = SDHC_FPP_FREQ;
2810 mmc->f_max = RK29_MAX_SDIO_FREQ;//SDHC_FPP_FREQ / 2;
2814 //mmc->ocr_avail = pdata->host_ocr_avail;
2815 mmc->ocr_avail = MMC_VDD_27_28|MMC_VDD_28_29|MMC_VDD_29_30|MMC_VDD_30_31
2816 | 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
2817 mmc->caps = pdata->host_caps;
2818 mmc->re_initialized_flags = 1;
2823 mmc->max_phys_segs = 64;
2824 mmc->max_hw_segs = 64;
2827 * Block size can be up to 2048 bytes, but must be a power of two.
2829 mmc->max_blk_size = 4095;
2832 * No limit on the number of blocks transferred.
2834 mmc->max_blk_count = 4096;
2837 * Since we only have a 16-bit data length register, we must
2838 * ensure that we don't exceed 2^16-1 bytes in a single request.
2840 mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count; //8M bytes(2K*4K)
2843 * Set the maximum segment size. Since we aren't doing DMA
2844 * (yet) we are only limited by the data length register.
2846 mmc->max_seg_size = mmc->max_req_size;
2848 tasklet_init(&host->tasklet, rk29_sdmmc_tasklet_func, (unsigned long)host);
2850 irq = platform_get_irq(pdev, 0);
2853 host->errorstep = 0x8B;
2858 memcpy(host->dma_name, pdata->dma_name, 8);
2859 host->use_dma = pdata->use_dma;
2864 host->dma_info = rk29_sdmmc_dma_infos[host->pdev->id];
2865 ret = rk29_dma_request(host->dma_info.chn, &(host->dma_info.client), NULL);
2868 printk("%s..%d...rk29_dma_request error=%d.===xbw[%s]====\n", \
2869 __FUNCTION__, __LINE__,ret, host->dma_name);
2870 host->errorstep = 0x97;
2874 #if 0 //deal with the old API of DMA-module
2875 ret = rk29_dma_config(host->dma_info.chn, 4);
2876 #else //deal with the new API of DMA-module
2877 if(RK29_CTRL_SDMMC_ID== host->pdev->id)
2879 ret = rk29_dma_config(host->dma_info.chn, 4, 16);
2883 ret = rk29_dma_config(host->dma_info.chn, 4, 1);
2888 printk("%s..%d.. rk29_dma_config error=%d ====xbw[%s]====\n", \
2889 __FUNCTION__, __LINE__, ret, host->dma_name);
2890 host->errorstep = 0x98;
2894 ret = rk29_dma_set_buffdone_fn(host->dma_info.chn, rk29_sdmmc_dma_complete);
2897 printk("%s..%d.. dma_set_buffdone_fn error=%d ====xbw[%s]====\n", \
2898 __FUNCTION__, __LINE__, ret, host->dma_name);
2899 host->errorstep = 0x99;
2903 host->dma_addr = regs->start + SDMMC_DATA;
2906 rk29_sdmmc_hw_init(host);
2908 ret = request_irq(irq, rk29_sdmmc_interrupt, 0, dev_name(&pdev->dev), host);
2912 printk("%s..%d.. request_irq error=%d ====xbw[%s]====\n", \
2913 __FUNCTION__, __LINE__, ret, host->dma_name);
2914 host->errorstep = 0x8C;
2918 /* setup sdmmc1 wifi card detect change */
2919 if (pdata->register_status_notify) {
2920 pdata->register_status_notify(rk29_sdmmc1_status_notify_cb, host);
2923 if(RK29_CTRL_SDMMC_ID== host->pdev->id)
2925 clear_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
2929 /* sdmmc1 wifi card slot status initially */
2930 if (pdata->status) {
2931 host->oldstatus = pdata->status(mmc_dev(host->mmc));
2932 if (host->oldstatus) {
2933 set_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
2935 clear_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
2939 /* Create card detect handler thread */
2940 setup_timer(&host->detect_timer, rk29_sdmmc_detect_change,(unsigned long)host);
2941 setup_timer(&host->request_timer,rk29_sdmmc_INT_CMD_DONE_timeout,(unsigned long)host);
2942 setup_timer(&host->DTO_timer,rk29_sdmmc_INT_DTO_timeout,(unsigned long)host);
2944 platform_set_drvdata(pdev, mmc);
2948 #ifdef RK29_SDMMC_NOTIFY_REMOVE_INSERTION
2950 globalSDhost[pdev->id] = (struct rk29_sdmmc *)host;
2951 if(RK29_CTRL_SDMMC_ID== host->pdev->id)
2953 rk29_sdmmc_progress_add_attr(pdev);
2957 #if defined (CONFIG_DEBUG_FS)
2958 rk29_sdmmc_init_debugfs(host);
2961 printk(".Line%d..The End of SDMMC-probe %s ===xbw[%s]===\n\n", __LINE__, RK29_SDMMC_VERSION,host->dma_name);
2968 rk29_dma_free(host->dma_info.chn, &host->dma_info.client);
2972 iounmap(host->regs);
2984 static int __exit rk29_sdmmc_remove(struct platform_device *pdev)
2987 struct mmc_host *mmc = platform_get_drvdata(pdev);
2988 struct rk29_sdmmc *host;
2989 struct resource *regs;
2994 host = mmc_priv(mmc);
2997 rk29_sdmmc_control_clock(host, 0);
2999 /* Shutdown detect IRQ and kill detect thread */
3000 del_timer_sync(&host->detect_timer);
3001 del_timer_sync(&host->request_timer);
3002 del_timer_sync(&host->DTO_timer);
3004 tasklet_disable(&host->tasklet);
3005 free_irq(platform_get_irq(pdev, 0), host);
3008 rk29_dma_free(host->dma_info.chn, &host->dma_info.client);
3011 mmc_remove_host(mmc);
3013 iounmap(host->regs);
3015 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
3016 release_mem_region(regs->start,resource_size(regs));
3019 platform_set_drvdata(pdev, NULL);
3027 static irqreturn_t det_keys_isr(int irq, void *dev_id)
3029 struct rk29_sdmmc *host = dev_id;
3030 dev_info(&host->pdev->dev, "sd det_gpio changed(%s), send wakeup key!\n",
3031 gpio_get_value(RK29_PIN2_PA2)?"removed":"insert");
3032 rk29_sdmmc_detect_change((unsigned long)dev_id);
3037 static int rk29_sdmmc_sdcard_suspend(struct rk29_sdmmc *host)
3040 rk29_mux_api_set(GPIO2A2_SDMMC0DETECTN_NAME, GPIO2L_GPIO2A2);
3041 gpio_request(RK29_PIN2_PA2, "sd_detect");
3042 gpio_direction_input(RK29_PIN2_PA2);
3044 host->gpio_irq = gpio_to_irq(RK29_PIN2_PA2);
3045 ret = request_irq(host->gpio_irq, det_keys_isr,
3046 (gpio_get_value(RK29_PIN2_PA2))?IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING,
3050 enable_irq_wake(host->gpio_irq);
3054 static void rk29_sdmmc_sdcard_resume(struct rk29_sdmmc *host)
3056 disable_irq_wake(host->gpio_irq);
3057 free_irq(host->gpio_irq,host);
3058 gpio_free(RK29_PIN2_PA2);
3059 rk29_mux_api_set(GPIO2A2_SDMMC0DETECTN_NAME, GPIO2L_SDMMC0_DETECT_N);
3064 static int rk29_sdmmc_suspend(struct platform_device *pdev, pm_message_t state)
3066 struct mmc_host *mmc = platform_get_drvdata(pdev);
3067 struct rk29_sdmmc *host = mmc_priv(mmc);
3070 if(host && host->pdev && (RK29_CTRL_SDMMC_ID == host->pdev->id)) //only the SDMMC0 have suspend-resume; noted by xbw
3073 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))
3074 ret = mmc_suspend_host(mmc);
3076 ret = mmc_suspend_host(mmc, state);
3079 if(rk29_sdmmc_sdcard_suspend(host) < 0)
3080 dev_info(&host->pdev->dev, "rk29_sdmmc_sdcard_suspend error\n");
3086 static int rk29_sdmmc_resume(struct platform_device *pdev)
3088 struct mmc_host *mmc = platform_get_drvdata(pdev);
3089 struct rk29_sdmmc *host = mmc_priv(mmc);
3092 if(host && host->pdev && (RK29_CTRL_SDMMC_ID == host->pdev->id)) //only the SDMMC0 have suspend-resume; noted by xbw
3096 rk29_sdmmc_sdcard_resume(host);
3097 ret = mmc_resume_host(mmc);
3104 #define rk29_sdmmc_suspend NULL
3105 #define rk29_sdmmc_resume NULL
3108 static struct platform_driver rk29_sdmmc_driver = {
3109 .suspend = rk29_sdmmc_suspend,
3110 .resume = rk29_sdmmc_resume,
3111 .remove = __exit_p(rk29_sdmmc_remove),
3113 .name = "rk29_sdmmc",
3117 static int __devinit rk29_sdmmc_init(void)
3119 return platform_driver_probe(&rk29_sdmmc_driver, rk29_sdmmc_probe);
3122 static void __devexit rk29_sdmmc_exit(void)
3124 platform_driver_unregister(&rk29_sdmmc_driver);
3127 module_init(rk29_sdmmc_init);
3128 module_exit(rk29_sdmmc_exit);
3130 MODULE_DESCRIPTION("Rk29 Multimedia Card Interface driver");
3131 MODULE_AUTHOR("xbw@rock-chips.com");
3132 MODULE_LICENSE("GPL v2");