linux/arch/arm/boot/compressed/sdhi-shmobile.c
<<
>>
Prefs
   1/*
   2 * SuperH Mobile SDHI
   3 *
   4 * Copyright (C) 2010 Magnus Damm
   5 * Copyright (C) 2010 Kuninori Morimoto
   6 * Copyright (C) 2010 Simon Horman
   7 *
   8 * This file is subject to the terms and conditions of the GNU General Public
   9 * License.  See the file "COPYING" in the main directory of this archive
  10 * for more details.
  11 *
  12 * Parts inspired by u-boot
  13 */
  14
  15#include <linux/io.h>
  16#include <linux/mmc/host.h>
  17#include <linux/mmc/core.h>
  18#include <linux/mmc/mmc.h>
  19#include <linux/mmc/sd.h>
  20#include <linux/mmc/tmio.h>
  21#include <mach/sdhi.h>
  22
  23#define OCR_FASTBOOT            (1<<29)
  24#define OCR_HCS                 (1<<30)
  25#define OCR_BUSY                (1<<31)
  26
  27#define RESP_CMD12              0x00000030
  28
  29static inline u16 sd_ctrl_read16(void __iomem *base, int addr)
  30{
  31        return __raw_readw(base + addr);
  32}
  33
  34static inline u32 sd_ctrl_read32(void __iomem *base, int addr)
  35{
  36        return __raw_readw(base + addr) |
  37               __raw_readw(base + addr + 2) << 16;
  38}
  39
  40static inline void sd_ctrl_write16(void __iomem *base, int addr, u16 val)
  41{
  42        __raw_writew(val, base + addr);
  43}
  44
  45static inline void sd_ctrl_write32(void __iomem *base, int addr, u32 val)
  46{
  47        __raw_writew(val, base + addr);
  48        __raw_writew(val >> 16, base + addr + 2);
  49}
  50
  51#define ALL_ERROR (TMIO_STAT_CMD_IDX_ERR | TMIO_STAT_CRCFAIL |          \
  52                   TMIO_STAT_STOPBIT_ERR | TMIO_STAT_DATATIMEOUT |      \
  53                   TMIO_STAT_RXOVERFLOW | TMIO_STAT_TXUNDERRUN |        \
  54                   TMIO_STAT_CMDTIMEOUT | TMIO_STAT_ILL_ACCESS |        \
  55                   TMIO_STAT_ILL_FUNC)
  56
  57static int sdhi_intr(void __iomem *base)
  58{
  59        unsigned long state = sd_ctrl_read32(base, CTL_STATUS);
  60
  61        if (state & ALL_ERROR) {
  62                sd_ctrl_write32(base, CTL_STATUS, ~ALL_ERROR);
  63                sd_ctrl_write32(base, CTL_IRQ_MASK,
  64                                ALL_ERROR |
  65                                sd_ctrl_read32(base, CTL_IRQ_MASK));
  66                return -EINVAL;
  67        }
  68        if (state & TMIO_STAT_CMDRESPEND) {
  69                sd_ctrl_write32(base, CTL_STATUS, ~TMIO_STAT_CMDRESPEND);
  70                sd_ctrl_write32(base, CTL_IRQ_MASK,
  71                                TMIO_STAT_CMDRESPEND |
  72                                sd_ctrl_read32(base, CTL_IRQ_MASK));
  73                return 0;
  74        }
  75        if (state & TMIO_STAT_RXRDY) {
  76                sd_ctrl_write32(base, CTL_STATUS, ~TMIO_STAT_RXRDY);
  77                sd_ctrl_write32(base, CTL_IRQ_MASK,
  78                                TMIO_STAT_RXRDY | TMIO_STAT_TXUNDERRUN |
  79                                sd_ctrl_read32(base, CTL_IRQ_MASK));
  80                return 0;
  81        }
  82        if (state & TMIO_STAT_DATAEND) {
  83                sd_ctrl_write32(base, CTL_STATUS, ~TMIO_STAT_DATAEND);
  84                sd_ctrl_write32(base, CTL_IRQ_MASK,
  85                                TMIO_STAT_DATAEND |
  86                                sd_ctrl_read32(base, CTL_IRQ_MASK));
  87                return 0;
  88        }
  89
  90        return -EAGAIN;
  91}
  92
  93static int sdhi_boot_wait_resp_end(void __iomem *base)
  94{
  95        int err = -EAGAIN, timeout = 10000000;
  96
  97        while (timeout--) {
  98                err = sdhi_intr(base);
  99                if (err != -EAGAIN)
 100                        break;
 101                udelay(1);
 102        }
 103
 104        return err;
 105}
 106
 107/* SDHI_CLK_CTRL */
 108#define CLK_MMC_ENABLE                 (1 << 8)
 109#define CLK_MMC_INIT                   (1 << 6)        /* clk / 256 */
 110
 111static void sdhi_boot_mmc_clk_stop(void __iomem *base)
 112{
 113        sd_ctrl_write16(base, CTL_CLK_AND_WAIT_CTL, 0x0000);
 114        msleep(10);
 115        sd_ctrl_write16(base, CTL_SD_CARD_CLK_CTL, ~CLK_MMC_ENABLE &
 116                sd_ctrl_read16(base, CTL_SD_CARD_CLK_CTL));
 117        msleep(10);
 118}
 119
 120static void sdhi_boot_mmc_clk_start(void __iomem *base)
 121{
 122        sd_ctrl_write16(base, CTL_SD_CARD_CLK_CTL, CLK_MMC_ENABLE |
 123                sd_ctrl_read16(base, CTL_SD_CARD_CLK_CTL));
 124        msleep(10);
 125        sd_ctrl_write16(base, CTL_CLK_AND_WAIT_CTL, CLK_MMC_ENABLE);
 126        msleep(10);
 127}
 128
 129static void sdhi_boot_reset(void __iomem *base)
 130{
 131        sd_ctrl_write16(base, CTL_RESET_SD, 0x0000);
 132        msleep(10);
 133        sd_ctrl_write16(base, CTL_RESET_SD, 0x0001);
 134        msleep(10);
 135}
 136
 137/* Set MMC clock / power.
 138 * Note: This controller uses a simple divider scheme therefore it cannot
 139 * run a MMC card at full speed (20MHz). The max clock is 24MHz on SD, but as
 140 * MMC wont run that fast, it has to be clocked at 12MHz which is the next
 141 * slowest setting.
 142 */
 143static int sdhi_boot_mmc_set_ios(void __iomem *base, struct mmc_ios *ios)
 144{
 145        if (sd_ctrl_read32(base, CTL_STATUS) & TMIO_STAT_CMD_BUSY)
 146                return -EBUSY;
 147
 148        if (ios->clock)
 149                sd_ctrl_write16(base, CTL_SD_CARD_CLK_CTL,
 150                                ios->clock | CLK_MMC_ENABLE);
 151
 152        /* Power sequence - OFF -> ON -> UP */
 153        switch (ios->power_mode) {
 154        case MMC_POWER_OFF: /* power down SD bus */
 155                sdhi_boot_mmc_clk_stop(base);
 156                break;
 157        case MMC_POWER_ON: /* power up SD bus */
 158                break;
 159        case MMC_POWER_UP: /* start bus clock */
 160                sdhi_boot_mmc_clk_start(base);
 161                break;
 162        }
 163
 164        switch (ios->bus_width) {
 165        case MMC_BUS_WIDTH_1:
 166                sd_ctrl_write16(base, CTL_SD_MEM_CARD_OPT, 0x80e0);
 167        break;
 168        case MMC_BUS_WIDTH_4:
 169                sd_ctrl_write16(base, CTL_SD_MEM_CARD_OPT, 0x00e0);
 170        break;
 171        }
 172
 173        /* Let things settle. delay taken from winCE driver */
 174        udelay(140);
 175
 176        return 0;
 177}
 178
 179/* These are the bitmasks the tmio chip requires to implement the MMC response
 180 * types. Note that R1 and R6 are the same in this scheme. */
 181#define RESP_NONE      0x0300
 182#define RESP_R1        0x0400
 183#define RESP_R1B       0x0500
 184#define RESP_R2        0x0600
 185#define RESP_R3        0x0700
 186#define DATA_PRESENT   0x0800
 187#define TRANSFER_READ  0x1000
 188
 189static int sdhi_boot_request(void __iomem *base, struct mmc_command *cmd)
 190{
 191        int err, c = cmd->opcode;
 192
 193        switch (mmc_resp_type(cmd)) {
 194        case MMC_RSP_NONE: c |= RESP_NONE; break;
 195        case MMC_RSP_R1:   c |= RESP_R1;   break;
 196        case MMC_RSP_R1B:  c |= RESP_R1B;  break;
 197        case MMC_RSP_R2:   c |= RESP_R2;   break;
 198        case MMC_RSP_R3:   c |= RESP_R3;   break;
 199        default:
 200                return -EINVAL;
 201        }
 202
 203        /* No interrupts so this may not be cleared */
 204        sd_ctrl_write32(base, CTL_STATUS, ~TMIO_STAT_CMDRESPEND);
 205
 206        sd_ctrl_write32(base, CTL_IRQ_MASK, TMIO_STAT_CMDRESPEND |
 207                        sd_ctrl_read32(base, CTL_IRQ_MASK));
 208        sd_ctrl_write32(base, CTL_ARG_REG, cmd->arg);
 209        sd_ctrl_write16(base, CTL_SD_CMD, c);
 210
 211
 212        sd_ctrl_write32(base, CTL_IRQ_MASK,
 213                        ~(TMIO_STAT_CMDRESPEND | ALL_ERROR) &
 214                        sd_ctrl_read32(base, CTL_IRQ_MASK));
 215
 216        err = sdhi_boot_wait_resp_end(base);
 217        if (err)
 218                return err;
 219
 220        cmd->resp[0] = sd_ctrl_read32(base, CTL_RESPONSE);
 221
 222        return 0;
 223}
 224
 225static int sdhi_boot_do_read_single(void __iomem *base, int high_capacity,
 226                                    unsigned long block, unsigned short *buf)
 227{
 228        int err, i;
 229
 230        /* CMD17 - Read */
 231        {
 232                struct mmc_command cmd;
 233
 234                cmd.opcode = MMC_READ_SINGLE_BLOCK | \
 235                             TRANSFER_READ | DATA_PRESENT;
 236                if (high_capacity)
 237                        cmd.arg = block;
 238                else
 239                        cmd.arg = block * TMIO_BBS;
 240                cmd.flags = MMC_RSP_R1;
 241                err = sdhi_boot_request(base, &cmd);
 242                if (err)
 243                        return err;
 244        }
 245
 246        sd_ctrl_write32(base, CTL_IRQ_MASK,
 247                        ~(TMIO_STAT_DATAEND | TMIO_STAT_RXRDY |
 248                          TMIO_STAT_TXUNDERRUN) &
 249                        sd_ctrl_read32(base, CTL_IRQ_MASK));
 250        err = sdhi_boot_wait_resp_end(base);
 251        if (err)
 252                return err;
 253
 254        sd_ctrl_write16(base, CTL_SD_XFER_LEN, TMIO_BBS);
 255        for (i = 0; i < TMIO_BBS / sizeof(*buf); i++)
 256                *buf++ = sd_ctrl_read16(base, RESP_CMD12);
 257
 258        err = sdhi_boot_wait_resp_end(base);
 259        if (err)
 260                return err;
 261
 262        return 0;
 263}
 264
 265int sdhi_boot_do_read(void __iomem *base, int high_capacity,
 266                      unsigned long offset, unsigned short count,
 267                      unsigned short *buf)
 268{
 269        unsigned long i;
 270        int err = 0;
 271
 272        for (i = 0; i < count; i++) {
 273                err = sdhi_boot_do_read_single(base, high_capacity, offset + i,
 274                                               buf + (i * TMIO_BBS /
 275                                                      sizeof(*buf)));
 276                if (err)
 277                        return err;
 278        }
 279
 280        return 0;
 281}
 282
 283#define VOLTAGES (MMC_VDD_32_33 | MMC_VDD_33_34)
 284
 285int sdhi_boot_init(void __iomem *base)
 286{
 287        bool sd_v2 = false, sd_v1_0 = false;
 288        unsigned short cid;
 289        int err, high_capacity = 0;
 290
 291        sdhi_boot_mmc_clk_stop(base);
 292        sdhi_boot_reset(base);
 293
 294        /* mmc0: clock 400000Hz busmode 1 powermode 2 cs 0 Vdd 21 width 0 timing 0 */
 295        {
 296                struct mmc_ios ios;
 297                ios.power_mode = MMC_POWER_ON;
 298                ios.bus_width = MMC_BUS_WIDTH_1;
 299                ios.clock = CLK_MMC_INIT;
 300                err = sdhi_boot_mmc_set_ios(base, &ios);
 301                if (err)
 302                        return err;
 303        }
 304
 305        /* CMD0 */
 306        {
 307                struct mmc_command cmd;
 308                msleep(1);
 309                cmd.opcode = MMC_GO_IDLE_STATE;
 310                cmd.arg = 0;
 311                cmd.flags = MMC_RSP_NONE;
 312                err = sdhi_boot_request(base, &cmd);
 313                if (err)
 314                        return err;
 315                msleep(2);
 316        }
 317
 318        /* CMD8 - Test for SD version 2 */
 319        {
 320                struct mmc_command cmd;
 321                cmd.opcode = SD_SEND_IF_COND;
 322                cmd.arg = (VOLTAGES != 0) << 8 | 0xaa;
 323                cmd.flags = MMC_RSP_R1;
 324                err = sdhi_boot_request(base, &cmd); /* Ignore error */
 325                if ((cmd.resp[0] & 0xff) == 0xaa)
 326                        sd_v2 = true;
 327        }
 328
 329        /* CMD55 - Get OCR (SD) */
 330        {
 331                int timeout = 1000;
 332                struct mmc_command cmd;
 333
 334                cmd.arg = 0;
 335
 336                do {
 337                        cmd.opcode = MMC_APP_CMD;
 338                        cmd.flags = MMC_RSP_R1;
 339                        cmd.arg = 0;
 340                        err = sdhi_boot_request(base, &cmd);
 341                        if (err)
 342                                break;
 343
 344                        cmd.opcode = SD_APP_OP_COND;
 345                        cmd.flags = MMC_RSP_R3;
 346                        cmd.arg = (VOLTAGES & 0xff8000);
 347                        if (sd_v2)
 348                                cmd.arg |= OCR_HCS;
 349                        cmd.arg |= OCR_FASTBOOT;
 350                        err = sdhi_boot_request(base, &cmd);
 351                        if (err)
 352                                break;
 353
 354                        msleep(1);
 355                } while((!(cmd.resp[0] & OCR_BUSY)) && --timeout);
 356
 357                if (!err && timeout) {
 358                        if (!sd_v2)
 359                                sd_v1_0 = true;
 360                        high_capacity = (cmd.resp[0] & OCR_HCS) == OCR_HCS;
 361                }
 362        }
 363
 364        /* CMD1 - Get OCR (MMC) */
 365        if (!sd_v2 && !sd_v1_0) {
 366                int timeout = 1000;
 367                struct mmc_command cmd;
 368
 369                do {
 370                        cmd.opcode = MMC_SEND_OP_COND;
 371                        cmd.arg = VOLTAGES | OCR_HCS;
 372                        cmd.flags = MMC_RSP_R3;
 373                        err = sdhi_boot_request(base, &cmd);
 374                        if (err)
 375                                return err;
 376
 377                        msleep(1);
 378                } while((!(cmd.resp[0] & OCR_BUSY)) && --timeout);
 379
 380                if (!timeout)
 381                        return -EAGAIN;
 382
 383                high_capacity = (cmd.resp[0] & OCR_HCS) == OCR_HCS;
 384        }
 385
 386        /* CMD2 - Get CID */
 387        {
 388                struct mmc_command cmd;
 389                cmd.opcode = MMC_ALL_SEND_CID;
 390                cmd.arg = 0;
 391                cmd.flags = MMC_RSP_R2;
 392                err = sdhi_boot_request(base, &cmd);
 393                if (err)
 394                        return err;
 395        }
 396
 397        /* CMD3
 398         * MMC: Set the relative address
 399         * SD:  Get the relative address
 400         * Also puts the card into the standby state
 401         */
 402        {
 403                struct mmc_command cmd;
 404                cmd.opcode = MMC_SET_RELATIVE_ADDR;
 405                cmd.arg = 0;
 406                cmd.flags = MMC_RSP_R1;
 407                err = sdhi_boot_request(base, &cmd);
 408                if (err)
 409                        return err;
 410                cid = cmd.resp[0] >> 16;
 411        }
 412
 413        /* CMD9 - Get CSD */
 414        {
 415                struct mmc_command cmd;
 416                cmd.opcode = MMC_SEND_CSD;
 417                cmd.arg = cid << 16;
 418                cmd.flags = MMC_RSP_R2;
 419                err = sdhi_boot_request(base, &cmd);
 420                if (err)
 421                        return err;
 422        }
 423
 424        /* CMD7 - Select the card */
 425        {
 426                struct mmc_command cmd;
 427                cmd.opcode = MMC_SELECT_CARD;
 428                //cmd.arg = rca << 16;
 429                cmd.arg = cid << 16;
 430                //cmd.flags = MMC_RSP_R1B;
 431                cmd.flags = MMC_RSP_R1;
 432                err = sdhi_boot_request(base, &cmd);
 433                if (err)
 434                        return err;
 435        }
 436
 437        /* CMD16 - Set the block size */
 438        {
 439                struct mmc_command cmd;
 440                cmd.opcode = MMC_SET_BLOCKLEN;
 441                cmd.arg = TMIO_BBS;
 442                cmd.flags = MMC_RSP_R1;
 443                err = sdhi_boot_request(base, &cmd);
 444                if (err)
 445                        return err;
 446        }
 447
 448        return high_capacity;
 449}
 450