]> git.sur5r.net Git - u-boot/blob - drivers/mmc/gen_atmel_mci.c
mmc: Add a function to dump the mmc capabilities
[u-boot] / drivers / mmc / gen_atmel_mci.c
1 /*
2  * Copyright (C) 2010
3  * Rob Emanuele <rob@emanuele.us>
4  * Reinhard Meyer, EMK Elektronik <reinhard.meyer@emk-elektronik.de>
5  *
6  * Original Driver:
7  * Copyright (C) 2004-2006 Atmel Corporation
8  *
9  * SPDX-License-Identifier:     GPL-2.0+
10  */
11
12 #include <common.h>
13 #include <clk.h>
14 #include <dm.h>
15 #include <mmc.h>
16 #include <part.h>
17 #include <malloc.h>
18 #include <asm/io.h>
19 #include <linux/errno.h>
20 #include <asm/byteorder.h>
21 #include <asm/arch/clk.h>
22 #include <asm/arch/hardware.h>
23 #include "atmel_mci.h"
24
25 DECLARE_GLOBAL_DATA_PTR;
26
27 #ifndef CONFIG_SYS_MMC_CLK_OD
28 # define CONFIG_SYS_MMC_CLK_OD  150000
29 #endif
30
31 #define MMC_DEFAULT_BLKLEN      512
32
33 #if defined(CONFIG_ATMEL_MCI_PORTB)
34 # define MCI_BUS 1
35 #else
36 # define MCI_BUS 0
37 #endif
38
39 #ifdef CONFIG_DM_MMC
40 struct atmel_mci_plat {
41         struct mmc              mmc;
42         struct mmc_config       cfg;
43         struct atmel_mci        *mci;
44 };
45 #endif
46
47 struct atmel_mci_priv {
48 #ifndef CONFIG_DM_MMC
49         struct mmc_config       cfg;
50         struct atmel_mci        *mci;
51 #endif
52         unsigned int            initialized:1;
53         unsigned int            curr_clk;
54 #ifdef CONFIG_DM_MMC
55         ulong           bus_clk_rate;
56 #endif
57 };
58
59 /* Read Atmel MCI IP version */
60 static unsigned int atmel_mci_get_version(struct atmel_mci *mci)
61 {
62         return readl(&mci->version) & 0x00000fff;
63 }
64
65 /*
66  * Print command and status:
67  *
68  * - always when DEBUG is defined
69  * - on command errors
70  */
71 static void dump_cmd(u32 cmdr, u32 arg, u32 status, const char* msg)
72 {
73         debug("gen_atmel_mci: CMDR %08x (%2u) ARGR %08x (SR: %08x) %s\n",
74               cmdr, cmdr & 0x3F, arg, status, msg);
75 }
76
77 /* Setup for MCI Clock and Block Size */
78 #ifdef CONFIG_DM_MMC
79 static void mci_set_mode(struct udevice *dev, u32 hz, u32 blklen)
80 {
81         struct atmel_mci_plat *plat = dev_get_platdata(dev);
82         struct atmel_mci_priv *priv = dev_get_priv(dev);
83         struct mmc *mmc = &plat->mmc;
84         u32 bus_hz = priv->bus_clk_rate;
85         atmel_mci_t *mci = plat->mci;
86 #else
87 static void mci_set_mode(struct mmc *mmc, u32 hz, u32 blklen)
88 {
89         struct atmel_mci_priv *priv = mmc->priv;
90         u32 bus_hz = get_mci_clk_rate();
91         atmel_mci_t *mci = priv->mci;
92 #endif
93
94         u32 clkdiv = 255;
95         unsigned int version = atmel_mci_get_version(mci);
96         u32 clkodd = 0;
97         u32 mr;
98
99         debug("mci: bus_hz is %u, setting clock %u Hz, block size %u\n",
100                 bus_hz, hz, blklen);
101         if (hz > 0) {
102                 if (version >= 0x500) {
103                         clkdiv = DIV_ROUND_UP(bus_hz, hz) - 2;
104                         if (clkdiv > 511)
105                                 clkdiv = 511;
106
107                         clkodd = clkdiv & 1;
108                         clkdiv >>= 1;
109
110                         debug("mci: setting clock %u Hz, block size %u\n",
111                               bus_hz / (clkdiv * 2 + clkodd + 2), blklen);
112                 } else {
113                         /* find clkdiv yielding a rate <= than requested */
114                         for (clkdiv = 0; clkdiv < 255; clkdiv++) {
115                                 if ((bus_hz / (clkdiv + 1) / 2) <= hz)
116                                         break;
117                         }
118                         debug("mci: setting clock %u Hz, block size %u\n",
119                               (bus_hz / (clkdiv + 1)) / 2, blklen);
120
121                 }
122         }
123         if (version >= 0x500)
124                 priv->curr_clk = bus_hz / (clkdiv * 2 + clkodd + 2);
125         else
126                 priv->curr_clk = (bus_hz / (clkdiv + 1)) / 2;
127         blklen &= 0xfffc;
128
129         mr = MMCI_BF(CLKDIV, clkdiv);
130
131         /* MCI IP version >= 0x200 has R/WPROOF */
132         if (version >= 0x200)
133                 mr |= MMCI_BIT(RDPROOF) | MMCI_BIT(WRPROOF);
134
135         /*
136          * MCI IP version >= 0x500 use bit 16 as clkodd.
137          * MCI IP version < 0x500 use upper 16 bits for blklen.
138          */
139         if (version >= 0x500)
140                 mr |= MMCI_BF(CLKODD, clkodd);
141         else
142                 mr |= MMCI_BF(BLKLEN, blklen);
143
144         writel(mr, &mci->mr);
145
146         /* MCI IP version >= 0x200 has blkr */
147         if (version >= 0x200)
148                 writel(MMCI_BF(BLKLEN, blklen), &mci->blkr);
149
150         if (mmc->card_caps & mmc->cfg->host_caps & MMC_MODE_HS)
151                 writel(MMCI_BIT(HSMODE), &mci->cfg);
152
153         priv->initialized = 1;
154 }
155
156 /* Return the CMDR with flags for a given command and data packet */
157 static u32 mci_encode_cmd(
158         struct mmc_cmd *cmd, struct mmc_data *data, u32* error_flags)
159 {
160         u32 cmdr = 0;
161
162         /* Default Flags for Errors */
163         *error_flags |= (MMCI_BIT(DTOE) | MMCI_BIT(RDIRE) | MMCI_BIT(RENDE) |
164                 MMCI_BIT(RINDE) | MMCI_BIT(RTOE));
165
166         /* Default Flags for the Command */
167         cmdr |= MMCI_BIT(MAXLAT);
168
169         if (data) {
170                 cmdr |= MMCI_BF(TRCMD, 1);
171                 if (data->blocks > 1)
172                         cmdr |= MMCI_BF(TRTYP, 1);
173                 if (data->flags & MMC_DATA_READ)
174                         cmdr |= MMCI_BIT(TRDIR);
175         }
176
177         if (cmd->resp_type & MMC_RSP_CRC)
178                 *error_flags |= MMCI_BIT(RCRCE);
179         if (cmd->resp_type & MMC_RSP_136)
180                 cmdr |= MMCI_BF(RSPTYP, 2);
181         else if (cmd->resp_type & MMC_RSP_BUSY)
182                 cmdr |= MMCI_BF(RSPTYP, 3);
183         else if (cmd->resp_type & MMC_RSP_PRESENT)
184                 cmdr |= MMCI_BF(RSPTYP, 1);
185
186         return cmdr | MMCI_BF(CMDNB, cmd->cmdidx);
187 }
188
189 /* Entered into function pointer in mci_send_cmd */
190 static u32 mci_data_read(atmel_mci_t *mci, u32* data, u32 error_flags)
191 {
192         u32 status;
193
194         do {
195                 status = readl(&mci->sr);
196                 if (status & (error_flags | MMCI_BIT(OVRE)))
197                         goto io_fail;
198         } while (!(status & MMCI_BIT(RXRDY)));
199
200         if (status & MMCI_BIT(RXRDY)) {
201                 *data = readl(&mci->rdr);
202                 status = 0;
203         }
204 io_fail:
205         return status;
206 }
207
208 /* Entered into function pointer in mci_send_cmd */
209 static u32 mci_data_write(atmel_mci_t *mci, u32* data, u32 error_flags)
210 {
211         u32 status;
212
213         do {
214                 status = readl(&mci->sr);
215                 if (status & (error_flags | MMCI_BIT(UNRE)))
216                         goto io_fail;
217         } while (!(status & MMCI_BIT(TXRDY)));
218
219         if (status & MMCI_BIT(TXRDY)) {
220                 writel(*data, &mci->tdr);
221                 status = 0;
222         }
223 io_fail:
224         return status;
225 }
226
227 /*
228  * Entered into mmc structure during driver init
229  *
230  * Sends a command out on the bus and deals with the block data.
231  * Takes the mmc pointer, a command pointer, and an optional data pointer.
232  */
233 #ifdef CONFIG_DM_MMC
234 static int atmel_mci_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
235                               struct mmc_data *data)
236 {
237         struct atmel_mci_plat *plat = dev_get_platdata(dev);
238         struct atmel_mci_priv *priv = dev_get_priv(dev);
239         struct mmc *mmc = mmc_get_mmc_dev(dev);
240         atmel_mci_t *mci = plat->mci;
241 #else
242 static int
243 mci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
244 {
245         struct atmel_mci_priv *priv = mmc->priv;
246         atmel_mci_t *mci = priv->mci;
247 #endif
248         u32 cmdr;
249         u32 error_flags = 0;
250         u32 status;
251
252         if (!priv->initialized) {
253                 puts ("MCI not initialized!\n");
254                 return -ECOMM;
255         }
256
257         /* Figure out the transfer arguments */
258         cmdr = mci_encode_cmd(cmd, data, &error_flags);
259
260         /* For multi blocks read/write, set the block register */
261         if ((cmd->cmdidx == MMC_CMD_READ_MULTIPLE_BLOCK)
262                         || (cmd->cmdidx == MMC_CMD_WRITE_MULTIPLE_BLOCK))
263                 writel(data->blocks | MMCI_BF(BLKLEN, mmc->read_bl_len),
264                         &mci->blkr);
265
266         /* Send the command */
267         writel(cmd->cmdarg, &mci->argr);
268         writel(cmdr, &mci->cmdr);
269
270 #ifdef DEBUG
271         dump_cmd(cmdr, cmd->cmdarg, 0, "DEBUG");
272 #endif
273
274         /* Wait for the command to complete */
275         while (!((status = readl(&mci->sr)) & MMCI_BIT(CMDRDY)));
276
277         if ((status & error_flags) & MMCI_BIT(RTOE)) {
278                 dump_cmd(cmdr, cmd->cmdarg, status, "Command Time Out");
279                 return -ETIMEDOUT;
280         } else if (status & error_flags) {
281                 dump_cmd(cmdr, cmd->cmdarg, status, "Command Failed");
282                 return -ECOMM;
283         }
284
285         /* Copy the response to the response buffer */
286         if (cmd->resp_type & MMC_RSP_136) {
287                 cmd->response[0] = readl(&mci->rspr);
288                 cmd->response[1] = readl(&mci->rspr1);
289                 cmd->response[2] = readl(&mci->rspr2);
290                 cmd->response[3] = readl(&mci->rspr3);
291         } else
292                 cmd->response[0] = readl(&mci->rspr);
293
294         /* transfer all of the blocks */
295         if (data) {
296                 u32 word_count, block_count;
297                 u32* ioptr;
298                 u32 sys_blocksize, dummy, i;
299                 u32 (*mci_data_op)
300                         (atmel_mci_t *mci, u32* data, u32 error_flags);
301
302                 if (data->flags & MMC_DATA_READ) {
303                         mci_data_op = mci_data_read;
304                         sys_blocksize = mmc->read_bl_len;
305                         ioptr = (u32*)data->dest;
306                 } else {
307                         mci_data_op = mci_data_write;
308                         sys_blocksize = mmc->write_bl_len;
309                         ioptr = (u32*)data->src;
310                 }
311
312                 status = 0;
313                 for (block_count = 0;
314                                 block_count < data->blocks && !status;
315                                 block_count++) {
316                         word_count = 0;
317                         do {
318                                 status = mci_data_op(mci, ioptr, error_flags);
319                                 word_count++;
320                                 ioptr++;
321                         } while (!status && word_count < (data->blocksize/4));
322 #ifdef DEBUG
323                         if (data->flags & MMC_DATA_READ)
324                         {
325                                 u32 cnt = word_count * 4;
326                                 printf("Read Data:\n");
327                                 print_buffer(0, data->dest + cnt * block_count,
328                                              1, cnt, 0);
329                         }
330 #endif
331 #ifdef DEBUG
332                         if (!status && word_count < (sys_blocksize / 4))
333                                 printf("filling rest of block...\n");
334 #endif
335                         /* fill the rest of a full block */
336                         while (!status && word_count < (sys_blocksize / 4)) {
337                                 status = mci_data_op(mci, &dummy,
338                                         error_flags);
339                                 word_count++;
340                         }
341                         if (status) {
342                                 dump_cmd(cmdr, cmd->cmdarg, status,
343                                         "Data Transfer Failed");
344                                 return -ECOMM;
345                         }
346                 }
347
348                 /* Wait for Transfer End */
349                 i = 0;
350                 do {
351                         status = readl(&mci->sr);
352
353                         if (status & error_flags) {
354                                 dump_cmd(cmdr, cmd->cmdarg, status,
355                                         "DTIP Wait Failed");
356                                 return -ECOMM;
357                         }
358                         i++;
359                 } while ((status & MMCI_BIT(DTIP)) && i < 10000);
360                 if (status & MMCI_BIT(DTIP)) {
361                         dump_cmd(cmdr, cmd->cmdarg, status,
362                                 "XFER DTIP never unset, ignoring");
363                 }
364         }
365
366         /*
367          * After the switch command, wait for 8 clocks before the next
368          * command
369          */
370         if (cmd->cmdidx == MMC_CMD_SWITCH)
371                 udelay(8*1000000 / priv->curr_clk); /* 8 clk in us */
372
373         return 0;
374 }
375
376 #ifdef CONFIG_DM_MMC
377 static int atmel_mci_set_ios(struct udevice *dev)
378 {
379         struct atmel_mci_plat *plat = dev_get_platdata(dev);
380         struct mmc *mmc = mmc_get_mmc_dev(dev);
381         atmel_mci_t *mci = plat->mci;
382 #else
383 /* Entered into mmc structure during driver init */
384 static int mci_set_ios(struct mmc *mmc)
385 {
386         struct atmel_mci_priv *priv = mmc->priv;
387         atmel_mci_t *mci = priv->mci;
388 #endif
389         int bus_width = mmc->bus_width;
390         unsigned int version = atmel_mci_get_version(mci);
391         int busw;
392
393         /* Set the clock speed */
394 #ifdef CONFIG_DM_MMC
395         mci_set_mode(dev, mmc->clock, MMC_DEFAULT_BLKLEN);
396 #else
397         mci_set_mode(mmc, mmc->clock, MMC_DEFAULT_BLKLEN);
398 #endif
399
400         /*
401          * set the bus width and select slot for this interface
402          * there is no capability for multiple slots on the same interface yet
403          */
404         if ((version & 0xf00) >= 0x300) {
405                 switch (bus_width) {
406                 case 8:
407                         busw = 3;
408                         break;
409                 case 4:
410                         busw = 2;
411                         break;
412                 default:
413                         busw = 0;
414                         break;
415                 }
416
417                 writel(busw << 6 | MMCI_BF(SCDSEL, MCI_BUS), &mci->sdcr);
418         } else {
419                 busw = (bus_width == 4) ? 1 : 0;
420
421                 writel(busw << 7 | MMCI_BF(SCDSEL, MCI_BUS), &mci->sdcr);
422         }
423
424         return 0;
425 }
426
427 #ifdef CONFIG_DM_MMC
428 static int atmel_mci_hw_init(struct udevice *dev)
429 {
430         struct atmel_mci_plat *plat = dev_get_platdata(dev);
431         atmel_mci_t *mci = plat->mci;
432 #else
433 /* Entered into mmc structure during driver init */
434 static int mci_init(struct mmc *mmc)
435 {
436         struct atmel_mci_priv *priv = mmc->priv;
437         atmel_mci_t *mci = priv->mci;
438 #endif
439
440         /* Initialize controller */
441         writel(MMCI_BIT(SWRST), &mci->cr);      /* soft reset */
442         writel(MMCI_BIT(PWSDIS), &mci->cr);     /* disable power save */
443         writel(MMCI_BIT(MCIEN), &mci->cr);      /* enable mci */
444         writel(MMCI_BF(SCDSEL, MCI_BUS), &mci->sdcr);   /* select port */
445
446         /* This delay can be optimized, but stick with max value */
447         writel(0x7f, &mci->dtor);
448         /* Disable Interrupts */
449         writel(~0UL, &mci->idr);
450
451         /* Set default clocks and blocklen */
452 #ifdef CONFIG_DM_MMC
453         mci_set_mode(dev, CONFIG_SYS_MMC_CLK_OD, MMC_DEFAULT_BLKLEN);
454 #else
455         mci_set_mode(mmc, CONFIG_SYS_MMC_CLK_OD, MMC_DEFAULT_BLKLEN);
456 #endif
457
458         return 0;
459 }
460
461 #ifndef CONFIG_DM_MMC
462 static const struct mmc_ops atmel_mci_ops = {
463         .send_cmd       = mci_send_cmd,
464         .set_ios        = mci_set_ios,
465         .init           = mci_init,
466 };
467
468 /*
469  * This is the only exported function
470  *
471  * Call it with the MCI register base address
472  */
473 int atmel_mci_init(void *regs)
474 {
475         struct mmc *mmc;
476         struct mmc_config *cfg;
477         struct atmel_mci_priv *priv;
478         unsigned int version;
479
480         priv = calloc(1, sizeof(*priv));
481         if (!priv)
482                 return -ENOMEM;
483
484         cfg = &priv->cfg;
485
486         cfg->name = "mci";
487         cfg->ops = &atmel_mci_ops;
488
489         priv->mci = (struct atmel_mci *)regs;
490         priv->initialized = 0;
491
492         /* need to be able to pass these in on a board by board basis */
493         cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
494         version = atmel_mci_get_version(priv->mci);
495         if ((version & 0xf00) >= 0x300) {
496                 cfg->host_caps = MMC_MODE_8BIT;
497                 cfg->host_caps |= MMC_MODE_HS | MMC_MODE_HS_52MHz;
498         }
499
500         cfg->host_caps |= MMC_MODE_4BIT;
501
502         /*
503          * min and max frequencies determined by
504          * max and min of clock divider
505          */
506         cfg->f_min = get_mci_clk_rate() / (2*256);
507         cfg->f_max = get_mci_clk_rate() / (2*1);
508
509         cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
510
511         mmc = mmc_create(cfg, priv);
512
513         if (mmc == NULL) {
514                 free(priv);
515                 return -ENODEV;
516         }
517         /* NOTE: possibly leaking the priv structure */
518
519         return 0;
520 }
521 #endif
522
523 #ifdef CONFIG_DM_MMC
524 static const struct dm_mmc_ops atmel_mci_mmc_ops = {
525         .send_cmd = atmel_mci_send_cmd,
526         .set_ios = atmel_mci_set_ios,
527 };
528
529 static void atmel_mci_setup_cfg(struct udevice *dev)
530 {
531         struct atmel_mci_plat *plat = dev_get_platdata(dev);
532         struct atmel_mci_priv *priv = dev_get_priv(dev);
533         struct mmc_config *cfg;
534         u32 version;
535
536         cfg = &plat->cfg;
537         cfg->name = "Atmel mci";
538         cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
539
540         /*
541          * If the version is above 3.0, the capabilities of the 8-bit
542          * bus width and high speed are supported.
543          */
544         version = atmel_mci_get_version(plat->mci);
545         if ((version & 0xf00) >= 0x300) {
546                 cfg->host_caps = MMC_MODE_8BIT |
547                                  MMC_MODE_HS | MMC_MODE_HS_52MHz;
548         }
549
550         cfg->host_caps |= MMC_MODE_4BIT;
551         cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
552         cfg->f_min = priv->bus_clk_rate / (2 * 256);
553         cfg->f_max = priv->bus_clk_rate / 2;
554 }
555
556 static int atmel_mci_enable_clk(struct udevice *dev)
557 {
558         struct atmel_mci_priv *priv = dev_get_priv(dev);
559         struct clk clk;
560         ulong clk_rate;
561         int ret = 0;
562
563         ret = clk_get_by_index(dev, 0, &clk);
564         if (ret) {
565                 ret = -EINVAL;
566                 goto failed;
567         }
568
569         ret = clk_enable(&clk);
570         if (ret)
571                 goto failed;
572
573         clk_rate = clk_get_rate(&clk);
574         if (!clk_rate) {
575                 ret = -EINVAL;
576                 goto failed;
577         }
578
579         priv->bus_clk_rate = clk_rate;
580
581 failed:
582         clk_free(&clk);
583
584         return ret;
585 }
586
587 static int atmel_mci_probe(struct udevice *dev)
588 {
589         struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
590         struct atmel_mci_plat *plat = dev_get_platdata(dev);
591         struct mmc *mmc;
592         int ret;
593
594         ret = atmel_mci_enable_clk(dev);
595         if (ret)
596                 return ret;
597
598         plat->mci = (struct atmel_mci *)devfdt_get_addr_ptr(dev);
599
600         atmel_mci_setup_cfg(dev);
601
602         mmc = &plat->mmc;
603         mmc->cfg = &plat->cfg;
604         mmc->dev = dev;
605         upriv->mmc = mmc;
606
607         atmel_mci_hw_init(dev);
608
609         return 0;
610 }
611
612 static int atmel_mci_bind(struct udevice *dev)
613 {
614         struct atmel_mci_plat *plat = dev_get_platdata(dev);
615
616         return mmc_bind(dev, &plat->mmc, &plat->cfg);
617 }
618
619 static const struct udevice_id atmel_mci_ids[] = {
620         { .compatible = "atmel,hsmci" },
621         { }
622 };
623
624 U_BOOT_DRIVER(atmel_mci) = {
625         .name = "atmel-mci",
626         .id = UCLASS_MMC,
627         .of_match = atmel_mci_ids,
628         .bind = atmel_mci_bind,
629         .probe = atmel_mci_probe,
630         .platdata_auto_alloc_size = sizeof(struct atmel_mci_plat),
631         .priv_auto_alloc_size = sizeof(struct atmel_mci_priv),
632         .ops = &atmel_mci_mmc_ops,
633 };
634 #endif