mod old sdmmc drivers
[firefly-linux-kernel-4.4.55.git] / drivers / mmc / host / rk29_sdmmc_old.c
1 /* drivers/mmc/host/rk29_sdmmc.c
2  *
3  * Copyright (C) 2010 ROCKCHIP, Inc.
4  *
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.
8  *
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.
13  * mount -t debugfs debugfs /data/debugfs;cat /data/debugfs/mmc0/status
14  * echo 't' >/proc/sysrq-trigger
15  * echo 19 >/sys/module/wakelock/parameters/debug_mask
16  * vdc volume uevent on
17  */
18  
19 #include <linux/blkdev.h>
20 #include <linux/clk.h>
21 #include <linux/debugfs.h>
22 #include <linux/device.h>
23 #include <linux/dma-mapping.h>
24 #include <linux/err.h>
25 #include <linux/init.h>
26 #include <linux/interrupt.h>
27 #include <linux/ioport.h>
28 #include <linux/module.h>
29 #include <linux/platform_device.h>
30 #include <linux/scatterlist.h>
31 #include <linux/seq_file.h>
32 #include <linux/stat.h>
33 #include <linux/delay.h>
34 #include <linux/irq.h>
35 #include <linux/mmc/host.h>
36 #include <linux/mmc/mmc.h>
37 #include <linux/mmc/card.h>
38 #include <linux/earlysuspend.h>
39
40 #include <mach/board.h>
41 #include <mach/rk29_iomap.h>
42 #include <mach/gpio.h>
43 #include <mach/iomux.h>
44
45 #include <asm/dma.h>
46 #include <mach/rk29-dma-pl330.h>
47 #include <asm/scatterlist.h>
48
49 #include "rk2818-sdmmc.h"
50
51 #define RK29_SDMMC_DATA_ERROR_FLAGS     (SDMMC_INT_DRTO | SDMMC_INT_DCRC | SDMMC_INT_HTO | SDMMC_INT_SBE | SDMMC_INT_EBE | SDMMC_INT_FRUN)
52 #define RK29_SDMMC_CMD_ERROR_FLAGS      (SDMMC_INT_RTO | SDMMC_INT_RCRC | SDMMC_INT_RE | SDMMC_INT_HLE)
53 #define RK29_SDMMC_ERROR_FLAGS          (RK29_SDMMC_DATA_ERROR_FLAGS | RK29_SDMMC_CMD_ERROR_FLAGS | SDMMC_INT_HLE)
54
55 #define RK29_SDMMC_TMO_COUNT            10000
56
57 #define RK29_SDCARD_CLK                         50  //48Mhz
58 #define RK29_SDIO_CLK                           50      //36Mhz
59
60 enum {
61         EVENT_CMD_COMPLETE = 0,
62         EVENT_XFER_COMPLETE,
63         EVENT_DATA_COMPLETE,
64         EVENT_DATA_ERROR,
65         EVENT_XFER_ERROR
66 };
67 enum {
68         MRQ_REQUEST_START = 0,
69         MRQ_INT_CMD_DONE,  //1
70         MRQ_INT_CMD_ERR,  //2
71         MRQ_INT_DATA_DONE,  //3
72         MRQ_INT_DATA_ERR,  //4
73         MRQ_INT_CD,  //5
74         MRQ_INT_SDIO,  //6
75         MRQ_HAS_DATA,  //7
76         MRQ_HAS_STOP,  //8
77         MRQ_CMD_START_TMO,  //9
78         MRQ_CMD_START_DONE,  //10
79         MRQ_STOP_START_TMO,  //11
80         MRQ_STOP_START_DONE,  //12
81         MRQ_CLK_START_TMO,  //13
82         MRQ_CLK_START_DONE,  //14
83         MRQ_RESET_CTRL_ERR,  //15
84         MRQ_RESET_CTRL_DONE,  //16
85         MRQ_DMA_SET_ERR,  //17
86         MRQ_START_DMA,  //18
87         MRQ_STOP_DMA,  //19
88         MRQ_DMA_DONE,  //20
89         MRQ_REQUEST_DONE,  //21
90 };
91 enum rk29_sdmmc_state {
92         STATE_IDLE = 0,
93         STATE_SENDING_CMD,
94         STATE_SENDING_DATA,
95         STATE_DATA_BUSY,
96         STATE_SENDING_STOP,
97         STATE_DATA_ERROR,
98 };
99 #define rk29_sdmmc_test_and_clear_pending(host, event)          \
100         test_and_clear_bit(event, &host->pending_events)
101 #define rk29_sdmmc_set_completed(host, event)                   \
102                 set_bit(event, &host->completed_events)
103 #define rk29_sdmmc_set_pending(host, event)                             \
104         set_bit(event, &host->pending_events)
105 #define rk29_sdmmc_set_mrq_status(host, status)                         \
106                 set_bit(status, &host->mrq_status)
107 #define rk29_sdmmc_test_mrq_status(host, status)                                \
108                         test_bit(status, &host->mrq_status)
109
110 struct rk29_sdmmc_dma_info {
111         enum dma_ch chn;
112         char *name;
113         struct rk29_dma_client client;
114 };
115 static struct rk29_sdmmc_dma_info dma_infos[] = {
116         {
117                 .chn = DMACH_SDMMC,
118                 .client = {
119                         .name = "rk29-dma-sdmmc0",
120                 }
121         },
122         {
123                 .chn = DMACH_SDIO,
124                 .client = {
125                         .name = "rk29-dma-sdio1",
126                 }
127         },
128 };
129 static int rk29_sdmmc_is_sdio(struct rk29_sdmmc_platform_data *pdata)
130 {
131         if(strncmp(pdata->dma_name, "sdio", strlen("sdio")) == 0)
132                 return 1;
133         else
134                 return 0;
135 }
136
137 struct rk29_sdmmc {
138         struct device                           *dev;
139         
140         int                                                     is_sdio;
141         int                                                     is_init;
142         int                                                     gpio_det;
143         int                                                     gpio_irq;
144         int                                                     irq;
145
146         int                                                     enable_sd_warkup;
147
148         unsigned int                            clock;
149         unsigned int                            ios_clock;
150         unsigned int                            div;
151         spinlock_t                                      lock;
152         unsigned int                            stop_cmdr;
153         unsigned int                            cmd_intsts;
154         unsigned int                            data_intsts;
155         unsigned long                           pending_events;
156         unsigned long                           completed_events;
157         unsigned long                           mrq_status;
158         unsigned long                           old_mrq_status;
159
160         unsigned int                            bus_hz;
161         
162
163         void __iomem                            *regs;
164
165         struct mmc_host                         *mmc;
166         struct delayed_work                     work;
167         struct rk29_sdmmc_dma_info      dma_info;
168         struct tasklet_struct           tasklet;
169         struct mmc_request                      *mrq;
170         struct mmc_command                      *cmd;
171         struct clk                                      *clk;
172         struct timer_list                       monitor_timer;
173
174         enum rk29_sdmmc_state           state;
175         dma_addr_t                              dma_addr;
176         
177         int (*get_wifi_cd)(struct device *);
178 #ifdef CONFIG_HAS_EARLYSUSPEND
179         struct early_suspend            early_suspend;
180 #endif
181 };
182 struct rk29_sdmmc *sdio_host = NULL;
183 static void rk29_sdmmc_write(unsigned char  __iomem     *regbase, unsigned int regOff,unsigned int val)
184 {
185         __raw_writel(val,regbase + regOff);
186 }
187
188 static unsigned int rk29_sdmmc_read(unsigned char  __iomem      *regbase, unsigned int regOff)
189 {
190         return __raw_readl(regbase + regOff);
191 }
192
193
194 #if defined (CONFIG_DEBUG_FS)
195 /*
196  * The debugfs stuff below is mostly optimized away when
197  * CONFIG_DEBUG_FS is not set.
198  */
199 static int rk29_sdmmc_req_show(struct seq_file *s, void *v)
200 {
201         struct rk29_sdmmc       *host = s->private;
202         struct mmc_request      *mrq;
203         struct mmc_command      *cmd;
204         struct mmc_command      *stop;
205         struct mmc_data         *data;
206
207         /* Make sure we get a consistent snapshot */
208         spin_lock(&host->lock);
209         mrq = host->mrq;
210
211         if (mrq) {
212                 cmd = mrq->cmd;
213                 data = mrq->data;
214                 stop = mrq->stop;
215
216                 if (cmd)
217                         seq_printf(s,
218                                 "CMD%u(0x%x) flg %x rsp %x %x %x %x err %d\n",
219                                 cmd->opcode, cmd->arg, cmd->flags,
220                                 cmd->resp[0], cmd->resp[1], cmd->resp[2],
221                                 cmd->resp[2], cmd->error);
222                 if (data)
223                         seq_printf(s, "DATA %u / %u * %u flg %x err %d\n",
224                                 data->bytes_xfered, data->blocks,
225                                 data->blksz, data->flags, data->error);
226                 if (stop)
227                         seq_printf(s,
228                                 "CMD%u(0x%x) flg %x rsp %x %x %x %x err %d\n",
229                                 stop->opcode, stop->arg, stop->flags,
230                                 stop->resp[0], stop->resp[1], stop->resp[2],
231                                 stop->resp[2], stop->error);
232         }
233
234         spin_unlock(&host->lock);
235
236         return 0;
237 }
238
239 static int rk29_sdmmc_regs_show(struct seq_file *s, void *v)
240 {
241         struct rk29_sdmmc       *host = s->private;
242
243         seq_printf(s, "SDMMC_CTRL:   \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CTRL));
244         seq_printf(s, "SDMMC_PWREN:  \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_PWREN));
245         seq_printf(s, "SDMMC_CLKDIV: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKDIV));
246         seq_printf(s, "SDMMC_CLKSRC: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKSRC));
247         seq_printf(s, "SDMMC_CLKENA: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKENA));
248         seq_printf(s, "SDMMC_TMOUT:  \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TMOUT));
249         seq_printf(s, "SDMMC_CTYPE:  \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CTYPE));
250         seq_printf(s, "SDMMC_BLKSIZ: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_BLKSIZ));
251         seq_printf(s, "SDMMC_BYTCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_BYTCNT));
252         seq_printf(s, "SDMMC_INTMASK:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_INTMASK));
253         seq_printf(s, "SDMMC_CMDARG: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CMDARG));
254         seq_printf(s, "SDMMC_CMD:    \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CMD));
255         seq_printf(s, "SDMMC_RESP0:  \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP0));
256         seq_printf(s, "SDMMC_RESP1:  \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP1));
257         seq_printf(s, "SDMMC_RESP2:  \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP2));
258         seq_printf(s, "SDMMC_RESP3:  \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP3));
259         seq_printf(s, "SDMMC_MINTSTS:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_MINTSTS));
260         seq_printf(s, "SDMMC_RINTSTS:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RINTSTS));
261         seq_printf(s, "SDMMC_STATUS: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_STATUS));
262         seq_printf(s, "SDMMC_FIFOTH: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_FIFOTH));
263         seq_printf(s, "SDMMC_CDETECT:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CDETECT));
264         seq_printf(s, "SDMMC_WRTPRT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_WRTPRT));
265         seq_printf(s, "SDMMC_TCBCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TCBCNT));
266         seq_printf(s, "SDMMC_TBBCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TBBCNT));
267         seq_printf(s, "SDMMC_DEBNCE: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_DEBNCE));
268
269         return 0;
270 }
271
272 static int rk29_sdmmc_status_show(struct seq_file *s, void *v)
273 {
274         struct rk29_sdmmc       *host = s->private;
275
276         seq_printf(s, "state:   \t\t0x%08x\n", host->state);
277         seq_printf(s, "pending_events:   \t0x%08lx\n", host->pending_events);
278         seq_printf(s, "completed_events:   \t0x%08lx\n", host->completed_events);
279         seq_printf(s, "mrq_status:   \t\t0x%08lx\n", host->mrq_status);
280         seq_printf(s, "old_mrq_status:   \t0x%08lx\n", host->old_mrq_status);
281
282         return 0;
283 }
284
285
286 static int rk29_sdmmc_req_open(struct inode *inode, struct file *file)
287 {
288         return single_open(file, rk29_sdmmc_req_show, inode->i_private);
289 }
290
291 static const struct file_operations rk29_sdmmc_req_fops = {
292         .owner          = THIS_MODULE,
293         .open           = rk29_sdmmc_req_open,
294         .read           = seq_read,
295         .llseek         = seq_lseek,
296         .release        = single_release,
297 };
298
299 static int rk29_sdmmc_regs_open(struct inode *inode, struct file *file)
300 {
301         return single_open(file, rk29_sdmmc_regs_show, inode->i_private);
302 }
303
304 static const struct file_operations rk29_sdmmc_regs_fops = {
305         .owner          = THIS_MODULE,
306         .open           = rk29_sdmmc_regs_open,
307         .read           = seq_read,
308         .llseek         = seq_lseek,
309         .release        = single_release,
310 };
311 static int rk29_sdmmc_status_open(struct inode *inode, struct file *file)
312 {
313         return single_open(file, rk29_sdmmc_status_show, inode->i_private);
314 }
315
316 static const struct file_operations rk29_sdmmc_status_fops = {
317         .owner          = THIS_MODULE,
318         .open           = rk29_sdmmc_status_open,
319         .read           = seq_read,
320         .llseek         = seq_lseek,
321         .release        = single_release,
322 };
323
324 static void rk29_sdmmc_init_debugfs(struct rk29_sdmmc *host)
325 {
326         struct mmc_host         *mmc = host->mmc;
327         struct dentry           *root;
328         struct dentry           *node;
329
330         root = mmc->debugfs_root;
331         if (!root)
332                 return;
333
334         node = debugfs_create_file("regs", S_IRUSR, root, host,&rk29_sdmmc_regs_fops);
335         if (!node)
336                 goto err;
337
338         node = debugfs_create_file("req", S_IRUSR, root, host, &rk29_sdmmc_req_fops);
339         if (!node)
340                 goto err;
341
342         node = debugfs_create_file("status", S_IRUSR, root, host, &rk29_sdmmc_status_fops);
343         if (!node)
344                 goto err;
345
346         return;
347
348 err:
349         dev_err(&mmc->class_dev, "failed to initialize debugfs for host\n");
350 }
351 #endif
352 static void rk29_sdmmc_show_info(struct rk29_sdmmc *host)
353 {
354         dev_info(host->dev, "state:   \t\t0x%08x\n", host->state);
355         dev_info(host->dev, "pending_events:   \t0x%08lx\n", host->pending_events);
356         dev_info(host->dev, "completed_events:   \t0x%08lx\n", host->completed_events);
357         dev_info(host->dev, "mrq_status:   \t\t0x%08lx\n\n", host->mrq_status);
358         dev_info(host->dev, "old_mrq_status:   \t0x%08lx\n\n", host->old_mrq_status);
359         dev_info(host->dev, "SDMMC_CTRL:   \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CTRL));
360         dev_info(host->dev, "SDMMC_PWREN:  \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_PWREN));
361         dev_info(host->dev, "SDMMC_CLKDIV: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKDIV));
362         dev_info(host->dev, "SDMMC_CLKSRC: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKSRC));
363         dev_info(host->dev, "SDMMC_CLKENA: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CLKENA));
364         dev_info(host->dev, "SDMMC_TMOUT:  \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TMOUT));
365         dev_info(host->dev, "SDMMC_CTYPE:  \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CTYPE));
366         dev_info(host->dev, "SDMMC_BLKSIZ: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_BLKSIZ));
367         dev_info(host->dev, "SDMMC_BYTCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_BYTCNT));
368         dev_info(host->dev, "SDMMC_INTMASK:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_INTMASK));
369         dev_info(host->dev, "SDMMC_CMDARG: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CMDARG));
370         dev_info(host->dev, "SDMMC_CMD:    \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CMD));
371         dev_info(host->dev, "SDMMC_RESP0:  \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP0));
372         dev_info(host->dev, "SDMMC_RESP1:  \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP1));
373         dev_info(host->dev, "SDMMC_RESP2:  \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP2));
374         dev_info(host->dev, "SDMMC_RESP3:  \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RESP3));
375         dev_info(host->dev, "SDMMC_MINTSTS:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_MINTSTS));
376         dev_info(host->dev, "SDMMC_RINTSTS:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_RINTSTS));
377         dev_info(host->dev, "SDMMC_STATUS: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_STATUS));
378         dev_info(host->dev, "SDMMC_FIFOTH: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_FIFOTH));
379         dev_info(host->dev, "SDMMC_CDETECT:\t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_CDETECT));
380         dev_info(host->dev, "SDMMC_WRTPRT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_WRTPRT));
381         dev_info(host->dev, "SDMMC_TCBCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TCBCNT));
382         dev_info(host->dev, "SDMMC_TBBCNT: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_TBBCNT));
383         dev_info(host->dev, "SDMMC_DEBNCE: \t0x%08x\n", rk29_sdmmc_read(host->regs, SDMMC_DEBNCE));
384 }
385 static int rk29_sdmmc_reset_fifo(struct rk29_sdmmc *host)
386 {
387         int tmo;
388         int retry = RK29_SDMMC_TMO_COUNT;
389         if(!(rk29_sdmmc_read(host->regs, SDMMC_STATUS) & (SDMMC_STAUTS_MC_BUSY|SDMMC_STAUTS_DATA_BUSY)) &&
390                 (rk29_sdmmc_read(host->regs, SDMMC_STATUS) & SDMMC_STAUTS_FIFO_EMPTY))
391                 return 0;
392
393         while(retry--) 
394         {
395                 tmo = RK29_SDMMC_TMO_COUNT;
396                 rk29_sdmmc_write(host->regs, SDMMC_CTRL, rk29_sdmmc_read(host->regs, SDMMC_CTRL) | SDMMC_CTRL_FIFO_RESET);
397                 while (--tmo && rk29_sdmmc_read(host->regs, SDMMC_CTRL) & SDMMC_CTRL_FIFO_RESET);
398                 if(rk29_sdmmc_read(host->regs, SDMMC_STATUS) & (SDMMC_STAUTS_MC_BUSY|SDMMC_STAUTS_DATA_BUSY))
399                         udelay(5);
400                 else
401                         break;
402         }
403         if(retry <= 0){
404                 dev_dbg(host->dev, "%s error\n", __func__);
405                 return -1;
406         }
407         else
408                 return 0;
409 }
410 static int rk29_sdmmc_reset_ctrl(struct rk29_sdmmc *host)
411 {
412         int tmo = RK29_SDMMC_TMO_COUNT;
413         /*
414         if(!(rk29_sdmmc_read(host->regs, SDMMC_STATUS) & (SDMMC_STAUTS_MC_BUSY|SDMMC_STAUTS_DATA_BUSY)))
415                 return 0;
416         */
417         rk29_sdmmc_write(host->regs, SDMMC_CTRL, (SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET | SDMMC_CTRL_DMA_RESET));
418         while (--tmo && rk29_sdmmc_read(host->regs, SDMMC_CTRL) & (SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET | SDMMC_CTRL_DMA_RESET));
419         rk29_sdmmc_write(host->regs, SDMMC_CTRL, rk29_sdmmc_read(host->regs, SDMMC_CTRL) | SDMMC_CTRL_INT_ENABLE);
420
421         if(tmo > 0) {
422                 rk29_sdmmc_set_mrq_status(host, MRQ_RESET_CTRL_DONE);
423                 host->is_init = 1;
424                 return 0;
425         }
426         else {
427                 rk29_sdmmc_set_mrq_status(host, MRQ_RESET_CTRL_ERR);
428                 dev_err(host->dev, "%s error\n", __func__);
429                 return -1;
430         }
431 }
432
433 static int rk29_sdmmc_start_command(struct rk29_sdmmc *host,
434                 struct mmc_command *cmd, u32 cmd_flags)
435 {
436         int tmo = RK29_SDMMC_TMO_COUNT;
437         unsigned long flags;
438
439         local_irq_save(flags);
440         
441         rk29_sdmmc_write(host->regs, SDMMC_CMDARG, cmd->arg); 
442         rk29_sdmmc_write(host->regs, SDMMC_CMD, cmd_flags | SDMMC_CMD_START); 
443         local_irq_restore(flags);
444
445         while (--tmo && rk29_sdmmc_read(host->regs, SDMMC_CMD) & SDMMC_CMD_START)
446                 cpu_relax();
447         if(tmo > 0)
448                 return 0;
449         else
450                 return -1;
451 }
452
453 static int send_stop_cmd(struct rk29_sdmmc *host)
454 {
455         dev_dbg(host->dev,"start cmd:%d ARGR=0x%08x CMDR=0x%08x\n",
456                                                 host->mrq->data->stop->opcode, host->mrq->data->stop->arg, host->stop_cmdr);
457         if(rk29_sdmmc_start_command(host, host->mrq->data->stop, host->stop_cmdr)) {
458                 rk29_sdmmc_set_mrq_status(host, MRQ_STOP_START_TMO);
459                 return -1;
460         }
461         else {
462                 rk29_sdmmc_set_mrq_status(host, MRQ_STOP_START_DONE);
463                 return 0;
464         }
465 }
466 static void rk29_sdmmc_dma_cleanup(struct rk29_sdmmc *host)
467 {
468         struct mmc_data *data = host->mrq->data;
469         if (data) 
470                 dma_unmap_sg(host->dev, data->sg, data->sg_len,
471                      ((data->flags & MMC_DATA_WRITE)
472                       ? DMA_TO_DEVICE : DMA_FROM_DEVICE));                      
473 }
474
475 static void rk29_sdmmc_stop_dma(struct rk29_sdmmc *host)
476 {
477         int ret = 0;
478         rk29_sdmmc_set_mrq_status(host, MRQ_STOP_DMA);
479         rk29_sdmmc_dma_cleanup(host);
480         ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_STOP);
481         if(ret < 0)
482                         dev_err(host->dev, "stop dma:rk29_dma_ctrl stop error\n");
483         ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_FLUSH);
484         if(ret < 0)
485                         dev_err(host->dev, "stop dma:rk29_dma_ctrl flush error\n");
486         rk29_sdmmc_write(host->regs, SDMMC_CTRL, 
487                         (rk29_sdmmc_read(host->regs, SDMMC_CTRL))&(~SDMMC_CTRL_DMA_ENABLE));
488 }
489
490 static void rk29_sdmmc_request_done(struct rk29_sdmmc *host,struct mmc_request  *mrq)
491 {
492         int tmo = RK29_SDMMC_TMO_COUNT;
493
494         spin_unlock(&host->lock);
495         rk29_sdmmc_write(host->regs, SDMMC_RINTSTS, ~SDMMC_INT_SDIO);
496         rk29_sdmmc_write(host->regs, SDMMC_INTMASK,
497                 rk29_sdmmc_read(host->regs, SDMMC_INTMASK) & 
498                 ~(SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS));
499
500         if(!rk29_sdmmc_test_mrq_status(host, MRQ_STOP_DMA) && 
501                 rk29_sdmmc_test_mrq_status(host, MRQ_START_DMA))
502                 rk29_sdmmc_stop_dma(host);
503         if(mrq->stop && !rk29_sdmmc_test_mrq_status(host, MRQ_STOP_START_DONE))
504                 send_stop_cmd(host);
505         if(mrq->cmd->opcode == 17 && (host->data_intsts & SDMMC_INT_SBE)){
506                 rk29_sdmmc_write(host->regs, SDMMC_CMD, 12|SDMMC_CMD_STOP | SDMMC_CMD_START); 
507                 while (--tmo && rk29_sdmmc_read(host->regs, SDMMC_CMD) & SDMMC_CMD_START);
508         }
509         if(rk29_sdmmc_read(host->regs, SDMMC_STATUS) & SDMMC_STAUTS_FIFO_FULL ){
510                 rk29_sdmmc_read(host->regs, SDMMC_DATA);
511                 rk29_sdmmc_read(host->regs, SDMMC_DATA);
512         }
513         //if(mrq->data && mrq->data->error)
514                 rk29_sdmmc_reset_fifo(host);
515         
516         host->mrq = NULL;
517         host->state = STATE_IDLE;
518         rk29_sdmmc_set_mrq_status(host, MRQ_REQUEST_DONE);
519         mmc_request_done(host->mmc, mrq);
520         del_timer(&host->monitor_timer);
521         
522         spin_lock(&host->lock);
523 }
524
525 static int sdmmc_send_cmd(struct rk29_sdmmc *host, unsigned int cmd, int arg)
526 {
527         int tmo = RK29_SDMMC_TMO_COUNT;
528         rk29_sdmmc_write(host->regs, SDMMC_CMDARG, arg);
529         rk29_sdmmc_write(host->regs, SDMMC_CMD, SDMMC_CMD_START | cmd);         
530         while (--tmo && readl(host->regs + SDMMC_CMD) & SDMMC_CMD_START);
531         if(tmo > 0)
532                 return 0;
533         else
534                 return -1;
535 }
536 static int rk29_sdmmc_get_div(unsigned int bus_hz, unsigned int ios_clock)
537 {
538      unsigned int div, real_clock;
539
540          if(ios_clock >= bus_hz)
541                  return 0;
542         for(div = 1; div < 255; div++)
543         {
544                 real_clock = bus_hz/(2*div);
545                 if(real_clock <= ios_clock)
546                         break;
547         }
548         if(div > 255)
549                 div = 255;
550         return div;
551 }
552
553 int rk29_sdmmc_set_clock(struct rk29_sdmmc *host)
554 {
555         unsigned int div;
556         if(!host->ios_clock)
557                 return 0;
558         //div  = (((host->bus_hz + (host->bus_hz / 5)) / host->ios_clock)) >> 1;
559         //if(host->mrq && host->mrq->cmd->opcode == 25)
560                 //host->ios_clock = 500000;
561         div = rk29_sdmmc_get_div(host->bus_hz, host->ios_clock);
562 /*
563         if(div == 0)
564                 div = 1;
565 */
566         if(host->div == div)
567                 return 0;
568         dev_info(host->dev, "div = %u, bus_hz = %u, ios_clock = %u\n",
569                 div, host->bus_hz, host->ios_clock);
570         rk29_sdmmc_write(host->regs, SDMMC_CLKENA, 0);
571         rk29_sdmmc_write(host->regs, SDMMC_CLKSRC,0);
572         if(sdmmc_send_cmd(host, SDMMC_CMD_UPD_CLK | SDMMC_CMD_PRV_DAT_WAIT, 0))
573                 goto send_cmd_err;
574         rk29_sdmmc_write(host->regs, SDMMC_CLKDIV, div);
575         host->div = div;
576         host->clock = (div == 0)? host->bus_hz :(host->bus_hz / div) >> 1;
577         if(sdmmc_send_cmd(host, SDMMC_CMD_UPD_CLK | SDMMC_CMD_PRV_DAT_WAIT, 0))
578                 goto send_cmd_err;
579         rk29_sdmmc_write(host->regs, SDMMC_CLKENA, SDMMC_CLKEN_ENABLE);
580         if(sdmmc_send_cmd(host, SDMMC_CMD_UPD_CLK | SDMMC_CMD_PRV_DAT_WAIT, 0))
581                 goto send_cmd_err;
582
583         rk29_sdmmc_set_mrq_status(host, MRQ_CLK_START_DONE);
584         return 0;
585 send_cmd_err:
586         rk29_sdmmc_set_mrq_status(host, MRQ_CLK_START_TMO);
587         return -1;      
588 }
589
590 static void rk29_sdmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
591 {
592         struct rk29_sdmmc *host = mmc_priv(mmc);;
593
594
595         switch (ios->bus_width) {
596         case MMC_BUS_WIDTH_1:
597                 rk29_sdmmc_write(host->regs, SDMMC_CTYPE, 0);
598                 break;
599         case MMC_BUS_WIDTH_4:
600                 rk29_sdmmc_write(host->regs, SDMMC_CTYPE, SDMMC_CTYPE_4BIT);
601                 break;
602         }
603         host->ios_clock = ios->clock;
604         
605         switch (ios->power_mode) {
606         case MMC_POWER_UP:
607                 host->is_init = 1;
608                 rk29_sdmmc_write(host->regs, SDMMC_PWREN, 1);
609                 break;
610         default:
611                 break;
612         }
613 }
614
615 static int rk29_sdmmc_get_ro(struct mmc_host *mmc)
616 {
617         struct rk29_sdmmc *host = mmc_priv(mmc);
618         u32 wrtprt = rk29_sdmmc_read(host->regs, SDMMC_WRTPRT);
619
620         return (wrtprt & SDMMC_WRITE_PROTECT)?1:0;
621 }
622
623
624 static int rk29_sdmmc_get_cd(struct mmc_host *mmc)
625 {
626         struct rk29_sdmmc *host = mmc_priv(mmc);
627
628         if(host->is_sdio)
629                 return host->get_wifi_cd(mmc_dev(host->mmc));
630         else if(host->gpio_det == INVALID_GPIO)
631                 return 1;
632         else
633                 return gpio_get_value(host->gpio_det)?0:1;
634 }
635
636 static inline unsigned ns_to_clocks(unsigned clkrate, unsigned ns)
637 {
638         u32 clks;
639         if (clkrate > 1000000)
640                 clks =  (ns * (clkrate / 1000000) + 999) / 1000;
641         else
642                 clks =  ((ns/1000) * (clkrate / 1000) + 999) / 1000;
643
644         return clks;
645 }
646
647 static void rk29_sdmmc_set_timeout(struct rk29_sdmmc *host,struct mmc_data *data)
648 {
649         unsigned timeout;
650         unsigned int clock;
651         
652         if(host->div == -1)
653                 return;
654         else if(host->div == 0)
655                 clock = host->bus_hz;
656         else
657                 clock = (host->bus_hz / host->div) >> 1;
658         timeout = ns_to_clocks(clock, data->timeout_ns) + data->timeout_clks;
659         rk29_sdmmc_write(host->regs, SDMMC_TMOUT, 0xffffffff);
660         //rk29_sdmmc_write(host->regs, SDMMC_TMOUT, (timeout << 8) | (70));
661 }
662 static u32 rk29_sdmmc_prepare_command(struct mmc_host *mmc,
663                                  struct mmc_command *cmd)
664 {
665         struct mmc_data *data;
666         u32             cmdr;
667         
668         cmd->error = -EINPROGRESS;
669         cmdr = cmd->opcode;
670
671         if(cmdr == 12) 
672                 cmdr |= SDMMC_CMD_STOP;
673         else if(cmdr == 13) 
674                 cmdr &= ~SDMMC_CMD_PRV_DAT_WAIT;
675         else 
676                 cmdr |= SDMMC_CMD_PRV_DAT_WAIT;
677
678         if (cmd->flags & MMC_RSP_PRESENT) {
679                 cmdr |= SDMMC_CMD_RESP_EXP; // expect the respond, need to set this bit
680                 if (cmd->flags & MMC_RSP_136) 
681                         cmdr |= SDMMC_CMD_RESP_LONG; // expect long respond
682                 
683                 if(cmd->flags & MMC_RSP_CRC) 
684                         cmdr |= SDMMC_CMD_RESP_CRC;
685         }
686
687         data = cmd->data;
688         if (data) {
689                 cmdr |= SDMMC_CMD_DAT_EXP;
690                 if (data->flags & MMC_DATA_STREAM) 
691                         cmdr |= SDMMC_CMD_STRM_MODE; //  set stream mode
692                 if (data->flags & MMC_DATA_WRITE) 
693                     cmdr |= SDMMC_CMD_DAT_WR;
694         }
695         return cmdr;
696 }
697 static int rk29_sdmmc_submit_data(struct rk29_sdmmc *host, struct mmc_data *data)
698 {
699         struct scatterlist              *sg;
700         unsigned int                    i,direction;
701         int dma_len=0, ret = 0;
702
703         if (data->blksz & 3){
704                 dev_info(host->dev, "data->blksz = %d\n", data->blksz);
705                 return -EINVAL;
706         }
707         for_each_sg(data->sg, sg, data->sg_len, i) {
708                 if (sg->offset & 3 || sg->length & 3){
709                         dev_info(host->dev, "sg->offset = %d, sg->length = %d\n",
710                                 sg->offset, sg->length);
711                         return -EINVAL;
712                 }
713         }
714         if (data->flags & MMC_DATA_READ)
715                 direction = RK29_DMASRC_HW;  
716         else
717                 direction = RK29_DMASRC_MEM;  
718         
719         ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_STOP);
720         if(ret < 0)
721                         dev_err(host->dev, "rk29_dma_ctrl stop error\n");
722         ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_FLUSH);       
723         if(ret < 0)
724                         dev_err(host->dev, "rk29_dma_ctrl flush error\n");
725     ret = rk29_dma_devconfig(host->dma_info.chn, direction, (unsigned long )(host->dma_addr));
726         if(ret < 0)
727                         dev_err(host->dev, "rk29_dma_devconfig error\n");
728         dma_len = dma_map_sg(host->dev, data->sg, data->sg_len, 
729                         (data->flags & MMC_DATA_READ)? DMA_FROM_DEVICE : DMA_TO_DEVICE);                                                                           
730         for (i = 0; i < dma_len; i++) {                             
731         ret = rk29_dma_enqueue(host->dma_info.chn, host, sg_dma_address(&data->sg[i]),sg_dma_len(&data->sg[i]));  // data->sg->dma_address, data->sg->length);          
732                 if(ret < 0)
733                         dev_err(host->dev, "rk29 dma enqueue error\n");
734         }
735         rk29_sdmmc_write(host->regs, SDMMC_CTRL, (rk29_sdmmc_read(host->regs, SDMMC_CTRL))|SDMMC_CTRL_DMA_ENABLE);// enable dma
736         ret = rk29_dma_ctrl(host->dma_info.chn, RK29_DMAOP_START);
737         if(ret < 0)
738                         dev_err(host->dev, "rk29_dma_ctrl start error\n");
739         rk29_sdmmc_set_mrq_status(host, MRQ_START_DMA);
740         return 0;
741 }
742 static int rk29_sdmmc_test_cmd_start(struct rk29_sdmmc *host)
743 {
744         return rk29_sdmmc_read(host->regs, SDMMC_CMD) & SDMMC_CMD_START;
745 }
746 static int rk29_sdmmc_start_request(struct rk29_sdmmc *host,struct mmc_request *mrq)
747 {
748         int ret = 0;
749         struct mmc_command      *cmd;
750         u32     cmdflags;
751         
752         BUG_ON(host->state != STATE_IDLE);
753         
754         spin_lock(&host->lock);
755
756         if(rk29_sdmmc_test_cmd_start(host)){
757                 dev_info(host->dev, "cmd_start bit is set ,reset ctroller\n");
758                 ret = rk29_sdmmc_reset_ctrl(host);
759         }
760         if(ret < 0)
761                 goto start_err;
762         
763         host->state = STATE_SENDING_CMD;
764         
765         if (mrq->data) {
766                 rk29_sdmmc_set_timeout(host,mrq->data);
767                 rk29_sdmmc_write(host->regs, SDMMC_BYTCNT,mrq->data->blksz*mrq->data->blocks);
768                 rk29_sdmmc_write(host->regs, SDMMC_BLKSIZ,mrq->data->blksz);
769         }
770         cmd = mrq->cmd;
771         cmdflags = rk29_sdmmc_prepare_command(host->mmc, cmd);
772         if (host->is_init) {
773                 host->is_init = 0;
774             cmdflags |= SDMMC_CMD_INIT; 
775         }
776
777         if (mrq->data) {
778                 rk29_sdmmc_set_mrq_status(host, MRQ_HAS_DATA);
779                 ret = rk29_sdmmc_submit_data(host, mrq->data);
780         }
781         if(ret < 0) {
782                 rk29_sdmmc_set_mrq_status(host, MRQ_DMA_SET_ERR);
783                 goto start_err;
784         }
785         dev_dbg(host->dev,"start cmd:%d ARGR=0x%08x CMDR=0x%08x\n",
786                                                 cmd->opcode, cmd->arg, cmdflags);
787
788         rk29_sdmmc_write(host->regs, SDMMC_RINTSTS, ~SDMMC_INT_SDIO);
789         rk29_sdmmc_write(host->regs, SDMMC_INTMASK,
790                 rk29_sdmmc_read(host->regs, SDMMC_INTMASK) | 
791                 (SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS));
792         ret = rk29_sdmmc_start_command(host, cmd, cmdflags);
793         if(ret < 0) {
794                 rk29_sdmmc_set_mrq_status(host, MRQ_CMD_START_TMO);
795                 goto start_err;
796         }
797         rk29_sdmmc_set_mrq_status(host, MRQ_CMD_START_DONE);
798         if (mrq->stop) {
799                 rk29_sdmmc_set_mrq_status(host, MRQ_HAS_STOP);
800                 host->stop_cmdr = rk29_sdmmc_prepare_command(host->mmc, mrq->stop);
801                 if(mrq->cmd->opcode == 25)
802                         host->stop_cmdr |= SDMMC_CMD_DAT_WR;
803         }
804         spin_unlock(&host->lock);
805         return 0;
806 start_err:
807         spin_unlock(&host->lock);
808         return ret;
809 }
810
811 static void rk29_sdmmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
812 {
813         int timeout;
814         struct rk29_sdmmc *host = mmc_priv(mmc);
815
816         if(!mrq)
817                 dev_info(host->dev, "mrq = NULL!!!!!\n");
818         if(host->mrq){
819                                 dev_info(host->dev, "%s-> host->mrq = NULL\n", __func__);
820                                 rk29_sdmmc_show_info(host);
821                         }
822         if((!rk29_sdmmc_test_mrq_status(host, MRQ_STOP_DMA) && 
823                 rk29_sdmmc_test_mrq_status(host, MRQ_START_DMA)) ||
824                 (rk29_sdmmc_test_mrq_status(host, MRQ_STOP_DMA) && 
825                 !rk29_sdmmc_test_mrq_status(host, MRQ_START_DMA)))
826                 dev_warn(host->dev, "start_dma but no stop_dma, or no start_dma but stop_dma\n");
827         WARN_ON(host->mrq);
828         host->old_mrq_status = host->mrq_status;
829         host->mrq_status = 0;
830         host->pending_events = 0;
831         host->completed_events= 0;
832         host->cmd_intsts = 0;
833         host->data_intsts = 0;
834         host->mrq = mrq;
835
836         if(!mrq->data)
837                 timeout = 5000;
838         else
839                 timeout = 5000 + mrq->data->timeout_ns/1000000;
840         mod_timer(&host->monitor_timer, jiffies + msecs_to_jiffies(timeout));
841         
842         if (!rk29_sdmmc_get_cd(mmc)) {
843                 mrq->cmd->error = -ENOMEDIUM;
844                 rk29_sdmmc_request_done(host, mrq);
845                 dev_dbg(host->dev, "mrq_status = 0x%08lx\n", host->mrq_status);
846                 return;
847         }
848
849         if(rk29_sdmmc_set_clock(host)) {
850                 mrq->cmd->error = -EINPROGRESS;
851                 dev_info(host->dev, "rk29_sdmmc_set_clock timeout, ios_clock = %d, clock = %d\n", host->ios_clock, host->clock);
852                 rk29_sdmmc_request_done(host, mrq);
853                 rk29_sdmmc_reset_ctrl(host);
854                 rk29_sdmmc_show_info(host);
855                 return;
856         }
857         if(rk29_sdmmc_start_request(host,mrq)) {
858                 dev_info(host->dev, "rk29_sdmmc_start_request timeout\n");
859                 mrq->cmd->error = -EINPROGRESS;
860                 rk29_sdmmc_request_done(host, mrq);
861                 rk29_sdmmc_reset_ctrl(host);
862                 rk29_sdmmc_show_info(host);
863         }
864         return;
865 }
866
867 static void rk29_sdmmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
868 {
869         u32 intmask;
870         unsigned long flags;
871         struct rk29_sdmmc *host = mmc_priv(mmc);
872         
873         spin_lock_irqsave(&host->lock, flags);
874         intmask = rk29_sdmmc_read(host->regs, SDMMC_INTMASK);
875         if(enable)
876                 rk29_sdmmc_write(host->regs, SDMMC_INTMASK, intmask | SDMMC_INT_SDIO);
877         else
878                 rk29_sdmmc_write(host->regs, SDMMC_INTMASK, intmask & ~SDMMC_INT_SDIO);
879         spin_unlock_irqrestore(&host->lock, flags);
880 }
881
882 static void  rk29_sdmmc_init_card(struct mmc_host *mmc, struct mmc_card *card)
883 {
884         card->quirks = MMC_QUIRK_BLKSZ_FOR_BYTE_MODE;
885
886 }
887 static const struct mmc_host_ops rk29_sdmmc_ops[] = {
888         {
889                 .request        = rk29_sdmmc_request,
890                 .set_ios        = rk29_sdmmc_set_ios,
891                 .get_ro         = rk29_sdmmc_get_ro,
892                 .get_cd         = rk29_sdmmc_get_cd,
893         },
894         {
895                 .request        = rk29_sdmmc_request,
896                 .set_ios        = rk29_sdmmc_set_ios,
897                 .enable_sdio_irq = rk29_sdmmc_enable_sdio_irq,
898         .init_card       = rk29_sdmmc_init_card,
899         },
900 };
901
902 static void rk29_sdmmc_request_end(struct rk29_sdmmc *host)
903         __releases(&host->lock)
904         __acquires(&host->lock)
905 {
906         if(host->mrq)
907                 rk29_sdmmc_request_done(host, host->mrq);
908 }
909
910 static void rk29_sdmmc_command_complete(struct rk29_sdmmc *host,
911         struct mmc_command *cmd)
912 {
913         unsigned int intsts = host->cmd_intsts;
914
915         host->cmd_intsts = 0;
916         if(cmd->flags & MMC_RSP_PRESENT) {
917
918             if(cmd->flags & MMC_RSP_136) {
919                 cmd->resp[3] = rk29_sdmmc_read(host->regs, SDMMC_RESP0);
920                 cmd->resp[2] = rk29_sdmmc_read(host->regs, SDMMC_RESP1);
921                 cmd->resp[1] = rk29_sdmmc_read(host->regs, SDMMC_RESP2);
922                 cmd->resp[0] = rk29_sdmmc_read(host->regs, SDMMC_RESP3);
923             } else {
924                 cmd->resp[0] = rk29_sdmmc_read(host->regs, SDMMC_RESP0);
925                         cmd->resp[1] = 0;
926                         cmd->resp[2] = 0;
927                         cmd->resp[3] = 0;
928             }
929         }
930
931         if (intsts & SDMMC_INT_RTO)
932                 cmd->error = -ETIMEDOUT;
933         else if ((cmd->flags & MMC_RSP_CRC) && (intsts & SDMMC_INT_RCRC))
934                 cmd->error = -EILSEQ;
935         else if (intsts & SDMMC_INT_RE)
936                 cmd->error = -EIO;
937         else if(intsts & SDMMC_INT_HLE)
938                 cmd->error = -EIO;
939         else
940                 cmd->error = 0;
941
942         if (cmd->error) {
943                 dev_dbg(host->dev,
944                         "command error: status=0x%08x resp=0x%08x\n"
945                         "cmd=0x%08x arg=0x%08x flg=0x%08x err=%d\n", 
946                         intsts, cmd->resp[0], 
947                         cmd->opcode, cmd->arg, cmd->flags, cmd->error);
948
949                 if (cmd->data) {
950                         rk29_sdmmc_stop_dma(host);
951                 }
952         } 
953 }
954
955 static void rk29_sdmmc_tasklet_func(unsigned long priv)
956 {
957         struct rk29_sdmmc       *host = (struct rk29_sdmmc *)priv;
958         enum rk29_sdmmc_state   state;
959         enum rk29_sdmmc_state   prev_state;
960         unsigned int                    intsts;
961
962         spin_lock(&host->lock);
963         state = host->state;
964
965         do {
966                 prev_state = state;
967                 switch (state) {
968                 case STATE_IDLE:
969                         break;
970
971                 case STATE_SENDING_CMD:                 
972                         if (!rk29_sdmmc_test_and_clear_pending(host,
973                                                 EVENT_CMD_COMPLETE))
974                                 break;
975                         rk29_sdmmc_set_completed(host, EVENT_CMD_COMPLETE);
976                         if(!host->mrq){
977                                 dev_info(host->dev, "sending cmd, host->mrq = NULL\n");
978                                 rk29_sdmmc_show_info(host);
979                         }else{
980                                 rk29_sdmmc_command_complete(host, host->mrq->cmd);
981                                 if (!host->mrq->data || (host->mrq->cmd->error)) {
982                                         rk29_sdmmc_request_end(host);
983                                         goto unlock;
984                                 }
985                         prev_state = state = STATE_SENDING_DATA;
986                         }
987                 case STATE_SENDING_DATA:
988                         if (rk29_sdmmc_test_and_clear_pending(host,
989                                                 EVENT_DATA_ERROR)) {
990                                 if(!host->mrq){
991                                         dev_info(host->dev, "sending data, host->mrq = NULL\n");
992                                         rk29_sdmmc_show_info(host);
993                                 }
994                                 if(!rk29_sdmmc_test_mrq_status(host, MRQ_DMA_DONE) && 
995                 rk29_sdmmc_test_mrq_status(host, MRQ_START_DMA))
996                         dev_info(host->dev, "dma is running...\n");
997                                 rk29_sdmmc_stop_dma(host);
998                                 if (host->mrq->data->stop)
999                                         send_stop_cmd(host);
1000                                 state = STATE_DATA_ERROR;
1001                                 break;
1002                         }
1003                         prev_state = state = STATE_DATA_BUSY;
1004
1005                 case STATE_DATA_BUSY:
1006                         if (!rk29_sdmmc_test_and_clear_pending(host,EVENT_DATA_COMPLETE) &&
1007                                 !(host->data_intsts & SDMMC_INT_SBE))
1008                                 break;  
1009                         
1010                         rk29_sdmmc_set_completed(host, EVENT_DATA_COMPLETE);
1011                         intsts = host->data_intsts;
1012                         if(!host->mrq){
1013                                 dev_info(host->dev, "%s-> host->mrq = NULL\n", __func__);
1014                                 rk29_sdmmc_show_info(host);
1015                         }
1016                         if(host->mrq->data) {
1017                                 if (unlikely(intsts & RK29_SDMMC_DATA_ERROR_FLAGS)) {
1018                                         if (intsts & SDMMC_INT_DRTO) {
1019                                                 dev_err(host->dev,"data timeout error\n");
1020                                                 host->mrq->data->error = -ETIMEDOUT;
1021                                         } else if (intsts & SDMMC_INT_DCRC) {
1022                                                 dev_err(host->dev,"data CRC error\n");
1023                                                 host->mrq->data->error = -EILSEQ;
1024                                         } else if (intsts & SDMMC_INT_SBE) {
1025                                                 dev_err(host->dev,"data start bit error\n");
1026                                                 host->mrq->data->error = -EILSEQ;
1027                                         }else {
1028                                                 dev_err(host->dev,"data FIFO error (status=%08x)\n",intsts);
1029                                                 host->mrq->data->error = -EIO;
1030                                         }
1031                                         rk29_sdmmc_show_info(host);
1032                                 }else {
1033                                         host->mrq->data->bytes_xfered = host->mrq->data->blocks * host->mrq->data->blksz;
1034                                         host->mrq->data->error = 0;
1035                                 }
1036                         }
1037                         if (!host->mrq->data->stop) {
1038                                 rk29_sdmmc_request_end(host);
1039                                 goto unlock;
1040                         }
1041
1042                         prev_state = state = STATE_SENDING_STOP;
1043                         if (host->mrq->data && !host->mrq->data->error)
1044                                 send_stop_cmd(host);
1045                         /* fall through */
1046
1047                 case STATE_SENDING_STOP:
1048                         if (!rk29_sdmmc_test_and_clear_pending(host,
1049                                                 EVENT_CMD_COMPLETE))
1050                                 break;
1051                         if(!host->mrq){
1052                                 dev_info(host->dev, "%s-> host->mrq = NULL\n", __func__);
1053                                 rk29_sdmmc_show_info(host);
1054                         }
1055                         if(host->mrq->stop)
1056                                 rk29_sdmmc_command_complete(host, host->mrq->stop);
1057                         rk29_sdmmc_request_end(host);
1058                         goto unlock;
1059                 case STATE_DATA_ERROR:
1060                         state = STATE_DATA_BUSY;
1061                         break;
1062                 }
1063         } while (state != prev_state);
1064
1065         host->state = state;
1066
1067 unlock:
1068         spin_unlock(&host->lock);
1069
1070 }
1071
1072
1073
1074 static irqreturn_t rk29_sdmmc_isr(int irq, void *dev_id)
1075 {
1076         struct rk29_sdmmc *host = dev_id;
1077         unsigned int intsts;
1078
1079         intsts = rk29_sdmmc_read(host->regs, SDMMC_MINTSTS);
1080
1081         spin_lock(&host->lock);
1082         if(intsts & RK29_SDMMC_CMD_ERROR_FLAGS) {
1083                 rk29_sdmmc_set_mrq_status(host, MRQ_INT_CMD_ERR);
1084             rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,RK29_SDMMC_CMD_ERROR_FLAGS); 
1085             host->cmd_intsts = intsts;
1086             smp_wmb();
1087             rk29_sdmmc_set_pending(host, EVENT_CMD_COMPLETE);
1088                 if(!host->mrq){
1089                                 dev_info(host->dev, "%s-> host->mrq = NULL\n", __func__);
1090                                 rk29_sdmmc_show_info(host);
1091                         }
1092                 else
1093                         dev_info(host->dev, "[cmd%d] cmd error(intsts 0x%x, host->state %d, pending_events %ld)\n", 
1094                                 host->mrq->cmd->opcode,intsts,host->state,host->pending_events);
1095                 tasklet_schedule(&host->tasklet);
1096         }
1097
1098         if (intsts & RK29_SDMMC_DATA_ERROR_FLAGS) {
1099                 rk29_sdmmc_set_mrq_status(host, MRQ_INT_DATA_ERR);
1100                 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,RK29_SDMMC_DATA_ERROR_FLAGS);
1101                 host->data_intsts = intsts;
1102                 smp_wmb();
1103                 rk29_sdmmc_set_pending(host, EVENT_DATA_ERROR);
1104                 if(!host->mrq){
1105                                 dev_info(host->dev, "%s-> host->mrq = NULL\n", __func__);
1106                                 rk29_sdmmc_show_info(host);
1107                         }
1108                 else
1109                         dev_info(host->dev, "[cmd%d] data error(intsts 0x%x, host->state %d, pending_events %ld)\n", 
1110                                 host->mrq->cmd->opcode, intsts,host->state,host->pending_events);
1111                 tasklet_schedule(&host->tasklet);
1112         }
1113
1114         if(intsts & SDMMC_INT_DTO) {
1115                 rk29_sdmmc_set_mrq_status(host, MRQ_INT_DATA_DONE);
1116             rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_DTO); 
1117             if (!host->data_intsts)
1118                         host->data_intsts = intsts;
1119             smp_wmb();
1120             rk29_sdmmc_set_pending(host, EVENT_DATA_COMPLETE);
1121             tasklet_schedule(&host->tasklet);
1122         }
1123         if (intsts & SDMMC_INT_CMD_DONE) {
1124                 rk29_sdmmc_set_mrq_status(host, MRQ_INT_CMD_DONE);
1125             rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_CMD_DONE);
1126             if(!host->cmd_intsts) 
1127                         host->cmd_intsts = intsts;
1128
1129                 smp_wmb();
1130                 rk29_sdmmc_set_pending(host, EVENT_CMD_COMPLETE);
1131                 tasklet_schedule(&host->tasklet);
1132         }
1133         if(host->is_sdio && (intsts & SDMMC_INT_SDIO)) {
1134                 rk29_sdmmc_set_mrq_status(host, MRQ_INT_SDIO);
1135                 rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_SDIO);
1136                 mmc_signal_sdio_irq(host->mmc);
1137         }
1138         spin_unlock(&host->lock);
1139         return IRQ_HANDLED;
1140 }
1141
1142 static void rk29_sdmmc_dma_complete(void *arg, int size, enum rk29_dma_buffresult result)
1143 {
1144         struct rk29_sdmmc       *host = arg;
1145         
1146         dev_dbg(host->dev, "DMA complete\n");
1147         rk29_sdmmc_set_mrq_status(host, MRQ_DMA_DONE);
1148 }
1149
1150 static void rk29_sdmmc_detect_change(struct rk29_sdmmc *host)
1151 {
1152         spin_lock(&host->lock); 
1153
1154         del_timer(&host->monitor_timer);
1155         rk29_sdmmc_write(host->regs, SDMMC_RINTSTS, ~SDMMC_INT_SDIO);
1156         rk29_sdmmc_write(host->regs, SDMMC_INTMASK,
1157                 rk29_sdmmc_read(host->regs, SDMMC_INTMASK) & 
1158                 ~(SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS));
1159         if (host->mrq) {
1160                 switch (host->state) {
1161                 case STATE_IDLE:
1162                         break;
1163                 case STATE_SENDING_CMD:
1164                         if(host->mrq->cmd)
1165                                 host->mrq->cmd->error = -ENOMEDIUM;
1166                         if (!host->mrq->data)
1167                                 break;
1168                         /* fall through */
1169                 case STATE_SENDING_DATA:
1170                         if(host->mrq->data)
1171                                 host->mrq->data->error = -ENOMEDIUM;
1172                         rk29_sdmmc_stop_dma(host);
1173                         break;
1174                 case STATE_DATA_BUSY:
1175                 case STATE_DATA_ERROR:
1176                         if (host->mrq->data && host->mrq->data->error == -EINPROGRESS)
1177                                 host->mrq->data->error = -ENOMEDIUM;
1178                         if (!host->mrq->stop)
1179                                 break;
1180                         /* fall through */
1181                 case STATE_SENDING_STOP:
1182                         if(host->mrq->stop) {
1183                                 host->mrq->stop->error = -ENOMEDIUM;
1184                         }
1185                         break;
1186                 }
1187                 rk29_sdmmc_request_end(host);
1188         }
1189         rk29_sdmmc_reset_fifo(host);
1190         spin_unlock(&host->lock);
1191         mmc_detect_change(host->mmc, 0);
1192 }
1193
1194 static void rk29_sdmmc1_status_notify_cb(int card_present, void *dev_id)
1195 {
1196     struct rk29_sdmmc *host = dev_id;
1197
1198     card_present = rk29_sdmmc_get_cd(host->mmc);
1199     dev_info(host->dev, "sdio change detected,status is %d\n",card_present);
1200         
1201     rk29_sdmmc_detect_change(host);
1202 }
1203
1204 static void rk29_sdmmc_get_dma_dma_info(struct rk29_sdmmc *host)
1205 {
1206         if(host->is_sdio)
1207                 host->dma_info = dma_infos[1];
1208         else
1209                 host->dma_info = dma_infos[0];
1210 }
1211
1212 static irqreturn_t rk29_sdmmc_detect_change_isr(int irq, void *dev_id);
1213 static void rk29_sdmmc_detect_change_work(struct work_struct *work)
1214 {
1215         int ret;
1216     struct rk29_sdmmc *host =  container_of(work, struct rk29_sdmmc, work.work);
1217
1218         dev_info(host->dev, "sd detect change, card is %s\n", 
1219                 rk29_sdmmc_get_cd(host->mmc)?"inserted":"removed");
1220         if(host->enable_sd_warkup && rk29_sdmmc_get_cd(host->mmc))
1221                 rk28_send_wakeup_key();
1222         rk29_sdmmc_detect_change(host);
1223
1224         free_irq(host->gpio_irq, host);
1225         ret = request_irq(host->gpio_irq,
1226                                  rk29_sdmmc_detect_change_isr,
1227                          rk29_sdmmc_get_cd(host->mmc)?IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING,
1228                          "sd_detect",
1229                          host);
1230         if(ret < 0)
1231                 dev_err(host->dev, "gpio request_irq error\n");
1232 }
1233 static irqreturn_t rk29_sdmmc_detect_change_isr(int irq, void *dev_id)
1234 {
1235         struct rk29_sdmmc *host = dev_id;
1236
1237         disable_irq_nosync(host->gpio_irq);
1238         if(rk29_sdmmc_get_cd(host->mmc))
1239                 schedule_delayed_work(&host->work, msecs_to_jiffies(500));
1240         else
1241                 schedule_delayed_work(&host->work, 0);
1242         
1243         return IRQ_HANDLED;
1244 }
1245 static void rk29_sdmmc_monitor_timer(unsigned long data)
1246 {
1247         struct rk29_sdmmc *host = (struct rk29_sdmmc *)data;
1248         
1249         if(!rk29_sdmmc_test_mrq_status(host, MRQ_REQUEST_DONE)){
1250                 dev_info(host->dev, "no dto interrupt\n");
1251                 rk29_sdmmc_show_info(host);
1252                 host->mrq->cmd->error = -ETIMEDOUT;
1253                 if(host->mrq->data)
1254                         host->mrq->data->error = -ETIMEDOUT;
1255                 rk29_sdmmc_request_end(host);
1256                 //rk29_sdmmc_reset_ctrl(host);
1257         }
1258         
1259 }
1260
1261 #ifdef CONFIG_HAS_EARLYSUSPEND
1262 static void rk29_sdmmc_early_suspend(struct early_suspend *h)
1263 {
1264         struct rk29_sdmmc *host = container_of(h,
1265                                                         struct rk29_sdmmc,
1266                                                         early_suspend);
1267
1268         dev_dbg(host->dev, "Enter rk29_sdmmc_early_suspend\n");
1269 }
1270
1271 static void rk29_sdmmc_early_resume(struct early_suspend *h)
1272 {
1273         struct rk29_sdmmc *host = container_of(h,
1274                                                         struct rk29_sdmmc,
1275                                                         early_suspend);
1276
1277         dev_dbg(host->dev, "Exit rk29_sdmmc_early_resume\n");
1278 }
1279 #endif
1280
1281
1282 static int rk29_sdmmc_probe(struct platform_device *pdev)
1283 {
1284         struct mmc_host                 *mmc;
1285         struct rk29_sdmmc               *host;
1286         struct resource                 *regs;
1287         struct rk29_sdmmc_platform_data *pdata;
1288         int                             ret = 0;
1289
1290         pdata = pdev->dev.platform_data;
1291         if (!pdata) {
1292                 dev_err(&pdev->dev, "Platform data missing\n");
1293                 return -ENODEV;
1294         }
1295         if(pdata->io_init)
1296                 pdata->io_init();
1297
1298         mmc = mmc_alloc_host(sizeof(struct rk29_sdmmc), &pdev->dev);
1299         if (!mmc)
1300                 return -ENOMEM; 
1301
1302         host = mmc_priv(mmc);
1303         host->mmc = mmc;
1304         host->dev = &pdev->dev;
1305         host->mrq = NULL;
1306         host->state = STATE_IDLE;
1307         host->div = -1;
1308         host->is_init = 1;
1309         host->is_sdio = rk29_sdmmc_is_sdio(pdata);
1310
1311         if(host->is_sdio)
1312                 sdio_host = host;
1313         host->get_wifi_cd = pdata->status;
1314
1315         host->irq = platform_get_irq(pdev, 0);
1316         if (host->irq < 0) {
1317                 dev_err(&pdev->dev, "platform_get_irq error\n");
1318                 ret = host->irq;
1319                 goto err_mmc_free_host;
1320         }
1321         
1322         regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1323         if (!regs) {
1324                 dev_err(&pdev->dev, "platform_get_resource error\n");
1325                 ret = -ENXIO;
1326                 goto err_mmc_free_host;
1327         }
1328         
1329         host->regs = ioremap(regs->start, regs->end - regs->start);
1330         if (!host->regs){
1331                 dev_err(&pdev->dev, "ioremap error\n");
1332                 ret = ENXIO;
1333             goto err_mmc_free_host; 
1334         }
1335         spin_lock_init(&host->lock);
1336
1337         /* dma init */
1338         rk29_sdmmc_get_dma_dma_info(host);
1339         ret = rk29_dma_request(host->dma_info.chn, &(host->dma_info.client), NULL); 
1340         if (ret < 0){
1341                 dev_err(&pdev->dev, "rk29_dma_request error\n");
1342             goto err_iounmap; 
1343         }
1344         ret = rk29_dma_config(host->dma_info.chn, 4, 1);
1345
1346         if (ret < 0){
1347                 dev_err(&pdev->dev, "rk29_dma_config error\n");
1348             //goto err_rk29_dma_free; 
1349         }
1350         ret = rk29_dma_set_buffdone_fn(host->dma_info.chn, rk29_sdmmc_dma_complete);
1351         if (ret < 0){
1352                 dev_err(&pdev->dev, "rk29_dma_set_buffdone_fn error\n");
1353             goto err_rk29_dma_free; 
1354         }
1355         host->dma_addr = regs->start + SDMMC_DATA;
1356
1357         /* clk init */
1358         host->clk = clk_get(&pdev->dev, "mmc");
1359         if(host->is_sdio)
1360                 clk_set_rate(host->clk,RK29_SDIO_CLK * 1000000);
1361         else
1362                 clk_set_rate(host->clk,RK29_SDCARD_CLK * 1000000);
1363         clk_enable(host->clk);
1364         clk_enable(clk_get(&pdev->dev, "hclk_mmc"));
1365         host->bus_hz = clk_get_rate(host->clk); 
1366
1367         /* reset all blocks */
1368         rk29_sdmmc_write(host->regs, SDMMC_CTRL,(SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET | SDMMC_CTRL_DMA_RESET));
1369         /* wait till resets clear */
1370         while (rk29_sdmmc_read(host->regs, SDMMC_CTRL) & (SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET | SDMMC_CTRL_DMA_RESET));
1371          /* Clear the interrupts for the host controller */
1372         rk29_sdmmc_write(host->regs, SDMMC_RINTSTS, 0xFFFFFFFF);
1373         rk29_sdmmc_write(host->regs, SDMMC_INTMASK, 0); // disable all mmc interrupt first
1374         /* Put in max timeout */
1375         rk29_sdmmc_write(host->regs, SDMMC_TMOUT, 0xFFFFFFFF);
1376
1377         /* FIFO threshold settings  */
1378         rk29_sdmmc_write(host->regs, SDMMC_FIFOTH, ((0x3 << 28) | (0x0f << 16) | (0x10 << 0))); // RXMark = 15, TXMark = 16, DMA Size = 16
1379         /* disable clock to CIU */
1380         rk29_sdmmc_write(host->regs, SDMMC_CLKENA,0);
1381         rk29_sdmmc_write(host->regs, SDMMC_CLKSRC,0);
1382         rk29_sdmmc_write(host->regs, SDMMC_PWREN, 1);
1383
1384         ret = request_irq(host->irq, rk29_sdmmc_isr, 0, dev_name(&pdev->dev), host);
1385         if (ret < 0){
1386                 dev_err(&pdev->dev, "request_irq error\n");
1387             goto err_rk29_dma_free; 
1388         }
1389
1390         /* card insert flags init*/  
1391     if (pdata->register_status_notify) {
1392         pdata->register_status_notify(rk29_sdmmc1_status_notify_cb, host);
1393     }
1394
1395         /* add host */
1396         if(host->is_sdio)
1397                 mmc->ops = &rk29_sdmmc_ops[1];
1398         else
1399                 mmc->ops = &rk29_sdmmc_ops[0];
1400         if (host->is_sdio) 
1401                 mmc->pm_flags = MMC_PM_IGNORE_PM_NOTIFY;   //ignore pm notify   
1402         
1403         mmc->f_min = DIV_ROUND_UP(host->bus_hz, 510);
1404         mmc->f_max = host->bus_hz; 
1405         mmc->ocr_avail = pdata->host_ocr_avail;
1406         mmc->caps = pdata->host_caps;
1407         mmc->max_phys_segs = 64;
1408         mmc->max_hw_segs = 64;
1409         mmc->max_blk_size = 4096; 
1410         mmc->max_blk_count = 65535; 
1411         mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
1412         mmc->max_seg_size = mmc->max_req_size;  
1413         
1414         ret = mmc_add_host(mmc);
1415         if (ret < 0){
1416                 dev_err(&pdev->dev, "mmc_add_host error\n");
1417             goto err_free_irq; 
1418         }
1419         
1420 #if defined (CONFIG_DEBUG_FS)
1421         rk29_sdmmc_init_debugfs(host);
1422 #endif
1423         tasklet_init(&host->tasklet, rk29_sdmmc_tasklet_func, (unsigned long)host);
1424         setup_timer(&host->monitor_timer, rk29_sdmmc_monitor_timer,(unsigned long)host);
1425         
1426         host->gpio_det = pdata->detect_irq;
1427         if(!host->is_sdio && host->gpio_det != INVALID_GPIO) {
1428                 INIT_DELAYED_WORK(&host->work, rk29_sdmmc_detect_change_work);
1429                 ret = gpio_request(host->gpio_det, "sd_detect");
1430                 if(ret < 0) {
1431                         dev_err(&pdev->dev, "gpio_request error\n");
1432                         goto err_mmc_remove_host;
1433                 }
1434                 gpio_direction_input(host->gpio_det);
1435                 host->gpio_irq = gpio_to_irq(host->gpio_det);
1436
1437                 ret = request_irq(host->gpio_irq,
1438                                   rk29_sdmmc_detect_change_isr,
1439                                   rk29_sdmmc_get_cd(host->mmc)?IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING,
1440                                   "sd_detect",
1441                                   host);
1442                 if(ret < 0) {
1443                         dev_err(&pdev->dev, "gpio request_irq error\n");
1444                         goto err_gpio_free;
1445                 }
1446                 host->enable_sd_warkup = pdata->enable_sd_wakeup;
1447                 if(host->enable_sd_warkup)
1448                         enable_irq_wake(host->gpio_irq);
1449         }
1450         platform_set_drvdata(pdev, host);
1451         rk29_sdmmc_write(host->regs, SDMMC_CTYPE, 0);
1452         rk29_sdmmc_write(host->regs, SDMMC_RINTSTS, 0xFFFFFFFF);
1453         rk29_sdmmc_write(host->regs, SDMMC_INTMASK,SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS);
1454         rk29_sdmmc_write(host->regs, SDMMC_CTRL,SDMMC_CTRL_INT_ENABLE);
1455         rk29_sdmmc_write(host->regs, SDMMC_CLKENA,1);
1456 #ifdef CONFIG_HAS_EARLYSUSPEND
1457         host->early_suspend.suspend = rk29_sdmmc_early_suspend;
1458         host->early_suspend.resume = rk29_sdmmc_early_resume;
1459         host->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
1460         register_early_suspend(&host->early_suspend);
1461 #endif  
1462         dev_info(host->dev, "RK29 SDMMC controller at irq %d\n", host->irq);
1463         return 0;
1464         free_irq(host->gpio_irq, host);
1465 err_gpio_free:
1466         gpio_free(host->gpio_det);
1467 err_mmc_remove_host:
1468         mmc_remove_host(host->mmc);
1469 err_free_irq:
1470         free_irq(host->irq, host);
1471 err_rk29_dma_free:
1472         rk29_dma_free(host->dma_info.chn, &host->dma_info.client);
1473 err_iounmap:    
1474         iounmap(host->regs);
1475 err_mmc_free_host:
1476         mmc_free_host(host->mmc);
1477
1478         while(1);
1479         return ret;
1480
1481 }
1482
1483
1484
1485 static int __exit rk29_sdmmc_remove(struct platform_device *pdev)
1486 {
1487         struct rk29_sdmmc *host = platform_get_drvdata(pdev);
1488
1489         rk29_sdmmc_write(host->regs, SDMMC_RINTSTS, 0xFFFFFFFF);
1490         rk29_sdmmc_write(host->regs, SDMMC_INTMASK, 0); // disable all mmc interrupt first
1491         
1492         smp_wmb();
1493         free_irq(host->gpio_irq, host);
1494         gpio_free(host->gpio_det);
1495         mmc_remove_host(host->mmc);
1496         free_irq(host->irq, host);
1497         rk29_dma_free(host->dma_info.chn, &host->dma_info.client);
1498         
1499         /* disable clock to CIU */
1500         rk29_sdmmc_write(host->regs, SDMMC_CLKENA,0);
1501         rk29_sdmmc_write(host->regs, SDMMC_CLKSRC,0);
1502         
1503         iounmap(host->regs);
1504         mmc_free_host(host->mmc);
1505         return 0;
1506 }
1507 static int rk29_sdmmc_suspend(struct platform_device *pdev, pm_message_t state)
1508 {
1509         int ret = 0;
1510 #ifdef CONFIG_PM
1511         struct rk29_sdmmc *host = platform_get_drvdata(pdev);
1512
1513         dev_info(host->dev, "Enter rk29_sdmmc_suspend\n");
1514         if(host->mmc && !host->is_sdio && host->gpio_det != INVALID_GPIO){
1515                 ret = mmc_suspend_host(host->mmc,state);
1516                 if(!host->enable_sd_warkup)
1517                         free_irq(host->gpio_irq, host);
1518         }
1519         rk29_sdmmc_write(host->regs, SDMMC_CLKENA, 0);
1520         clk_disable(host->clk);
1521 #endif
1522         return ret;
1523 }
1524
1525 static int rk29_sdmmc_resume(struct platform_device *pdev)
1526 {
1527         int ret = 0;
1528 #ifdef CONFIG_PM
1529         struct rk29_sdmmc *host = platform_get_drvdata(pdev);
1530
1531         dev_info(host->dev, "Exit rk29_sdmmc_suspend\n");
1532         clk_enable(host->clk);
1533     rk29_sdmmc_write(host->regs, SDMMC_CLKENA, 1);
1534         if(host->mmc && !host->is_sdio && host->gpio_det != INVALID_GPIO){
1535                 if(!host->enable_sd_warkup){
1536                         ret = request_irq(host->gpio_irq,
1537                                   rk29_sdmmc_detect_change_isr,
1538                                   rk29_sdmmc_get_cd(host->mmc)?IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING,
1539                                   "sd_detect",
1540                                   host);
1541                         if(ret < 0)
1542                         dev_err(host->dev, "gpio request_irq error\n");
1543                 }
1544                 host->is_init = 1;
1545                 ret = mmc_resume_host(host->mmc);
1546                 mmc_detect_change(host->mmc, 0);
1547         }
1548 #endif
1549         return ret;
1550 }
1551 static struct platform_driver rk29_sdmmc_driver = {
1552         .suspend    = rk29_sdmmc_suspend,
1553         .resume     = rk29_sdmmc_resume,
1554         .remove         = __exit_p(rk29_sdmmc_remove),
1555         .driver         = {
1556                 .name           = "rk29_sdmmc",
1557         },
1558 };
1559
1560 static int __init rk29_sdmmc_init(void)
1561 {
1562         return platform_driver_probe(&rk29_sdmmc_driver, rk29_sdmmc_probe);
1563 }
1564
1565 static void __exit rk29_sdmmc_exit(void)
1566 {
1567         platform_driver_unregister(&rk29_sdmmc_driver);
1568 }
1569
1570 module_init(rk29_sdmmc_init);
1571 module_exit(rk29_sdmmc_exit);
1572
1573 MODULE_DESCRIPTION("Rk29 Multimedia Card Interface driver");
1574 MODULE_AUTHOR("Rockchips");
1575 MODULE_LICENSE("GPL v2");
1576