uboot/drivers/mmc/davinci_mmc.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Davinci MMC Controller Driver
   4 *
   5 * Copyright (C) 2010 Texas Instruments Incorporated
   6 */
   7
   8#include <config.h>
   9#include <common.h>
  10#include <dm.h>
  11#include <errno.h>
  12#include <mmc.h>
  13#include <command.h>
  14#include <part.h>
  15#include <malloc.h>
  16#include <asm/io.h>
  17#include <asm/arch/sdmmc_defs.h>
  18#include <asm-generic/gpio.h>
  19#include <linux/delay.h>
  20
  21#define WATCHDOG_COUNT          (100000)
  22
  23#define get_val(addr)           REG(addr)
  24#define set_val(addr, val)      REG(addr) = (val)
  25#define set_bit(addr, val)      set_val((addr), (get_val(addr) | (val)))
  26#define clear_bit(addr, val)    set_val((addr), (get_val(addr) & ~(val)))
  27
  28#ifdef CONFIG_DM_MMC
  29/* Davinci MMC board definitions */
  30struct davinci_mmc_priv {
  31        struct davinci_mmc_regs *reg_base;      /* Register base address */
  32        uint input_clk;         /* Input clock to MMC controller */
  33        struct gpio_desc cd_gpio;       /* Card Detect GPIO */
  34        struct gpio_desc wp_gpio;       /* Write Protect GPIO */
  35};
  36#endif
  37
  38/* Set davinci clock prescalar value based on the required clock in HZ */
  39#if !CONFIG_IS_ENABLED(DM_MMC)
  40static void dmmc_set_clock(struct mmc *mmc, uint clock)
  41{
  42        struct davinci_mmc *host = mmc->priv;
  43#else
  44
  45static void davinci_mmc_set_clock(struct udevice *dev, uint clock)
  46{
  47        struct davinci_mmc_priv *host = dev_get_priv(dev);
  48        struct mmc *mmc = mmc_get_mmc_dev(dev);
  49#endif
  50        struct davinci_mmc_regs *regs = host->reg_base;
  51        uint clkrt, sysclk2, act_clock;
  52
  53        if (clock < mmc->cfg->f_min)
  54                clock = mmc->cfg->f_min;
  55        if (clock > mmc->cfg->f_max)
  56                clock = mmc->cfg->f_max;
  57
  58        set_val(&regs->mmcclk, 0);
  59        sysclk2 = host->input_clk;
  60        clkrt = (sysclk2 / (2 * clock)) - 1;
  61
  62        /* Calculate the actual clock for the divider used */
  63        act_clock = (sysclk2 / (2 * (clkrt + 1)));
  64
  65        /* Adjust divider if actual clock exceeds the required clock */
  66        if (act_clock > clock)
  67                clkrt++;
  68
  69        /* check clock divider boundary and correct it */
  70        if (clkrt > 0xFF)
  71                clkrt = 0xFF;
  72
  73        set_val(&regs->mmcclk, (clkrt | MMCCLK_CLKEN));
  74}
  75
  76/* Status bit wait loop for MMCST1 */
  77static int
  78dmmc_wait_fifo_status(volatile struct davinci_mmc_regs *regs, uint status)
  79{
  80        uint wdog = WATCHDOG_COUNT;
  81
  82        while (--wdog && ((get_val(&regs->mmcst1) & status) != status))
  83                udelay(10);
  84
  85        if (!(get_val(&regs->mmcctl) & MMCCTL_WIDTH_4_BIT))
  86                udelay(100);
  87
  88        if (wdog == 0)
  89                return -ECOMM;
  90
  91        return 0;
  92}
  93
  94/* Busy bit wait loop for MMCST1 */
  95static int dmmc_busy_wait(volatile struct davinci_mmc_regs *regs)
  96{
  97        uint wdog = WATCHDOG_COUNT;
  98
  99        while (--wdog && (get_val(&regs->mmcst1) & MMCST1_BUSY))
 100                udelay(10);
 101
 102        if (wdog == 0)
 103                return -ECOMM;
 104
 105        return 0;
 106}
 107
 108/* Status bit wait loop for MMCST0 - Checks for error bits as well */
 109static int dmmc_check_status(volatile struct davinci_mmc_regs *regs,
 110                uint *cur_st, uint st_ready, uint st_error)
 111{
 112        uint wdog = WATCHDOG_COUNT;
 113        uint mmcstatus = *cur_st;
 114
 115        while (wdog--) {
 116                if (mmcstatus & st_ready) {
 117                        *cur_st = mmcstatus;
 118                        mmcstatus = get_val(&regs->mmcst1);
 119                        return 0;
 120                } else if (mmcstatus & st_error) {
 121                        if (mmcstatus & MMCST0_TOUTRS)
 122                                return -ETIMEDOUT;
 123                        printf("[ ST0 ERROR %x]\n", mmcstatus);
 124                        /*
 125                         * Ignore CRC errors as some MMC cards fail to
 126                         * initialize on DM365-EVM on the SD1 slot
 127                         */
 128                        if (mmcstatus & MMCST0_CRCRS)
 129                                return 0;
 130                        return -ECOMM;
 131                }
 132                udelay(10);
 133
 134                mmcstatus = get_val(&regs->mmcst0);
 135        }
 136
 137        printf("Status %x Timeout ST0:%x ST1:%x\n", st_ready, mmcstatus,
 138                        get_val(&regs->mmcst1));
 139        return -ECOMM;
 140}
 141
 142/*
 143 * Sends a command out on the bus.  Takes the device pointer,
 144 * a command pointer, and an optional data pointer.
 145 */
 146#if !CONFIG_IS_ENABLED(DM_MMC)
 147static int dmmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
 148{
 149        struct davinci_mmc *host = mmc->priv;
 150#else
 151static int
 152davinci_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd, struct mmc_data *data)
 153{
 154        struct davinci_mmc_priv *host = dev_get_priv(dev);
 155#endif
 156        volatile struct davinci_mmc_regs *regs = host->reg_base;
 157        uint mmcstatus, status_rdy, status_err;
 158        uint i, cmddata, bytes_left = 0;
 159        int fifo_words, fifo_bytes, err;
 160        char *data_buf = NULL;
 161
 162        /* Clear status registers */
 163        mmcstatus = get_val(&regs->mmcst0);
 164        fifo_words = 16;
 165        fifo_bytes = fifo_words << 2;
 166
 167        /* Wait for any previous busy signal to be cleared */
 168        dmmc_busy_wait(regs);
 169
 170        cmddata = cmd->cmdidx;
 171        cmddata |= MMCCMD_PPLEN;
 172
 173        /* Send init clock for CMD0 */
 174        if (cmd->cmdidx == MMC_CMD_GO_IDLE_STATE)
 175                cmddata |= MMCCMD_INITCK;
 176
 177        switch (cmd->resp_type) {
 178        case MMC_RSP_R1b:
 179                cmddata |= MMCCMD_BSYEXP;
 180                /* Fall-through */
 181        case MMC_RSP_R1:    /* R1, R1b, R5, R6, R7 */
 182                cmddata |= MMCCMD_RSPFMT_R1567;
 183                break;
 184        case MMC_RSP_R2:
 185                cmddata |= MMCCMD_RSPFMT_R2;
 186                break;
 187        case MMC_RSP_R3: /* R3, R4 */
 188                cmddata |= MMCCMD_RSPFMT_R3;
 189                break;
 190        }
 191
 192        set_val(&regs->mmcim, 0);
 193
 194        if (data) {
 195                /* clear previous data transfer if any and set new one */
 196                bytes_left = (data->blocksize * data->blocks);
 197
 198                /* Reset FIFO - Always use 32 byte fifo threshold */
 199                set_val(&regs->mmcfifoctl,
 200                                (MMCFIFOCTL_FIFOLEV | MMCFIFOCTL_FIFORST));
 201
 202                cmddata |= MMCCMD_DMATRIG;
 203
 204                cmddata |= MMCCMD_WDATX;
 205                if (data->flags == MMC_DATA_READ) {
 206                        set_val(&regs->mmcfifoctl, MMCFIFOCTL_FIFOLEV);
 207                } else if (data->flags == MMC_DATA_WRITE) {
 208                        set_val(&regs->mmcfifoctl,
 209                                        (MMCFIFOCTL_FIFOLEV |
 210                                         MMCFIFOCTL_FIFODIR));
 211                        cmddata |= MMCCMD_DTRW;
 212                }
 213
 214                set_val(&regs->mmctod, 0xFFFF);
 215                set_val(&regs->mmcnblk, (data->blocks & MMCNBLK_NBLK_MASK));
 216                set_val(&regs->mmcblen, (data->blocksize & MMCBLEN_BLEN_MASK));
 217
 218                if (data->flags == MMC_DATA_WRITE) {
 219                        uint val;
 220                        data_buf = (char *)data->src;
 221                        /* For write, fill FIFO with data before issue of CMD */
 222                        for (i = 0; (i < fifo_words) && bytes_left; i++) {
 223                                memcpy((char *)&val, data_buf, 4);
 224                                set_val(&regs->mmcdxr, val);
 225                                data_buf += 4;
 226                                bytes_left -= 4;
 227                        }
 228                }
 229        } else {
 230                set_val(&regs->mmcblen, 0);
 231                set_val(&regs->mmcnblk, 0);
 232        }
 233
 234        set_val(&regs->mmctor, 0x1FFF);
 235
 236        /* Send the command */
 237        set_val(&regs->mmcarghl, cmd->cmdarg);
 238        set_val(&regs->mmccmd, cmddata);
 239
 240        status_rdy = MMCST0_RSPDNE;
 241        status_err = (MMCST0_TOUTRS | MMCST0_TOUTRD |
 242                        MMCST0_CRCWR | MMCST0_CRCRD);
 243        if (cmd->resp_type & MMC_RSP_CRC)
 244                status_err |= MMCST0_CRCRS;
 245
 246        mmcstatus = get_val(&regs->mmcst0);
 247        err = dmmc_check_status(regs, &mmcstatus, status_rdy, status_err);
 248        if (err)
 249                return err;
 250
 251        /* For R1b wait for busy done */
 252        if (cmd->resp_type == MMC_RSP_R1b)
 253                dmmc_busy_wait(regs);
 254
 255        /* Collect response from controller for specific commands */
 256        if (mmcstatus & MMCST0_RSPDNE) {
 257                /* Copy the response to the response buffer */
 258                if (cmd->resp_type & MMC_RSP_136) {
 259                        cmd->response[0] = get_val(&regs->mmcrsp67);
 260                        cmd->response[1] = get_val(&regs->mmcrsp45);
 261                        cmd->response[2] = get_val(&regs->mmcrsp23);
 262                        cmd->response[3] = get_val(&regs->mmcrsp01);
 263                } else if (cmd->resp_type & MMC_RSP_PRESENT) {
 264                        cmd->response[0] = get_val(&regs->mmcrsp67);
 265                }
 266        }
 267
 268        if (data == NULL)
 269                return 0;
 270
 271        if (data->flags == MMC_DATA_READ) {
 272                /* check for DATDNE along with DRRDY as the controller might
 273                 * set the DATDNE without DRRDY for smaller transfers with
 274                 * less than FIFO threshold bytes
 275                 */
 276                status_rdy = MMCST0_DRRDY | MMCST0_DATDNE;
 277                status_err = MMCST0_TOUTRD | MMCST0_CRCRD;
 278                data_buf = data->dest;
 279        } else {
 280                status_rdy = MMCST0_DXRDY | MMCST0_DATDNE;
 281                status_err = MMCST0_CRCWR;
 282        }
 283
 284        /* Wait until all of the blocks are transferred */
 285        while (bytes_left) {
 286                err = dmmc_check_status(regs, &mmcstatus, status_rdy,
 287                                status_err);
 288                if (err)
 289                        return err;
 290
 291                if (data->flags == MMC_DATA_READ) {
 292                        /*
 293                         * MMC controller sets the Data receive ready bit
 294                         * (DRRDY) in MMCST0 even before the entire FIFO is
 295                         * full. This results in erratic behavior if we start
 296                         * reading the FIFO soon after DRRDY.  Wait for the
 297                         * FIFO full bit in MMCST1 for proper FIFO clearing.
 298                         */
 299                        if (bytes_left > fifo_bytes)
 300                                dmmc_wait_fifo_status(regs, 0x4a);
 301                        else if (bytes_left == fifo_bytes) {
 302                                dmmc_wait_fifo_status(regs, 0x40);
 303                                if (cmd->cmdidx == MMC_CMD_SEND_EXT_CSD)
 304                                        udelay(600);
 305                        }
 306
 307                        for (i = 0; bytes_left && (i < fifo_words); i++) {
 308                                cmddata = get_val(&regs->mmcdrr);
 309                                memcpy(data_buf, (char *)&cmddata, 4);
 310                                data_buf += 4;
 311                                bytes_left -= 4;
 312                        }
 313                } else {
 314                        /*
 315                         * MMC controller sets the Data transmit ready bit
 316                         * (DXRDY) in MMCST0 even before the entire FIFO is
 317                         * empty. This results in erratic behavior if we start
 318                         * writing the FIFO soon after DXRDY.  Wait for the
 319                         * FIFO empty bit in MMCST1 for proper FIFO clearing.
 320                         */
 321                        dmmc_wait_fifo_status(regs, MMCST1_FIFOEMP);
 322                        for (i = 0; bytes_left && (i < fifo_words); i++) {
 323                                memcpy((char *)&cmddata, data_buf, 4);
 324                                set_val(&regs->mmcdxr, cmddata);
 325                                data_buf += 4;
 326                                bytes_left -= 4;
 327                        }
 328                        dmmc_busy_wait(regs);
 329                }
 330        }
 331
 332        err = dmmc_check_status(regs, &mmcstatus, MMCST0_DATDNE, status_err);
 333        if (err)
 334                return err;
 335
 336        return 0;
 337}
 338
 339/* Initialize Davinci MMC controller */
 340#if !CONFIG_IS_ENABLED(DM_MMC)
 341static int dmmc_init(struct mmc *mmc)
 342{
 343        struct davinci_mmc *host = mmc->priv;
 344#else
 345static int davinci_dm_mmc_init(struct udevice *dev)
 346{
 347        struct davinci_mmc_priv *host = dev_get_priv(dev);
 348#endif
 349        struct davinci_mmc_regs *regs = host->reg_base;
 350
 351        /* Clear status registers explicitly - soft reset doesn't clear it
 352         * If Uboot is invoked from UBL with SDMMC Support, the status
 353         * registers can have uncleared bits
 354         */
 355        get_val(&regs->mmcst0);
 356        get_val(&regs->mmcst1);
 357
 358        /* Hold software reset */
 359        set_bit(&regs->mmcctl, MMCCTL_DATRST);
 360        set_bit(&regs->mmcctl, MMCCTL_CMDRST);
 361        udelay(10);
 362
 363        set_val(&regs->mmcclk, 0x0);
 364        set_val(&regs->mmctor, 0x1FFF);
 365        set_val(&regs->mmctod, 0xFFFF);
 366
 367        /* Clear software reset */
 368        clear_bit(&regs->mmcctl, MMCCTL_DATRST);
 369        clear_bit(&regs->mmcctl, MMCCTL_CMDRST);
 370
 371        udelay(10);
 372
 373        /* Reset FIFO - Always use the maximum fifo threshold */
 374        set_val(&regs->mmcfifoctl, (MMCFIFOCTL_FIFOLEV | MMCFIFOCTL_FIFORST));
 375        set_val(&regs->mmcfifoctl, MMCFIFOCTL_FIFOLEV);
 376
 377        return 0;
 378}
 379
 380/* Set buswidth or clock as indicated by the MMC framework */
 381#if !CONFIG_IS_ENABLED(DM_MMC)
 382static int dmmc_set_ios(struct mmc *mmc)
 383{
 384        struct davinci_mmc *host = mmc->priv;
 385        struct davinci_mmc_regs *regs = host->reg_base;
 386#else
 387static int davinci_mmc_set_ios(struct udevice *dev)
 388{
 389        struct mmc *mmc = mmc_get_mmc_dev(dev);
 390
 391        struct davinci_mmc_priv *host = dev_get_priv(dev);
 392        struct davinci_mmc_regs *regs = host->reg_base;
 393#endif
 394        /* Set the bus width */
 395        if (mmc->bus_width == 4)
 396                set_bit(&regs->mmcctl, MMCCTL_WIDTH_4_BIT);
 397        else
 398                clear_bit(&regs->mmcctl, MMCCTL_WIDTH_4_BIT);
 399
 400        /* Set clock speed */
 401        if (mmc->clock) {
 402#if !CONFIG_IS_ENABLED(DM_MMC)
 403                dmmc_set_clock(mmc, mmc->clock);
 404#else
 405                davinci_mmc_set_clock(dev, mmc->clock);
 406#endif
 407        }
 408        return 0;
 409}
 410
 411#if !CONFIG_IS_ENABLED(DM_MMC)
 412static const struct mmc_ops dmmc_ops = {
 413       .send_cmd       = dmmc_send_cmd,
 414       .set_ios        = dmmc_set_ios,
 415       .init           = dmmc_init,
 416};
 417#else
 418
 419static int davinci_mmc_getcd(struct udevice *dev)
 420{
 421        int value = -1;
 422#if CONFIG_IS_ENABLED(DM_GPIO)
 423        struct davinci_mmc_priv *priv = dev_get_priv(dev);
 424        value = dm_gpio_get_value(&priv->cd_gpio);
 425#endif
 426        /* if no CD return as 1 */
 427        if (value < 0)
 428                return 1;
 429
 430        return value;
 431}
 432
 433static int davinci_mmc_getwp(struct udevice *dev)
 434{
 435        int value = -1;
 436#if CONFIG_IS_ENABLED(DM_GPIO)
 437        struct davinci_mmc_priv *priv = dev_get_priv(dev);
 438
 439        value = dm_gpio_get_value(&priv->wp_gpio);
 440#endif
 441        /* if no WP return as 0 */
 442        if (value < 0)
 443                return 0;
 444
 445        return value;
 446}
 447
 448static const struct dm_mmc_ops davinci_mmc_ops = {
 449        .send_cmd       = davinci_mmc_send_cmd,
 450        .set_ios        = davinci_mmc_set_ios,
 451        .get_cd         = davinci_mmc_getcd,
 452        .get_wp         = davinci_mmc_getwp,
 453};
 454#endif
 455
 456#if !CONFIG_IS_ENABLED(DM_MMC)
 457/* Called from board_mmc_init during startup. Can be called multiple times
 458* depending on the number of slots available on board and controller
 459*/
 460int davinci_mmc_init(struct bd_info *bis, struct davinci_mmc *host)
 461{
 462        host->cfg.name = "davinci";
 463        host->cfg.ops = &dmmc_ops;
 464        host->cfg.f_min = 200000;
 465        host->cfg.f_max = 25000000;
 466        host->cfg.voltages = host->voltages;
 467        host->cfg.host_caps = host->host_caps;
 468
 469        host->cfg.b_max = DAVINCI_MAX_BLOCKS;
 470
 471        mmc_create(&host->cfg, host);
 472
 473        return 0;
 474}
 475#else
 476
 477
 478static int davinci_mmc_probe(struct udevice *dev)
 479{
 480        struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
 481        struct davinci_mmc_plat *plat = dev_get_plat(dev);
 482        struct davinci_mmc_priv *priv = dev_get_priv(dev);
 483
 484        priv->reg_base = plat->reg_base;
 485        priv->input_clk = clk_get(DAVINCI_MMCSD_CLKID);
 486#if CONFIG_IS_ENABLED(DM_GPIO)
 487        /* These GPIOs are optional */
 488        gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio, GPIOD_IS_IN);
 489        gpio_request_by_name(dev, "wp-gpios", 0, &priv->wp_gpio, GPIOD_IS_IN);
 490#endif
 491        upriv->mmc = &plat->mmc;
 492
 493        return davinci_dm_mmc_init(dev);
 494}
 495
 496static int davinci_mmc_bind(struct udevice *dev)
 497{
 498        struct davinci_mmc_plat *plat = dev_get_plat(dev);
 499
 500        return mmc_bind(dev, &plat->mmc, &plat->cfg);
 501}
 502
 503#if CONFIG_IS_ENABLED(OF_CONTROL)
 504static int davinci_mmc_of_to_plat(struct udevice *dev)
 505{
 506        struct davinci_mmc_plat *plat = dev_get_plat(dev);
 507        struct mmc_config *cfg = &plat->cfg;
 508
 509        plat->reg_base = dev_read_addr_ptr(dev);
 510        cfg->f_min = 200000;
 511        cfg->f_max = 25000000;
 512        cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34,
 513        cfg->host_caps = MMC_MODE_4BIT, /* DA850 supports only 4-bit SD/MMC */
 514        cfg->b_max = DAVINCI_MAX_BLOCKS;
 515        cfg->name = "da830-mmc";
 516
 517        return 0;
 518}
 519
 520static const struct udevice_id davinci_mmc_ids[] = {
 521        { .compatible = "ti,da830-mmc" },
 522        {},
 523};
 524#endif
 525U_BOOT_DRIVER(ti_da830_mmc) = {
 526        .name = "davinci_mmc",
 527        .id             = UCLASS_MMC,
 528#if CONFIG_IS_ENABLED(OF_CONTROL)
 529        .of_match       = davinci_mmc_ids,
 530        .plat_auto      = sizeof(struct davinci_mmc_plat),
 531        .of_to_plat = davinci_mmc_of_to_plat,
 532#endif
 533#if CONFIG_BLK
 534        .bind           = davinci_mmc_bind,
 535#endif
 536        .probe = davinci_mmc_probe,
 537        .ops = &davinci_mmc_ops,
 538        .priv_auto      = sizeof(struct davinci_mmc_priv),
 539#if !CONFIG_IS_ENABLED(OF_CONTROL)
 540        .flags  = DM_FLAG_PRE_RELOC,
 541#endif
 542};
 543#endif
 544