Merge tag 'u-boot-amlogic-20220809' of https://source.denx.de/u-boot/custodians/u...
[platform/kernel/u-boot.git] / drivers / mmc / fsl_esdhc.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright 2007, 2010-2011 Freescale Semiconductor, Inc
4  * Copyright 2019-2021 NXP
5  * Andy Fleming
6  *
7  * Based vaguely on the pxa mmc code:
8  * (C) Copyright 2003
9  * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net
10  */
11
12 #include <config.h>
13 #include <common.h>
14 #include <command.h>
15 #include <cpu_func.h>
16 #include <errno.h>
17 #include <hwconfig.h>
18 #include <mmc.h>
19 #include <part.h>
20 #include <malloc.h>
21 #include <fsl_esdhc.h>
22 #include <fdt_support.h>
23 #include <asm/cache.h>
24 #include <asm/global_data.h>
25 #include <asm/io.h>
26 #include <dm.h>
27 #include <dm/device_compat.h>
28 #include <linux/bitops.h>
29 #include <linux/delay.h>
30 #include <linux/iopoll.h>
31 #include <linux/dma-mapping.h>
32 #include <sdhci.h>
33 #include "../../board/freescale/common/qixis.h"
34
35 DECLARE_GLOBAL_DATA_PTR;
36
37 struct fsl_esdhc {
38         uint    dsaddr;         /* SDMA system address register */
39         uint    blkattr;        /* Block attributes register */
40         uint    cmdarg;         /* Command argument register */
41         uint    xfertyp;        /* Transfer type register */
42         uint    cmdrsp0;        /* Command response 0 register */
43         uint    cmdrsp1;        /* Command response 1 register */
44         uint    cmdrsp2;        /* Command response 2 register */
45         uint    cmdrsp3;        /* Command response 3 register */
46         uint    datport;        /* Buffer data port register */
47         uint    prsstat;        /* Present state register */
48         uint    proctl;         /* Protocol control register */
49         uint    sysctl;         /* System Control Register */
50         uint    irqstat;        /* Interrupt status register */
51         uint    irqstaten;      /* Interrupt status enable register */
52         uint    irqsigen;       /* Interrupt signal enable register */
53         uint    autoc12err;     /* Auto CMD error status register */
54         uint    hostcapblt;     /* Host controller capabilities register */
55         uint    wml;            /* Watermark level register */
56         char    reserved1[8];   /* reserved */
57         uint    fevt;           /* Force event register */
58         uint    admaes;         /* ADMA error status register */
59         uint    adsaddrl;       /* ADMA system address low register */
60         uint    adsaddrh;       /* ADMA system address high register */
61         char    reserved2[156];
62         uint    hostver;        /* Host controller version register */
63         char    reserved3[4];   /* reserved */
64         uint    dmaerraddr;     /* DMA error address register */
65         char    reserved4[4];   /* reserved */
66         uint    dmaerrattr;     /* DMA error attribute register */
67         char    reserved5[4];   /* reserved */
68         uint    hostcapblt2;    /* Host controller capabilities register 2 */
69         char    reserved6[8];   /* reserved */
70         uint    tbctl;          /* Tuning block control register */
71         char    reserved7[32];  /* reserved */
72         uint    sdclkctl;       /* SD clock control register */
73         uint    sdtimingctl;    /* SD timing control register */
74         char    reserved8[20];  /* reserved */
75         uint    dllcfg0;        /* DLL config 0 register */
76         uint    dllcfg1;        /* DLL config 1 register */
77         char    reserved9[8];   /* reserved */
78         uint    dllstat0;       /* DLL status 0 register */
79         char    reserved10[664];/* reserved */
80         uint    esdhcctl;       /* eSDHC control register */
81 };
82
83 struct fsl_esdhc_plat {
84         struct mmc_config cfg;
85         struct mmc mmc;
86 };
87
88 /**
89  * struct fsl_esdhc_priv
90  *
91  * @esdhc_regs: registers of the sdhc controller
92  * @sdhc_clk: Current clk of the sdhc controller
93  * @bus_width: bus width, 1bit, 4bit or 8bit
94  * @cfg: mmc config
95  * @mmc: mmc
96  * Following is used when Driver Model is enabled for MMC
97  * @dev: pointer for the device
98  * @cd_gpio: gpio for card detection
99  * @wp_gpio: gpio for write protection
100  */
101 struct fsl_esdhc_priv {
102         struct fsl_esdhc *esdhc_regs;
103         unsigned int sdhc_clk;
104         bool is_sdhc_per_clk;
105         unsigned int clock;
106 #if !CONFIG_IS_ENABLED(DM_MMC)
107         struct mmc *mmc;
108 #endif
109         struct udevice *dev;
110         struct sdhci_adma_desc *adma_desc_table;
111         dma_addr_t dma_addr;
112 };
113
114 /* Return the XFERTYP flags for a given command and data packet */
115 static uint esdhc_xfertyp(struct mmc_cmd *cmd, struct mmc_data *data)
116 {
117         uint xfertyp = 0;
118
119         if (data) {
120                 xfertyp |= XFERTYP_DPSEL;
121                 if (!IS_ENABLED(CONFIG_SYS_FSL_ESDHC_USE_PIO) &&
122                     cmd->cmdidx != MMC_CMD_SEND_TUNING_BLOCK &&
123                     cmd->cmdidx != MMC_CMD_SEND_TUNING_BLOCK_HS200)
124                         xfertyp |= XFERTYP_DMAEN;
125                 if (data->blocks > 1) {
126                         xfertyp |= XFERTYP_MSBSEL;
127                         xfertyp |= XFERTYP_BCEN;
128                         if (IS_ENABLED(CONFIG_SYS_FSL_ERRATUM_ESDHC111))
129                                 xfertyp |= XFERTYP_AC12EN;
130                 }
131
132                 if (data->flags & MMC_DATA_READ)
133                         xfertyp |= XFERTYP_DTDSEL;
134         }
135
136         if (cmd->resp_type & MMC_RSP_CRC)
137                 xfertyp |= XFERTYP_CCCEN;
138         if (cmd->resp_type & MMC_RSP_OPCODE)
139                 xfertyp |= XFERTYP_CICEN;
140         if (cmd->resp_type & MMC_RSP_136)
141                 xfertyp |= XFERTYP_RSPTYP_136;
142         else if (cmd->resp_type & MMC_RSP_BUSY)
143                 xfertyp |= XFERTYP_RSPTYP_48_BUSY;
144         else if (cmd->resp_type & MMC_RSP_PRESENT)
145                 xfertyp |= XFERTYP_RSPTYP_48;
146
147         if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION)
148                 xfertyp |= XFERTYP_CMDTYP_ABORT;
149
150         return XFERTYP_CMD(cmd->cmdidx) | xfertyp;
151 }
152
153 /*
154  * PIO Read/Write Mode reduce the performace as DMA is not used in this mode.
155  */
156 static void esdhc_pio_read_write(struct fsl_esdhc_priv *priv,
157                                  struct mmc_data *data)
158 {
159         struct fsl_esdhc *regs = priv->esdhc_regs;
160         uint blocks;
161         char *buffer;
162         uint databuf;
163         uint size;
164         uint irqstat;
165         ulong start;
166
167         if (data->flags & MMC_DATA_READ) {
168                 blocks = data->blocks;
169                 buffer = data->dest;
170                 while (blocks) {
171                         start = get_timer(0);
172                         size = data->blocksize;
173                         irqstat = esdhc_read32(&regs->irqstat);
174                         while (!(esdhc_read32(&regs->prsstat) & PRSSTAT_BREN)) {
175                                 if (get_timer(start) > PIO_TIMEOUT) {
176                                         printf("\nData Read Failed in PIO Mode.");
177                                         return;
178                                 }
179                         }
180                         while (size && (!(irqstat & IRQSTAT_TC))) {
181                                 udelay(100); /* Wait before last byte transfer complete */
182                                 irqstat = esdhc_read32(&regs->irqstat);
183                                 databuf = in_le32(&regs->datport);
184                                 *((uint *)buffer) = databuf;
185                                 buffer += 4;
186                                 size -= 4;
187                         }
188                         blocks--;
189                 }
190         } else {
191                 blocks = data->blocks;
192                 buffer = (char *)data->src;
193                 while (blocks) {
194                         start = get_timer(0);
195                         size = data->blocksize;
196                         irqstat = esdhc_read32(&regs->irqstat);
197                         while (!(esdhc_read32(&regs->prsstat) & PRSSTAT_BWEN)) {
198                                 if (get_timer(start) > PIO_TIMEOUT) {
199                                         printf("\nData Write Failed in PIO Mode.");
200                                         return;
201                                 }
202                         }
203                         while (size && (!(irqstat & IRQSTAT_TC))) {
204                                 udelay(100); /* Wait before last byte transfer complete */
205                                 databuf = *((uint *)buffer);
206                                 buffer += 4;
207                                 size -= 4;
208                                 irqstat = esdhc_read32(&regs->irqstat);
209                                 out_le32(&regs->datport, databuf);
210                         }
211                         blocks--;
212                 }
213         }
214 }
215
216 static void esdhc_setup_watermark_level(struct fsl_esdhc_priv *priv,
217                                         struct mmc_data *data)
218 {
219         struct fsl_esdhc *regs = priv->esdhc_regs;
220         uint wml_value = data->blocksize / 4;
221
222         if (data->flags & MMC_DATA_READ) {
223                 if (wml_value > WML_RD_WML_MAX)
224                         wml_value = WML_RD_WML_MAX_VAL;
225
226                 esdhc_clrsetbits32(&regs->wml, WML_RD_WML_MASK, wml_value);
227         } else {
228                 if (wml_value > WML_WR_WML_MAX)
229                         wml_value = WML_WR_WML_MAX_VAL;
230
231                 esdhc_clrsetbits32(&regs->wml, WML_WR_WML_MASK,
232                                    wml_value << 16);
233         }
234 }
235
236 static void esdhc_setup_dma(struct fsl_esdhc_priv *priv, struct mmc_data *data)
237 {
238         uint trans_bytes = data->blocksize * data->blocks;
239         struct fsl_esdhc *regs = priv->esdhc_regs;
240         phys_addr_t adma_addr;
241         void *buf;
242
243         if (data->flags & MMC_DATA_WRITE)
244                 buf = (void *)data->src;
245         else
246                 buf = data->dest;
247
248         priv->dma_addr = dma_map_single(buf, trans_bytes,
249                                         mmc_get_dma_dir(data));
250
251         if (IS_ENABLED(CONFIG_FSL_ESDHC_SUPPORT_ADMA2) &&
252             priv->adma_desc_table) {
253                 debug("Using ADMA2\n");
254                 /* prefer ADMA2 if it is available */
255                 sdhci_prepare_adma_table(priv->adma_desc_table, data,
256                                          priv->dma_addr);
257
258                 adma_addr = virt_to_phys(priv->adma_desc_table);
259                 esdhc_write32(&regs->adsaddrl, lower_32_bits(adma_addr));
260                 if (IS_ENABLED(CONFIG_DMA_ADDR_T_64BIT))
261                         esdhc_write32(&regs->adsaddrh, upper_32_bits(adma_addr));
262                 esdhc_clrsetbits32(&regs->proctl, PROCTL_DMAS_MASK,
263                                    PROCTL_DMAS_ADMA2);
264         } else {
265                 debug("Using SDMA\n");
266                 if (upper_32_bits(priv->dma_addr))
267                         printf("Cannot use 64 bit addresses with SDMA\n");
268                 esdhc_write32(&regs->dsaddr, lower_32_bits(priv->dma_addr));
269                 esdhc_clrsetbits32(&regs->proctl, PROCTL_DMAS_MASK,
270                                    PROCTL_DMAS_SDMA);
271         }
272
273         esdhc_write32(&regs->blkattr, data->blocks << 16 | data->blocksize);
274 }
275
276 static int esdhc_setup_data(struct fsl_esdhc_priv *priv, struct mmc *mmc,
277                             struct mmc_data *data)
278 {
279         int timeout;
280         bool is_write = data->flags & MMC_DATA_WRITE;
281         struct fsl_esdhc *regs = priv->esdhc_regs;
282
283         if (is_write && !(esdhc_read32(&regs->prsstat) & PRSSTAT_WPSPL)) {
284                 printf("Can not write to locked SD card.\n");
285                 return -EINVAL;
286         }
287
288         if (IS_ENABLED(CONFIG_SYS_FSL_ESDHC_USE_PIO))
289                 esdhc_setup_watermark_level(priv, data);
290         else
291                 esdhc_setup_dma(priv, data);
292
293         /* Calculate the timeout period for data transactions */
294         /*
295          * 1)Timeout period = (2^(timeout+13)) SD Clock cycles
296          * 2)Timeout period should be minimum 0.250sec as per SD Card spec
297          *  So, Number of SD Clock cycles for 0.25sec should be minimum
298          *              (SD Clock/sec * 0.25 sec) SD Clock cycles
299          *              = (mmc->clock * 1/4) SD Clock cycles
300          * As 1) >=  2)
301          * => (2^(timeout+13)) >= mmc->clock * 1/4
302          * Taking log2 both the sides
303          * => timeout + 13 >= log2(mmc->clock/4)
304          * Rounding up to next power of 2
305          * => timeout + 13 = log2(mmc->clock/4) + 1
306          * => timeout + 13 = fls(mmc->clock/4)
307          *
308          * However, the MMC spec "It is strongly recommended for hosts to
309          * implement more than 500ms timeout value even if the card
310          * indicates the 250ms maximum busy length."  Even the previous
311          * value of 300ms is known to be insufficient for some cards.
312          * So, we use
313          * => timeout + 13 = fls(mmc->clock/2)
314          */
315         timeout = fls(mmc->clock/2);
316         timeout -= 13;
317
318         if (timeout > 14)
319                 timeout = 14;
320
321         if (timeout < 0)
322                 timeout = 0;
323
324         if (IS_ENABLED(CONFIG_SYS_FSL_ERRATUM_ESDHC_A001) &&
325             (timeout == 4 || timeout == 8 || timeout == 12))
326                 timeout++;
327
328         if (IS_ENABLED(ESDHCI_QUIRK_BROKEN_TIMEOUT_VALUE))
329                 timeout = 0xE;
330
331         esdhc_clrsetbits32(&regs->sysctl, SYSCTL_TIMEOUT_MASK, timeout << 16);
332
333         return 0;
334 }
335
336 /*
337  * Sends a command out on the bus.  Takes the mmc pointer,
338  * a command pointer, and an optional data pointer.
339  */
340 static int esdhc_send_cmd_common(struct fsl_esdhc_priv *priv, struct mmc *mmc,
341                                  struct mmc_cmd *cmd, struct mmc_data *data)
342 {
343         int     err = 0;
344         uint    xfertyp;
345         uint    irqstat;
346         u32     flags = IRQSTAT_CC | IRQSTAT_CTOE;
347         struct fsl_esdhc *regs = priv->esdhc_regs;
348         unsigned long start;
349
350         if (IS_ENABLED(CONFIG_SYS_FSL_ERRATUM_ESDHC111) &&
351             cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION)
352                 return 0;
353
354         esdhc_write32(&regs->irqstat, -1);
355
356         sync();
357
358         /* Wait for the bus to be idle */
359         while ((esdhc_read32(&regs->prsstat) & PRSSTAT_CICHB) ||
360                         (esdhc_read32(&regs->prsstat) & PRSSTAT_CIDHB))
361                 ;
362
363         while (esdhc_read32(&regs->prsstat) & PRSSTAT_DLA)
364                 ;
365
366         /* Set up for a data transfer if we have one */
367         if (data) {
368                 err = esdhc_setup_data(priv, mmc, data);
369                 if(err)
370                         return err;
371         }
372
373         /* Figure out the transfer arguments */
374         xfertyp = esdhc_xfertyp(cmd, data);
375
376         /* Mask all irqs */
377         esdhc_write32(&regs->irqsigen, 0);
378
379         /* Send the command */
380         esdhc_write32(&regs->cmdarg, cmd->cmdarg);
381         esdhc_write32(&regs->xfertyp, xfertyp);
382
383         if (cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK ||
384             cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK_HS200)
385                 flags = IRQSTAT_BRR;
386
387         /* Wait for the command to complete */
388         start = get_timer(0);
389         while (!(esdhc_read32(&regs->irqstat) & flags)) {
390                 if (get_timer(start) > 1000) {
391                         err = -ETIMEDOUT;
392                         goto out;
393                 }
394         }
395
396         irqstat = esdhc_read32(&regs->irqstat);
397
398         if (irqstat & CMD_ERR) {
399                 err = -ECOMM;
400                 goto out;
401         }
402
403         if (irqstat & IRQSTAT_CTOE) {
404                 err = -ETIMEDOUT;
405                 goto out;
406         }
407
408         /* Workaround for ESDHC errata ENGcm03648 */
409         if (!data && (cmd->resp_type & MMC_RSP_BUSY)) {
410                 int timeout = 6000;
411
412                 /* Poll on DATA0 line for cmd with busy signal for 600 ms */
413                 while (timeout > 0 && !(esdhc_read32(&regs->prsstat) &
414                                         PRSSTAT_DAT0)) {
415                         udelay(100);
416                         timeout--;
417                 }
418
419                 if (timeout <= 0) {
420                         printf("Timeout waiting for DAT0 to go high!\n");
421                         err = -ETIMEDOUT;
422                         goto out;
423                 }
424         }
425
426         /* Copy the response to the response buffer */
427         if (cmd->resp_type & MMC_RSP_136) {
428                 u32 cmdrsp3, cmdrsp2, cmdrsp1, cmdrsp0;
429
430                 cmdrsp3 = esdhc_read32(&regs->cmdrsp3);
431                 cmdrsp2 = esdhc_read32(&regs->cmdrsp2);
432                 cmdrsp1 = esdhc_read32(&regs->cmdrsp1);
433                 cmdrsp0 = esdhc_read32(&regs->cmdrsp0);
434                 cmd->response[0] = (cmdrsp3 << 8) | (cmdrsp2 >> 24);
435                 cmd->response[1] = (cmdrsp2 << 8) | (cmdrsp1 >> 24);
436                 cmd->response[2] = (cmdrsp1 << 8) | (cmdrsp0 >> 24);
437                 cmd->response[3] = (cmdrsp0 << 8);
438         } else
439                 cmd->response[0] = esdhc_read32(&regs->cmdrsp0);
440
441         /* Wait until all of the blocks are transferred */
442         if (data) {
443                 if (IS_ENABLED(CONFIG_SYS_FSL_ESDHC_USE_PIO)) {
444                         esdhc_pio_read_write(priv, data);
445                 } else {
446                         flags = DATA_COMPLETE;
447                         if (cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK ||
448                             cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK_HS200)
449                                 flags = IRQSTAT_BRR;
450
451                         do {
452                                 irqstat = esdhc_read32(&regs->irqstat);
453
454                                 if (irqstat & IRQSTAT_DTOE) {
455                                         err = -ETIMEDOUT;
456                                         goto out;
457                                 }
458
459                                 if (irqstat & DATA_ERR) {
460                                         err = -ECOMM;
461                                         goto out;
462                                 }
463                         } while ((irqstat & flags) != flags);
464
465                         /*
466                          * Need invalidate the dcache here again to avoid any
467                          * cache-fill during the DMA operations such as the
468                          * speculative pre-fetching etc.
469                          */
470                         dma_unmap_single(priv->dma_addr,
471                                          data->blocks * data->blocksize,
472                                          mmc_get_dma_dir(data));
473                 }
474         }
475
476 out:
477         /* Reset CMD and DATA portions on error */
478         if (err) {
479                 esdhc_write32(&regs->sysctl, esdhc_read32(&regs->sysctl) |
480                               SYSCTL_RSTC);
481                 while (esdhc_read32(&regs->sysctl) & SYSCTL_RSTC)
482                         ;
483
484                 if (data) {
485                         esdhc_write32(&regs->sysctl,
486                                       esdhc_read32(&regs->sysctl) |
487                                       SYSCTL_RSTD);
488                         while ((esdhc_read32(&regs->sysctl) & SYSCTL_RSTD))
489                                 ;
490                 }
491         }
492
493         esdhc_write32(&regs->irqstat, -1);
494
495         return err;
496 }
497
498 static void set_sysctl(struct fsl_esdhc_priv *priv, struct mmc *mmc, uint clock)
499 {
500         struct fsl_esdhc *regs = priv->esdhc_regs;
501         int div = 1;
502         int pre_div = 2;
503         unsigned int sdhc_clk = priv->sdhc_clk;
504         u32 time_out;
505         u32 value;
506         uint clk;
507         u32 hostver;
508
509         if (clock < mmc->cfg->f_min)
510                 clock = mmc->cfg->f_min;
511
512         while (sdhc_clk / (16 * pre_div) > clock && pre_div < 256)
513                 pre_div *= 2;
514
515         while (sdhc_clk / (div * pre_div) > clock && div < 16)
516                 div++;
517
518         if (IS_ENABLED(CONFIG_SYS_FSL_ERRATUM_A011334) &&
519             clock == 200000000 && mmc->selected_mode == MMC_HS_400) {
520                 u32 div_ratio = pre_div * div;
521
522                 if (div_ratio <= 4) {
523                         pre_div = 4;
524                         div = 1;
525                 } else if (div_ratio <= 8) {
526                         pre_div = 4;
527                         div = 2;
528                 } else if (div_ratio <= 12) {
529                         pre_div = 4;
530                         div = 3;
531                 } else {
532                         printf("unsupported clock division.\n");
533                 }
534         }
535
536         mmc->clock = sdhc_clk / pre_div / div;
537         priv->clock = mmc->clock;
538
539         pre_div >>= 1;
540         div -= 1;
541
542         clk = (pre_div << 8) | (div << 4);
543
544         esdhc_clrbits32(&regs->sysctl, SYSCTL_CKEN);
545
546         esdhc_clrsetbits32(&regs->sysctl, SYSCTL_CLOCK_MASK, clk);
547
548         /* Only newer eSDHC controllers set PRSSTAT_SDSTB flag */
549         hostver = esdhc_read32(&priv->esdhc_regs->hostver);
550         if (HOSTVER_VENDOR(hostver) <= VENDOR_V_22) {
551                 udelay(10000);
552                 esdhc_setbits32(&regs->sysctl, SYSCTL_PEREN | SYSCTL_CKEN);
553                 return;
554         }
555
556         time_out = 20;
557         value = PRSSTAT_SDSTB;
558         while (!(esdhc_read32(&regs->prsstat) & value)) {
559                 if (time_out == 0) {
560                         printf("fsl_esdhc: Internal clock never stabilised.\n");
561                         break;
562                 }
563                 time_out--;
564                 mdelay(1);
565         }
566
567         esdhc_setbits32(&regs->sysctl, SYSCTL_PEREN | SYSCTL_CKEN);
568 }
569
570 static void esdhc_clock_control(struct fsl_esdhc_priv *priv, bool enable)
571 {
572         struct fsl_esdhc *regs = priv->esdhc_regs;
573         u32 value;
574         u32 time_out;
575         u32 hostver;
576
577         value = esdhc_read32(&regs->sysctl);
578
579         if (enable)
580                 value |= SYSCTL_CKEN;
581         else
582                 value &= ~SYSCTL_CKEN;
583
584         esdhc_write32(&regs->sysctl, value);
585
586         /* Only newer eSDHC controllers set PRSSTAT_SDSTB flag */
587         hostver = esdhc_read32(&priv->esdhc_regs->hostver);
588         if (HOSTVER_VENDOR(hostver) <= VENDOR_V_22) {
589                 udelay(10000);
590                 return;
591         }
592
593         time_out = 20;
594         value = PRSSTAT_SDSTB;
595         while (!(esdhc_read32(&regs->prsstat) & value)) {
596                 if (time_out == 0) {
597                         printf("fsl_esdhc: Internal clock never stabilised.\n");
598                         break;
599                 }
600                 time_out--;
601                 mdelay(1);
602         }
603 }
604
605 static void esdhc_flush_async_fifo(struct fsl_esdhc_priv *priv)
606 {
607         struct fsl_esdhc *regs = priv->esdhc_regs;
608         u32 time_out;
609
610         esdhc_setbits32(&regs->esdhcctl, ESDHCCTL_FAF);
611
612         time_out = 20;
613         while (esdhc_read32(&regs->esdhcctl) & ESDHCCTL_FAF) {
614                 if (time_out == 0) {
615                         printf("fsl_esdhc: Flush asynchronous FIFO timeout.\n");
616                         break;
617                 }
618                 time_out--;
619                 mdelay(1);
620         }
621 }
622
623 static void esdhc_tuning_block_enable(struct fsl_esdhc_priv *priv,
624                                       bool en)
625 {
626         struct fsl_esdhc *regs = priv->esdhc_regs;
627
628         esdhc_clock_control(priv, false);
629         esdhc_flush_async_fifo(priv);
630         if (en)
631                 esdhc_setbits32(&regs->tbctl, TBCTL_TB_EN);
632         else
633                 esdhc_clrbits32(&regs->tbctl, TBCTL_TB_EN);
634         esdhc_clock_control(priv, true);
635 }
636
637 static void esdhc_exit_hs400(struct fsl_esdhc_priv *priv)
638 {
639         struct fsl_esdhc *regs = priv->esdhc_regs;
640
641         esdhc_clrbits32(&regs->sdtimingctl, FLW_CTL_BG);
642         esdhc_clrbits32(&regs->sdclkctl, CMD_CLK_CTL);
643
644         esdhc_clock_control(priv, false);
645         esdhc_clrbits32(&regs->tbctl, HS400_MODE);
646         esdhc_clock_control(priv, true);
647
648         esdhc_clrbits32(&regs->dllcfg0, DLL_FREQ_SEL | DLL_ENABLE);
649         esdhc_clrbits32(&regs->tbctl, HS400_WNDW_ADJUST);
650
651         esdhc_tuning_block_enable(priv, false);
652 }
653
654 static int esdhc_set_timing(struct fsl_esdhc_priv *priv, enum bus_mode mode)
655 {
656         struct fsl_esdhc *regs = priv->esdhc_regs;
657         ulong start;
658         u32 val;
659
660         /* Exit HS400 mode before setting any other mode */
661         if (esdhc_read32(&regs->tbctl) & HS400_MODE &&
662             mode != MMC_HS_400)
663                 esdhc_exit_hs400(priv);
664
665         esdhc_clock_control(priv, false);
666
667         if (mode == MMC_HS_200)
668                 esdhc_clrsetbits32(&regs->autoc12err, UHSM_MASK,
669                                    UHSM_SDR104_HS200);
670         if (mode == MMC_HS_400) {
671                 esdhc_setbits32(&regs->tbctl, HS400_MODE);
672                 esdhc_setbits32(&regs->sdclkctl, CMD_CLK_CTL);
673                 esdhc_clock_control(priv, true);
674
675                 if (priv->clock == 200000000)
676                         esdhc_setbits32(&regs->dllcfg0, DLL_FREQ_SEL);
677
678                 esdhc_setbits32(&regs->dllcfg0, DLL_ENABLE);
679
680                 esdhc_setbits32(&regs->dllcfg0, DLL_RESET);
681                 udelay(1);
682                 esdhc_clrbits32(&regs->dllcfg0, DLL_RESET);
683
684                 start = get_timer(0);
685                 val = DLL_STS_SLV_LOCK;
686                 while (!(esdhc_read32(&regs->dllstat0) & val)) {
687                         if (get_timer(start) > 1000) {
688                                 printf("fsl_esdhc: delay chain lock timeout\n");
689                                 return -ETIMEDOUT;
690                         }
691                 }
692
693                 esdhc_setbits32(&regs->tbctl, HS400_WNDW_ADJUST);
694
695                 esdhc_clock_control(priv, false);
696                 esdhc_flush_async_fifo(priv);
697         }
698         esdhc_clock_control(priv, true);
699         return 0;
700 }
701
702 static int esdhc_set_ios_common(struct fsl_esdhc_priv *priv, struct mmc *mmc)
703 {
704         struct fsl_esdhc *regs = priv->esdhc_regs;
705         int ret;
706
707         if (priv->is_sdhc_per_clk) {
708                 /* Select to use peripheral clock */
709                 esdhc_clock_control(priv, false);
710                 esdhc_setbits32(&regs->esdhcctl, ESDHCCTL_PCS);
711                 esdhc_clock_control(priv, true);
712         }
713
714         if (mmc->selected_mode == MMC_HS_400)
715                 esdhc_tuning_block_enable(priv, true);
716
717         /* Set the clock speed */
718         if (priv->clock != mmc->clock)
719                 set_sysctl(priv, mmc, mmc->clock);
720
721         /* Set timing */
722         ret = esdhc_set_timing(priv, mmc->selected_mode);
723         if (ret)
724                 return ret;
725
726         /* Set the bus width */
727         esdhc_clrbits32(&regs->proctl, PROCTL_DTW_4 | PROCTL_DTW_8);
728
729         if (mmc->bus_width == 4)
730                 esdhc_setbits32(&regs->proctl, PROCTL_DTW_4);
731         else if (mmc->bus_width == 8)
732                 esdhc_setbits32(&regs->proctl, PROCTL_DTW_8);
733
734         return 0;
735 }
736
737 static void esdhc_enable_cache_snooping(struct fsl_esdhc *regs)
738 {
739 #ifdef CONFIG_ARCH_MPC830X
740         immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
741         sysconf83xx_t *sysconf = &immr->sysconf;
742
743         setbits_be32(&sysconf->sdhccr, 0x02000000);
744 #else
745         esdhc_write32(&regs->esdhcctl, ESDHCCTL_SNOOP);
746 #endif
747 }
748
749 static int esdhc_init_common(struct fsl_esdhc_priv *priv, struct mmc *mmc)
750 {
751         struct fsl_esdhc *regs = priv->esdhc_regs;
752         ulong start;
753
754         /* Reset the entire host controller */
755         esdhc_setbits32(&regs->sysctl, SYSCTL_RSTA);
756
757         /* Wait until the controller is available */
758         start = get_timer(0);
759         while ((esdhc_read32(&regs->sysctl) & SYSCTL_RSTA)) {
760                 if (get_timer(start) > 1000)
761                         return -ETIMEDOUT;
762         }
763
764         /* Clean TBCTL[TB_EN] which is not able to be reset by reset all */
765         esdhc_clrbits32(&regs->tbctl, TBCTL_TB_EN);
766
767         esdhc_enable_cache_snooping(regs);
768
769         esdhc_setbits32(&regs->sysctl, SYSCTL_HCKEN | SYSCTL_IPGEN);
770
771         /* Set the initial clock speed */
772         set_sysctl(priv, mmc, 400000);
773
774         /* Disable the BRR and BWR bits in IRQSTAT */
775         esdhc_clrbits32(&regs->irqstaten, IRQSTATEN_BRR | IRQSTATEN_BWR);
776
777         /* Put the PROCTL reg back to the default */
778         esdhc_write32(&regs->proctl, PROCTL_INIT);
779
780         /* Set timout to the maximum value */
781         esdhc_clrsetbits32(&regs->sysctl, SYSCTL_TIMEOUT_MASK, 14 << 16);
782
783         if (IS_ENABLED(CONFIG_SYS_FSL_ESDHC_UNRELIABLE_PULSE_DETECTION_WORKAROUND))
784                 esdhc_clrbits32(&regs->dllcfg1, DLL_PD_PULSE_STRETCH_SEL);
785
786         return 0;
787 }
788
789 static int esdhc_getcd_common(struct fsl_esdhc_priv *priv)
790 {
791         struct fsl_esdhc *regs = priv->esdhc_regs;
792
793 #ifdef CONFIG_ESDHC_DETECT_QUIRK
794         if (qixis_esdhc_detect_quirk())
795                 return 1;
796 #endif
797         if (esdhc_read32(&regs->prsstat) & PRSSTAT_CINS)
798                 return 1;
799
800         return 0;
801 }
802
803 static void fsl_esdhc_get_cfg_common(struct fsl_esdhc_priv *priv,
804                                      struct mmc_config *cfg)
805 {
806         struct fsl_esdhc *regs = priv->esdhc_regs;
807         u32 caps;
808
809         caps = esdhc_read32(&regs->hostcapblt);
810
811         /*
812          * For eSDHC, power supply is through peripheral circuit. Some eSDHC
813          * versions have value 0 of the bit but that does not reflect the
814          * truth. 3.3V is common for SD/MMC, and is supported for all boards
815          * with eSDHC in current u-boot. So, make 3.3V is supported in
816          * default in code. CONFIG_FSL_ESDHC_VS33_NOT_SUPPORT can be enabled
817          * if future board does not support 3.3V.
818          */
819         caps |= HOSTCAPBLT_VS33;
820         if (IS_ENABLED(CONFIG_FSL_ESDHC_VS33_NOT_SUPPORT))
821                 caps &= ~HOSTCAPBLT_VS33;
822
823         if (IS_ENABLED(CONFIG_SYS_FSL_ERRATUM_ESDHC135))
824                 caps &= ~(HOSTCAPBLT_SRS | HOSTCAPBLT_VS18 | HOSTCAPBLT_VS30);
825         if (caps & HOSTCAPBLT_VS18)
826                 cfg->voltages |= MMC_VDD_165_195;
827         if (caps & HOSTCAPBLT_VS30)
828                 cfg->voltages |= MMC_VDD_29_30 | MMC_VDD_30_31;
829         if (caps & HOSTCAPBLT_VS33)
830                 cfg->voltages |= MMC_VDD_32_33 | MMC_VDD_33_34;
831
832         cfg->name = "FSL_SDHC";
833
834         if (caps & HOSTCAPBLT_HSS)
835                 cfg->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
836
837         cfg->f_min = 400000;
838         cfg->f_max = min(priv->sdhc_clk, (u32)200000000);
839         cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
840 }
841
842 #ifdef CONFIG_OF_LIBFDT
843 __weak int esdhc_status_fixup(void *blob, const char *compat)
844 {
845         if (IS_ENABLED(CONFIG_FSL_ESDHC_PIN_MUX) && !hwconfig("esdhc")) {
846                 do_fixup_by_compat(blob, compat, "status", "disabled",
847                                 sizeof("disabled"), 1);
848                 return 1;
849         }
850
851         return 0;
852 }
853
854
855 #if CONFIG_IS_ENABLED(DM_MMC)
856 static int fsl_esdhc_get_cd(struct udevice *dev);
857 static void esdhc_disable_for_no_card(void *blob)
858 {
859         struct udevice *dev;
860
861         for (uclass_first_device(UCLASS_MMC, &dev);
862              dev;
863              uclass_next_device(&dev)) {
864                 char esdhc_path[50];
865
866                 if (fsl_esdhc_get_cd(dev))
867                         continue;
868
869                 snprintf(esdhc_path, sizeof(esdhc_path), "/soc/esdhc@%lx",
870                          (unsigned long)dev_read_addr(dev));
871                 do_fixup_by_path(blob, esdhc_path, "status", "disabled",
872                                  sizeof("disabled"), 1);
873         }
874 }
875 #else
876 static void esdhc_disable_for_no_card(void *blob)
877 {
878 }
879 #endif
880
881 void fdt_fixup_esdhc(void *blob, struct bd_info *bd)
882 {
883         const char *compat = "fsl,esdhc";
884
885         if (esdhc_status_fixup(blob, compat))
886                 return;
887
888         if (IS_ENABLED(CONFIG_FSL_ESDHC_33V_IO_RELIABILITY_WORKAROUND))
889                 esdhc_disable_for_no_card(blob);
890
891         do_fixup_by_compat_u32(blob, compat, "clock-frequency",
892                                gd->arch.sdhc_clk, 1);
893 }
894 #endif
895
896 #if !CONFIG_IS_ENABLED(DM_MMC)
897 static int esdhc_getcd(struct mmc *mmc)
898 {
899         struct fsl_esdhc_priv *priv = mmc->priv;
900
901         return esdhc_getcd_common(priv);
902 }
903
904 static int esdhc_init(struct mmc *mmc)
905 {
906         struct fsl_esdhc_priv *priv = mmc->priv;
907
908         return esdhc_init_common(priv, mmc);
909 }
910
911 static int esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
912                           struct mmc_data *data)
913 {
914         struct fsl_esdhc_priv *priv = mmc->priv;
915
916         return esdhc_send_cmd_common(priv, mmc, cmd, data);
917 }
918
919 static int esdhc_set_ios(struct mmc *mmc)
920 {
921         struct fsl_esdhc_priv *priv = mmc->priv;
922
923         return esdhc_set_ios_common(priv, mmc);
924 }
925
926 static const struct mmc_ops esdhc_ops = {
927         .getcd          = esdhc_getcd,
928         .init           = esdhc_init,
929         .send_cmd       = esdhc_send_cmd,
930         .set_ios        = esdhc_set_ios,
931 };
932
933 int fsl_esdhc_initialize(struct bd_info *bis, struct fsl_esdhc_cfg *cfg)
934 {
935         struct fsl_esdhc_plat *plat;
936         struct fsl_esdhc_priv *priv;
937         struct mmc_config *mmc_cfg;
938         struct mmc *mmc;
939
940         if (!cfg)
941                 return -EINVAL;
942
943         priv = calloc(sizeof(struct fsl_esdhc_priv), 1);
944         if (!priv)
945                 return -ENOMEM;
946         plat = calloc(sizeof(struct fsl_esdhc_plat), 1);
947         if (!plat) {
948                 free(priv);
949                 return -ENOMEM;
950         }
951
952         priv->esdhc_regs = (struct fsl_esdhc *)(unsigned long)(cfg->esdhc_base);
953         priv->sdhc_clk = cfg->sdhc_clk;
954         if (gd->arch.sdhc_per_clk)
955                 priv->is_sdhc_per_clk = true;
956
957         mmc_cfg = &plat->cfg;
958
959         if (cfg->max_bus_width == 8) {
960                 mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT |
961                                       MMC_MODE_8BIT;
962         } else if (cfg->max_bus_width == 4) {
963                 mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT;
964         } else if (cfg->max_bus_width == 1) {
965                 mmc_cfg->host_caps |= MMC_MODE_1BIT;
966         } else {
967                 mmc_cfg->host_caps |= MMC_MODE_1BIT;
968                 printf("No max bus width provided. Fallback to 1-bit mode.\n");
969         }
970
971         if (IS_ENABLED(CONFIG_ESDHC_DETECT_8_BIT_QUIRK))
972                 mmc_cfg->host_caps &= ~MMC_MODE_8BIT;
973
974         mmc_cfg->ops = &esdhc_ops;
975
976         fsl_esdhc_get_cfg_common(priv, mmc_cfg);
977
978         mmc = mmc_create(mmc_cfg, priv);
979         if (!mmc)
980                 return -EIO;
981
982         priv->mmc = mmc;
983         return 0;
984 }
985
986 int fsl_esdhc_mmc_init(struct bd_info *bis)
987 {
988         struct fsl_esdhc_cfg *cfg;
989
990         cfg = calloc(sizeof(struct fsl_esdhc_cfg), 1);
991         cfg->esdhc_base = CONFIG_SYS_FSL_ESDHC_ADDR;
992         cfg->max_bus_width = CONFIG_SYS_FSL_ESDHC_DEFAULT_BUS_WIDTH;
993         /* Prefer peripheral clock which provides higher frequency. */
994         if (gd->arch.sdhc_per_clk)
995                 cfg->sdhc_clk = gd->arch.sdhc_per_clk;
996         else
997                 cfg->sdhc_clk = gd->arch.sdhc_clk;
998         return fsl_esdhc_initialize(bis, cfg);
999 }
1000 #else /* DM_MMC */
1001 static int fsl_esdhc_probe(struct udevice *dev)
1002 {
1003         struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
1004         struct fsl_esdhc_plat *plat = dev_get_plat(dev);
1005         struct fsl_esdhc_priv *priv = dev_get_priv(dev);
1006         u32 caps, hostver;
1007         fdt_addr_t addr;
1008         struct mmc *mmc;
1009         int ret;
1010
1011         addr = dev_read_addr(dev);
1012         if (addr == FDT_ADDR_T_NONE)
1013                 return -EINVAL;
1014 #ifdef CONFIG_PPC
1015         priv->esdhc_regs = (struct fsl_esdhc *)lower_32_bits(addr);
1016 #else
1017         priv->esdhc_regs = (struct fsl_esdhc *)addr;
1018 #endif
1019         priv->dev = dev;
1020
1021         if (IS_ENABLED(CONFIG_FSL_ESDHC_SUPPORT_ADMA2)) {
1022                 /*
1023                  * Only newer eSDHC controllers can do ADMA2 if the ADMA flag
1024                  * is set in the host capabilities register.
1025                  */
1026                 caps = esdhc_read32(&priv->esdhc_regs->hostcapblt);
1027                 hostver = esdhc_read32(&priv->esdhc_regs->hostver);
1028                 if (caps & HOSTCAPBLT_DMAS &&
1029                     HOSTVER_VENDOR(hostver) > VENDOR_V_22) {
1030                         priv->adma_desc_table = sdhci_adma_init();
1031                         if (!priv->adma_desc_table)
1032                                 debug("Could not allocate ADMA tables, falling back to SDMA\n");
1033                 }
1034         }
1035
1036         if (gd->arch.sdhc_per_clk) {
1037                 priv->sdhc_clk = gd->arch.sdhc_per_clk;
1038                 priv->is_sdhc_per_clk = true;
1039         } else {
1040                 priv->sdhc_clk = gd->arch.sdhc_clk;
1041         }
1042
1043         if (priv->sdhc_clk <= 0) {
1044                 dev_err(dev, "Unable to get clk for %s\n", dev->name);
1045                 return -EINVAL;
1046         }
1047
1048         fsl_esdhc_get_cfg_common(priv, &plat->cfg);
1049
1050         mmc_of_parse(dev, &plat->cfg);
1051
1052         mmc = &plat->mmc;
1053         mmc->cfg = &plat->cfg;
1054         mmc->dev = dev;
1055
1056         upriv->mmc = mmc;
1057
1058         ret = esdhc_init_common(priv, mmc);
1059         if (ret)
1060                 return ret;
1061
1062         if (IS_ENABLED(CONFIG_FSL_ESDHC_33V_IO_RELIABILITY_WORKAROUND) &&
1063             !fsl_esdhc_get_cd(dev))
1064                 esdhc_setbits32(&priv->esdhc_regs->proctl, PROCTL_VOLT_SEL);
1065
1066         return 0;
1067 }
1068
1069 static int fsl_esdhc_get_cd(struct udevice *dev)
1070 {
1071         struct fsl_esdhc_plat *plat = dev_get_plat(dev);
1072         struct fsl_esdhc_priv *priv = dev_get_priv(dev);
1073
1074         if (plat->cfg.host_caps & MMC_CAP_NONREMOVABLE)
1075                 return 1;
1076
1077         return esdhc_getcd_common(priv);
1078 }
1079
1080 static int fsl_esdhc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
1081                               struct mmc_data *data)
1082 {
1083         struct fsl_esdhc_plat *plat = dev_get_plat(dev);
1084         struct fsl_esdhc_priv *priv = dev_get_priv(dev);
1085
1086         return esdhc_send_cmd_common(priv, &plat->mmc, cmd, data);
1087 }
1088
1089 static int fsl_esdhc_set_ios(struct udevice *dev)
1090 {
1091         struct fsl_esdhc_plat *plat = dev_get_plat(dev);
1092         struct fsl_esdhc_priv *priv = dev_get_priv(dev);
1093
1094         return esdhc_set_ios_common(priv, &plat->mmc);
1095 }
1096
1097 static int fsl_esdhc_reinit(struct udevice *dev)
1098 {
1099         struct fsl_esdhc_plat *plat = dev_get_plat(dev);
1100         struct fsl_esdhc_priv *priv = dev_get_priv(dev);
1101
1102         return esdhc_init_common(priv, &plat->mmc);
1103 }
1104
1105 #ifdef MMC_SUPPORTS_TUNING
1106 static int fsl_esdhc_execute_tuning(struct udevice *dev, uint32_t opcode)
1107 {
1108         struct fsl_esdhc_plat *plat = dev_get_plat(dev);
1109         struct fsl_esdhc_priv *priv = dev_get_priv(dev);
1110         struct fsl_esdhc *regs = priv->esdhc_regs;
1111         struct mmc *mmc = &plat->mmc;
1112         u32 val, irqstaten;
1113         int i;
1114
1115         if (IS_ENABLED(CONFIG_SYS_FSL_ERRATUM_A011334) &&
1116             plat->mmc.hs400_tuning)
1117                 set_sysctl(priv, mmc, mmc->clock);
1118
1119         esdhc_tuning_block_enable(priv, true);
1120         esdhc_setbits32(&regs->autoc12err, EXECUTE_TUNING);
1121
1122         irqstaten = esdhc_read32(&regs->irqstaten);
1123         esdhc_write32(&regs->irqstaten, IRQSTATEN_BRR);
1124
1125         for (i = 0; i < MAX_TUNING_LOOP; i++) {
1126                 mmc_send_tuning(mmc, opcode, NULL);
1127                 mdelay(1);
1128
1129                 val = esdhc_read32(&regs->autoc12err);
1130                 if (!(val & EXECUTE_TUNING)) {
1131                         if (val & SMPCLKSEL)
1132                                 break;
1133                 }
1134         }
1135
1136         esdhc_write32(&regs->irqstaten, irqstaten);
1137
1138         if (i != MAX_TUNING_LOOP) {
1139                 if (plat->mmc.hs400_tuning)
1140                         esdhc_setbits32(&regs->sdtimingctl, FLW_CTL_BG);
1141                 return 0;
1142         }
1143
1144         printf("fsl_esdhc: tuning failed!\n");
1145         esdhc_clrbits32(&regs->autoc12err, SMPCLKSEL);
1146         esdhc_clrbits32(&regs->autoc12err, EXECUTE_TUNING);
1147         esdhc_tuning_block_enable(priv, false);
1148         return -ETIMEDOUT;
1149 }
1150 #endif
1151
1152 int fsl_esdhc_hs400_prepare_ddr(struct udevice *dev)
1153 {
1154         struct fsl_esdhc_priv *priv = dev_get_priv(dev);
1155
1156         esdhc_tuning_block_enable(priv, false);
1157         return 0;
1158 }
1159
1160 static int fsl_esdhc_wait_dat0(struct udevice *dev, int state,
1161                                int timeout_us)
1162 {
1163         int ret;
1164         u32 tmp;
1165         struct fsl_esdhc_priv *priv = dev_get_priv(dev);
1166         struct fsl_esdhc *regs = priv->esdhc_regs;
1167
1168         ret = readx_poll_timeout(esdhc_read32, &regs->prsstat, tmp,
1169                                  !!(tmp & PRSSTAT_DAT0) == !!state,
1170                                  timeout_us);
1171         return ret;
1172 }
1173
1174 static const struct dm_mmc_ops fsl_esdhc_ops = {
1175         .get_cd         = fsl_esdhc_get_cd,
1176         .send_cmd       = fsl_esdhc_send_cmd,
1177         .set_ios        = fsl_esdhc_set_ios,
1178 #ifdef MMC_SUPPORTS_TUNING
1179         .execute_tuning = fsl_esdhc_execute_tuning,
1180 #endif
1181         .reinit = fsl_esdhc_reinit,
1182         .hs400_prepare_ddr = fsl_esdhc_hs400_prepare_ddr,
1183         .wait_dat0 = fsl_esdhc_wait_dat0,
1184 };
1185
1186 static const struct udevice_id fsl_esdhc_ids[] = {
1187         { .compatible = "fsl,esdhc", },
1188         { /* sentinel */ }
1189 };
1190
1191 static int fsl_esdhc_bind(struct udevice *dev)
1192 {
1193         struct fsl_esdhc_plat *plat = dev_get_plat(dev);
1194
1195         return mmc_bind(dev, &plat->mmc, &plat->cfg);
1196 }
1197
1198 U_BOOT_DRIVER(fsl_esdhc) = {
1199         .name   = "fsl-esdhc-mmc",
1200         .id     = UCLASS_MMC,
1201         .of_match = fsl_esdhc_ids,
1202         .ops    = &fsl_esdhc_ops,
1203         .bind   = fsl_esdhc_bind,
1204         .probe  = fsl_esdhc_probe,
1205         .plat_auto      = sizeof(struct fsl_esdhc_plat),
1206         .priv_auto      = sizeof(struct fsl_esdhc_priv),
1207 };
1208 #endif