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/mmc/host.h>
37 #include <linux/mmc/mmc.h>
38 #include <linux/mmc/card.h>
40 #include <mach/board.h>
41 #include <mach/rk29_iomap.h>
42 #include <mach/gpio.h>
43 #include <mach/iomux.h>
46 #include <mach/rk29-dma-pl330.h>
47 #include <asm/scatterlist.h>
49 #include "rk29_sdmmc.h"
52 #define RK29_SDMMC_xbw_Debug 0
54 #if RK29_SDMMC_xbw_Debug
56 #define xbwprintk(n, format, arg...) \
57 if (n <= debug_level) { \
58 printk(format,##arg); \
61 #define xbwprintk(n, arg...)
64 #define RK29_SDMMC_ERROR_FLAGS (SDMMC_INT_FRUN /*| SDMMC_INT_RTO*/ | SDMMC_INT_HLE )
66 #define RK29_SDMMC_INTMASK_USEDMA (SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS | SDMMC_INT_CD)
67 #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 )
70 #define RK29_SDMMC_SEND_START_TIMEOUT 2000 //The time interval from the time SEND_CMD to START_CMD_BIT cleared.
71 #define RK29_ERROR_PRINTK_INTERVAL 200 //The time interval between the two printk for the same error.
72 #define RK29_SDMMC_WAIT_DTO_INTERNVAL 1500 //The time interval from the CMD_DONE_INT to DTO_INT
73 #define RK29_SDMMC_REMOVAL_DELAY 2000 //The time interval from the CD_INT to detect_timer react.
75 #define RK29_SDMMC_VERSION "Ver.2.07 The last modify date is 2011-09-09,modifyed by XBW."
77 #define RK29_CTRL_SDMMC_ID 0 //mainly used by SDMMC
78 #define RK29_CTRL_SDIO1_ID 1 //mainly used by sdio-wifi
79 #define RK29_CTRL_SDIO2_ID 2 //mainly used by sdio-card
81 #define RK29_SDMMC_NOTIFY_REMOVE_INSERTION /* use sysfs to notify the removal or insertion of sd-card*/
82 //#define RK29_SDMMC_LIST_QUEUE /* use list-queue for multi-card*/
84 #define RK29_SDMMC_DEFAULT_SDIO_FREQ 0 // 1--run in default frequency(50Mhz); 0---run in 25Mhz,
85 #define RK29_MAX_SDIO_FREQ 25000000 //set max-sdio-frequency 25Mhz at the present time¡£
88 EVENT_CMD_COMPLETE = 0,
94 enum rk29_sdmmc_state {
101 struct rk29_sdmmc_dma_info {
104 struct rk29_dma_client client;
107 static struct rk29_sdmmc_dma_info rk29_sdmmc_dma_infos[]= {
111 .name = "rk29-dma-sdmmc0",
117 .name = "rk29-dma-sdio1",
124 .name = "rk29-dma-sdio2",
130 /* Interrupt Information */
131 typedef struct TagSDC_INT_INFO
133 u32 transLen; //the length of data sent.
134 u32 desLen; //the total length of the all data.
135 u32 *pBuf; //the data buffer for interrupt read or write.
141 spinlock_t request_lock;
145 struct mmc_request *mrq;
146 struct mmc_request *new_mrq;
147 struct mmc_command *cmd;
148 struct mmc_data *data;
150 dma_addr_t dma_addr;;
151 unsigned int use_dma:1;
158 u32 cmdr; //the value setted into command-register
159 u32 dodma; //sign the DMA used for transfer.
160 u32 errorstep;//record the error point.
162 SDC_INT_INFO_T intInfo;
163 struct rk29_sdmmc_dma_info dma_info;
168 struct tasklet_struct tasklet;
169 unsigned long pending_events;
170 unsigned long completed_events;
171 enum rk29_sdmmc_state state;
173 #ifdef RK29_SDMMC_LIST_QUEUE
174 struct list_head queue;
175 struct list_head queue_node;
179 struct platform_device *pdev;
180 struct mmc_host *mmc;
185 #define RK29_SDMMC_CARD_PRESENT 0
189 struct timer_list detect_timer;
190 struct timer_list request_timer; //the timer for INT_CMD_DONE
191 struct timer_list DTO_timer; //the timer for INT_DTO
192 struct mmc_command stopcmd;
194 /* flag for current bus settings */
197 unsigned int oldstatus;
198 unsigned int complete_done;
199 unsigned int retryfunc;
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_test_pending(host, event) \
214 test_bit(event, &host->pending_events)
215 #define rk29_sdmmc_set_completed(host, event) \
216 set_bit(event, &host->completed_events)
218 #define rk29_sdmmc_set_pending(host, event) \
219 set_bit(event, &host->pending_events)
221 static void rk29_sdmmc_start_error(struct rk29_sdmmc *host);
223 static void rk29_sdmmc_write(unsigned char __iomem *regbase, unsigned int regOff,unsigned int val)
225 __raw_writel(val,regbase + regOff);
228 static unsigned int rk29_sdmmc_read(unsigned char __iomem *regbase, unsigned int regOff)
230 return __raw_readl(regbase + regOff);
233 static int rk29_sdmmc_regs_printk(struct rk29_sdmmc *host)
235 printk("SDMMC_CTRL: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CTRL));
236 printk("SDMMC_PWREN: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_PWREN));
237 printk("SDMMC_CLKDIV: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKDIV));
238 printk("SDMMC_CLKSRC: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKSRC));
239 printk("SDMMC_CLKENA: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKENA));
240 printk("SDMMC_TMOUT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TMOUT));
241 printk("SDMMC_CTYPE: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CTYPE));
242 printk("SDMMC_BLKSIZ: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_BLKSIZ));
243 printk("SDMMC_BYTCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_BYTCNT));
244 printk("SDMMC_INTMASK:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_INTMASK));
245 printk("SDMMC_CMDARG: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CMDARG));
246 printk("SDMMC_CMD: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CMD));
247 printk("SDMMC_RESP0: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP0));
248 printk("SDMMC_RESP1: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP1));
249 printk("SDMMC_RESP2: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP2));
250 printk("SDMMC_RESP3: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP3));
251 printk("SDMMC_MINTSTS:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_MINTSTS));
252 printk("SDMMC_RINTSTS:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RINTSTS));
253 printk("SDMMC_STATUS: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_STATUS));
254 printk("SDMMC_FIFOTH: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_FIFOTH));
255 printk("SDMMC_CDETECT:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CDETECT));
256 printk("SDMMC_WRTPRT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_WRTPRT));
257 printk("SDMMC_TCBCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TCBCNT));
258 printk("SDMMC_TBBCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TBBCNT));
259 printk("SDMMC_DEBNCE: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_DEBNCE));
260 printk("=======printk %s-register end =========\n", host->dma_name);
265 #ifdef RK29_SDMMC_NOTIFY_REMOVE_INSERTION
266 ssize_t rk29_sdmmc_progress_store(struct kobject *kobj, struct kobj_attribute *attr,
267 const char *buf, size_t count)
269 struct rk29_sdmmc *host = NULL;
270 static u32 unmounting_times = 0;
271 static char oldbuf[64];
273 if( !strncmp(buf,"version" , strlen("version")))
275 printk("\n The driver SDMMC named 'rk29_sdmmc.c' is %s. ==xbw==\n", RK29_SDMMC_VERSION);
279 spin_lock(&host->lock);
281 //envalue the address of host base on input-parameter.
282 if( !strncmp(buf,"sd-" , strlen("sd-")) )
284 host = (struct rk29_sdmmc *)globalSDhost[RK29_CTRL_SDMMC_ID];
287 printk("%s..%d.. fail to call progress_store because the host is null. ==xbw==\n",__FUNCTION__,__LINE__);
288 goto progress_store_out;
291 else if( !strncmp(buf,"sdio1-" , strlen("sdio1-")) )
293 host = (struct rk29_sdmmc *)globalSDhost[RK29_CTRL_SDIO1_ID];
296 printk("%s..%d.. fail to call progress_store because the host-sdio1 is null. ==xbw==\n",__FUNCTION__,__LINE__);
297 goto progress_store_out;
300 else if( !strncmp(buf,"sdio2-" , strlen("sdio2-")) )
302 host = (struct rk29_sdmmc *)globalSDhost[RK29_CTRL_SDIO2_ID];
305 printk("%s..%d.. fail to call progress_store because the host-sdio2 is null. ==xbw==\n",__FUNCTION__,__LINE__);
306 goto progress_store_out;
311 printk("%s..%d.. You want to use sysfs for SDMMC but input-parameter is wrong.====xbw====\n",__FUNCTION__,__LINE__);
312 goto progress_store_out;//return count;
315 if(strncmp(buf,oldbuf , strlen(buf)))
317 printk(".%d.. MMC0 receive the message %s from VOLD.====xbw[%s]====\n", __LINE__, buf, host->dma_name);
322 * //deal with the message
323 * insert card state-change: No-Media ==> Pending ==> Idle-Unmounted ==> Checking ==>Mounted
324 * remove card state-change: Unmounting ==> Idle-Unmounted ==> No-Media
326 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
328 if(!strncmp(buf, "sd-Unmounting", strlen("sd-Unmounting")))
330 if(unmounting_times++%10 == 0)
332 printk(".%d.. MMC0 receive the message Unmounting(waitTimes=%d) from VOLD.====xbw[%s]====\n", \
333 __LINE__, unmounting_times, host->dma_name);
335 host->mmc->re_initialized_flags = 0;
336 mod_timer(&host->detect_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_REMOVAL_DELAY*2));
338 else if( !strncmp(buf, "sd-No-Media", strlen("sd-No-Media")))
340 printk(".%d.. MMC0 receive the message No-Media from VOLD. waitTimes=%d ====xbw[%s]====\n" ,\
341 __LINE__,unmounting_times, host->dma_name);
343 del_timer_sync(&host->detect_timer);
344 host->mmc->re_initialized_flags = 1;
345 unmounting_times = 0;
347 if(test_bit(RK29_SDMMC_CARD_PRESENT, &host->flags))
349 mmc_detect_change(host->mmc, 0);
352 else if( !strncmp(buf, "sd-Ready", strlen("sd-Ready")))
354 printk(".%d.. MMC0 receive the message Ready(ReInitFlag=%d) from VOLD. waitTimes=%d====xbw[%s]====\n" ,\
355 __LINE__, host->mmc->re_initialized_flags, unmounting_times, host->dma_name);
357 unmounting_times = 0;
358 host->mmc->re_initialized_flags = 1;
360 else if( !strncmp(buf,"sd-reset" , strlen("sd-reset")) )
362 printk(".%d.. Now manual reset for SDMMC0. ====xbw[%s]====\n",__LINE__, host->dma_name);
363 mmc_detect_change(host->mmc, 0);
365 else if( !strncmp(buf, "sd-regs", strlen("sd-regs")))
367 printk(".%d.. Now printk the register of SDMMC0. ====xbw[%s]====\n",__LINE__, host->dma_name);
368 rk29_sdmmc_regs_printk(host);
372 else if(RK29_CTRL_SDIO1_ID == host->pdev->id)
374 if( !strncmp(buf, "sdio1-regs", strlen("sdio1-regs")))
376 printk(".%d.. Now printk the register of SDMMC1. ====xbw[%s]====\n",__LINE__, host->dma_name);
377 rk29_sdmmc_regs_printk(host);
379 else if( !strncmp(buf,"sdio1-reset" , strlen("sdio1-reset")) )
381 printk(".%d.. Now manual reset for SDMMC1. ====xbw[%s]====\n",__LINE__, host->dma_name);
382 mmc_detect_change(host->mmc, 0);
385 else if(RK29_CTRL_SDIO2_ID == host->pdev->id)
387 if( !strncmp(buf, "sdio2-regs", strlen("sdio2-regs")))
389 printk(".%d.. Now printk the register of SDMMC2. ====xbw[%s]====\n",__LINE__, host->dma_name);
390 rk29_sdmmc_regs_printk(host);
392 else if( !strncmp(buf,"sdio2-reset" , strlen("sdio2-reset")) )
394 printk(".%d.. Now manual reset for SDMMC2. ====xbw[%s]====\n",__LINE__, host->dma_name);
395 mmc_detect_change(host->mmc, 0);
400 spin_unlock(&host->lock);
407 struct kobj_attribute mmc_reset_attrs =
413 .store = rk29_sdmmc_progress_store,
415 struct attribute *mmc_attrs[] =
417 &mmc_reset_attrs.attr,
421 static struct kobj_type mmc_kset_ktype = {
422 .sysfs_ops = &kobj_sysfs_ops,
423 .default_attrs = &mmc_attrs[0],
426 static int rk29_sdmmc_progress_add_attr( struct platform_device *pdev )
429 struct kobject *parentkobject;
430 struct kobject * me = kmalloc(sizeof(struct kobject) , GFP_KERNEL );
435 memset(me ,0,sizeof(struct kobject));
436 kobject_init( me , &mmc_kset_ktype );
438 parentkobject = &pdev->dev.kobj ;
439 result = kobject_add( me , parentkobject->parent->parent->parent,"%s", "sd-sdio" );
445 #if defined (CONFIG_DEBUG_FS)
446 static int rk29_sdmmc_regs_show(struct seq_file *s, void *v)
448 struct rk29_sdmmc *host = s->private;
450 seq_printf(s, "SDMMC_CTRL: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CTRL));
451 seq_printf(s, "SDMMC_PWREN: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_PWREN));
452 seq_printf(s, "SDMMC_CLKDIV: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKDIV));
453 seq_printf(s, "SDMMC_CLKSRC: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKSRC));
454 seq_printf(s, "SDMMC_CLKENA: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKENA));
455 seq_printf(s, "SDMMC_TMOUT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TMOUT));
456 seq_printf(s, "SDMMC_CTYPE: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CTYPE));
457 seq_printf(s, "SDMMC_BLKSIZ: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_BLKSIZ));
458 seq_printf(s, "SDMMC_BYTCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_BYTCNT));
459 seq_printf(s, "SDMMC_INTMASK:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_INTMASK));
460 seq_printf(s, "SDMMC_CMDARG: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CMDARG));
461 seq_printf(s, "SDMMC_CMD: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CMD));
462 seq_printf(s, "SDMMC_RESP0: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP0));
463 seq_printf(s, "SDMMC_RESP1: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP1));
464 seq_printf(s, "SDMMC_RESP2: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP2));
465 seq_printf(s, "SDMMC_RESP3: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP3));
466 seq_printf(s, "SDMMC_MINTSTS:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_MINTSTS));
467 seq_printf(s, "SDMMC_RINTSTS:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RINTSTS));
468 seq_printf(s, "SDMMC_STATUS: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_STATUS));
469 seq_printf(s, "SDMMC_FIFOTH: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_FIFOTH));
470 seq_printf(s, "SDMMC_CDETECT:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CDETECT));
471 seq_printf(s, "SDMMC_WRTPRT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_WRTPRT));
472 seq_printf(s, "SDMMC_TCBCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TCBCNT));
473 seq_printf(s, "SDMMC_TBBCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TBBCNT));
474 seq_printf(s, "SDMMC_DEBNCE: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_DEBNCE));
481 * The debugfs stuff below is mostly optimized away when
482 * CONFIG_DEBUG_FS is not set.
484 static int rk29_sdmmc_req_show(struct seq_file *s, void *v)
486 struct rk29_sdmmc *host = s->private;
487 struct mmc_request *mrq;
488 struct mmc_command *cmd;
489 struct mmc_command *stop;
490 struct mmc_data *data;
492 /* Make sure we get a consistent snapshot */
493 spin_lock(&host->lock);
503 "CMD%u(0x%x) flg %x rsp %x %x %x %x err %d\n",
504 cmd->opcode, cmd->arg, cmd->flags,
505 cmd->resp[0], cmd->resp[1], cmd->resp[2],
506 cmd->resp[2], cmd->error);
508 seq_printf(s, "DATA %u / %u * %u flg %x err %d\n",
509 data->bytes_xfered, data->blocks,
510 data->blksz, data->flags, data->error);
513 "CMD%u(0x%x) flg %x rsp %x %x %x %x err %d\n",
514 stop->opcode, stop->arg, stop->flags,
515 stop->resp[0], stop->resp[1], stop->resp[2],
516 stop->resp[2], stop->error);
519 spin_unlock(&host->lock);
524 static int rk29_sdmmc_req_open(struct inode *inode, struct file *file)
526 return single_open(file, rk29_sdmmc_req_show, inode->i_private);
529 static const struct file_operations rk29_sdmmc_req_fops = {
530 .owner = THIS_MODULE,
531 .open = rk29_sdmmc_req_open,
534 .release = single_release,
538 static int rk29_sdmmc_regs_open(struct inode *inode, struct file *file)
540 return single_open(file, rk29_sdmmc_regs_show, inode->i_private);
543 static const struct file_operations rk29_sdmmc_regs_fops = {
544 .owner = THIS_MODULE,
545 .open = rk29_sdmmc_regs_open,
548 .release = single_release,
551 static void rk29_sdmmc_init_debugfs(struct rk29_sdmmc *host)
553 struct mmc_host *mmc = host->mmc;
557 root = mmc->debugfs_root;
561 node = debugfs_create_file("regs", S_IRUSR, root, host,
562 &rk29_sdmmc_regs_fops);
568 node = debugfs_create_file("req", S_IRUSR, root, host, &rk29_sdmmc_req_fops);
572 node = debugfs_create_u32("state", S_IRUSR, root, (u32 *)&host->state);
576 node = debugfs_create_x32("pending_events", S_IRUSR, root,
577 (u32 *)&host->pending_events);
581 node = debugfs_create_x32("completed_events", S_IRUSR, root,
582 (u32 *)&host->completed_events);
589 dev_err(&mmc->class_dev, "failed to initialize debugfs for host\n");
594 static u32 rk29_sdmmc_prepare_command(struct mmc_command *cmd)
596 u32 cmdr = cmd->opcode;
600 case MMC_GO_IDLE_STATE:
601 cmdr |= (SDMMC_CMD_INIT | SDMMC_CMD_PRV_DAT_NO_WAIT);
604 case MMC_STOP_TRANSMISSION:
605 cmdr |= (SDMMC_CMD_STOP | SDMMC_CMD_PRV_DAT_NO_WAIT);
607 case MMC_SEND_STATUS:
608 case MMC_GO_INACTIVE_STATE:
609 cmdr |= SDMMC_CMD_PRV_DAT_NO_WAIT;
613 cmdr |= SDMMC_CMD_PRV_DAT_WAIT;
618 switch(mmc_resp_type(cmd))
622 // case MMC_RSP_R5: //R5,R6,R7 is same with the R1
626 cmdr |= (SDMMC_CMD_RESP_CRC | SDMMC_CMD_RESP_SHORT | SDMMC_CMD_RESP_EXP);
630 /* these response not contain crc7, so don't care crc error and response error */
631 cmdr |= (SDMMC_CMD_RESP_NO_CRC | SDMMC_CMD_RESP_SHORT | SDMMC_CMD_RESP_EXP);
634 cmdr |= (SDMMC_CMD_RESP_CRC | SDMMC_CMD_RESP_LONG | SDMMC_CMD_RESP_EXP);
637 cmdr |= (SDMMC_CMD_RESP_CRC_NOCARE | SDMMC_CMD_RESP_NOCARE | SDMMC_CMD_RESP_NO_EXP);
640 cmdr |= (SDMMC_CMD_RESP_CRC_NOCARE | SDMMC_CMD_RESP_NOCARE | SDMMC_CMD_RESP_NO_EXP);
648 static int rk29_sdmmc_start_command(struct rk29_sdmmc *host, struct mmc_command *cmd, u32 cmd_flags)
650 int tmo = RK29_SDMMC_SEND_START_TIMEOUT*2;
653 host->old_cmd = cmd->opcode;
655 rk29_sdmmc_write(host->regs, SDMMC_CMDARG, cmd->arg); // write to SDMMC_CMDARG register
656 rk29_sdmmc_write(host->regs, SDMMC_CMD, cmd_flags | SDMMC_CMD_START); // write to SDMMC_CMD register
659 xbwprintk(5, "\n%s..%d..************.start cmd=%d, arg=0x%x ********=====xbw[%s]=======\n", \
660 __FUNCTION__, __LINE__, cmd->opcode, cmd->arg, host->dma_name);
662 host->mmc->doneflag = 1;
664 /* wait until CIU accepts the command */
665 while (--tmo && (rk29_sdmmc_read(host->regs, SDMMC_CMD) & SDMMC_CMD_START))
667 udelay(2);//cpu_relax();
674 printk("%s..%d.. CMD_START timeout! CMD%d(arg=0x%x, retries=%d) ======xbw[%s]======\n",\
675 __FUNCTION__,__LINE__, cmd->opcode, cmd->arg, cmd->retries,host->dma_name);
678 cmd->error = -ETIMEDOUT;
679 host->mrq->cmd->error = -ETIMEDOUT;
680 del_timer_sync(&host->request_timer);
682 host->errorstep = 0x1;
683 return SDM_WAIT_FOR_CMDSTART_TIMEOUT;
689 static int rk29_sdmmc_reset_fifo(struct rk29_sdmmc *host)
693 int ret = SDM_SUCCESS;
695 value = rk29_sdmmc_read(host->regs, SDMMC_STATUS);
696 if (!(value & SDMMC_STAUTS_FIFO_EMPTY))
698 value = rk29_sdmmc_read(host->regs, SDMMC_CTRL);
699 value |= SDMMC_CTRL_FIFO_RESET;
700 rk29_sdmmc_write(host->regs, SDMMC_CTRL, value);
703 while (((value = rk29_sdmmc_read(host->regs, SDMMC_CTRL)) & (SDMMC_CTRL_FIFO_RESET)) && (timeout > 0))
710 host->errorstep = 0x2;
711 ret = SDM_WAIT_FOR_FIFORESET_TIMEOUT;
719 static int rk29_sdmmc_wait_unbusy(struct rk29_sdmmc *host)
721 int time_out = 250000; //max is 250ms
723 while (rk29_sdmmc_read(host->regs, SDMMC_STATUS) & SDMMC_STAUTS_DATA_BUSY)
730 host->errorstep = 0x3;
731 return SDM_BUSY_TIMEOUT;
738 static void send_stop_cmd(struct rk29_sdmmc *host)
740 mod_timer(&host->request_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_SEND_START_TIMEOUT+600));
742 host->stopcmd.opcode = MMC_STOP_TRANSMISSION;
743 host->stopcmd.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC;;
744 host->stopcmd.arg = 0;
745 host->stopcmd.data = NULL;
746 host->stopcmd.mrq = NULL;
747 host->stopcmd.retries = 0;
748 host->stopcmd.error = 0;
749 if(host->mrq && host->mrq->stop)
751 host->mrq->stop->error = 0;
754 host->cmdr = rk29_sdmmc_prepare_command(&host->stopcmd);
756 rk29_sdmmc_wait_unbusy(host);
758 rk29_sdmmc_start_command(host, &host->stopcmd, host->cmdr);
761 static void rk29_sdmmc_dma_cleanup(struct rk29_sdmmc *host)
765 dma_unmap_sg(&host->pdev->dev, host->data->sg, host->data->sg_len,
766 ((host->data->flags & MMC_DATA_WRITE)
767 ? DMA_TO_DEVICE : DMA_FROM_DEVICE));
771 static void rk29_sdmmc_stop_dma(struct rk29_sdmmc *host)
775 if(host->use_dma == 0)
778 if (host->dma_info.chn> 0)
780 rk29_sdmmc_dma_cleanup(host);
782 ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_STOP);
785 printk("%s..%d...rk29_dma_ctrl STOP error!===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
786 host->errorstep = 0x95;
790 ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_FLUSH);
793 printk("%s..%d...rk29_dma_ctrl FLUSH error!===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
794 host->errorstep = 0x96;
801 /* Data transfer was stopped by the interrupt handler */
802 rk29_sdmmc_set_pending(host, EVENT_DATA_COMPLETE);
806 static void rk29_sdmmc_control_host_dma(struct rk29_sdmmc *host, bool enable)
808 u32 value = rk29_sdmmc_read(host->regs, SDMMC_CTRL);
812 value |= SDMMC_CTRL_DMA_ENABLE;
816 value &= ~(SDMMC_CTRL_DMA_ENABLE);
819 rk29_sdmmc_write(host->regs, SDMMC_CTRL, value);
823 /* This function is called by the DMA driver from tasklet context. */
824 static void rk29_sdmmc_dma_complete(void *arg, int size, enum rk29_dma_buffresult result)
826 struct rk29_sdmmc *host = arg;
828 if(host->use_dma == 0)
831 host->intInfo.transLen = host->intInfo.desLen;
834 static int rk29_sdmmc_submit_data_dma(struct rk29_sdmmc *host, struct mmc_data *data)
836 struct scatterlist *sg;
837 unsigned int i,direction, sgDirection;
840 if(host->use_dma == 0)
842 printk("%s..%d...setup DMA fail!!!!!!. host->use_dma=0 ===xbw=[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
843 host->errorstep = 0x4;
846 /* If we don't have a channel, we can't do DMA */
847 if (host->dma_info.chn < 0)
849 printk("%s..%d...setup DMA fail!!!!!!!. dma_info.chn < 0 ===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
850 host->errorstep = 0x5;
856 for_each_sg(data->sg, sg, data->sg_len, i)
858 if (sg->offset & 3 || sg->length & 3)
860 printk("%s..%d...call for_each_sg() fail !!===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
861 host->errorstep = 0x7;
865 if (data->flags & MMC_DATA_READ)
867 direction = RK29_DMASRC_HW;
868 sgDirection = DMA_FROM_DEVICE;
872 direction = RK29_DMASRC_MEM;
873 sgDirection = DMA_TO_DEVICE;
876 ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_STOP);
879 printk("%s..%d...rk29_dma_ctrl stop error!===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
880 host->errorstep = 0x91;
884 ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_FLUSH);
887 printk("%s..%d...rk29_dma_ctrl flush error!===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
888 host->errorstep = 0x91;
893 ret = rk29_dma_devconfig(host->dma_info.chn, direction, (unsigned long )(host->dma_addr));
896 printk("%s..%d...call rk29_dma_devconfig() fail !!!!===xbw=[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
897 host->errorstep = 0x8;
901 dma_len = dma_map_sg(&host->pdev->dev, data->sg, data->sg_len, sgDirection);
902 for (i = 0; i < dma_len; i++)
904 ret = rk29_dma_enqueue(host->dma_info.chn, host, sg_dma_address(&data->sg[i]),sg_dma_len(&data->sg[i]));
907 printk("%s..%d...call rk29_dma_devconfig() fail !!!!===xbw=[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
908 host->errorstep = 0x93;
913 rk29_sdmmc_control_host_dma(host, TRUE);// enable dma
914 ret = rk29_dma_ctrl(host->dma_info.chn, RK29_DMAOP_START);
917 printk("%s..%d...rk29_dma_ctrl start error!===xbw[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
918 host->errorstep = 0x94;
926 static int rk29_sdmmc_prepare_write_data(struct rk29_sdmmc *host, struct mmc_data *data)
932 u32 count, *pBuf = (u32 *)host->pbuf;
934 output = SDM_SUCCESS;
935 dataLen = data->blocks*data->blksz;
937 host->dodma = 0; //DMA still no request;
939 //SDMMC controller request the data is multiple of 4.
940 count = (dataLen >> 2) + ((dataLen & 0x3) ? 1:0);
942 if (count <= FIFO_DEPTH)
944 for (i=0; i<count; i++)
946 rk29_sdmmc_write(host->regs, SDMMC_DATA, pBuf[i]);
951 host->intInfo.desLen = count;
952 host->intInfo.transLen = 0;
953 host->intInfo.pBuf = (u32 *)pBuf;
955 if(0)//(host->intInfo.desLen <= 512 )
962 xbwprintk(3, "%s..%d... trace data, ======xbw=[%s]====\n", __FUNCTION__, __LINE__, host->dma_name);
963 output = rk29_sdmmc_submit_data_dma(host, data);
968 printk("%s..%d... CMD%d setupDMA failure!!!!! ==xbw[%s]==\n", \
969 __FUNCTION__, __LINE__, host->cmd->opcode, host->dma_name);
971 host->errorstep = 0x81;
973 rk29_sdmmc_control_host_dma(host, FALSE);
989 static int rk29_sdmmc_prepare_read_data(struct rk29_sdmmc *host, struct mmc_data *data)
995 output = SDM_SUCCESS;
996 dataLen = data->blocks*data->blksz;
998 host->dodma = 0;//DMA still no request;
1000 //SDMMC controller request the data is multiple of 4.
1001 count = (dataLen >> 2) ;//+ ((dataLen & 0x3) ? 1:0);
1003 host->intInfo.desLen = (dataLen >> 2);
1004 host->intInfo.transLen = 0;
1005 host->intInfo.pBuf = (u32 *)host->pbuf;
1007 if (count > (RX_WMARK+1)) //datasheet error.actually, it can nont waken the interrupt when less and equal than RX_WMARK+1
1009 if(0) //(host->intInfo.desLen <= 512 )
1016 output = rk29_sdmmc_submit_data_dma(host, data);
1021 printk("%s..%d... CMD%d setupDMA failure!!! ==xbw[%s]==\n", \
1022 __FUNCTION__, __LINE__, host->cmd->opcode, host->dma_name);
1024 host->errorstep = 0x82;
1026 rk29_sdmmc_control_host_dma(host, FALSE);
1040 static int rk29_sdmmc_read_remain_data(struct rk29_sdmmc *host, u32 originalLen, void *pDataBuf)
1045 u32 *pBuf = (u32 *)pDataBuf;
1046 u8 *pByteBuf = (u8 *)pDataBuf;
1049 //SDMMC controller must be multiple of 32. so if transfer 13, then actuall we should write or read 16 byte.
1050 u32 count = (originalLen >> 2) + ((originalLen & 0x3) ? 1:0);
1052 if(1 == host->dodma)
1054 //when use DMA, there are remain data only when datalen/4 less than RX_WMARK+1 same as equaltion. or not multiple of 4
1055 if (!((value = rk29_sdmmc_read(host->regs, SDMMC_STATUS)) & SDMMC_STAUTS_FIFO_EMPTY))
1057 if (count <= (RX_WMARK+1))
1060 while ((i<(originalLen >> 2))&&(!(value & SDMMC_STAUTS_FIFO_EMPTY)))
1062 pBuf[i++] = rk29_sdmmc_read(host->regs, SDMMC_DATA);
1063 value = rk29_sdmmc_read(host->regs, SDMMC_STATUS);
1067 if (count > (originalLen >> 2))
1069 lastData = rk29_sdmmc_read(host->regs, SDMMC_DATA);
1071 //fill the 1 to 3 byte.
1072 for (i=0; i<(originalLen & 0x3); i++)
1074 pByteBuf[(originalLen & 0xFFFFFFFC) + i] = (u8)((lastData >> (i << 3)) & 0xFF); //default little-endian
1081 if (!((value = rk29_sdmmc_read(host->regs, SDMMC_STATUS)) & SDMMC_STAUTS_FIFO_EMPTY))
1083 while ( (host->intInfo.transLen < host->intInfo.desLen) && (!(value & SDMMC_STAUTS_FIFO_EMPTY)) )
1085 pBuf[host->intInfo.transLen++] = rk29_sdmmc_read(host->regs, SDMMC_DATA);
1086 value = rk29_sdmmc_read(host->regs, SDMMC_STATUS);
1089 if (count > (originalLen >> 2))
1091 lastData = rk29_sdmmc_read(host->regs, SDMMC_DATA);
1093 //fill the 1 to 3 byte.
1094 for (i=0; i<(originalLen & 0x3); i++)
1096 pByteBuf[(originalLen & 0xFFFFFFFC) + i] = (u8)((lastData >> (i << 3)) & 0xFF); //default little-endian
1106 static void rk29_sdmmc_do_pio_read(struct rk29_sdmmc *host)
1109 for (i=0; i<(RX_WMARK+1); i++)
1111 host->intInfo.pBuf[host->intInfo.transLen + i] = rk29_sdmmc_read(host->regs, SDMMC_DATA);
1113 host->intInfo.transLen += (RX_WMARK+1);
1116 static void rk29_sdmmc_do_pio_write(struct rk29_sdmmc *host)
1119 if ( (host->intInfo.desLen - host->intInfo.transLen) > (FIFO_DEPTH - TX_WMARK) )
1121 for (i=0; i<(FIFO_DEPTH - TX_WMARK); i++)
1123 rk29_sdmmc_write(host->regs, SDMMC_DATA, host->intInfo.pBuf[host->intInfo.transLen + i]);
1125 host->intInfo.transLen += (FIFO_DEPTH - TX_WMARK);
1129 for (i=0; i<(host->intInfo.desLen - host->intInfo.transLen); i++)
1131 rk29_sdmmc_write(host->regs, SDMMC_DATA, host->intInfo.pBuf[host->intInfo.transLen + i]);
1133 host->intInfo.transLen = host->intInfo.desLen;
1139 static void rk29_sdmmc_submit_data(struct rk29_sdmmc *host, struct mmc_data *data)
1147 host->cmd->data = data;
1149 data->bytes_xfered = 0;
1150 host->pbuf = (u32*)sg_virt(data->sg);
1152 if (data->flags & MMC_DATA_STREAM)
1154 host->cmdr |= SDMMC_CMD_STRM_MODE; //set stream mode
1158 host->cmdr |= SDMMC_CMD_BLOCK_MODE; //set block mode
1161 //set the blocks and blocksize
1162 rk29_sdmmc_write(host->regs, SDMMC_BYTCNT,data->blksz*data->blocks);
1163 rk29_sdmmc_write(host->regs, SDMMC_BLKSIZ,data->blksz);
1165 xbwprintk(3, "%s..%d... trace data, CMD%d, data->blksz=%d, data->blocks=%d ======xbw=[%s]====\n", \
1166 __FUNCTION__, __LINE__, host->cmd->opcode,data->blksz, data->blocks, host->dma_name);
1168 if (data->flags & MMC_DATA_WRITE)
1170 host->cmdr |= (SDMMC_CMD_DAT_WRITE | SDMMC_CMD_DAT_EXP);
1171 xbwprintk(3, "%s..%d... write data, len=%d ======xbw=[%s]====\n", \
1172 __FUNCTION__, __LINE__, data->blksz*data->blocks, host->dma_name);
1174 ret = rk29_sdmmc_prepare_write_data(host, data);
1178 host->cmdr |= (SDMMC_CMD_DAT_READ | SDMMC_CMD_DAT_EXP);
1179 xbwprintk(3, "%s..%d... read data len=%d ======xbw=[%s]====\n", \
1180 __FUNCTION__, __LINE__, data->blksz*data->blocks, host->dma_name);
1182 ret = rk29_sdmmc_prepare_read_data(host, data);
1188 rk29_sdmmc_write(host->regs, SDMMC_BLKSIZ, 0);
1189 rk29_sdmmc_write(host->regs, SDMMC_BYTCNT, 0);
1194 static int sdmmc_send_cmd_start(struct rk29_sdmmc *host, unsigned int cmd)
1198 rk29_sdmmc_write(host->regs, SDMMC_CMD, SDMMC_CMD_START | cmd);
1199 while (--tmo && readl(host->regs + SDMMC_CMD) & SDMMC_CMD_START)
1206 printk("%s.. %d set cmd(value=0x%x) register timeout error ! ====xbw[%s]====\n",\
1207 __FUNCTION__,__LINE__, cmd, host->dma_name);
1209 host->errorstep = 0x9;
1210 return SDM_START_CMD_FAIL;
1216 static int rk29_sdmmc_get_cd(struct mmc_host *mmc)
1218 struct rk29_sdmmc *host = mmc_priv(mmc);
1222 if(host->gpio_det == INVALID_GPIO)
1226 cdetect = rk29_sdmmc_read(host->regs, SDMMC_CDETECT);
1228 return (cdetect & SDMMC_CARD_DETECT_N)?0:1;
1232 /****************************************************************/
1233 //reset the SDMMC controller of the current host
1234 /****************************************************************/
1235 int rk29_sdmmc_reset_controller(struct rk29_sdmmc *host)
1240 rk29_sdmmc_write(host->regs, SDMMC_PWREN, POWER_ENABLE);
1242 /* reset SDMMC IP */
1243 //SDPAM_SDCClkEnable(host, TRUE);
1246 for(timeOut=0; timeOut<FIFO_DEPTH; timeOut++)
1248 if(rk29_sdmmc_read(host->regs, SDMMC_STATUS) & SDMMC_STAUTS_FIFO_EMPTY)
1251 value = rk29_sdmmc_read(host->regs, SDMMC_DATA);
1255 rk29_sdmmc_write(host->regs, SDMMC_CTRL,(SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET ));
1258 value = rk29_sdmmc_read(host->regs, SDMMC_CTRL);
1259 while (( value & (SDMMC_CTRL_FIFO_RESET | SDMMC_CTRL_RESET)) && (timeOut > 0))
1263 value = rk29_sdmmc_read(host->regs, SDMMC_CTRL);
1268 printk("%s..%s..%d.. reset controller fail!!! =====xbw[%s]=====\n",\
1269 __FILE__, __FUNCTION__,__LINE__, host->dma_name);
1271 host->errorstep = 0x0A;
1272 return SDM_WAIT_FOR_FIFORESET_TIMEOUT;
1275 /* FIFO threshold settings */
1276 rk29_sdmmc_write(host->regs, SDMMC_FIFOTH, (SD_MSIZE_16 | (RX_WMARK << RX_WMARK_SHIFT) | (TX_WMARK << TX_WMARK_SHIFT)));
1278 rk29_sdmmc_write(host->regs, SDMMC_CTYPE, SDMMC_CTYPE_1BIT);
1279 rk29_sdmmc_write(host->regs, SDMMC_CLKSRC, CLK_DIV_SRC_0);
1280 /* config debounce */
1281 host->bus_hz = clk_get_rate(host->clk);
1282 if((host->bus_hz > 52000000) || (host->bus_hz <= 0))
1284 printk("%s..%s..%d..****Error!!!!!! Bus clock %d hz is beyond the prescribed limits ====xbw[%s]===\n",\
1285 __FILE__, __FUNCTION__,__LINE__,host->bus_hz, host->dma_name);
1287 host->errorstep = 0x0B;
1288 return SDM_PARAM_ERROR;
1291 rk29_sdmmc_write(host->regs, SDMMC_DEBNCE, (DEBOUNCE_TIME*host->bus_hz)&0xFFFFFF);
1293 /* config interrupt */
1294 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS, 0xFFFFFFFF);
1298 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
1300 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEDMA);
1304 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEDMA | SDMMC_INT_SDIO);
1309 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
1311 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEIO);
1315 rk29_sdmmc_write(host->regs, SDMMC_INTMASK,RK29_SDMMC_INTMASK_USEIO | SDMMC_INT_SDIO);
1319 rk29_sdmmc_write(host->regs, SDMMC_PWREN, POWER_ENABLE);
1321 rk29_sdmmc_write(host->regs, SDMMC_CTRL,SDMMC_CTRL_INT_ENABLE); // enable mci interrupt
1329 //enable/disnable the clk.
1330 static int rk29_sdmmc_control_clock(struct rk29_sdmmc *host, bool enable)
1334 int ret = SDM_SUCCESS;
1336 //wait previous start to clear
1338 while (--tmo && (rk29_sdmmc_read(host->regs, SDMMC_CMD) & SDMMC_CMD_START))
1344 host->errorstep = 0x0C;
1345 ret = SDM_START_CMD_FAIL;
1349 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
1351 //SDMMC use low-power mode
1354 value = (SDMMC_CLKEN_LOW_PWR | SDMMC_CLKEN_ENABLE);
1358 value = (SDMMC_CLKEN_LOW_PWR | SDMMC_CLKEN_DISABLE);
1363 //SDIO-card use non-low-power mode
1366 value = (SDMMC_CLKEN_ENABLE);
1370 value = (SDMMC_CLKEN_DISABLE);
1374 rk29_sdmmc_write(host->regs, SDMMC_CLKENA, value);
1377 ret = sdmmc_send_cmd_start(host, SDMMC_CMD_UPD_CLK | SDMMC_CMD_PRV_DAT_WAIT);
1378 if(ret != SDM_SUCCESS)
1386 printk("\n%s....%d.. control clock fail!!! Enable=%d, ret=%d ===xbw[%s]====\n",\
1387 __FILE__,__LINE__,enable,ret, host->dma_name);
1394 //adjust the frequency.ie, to set the frequency division control
1395 int rk29_sdmmc_change_clk_div(struct rk29_sdmmc *host, u32 freqHz)
1399 int ret = SDM_SUCCESS;
1403 ret = SDM_PARAM_ERROR;
1407 ret = rk29_sdmmc_control_clock(host, FALSE);
1408 if (ret != SDM_SUCCESS)
1414 host->bus_hz = clk_get_rate(host->clk);
1415 if((host->bus_hz > 52000000) || (host->bus_hz <= 0))
1417 printk("%s..%s..%d..****Error!!!!!! Bus clock %d hz is beyond the prescribed limits ====xbw[%s]===\n",\
1418 __FILE__, __FUNCTION__,__LINE__,host->bus_hz, host->dma_name);
1420 host->errorstep = 0x0D;
1421 ret = SDM_PARAM_ERROR;
1425 //calculate the divider
1426 div = host->bus_hz/freqHz + ((( host->bus_hz%freqHz ) > 0) ? 1:0 );
1427 if( (div & 0x01) && (1 != div) )
1429 //It is sure that the value of div is even.
1435 host->clock = host->bus_hz/div;
1439 host->clock = host->bus_hz;
1443 //wait previous start to clear
1445 while (--tmo && (rk29_sdmmc_read(host->regs, SDMMC_CMD) & SDMMC_CMD_START))
1451 host->errorstep = 0x0E;
1452 ret = SDM_START_CMD_FAIL;
1456 /* set clock to desired speed */
1457 rk29_sdmmc_write(host->regs, SDMMC_CLKDIV, div);
1460 ret = sdmmc_send_cmd_start(host, SDMMC_CMD_UPD_CLK | SDMMC_CMD_PRV_DAT_WAIT);
1461 if(ret != SDM_SUCCESS)
1463 host->errorstep = 0x0E1;
1467 if(host->old_div != div)
1469 printk("%s..%d.. newDiv=%u, newCLK=%uKhz====xbw[%s]=====\n", \
1470 __FUNCTION__, __LINE__,div, host->clock/1000, host->dma_name);
1473 ret = rk29_sdmmc_control_clock(host, TRUE);
1474 if(ret != SDM_SUCCESS)
1478 host->old_div = div;
1484 printk("%s..%s..%d.. change division fail, ret=%d !!! ====xbw[%s]====\n",\
1485 __FILE__, __FUNCTION__,__LINE__,ret, host->dma_name);
1493 static int rk29_sdmmc_hw_init(struct rk29_sdmmc *host)
1495 /* reset controller */
1496 rk29_sdmmc_reset_controller(host);
1497 rk29_sdmmc_change_clk_div(host, FOD_FREQ);
1504 int rk29_sdmmc_set_iomux(struct rk29_sdmmc *host)
1507 switch (host->busWidth)
1510 rk29_mux_api_set(GPIO1D1_SDMMC0CMD_NAME, GPIO1H_SDMMC0_CMD);
1511 rk29_mux_api_set(GPIO1D0_SDMMC0CLKOUT_NAME, GPIO1H_SDMMC0_CLKOUT);
1512 rk29_mux_api_set(GPIO1D2_SDMMC0DATA0_NAME, GPIO1H_SDMMC0_DATA0);
1513 rk29_mux_api_set(GPIO1D3_SDMMC0DATA1_NAME, GPIO1H_SDMMC0_DATA1);
1514 rk29_mux_api_set(GPIO1D4_SDMMC0DATA2_NAME, GPIO1H_SDMMC0_DATA2);
1521 int rk29_sdmmc_set_buswidth(struct rk29_sdmmc *host)
1524 switch (host->ctype)
1526 case SDMMC_CTYPE_1BIT:
1527 case SDMMC_CTYPE_4BIT:
1529 case SDMMC_CTYPE_8BIT:
1530 return SDM_PARAM_ERROR; //Now, not support 8 bit width
1532 return SDM_PARAM_ERROR;
1534 rk29_sdmmc_set_iomux(host);
1536 /* Set the current bus width */
1537 rk29_sdmmc_write(host->regs, SDMMC_CTYPE, host->ctype);
1543 void rk29_sdmmc_set_frq(struct rk29_sdmmc *host)
1545 struct mmc_host *mmchost = platform_get_drvdata(host->pdev);
1546 struct mmc_card *card;
1547 struct mmc_ios *ios;
1548 unsigned int max_dtr;
1550 extern void mmc_set_clock(struct mmc_host *host, unsigned int hz);
1555 card = (struct mmc_card *)mmchost->card;
1556 ios = ( struct mmc_ios *)&mmchost->ios;
1561 if(MMC_POWER_ON == ios->power_mode)
1564 max_dtr = (unsigned int)-1;
1566 if (mmc_card_highspeed(card))
1568 if (max_dtr > card->ext_csd.hs_max_dtr)
1569 max_dtr = card->ext_csd.hs_max_dtr;
1572 else if (max_dtr > card->csd.max_dtr)
1574 if(MMC_TYPE_SD == card->type)
1576 max_dtr = (card->csd.max_dtr > SD_FPP_FREQ) ? SD_FPP_FREQ : (card->csd.max_dtr);
1580 max_dtr = (card->csd.max_dtr > MMC_FPP_FREQ) ? MMC_FPP_FREQ : (card->csd.max_dtr);
1584 xbwprintk(7, "%s..%d... call mmc_set_clock() set clk=%d ===xbw[%s]===\n", \
1585 __FUNCTION__, __LINE__, max_dtr, host->dma_name);
1588 mmc_set_clock(mmchost, max_dtr);
1592 static void rk29_sdmmc_dealwith_timeout(struct rk29_sdmmc *host)
1594 if(0 == host->mmc->doneflag)
1595 return; //not to generate error flag if the command has been over.
1607 host->cmd->error = -EIO;
1611 host->cmd->data->error = -EILSEQ;
1613 host->state = STATE_SENDING_CMD;
1618 case STATE_SENDING_CMD:
1619 host->cmd_status |= SDMMC_INT_RTO;
1620 host->cmd->error = -ETIME;
1621 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,(SDMMC_INT_CMD_DONE | SDMMC_INT_RTO)); // clear interrupt
1622 rk29_sdmmc_set_pending(host, EVENT_CMD_COMPLETE);
1623 tasklet_schedule(&host->tasklet);
1625 case STATE_DATA_BUSY:
1626 host->data_status |= (SDMMC_INT_DCRC|SDMMC_INT_EBE);
1627 host->cmd->data->error = -EILSEQ;
1628 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_DTO); // clear interrupt
1629 rk29_sdmmc_set_pending(host, EVENT_DATA_COMPLETE);
1630 tasklet_schedule(&host->tasklet);
1632 case STATE_SENDING_STOP:
1633 host->cmd_status |= SDMMC_INT_RTO;
1634 host->cmd->error = -ETIME;
1635 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,(SDMMC_INT_CMD_DONE | SDMMC_INT_RTO)); // clear interrupt
1636 rk29_sdmmc_set_pending(host, EVENT_CMD_COMPLETE);
1637 tasklet_schedule(&host->tasklet);
1643 static void rk29_sdmmc_INT_CMD_DONE_timeout(unsigned long host_data)
1645 struct rk29_sdmmc *host = (struct rk29_sdmmc *) host_data;
1647 if(STATE_SENDING_CMD == host->state)
1649 if(0==host->cmd->retries)
1651 printk("%s..%d... cmd=%d, INT_CMD_DONE timeout, errorStep=0x%x, host->state=%x ===xbw[%s]===\n",\
1652 __FUNCTION__, __LINE__,host->cmd->opcode, host->errorstep,host->state,host->dma_name);
1655 rk29_sdmmc_dealwith_timeout(host);
1661 static void rk29_sdmmc_INT_DTO_timeout(unsigned long host_data)
1663 struct rk29_sdmmc *host = (struct rk29_sdmmc *) host_data;
1666 if( (host->cmdr & SDMMC_CMD_DAT_EXP) && (STATE_DATA_BUSY == host->state))
1668 if(0==host->cmd->retries)
1670 printk("%s..%d...cmd=%d DTO_timeout,cmdr=0x%x, errorStep=0x%x, Hoststate=%x===xbw[%s]===\n", \
1671 __FUNCTION__, __LINE__,host->cmd->opcode,host->cmdr ,host->errorstep,host->state,host->dma_name);
1674 rk29_sdmmc_dealwith_timeout(host);
1680 //to excute a request
1681 static int rk29_sdmmc_start_request(struct mmc_host *mmc )
1683 struct rk29_sdmmc *host = mmc_priv(mmc);
1684 struct mmc_request *mrq;
1685 struct mmc_command *cmd;
1688 unsigned long iflags;
1690 spin_lock_irqsave(&host->lock, iflags);
1692 mrq = host->new_mrq;
1696 cmdr = rk29_sdmmc_prepare_command(cmd);
1700 /*clean FIFO if it is a new request*/
1701 if((RK29_CTRL_SDMMC_ID == host->pdev->id) && ( !(cmdr & SDMMC_CMD_STOP)))
1703 ret = rk29_sdmmc_reset_fifo(host);
1704 if(SDM_SUCCESS != ret)
1706 host->mrq = host->new_mrq;///
1707 cmd->error = -ENOMEDIUM;
1708 host->errorstep = 0x0F;
1710 goto start_request_Err;
1714 //check data-busy if the current command has the bit13 in command register.
1715 if( cmdr & SDMMC_CMD_PRV_DAT_WAIT )
1717 if(rk29_sdmmc_read(host->regs, SDMMC_STATUS) & SDMMC_STAUTS_DATA_BUSY)
1719 host->mrq = host->new_mrq;///
1720 cmd->error = -ETIMEDOUT;
1721 ret = SDM_BUSY_TIMEOUT;
1722 host->errorstep = 0x10;
1723 if(0 == cmd->retries)
1725 printk("%s..Error happen in CMD_PRV_DAT_WAIT. STATUS-reg=0x%x ===xbw[%s]===\n", \
1726 __FUNCTION__, rk29_sdmmc_read(host->regs, SDMMC_STATUS),host->dma_name);
1728 goto start_request_Err;
1732 host->state = STATE_SENDING_CMD;
1733 host->mrq = host->new_mrq;
1741 host->pending_events = 0;
1742 host->completed_events = 0;
1743 host->data_status = 0;
1746 host->errorstep = 0;
1748 host->complete_done = 0;
1749 host->retryfunc = 0;
1751 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
1753 //adjust the frequency division control of SDMMC0 every time.
1754 rk29_sdmmc_set_frq(host);
1758 //setting for the data
1759 rk29_sdmmc_submit_data(host, mrq->data);
1762 xbwprintk(7, "%s..%d... CMD%d begin to call rk29_sdmmc_start_command() ===xbw[%s]===\n", \
1763 __FUNCTION__, __LINE__ , cmd->opcode,host->dma_name);
1765 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
1767 mod_timer(&host->request_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_SEND_START_TIMEOUT+700));
1771 mod_timer(&host->request_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_SEND_START_TIMEOUT+500));
1775 ret = rk29_sdmmc_start_command(host, cmd, host->cmdr);
1776 if(SDM_SUCCESS != ret)
1778 cmd->error = -ETIMEDOUT;
1781 printk("%s..%d... start_command(CMD%d, arg=%x, retries=%d) fail! ret=%d =========xbw=[%s]===\n",\
1782 __FUNCTION__, __LINE__ , cmd->opcode,cmd->arg, cmd->retries,ret, host->dma_name);
1784 host->errorstep = 0x11;
1785 del_timer_sync(&host->request_timer);
1787 goto start_request_Err;
1790 xbwprintk(7, "%s..%d... CMD=%d, wait for INT_CMD_DONE, ret=%d , \n \
1791 host->state=0x%x, cmdINT=0x%x \n host->pendingEvent=0x%lu, host->completeEvents=0x%lu =========xbw=[%s]=====\n\n",\
1792 __FUNCTION__, __LINE__, host->cmd->opcode,ret, \
1793 host->state,host->cmd_status, host->pending_events,host->completed_events,host->dma_name);
1795 spin_unlock_irqrestore(&host->lock, iflags);
1799 rk29_sdmmc_start_error(host);
1801 if(0 == cmd->retries)
1803 printk("%s: CMD%d(arg=%x) fail to start request. err=%d, Errorstep=0x%x ===xbw[%s]==\n\n",\
1804 __FUNCTION__, cmd->opcode, cmd->arg,ret,host->errorstep,host->dma_name);
1807 host->state = STATE_IDLE; //modifyed by xbw at 2011-08-15
1809 if(host->mrq && host->mmc->doneflag)
1811 host->mmc->doneflag = 0;
1812 spin_unlock_irqrestore(&host->lock, iflags);
1814 mmc_request_done(host->mmc, host->mrq);
1818 spin_unlock_irqrestore(&host->lock, iflags);
1826 static void rk29_sdmmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
1828 unsigned long iflags;
1829 struct rk29_sdmmc *host = mmc_priv(mmc);
1831 spin_lock(&host->request_lock);
1833 spin_lock_irqsave(&host->lock, iflags);
1836 //set 1 to close the controller for Debug.
1837 if(RK29_CTRL_SDIO1_ID==host->pdev->id)//if(RK29_CTRL_SDMMC_ID==host->pdev->id)//
1839 mrq->cmd->error = -ENOMEDIUM;
1840 printk("%s..%d.. ==== The %s had been closed by myself for the experiment. ====xbw[%s]===\n",\
1841 __FUNCTION__, __LINE__, host->dma_name, host->dma_name);
1843 host->state = STATE_IDLE;
1844 spin_unlock_irqrestore(&host->lock, iflags);
1845 mmc_request_done(mmc, mrq);
1846 goto request_ext;//return;
1850 xbwprintk(3, "\n%s..%d..New cmd=%2d(arg=0x%8x)=== cardPresent=0x%lu, state=0x%x ==xbw[%s]==\n", \
1851 __FUNCTION__, __LINE__,mrq->cmd->opcode, mrq->cmd->arg,host->flags,host->state, host->dma_name);
1853 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
1855 if(!rk29_sdmmc_get_cd(mmc) || ((0==mmc->re_initialized_flags)&&(MMC_GO_IDLE_STATE != mrq->cmd->opcode)))
1857 mrq->cmd->error = -ENOMEDIUM;
1859 if((RK29_CTRL_SDMMC_ID == host->pdev->id)&&(0==mrq->cmd->retries))
1861 if(host->old_cmd != mrq->cmd->opcode)
1863 if( ((17==host->old_cmd)&&(18==mrq->cmd->opcode)) || ((18==host->old_cmd)&&(17==mrq->cmd->opcode)) ||\
1864 ((24==host->old_cmd)&&(25==mrq->cmd->opcode)) || ((25==host->old_cmd)&&(24==mrq->cmd->opcode)))
1866 host->old_cmd = mrq->cmd->opcode;
1867 if(host->error_times++ %RK29_ERROR_PRINTK_INTERVAL ==0)
1869 printk("%s: Refuse to run CMD%2d(arg=0x%8x) due to the removal of card. 1==xbw[%s]==\n", \
1870 __FUNCTION__, mrq->cmd->opcode, mrq->cmd->arg, host->dma_name);
1875 host->old_cmd = mrq->cmd->opcode;
1876 host->error_times = 0;
1877 printk("%s: Refuse to run CMD%2d(arg=0x%8x) due to the removal of card. 2==xbw[%s]==\n", \
1878 __FUNCTION__, mrq->cmd->opcode, mrq->cmd->arg, host->dma_name);
1883 if(host->error_times++ % (RK29_ERROR_PRINTK_INTERVAL*3) ==0)
1885 printk("%s: Refuse to run CMD%2d(arg=0x%8x) due to the removal of card. 3==xbw[%s]==\n", \
1886 __FUNCTION__, mrq->cmd->opcode, mrq->cmd->arg, host->dma_name);
1888 host->old_cmd = mrq->cmd->opcode;
1891 host->state = STATE_IDLE;
1892 spin_unlock_irqrestore(&host->lock, iflags);
1893 mmc_request_done(mmc, mrq);
1894 goto request_ext;//return;
1898 if(host->old_cmd != mrq->cmd->opcode)
1900 host->old_cmd = mrq->cmd->opcode;
1901 host->error_times = 0;
1907 host->old_cmd = mrq->cmd->opcode;
1908 host->error_times = 0;
1912 if(host->state != STATE_IDLE)
1914 printk("%s..%d..state Error! ,old_state=%d, OldCMD=%d ,NewCMD%2d,arg=0x%x ===xbw[%s]===\n", \
1915 __FUNCTION__, __LINE__, host->state, host->cmd->opcode,mrq->cmd->opcode,mrq->cmd->arg, host->dma_name);
1919 spin_unlock_irqrestore(&host->lock, iflags);
1921 host->new_mrq = mrq;
1922 rk29_sdmmc_start_request(mmc);
1925 if (host->state == STATE_IDLE)
1927 spin_unlock_irqrestore(&host->lock, iflags);
1929 host->new_mrq = mrq;
1930 rk29_sdmmc_start_request(mmc);
1934 #ifdef RK29_SDMMC_LIST_QUEUE
1936 printk("%s..%d...Danger! Danger! New request was added to queue. ===xbw[%s]===\n", \
1937 __FUNCTION__, __LINE__,host->dma_name);
1938 list_add_tail(&host->queue_node, &host->queue);
1942 printk("%s..%d..state Error! ,old_state=%d, OldCMD=%d ,NewCMD%2d,arg=0x%x ===xbw[%s]===\n", \
1943 __FUNCTION__, __LINE__, host->state, host->cmd->opcode,mrq->cmd->opcode,mrq->cmd->arg, host->dma_name);
1945 mrq->cmd->error = -ENOMEDIUM;
1947 spin_unlock_irqrestore(&host->lock, iflags);
1948 mmc_request_done(mmc, mrq);
1950 goto request_ext;//return;
1957 spin_unlock(&host->request_lock);
1962 static void rk29_sdmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
1966 unsigned long iflags;
1967 struct rk29_sdmmc *host = mmc_priv(mmc);
1969 spin_lock_irqsave(&host->lock, iflags);
1972 * Waiting SDIO controller to be IDLE.
1974 while (timeout-- > 0)
1976 value = rk29_sdmmc_read(host->regs, SDMMC_STATUS);
1977 if ((value & SDMMC_STAUTS_DATA_BUSY) == 0 &&(value & SDMMC_CMD_FSM_MASK) == SDMMC_CMD_FSM_IDLE)
1986 printk("%s..%d...Waiting for SDMMC%d controller to be IDLE timeout.==xbw[%s]===\n", \
1987 __FUNCTION__, __LINE__, host->pdev->id, host->dma_name);
1992 //if(host->bus_mode != ios->power_mode)
1994 switch (ios->power_mode)
1997 rk29_sdmmc_write(host->regs, SDMMC_PWREN, POWER_ENABLE);
1999 //reset the controller if it is SDMMC0
2000 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
2002 xbwprintk(7, "%s..%d..POWER_UP, call reset_controller, initialized_flags=%d ====xbw[%s]=====\n",\
2003 __FUNCTION__, __LINE__, host->mmc->re_initialized_flags,host->dma_name);
2007 rk29_sdmmc_hw_init(host);
2013 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
2015 rk29_sdmmc_control_clock(host, FALSE);
2016 rk29_sdmmc_write(host->regs, SDMMC_PWREN, POWER_DISABLE);
2018 if(5 == host->bus_mode)
2021 xbwprintk(7, "%s..%d..Fisrt powerOFF, call reset_controller ======xbw[%s]====\n", \
2022 __FUNCTION__, __LINE__,host->dma_name);
2024 rk29_sdmmc_reset_controller(host);
2034 host->bus_mode = ios->power_mode;
2039 if(host->ctype != ios->bus_width)
2041 switch (ios->bus_width)
2043 case MMC_BUS_WIDTH_1:
2044 host->ctype = SDMMC_CTYPE_1BIT;
2046 case MMC_BUS_WIDTH_4:
2047 host->ctype = SDMMC_CTYPE_4BIT;
2049 case MMC_BUS_WIDTH_8:
2050 host->ctype = SDMMC_CTYPE_8BIT;
2057 rk29_sdmmc_set_buswidth(host);
2061 if (ios->clock && (ios->clock != host->clock))
2064 * Use mirror of ios->clock to prevent race with mmc
2065 * core ios update when finding the minimum.
2067 //host->clock = ios->clock;
2068 rk29_sdmmc_change_clk_div(host, ios->clock);
2072 spin_unlock_irqrestore(&host->lock, iflags);
2075 static int rk29_sdmmc_get_ro(struct mmc_host *mmc)
2077 struct rk29_sdmmc *host = mmc_priv(mmc);
2078 u32 wrtprt = rk29_sdmmc_read(host->regs, SDMMC_WRTPRT);
2080 return (wrtprt & SDMMC_WRITE_PROTECT)?1:0;
2084 static void rk29_sdmmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
2087 unsigned long flags;
2088 struct rk29_sdmmc *host = mmc_priv(mmc);
2090 spin_lock_irqsave(&host->lock, flags);
2091 intmask = rk29_sdmmc_read(host->regs, SDMMC_INTMASK);
2094 rk29_sdmmc_write(host->regs, SDMMC_INTMASK, intmask | SDMMC_INT_SDIO);
2096 rk29_sdmmc_write(host->regs, SDMMC_INTMASK, intmask & ~SDMMC_INT_SDIO);
2097 spin_unlock_irqrestore(&host->lock, flags);
2100 static void rk29_sdmmc_init_card(struct mmc_host *mmc, struct mmc_card *card)
2102 card->quirks = MMC_QUIRK_BLKSZ_FOR_BYTE_MODE;
2107 static const struct mmc_host_ops rk29_sdmmc_ops[] = {
2109 .request = rk29_sdmmc_request,
2110 .set_ios = rk29_sdmmc_set_ios,
2111 .get_ro = rk29_sdmmc_get_ro,
2112 .get_cd = rk29_sdmmc_get_cd,
2115 .request = rk29_sdmmc_request,
2116 .set_ios = rk29_sdmmc_set_ios,
2117 .enable_sdio_irq = rk29_sdmmc_enable_sdio_irq,
2118 .init_card = rk29_sdmmc_init_card,
2122 static void rk29_sdmmc_request_end(struct rk29_sdmmc *host, struct mmc_command *cmd)
2125 int output=SDM_SUCCESS;
2127 xbwprintk(7, "%s..%d... cmd=%d, host->state=0x%x,\n pendingEvent=0x%lu, completeEvents=0x%lu ====xbw=[%s]====\n\n",\
2128 __FUNCTION__, __LINE__,cmd->opcode,host->state, host->pending_events,host->completed_events,host->dma_name);
2130 del_timer_sync(&host->DTO_timer);
2132 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
2134 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS, 0xFFFFFFFF); //added by xbw at 2011-08-15
2140 rk29_sdmmc_stop_dma(host);
2141 rk29_sdmmc_control_host_dma(host, FALSE);
2147 goto exit;//It need not to wait-for-busy if the CMD-ERROR happen.
2153 status = host->data_status;
2155 if(host->cmdr & SDMMC_CMD_DAT_WRITE)
2157 if(status & (SDMMC_INT_DCRC | SDMMC_INT_EBE))
2159 cmd->data->error = -EILSEQ;;//mrq->data->error = -EILSEQ;
2160 output = SDM_DATA_CRC_ERROR;
2161 host->errorstep = 0x16;
2165 output = rk29_sdmmc_wait_unbusy(host);
2166 if(SDM_SUCCESS != output)
2168 host->errorstep = 0x17;
2169 cmd->data->error = -ETIMEDOUT;
2172 host->data->bytes_xfered = host->data->blocks * host->data->blksz;
2177 if( status & SDMMC_INT_SBE)
2179 cmd->data->error = -EIO;
2180 host->errorstep = 0x18;
2181 output = SDM_START_BIT_ERROR;
2183 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.
2185 cmd->data->error = -EILSEQ;
2186 host->errorstep = 0x19;
2187 output = SDM_END_BIT_ERROR;
2189 else if(status & SDMMC_INT_DRTO)
2191 cmd->data->error = -ETIMEDOUT;
2192 host->errorstep = 0x1A;
2193 output = SDM_DATA_READ_TIMEOUT;
2195 else if(status & SDMMC_INT_DCRC)
2197 host->errorstep = 0x1B;
2198 cmd->data->error = -EILSEQ;
2199 output = SDM_DATA_CRC_ERROR;
2203 output = rk29_sdmmc_read_remain_data(host, (host->data->blocks * host->data->blksz), host->pbuf);
2204 if(SDM_SUCCESS == output)
2206 host->data->bytes_xfered = host->data->blocks * host->data->blksz;
2212 if(SDM_SUCCESS == output)
2214 if ((mmc_resp_type(cmd) == MMC_RSP_R1B) || (MMC_STOP_TRANSMISSION == cmd->opcode))
2216 output = rk29_sdmmc_wait_unbusy(host);
2217 if(SDM_SUCCESS != output)
2219 cmd->error = -ETIMEDOUT;
2220 host->mrq->cmd->error = -ETIMEDOUT;
2221 host->errorstep = 0x1C;
2222 printk("%s..%d... CMD12 wait busy timeout!!!!! ====xbw=[%s]====\n", \
2223 __FUNCTION__, __LINE__, host->dma_name);
2229 if(cmd->data && cmd->data->error)
2231 if( (!cmd->error) && (0==cmd->retries) && (host->error_times++%RK29_ERROR_PRINTK_INTERVAL == 0))
2233 printk("%s..%d......CMD=%d error!!!, arg=%x, errorTimes=%d, errorStep=0x%x ! ====xbw[%s]====\n",\
2234 __FUNCTION__, __LINE__, cmd->opcode, cmd->arg, host->error_times,host->errorstep, host->dma_name);
2236 cmd->error = -ENODATA;
2241 #ifdef RK29_SDMMC_LIST_QUEUE
2242 if (!list_empty(&host->queue))
2244 printk("%s..%d.. Danger!Danger!. continue the next request in the queue. ====xbw[%s]====\n",\
2245 __FUNCTION__, __LINE__, host->dma_name);
2247 host = list_entry(host->queue.next,
2248 struct rk29_sdmmc, queue_node);
2249 list_del(&host->queue_node);
2250 host->state = STATE_SENDING_CMD;
2251 rk29_sdmmc_start_request(host->mmc);
2255 dev_vdbg(&host->pdev->dev, "list empty\n");
2256 host->state = STATE_IDLE;
2259 dev_vdbg(&host->pdev->dev, "list empty\n");
2260 host->state = STATE_IDLE;
2265 static int rk29_sdmmc_command_complete(struct rk29_sdmmc *host,
2266 struct mmc_command *cmd)
2268 u32 value, status = host->cmd_status;
2269 int timeout, output= SDM_SUCCESS;
2271 xbwprintk(7, "%s..%d. cmd=%d, host->state=0x%x, cmdINT=0x%x\n,pendingEvent=0x%lu,completeEvents=0x%lu ===xbw[%s]===\n\n",\
2272 __FUNCTION__, __LINE__,cmd->opcode,host->state,status, host->pending_events,host->completed_events,host->dma_name);
2275 del_timer_sync(&host->request_timer);
2277 host->cmd_status = 0;
2279 if((RK29_CTRL_SDMMC_ID == host->pdev->id) && (host->cmdr & SDMMC_CMD_STOP))
2281 output = rk29_sdmmc_reset_fifo(host);
2282 if (SDM_SUCCESS != output)
2284 printk("%s..%d......reset fifo fail! CMD%d(arg=0x%x, Retries=%d) =======xbw[%s]=====\n",__FUNCTION__, __LINE__, \
2285 cmd->opcode, cmd->arg, cmd->retries,host->dma_name);
2287 cmd->error = -ETIMEDOUT;
2288 host->mrq->cmd->error = cmd->error;
2290 host->errorstep = 0x1C;
2295 if(status & SDMMC_INT_RTO)
2297 cmd->error = -ENOMEM;
2298 host->mrq->cmd->error = cmd->error;
2299 output = SDM_BUSY_TIMEOUT;
2301 //rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_RTO);
2302 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,0xFFFFFFFF); //modifyed by xbw at 2011-08-15
2304 if(host->use_dma)//if(host->dodma)
2308 rk29_sdmmc_stop_dma(host);
2309 rk29_sdmmc_control_host_dma(host, FALSE);
2313 value = rk29_sdmmc_read(host->regs, SDMMC_CTRL);
2314 value |= SDMMC_CTRL_FIFO_RESET;
2315 rk29_sdmmc_write(host->regs, SDMMC_CTRL, value);
2318 while (((value = rk29_sdmmc_read(host->regs, SDMMC_CTRL)) & (SDMMC_CTRL_FIFO_RESET)) && (timeout > 0))
2326 host->errorstep = 0x1D;
2327 printk("%s..%d......reset CTRL fail! CMD%d(arg=0x%x, Retries=%d) ===xbw[%s]===\n",\
2328 __FUNCTION__, __LINE__, cmd->opcode, cmd->arg, cmd->retries,host->dma_name);
2336 if(cmd->flags & MMC_RSP_PRESENT)
2338 if(cmd->flags & MMC_RSP_136)
2340 cmd->resp[3] = rk29_sdmmc_read(host->regs, SDMMC_RESP0);
2341 cmd->resp[2] = rk29_sdmmc_read(host->regs, SDMMC_RESP1);
2342 cmd->resp[1] = rk29_sdmmc_read(host->regs, SDMMC_RESP2);
2343 cmd->resp[0] = rk29_sdmmc_read(host->regs, SDMMC_RESP3);
2347 cmd->resp[0] = rk29_sdmmc_read(host->regs, SDMMC_RESP0);
2353 del_timer_sync(&host->DTO_timer);
2356 if((0==cmd->retries) && (host->error_times++%RK29_ERROR_PRINTK_INTERVAL == 0) && (12 != cmd->opcode))
2358 if( ((RK29_CTRL_SDMMC_ID==host->pdev->id)&&(MMC_SLEEP_AWAKE!=cmd->opcode)) ||
2359 ((RK29_CTRL_SDMMC_ID!=host->pdev->id)&&(MMC_SEND_EXT_CSD!=cmd->opcode)) )
2361 printk("%s..%d...CMD%d(arg=0x%x), hoststate=%d, errorTimes=%d, errorStep=0x%x ! ===xbw[%s]===\n",\
2362 __FUNCTION__, __LINE__, cmd->opcode, cmd->arg, host->state,host->error_times,host->errorstep, host->dma_name);
2367 del_timer_sync(&host->request_timer);
2373 del_timer_sync(&host->request_timer);
2374 del_timer_sync(&host->DTO_timer);
2376 if((0==cmd->retries) && (host->error_times++%RK29_ERROR_PRINTK_INTERVAL == 0))
2378 printk("%s..%d....command_complete(CMD=%d, arg=%x) error=%d =======xbw[%s]=====\n",\
2379 __FUNCTION__, __LINE__, host->cmd->opcode,host->cmd->arg, output, host->dma_name);
2387 static void rk29_sdmmc_start_error(struct rk29_sdmmc *host)
2389 host->cmd->error = -EIO;
2390 host->mrq->cmd->error = -EIO;
2391 host->cmd_status = SDMMC_INT_RTO;
2393 del_timer_sync(&host->request_timer);
2395 rk29_sdmmc_command_complete(host, host->mrq->cmd);
2396 rk29_sdmmc_request_end(host, host->mrq->cmd);
2400 static void rk29_sdmmc_tasklet_func(unsigned long priv)
2402 struct rk29_sdmmc *host = (struct rk29_sdmmc *)priv;
2403 struct mmc_data *data = host->cmd->data;
2404 enum rk29_sdmmc_state state = host->state;
2405 int pending_flag, stopflag;
2407 spin_lock(&host->lock);
2409 state = host->state;
2419 xbwprintk(7, "%s..%d.. prev_state= STATE_IDLE ====xbw[%s]====\n", \
2420 __FUNCTION__, __LINE__, host->dma_name);
2424 case STATE_SENDING_CMD:
2426 xbwprintk(7, "%s..%d.. prev_state= STATE_SENDING_CMD, pendingEvernt=0x%lu ====xbw[%s]====\n",\
2427 __FUNCTION__, __LINE__,host->completed_events, host->dma_name);
2429 if (!rk29_sdmmc_test_and_clear_pending(host, EVENT_CMD_COMPLETE))
2432 del_timer_sync(&host->request_timer); //delete the timer for INT_COME_DONE
2434 rk29_sdmmc_set_completed(host, EVENT_CMD_COMPLETE);
2435 rk29_sdmmc_command_complete(host, host->cmd);
2440 rk29_sdmmc_request_end(host, host->cmd);
2442 xbwprintk(7, "%s..%d.. CMD%d call mmc_request_done()====xbw[%s]====\n", \
2443 __FUNCTION__, __LINE__,host->cmd->opcode,host->dma_name);
2445 host->complete_done = 1;
2446 break;//goto unlock;
2449 if(host->cmd->error)
2451 del_timer_sync(&host->DTO_timer); //delete the timer for INT_DTO
2455 xbwprintk(7, "%s..%d.. cmderr, so call send_stop_cmd() ====xbw[%s]====\n", \
2456 __FUNCTION__, __LINE__, host->dma_name);
2459 state = STATE_SENDING_CMD;//STATE_SENDING_STOP;
2460 send_stop_cmd(host);
2462 stopflag = 1; //Moidfyed by xbw at 2011-09-08
2467 rk29_sdmmc_set_pending(host, EVENT_DATA_COMPLETE);
2471 state = STATE_DATA_BUSY;
2475 case STATE_DATA_BUSY:
2477 xbwprintk(7, "%s..%d.. prev_state= STATE_DATA_BUSY, pendingEvernt=0x%lu ====xbw[%s]====\n", \
2478 __FUNCTION__, __LINE__,host->pending_events, host->dma_name);
2480 if (!rk29_sdmmc_test_and_clear_pending(host, EVENT_DATA_COMPLETE))
2483 rk29_sdmmc_set_completed(host, EVENT_DATA_COMPLETE);
2484 del_timer_sync(&host->DTO_timer); //delete the timer for INT_DTO
2486 rk29_sdmmc_request_end(host, host->cmd);
2488 if (data && !data->stop)
2490 xbwprintk(7, "%s..%d.. CMD%d call mmc_request_done()====xbw[%s]====\n", \
2491 __FUNCTION__, __LINE__,host->cmd->opcode,host->dma_name);
2493 if(!( (MMC_READ_SINGLE_BLOCK == host->cmd->opcode)&&( -EIO == data->error))) //deal with START_BIT_ERROR
2495 host->complete_done = 2;
2496 break;//goto unlock;
2501 xbwprintk(7, "%s..%d.. after DATA_COMPLETE, so call send_stop_cmd() ====xbw[%s]====\n", \
2502 __FUNCTION__, __LINE__, host->dma_name);
2505 state = STATE_SENDING_CMD;
2506 send_stop_cmd(host);
2508 stopflag = 1; //Moidfyed by xbw at 2011-09-08
2514 case STATE_SENDING_STOP:
2516 xbwprintk(7, "%s..%d.. prev_state= STATE_SENDING_STOP, pendingEvernt=0x%lu ====xbw[%s]====\n", \
2517 __FUNCTION__, __LINE__, host->pending_events, host->dma_name);
2519 if (!rk29_sdmmc_test_and_clear_pending(host, EVENT_CMD_COMPLETE))
2522 rk29_sdmmc_command_complete(host, host->cmd);
2523 del_timer_sync(&host->request_timer); //delete the timer for INT_CMD_DONE int CMD12
2524 rk29_sdmmc_request_end(host, host->cmd);
2526 host->complete_done = 3;
2527 break;//goto unlock;
2532 pending_flag = (host->complete_done > 0) && (host->retryfunc<50) \
2533 && (rk29_sdmmc_test_pending(host, EVENT_CMD_COMPLETE)|| rk29_sdmmc_test_pending(host, EVENT_DATA_COMPLETE) );
2536 xbwprintk(7, "%s..%d... cmd=%d(arg=0x%x),completedone=%d, retrycount=%d, doneflag=%d, \n \
2537 host->state=0x%x, switchstate=%x, \n \
2538 pendingEvent=0x%lu, completeEvents=0x%lu, \n \
2539 mrqCMD=%d, arg=0x%x \n ====xbw[%s]====\n",\
2541 __FUNCTION__, __LINE__,host->cmd->opcode, host->cmd->arg, host->complete_done,\
2542 host->retryfunc, host->mmc->doneflag,host->state, state, \
2543 host->pending_events,host->completed_events,\
2544 host->mrq->cmd->opcode, host->mrq->cmd->arg, host->dma_name);
2549 } while(pending_flag && ++host->retryfunc); //while(0);
2553 state = STATE_SENDING_CMD;
2554 send_stop_cmd(host); //Moidfyed by xbw at 2011-09-08
2557 host->state = state;
2560 if(0==host->complete_done)
2562 spin_unlock(&host->lock);
2566 host->state = STATE_IDLE;
2568 if(host->mrq && host->mmc->doneflag)
2570 host->mmc->doneflag = 0;
2571 spin_unlock(&host->lock);
2573 mmc_request_done(host->mmc, host->mrq);
2577 spin_unlock(&host->lock);
2582 static inline void rk29_sdmmc_cmd_interrupt(struct rk29_sdmmc *host, u32 status)
2586 if(!host->cmd_status)
2587 host->cmd_status = status;
2589 if((MMC_STOP_TRANSMISSION != host->cmd->opcode) && (host->cmdr & SDMMC_CMD_DAT_EXP))
2592 multi = rk29_sdmmc_read(host->regs, SDMMC_BYTCNT)/unit;
2593 multi += ((rk29_sdmmc_read(host->regs, SDMMC_BYTCNT)%unit) ? 1 :0 );
2594 multi = (multi>0) ? multi : 1;
2595 mod_timer(&host->DTO_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_WAIT_DTO_INTERNVAL*multi));
2599 rk29_sdmmc_set_pending(host, EVENT_CMD_COMPLETE);
2600 tasklet_schedule(&host->tasklet);
2603 static irqreturn_t rk29_sdmmc_interrupt(int irq, void *dev_id)
2605 struct rk29_sdmmc *host = dev_id;
2606 u32 status, pending;
2609 unsigned long iflags;
2611 spin_lock_irqsave(&host->lock, iflags);
2613 status = rk29_sdmmc_read(host->regs, SDMMC_RINTSTS);
2614 pending = rk29_sdmmc_read(host->regs, SDMMC_MINTSTS);// read only mask reg
2621 if(pending & SDMMC_INT_CD)
2623 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS, SDMMC_INT_CD); // clear sd detect int
2624 present = rk29_sdmmc_get_cd(host->mmc);
2625 present_old = test_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
2627 if(present != present_old)
2629 printk("\n******************\n%s:INT_CD=0x%x,INT-En=%d,hostState=%d, present Old=%d ==> New=%d ==xbw[%s]==\n",\
2630 __FUNCTION__, pending, host->mmc->re_initialized_flags, host->state, present_old, present, host->dma_name);
2632 rk28_send_wakeup_key(); //wake up backlight
2633 host->error_times = 0;
2636 rk29_sdmmc_dealwith_timeout(host);
2641 set_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
2643 if(host->mmc->re_initialized_flags)
2645 mod_timer(&host->detect_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_REMOVAL_DELAY));
2649 mod_timer(&host->detect_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_REMOVAL_DELAY*2));
2654 clear_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
2655 host->mmc->re_initialized_flags = 0;
2657 mmc_detect_change(host->mmc, 200);
2667 if (pending & SDMMC_INT_CMD_DONE) {
2669 xbwprintk(6, "%s..%d.. CMD%d INT_CMD_DONE INT=0x%x ====xbw[%s]====\n", \
2670 __FUNCTION__, __LINE__, host->cmd->opcode,pending, host->dma_name);
2672 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_CMD_DONE); // clear interrupt
2674 rk29_sdmmc_cmd_interrupt(host, status);
2679 if(pending & SDMMC_INT_SDIO)
2681 xbwprintk(7, "%s..%d.. INT_SDIO INT=0x%x ====xbw[%s]====\n", \
2682 __FUNCTION__, __LINE__, pending, host->dma_name);
2684 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_SDIO);
2685 mmc_signal_sdio_irq(host->mmc);
2691 if(pending & SDMMC_INT_RTO)
2693 xbwprintk(7, "%s..%d.. CMD%d CMD_ERROR_FLAGS INT=0x%x ====xbw[%s]====\n", \
2694 __FUNCTION__, __LINE__, host->cmd->opcode,pending, host->dma_name);
2696 //rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_RTO);
2697 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,0xFFFFFFFF); //Modifyed by xbw at 2011-08-15
2698 host->cmd_status = status;
2700 rk29_sdmmc_set_pending(host, EVENT_CMD_COMPLETE);
2702 if(!(pending & SDMMC_INT_CMD_DONE))
2703 tasklet_schedule(&host->tasklet);
2709 if(pending & SDMMC_INT_HLE)
2711 printk("%s: Error due to hardware locked. Please check your hardware. INT=0x%x, CMD%d(arg=0x%x, retries=%d)==xbw[%s]==\n",\
2712 __FUNCTION__, pending,host->cmd->opcode, host->cmd->arg, host->cmd->retries, host->dma_name);
2714 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_HLE);
2719 if(pending & SDMMC_INT_DTO)
2721 xbwprintk(7, "%s..%d.. CMD%d INT_DTO INT=0x%x ==xbw[%s]==\n", \
2722 __FUNCTION__, __LINE__,host->cmd->opcode,pending, host->dma_name);
2724 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_DTO);
2725 del_timer_sync(&host->DTO_timer); //delete the timer for INT_DTO
2727 if (!host->data_status)
2728 host->data_status = status;
2732 rk29_sdmmc_set_pending(host, EVENT_DATA_COMPLETE);
2733 tasklet_schedule(&host->tasklet);
2738 if (pending & SDMMC_INT_FRUN)
2740 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", \
2741 __FUNCTION__, pending, host->cmd->opcode, host->cmd->arg, host->cmd->retries,host->dma_name);
2743 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_FRUN);
2747 if (pending & SDMMC_INT_RXDR)
2749 xbwprintk(6, "%s..%d.. SDMMC_INT_RXDR INT=0x%x ====xbw[%s]====\n", \
2750 __FUNCTION__, __LINE__, pending, host->dma_name);
2752 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_RXDR); // clear interrupt
2753 rk29_sdmmc_do_pio_read(host);
2756 if (pending & SDMMC_INT_TXDR)
2758 xbwprintk(6, "%s..%d.. SDMMC_INT_TXDR INT=0x%x ====xbw[%s]====\n", \
2759 __FUNCTION__, __LINE__, pending, host->dma_name);
2761 rk29_sdmmc_do_pio_write(host);
2763 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_TXDR); // clear interrupt
2768 spin_unlock_irqrestore(&host->lock, iflags);
2774 * MMC card detect thread, kicked off from detect interrupt, 1 timer
2777 static void rk29_sdmmc_detect_change(unsigned long data)
2779 struct rk29_sdmmc *host = (struct rk29_sdmmc *)data;
2786 if(RK29_CTRL_SDMMC_ID == host->pdev->id)
2788 host->mmc->re_initialized_flags =1;
2791 mmc_detect_change(host->mmc, 0);
2795 static void rk29_sdmmc1_check_status(unsigned long data)
2797 struct rk29_sdmmc *host = (struct rk29_sdmmc *)data;
2798 struct rk29_sdmmc_platform_data *pdata = host->pdev->dev.platform_data;
2799 unsigned int status;
2801 status = pdata->status(mmc_dev(host->mmc));
2803 if (status ^ host->oldstatus)
2805 pr_info("%s: slot status change detected(%d-%d)\n",mmc_hostname(host->mmc), host->oldstatus, status);
2808 set_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
2809 mod_timer(&host->detect_timer, jiffies + msecs_to_jiffies(200));
2813 clear_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
2814 rk29_sdmmc_detect_change((unsigned long)host);
2818 host->oldstatus = status;
2821 static void rk29_sdmmc1_status_notify_cb(int card_present, void *dev_id)
2823 struct rk29_sdmmc *host = dev_id;
2824 printk(KERN_INFO "%s, card_present %d\n", mmc_hostname(host->mmc), card_present);
2825 rk29_sdmmc1_check_status((unsigned long)host);
2829 static int rk29_sdmmc_probe(struct platform_device *pdev)
2831 struct mmc_host *mmc;
2832 struct rk29_sdmmc *host;
2833 struct resource *regs;
2834 struct rk29_sdmmc_platform_data *pdata;
2838 /* must have platform data */
2839 pdata = pdev->dev.platform_data;
2841 dev_err(&pdev->dev, "Platform data missing\n");
2843 host->errorstep = 0x87;
2847 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2850 host->errorstep = 0x88;
2854 mmc = mmc_alloc_host(sizeof(struct rk29_sdmmc), &pdev->dev);
2857 host->errorstep = 0x89;
2862 host = mmc_priv(mmc);
2866 host->ctype = 0; // set default 1 bit mode
2867 host->errorstep = 0;
2869 host->old_cmd = 100;
2871 host->old_div = 0xFF;
2872 host->error_times = 0;
2873 host->state = STATE_IDLE;
2874 host->complete_done = 0;
2875 host->retryfunc = 0;
2877 host->new_mrq = NULL;
2880 host->gpio_det = pdata->detect_irq;
2886 spin_lock_init(&host->lock);
2887 spin_lock_init(&host->request_lock);
2889 #ifdef RK29_SDMMC_LIST_QUEUE
2890 INIT_LIST_HEAD(&host->queue);
2893 host->clk = clk_get(&pdev->dev, "mmc");
2895 #if RK29_SDMMC_DEFAULT_SDIO_FREQ
2896 clk_set_rate(host->clk,SDHC_FPP_FREQ);
2898 if(RK29_CTRL_SDMMC_ID== host->pdev->id)
2899 clk_set_rate(host->clk,SDHC_FPP_FREQ);
2901 clk_set_rate(host->clk,RK29_MAX_SDIO_FREQ);
2905 clk_enable(host->clk);
2906 clk_enable(clk_get(&pdev->dev, "hclk_mmc"));
2909 host->regs = ioremap(regs->start, regs->end - regs->start + 1);
2912 host->errorstep = 0x8A;
2916 mmc->ops = &rk29_sdmmc_ops[pdev->id];
2917 mmc->f_min = FOD_FREQ;
2919 #if RK29_SDMMC_DEFAULT_SDIO_FREQ
2920 mmc->f_max = SDHC_FPP_FREQ;
2922 if(RK29_CTRL_SDMMC_ID== host->pdev->id)
2924 mmc->f_max = SDHC_FPP_FREQ;
2928 mmc->f_max = RK29_MAX_SDIO_FREQ;//SDHC_FPP_FREQ / 2;
2932 //mmc->ocr_avail = pdata->host_ocr_avail;
2933 mmc->ocr_avail = MMC_VDD_27_28|MMC_VDD_28_29|MMC_VDD_29_30|MMC_VDD_30_31
2934 | 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
2935 mmc->caps = pdata->host_caps;
2936 mmc->re_initialized_flags = 1;
2942 mmc->max_phys_segs = 64;
2943 mmc->max_hw_segs = 64;
2946 * Block size can be up to 2048 bytes, but must be a power of two.
2948 mmc->max_blk_size = 4095;
2951 * No limit on the number of blocks transferred.
2953 mmc->max_blk_count = 4096;
2956 * Since we only have a 16-bit data length register, we must
2957 * ensure that we don't exceed 2^16-1 bytes in a single request.
2959 mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count; //8M bytes(2K*4K)
2962 * Set the maximum segment size. Since we aren't doing DMA
2963 * (yet) we are only limited by the data length register.
2965 mmc->max_seg_size = mmc->max_req_size;
2967 tasklet_init(&host->tasklet, rk29_sdmmc_tasklet_func, (unsigned long)host);
2969 /* Create card detect handler thread */
2970 setup_timer(&host->detect_timer, rk29_sdmmc_detect_change,(unsigned long)host);
2971 setup_timer(&host->request_timer,rk29_sdmmc_INT_CMD_DONE_timeout,(unsigned long)host);
2972 setup_timer(&host->DTO_timer,rk29_sdmmc_INT_DTO_timeout,(unsigned long)host);
2974 irq = platform_get_irq(pdev, 0);
2977 host->errorstep = 0x8B;
2982 memcpy(host->dma_name, pdata->dma_name, 8);
2983 host->use_dma = pdata->use_dma;
2988 host->dma_info = rk29_sdmmc_dma_infos[host->pdev->id];
2989 ret = rk29_dma_request(host->dma_info.chn, &(host->dma_info.client), NULL);
2992 printk("%s..%d...rk29_dma_request error=%d.===xbw[%s]====\n", \
2993 __FUNCTION__, __LINE__,ret, host->dma_name);
2994 host->errorstep = 0x97;
2998 #if 0 //deal with the old API of DMA-module
2999 ret = rk29_dma_config(host->dma_info.chn, 4);
3000 #else //deal with the new API of DMA-module
3001 if(RK29_CTRL_SDMMC_ID== host->pdev->id)
3003 ret = rk29_dma_config(host->dma_info.chn, 4, 16);
3007 ret = rk29_dma_config(host->dma_info.chn, 4, 1);
3012 printk("%s..%d.. rk29_dma_config error=%d ====xbw[%s]====\n", \
3013 __FUNCTION__, __LINE__, ret, host->dma_name);
3014 host->errorstep = 0x98;
3018 ret = rk29_dma_set_buffdone_fn(host->dma_info.chn, rk29_sdmmc_dma_complete);
3021 printk("%s..%d.. dma_set_buffdone_fn error=%d ====xbw[%s]====\n", \
3022 __FUNCTION__, __LINE__, ret, host->dma_name);
3023 host->errorstep = 0x99;
3027 host->dma_addr = regs->start + SDMMC_DATA;
3030 rk29_sdmmc_hw_init(host);
3032 ret = request_irq(irq, rk29_sdmmc_interrupt, 0, dev_name(&pdev->dev), host);
3036 printk("%s..%d.. request_irq error=%d ====xbw[%s]====\n", \
3037 __FUNCTION__, __LINE__, ret, host->dma_name);
3038 host->errorstep = 0x8C;
3042 /* setup sdmmc1 wifi card detect change */
3043 if (pdata->register_status_notify) {
3044 pdata->register_status_notify(rk29_sdmmc1_status_notify_cb, host);
3047 if(RK29_CTRL_SDMMC_ID== host->pdev->id)
3049 clear_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
3053 /* sdmmc1 wifi card slot status initially */
3054 if (pdata->status) {
3055 host->oldstatus = pdata->status(mmc_dev(host->mmc));
3056 if (host->oldstatus) {
3057 set_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
3059 clear_bit(RK29_SDMMC_CARD_PRESENT, &host->flags);
3064 platform_set_drvdata(pdev, mmc);
3068 #ifdef RK29_SDMMC_NOTIFY_REMOVE_INSERTION
3070 globalSDhost[pdev->id] = (struct rk29_sdmmc *)host;
3071 if(RK29_CTRL_SDMMC_ID== host->pdev->id)
3073 rk29_sdmmc_progress_add_attr(pdev);
3077 #if defined (CONFIG_DEBUG_FS)
3078 rk29_sdmmc_init_debugfs(host);
3081 printk(".Line%d..The End of SDMMC-probe %s ===xbw[%s]===\n\n", __LINE__, RK29_SDMMC_VERSION,host->dma_name);
3088 rk29_dma_free(host->dma_info.chn, &host->dma_info.client);
3092 iounmap(host->regs);
3104 static int __exit rk29_sdmmc_remove(struct platform_device *pdev)
3107 struct mmc_host *mmc = platform_get_drvdata(pdev);
3108 struct rk29_sdmmc *host;
3109 struct resource *regs;
3114 host = mmc_priv(mmc);
3117 rk29_sdmmc_control_clock(host, 0);
3119 /* Shutdown detect IRQ and kill detect thread */
3120 del_timer_sync(&host->detect_timer);
3121 del_timer_sync(&host->request_timer);
3122 del_timer_sync(&host->DTO_timer);
3124 tasklet_disable(&host->tasklet);
3125 free_irq(platform_get_irq(pdev, 0), host);
3128 rk29_dma_free(host->dma_info.chn, &host->dma_info.client);
3131 mmc_remove_host(mmc);
3133 iounmap(host->regs);
3135 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
3136 release_mem_region(regs->start,resource_size(regs));
3139 platform_set_drvdata(pdev, NULL);
3147 static irqreturn_t det_keys_isr(int irq, void *dev_id)
3149 struct rk29_sdmmc *host = dev_id;
3150 dev_info(&host->pdev->dev, "sd det_gpio changed(%s), send wakeup key!\n",
3151 gpio_get_value(RK29_PIN2_PA2)?"removed":"insert");
3152 rk29_sdmmc_detect_change((unsigned long)dev_id);
3157 static int rk29_sdmmc_sdcard_suspend(struct rk29_sdmmc *host)
3160 rk29_mux_api_set(GPIO2A2_SDMMC0DETECTN_NAME, GPIO2L_GPIO2A2);
3161 gpio_request(RK29_PIN2_PA2, "sd_detect");
3162 gpio_direction_input(RK29_PIN2_PA2);
3164 host->gpio_irq = gpio_to_irq(RK29_PIN2_PA2);
3165 ret = request_irq(host->gpio_irq, det_keys_isr,
3166 (gpio_get_value(RK29_PIN2_PA2))?IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING,
3170 enable_irq_wake(host->gpio_irq);
3174 static void rk29_sdmmc_sdcard_resume(struct rk29_sdmmc *host)
3176 disable_irq_wake(host->gpio_irq);
3177 free_irq(host->gpio_irq,host);
3178 gpio_free(RK29_PIN2_PA2);
3179 rk29_mux_api_set(GPIO2A2_SDMMC0DETECTN_NAME, GPIO2L_SDMMC0_DETECT_N);
3184 static int rk29_sdmmc_suspend(struct platform_device *pdev, pm_message_t state)
3186 struct mmc_host *mmc = platform_get_drvdata(pdev);
3187 struct rk29_sdmmc *host = mmc_priv(mmc);
3190 if(host && host->pdev && (RK29_CTRL_SDMMC_ID == host->pdev->id)) //only the SDMMC0 have suspend-resume; noted by xbw
3193 ret = mmc_suspend_host(mmc, state);
3195 if(rk29_sdmmc_sdcard_suspend(host) < 0)
3196 dev_info(&host->pdev->dev, "rk29_sdmmc_sdcard_suspend error\n");
3202 static int rk29_sdmmc_resume(struct platform_device *pdev)
3204 struct mmc_host *mmc = platform_get_drvdata(pdev);
3205 struct rk29_sdmmc *host = mmc_priv(mmc);
3208 if(host && host->pdev && (RK29_CTRL_SDMMC_ID == host->pdev->id)) //only the SDMMC0 have suspend-resume; noted by xbw
3212 rk29_sdmmc_sdcard_resume(host);
3213 ret = mmc_resume_host(mmc);
3220 #define rk29_sdmmc_suspend NULL
3221 #define rk29_sdmmc_resume NULL
3224 static struct platform_driver rk29_sdmmc_driver = {
3225 .suspend = rk29_sdmmc_suspend,
3226 .resume = rk29_sdmmc_resume,
3227 .remove = __exit_p(rk29_sdmmc_remove),
3229 .name = "rk29_sdmmc",
3233 static int __init rk29_sdmmc_init(void)
3235 return platform_driver_probe(&rk29_sdmmc_driver, rk29_sdmmc_probe);
3238 static void __exit rk29_sdmmc_exit(void)
3240 platform_driver_unregister(&rk29_sdmmc_driver);
3243 module_init(rk29_sdmmc_init);
3244 module_exit(rk29_sdmmc_exit);
3246 MODULE_DESCRIPTION("Rk29 Multimedia Card Interface driver");
3247 MODULE_AUTHOR("xbw@rock-chips.com");
3248 MODULE_LICENSE("GPL v2");