linux/drivers/staging/rts5139/sd.c
<<
>>
Prefs
   1/* Driver for Realtek RTS51xx USB card reader
   2 *
   3 * Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms of the GNU General Public License as published by the
   7 * Free Software Foundation; either version 2, or (at your option) any
   8 * later version.
   9 *
  10 * This program is distributed in the hope that it will be useful, but
  11 * WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13 * General Public License for more details.
  14 *
  15 * You should have received a copy of the GNU General Public License along
  16 * with this program; if not, see <http://www.gnu.org/licenses/>.
  17 *
  18 * Author:
  19 *   wwang (wei_wang@realsil.com.cn)
  20 *   No. 450, Shenhu Road, Suzhou Industry Park, Suzhou, China
  21 * Maintainer:
  22 *   Edwin Rong (edwin_rong@realsil.com.cn)
  23 *   No. 450, Shenhu Road, Suzhou Industry Park, Suzhou, China
  24 */
  25
  26#include <linux/blkdev.h>
  27#include <linux/kthread.h>
  28#include <linux/sched.h>
  29
  30#include "debug.h"
  31#include "trace.h"
  32#include "rts51x.h"
  33#include "rts51x_transport.h"
  34#include "rts51x_scsi.h"
  35#include "rts51x_card.h"
  36#include "sd.h"
  37
  38static inline void sd_set_reset_fail(struct rts51x_chip *chip, u8 err_code)
  39{
  40        struct sd_info *sd_card = &(chip->sd_card);
  41
  42        sd_card->sd_reset_fail |= err_code;
  43}
  44
  45static inline void sd_clear_reset_fail(struct rts51x_chip *chip)
  46{
  47        struct sd_info *sd_card = &(chip->sd_card);
  48
  49        sd_card->sd_reset_fail = 0;
  50}
  51
  52static inline int sd_check_reset_fail(struct rts51x_chip *chip, u8 err_code)
  53{
  54        struct sd_info *sd_card = &(chip->sd_card);
  55
  56        return sd_card->sd_reset_fail & err_code;
  57}
  58
  59static inline void sd_set_err_code(struct rts51x_chip *chip, u8 err_code)
  60{
  61        struct sd_info *sd_card = &(chip->sd_card);
  62
  63        sd_card->err_code |= err_code;
  64}
  65
  66static inline void sd_clr_err_code(struct rts51x_chip *chip)
  67{
  68        struct sd_info *sd_card = &(chip->sd_card);
  69
  70        sd_card->err_code = 0;
  71}
  72
  73static inline int sd_check_err_code(struct rts51x_chip *chip, u8 err_code)
  74{
  75        struct sd_info *sd_card = &(chip->sd_card);
  76
  77        return sd_card->err_code & err_code;
  78}
  79
  80static int sd_parse_err_code(struct rts51x_chip *chip)
  81{
  82        TRACE_RET(chip, STATUS_FAIL);
  83}
  84
  85int sd_check_data0_status(struct rts51x_chip *chip)
  86{
  87        int retval;
  88        u8 stat;
  89
  90        retval = rts51x_ep0_read_register(chip, SD_BUS_STAT, &stat);
  91        if (retval != STATUS_SUCCESS)
  92                TRACE_RET(chip, retval);
  93        if (!(stat & SD_DAT0_STATUS)) {
  94                sd_set_err_code(chip, SD_BUSY);
  95                TRACE_RET(chip, STATUS_FAIL);
  96        }
  97
  98        return STATUS_SUCCESS;
  99}
 100
 101static int sd_send_cmd_get_rsp(struct rts51x_chip *chip, u8 cmd_idx,
 102                               u32 arg, u8 rsp_type, u8 *rsp, int rsp_len)
 103{
 104        struct sd_info *sd_card = &(chip->sd_card);
 105        int retval;
 106        int timeout = 50;
 107        u16 reg_addr;
 108        u8 buf[17], stat;
 109        int len = 2;
 110        int rty_cnt = 0;
 111
 112        sd_clr_err_code(chip);
 113
 114        RTS51X_DEBUGP("SD/MMC CMD %d, arg = 0x%08x\n", cmd_idx, arg);
 115
 116        if (rsp_type == SD_RSP_TYPE_R1b)
 117                timeout = 3000;
 118
 119RTY_SEND_CMD:
 120
 121        rts51x_init_cmd(chip);
 122
 123        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CMD0, 0xFF, 0x40 | cmd_idx);
 124        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CMD1, 0xFF, (u8) (arg >> 24));
 125        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CMD2, 0xFF, (u8) (arg >> 16));
 126        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CMD3, 0xFF, (u8) (arg >> 8));
 127        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CMD4, 0xFF, (u8) arg);
 128
 129        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CFG2, 0xFF, rsp_type);
 130        rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01,
 131                       PINGPONG_BUFFER);
 132        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_TRANSFER, 0xFF,
 133                       SD_TM_CMD_RSP | SD_TRANSFER_START);
 134        rts51x_add_cmd(chip, CHECK_REG_CMD, SD_TRANSFER,
 135                       SD_TRANSFER_END | SD_STAT_IDLE,
 136                       SD_TRANSFER_END | SD_STAT_IDLE);
 137
 138        rts51x_add_cmd(chip, READ_REG_CMD, SD_STAT1, 0, 0);
 139
 140        if (CHECK_USB(chip, USB_20)) {
 141                if (rsp_type == SD_RSP_TYPE_R2) {
 142                        /* Read data from ping-pong buffer */
 143                        for (reg_addr = PPBUF_BASE2;
 144                             reg_addr < PPBUF_BASE2 + 16; reg_addr++) {
 145                                rts51x_add_cmd(chip, READ_REG_CMD, reg_addr, 0,
 146                                               0);
 147                        }
 148                        len = 18;
 149                } else if (rsp_type != SD_RSP_TYPE_R0) {
 150                        /* Read data from SD_CMDx registers */
 151                        for (reg_addr = SD_CMD0; reg_addr <= SD_CMD4;
 152                             reg_addr++) {
 153                                rts51x_add_cmd(chip, READ_REG_CMD, reg_addr, 0,
 154                                               0);
 155                        }
 156                        len = 7;
 157                } else {
 158                        len = 2;
 159                }
 160        } else {
 161                len = 2;
 162        }
 163
 164        retval = rts51x_send_cmd(chip, MODE_CR, 100);
 165        if (retval != STATUS_SUCCESS)
 166                TRACE_RET(chip, retval);
 167
 168        retval = rts51x_get_rsp(chip, len, timeout);
 169
 170        if (CHECK_SD_TRANS_FAIL(chip, retval)) {
 171                u8 val;
 172
 173                rts51x_ep0_read_register(chip, SD_STAT1, &val);
 174                RTS51X_DEBUGP("SD_STAT1: 0x%x\n", val);
 175
 176                rts51x_ep0_read_register(chip, SD_STAT2, &val);
 177                RTS51X_DEBUGP("SD_STAT2: 0x%x\n", val);
 178
 179                if (val & SD_RSP_80CLK_TIMEOUT)
 180                        sd_set_err_code(chip, SD_RSP_TIMEOUT);
 181
 182                rts51x_ep0_read_register(chip, SD_BUS_STAT, &val);
 183                RTS51X_DEBUGP("SD_BUS_STAT: 0x%x\n", val);
 184
 185                if (retval == STATUS_TIMEDOUT) {
 186                        if (rsp_type & SD_WAIT_BUSY_END) {
 187                                retval = sd_check_data0_status(chip);
 188                                if (retval != STATUS_SUCCESS)
 189                                        TRACE_RET(chip, retval);
 190                        } else {
 191                                sd_set_err_code(chip, SD_TO_ERR);
 192                        }
 193                }
 194                rts51x_clear_sd_error(chip);
 195
 196                TRACE_RET(chip, STATUS_FAIL);
 197        }
 198
 199        if (rsp_type == SD_RSP_TYPE_R0)
 200                return STATUS_SUCCESS;
 201
 202        if (CHECK_USB(chip, USB_20)) {
 203                rts51x_read_rsp_buf(chip, 2, buf, len - 2);
 204        } else {
 205                if (rsp_type == SD_RSP_TYPE_R2) {
 206                        reg_addr = PPBUF_BASE2;
 207                        len = 16;
 208                } else {
 209                        reg_addr = SD_CMD0;
 210                        len = 5;
 211                }
 212                retval = rts51x_seq_read_register(chip, reg_addr,
 213                                                     (unsigned short)len, buf);
 214                if (retval != STATUS_SUCCESS)
 215                        TRACE_RET(chip, retval);
 216        }
 217        stat = chip->rsp_buf[1];
 218
 219        /* Check (Start,Transmission) bit of Response */
 220        if ((buf[0] & 0xC0) != 0) {
 221                sd_set_err_code(chip, SD_STS_ERR);
 222                TRACE_RET(chip, STATUS_FAIL);
 223        }
 224        /* Check CRC7 */
 225        if (!(rsp_type & SD_NO_CHECK_CRC7)) {
 226                if (stat & SD_CRC7_ERR) {
 227                        if (cmd_idx == WRITE_MULTIPLE_BLOCK) {
 228                                sd_set_err_code(chip, SD_CRC_ERR);
 229                                TRACE_RET(chip, STATUS_FAIL);
 230                        }
 231                        if (rty_cnt < SD_MAX_RETRY_COUNT) {
 232                                wait_timeout(20);
 233                                rty_cnt++;
 234                                goto RTY_SEND_CMD;
 235                        } else {
 236                                sd_set_err_code(chip, SD_CRC_ERR);
 237                                TRACE_RET(chip, STATUS_FAIL);
 238                        }
 239                }
 240        }
 241        /* Check Status */
 242        if ((rsp_type == SD_RSP_TYPE_R1) || (rsp_type == SD_RSP_TYPE_R1b)) {
 243                if ((cmd_idx != SEND_RELATIVE_ADDR)
 244                    && (cmd_idx != SEND_IF_COND)) {
 245                        if (cmd_idx != STOP_TRANSMISSION) {
 246                                if (buf[1] & 0x80)
 247                                        TRACE_RET(chip, STATUS_FAIL);
 248                        }
 249                        if (buf[1] & 0x7F) {
 250                                RTS51X_DEBUGP("buf[1]: 0x%02x\n", buf[1]);
 251                                TRACE_RET(chip, STATUS_FAIL);
 252                        }
 253                        if (buf[2] & 0xFF) {
 254                                RTS51X_DEBUGP("buf[2]: 0x%02x\n", buf[2]);
 255                                TRACE_RET(chip, STATUS_FAIL);
 256                        }
 257                        if (buf[3] & 0x80) {
 258                                RTS51X_DEBUGP("buf[3]: 0x%02x\n", buf[3]);
 259                                TRACE_RET(chip, STATUS_FAIL);
 260                        }
 261                        if (buf[3] & 0x01) {
 262                                /* Get "READY_FOR_DATA" bit */
 263                                sd_card->sd_data_buf_ready = 1;
 264                        } else {
 265                                sd_card->sd_data_buf_ready = 0;
 266                        }
 267                }
 268        }
 269
 270        if (rsp && rsp_len)
 271                memcpy(rsp, buf, rsp_len);
 272
 273        return STATUS_SUCCESS;
 274}
 275
 276static inline void sd_print_debug_reg(struct rts51x_chip *chip)
 277{
 278#ifdef CONFIG_RTS5139_DEBUG
 279        u8 val = 0;
 280
 281        rts51x_ep0_read_register(chip, SD_STAT1, &val);
 282        RTS51X_DEBUGP("SD_STAT1: 0x%x\n", val);
 283        rts51x_ep0_read_register(chip, SD_STAT2, &val);
 284        RTS51X_DEBUGP("SD_STAT2: 0x%x\n", val);
 285        rts51x_ep0_read_register(chip, SD_BUS_STAT, &val);
 286        RTS51X_DEBUGP("SD_BUS_STAT: 0x%x\n", val);
 287#endif
 288}
 289
 290int sd_read_data(struct rts51x_chip *chip, u8 trans_mode, u8 *cmd, int cmd_len,
 291                 u16 byte_cnt, u16 blk_cnt, u8 bus_width, u8 *buf, int buf_len,
 292                 int timeout)
 293{
 294        struct sd_info *sd_card = &(chip->sd_card);
 295        int retval;
 296        int i;
 297
 298        sd_clr_err_code(chip);
 299
 300        if (!buf)
 301                buf_len = 0;
 302
 303        if (buf_len > 512)
 304                /* This function can't read data more than one page */
 305                TRACE_RET(chip, STATUS_FAIL);
 306
 307        rts51x_init_cmd(chip);
 308
 309        if (cmd_len) {
 310                RTS51X_DEBUGP("SD/MMC CMD %d\n", cmd[0] - 0x40);
 311                for (i = 0; i < (cmd_len < 6 ? cmd_len : 6); i++) {
 312                        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CMD0 + i, 0xFF,
 313                                       cmd[i]);
 314                }
 315        }
 316        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BYTE_CNT_L, 0xFF, (u8) byte_cnt);
 317        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BYTE_CNT_H, 0xFF,
 318                       (u8) (byte_cnt >> 8));
 319        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BLOCK_CNT_L, 0xFF, (u8) blk_cnt);
 320        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BLOCK_CNT_H, 0xFF,
 321                       (u8) (blk_cnt >> 8));
 322
 323        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CFG1, 0x03, bus_width);
 324
 325        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CFG2, 0xFF,
 326                       SD_CALCULATE_CRC7 | SD_CHECK_CRC16 | SD_NO_WAIT_BUSY_END
 327                       | SD_CHECK_CRC7 | SD_RSP_LEN_6);
 328        if (trans_mode != SD_TM_AUTO_TUNING) {
 329                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01,
 330                               PINGPONG_BUFFER);
 331        }
 332        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_TRANSFER, 0xFF,
 333                       trans_mode | SD_TRANSFER_START);
 334        rts51x_add_cmd(chip, CHECK_REG_CMD, SD_TRANSFER, SD_TRANSFER_END,
 335                       SD_TRANSFER_END);
 336
 337        retval = rts51x_send_cmd(chip, MODE_CR, 100);
 338        if (retval != STATUS_SUCCESS)
 339                TRACE_RET(chip, retval);
 340
 341        retval = rts51x_get_rsp(chip, 1, timeout);
 342
 343        if (CHECK_SD_TRANS_FAIL(chip, retval)) {
 344                sd_print_debug_reg(chip);
 345                if (retval == STATUS_TIMEDOUT) {
 346                        sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
 347                                            SD_RSP_TYPE_R1, NULL, 0);
 348                }
 349
 350                TRACE_RET(chip, STATUS_FAIL);
 351        }
 352
 353        if (buf && buf_len) {
 354                retval = rts51x_read_ppbuf(chip, buf, buf_len);
 355                if (retval != STATUS_SUCCESS)
 356                        TRACE_RET(chip, retval);
 357        }
 358
 359        return STATUS_SUCCESS;
 360}
 361
 362static int sd_write_data(struct rts51x_chip *chip, u8 trans_mode,
 363                         u8 *cmd, int cmd_len, u16 byte_cnt, u16 blk_cnt,
 364                         u8 bus_width, u8 *buf, int buf_len, int timeout)
 365{
 366        struct sd_info *sd_card = &(chip->sd_card);
 367        int retval;
 368        int i;
 369
 370        sd_clr_err_code(chip);
 371
 372        if (!buf)
 373                buf_len = 0;
 374
 375        /* This function can't write data more than one page */
 376        if (buf_len > 512)
 377                TRACE_RET(chip, STATUS_FAIL);
 378
 379        if (buf && buf_len) {
 380                retval = rts51x_write_ppbuf(chip, buf, buf_len);
 381                if (retval != STATUS_SUCCESS)
 382                        TRACE_RET(chip, retval);
 383        }
 384
 385        rts51x_init_cmd(chip);
 386
 387        if (cmd_len) {
 388                RTS51X_DEBUGP("SD/MMC CMD %d\n", cmd[0] - 0x40);
 389                for (i = 0; i < (cmd_len < 6 ? cmd_len : 6); i++) {
 390                        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CMD0 + i, 0xFF,
 391                                       cmd[i]);
 392                }
 393        }
 394        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BYTE_CNT_L, 0xFF, (u8) byte_cnt);
 395        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BYTE_CNT_H, 0xFF,
 396                       (u8) (byte_cnt >> 8));
 397        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BLOCK_CNT_L, 0xFF, (u8) blk_cnt);
 398        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BLOCK_CNT_H, 0xFF,
 399                       (u8) (blk_cnt >> 8));
 400
 401        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CFG1, 0x03, bus_width);
 402
 403        if (cmd_len) {
 404                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CFG2, 0xFF,
 405                               SD_CALCULATE_CRC7 | SD_CHECK_CRC16 |
 406                               SD_WAIT_BUSY_END | SD_CHECK_CRC7 | SD_RSP_LEN_6);
 407
 408        } else {
 409                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CFG2, 0xFF,
 410                               SD_CALCULATE_CRC7 | SD_CHECK_CRC16 |
 411                               SD_NO_WAIT_BUSY_END | SD_CHECK_CRC7 |
 412                               SD_RSP_LEN_6);
 413        }
 414
 415        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_TRANSFER, 0xFF,
 416                       trans_mode | SD_TRANSFER_START);
 417        rts51x_add_cmd(chip, CHECK_REG_CMD, SD_TRANSFER, SD_TRANSFER_END,
 418                       SD_TRANSFER_END);
 419
 420        retval = rts51x_send_cmd(chip, MODE_CR, 100);
 421        if (retval != STATUS_SUCCESS)
 422                TRACE_RET(chip, retval);
 423
 424        retval = rts51x_get_rsp(chip, 1, timeout);
 425
 426        if (CHECK_SD_TRANS_FAIL(chip, retval)) {
 427                sd_print_debug_reg(chip);
 428
 429                if (retval == STATUS_TIMEDOUT)
 430                        sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
 431                                            SD_RSP_TYPE_R1, NULL, 0);
 432
 433                TRACE_RET(chip, STATUS_FAIL);
 434        }
 435
 436        return STATUS_SUCCESS;
 437}
 438
 439static int sd_check_csd(struct rts51x_chip *chip, char check_wp)
 440{
 441        struct sd_info *sd_card = &(chip->sd_card);
 442        int retval;
 443        int i;
 444        u8 csd_ver, trans_speed;
 445        u8 rsp[16];
 446
 447        for (i = 0; i < 6; i++) {
 448                if (monitor_card_cd(chip, SD_CARD) == CD_NOT_EXIST) {
 449                        sd_set_reset_fail(chip, SD_RESET_FAIL);
 450                        TRACE_RET(chip, STATUS_FAIL);
 451                }
 452
 453                retval =
 454                    sd_send_cmd_get_rsp(chip, SEND_CSD, sd_card->sd_addr,
 455                                        SD_RSP_TYPE_R2, rsp, 16);
 456                if (retval == STATUS_SUCCESS)
 457                        break;
 458        }
 459
 460        if (i == 6)
 461                TRACE_RET(chip, STATUS_FAIL);
 462        memcpy(sd_card->raw_csd, rsp + 1, 15);
 463        /* Get CRC7 */
 464        RTS51X_READ_REG(chip, SD_CMD5, sd_card->raw_csd + 15);
 465
 466        RTS51X_DEBUGP("CSD Response:\n");
 467        RTS51X_DUMP(rsp, 16);
 468
 469        /* Get CSD Version */
 470        csd_ver = (rsp[1] & 0xc0) >> 6;
 471        RTS51X_DEBUGP("csd_ver = %d\n", csd_ver);
 472
 473        trans_speed = rsp[4];
 474        if ((trans_speed & 0x07) == 0x02) {     /* 10Mbits/s */
 475                if ((trans_speed & 0xf8) >= 0x30) {     /* >25Mbits/s */
 476                        if (chip->asic_code)
 477                                sd_card->sd_clock = 46;
 478                        else
 479                                sd_card->sd_clock = CLK_50;
 480                } else if ((trans_speed & 0xf8) == 0x28) { /* 20Mbits/s */
 481                        if (chip->asic_code)
 482                                sd_card->sd_clock = 39;
 483                        else
 484                                sd_card->sd_clock = CLK_40;
 485                } else if ((trans_speed & 0xf8) == 0x20) { /* 15Mbits/s */
 486                        if (chip->asic_code)
 487                                sd_card->sd_clock = 29;
 488                        else
 489                                sd_card->sd_clock = CLK_30;
 490                } else if ((trans_speed & 0xf8) >= 0x10) { /* 12Mbits/s */
 491                        if (chip->asic_code)
 492                                sd_card->sd_clock = 23;
 493                        else
 494                                sd_card->sd_clock = CLK_20;
 495                } else if ((trans_speed & 0x08) >= 0x08) { /* 10Mbits/s */
 496                        if (chip->asic_code)
 497                                sd_card->sd_clock = 19;
 498                        else
 499                                sd_card->sd_clock = CLK_20;
 500                } /*else { */
 501                        /*If this ,then slow card will use 30M clock */
 502                        /* TRACE_RET(chip, STATUS_FAIL); */
 503                /* } */
 504        }
 505        /*else {
 506           TRACE_RET(chip, STATUS_FAIL);
 507           } */
 508        if (CHK_MMC_SECTOR_MODE(sd_card)) {
 509                sd_card->capacity = 0;
 510        } else {
 511                /* For High-Capacity Card, CSD_STRUCTURE always be "0x1" */
 512                if ((!CHK_SD_HCXC(sd_card)) || (csd_ver == 0)) {
 513                        /* Calculate total sector according to C_SIZE,
 514                         * C_SIZE_MULT & READ_BL_LEN */
 515                        u8 blk_size, c_size_mult;
 516                        u16 c_size;
 517                        /* Get READ_BL_LEN */
 518                        blk_size = rsp[6] & 0x0F;
 519                        /* Get C_SIZE */
 520                        c_size = ((u16) (rsp[7] & 0x03) << 10)
 521                            + ((u16) rsp[8] << 2)
 522                            + ((u16) (rsp[9] & 0xC0) >> 6);
 523                        /* Get C_SIZE_MUL */
 524                        c_size_mult = (u8) ((rsp[10] & 0x03) << 1);
 525                        c_size_mult += (rsp[11] & 0x80) >> 7;
 526                        /* Calculate total Capacity  */
 527                        sd_card->capacity =
 528                            (((u32) (c_size + 1)) *
 529                             (1 << (c_size_mult + 2))) << (blk_size - 9);
 530                } else {
 531                        /* High Capacity Card and Use CSD2.0 Version */
 532                        u32 total_sector = 0;
 533                        total_sector = (((u32) rsp[8] & 0x3f) << 16) |
 534                            ((u32) rsp[9] << 8) | (u32) rsp[10];
 535                        /* Total Capacity= (C_SIZE+1) *
 536                         * 512K Byte = (C_SIZE+1)K Sector,1K = 1024 Bytes */
 537                        sd_card->capacity = (total_sector + 1) << 10;
 538                }
 539        }
 540
 541        /* We need check Write-Protected Status by Field PERM WP or TEMP WP */
 542        if (check_wp) {
 543                if (rsp[15] & 0x30)
 544                        chip->card_wp |= SD_CARD;
 545                RTS51X_DEBUGP("CSD WP Status: 0x%x\n", rsp[15]);
 546        }
 547
 548        return STATUS_SUCCESS;
 549}
 550
 551static int sd_set_sample_push_timing(struct rts51x_chip *chip)
 552{
 553        struct sd_info *sd_card = &(chip->sd_card);
 554        int retval;
 555
 556        rts51x_init_cmd(chip);
 557
 558        if (CHK_SD_SDR104(sd_card) || CHK_SD_SDR50(sd_card)) {
 559                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CFG1,
 560                               0x0C | SD_ASYNC_FIFO_RST,
 561                               SD_30_MODE | SD_ASYNC_FIFO_RST);
 562                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_CLK_SOURCE, 0xFF,
 563                               CRC_VAR_CLK0 | SD30_FIX_CLK | SAMPLE_VAR_CLK1);
 564        } else if (CHK_SD_DDR50(sd_card) || CHK_MMC_DDR52(sd_card)) {
 565                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CFG1,
 566                               0x0C | SD_ASYNC_FIFO_RST,
 567                               SD_DDR_MODE | SD_ASYNC_FIFO_RST);
 568                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_CLK_SOURCE, 0xFF,
 569                               CRC_VAR_CLK0 | SD30_FIX_CLK | SAMPLE_VAR_CLK1);
 570                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_PUSH_POINT_CTL,
 571                               DDR_VAR_TX_CMD_DAT, DDR_VAR_TX_CMD_DAT);
 572                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_SAMPLE_POINT_CTL,
 573                               DDR_VAR_RX_DAT | DDR_VAR_RX_CMD,
 574                               DDR_VAR_RX_DAT | DDR_VAR_RX_CMD);
 575        } else {
 576                u8 val = 0;
 577
 578                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CFG1, 0x0C, SD_20_MODE);
 579                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_CLK_SOURCE, 0xFF,
 580                               CRC_FIX_CLK | SD30_VAR_CLK0 | SAMPLE_VAR_CLK1);
 581
 582                if ((chip->option.sd_ctl & SD_PUSH_POINT_CTL_MASK) ==
 583                    SD_PUSH_POINT_AUTO) {
 584                        val = SD20_TX_NEG_EDGE;
 585                } else if ((chip->option.sd_ctl & SD_PUSH_POINT_CTL_MASK) ==
 586                           SD_PUSH_POINT_DELAY) {
 587                        val = SD20_TX_14_AHEAD;
 588                } else {
 589                        val = SD20_TX_NEG_EDGE;
 590                }
 591                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_PUSH_POINT_CTL,
 592                               SD20_TX_SEL_MASK, val);
 593
 594                if ((chip->option.sd_ctl & SD_SAMPLE_POINT_CTL_MASK) ==
 595                    SD_SAMPLE_POINT_AUTO) {
 596                        if (chip->asic_code) {
 597                                if (CHK_SD_HS(sd_card) || CHK_MMC_52M(sd_card))
 598                                        val = SD20_RX_14_DELAY;
 599                                else
 600                                        val = SD20_RX_POS_EDGE;
 601                        } else {
 602                                val = SD20_RX_14_DELAY;
 603                        }
 604                } else if ((chip->option.sd_ctl & SD_SAMPLE_POINT_CTL_MASK) ==
 605                           SD_SAMPLE_POINT_DELAY) {
 606                        val = SD20_RX_14_DELAY;
 607                } else {
 608                        val = SD20_RX_POS_EDGE;
 609                }
 610                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_SAMPLE_POINT_CTL,
 611                               SD20_RX_SEL_MASK, val);
 612        }
 613
 614        if (CHK_MMC_DDR52(sd_card) && CHK_MMC_8BIT(sd_card)) {
 615                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_DMA1_CTL,
 616                               EXTEND_DMA1_ASYNC_SIGNAL, 0);
 617        }
 618
 619        retval = rts51x_send_cmd(chip, MODE_C, 100);
 620        if (retval != STATUS_SUCCESS)
 621                TRACE_RET(chip, retval);
 622
 623        return STATUS_SUCCESS;
 624}
 625
 626static void sd_choose_proper_clock(struct rts51x_chip *chip)
 627{
 628        struct sd_info *sd_card = &(chip->sd_card);
 629
 630        if (CHK_SD_SDR104(sd_card)) {
 631                if (chip->asic_code)
 632                        sd_card->sd_clock = chip->option.asic_sd_sdr104_clk;
 633                else
 634                        sd_card->sd_clock = chip->option.fpga_sd_sdr104_clk;
 635        } else if (CHK_SD_DDR50(sd_card)) {
 636                if (chip->asic_code)
 637                        sd_card->sd_clock = chip->option.asic_sd_ddr50_clk;
 638                else
 639                        sd_card->sd_clock = chip->option.fpga_sd_ddr50_clk;
 640        } else if (CHK_SD_SDR50(sd_card)) {
 641                if (chip->asic_code)
 642                        sd_card->sd_clock = chip->option.asic_sd_sdr50_clk;
 643                else
 644                        sd_card->sd_clock = chip->option.fpga_sd_sdr50_clk;
 645        } else if (CHK_SD_HS(sd_card)) {
 646                if (chip->asic_code)
 647                        sd_card->sd_clock = chip->option.asic_sd_hs_clk;
 648                else
 649                        sd_card->sd_clock = chip->option.fpga_sd_hs_clk;
 650        } else if (CHK_MMC_52M(sd_card) || CHK_MMC_DDR52(sd_card)) {
 651                if (chip->asic_code)
 652                        sd_card->sd_clock = chip->option.asic_mmc_52m_clk;
 653                else
 654                        sd_card->sd_clock = chip->option.fpga_mmc_52m_clk;
 655        } else if (CHK_MMC_26M(sd_card)) {
 656                if (chip->asic_code) {
 657                        sd_card->sd_clock = 46;
 658                        RTS51X_DEBUGP("Set MMC clock to 22.5MHz\n");
 659                } else {
 660                        sd_card->sd_clock = CLK_50;
 661                }
 662        }
 663}
 664
 665static int sd_set_init_para(struct rts51x_chip *chip)
 666{
 667        struct sd_info *sd_card = &(chip->sd_card);
 668        int retval;
 669
 670        retval = sd_set_sample_push_timing(chip);
 671        if (retval != STATUS_SUCCESS)
 672                TRACE_RET(chip, retval);
 673
 674        sd_choose_proper_clock(chip);
 675
 676        retval = switch_clock(chip, sd_card->sd_clock);
 677        if (retval != STATUS_SUCCESS)
 678                TRACE_RET(chip, retval);
 679
 680        return STATUS_SUCCESS;
 681}
 682
 683int rts51x_sd_select_card(struct rts51x_chip *chip, int select)
 684{
 685        struct sd_info *sd_card = &(chip->sd_card);
 686        int retval;
 687        u8 cmd_idx, cmd_type;
 688        u32 addr;
 689
 690        if (select) {
 691                cmd_idx = SELECT_CARD;
 692                cmd_type = SD_RSP_TYPE_R1;
 693                addr = sd_card->sd_addr;
 694        } else {
 695                cmd_idx = DESELECT_CARD;
 696                cmd_type = SD_RSP_TYPE_R0;
 697                addr = 0;
 698        }
 699
 700        retval = sd_send_cmd_get_rsp(chip, cmd_idx, addr, cmd_type, NULL, 0);
 701        if (retval != STATUS_SUCCESS)
 702                TRACE_RET(chip, retval);
 703
 704        return STATUS_SUCCESS;
 705}
 706
 707static int sd_wait_currentstate_dataready(struct rts51x_chip *chip, u8 statechk,
 708                                   u8 rdychk, u16 pollingcnt)
 709{
 710        struct sd_info *sd_card = &(chip->sd_card);
 711        int retval;
 712        u8 rsp[5];
 713        u16 i;
 714
 715        for (i = 0; i < pollingcnt; i++) {
 716
 717                retval =
 718                    sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
 719                                        SD_RSP_TYPE_R1, rsp, 5);
 720                if (retval == STATUS_SUCCESS) {
 721                        if (((rsp[3] & 0x1E) == statechk)
 722                            && ((rsp[3] & 0x01) == rdychk)) {
 723                                return STATUS_SUCCESS;
 724                        }
 725                } else {
 726                        rts51x_clear_sd_error(chip);
 727                        TRACE_RET(chip, STATUS_FAIL);
 728                }
 729        }
 730
 731        return STATUS_TIMEDOUT;
 732}
 733
 734static int sd_voltage_switch(struct rts51x_chip *chip)
 735{
 736        int retval;
 737        u8 stat;
 738
 739        RTS51X_WRITE_REG(chip, SD_BUS_STAT,
 740                         SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP,
 741                         SD_CLK_TOGGLE_EN);
 742
 743        retval =
 744            sd_send_cmd_get_rsp(chip, VOLTAGE_SWITCH, 0, SD_RSP_TYPE_R1, NULL,
 745                                0);
 746        if (retval != STATUS_SUCCESS)
 747                TRACE_RET(chip, retval);
 748
 749        RTS51X_READ_REG(chip, SD_BUS_STAT, &stat);
 750        if (stat & (SD_CMD_STATUS | SD_DAT3_STATUS | SD_DAT2_STATUS |
 751                    SD_DAT1_STATUS | SD_DAT0_STATUS))
 752                TRACE_RET(chip, STATUS_FAIL);
 753
 754        rts51x_init_cmd(chip);
 755        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BUS_STAT, 0xFF,
 756                       SD_CLK_FORCE_STOP);
 757        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_PAD_CTL, SD_IO_USING_1V8,
 758                       SD_IO_USING_1V8);
 759        if (chip->asic_code)
 760                rts51x_add_cmd(chip, WRITE_REG_CMD, LDO_POWER_CFG,
 761                               TUNE_SD18_MASK, TUNE_SD18_1V8);
 762        retval = rts51x_send_cmd(chip, MODE_C, 100);
 763        if (retval != STATUS_SUCCESS)
 764                TRACE_RET(chip, retval);
 765
 766        wait_timeout(chip->option.D3318_off_delay);
 767
 768        RTS51X_WRITE_REG(chip, SD_BUS_STAT, 0xFF, SD_CLK_TOGGLE_EN);
 769        wait_timeout(10);
 770
 771        RTS51X_READ_REG(chip, SD_BUS_STAT, &stat);
 772        if ((stat & (SD_CMD_STATUS | SD_DAT3_STATUS | SD_DAT2_STATUS |
 773                     SD_DAT1_STATUS | SD_DAT0_STATUS)) !=
 774            (SD_CMD_STATUS | SD_DAT3_STATUS | SD_DAT2_STATUS |
 775             SD_DAT1_STATUS | SD_DAT0_STATUS)) {
 776                rts51x_init_cmd(chip);
 777                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BUS_STAT, 0xFF,
 778                               SD_CLK_FORCE_STOP);
 779                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_CLK_EN, 0xFF, 0);
 780                rts51x_send_cmd(chip, MODE_C, 100);
 781                TRACE_RET(chip, STATUS_FAIL);
 782        }
 783        RTS51X_WRITE_REG(chip, SD_BUS_STAT,
 784                         SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP, 0);
 785
 786        return STATUS_SUCCESS;
 787}
 788
 789static int sd_change_phase(struct rts51x_chip *chip, u8 sample_point,
 790                           u8 tune_dir)
 791{
 792        u16 SD_VP_CTL, SD_DCMPS_CTL;
 793        u8 val;
 794        int retval;
 795
 796        RTS51X_DEBUGP("sd_change_phase (sample_point = %d, tune_dir = %d)\n",
 797                       sample_point, tune_dir);
 798
 799        if (tune_dir == TUNE_RX) {
 800                SD_VP_CTL = SD_VPCLK1_CTL;
 801                SD_DCMPS_CTL = SD_DCMPS1_CTL;
 802        } else {
 803                SD_VP_CTL = SD_VPCLK0_CTL;
 804                SD_DCMPS_CTL = SD_DCMPS0_CTL;
 805        }
 806
 807        if (chip->asic_code) {
 808                RTS51X_WRITE_REG(chip, CLK_DIV, CLK_CHANGE, CLK_CHANGE);
 809                RTS51X_WRITE_REG(chip, SD_VP_CTL, 0x1F, sample_point);
 810                RTS51X_WRITE_REG(chip, SD_VPCLK0_CTL, PHASE_NOT_RESET, 0);
 811                RTS51X_WRITE_REG(chip, SD_VPCLK0_CTL, PHASE_NOT_RESET,
 812                                 PHASE_NOT_RESET);
 813                RTS51X_WRITE_REG(chip, CLK_DIV, CLK_CHANGE, 0);
 814        } else {
 815#ifdef CONFIG_RTS5139_DEBUG
 816                RTS51X_READ_REG(chip, SD_VP_CTL, &val);
 817                RTS51X_DEBUGP("SD_VP_CTL: 0x%x\n", val);
 818                RTS51X_READ_REG(chip, SD_DCMPS_CTL, &val);
 819                RTS51X_DEBUGP("SD_DCMPS_CTL: 0x%x\n", val);
 820#endif
 821
 822                RTS51X_WRITE_REG(chip, CLK_DIV, CLK_CHANGE, CLK_CHANGE);
 823                udelay(100);
 824                RTS51X_WRITE_REG(chip, SD_VP_CTL, 0xFF,
 825                                 PHASE_NOT_RESET | sample_point);
 826                udelay(200);
 827
 828                rts51x_init_cmd(chip);
 829                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_DCMPS_CTL, DCMPS_CHANGE,
 830                               DCMPS_CHANGE);
 831                rts51x_add_cmd(chip, CHECK_REG_CMD, SD_DCMPS_CTL,
 832                               DCMPS_CHANGE_DONE, DCMPS_CHANGE_DONE);
 833                retval = rts51x_send_cmd(chip, MODE_CR, 100);
 834                if (retval != STATUS_SUCCESS)
 835                        TRACE_GOTO(chip, Fail);
 836
 837                retval = rts51x_get_rsp(chip, 1, 500);
 838                if (retval != STATUS_SUCCESS)
 839                        TRACE_GOTO(chip, Fail);
 840
 841                val = chip->rsp_buf[0];
 842                if (val & DCMPS_ERROR)
 843                        TRACE_GOTO(chip, Fail);
 844                if ((val & DCMPS_CURRENT_PHASE) != sample_point)
 845                        TRACE_GOTO(chip, Fail);
 846                RTS51X_WRITE_REG(chip, SD_DCMPS_CTL, DCMPS_CHANGE, 0);
 847                RTS51X_WRITE_REG(chip, CLK_DIV, CLK_CHANGE, 0);
 848                udelay(100);
 849        }
 850
 851        RTS51X_WRITE_REG(chip, SD_CFG1, SD_ASYNC_FIFO_RST, 0);
 852
 853        return STATUS_SUCCESS;
 854
 855Fail:
 856#ifdef CONFIG_RTS5139_DEBUG
 857        rts51x_ep0_read_register(chip, SD_VP_CTL, &val);
 858        RTS51X_DEBUGP("SD_VP_CTL: 0x%x\n", val);
 859        rts51x_ep0_read_register(chip, SD_DCMPS_CTL, &val);
 860        RTS51X_DEBUGP("SD_DCMPS_CTL: 0x%x\n", val);
 861#endif
 862
 863        RTS51X_WRITE_REG(chip, SD_DCMPS_CTL, DCMPS_CHANGE, 0);
 864        RTS51X_WRITE_REG(chip, SD_VP_CTL, PHASE_CHANGE, 0);
 865        wait_timeout(10);
 866
 867        return STATUS_FAIL;
 868}
 869
 870static int sd_check_spec(struct rts51x_chip *chip, u8 bus_width)
 871{
 872        struct sd_info *sd_card = &(chip->sd_card);
 873        int retval;
 874        u8 cmd[5], buf[8];
 875
 876        retval =
 877            sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr, SD_RSP_TYPE_R1,
 878                                NULL, 0);
 879        if (retval != STATUS_SUCCESS)
 880                TRACE_RET(chip, STATUS_FAIL);
 881
 882        cmd[0] = 0x40 | SEND_SCR;
 883        cmd[1] = 0;
 884        cmd[2] = 0;
 885        cmd[3] = 0;
 886        cmd[4] = 0;
 887
 888        retval =
 889            sd_read_data(chip, SD_TM_NORMAL_READ, cmd, 5, 8, 1, bus_width, buf,
 890                         8, 250);
 891        if (retval != STATUS_SUCCESS) {
 892                rts51x_clear_sd_error(chip);
 893                TRACE_RET(chip, retval);
 894        }
 895
 896        memcpy(sd_card->raw_scr, buf, 8);
 897
 898        if ((buf[0] & 0x0F) == 0)
 899                TRACE_RET(chip, STATUS_FAIL);
 900
 901        return STATUS_SUCCESS;
 902}
 903
 904static int sd_query_switch_result(struct rts51x_chip *chip, u8 func_group,
 905                                  u8 func_to_switch, u8 *buf, int buf_len)
 906{
 907        u8 support_mask = 0, query_switch = 0, switch_busy = 0;
 908        int support_offset = 0, query_switch_offset = 0, check_busy_offset = 0;
 909
 910        if (func_group == SD_FUNC_GROUP_1) {
 911                support_offset = FUNCTION_GROUP1_SUPPORT_OFFSET;
 912                query_switch_offset = FUNCTION_GROUP1_QUERY_SWITCH_OFFSET;
 913                check_busy_offset = FUNCTION_GROUP1_CHECK_BUSY_OFFSET;
 914
 915                switch (func_to_switch) {
 916                case HS_SUPPORT:
 917                        support_mask = HS_SUPPORT_MASK;
 918                        query_switch = HS_QUERY_SWITCH_OK;
 919                        switch_busy = HS_SWITCH_BUSY;
 920                        break;
 921
 922                case SDR50_SUPPORT:
 923                        support_mask = SDR50_SUPPORT_MASK;
 924                        query_switch = SDR50_QUERY_SWITCH_OK;
 925                        switch_busy = SDR50_SWITCH_BUSY;
 926                        break;
 927
 928                case SDR104_SUPPORT:
 929                        support_mask = SDR104_SUPPORT_MASK;
 930                        query_switch = SDR104_QUERY_SWITCH_OK;
 931                        switch_busy = SDR104_SWITCH_BUSY;
 932                        break;
 933
 934                case DDR50_SUPPORT:
 935                        support_mask = DDR50_SUPPORT_MASK;
 936                        query_switch = DDR50_QUERY_SWITCH_OK;
 937                        switch_busy = DDR50_SWITCH_BUSY;
 938                        break;
 939
 940                default:
 941                        TRACE_RET(chip, STATUS_FAIL);
 942                }
 943        } else if (func_group == SD_FUNC_GROUP_3) {
 944                support_offset = FUNCTION_GROUP3_SUPPORT_OFFSET;
 945                query_switch_offset = FUNCTION_GROUP3_QUERY_SWITCH_OFFSET;
 946                check_busy_offset = FUNCTION_GROUP3_CHECK_BUSY_OFFSET;
 947
 948                switch (func_to_switch) {
 949                case DRIVING_TYPE_A:
 950                        support_mask = DRIVING_TYPE_A_MASK;
 951                        query_switch = TYPE_A_QUERY_SWITCH_OK;
 952                        switch_busy = TYPE_A_SWITCH_BUSY;
 953                        break;
 954
 955                case DRIVING_TYPE_C:
 956                        support_mask = DRIVING_TYPE_C_MASK;
 957                        query_switch = TYPE_C_QUERY_SWITCH_OK;
 958                        switch_busy = TYPE_C_SWITCH_BUSY;
 959                        break;
 960
 961                case DRIVING_TYPE_D:
 962                        support_mask = DRIVING_TYPE_D_MASK;
 963                        query_switch = TYPE_D_QUERY_SWITCH_OK;
 964                        switch_busy = TYPE_D_SWITCH_BUSY;
 965                        break;
 966
 967                default:
 968                        TRACE_RET(chip, STATUS_FAIL);
 969                }
 970        } else if (func_group == SD_FUNC_GROUP_4) {
 971                support_offset = FUNCTION_GROUP4_SUPPORT_OFFSET;
 972                query_switch_offset = FUNCTION_GROUP4_QUERY_SWITCH_OFFSET;
 973                check_busy_offset = FUNCTION_GROUP4_CHECK_BUSY_OFFSET;
 974
 975                switch (func_to_switch) {
 976                case CURRENT_LIMIT_400:
 977                        support_mask = CURRENT_LIMIT_400_MASK;
 978                        query_switch = CURRENT_LIMIT_400_QUERY_SWITCH_OK;
 979                        switch_busy = CURRENT_LIMIT_400_SWITCH_BUSY;
 980                        break;
 981
 982                case CURRENT_LIMIT_600:
 983                        support_mask = CURRENT_LIMIT_600_MASK;
 984                        query_switch = CURRENT_LIMIT_600_QUERY_SWITCH_OK;
 985                        switch_busy = CURRENT_LIMIT_600_SWITCH_BUSY;
 986                        break;
 987
 988                case CURRENT_LIMIT_800:
 989                        support_mask = CURRENT_LIMIT_800_MASK;
 990                        query_switch = CURRENT_LIMIT_800_QUERY_SWITCH_OK;
 991                        switch_busy = CURRENT_LIMIT_800_SWITCH_BUSY;
 992                        break;
 993
 994                default:
 995                        TRACE_RET(chip, STATUS_FAIL);
 996                }
 997        } else {
 998                TRACE_RET(chip, STATUS_FAIL);
 999        }
1000
1001        if (func_group == SD_FUNC_GROUP_4)
1002                buf[query_switch_offset] =
1003                    (buf[query_switch_offset] & 0xf0) >> 4;
1004        if (!(buf[support_offset] & support_mask) ||
1005            ((buf[query_switch_offset] & 0x0F) != query_switch))
1006                TRACE_RET(chip, STATUS_FAIL);
1007
1008        if ((buf[DATA_STRUCTURE_VER_OFFSET] == 0x01) &&
1009            ((buf[check_busy_offset] & switch_busy) == switch_busy))
1010                TRACE_RET(chip, STATUS_FAIL);
1011
1012        return STATUS_SUCCESS;
1013}
1014
1015static int sd_check_switch_mode(struct rts51x_chip *chip, u8 mode,
1016                                u8 func_group, u8 func_to_switch, u8 bus_width)
1017{
1018        struct sd_info *sd_card = &(chip->sd_card);
1019        int retval;
1020        u8 cmd[5], buf[64];
1021
1022        RTS51X_DEBUGP("sd_check_switch_mode (mode = %d, func_group = %d,"
1023                "func_to_switch = %d)\n", mode, func_group, func_to_switch);
1024
1025        cmd[0] = 0x40 | SWITCH;
1026        cmd[1] = mode;
1027
1028        if (func_group == SD_FUNC_GROUP_1) {
1029                cmd[2] = 0xFF;
1030                cmd[3] = 0xFF;
1031                cmd[4] = 0xF0 + func_to_switch;
1032        } else if (func_group == SD_FUNC_GROUP_3) {
1033                cmd[2] = 0xFF;
1034                cmd[3] = 0xF0 + func_to_switch;
1035                cmd[4] = 0xFF;
1036        } else if (func_group == SD_FUNC_GROUP_4) {
1037                cmd[2] = 0xFF;
1038                cmd[3] = 0x0F + (func_to_switch << 4);
1039                cmd[4] = 0xFF;
1040        } else {
1041                cmd[1] = SD_CHECK_MODE;
1042                cmd[2] = 0xFF;
1043                cmd[3] = 0xFF;
1044                cmd[4] = 0xFF;
1045        }
1046
1047        retval =
1048            sd_read_data(chip, SD_TM_NORMAL_READ, cmd, 5, 64, 1, bus_width, buf,
1049                         64, 250);
1050        if (retval != STATUS_SUCCESS) {
1051                rts51x_clear_sd_error(chip);
1052                TRACE_RET(chip, retval);
1053        }
1054
1055        if (func_group == NO_ARGUMENT) {
1056                sd_card->func_group1_mask = buf[0x0D];
1057                sd_card->func_group2_mask = buf[0x0B];
1058                sd_card->func_group3_mask = buf[0x09];
1059                sd_card->func_group4_mask = buf[0x07];
1060
1061                RTS51X_DEBUGP("func_group1_mask = 0x%02x\n", buf[0x0D]);
1062                RTS51X_DEBUGP("func_group2_mask = 0x%02x\n", buf[0x0B]);
1063                RTS51X_DEBUGP("func_group3_mask = 0x%02x\n", buf[0x09]);
1064                RTS51X_DEBUGP("func_group4_mask = 0x%02x\n", buf[0x07]);
1065        } else {
1066                if ((buf[0] == 0) && (buf[1] == 0))
1067                        TRACE_RET(chip, STATUS_FAIL);
1068                retval =
1069                    sd_query_switch_result(chip, func_group, func_to_switch,
1070                                           buf, 64);
1071                if (retval != STATUS_SUCCESS)
1072                        TRACE_RET(chip, retval);
1073        }
1074
1075        return STATUS_SUCCESS;
1076}
1077
1078static int sd_check_switch(struct rts51x_chip *chip,
1079                           u8 func_group, u8 func_to_switch, u8 bus_width)
1080{
1081        int retval;
1082        int i;
1083        int switch_good = 0;
1084
1085        for (i = 0; i < 3; i++) {
1086                if (monitor_card_cd(chip, SD_CARD) == CD_NOT_EXIST) {
1087                        sd_set_reset_fail(chip, SD_RESET_FAIL);
1088                        TRACE_RET(chip, STATUS_FAIL);
1089                }
1090
1091                retval = sd_check_switch_mode(chip, SD_CHECK_MODE, func_group,
1092                                              func_to_switch, bus_width);
1093                if (retval == STATUS_SUCCESS) {
1094                        u8 stat;
1095
1096                        retval = sd_check_switch_mode(chip, SD_SWITCH_MODE,
1097                                        func_group, func_to_switch, bus_width);
1098                        if (retval == STATUS_SUCCESS) {
1099                                switch_good = 1;
1100                                break;
1101                        }
1102
1103                        RTS51X_READ_REG(chip, SD_STAT1, &stat);
1104
1105                        if (stat & SD_CRC16_ERR) {
1106                                RTS51X_DEBUGP("SD CRC16 error when switching"
1107                                                        "mode\n");
1108                                TRACE_RET(chip, STATUS_FAIL);
1109                        }
1110                }
1111
1112                wait_timeout(20);
1113        }
1114
1115        if (!switch_good)
1116                TRACE_RET(chip, STATUS_FAIL);
1117
1118        return STATUS_SUCCESS;
1119}
1120
1121static int sd_switch_function(struct rts51x_chip *chip, u8 bus_width)
1122{
1123        struct sd_info *sd_card = &(chip->sd_card);
1124        int retval;
1125        int i;
1126        u8 func_to_switch = 0;
1127
1128        /* Get supported functions */
1129        retval = sd_check_switch_mode(chip, SD_CHECK_MODE,
1130                                      NO_ARGUMENT, NO_ARGUMENT, bus_width);
1131        if (retval != STATUS_SUCCESS)
1132                TRACE_RET(chip, retval);
1133
1134        sd_card->func_group1_mask &= ~(sd_card->sd_switch_fail);
1135
1136        for (i = 0; i < 4; i++) {
1137                switch ((u8) (chip->option.sd_speed_prior >> (i * 8))) {
1138                case DDR50_SUPPORT:
1139                        if ((sd_card->func_group1_mask & DDR50_SUPPORT_MASK)
1140                            && (CHECK_UHS50(chip)))
1141                                func_to_switch = DDR50_SUPPORT;
1142                        break;
1143
1144                case SDR50_SUPPORT:
1145                        if ((sd_card->func_group1_mask & SDR50_SUPPORT_MASK)
1146                            && (CHECK_UHS50(chip)))
1147                                func_to_switch = SDR50_SUPPORT;
1148                        break;
1149
1150                case HS_SUPPORT:
1151                        if (sd_card->func_group1_mask & HS_SUPPORT_MASK)
1152                                func_to_switch = HS_SUPPORT;
1153                        break;
1154
1155                default:
1156                        continue;
1157                }
1158
1159                if (func_to_switch)
1160                        break;
1161        }
1162        RTS51X_DEBUGP("SD_FUNC_GROUP_1: func_to_switch = 0x%02x",
1163                       func_to_switch);
1164
1165        if (func_to_switch) {
1166                retval =
1167                    sd_check_switch(chip, SD_FUNC_GROUP_1, func_to_switch,
1168                                    bus_width);
1169                if (retval != STATUS_SUCCESS) {
1170                        if (func_to_switch == SDR104_SUPPORT)
1171                                sd_card->sd_switch_fail = SDR104_SUPPORT_MASK;
1172                        else if (func_to_switch == DDR50_SUPPORT)
1173                                sd_card->sd_switch_fail = DDR50_SUPPORT_MASK;
1174                        else if (func_to_switch == SDR50_SUPPORT)
1175                                sd_card->sd_switch_fail = SDR50_SUPPORT_MASK;
1176                        else if (func_to_switch == HS_SUPPORT)
1177                                sd_card->sd_switch_fail = HS_SUPPORT_MASK;
1178
1179                        TRACE_RET(chip, retval);
1180                }
1181
1182                if (func_to_switch == SDR104_SUPPORT)
1183                        SET_SD_SDR104(sd_card);
1184                else if (func_to_switch == DDR50_SUPPORT)
1185                        SET_SD_DDR50(sd_card);
1186                else if (func_to_switch == SDR50_SUPPORT)
1187                        SET_SD_SDR50(sd_card);
1188                else
1189                        SET_SD_HS(sd_card);
1190        }
1191
1192        if (CHK_SD_DDR50(sd_card))
1193                RTS51X_WRITE_REG(chip, SD_CFG1, 0x0C, SD_DDR_MODE);
1194
1195        func_to_switch = 0;
1196        if (sd_card->func_group4_mask & CURRENT_LIMIT_400_MASK)
1197                func_to_switch = CURRENT_LIMIT_400;
1198
1199        if (func_to_switch) {
1200                RTS51X_DEBUGP("Try to switch current_limit_400\n");
1201                retval =
1202                    sd_check_switch(chip, SD_FUNC_GROUP_4, func_to_switch,
1203                                    bus_width);
1204                RTS51X_DEBUGP("Switch current_limit_400 status: (%d)\n",
1205                               retval);
1206        }
1207
1208        return STATUS_SUCCESS;
1209}
1210
1211static int sd_wait_data_idle(struct rts51x_chip *chip)
1212{
1213        int retval = STATUS_TIMEDOUT;
1214        int i;
1215        u8 val = 0;
1216
1217        for (i = 0; i < 100; i++) {
1218                retval = rts51x_ep0_read_register(chip, SD_DATA_STATE, &val);
1219                if (retval != STATUS_SUCCESS)
1220                        TRACE_RET(chip, STATUS_FAIL);
1221                if (val & SD_DATA_IDLE) {
1222                        retval = STATUS_SUCCESS;
1223                        break;
1224                }
1225                udelay(100);
1226        }
1227        RTS51X_DEBUGP("SD_DATA_STATE: 0x%02x\n", val);
1228
1229        return retval;
1230}
1231
1232static int sd_sdr_tuning_rx_cmd(struct rts51x_chip *chip, u8 sample_point)
1233{
1234        int retval;
1235        u8 cmd[5];
1236
1237        retval = sd_change_phase(chip, sample_point, TUNE_RX);
1238        if (retval != STATUS_SUCCESS)
1239                TRACE_RET(chip, retval);
1240
1241        cmd[0] = 0x40 | SEND_TUNING_PATTERN;
1242        cmd[1] = 0;
1243        cmd[2] = 0;
1244        cmd[3] = 0;
1245        cmd[4] = 0;
1246
1247        retval = sd_read_data(chip, SD_TM_AUTO_TUNING,
1248                              cmd, 5, 0x40, 1, SD_BUS_WIDTH_4, NULL, 0, 100);
1249        if (retval != STATUS_SUCCESS) {
1250                /* Wait till SD DATA IDLE */
1251                (void)sd_wait_data_idle(chip);
1252
1253                rts51x_clear_sd_error(chip);
1254                TRACE_RET(chip, STATUS_FAIL);
1255        }
1256
1257        return STATUS_SUCCESS;
1258}
1259
1260static int sd_ddr_tuning_rx_cmd(struct rts51x_chip *chip, u8 sample_point)
1261{
1262        struct sd_info *sd_card = &(chip->sd_card);
1263        int retval;
1264        u8 cmd[5];
1265
1266        retval = sd_change_phase(chip, sample_point, TUNE_RX);
1267        if (retval != STATUS_SUCCESS)
1268                TRACE_RET(chip, retval);
1269
1270        RTS51X_DEBUGP("sd ddr tuning rx\n");
1271
1272        retval =
1273            sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr, SD_RSP_TYPE_R1,
1274                                NULL, 0);
1275        if (retval != STATUS_SUCCESS)
1276                TRACE_RET(chip, retval);
1277
1278        cmd[0] = 0x40 | SD_STATUS;
1279        cmd[1] = 0;
1280        cmd[2] = 0;
1281        cmd[3] = 0;
1282        cmd[4] = 0;
1283
1284        retval = sd_read_data(chip, SD_TM_NORMAL_READ,
1285                              cmd, 5, 64, 1, SD_BUS_WIDTH_4, NULL, 0, 100);
1286        if (retval != STATUS_SUCCESS) {
1287                /* Wait till SD DATA IDLE */
1288                (void)sd_wait_data_idle(chip);
1289
1290                rts51x_clear_sd_error(chip);
1291                TRACE_RET(chip, STATUS_FAIL);
1292        }
1293
1294        return STATUS_SUCCESS;
1295}
1296
1297static int mmc_ddr_tunning_rx_cmd(struct rts51x_chip *chip, u8 sample_point)
1298{
1299        struct sd_info *sd_card = &(chip->sd_card);
1300        int retval;
1301        u8 cmd[5], bus_width;
1302
1303        if (CHK_MMC_8BIT(sd_card))
1304                bus_width = SD_BUS_WIDTH_8;
1305        else if (CHK_MMC_4BIT(sd_card))
1306                bus_width = SD_BUS_WIDTH_4;
1307        else
1308                bus_width = SD_BUS_WIDTH_1;
1309
1310        retval = sd_change_phase(chip, sample_point, TUNE_RX);
1311        if (retval != STATUS_SUCCESS)
1312                TRACE_RET(chip, retval);
1313
1314        RTS51X_DEBUGP("mmc ddr tuning rx\n");
1315
1316        cmd[0] = 0x40 | SEND_EXT_CSD;
1317        cmd[1] = 0;
1318        cmd[2] = 0;
1319        cmd[3] = 0;
1320        cmd[4] = 0;
1321
1322        retval = sd_read_data(chip, SD_TM_NORMAL_READ,
1323                              cmd, 5, 0x200, 1, bus_width, NULL, 0, 100);
1324        if (retval != STATUS_SUCCESS) {
1325                /* Wait till SD DATA IDLE */
1326                (void)sd_wait_data_idle(chip);
1327
1328                rts51x_clear_sd_error(chip);
1329                TRACE_RET(chip, STATUS_FAIL);
1330        }
1331
1332        return STATUS_SUCCESS;
1333}
1334
1335static int sd_sdr_tuning_tx_cmd(struct rts51x_chip *chip, u8 sample_point)
1336{
1337        struct sd_info *sd_card = &(chip->sd_card);
1338        int retval;
1339
1340        retval = sd_change_phase(chip, sample_point, TUNE_TX);
1341        if (retval != STATUS_SUCCESS)
1342                TRACE_RET(chip, retval);
1343
1344        RTS51X_WRITE_REG(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN,
1345                         SD_RSP_80CLK_TIMEOUT_EN);
1346
1347        retval = sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
1348                                     SD_RSP_TYPE_R1, NULL, 0);
1349        if (retval != STATUS_SUCCESS) {
1350                if (sd_check_err_code(chip, SD_RSP_TIMEOUT)) {
1351                        /* Tunning TX fail */
1352                        rts51x_ep0_write_register(chip, SD_CFG3,
1353                                                  SD_RSP_80CLK_TIMEOUT_EN, 0);
1354                        TRACE_RET(chip, STATUS_FAIL);
1355                }
1356        }
1357
1358        RTS51X_WRITE_REG(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN, 0);
1359
1360        return STATUS_SUCCESS;
1361}
1362
1363static int sd_ddr_tuning_tx_cmd(struct rts51x_chip *chip, u8 sample_point)
1364{
1365        struct sd_info *sd_card = &(chip->sd_card);
1366        int retval;
1367        u8 cmd[5], bus_width;
1368
1369        retval = sd_change_phase(chip, sample_point, TUNE_TX);
1370        if (retval != STATUS_SUCCESS)
1371                TRACE_RET(chip, retval);
1372
1373        if (CHK_SD(sd_card)) {
1374                bus_width = SD_BUS_WIDTH_4;
1375        } else {
1376                if (CHK_MMC_8BIT(sd_card))
1377                        bus_width = SD_BUS_WIDTH_8;
1378                else if (CHK_MMC_4BIT(sd_card))
1379                        bus_width = SD_BUS_WIDTH_4;
1380                else
1381                        bus_width = SD_BUS_WIDTH_1;
1382        }
1383        retval = sd_wait_currentstate_dataready(chip, 0x08, 1, 20);
1384        if (retval != STATUS_SUCCESS)
1385                TRACE_RET(chip, STATUS_FAIL);
1386
1387        RTS51X_WRITE_REG(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN,
1388                         SD_RSP_80CLK_TIMEOUT_EN);
1389
1390        cmd[0] = 0x40 | PROGRAM_CSD;
1391        cmd[1] = 0;
1392        cmd[2] = 0;
1393        cmd[3] = 0;
1394        cmd[4] = 0;
1395
1396        retval = sd_write_data(chip, SD_TM_AUTO_WRITE_2,
1397                        cmd, 5, 16, 1, bus_width, sd_card->raw_csd, 16, 100);
1398        if (retval != STATUS_SUCCESS) {
1399                rts51x_clear_sd_error(chip);
1400                /* Tunning TX fail */
1401                rts51x_ep0_write_register(chip, SD_CFG3,
1402                                          SD_RSP_80CLK_TIMEOUT_EN, 0);
1403                TRACE_RET(chip, STATUS_FAIL);
1404        }
1405
1406        RTS51X_WRITE_REG(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN, 0);
1407
1408        sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr, SD_RSP_TYPE_R1,
1409                            NULL, 0);
1410
1411        return STATUS_SUCCESS;
1412}
1413
1414static u8 sd_search_final_phase(struct rts51x_chip *chip, u32 phase_map,
1415                                u8 tune_dir)
1416{
1417        struct sd_info *sd_card = &(chip->sd_card);
1418        struct timing_phase_path path[MAX_PHASE + 1];
1419        int i, j, cont_path_cnt;
1420        int new_block, max_len;
1421        u8 final_phase = 0xFF;
1422        int final_path_idx;
1423
1424        if (phase_map == 0xffff) {
1425                if (CHK_SD_DDR50(sd_card)) {
1426                        if (tune_dir == TUNE_TX)
1427                                final_phase = chip->option.ddr50_tx_phase;
1428                        else
1429                                final_phase = chip->option.ddr50_rx_phase;
1430                        RTS51X_DEBUGP("DDR50 tuning dir:%d all pass,"
1431                                        "so select default phase:0x%x.\n",
1432                                        tune_dir, final_phase);
1433                } else {
1434                        if (tune_dir == TUNE_TX)
1435                                final_phase = chip->option.sdr50_tx_phase;
1436                        else
1437                                final_phase = chip->option.sdr50_rx_phase;
1438                        RTS51X_DEBUGP("SDR50 tuning dir:%d all pass,"
1439                                        "so select default phase:0x%x.\n",
1440                                        tune_dir, final_phase);
1441                }
1442                goto Search_Finish;
1443        }
1444
1445        cont_path_cnt = 0;
1446        new_block = 1;
1447        j = 0;
1448        for (i = 0; i < MAX_PHASE + 1; i++) {
1449                if (phase_map & (1 << i)) {
1450                        if (new_block) {
1451                                new_block = 0;
1452                                j = cont_path_cnt++;
1453                                path[j].start = i;
1454                                path[j].end = i;
1455                        } else {
1456                                path[j].end = i;
1457                        }
1458                } else {
1459                        new_block = 1;
1460                        if (cont_path_cnt) {
1461                                int idx = cont_path_cnt - 1;
1462                                path[idx].len =
1463                                    path[idx].end - path[idx].start + 1;
1464                                path[idx].mid =
1465                                    path[idx].start + path[idx].len / 2;
1466                        }
1467                }
1468        }
1469
1470        if (cont_path_cnt == 0) {
1471                RTS51X_DEBUGP("No continuous phase path\n");
1472                goto Search_Finish;
1473        } else {
1474                int idx = cont_path_cnt - 1;
1475                path[idx].len = path[idx].end - path[idx].start + 1;
1476                path[idx].mid = path[idx].start + path[idx].len / 2;
1477        }
1478
1479        if ((path[0].start == 0) &&
1480                        (path[cont_path_cnt - 1].end == MAX_PHASE)) {
1481                path[0].start = path[cont_path_cnt - 1].start - MAX_PHASE - 1;
1482                path[0].len += path[cont_path_cnt - 1].len;
1483                path[0].mid = path[0].start + path[0].len / 2;
1484                if (path[0].mid < 0)
1485                        path[0].mid += MAX_PHASE + 1;
1486                cont_path_cnt--;
1487        }
1488        max_len = 0;
1489        final_phase = 0;
1490        final_path_idx = 0;
1491        for (i = 0; i < cont_path_cnt; i++) {
1492                if (path[i].len > max_len) {
1493                        max_len = path[i].len;
1494                        final_phase = (u8) path[i].mid;
1495                        final_path_idx = i;
1496                }
1497
1498                RTS51X_DEBUGP("path[%d].start = %d\n", i, path[i].start);
1499                RTS51X_DEBUGP("path[%d].end = %d\n", i, path[i].end);
1500                RTS51X_DEBUGP("path[%d].len = %d\n", i, path[i].len);
1501                RTS51X_DEBUGP("path[%d].mid = %d\n", i, path[i].mid);
1502                RTS51X_DEBUGP("\n");
1503        }
1504
1505        if ((tune_dir == TUNE_TX) && (CHK_SD_SDR50(sd_card))
1506            && chip->option.sdr50_phase_sel) {
1507                if (max_len > 6) {
1508                        int temp_mid = (max_len - 6) / 2;
1509                        int temp_final_phase =
1510                            path[final_path_idx].end - (max_len -
1511                                                        (3 + temp_mid));
1512
1513                        if (temp_final_phase < 0)
1514                                final_phase = temp_final_phase + MAX_PHASE + 1;
1515                        else
1516                                final_phase = (u8) temp_final_phase;
1517                }
1518        }
1519
1520Search_Finish:
1521        RTS51X_DEBUGP("Final chosen phase: %d\n", final_phase);
1522        return final_phase;
1523}
1524
1525static int sd_tuning_rx(struct rts51x_chip *chip)
1526{
1527        struct sd_info *sd_card = &(chip->sd_card);
1528        int retval;
1529        int i, j;
1530        u32 raw_phase_map[3], phase_map;
1531        u8 final_phase;
1532        int (*tuning_cmd) (struct rts51x_chip *chip, u8 sample_point);
1533
1534        if (CHK_SD(sd_card)) {
1535                if (CHK_SD_DDR50(sd_card))
1536                        tuning_cmd = sd_ddr_tuning_rx_cmd;
1537                else
1538                        tuning_cmd = sd_sdr_tuning_rx_cmd;
1539        } else {
1540                if (CHK_MMC_DDR52(sd_card))
1541                        tuning_cmd = mmc_ddr_tunning_rx_cmd;
1542                else
1543                        TRACE_RET(chip, STATUS_FAIL);
1544        }
1545
1546        for (i = 0; i < 3; i++) {
1547                raw_phase_map[i] = 0;
1548                for (j = MAX_PHASE; j >= 0; j--) {
1549                        if (monitor_card_cd(chip, SD_CARD) == CD_NOT_EXIST) {
1550                                sd_set_reset_fail(chip, SD_RESET_FAIL);
1551                                TRACE_RET(chip, STATUS_FAIL);
1552                        }
1553
1554                        retval = tuning_cmd(chip, (u8) j);
1555                        if (retval == STATUS_SUCCESS)
1556                                raw_phase_map[i] |= 1 << j;
1557                        else
1558                                RTS51X_DEBUGP("Tuning phase %d fail\n", j);
1559                }
1560        }
1561
1562        phase_map = raw_phase_map[0] & raw_phase_map[1] & raw_phase_map[2];
1563        for (i = 0; i < 3; i++)
1564                RTS51X_DEBUGP("RX raw_phase_map[%d] = 0x%04x\n", i,
1565                               raw_phase_map[i]);
1566        RTS51X_DEBUGP("RX phase_map = 0x%04x\n", phase_map);
1567
1568        final_phase = sd_search_final_phase(chip, phase_map, TUNE_RX);
1569        if (final_phase == 0xFF)
1570                TRACE_RET(chip, STATUS_FAIL);
1571
1572        retval = tuning_cmd(chip, final_phase);
1573        if (retval != STATUS_SUCCESS)
1574                TRACE_RET(chip, retval);
1575
1576        return STATUS_SUCCESS;
1577}
1578
1579static int sd_ddr_pre_tuning_tx(struct rts51x_chip *chip)
1580{
1581        struct sd_info *sd_card = &(chip->sd_card);
1582        int retval;
1583        u8 i;
1584        u8 pre_tune_tx_phase;
1585        u32 pre_tune_phase_map;
1586
1587        RTS51X_WRITE_REG(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN,
1588                         SD_RSP_80CLK_TIMEOUT_EN);
1589
1590        pre_tune_tx_phase = 0xFF;
1591        pre_tune_phase_map = 0x0000;
1592        for (i = 0; i < MAX_PHASE + 1; i++) {
1593                if (monitor_card_cd(chip, SD_CARD) == CD_NOT_EXIST) {
1594                        sd_set_reset_fail(chip, SD_RESET_FAIL);
1595                        TRACE_RET(chip, STATUS_FAIL);
1596                }
1597
1598                retval = sd_change_phase(chip, (u8) i, TUNE_TX);
1599                if (retval != STATUS_SUCCESS)
1600                        TRACE_RET(chip, retval);
1601
1602                retval =
1603                    sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
1604                                        SD_RSP_TYPE_R1, NULL, 0);
1605                if ((retval == STATUS_SUCCESS)
1606                    || !sd_check_err_code(chip, SD_RSP_TIMEOUT))
1607                        pre_tune_phase_map |= (u32) 1 << i;
1608        }
1609
1610        RTS51X_WRITE_REG(chip, SD_CFG3, SD_RSP_80CLK_TIMEOUT_EN, 0);
1611
1612        pre_tune_tx_phase =
1613            sd_search_final_phase(chip, pre_tune_phase_map, TUNE_TX);
1614        if (pre_tune_tx_phase == 0xFF)
1615                TRACE_RET(chip, STATUS_FAIL);
1616
1617        sd_change_phase(chip, pre_tune_tx_phase, TUNE_TX);
1618        RTS51X_DEBUGP("DDR TX pre tune phase: %d\n", (int)pre_tune_tx_phase);
1619
1620        return STATUS_SUCCESS;
1621}
1622
1623static int sd_tuning_tx(struct rts51x_chip *chip)
1624{
1625        struct sd_info *sd_card = &(chip->sd_card);
1626        int retval;
1627        int i, j;
1628        u32 raw_phase_map[3], phase_map;
1629        u8 final_phase;
1630        int (*tuning_cmd) (struct rts51x_chip *chip, u8 sample_point);
1631
1632        if (CHK_SD(sd_card)) {
1633                if (CHK_SD_DDR50(sd_card))
1634                        tuning_cmd = sd_ddr_tuning_tx_cmd;
1635                else
1636                        tuning_cmd = sd_sdr_tuning_tx_cmd;
1637        } else {
1638                if (CHK_MMC_DDR52(sd_card))
1639                        tuning_cmd = sd_ddr_tuning_tx_cmd;
1640                else
1641                        TRACE_RET(chip, STATUS_FAIL);
1642        }
1643
1644        for (i = 0; i < 3; i++) {
1645                raw_phase_map[i] = 0;
1646                for (j = MAX_PHASE; j >= 0; j--) {
1647                        if (monitor_card_cd(chip, SD_CARD) == CD_NOT_EXIST) {
1648                                sd_set_reset_fail(chip, SD_RESET_FAIL);
1649                                TRACE_RET(chip, STATUS_FAIL);
1650                        }
1651
1652                        retval = tuning_cmd(chip, (u8) j);
1653                        if (retval == STATUS_SUCCESS)
1654                                raw_phase_map[i] |= 1 << j;
1655                        else
1656                                RTS51X_DEBUGP("Tuning phase %d fail\n", j);
1657                }
1658        }
1659
1660        phase_map = raw_phase_map[0] & raw_phase_map[1] & raw_phase_map[2];
1661        for (i = 0; i < 3; i++)
1662                RTS51X_DEBUGP("TX raw_phase_map[%d] = 0x%04x\n", i,
1663                               raw_phase_map[i]);
1664        RTS51X_DEBUGP("TX phase_map = 0x%04x\n", phase_map);
1665
1666        final_phase = sd_search_final_phase(chip, phase_map, TUNE_TX);
1667        if (final_phase == 0xFF)
1668                TRACE_RET(chip, STATUS_FAIL);
1669
1670        retval = tuning_cmd(chip, final_phase);
1671        if (retval != STATUS_SUCCESS)
1672                TRACE_RET(chip, retval);
1673
1674        return STATUS_SUCCESS;
1675}
1676
1677static int sd_sdr_tuning(struct rts51x_chip *chip)
1678{
1679        int retval;
1680
1681        retval = sd_tuning_tx(chip);
1682        if (retval != STATUS_SUCCESS)
1683                TRACE_RET(chip, retval);
1684
1685        retval = sd_tuning_rx(chip);
1686        if (retval != STATUS_SUCCESS)
1687                TRACE_RET(chip, retval);
1688
1689        return STATUS_SUCCESS;
1690}
1691
1692static int sd_ddr_tuning(struct rts51x_chip *chip)
1693{
1694        int retval;
1695
1696        if (!(chip->option.sd_ctl & SD_DDR_TX_PHASE_SET_BY_USER)) {
1697                retval = sd_ddr_pre_tuning_tx(chip);
1698                if (retval != STATUS_SUCCESS)
1699                        TRACE_RET(chip, retval);
1700        } else {
1701                retval =
1702                    sd_change_phase(chip, (u8) chip->option.sd_ddr_tx_phase,
1703                                    TUNE_TX);
1704                if (retval != STATUS_SUCCESS)
1705                        TRACE_RET(chip, retval);
1706        }
1707
1708        retval = sd_tuning_rx(chip);
1709        if (retval != STATUS_SUCCESS)
1710                TRACE_RET(chip, retval);
1711
1712        if (!(chip->option.sd_ctl & SD_DDR_TX_PHASE_SET_BY_USER)) {
1713                retval = sd_tuning_tx(chip);
1714                if (retval != STATUS_SUCCESS)
1715                        TRACE_RET(chip, retval);
1716        }
1717
1718        return STATUS_SUCCESS;
1719}
1720
1721static int mmc_ddr_tuning(struct rts51x_chip *chip)
1722{
1723        int retval;
1724
1725        if (!(chip->option.sd_ctl & MMC_DDR_TX_PHASE_SET_BY_USER)) {
1726                retval = sd_ddr_pre_tuning_tx(chip);
1727                if (retval != STATUS_SUCCESS)
1728                        TRACE_RET(chip, retval);
1729        } else {
1730                retval =
1731                    sd_change_phase(chip, (u8) chip->option.mmc_ddr_tx_phase,
1732                                    TUNE_TX);
1733                if (retval != STATUS_SUCCESS)
1734                        TRACE_RET(chip, retval);
1735        }
1736
1737        retval = sd_tuning_rx(chip);
1738        if (retval != STATUS_SUCCESS)
1739                TRACE_RET(chip, retval);
1740
1741        if (!(chip->option.sd_ctl & MMC_DDR_TX_PHASE_SET_BY_USER)) {
1742                retval = sd_tuning_tx(chip);
1743                if (retval != STATUS_SUCCESS)
1744                        TRACE_RET(chip, retval);
1745        }
1746
1747        return STATUS_SUCCESS;
1748}
1749
1750int rts51x_sd_switch_clock(struct rts51x_chip *chip)
1751{
1752        struct sd_info *sd_card = &(chip->sd_card);
1753        int retval;
1754        int re_tuning = 0;
1755
1756        retval = rts51x_select_card(chip, SD_CARD);
1757        if (retval != STATUS_SUCCESS)
1758                TRACE_RET(chip, retval);
1759
1760        if (CHK_SD30_SPEED(sd_card) || CHK_MMC_DDR52(sd_card)) {
1761                if (sd_card->sd_clock != chip->cur_clk)
1762                        re_tuning = 1;
1763        }
1764
1765        retval = switch_clock(chip, sd_card->sd_clock);
1766        if (retval != STATUS_SUCCESS)
1767                TRACE_RET(chip, retval);
1768
1769        if (re_tuning) {
1770                if (CHK_SD(sd_card)) {
1771                        if (CHK_SD_DDR50(sd_card))
1772                                retval = sd_ddr_tuning(chip);
1773                        else
1774                                retval = sd_sdr_tuning(chip);
1775                } else {
1776                        if (CHK_MMC_DDR52(sd_card))
1777                                retval = mmc_ddr_tuning(chip);
1778                }
1779
1780                if (retval != STATUS_SUCCESS)
1781                        TRACE_RET(chip, retval);
1782        }
1783
1784        return STATUS_SUCCESS;
1785}
1786
1787static int sd_prepare_reset(struct rts51x_chip *chip)
1788{
1789        struct sd_info *sd_card = &(chip->sd_card);
1790        int retval;
1791
1792        if (chip->asic_code)
1793                sd_card->sd_clock = 29;
1794        else
1795                sd_card->sd_clock = CLK_30;
1796
1797        /* Set SD Clocks */
1798        retval = sd_set_init_para(chip);
1799        if (retval != STATUS_SUCCESS)
1800                TRACE_RET(chip, retval);
1801
1802        rts51x_init_cmd(chip);
1803
1804        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CFG1, 0xFF,
1805                       SD_CLK_DIVIDE_128 | SD_20_MODE | SD_BUS_WIDTH_1);
1806        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_SAMPLE_POINT_CTL, 0xFF,
1807                       SD20_RX_POS_EDGE);
1808        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_PUSH_POINT_CTL, 0xFF, 0);
1809
1810        retval = rts51x_send_cmd(chip, MODE_C, 100);
1811        if (retval != STATUS_SUCCESS)
1812                TRACE_RET(chip, retval);
1813
1814        retval = rts51x_select_card(chip, SD_CARD);
1815        if (retval != STATUS_SUCCESS)
1816                TRACE_RET(chip, retval);
1817
1818        return STATUS_SUCCESS;
1819}
1820
1821static void sd_pull_ctl_disable(struct rts51x_chip *chip)
1822{
1823        if (CHECK_PKG(chip, LQFP48)) {
1824                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0x55);
1825                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55);
1826                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0x95);
1827                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x55);
1828                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF, 0x55);
1829                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, 0xA5);
1830        } else {
1831                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0x65);
1832                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55);
1833                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0x95);
1834                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x55);
1835                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF, 0x56);
1836                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, 0x59);
1837        }
1838}
1839
1840static void sd_pull_ctl_enable(struct rts51x_chip *chip)
1841{
1842        if (CHECK_PKG(chip, LQFP48)) {
1843                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0xAA);
1844                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0xAA);
1845                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0xA9);
1846                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x55);
1847                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF, 0x55);
1848                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, 0xA5);
1849        } else {
1850                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0xA5);
1851                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x9A);
1852                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0xA5);
1853                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x9A);
1854                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF, 0x65);
1855                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, 0x5A);
1856        }
1857}
1858
1859static int sd_init_power(struct rts51x_chip *chip)
1860{
1861        int retval;
1862
1863        rts51x_init_cmd(chip);
1864
1865        rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PWR_CTL, LDO3318_PWR_MASK,
1866                       LDO_ON);
1867        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_PAD_CTL, SD_IO_USING_1V8,
1868                       SD_IO_USING_3V3);
1869        if (chip->asic_code)
1870                rts51x_add_cmd(chip, WRITE_REG_CMD, LDO_POWER_CFG,
1871                               TUNE_SD18_MASK, TUNE_SD18_3V3);
1872        if (chip->asic_code)
1873                sd_pull_ctl_disable(chip);
1874        else
1875                rts51x_add_cmd(chip, WRITE_REG_CMD, FPGA_PULL_CTL,
1876                               FPGA_SD_PULL_CTL_BIT | 0x20,
1877                               FPGA_SD_PULL_CTL_BIT);
1878        rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_OE, SD_OUTPUT_EN, 0);
1879        if (!chip->option.FT2_fast_mode)
1880                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PWR_CTL, POWER_MASK,
1881                               POWER_OFF);
1882
1883        retval = rts51x_send_cmd(chip, MODE_C, 100);
1884        if (retval != STATUS_SUCCESS)
1885                TRACE_RET(chip, retval);
1886        if (!chip->option.FT2_fast_mode) {
1887#ifdef SD_XD_IO_FOLLOW_PWR
1888                if (CHECK_PKG(chip, LQFP48)
1889                    || chip->option.rts5129_D3318_off_enable)
1890                        rts51x_write_register(chip, CARD_PWR_CTL,
1891                                        LDO_OFF, LDO_OFF);
1892#endif
1893                wait_timeout(250);
1894
1895#ifdef SD_XD_IO_FOLLOW_PWR
1896                if (CHECK_PKG(chip, LQFP48)
1897                    || chip->option.rts5129_D3318_off_enable) {
1898                        rts51x_init_cmd(chip);
1899                        if (chip->asic_code)
1900                                sd_pull_ctl_enable(chip);
1901                        else
1902                                rts51x_add_cmd(chip, WRITE_REG_CMD,
1903                                               FPGA_PULL_CTL,
1904                                               FPGA_SD_PULL_CTL_BIT | 0x20, 0);
1905                        retval = rts51x_send_cmd(chip, MODE_C, 100);
1906                        if (retval != STATUS_SUCCESS)
1907                                TRACE_RET(chip, retval);
1908                } else {
1909                        if (chip->asic_code)
1910                                rts51x_write_register(chip, CARD_PULL_CTL6,
1911                                                      0x03, 0x00);
1912                }
1913#endif
1914
1915                /* Power on card */
1916                retval = rts51x_card_power_on(chip, SD_CARD);
1917                if (retval != STATUS_SUCCESS)
1918                        TRACE_RET(chip, retval);
1919
1920                wait_timeout(260);
1921
1922#ifdef SUPPORT_OCP
1923                rts51x_get_card_status(chip, &(chip->card_status));
1924                chip->ocp_stat = (chip->card_status >> 4) & 0x03;
1925
1926                if (chip->ocp_stat & (MS_OCP_NOW | MS_OCP_EVER)) {
1927                        RTS51X_DEBUGP("Over current, OCPSTAT is 0x%x\n",
1928                                       chip->ocp_stat);
1929                        TRACE_RET(chip, STATUS_FAIL);
1930                }
1931#endif
1932        }
1933
1934        rts51x_init_cmd(chip);
1935        if (chip->asic_code) {
1936                sd_pull_ctl_enable(chip);
1937        } else {
1938                rts51x_add_cmd(chip, WRITE_REG_CMD, FPGA_PULL_CTL,
1939                               FPGA_SD_PULL_CTL_BIT | 0x20, 0);
1940        }
1941        retval = rts51x_send_cmd(chip, MODE_C, 100);
1942        if (retval != STATUS_SUCCESS)
1943                TRACE_RET(chip, retval);
1944#ifdef SD_XD_IO_FOLLOW_PWR
1945        rts51x_write_register(chip, CARD_INT_PEND, XD_INT | MS_INT | SD_INT,
1946                              XD_INT | MS_INT | SD_INT);
1947#endif
1948
1949        RTS51X_WRITE_REG(chip, CARD_OE, SD_OUTPUT_EN, SD_OUTPUT_EN);
1950
1951        return STATUS_SUCCESS;
1952}
1953
1954static int sd_dummy_clock(struct rts51x_chip *chip)
1955{
1956        RTS51X_WRITE_REG(chip, SD_BUS_STAT, SD_CLK_TOGGLE_EN, SD_CLK_TOGGLE_EN);
1957        wait_timeout(5);
1958        RTS51X_WRITE_REG(chip, SD_BUS_STAT, SD_CLK_TOGGLE_EN, 0x00);
1959
1960        return STATUS_SUCCESS;
1961}
1962
1963int reset_sd(struct rts51x_chip *chip)
1964{
1965        struct sd_info *sd_card = &(chip->sd_card);
1966        int retval, i = 0, j = 0, k = 0, hi_cap_flow = 0;
1967        int sd_dont_switch = 0;
1968        int support_1v8 = 0;
1969        u8 rsp[16];
1970        u8 switch_bus_width;
1971        u32 voltage = 0;
1972        u8 cmd[5], buf[64];
1973        u16 sd_card_type;
1974
1975        SET_SD(sd_card);
1976        CLR_RETRY_SD20_MODE(sd_card);
1977Switch_Fail:
1978        i = 0;
1979        j = 0;
1980        k = 0;
1981        hi_cap_flow = 0;
1982        support_1v8 = 0;
1983
1984        retval = sd_prepare_reset(chip);
1985        if (retval != STATUS_SUCCESS)
1986                TRACE_RET(chip, retval);
1987
1988        sd_dummy_clock(chip);
1989
1990        /* Start Initialization Process of SD Card */
1991RTY_SD_RST:
1992        retval =
1993            sd_send_cmd_get_rsp(chip, GO_IDLE_STATE, 0, SD_RSP_TYPE_R0, NULL,
1994                                0);
1995        if (retval != STATUS_SUCCESS)
1996                TRACE_RET(chip, retval);
1997
1998        wait_timeout(20);
1999
2000        retval =
2001            sd_send_cmd_get_rsp(chip, SEND_IF_COND, 0x000001AA, SD_RSP_TYPE_R7,
2002                                rsp, 5);
2003        if (retval == STATUS_SUCCESS) {
2004                if ((rsp[4] == 0xAA) && ((rsp[3] & 0x0f) == 0x01)) {
2005                        hi_cap_flow = 1;
2006                        if (CHK_RETRY_SD20_MODE(sd_card)) {
2007                                voltage =
2008                                    SUPPORT_VOLTAGE |
2009                                    SUPPORT_HIGH_AND_EXTENDED_CAPACITY;
2010                        } else {
2011                                voltage =
2012                                    SUPPORT_VOLTAGE |
2013                                    SUPPORT_HIGH_AND_EXTENDED_CAPACITY |
2014                                    SUPPORT_MAX_POWER_PERMANCE | SUPPORT_1V8;
2015                        }
2016                }
2017        }
2018
2019        if (!hi_cap_flow) {
2020                voltage = SUPPORT_VOLTAGE;
2021
2022                retval =
2023                    sd_send_cmd_get_rsp(chip, GO_IDLE_STATE, 0, SD_RSP_TYPE_R0,
2024                                        NULL, 0);
2025                if (retval != STATUS_SUCCESS)
2026                        TRACE_RET(chip, retval);
2027                wait_timeout(20);
2028        }
2029
2030        /* ACMD41 */
2031        do {
2032                {
2033                        u8 temp = 0;
2034                        rts51x_read_register(chip, CARD_INT_PEND, &temp);
2035                        RTS51X_DEBUGP("CARD_INT_PEND:%x\n", temp);
2036                        if (temp & SD_INT) {
2037                                chip->reset_need_retry = 1;
2038                                rts51x_write_register(chip, CARD_INT_PEND,
2039                                                      XD_INT | SD_INT | MS_INT,
2040                                                      XD_INT | SD_INT | MS_INT);
2041                                sd_set_reset_fail(chip, SD_RESET_FAIL);
2042                                TRACE_RET(chip, STATUS_FAIL);
2043                        }
2044                }
2045
2046RTY_CMD55:
2047                retval =
2048                    sd_send_cmd_get_rsp(chip, APP_CMD, 0, SD_RSP_TYPE_R1, NULL,
2049                                        0);
2050                if (retval != STATUS_SUCCESS) {
2051                        if (monitor_card_cd(chip, SD_CARD) == CD_NOT_EXIST) {
2052                                sd_set_reset_fail(chip, SD_RESET_FAIL);
2053                                TRACE_RET(chip, STATUS_FAIL);
2054                        }
2055
2056                        j++;
2057                        if (chip->option.speed_mmc) {
2058                                if (j < 2)
2059                                        goto RTY_CMD55;
2060                                else
2061                                        TRACE_RET(chip, STATUS_FAIL);
2062                        } else {
2063                                if (j < 3)
2064                                        goto RTY_SD_RST;
2065                                else
2066                                        TRACE_RET(chip, STATUS_FAIL);
2067                        }
2068                }
2069
2070                retval =
2071                    sd_send_cmd_get_rsp(chip, SD_APP_OP_COND, voltage,
2072                                        SD_RSP_TYPE_R3, rsp, 5);
2073                if (retval != STATUS_SUCCESS) {
2074                        k++;
2075                        if (k < 3)
2076                                goto RTY_SD_RST;
2077                        else
2078                                TRACE_RET(chip, STATUS_FAIL);
2079                }
2080
2081                i++;
2082                wait_timeout(20);
2083        } while (!(rsp[1] & 0x80) && (i < 255)); /* Not complete power on */
2084
2085        if (i == 255) {
2086                /* Time out */
2087                TRACE_RET(chip, STATUS_FAIL);
2088        }
2089
2090        if (hi_cap_flow) {
2091                if (rsp[1] & 0x40)
2092                        SET_SD_HCXC(sd_card);
2093                else
2094                        CLR_SD_HCXC(sd_card);
2095                if (!CHK_RETRY_SD20_MODE(sd_card)) {
2096                        if ((CHK_SD_HCXC(sd_card)) && (CHECK_UHS50(chip))) {
2097                                support_1v8 = (rsp[1] & 0x01) ? 1 : 0;
2098                                RTS51X_DEBUGP("support_1v8 = %d\n",
2099                                               support_1v8);
2100                        }
2101                }
2102        } else {
2103                CLR_SD_HCXC(sd_card);
2104                support_1v8 = 0;
2105        }
2106
2107        /* CMD11: Switch Voltage */
2108        if (support_1v8 && CHECK_UHS50(chip)
2109            && !(((u8) chip->option.sd_speed_prior & SDR104_SUPPORT) ==
2110                 HS_SUPPORT)) {
2111                retval = sd_voltage_switch(chip);
2112                if (retval != STATUS_SUCCESS) {
2113                        SET_RETRY_SD20_MODE(sd_card);
2114                        sd_init_power(chip);
2115                        RTS51X_DEBUGP("1.8v switch fail\n");
2116                        goto Switch_Fail;
2117                }
2118        }
2119
2120        /* CMD 2 */
2121        retval =
2122            sd_send_cmd_get_rsp(chip, ALL_SEND_CID, 0, SD_RSP_TYPE_R2, NULL, 0);
2123        if (retval != STATUS_SUCCESS)
2124                TRACE_RET(chip, retval);
2125
2126        /* CMD 3 */
2127        retval =
2128            sd_send_cmd_get_rsp(chip, SEND_RELATIVE_ADDR, 0, SD_RSP_TYPE_R6,
2129                                rsp, 5);
2130        if (retval != STATUS_SUCCESS)
2131                TRACE_RET(chip, retval);
2132
2133        sd_card->sd_addr = (u32) rsp[1] << 24;
2134        sd_card->sd_addr += (u32) rsp[2] << 16;
2135
2136        /* Get CSD register for Calculating Timing,Capacity,
2137         * Check CSD to determine as if this is the SD ROM card */
2138        retval = sd_check_csd(chip, 1);
2139        if (retval != STATUS_SUCCESS)
2140                TRACE_RET(chip, retval);
2141        /* Select SD card */
2142        retval = rts51x_sd_select_card(chip, 1);
2143        if (retval != STATUS_SUCCESS)
2144                TRACE_RET(chip, retval);
2145
2146        /* ACMD42 */
2147        retval =
2148            sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr, SD_RSP_TYPE_R1,
2149                                NULL, 0);
2150        if (retval != STATUS_SUCCESS)
2151                TRACE_RET(chip, retval);
2152
2153        retval =
2154            sd_send_cmd_get_rsp(chip, SET_CLR_CARD_DETECT, 0, SD_RSP_TYPE_R1,
2155                                NULL, 0);
2156        if (retval != STATUS_SUCCESS)
2157                TRACE_RET(chip, retval);
2158
2159        if (support_1v8) {
2160                /* ACMD6 */
2161                retval =
2162                    sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr,
2163                                        SD_RSP_TYPE_R1, NULL, 0);
2164                if (retval != STATUS_SUCCESS)
2165                        TRACE_RET(chip, retval);
2166                /* Enable 4 bit data bus */
2167                retval =
2168                    sd_send_cmd_get_rsp(chip, SET_BUS_WIDTH, 2, SD_RSP_TYPE_R1,
2169                                        NULL, 0);
2170                if (retval != STATUS_SUCCESS)
2171                        TRACE_RET(chip, retval);
2172                switch_bus_width = SD_BUS_WIDTH_4;
2173        } else {
2174                switch_bus_width = SD_BUS_WIDTH_1;
2175        }
2176
2177        /* Set block length 512 bytes for all block commands */
2178        retval = sd_send_cmd_get_rsp(chip, SET_BLOCKLEN,
2179                        0x200, SD_RSP_TYPE_R1, NULL, 0);
2180        if (retval != STATUS_SUCCESS)
2181                TRACE_RET(chip, retval);
2182
2183        RTS51X_WRITE_REG(chip, SD_CFG1, SD_CLK_DIVIDE_MASK, SD_CLK_DIVIDE_0);
2184
2185        if (!(sd_card->raw_csd[4] & 0x40)) {
2186                sd_dont_switch = 1;
2187                RTS51X_DEBUGP("Not support class ten\n");
2188        }
2189
2190        if (!sd_dont_switch) {
2191                /* Check the card whether flow SD1.1 spec or higher */
2192                retval = sd_check_spec(chip, switch_bus_width);
2193                if (retval == STATUS_SUCCESS) {
2194                        retval = sd_switch_function(chip, switch_bus_width);
2195                        if (retval != STATUS_SUCCESS) {
2196                                if ((sd_card->sd_switch_fail ==
2197                                     SDR104_SUPPORT_MASK)
2198                                    || (sd_card->sd_switch_fail ==
2199                                        DDR50_SUPPORT_MASK)
2200                                    || (sd_card->sd_switch_fail ==
2201                                            SDR50_SUPPORT_MASK)) {
2202                                        sd_init_power(chip);
2203                                        SET_RETRY_SD20_MODE(sd_card);
2204                                } else if (sd_card->sd_switch_fail ==
2205                                                HS_SUPPORT_MASK) {
2206                                        sd_dont_switch = 1;
2207                                }
2208                                goto Switch_Fail;
2209                        }
2210                } else {
2211                        if (support_1v8) {
2212                                SET_RETRY_SD20_MODE(sd_card);
2213                                sd_init_power(chip);
2214                                sd_dont_switch = 1;
2215
2216                                goto Switch_Fail;
2217                        }
2218                }
2219        }
2220
2221        if (!support_1v8) {
2222                /* ACMD6 */
2223                retval =
2224                    sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr,
2225                                        SD_RSP_TYPE_R1, NULL, 0);
2226                if (retval != STATUS_SUCCESS)
2227                        TRACE_RET(chip, retval);
2228                /* Enable 4 bit data bus */
2229                retval =
2230                    sd_send_cmd_get_rsp(chip, SET_BUS_WIDTH, 2, SD_RSP_TYPE_R1,
2231                                        NULL, 0);
2232                if (retval != STATUS_SUCCESS)
2233                        TRACE_RET(chip, retval);
2234        }
2235
2236        if (CHK_SD30_SPEED(sd_card)) {
2237                rts51x_write_register(chip, SD30_DRIVE_SEL, SD30_DRIVE_MASK,
2238                                      0x03);
2239
2240                retval = sd_set_init_para(chip);
2241                if (retval != STATUS_SUCCESS)
2242                        TRACE_RET(chip, retval);
2243
2244                if (CHK_SD_DDR50(sd_card))
2245                        retval = sd_ddr_tuning(chip);
2246                else
2247                        retval = sd_sdr_tuning(chip);
2248
2249                if (retval != STATUS_SUCCESS) {
2250                        SET_RETRY_SD20_MODE(sd_card);
2251                        RTS51X_DEBUGP("tuning phase fail,goto SD20 mode\n");
2252                        sd_init_power(chip);
2253                        CLR_SD30_SPEED(sd_card);
2254                        goto Switch_Fail;
2255                }
2256                if (STATUS_SUCCESS ==
2257                    sd_wait_currentstate_dataready(chip, 0x08, 1, 20)) {
2258                        cmd[0] = 0x40 | READ_SINGLE_BLOCK;
2259                        cmd[1] = 0x00;
2260                        cmd[2] = 0x00;
2261                        cmd[3] = 0x00;
2262                        cmd[4] = 0x00;
2263                        retval =
2264                            sd_read_data(chip, SD_TM_NORMAL_READ, cmd, 5, 512,
2265                                         1, SD_BUS_WIDTH_4, NULL, 0, 600);
2266                        if (retval != STATUS_SUCCESS) {
2267                                SET_RETRY_SD20_MODE(sd_card);
2268                                RTS51X_DEBUGP("read lba0 fail,"
2269                                                        "goto SD20 mode\n");
2270                                sd_init_power(chip);
2271                                CLR_SD30_SPEED(sd_card);
2272                                goto Switch_Fail;
2273                        }
2274                }
2275        }
2276        sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr, SD_RSP_TYPE_R1,
2277                            NULL, 0);
2278
2279        retval = sd_send_cmd_get_rsp(chip, APP_CMD, sd_card->sd_addr,
2280                        SD_RSP_TYPE_R1, NULL, 0);
2281        if (retval == STATUS_SUCCESS) {
2282                int ret;
2283                cmd[0] = 0x40 | SEND_STATUS;
2284                cmd[1] = 0x00;
2285                cmd[2] = 0x00;
2286                cmd[3] = 0x00;
2287                cmd[4] = 0x00;
2288                ret =
2289                    sd_read_data(chip, SD_TM_NORMAL_READ, cmd, 5, 64, 1,
2290                                 SD_BUS_WIDTH_4, buf, 64, 600);
2291                if (ret == STATUS_SUCCESS) {
2292                        sd_card_type = ((u16) buf[2] << 8) | (u16) buf[3];
2293                        RTS51X_DEBUGP("sd_card_type:0x%4x\n", sd_card_type);
2294                        if ((sd_card_type == 0x0001)
2295                            || (sd_card_type == 0x0002))
2296                                chip->card_wp |= SD_CARD;
2297                } else {
2298                        rts51x_clear_sd_error(chip);
2299                        sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
2300                                            SD_RSP_TYPE_R1, NULL, 0);
2301                }
2302        } else {
2303                rts51x_clear_sd_error(chip);
2304                sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
2305                                    SD_RSP_TYPE_R1, NULL, 0);
2306        }
2307
2308        /* Check SD Machanical Write-Protect Switch */
2309        retval = rts51x_get_card_status(chip, &(chip->card_status));
2310        if (retval != STATUS_SUCCESS)
2311                TRACE_RET(chip, retval);
2312        if (chip->card_status & SD_WP)
2313                chip->card_wp |= SD_CARD;
2314
2315        chip->card_bus_width[chip->card2lun[SD_CARD]] = 4;
2316
2317        return STATUS_SUCCESS;
2318}
2319
2320static int mmc_test_switch_bus(struct rts51x_chip *chip, u8 width)
2321{
2322        struct sd_info *sd_card = &(chip->sd_card);
2323        int retval;
2324        u8 buf[8] = { 0 }, bus_width;
2325        u16 byte_cnt;
2326        int len;
2327
2328        retval =
2329            sd_send_cmd_get_rsp(chip, BUSTEST_W, 0, SD_RSP_TYPE_R1, NULL, 0);
2330        if (retval != STATUS_SUCCESS)
2331                TRACE_RET(chip, retval);
2332
2333        if (width == MMC_8BIT_BUS) {
2334                buf[0] = 0x55;
2335                buf[1] = 0xAA;
2336                len = 8;
2337                byte_cnt = 8;
2338                bus_width = SD_BUS_WIDTH_8;
2339        } else {
2340                buf[0] = 0x5A;
2341                len = 4;
2342                byte_cnt = 4;
2343                bus_width = SD_BUS_WIDTH_4;
2344        }
2345
2346        retval = sd_write_data(chip, SD_TM_AUTO_WRITE_3,
2347                               NULL, 0, byte_cnt, 1, bus_width, buf, len, 100);
2348        if (retval != STATUS_SUCCESS) {
2349                u8 val1 = 0, val2 = 0;
2350                rts51x_ep0_read_register(chip, SD_STAT1, &val1);
2351                rts51x_ep0_read_register(chip, SD_STAT2, &val2);
2352                rts51x_clear_sd_error(chip);
2353                if ((val1 & 0xE0) || val2)
2354                        TRACE_RET(chip, STATUS_FAIL);
2355        }
2356        RTS51X_DEBUGP("SD/MMC CMD %d\n", BUSTEST_R);
2357
2358        rts51x_init_cmd(chip);
2359
2360        /* CMD14 */
2361        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CMD0, 0xFF, 0x40 | BUSTEST_R);
2362
2363        if (width == MMC_8BIT_BUS)
2364                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BYTE_CNT_L, 0xFF, 0x08);
2365        else
2366                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BYTE_CNT_L, 0xFF, 0x04);
2367
2368        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BLOCK_CNT_L, 0xFF, 1);
2369        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BLOCK_CNT_H, 0xFF, 0);
2370
2371        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CFG2, 0xFF,
2372                       SD_CALCULATE_CRC7 | SD_NO_CHECK_CRC16 |
2373                       SD_NO_WAIT_BUSY_END | SD_CHECK_CRC7 | SD_RSP_LEN_6);
2374        rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01,
2375                       PINGPONG_BUFFER);
2376        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_TRANSFER, 0xFF,
2377                       SD_TM_NORMAL_READ | SD_TRANSFER_START);
2378        rts51x_add_cmd(chip, CHECK_REG_CMD, SD_TRANSFER, SD_TRANSFER_END,
2379                       SD_TRANSFER_END);
2380
2381        rts51x_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2, 0, 0);
2382        if (width == MMC_8BIT_BUS) {
2383                len = 3;
2384                rts51x_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 1, 0, 0);
2385        } else {
2386                len = 2;
2387        }
2388
2389        retval = rts51x_send_cmd(chip, MODE_CR, 100);
2390        if (retval != STATUS_SUCCESS)
2391                TRACE_RET(chip, retval);
2392
2393        retval = rts51x_get_rsp(chip, len, 100);
2394        if (CHECK_SD_TRANS_FAIL(chip, retval)) {
2395                rts51x_clear_sd_error(chip);
2396                TRACE_RET(chip, STATUS_FAIL);
2397        }
2398
2399        rts51x_read_rsp_buf(chip, 1, buf, 2);
2400
2401        if (width == MMC_8BIT_BUS) {
2402                RTS51X_DEBUGP("BUSTEST_R [8bits]: 0x%02x 0x%02x\n",
2403                                        buf[0], buf[1]);
2404                if ((buf[0] == 0xAA) && (buf[1] == 0x55)) {
2405                        u8 rsp[5];
2406                        u32 arg;
2407
2408                        if (CHK_MMC_DDR52(sd_card))
2409                                arg = 0x03B70600;
2410                        else
2411                                arg = 0x03B70200;
2412                        /* Switch MMC to  8-bit mode */
2413                        retval =
2414                            sd_send_cmd_get_rsp(chip, SWITCH, arg,
2415                                                SD_RSP_TYPE_R1b, rsp, 5);
2416                        if ((retval == STATUS_SUCCESS)
2417                            && !(rsp[4] & MMC_SWITCH_ERR))
2418                                return STATUS_SUCCESS;
2419                }
2420        } else {
2421                RTS51X_DEBUGP("BUSTEST_R [4bits]: 0x%02x\n", buf[0]);
2422                if (buf[0] == 0xA5) {
2423                        u8 rsp[5];
2424                        u32 arg;
2425
2426                        if (CHK_MMC_DDR52(sd_card))
2427                                arg = 0x03B70500;
2428                        else
2429                                arg = 0x03B70100;
2430                        /* Switch MMC to  4-bit mode */
2431                        retval =
2432                            sd_send_cmd_get_rsp(chip, SWITCH, arg,
2433                                                SD_RSP_TYPE_R1b, rsp, 5);
2434                        if ((retval == STATUS_SUCCESS)
2435                            && !(rsp[4] & MMC_SWITCH_ERR))
2436                                return STATUS_SUCCESS;
2437                }
2438        }
2439
2440        TRACE_RET(chip, STATUS_FAIL);
2441}
2442
2443static int mmc_switch_timing_bus(struct rts51x_chip *chip)
2444{
2445        struct sd_info *sd_card = &(chip->sd_card);
2446        int retval;
2447        u8 card_type, card_type_mask = 0;
2448        u8 buf[6];
2449
2450        CLR_MMC_HS(sd_card);
2451
2452        RTS51X_DEBUGP("SD/MMC CMD %d\n", SEND_EXT_CSD);
2453
2454        rts51x_init_cmd(chip);
2455
2456        /* SEND_EXT_CSD command */
2457        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CMD0, 0xFF,
2458                        0x40 | SEND_EXT_CSD);
2459        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CMD1, 0xFF, 0);
2460        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CMD2, 0xFF, 0);
2461        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CMD3, 0xFF, 0);
2462        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CMD4, 0xFF, 0);
2463
2464        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BYTE_CNT_L, 0xFF, 0);
2465        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BYTE_CNT_H, 0xFF, 2);
2466        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BLOCK_CNT_L, 0xFF, 1);
2467        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BLOCK_CNT_H, 0xFF, 0);
2468
2469        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CFG2, 0xFF,
2470                       SD_CALCULATE_CRC7 | SD_CHECK_CRC16 | SD_NO_WAIT_BUSY_END
2471                       | SD_CHECK_CRC7 | SD_RSP_LEN_6);
2472        rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01,
2473                       PINGPONG_BUFFER);
2474        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_TRANSFER, 0xFF,
2475                       SD_TM_NORMAL_READ | SD_TRANSFER_START);
2476        rts51x_add_cmd(chip, CHECK_REG_CMD, SD_TRANSFER, SD_TRANSFER_END,
2477                       SD_TRANSFER_END);
2478
2479        rts51x_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 196, 0xFF, 0);
2480        rts51x_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 212, 0xFF, 0);
2481        rts51x_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 213, 0xFF, 0);
2482        rts51x_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 214, 0xFF, 0);
2483        rts51x_add_cmd(chip, READ_REG_CMD, PPBUF_BASE2 + 215, 0xFF, 0);
2484
2485        retval = rts51x_send_cmd(chip, MODE_CR, 100);
2486        if (retval != STATUS_SUCCESS)
2487                TRACE_RET(chip, retval);
2488
2489        retval = rts51x_get_rsp(chip, 6, 1000);
2490
2491        if (CHECK_SD_TRANS_FAIL(chip, retval)) {
2492                if (retval == STATUS_TIMEDOUT) {
2493                        rts51x_clear_sd_error(chip);
2494                        sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
2495                                            SD_RSP_TYPE_R1, NULL, 0);
2496                }
2497                TRACE_RET(chip, STATUS_FAIL);
2498        }
2499
2500        rts51x_read_rsp_buf(chip, 0, buf, 6);
2501
2502        if (buf[0] & SD_TRANSFER_ERR) {
2503                sd_send_cmd_get_rsp(chip, SEND_STATUS, sd_card->sd_addr,
2504                                    SD_RSP_TYPE_R1, NULL, 0);
2505                TRACE_RET(chip, STATUS_FAIL);
2506        }
2507        if (CHK_MMC_SECTOR_MODE(sd_card))
2508                sd_card->capacity =
2509                    ((u32) buf[5] << 24) | ((u32) buf[4] << 16) |
2510                    ((u32) buf[3] << 8) | ((u32) buf[2]);
2511        if (CHECK_UHS50(chip))
2512                card_type_mask = 0x07;
2513        else
2514                card_type_mask = 0x03;
2515
2516        card_type = buf[1] & card_type_mask;
2517        if (card_type) {
2518                /* CARD TYPE FIELD = DDR52MHz, 52MHz or 26MHz */
2519                u8 rsp[5];
2520
2521                if (card_type & 0x04)
2522                        SET_MMC_DDR52(sd_card);
2523                else if (card_type & 0x02)
2524                        SET_MMC_52M(sd_card);
2525                else
2526                        SET_MMC_26M(sd_card);
2527
2528                retval =
2529                    sd_send_cmd_get_rsp(chip, SWITCH, 0x03B90100,
2530                                        SD_RSP_TYPE_R1b, rsp, 5);
2531                if ((retval != STATUS_SUCCESS) || (rsp[4] & MMC_SWITCH_ERR))
2532                        CLR_MMC_HS(sd_card);
2533        }
2534        sd_choose_proper_clock(chip);
2535        retval = switch_clock(chip, sd_card->sd_clock);
2536        if (retval != STATUS_SUCCESS)
2537                TRACE_RET(chip, retval);
2538
2539        /* Test Bus Procedure */
2540        if (mmc_test_switch_bus(chip, MMC_8BIT_BUS) == STATUS_SUCCESS) {
2541                SET_MMC_8BIT(sd_card);
2542                chip->card_bus_width[chip->card2lun[SD_CARD]] = 8;
2543        } else if (mmc_test_switch_bus(chip, MMC_4BIT_BUS) == STATUS_SUCCESS) {
2544                SET_MMC_4BIT(sd_card);
2545                chip->card_bus_width[chip->card2lun[SD_CARD]] = 4;
2546        } else {
2547                CLR_MMC_8BIT(sd_card);
2548                CLR_MMC_4BIT(sd_card);
2549        }
2550
2551        return STATUS_SUCCESS;
2552}
2553
2554static int reset_mmc(struct rts51x_chip *chip)
2555{
2556        struct sd_info *sd_card = &(chip->sd_card);
2557        int retval, i = 0, j = 0, k = 0;
2558        u8 rsp[16];
2559        u8 spec_ver = 0;
2560        u8 change_to_ddr52 = 1;
2561        u8 cmd[5];
2562
2563MMC_DDR_FAIL:
2564
2565        retval = sd_prepare_reset(chip);
2566        if (retval != STATUS_SUCCESS)
2567                TRACE_RET(chip, retval);
2568
2569        SET_MMC(sd_card);
2570
2571RTY_MMC_RST:
2572        retval =
2573            sd_send_cmd_get_rsp(chip, GO_IDLE_STATE, 0, SD_RSP_TYPE_R0, NULL,
2574                                0);
2575        if (retval != STATUS_SUCCESS)
2576                TRACE_RET(chip, retval);
2577
2578        do {
2579                {
2580                        u8 temp = 0;
2581                        rts51x_read_register(chip, CARD_INT_PEND, &temp);
2582                        if (temp & SD_INT) {
2583                                chip->reset_need_retry = 1;
2584                                rts51x_write_register(chip, CARD_INT_PEND,
2585                                                      XD_INT | SD_INT | MS_INT,
2586                                                      XD_INT | SD_INT | MS_INT);
2587                                sd_set_reset_fail(chip, MMC_RESET_FAIL);
2588                                TRACE_RET(chip, STATUS_FAIL);
2589                        }
2590                }
2591
2592                /* CMD  1 */
2593                retval = sd_send_cmd_get_rsp(chip, SEND_OP_COND,
2594                                             (SUPPORT_VOLTAGE | 0x40000000),
2595                                             SD_RSP_TYPE_R3, rsp, 5);
2596                if (retval != STATUS_SUCCESS) {
2597                        if (monitor_card_cd(chip, SD_CARD) == CD_NOT_EXIST) {
2598                                sd_set_reset_fail(chip, MMC_RESET_FAIL);
2599                                TRACE_RET(chip, STATUS_FAIL);
2600                        }
2601
2602                        if (sd_check_err_code(chip, SD_BUSY)
2603                            || sd_check_err_code(chip, SD_TO_ERR)) {
2604                                k++;
2605                                if (k < 20) {
2606                                        sd_clr_err_code(chip);
2607                                        goto RTY_MMC_RST;
2608                                } else {
2609                                        TRACE_RET(chip, STATUS_FAIL);
2610                                }
2611                        } else {
2612                                j++;
2613                                if (j < 100) {
2614                                        sd_clr_err_code(chip);
2615                                        goto RTY_MMC_RST;
2616                                } else {
2617                                        TRACE_RET(chip, STATUS_FAIL);
2618                                }
2619                        }
2620                }
2621
2622                wait_timeout(20);
2623                i++;
2624        } while (!(rsp[1] & 0x80) && (i < 100)); /* Not complete power on */
2625
2626        if (i == 100) {
2627                /* Time out */
2628                TRACE_RET(chip, STATUS_FAIL);
2629        }
2630
2631        if ((rsp[1] & 0x60) == 0x40)
2632                SET_MMC_SECTOR_MODE(sd_card);
2633        else
2634                CLR_MMC_SECTOR_MODE(sd_card);
2635
2636        /* CMD 2 */
2637        retval =
2638            sd_send_cmd_get_rsp(chip, ALL_SEND_CID, 0, SD_RSP_TYPE_R2, NULL, 0);
2639        if (retval != STATUS_SUCCESS)
2640                TRACE_RET(chip, retval);
2641
2642        /* CMD 3 */
2643        sd_card->sd_addr = 0x00100000;
2644        retval =
2645            sd_send_cmd_get_rsp(chip, SET_RELATIVE_ADDR, sd_card->sd_addr,
2646                                SD_RSP_TYPE_R6, rsp, 5);
2647        if (retval != STATUS_SUCCESS)
2648                TRACE_RET(chip, retval);
2649
2650        /* Get CSD register for Calculating Timing,Capacity
2651         * Check CSD to determine as if this is the SD ROM card */
2652        retval = sd_check_csd(chip, 1);
2653        if (retval != STATUS_SUCCESS)
2654                TRACE_RET(chip, retval);
2655        /* Get MMC Spec_Ver in the CSD register */
2656        spec_ver = (sd_card->raw_csd[0] & 0x3C) >> 2;
2657
2658        /* Select MMC card */
2659        retval = rts51x_sd_select_card(chip, 1);
2660        if (retval != STATUS_SUCCESS)
2661                TRACE_RET(chip, retval);
2662
2663        /* Set block length 512 bytes for all block commands */
2664        retval =
2665            sd_send_cmd_get_rsp(chip, SET_BLOCKLEN, 0x200, SD_RSP_TYPE_R1, NULL,
2666                                0);
2667        if (retval != STATUS_SUCCESS)
2668                TRACE_RET(chip, retval);
2669
2670        RTS51X_WRITE_REG(chip, SD_CFG1, SD_CLK_DIVIDE_MASK, SD_CLK_DIVIDE_0);
2671
2672        if (chip->ic_version < 2)
2673                rts51x_write_register(chip, SD30_DRIVE_SEL, SD30_DRIVE_MASK,
2674                                      0x02);
2675        rts51x_write_register(chip, CARD_DRIVE_SEL, SD20_DRIVE_MASK, DRIVE_8mA);
2676
2677        chip->card_bus_width[chip->card2lun[SD_CARD]] = 1;
2678        if (spec_ver == 4) {
2679                /* MMC 4.x Cards */
2680                (void)mmc_switch_timing_bus(chip);
2681        }
2682
2683        if (CHK_MMC_SECTOR_MODE(sd_card) && (sd_card->capacity == 0))
2684                TRACE_RET(chip, STATUS_FAIL);
2685
2686        if (CHK_MMC_DDR52(sd_card) && change_to_ddr52) {
2687                /* Card is extracted while identifying */
2688                if (monitor_card_cd(chip, SD_CARD) == CD_NOT_EXIST)
2689                        TRACE_RET(chip, STATUS_FAIL);
2690
2691                retval = sd_set_init_para(chip);
2692                if (retval != STATUS_SUCCESS) {
2693                        CLR_MMC_DDR52(sd_card);
2694                        sd_init_power(chip);
2695                        change_to_ddr52 = 0;
2696                        goto MMC_DDR_FAIL;
2697                }
2698
2699                retval = mmc_ddr_tuning(chip);
2700                if (retval != STATUS_SUCCESS) {
2701                        CLR_MMC_DDR52(sd_card);
2702                        sd_init_power(chip);
2703                        change_to_ddr52 = 0;
2704                        goto MMC_DDR_FAIL;
2705                }
2706
2707                if (STATUS_SUCCESS ==
2708                    sd_wait_currentstate_dataready(chip, 0x08, 1, 20)) {
2709                        cmd[0] = 0x40 | READ_SINGLE_BLOCK;
2710                        cmd[1] = 0x00;
2711                        cmd[2] = 0x00;
2712                        cmd[3] = 0x00;
2713                        cmd[4] = 0x00;
2714                        if (CHK_MMC_8BIT(sd_card)) {
2715                                retval =
2716                                    sd_read_data(chip, SD_TM_NORMAL_READ, cmd,
2717                                                 5, 512, 1, SD_BUS_WIDTH_8,
2718                                                 NULL, 0, 600);
2719                        } else if (CHK_MMC_4BIT(sd_card)) {
2720                                retval =
2721                                    sd_read_data(chip, SD_TM_NORMAL_READ, cmd,
2722                                                 5, 512, 1, SD_BUS_WIDTH_4,
2723                                                 NULL, 0, 600);
2724                        } else {
2725                                retval =
2726                                    sd_read_data(chip, SD_TM_NORMAL_READ, cmd,
2727                                                 5, 512, 1, SD_BUS_WIDTH_1,
2728                                                 NULL, 0, 600);
2729                        }
2730
2731                        if (retval != STATUS_SUCCESS) {
2732                                CLR_MMC_DDR52(sd_card);
2733                                change_to_ddr52 = 0;
2734                                RTS51X_DEBUGP("read lba0 fail,"
2735                                                        "goto SD20 mode\n");
2736                                sd_init_power(chip);
2737                                goto MMC_DDR_FAIL;
2738                        }
2739                }
2740        }
2741
2742        retval = rts51x_get_card_status(chip, &(chip->card_status));
2743        if (retval != STATUS_SUCCESS)
2744                TRACE_RET(chip, retval);
2745        if (chip->card_status & SD_WP)
2746                chip->card_wp |= SD_CARD;
2747
2748        return STATUS_SUCCESS;
2749}
2750
2751int rts51x_reset_sd_card(struct rts51x_chip *chip)
2752{
2753        struct sd_info *sd_card = &(chip->sd_card);
2754        int retval;
2755        int i;
2756
2757        memset(sd_card, 0, sizeof(struct sd_info));
2758
2759        /* Init variables */
2760        sd_card->sd_type = 0;
2761        sd_card->seq_mode = 0;
2762        sd_card->sd_data_buf_ready = 0;
2763        sd_card->capacity = 0;
2764        sd_card->sd_switch_fail = 0;
2765
2766        sd_clear_reset_fail(chip);
2767        rts51x_enable_card_clock(chip, SD_CARD);
2768
2769        sd_init_power(chip);
2770
2771        chip->reset_need_retry = 0;
2772        for (i = 0; i < 3; i++) {
2773                if (!chip->option.reset_mmc_first) { /* reset sd first */
2774                        retval = reset_sd(chip);
2775                        if (retval != STATUS_SUCCESS) {
2776                                /* Switch SD bus to 3V3 signal */
2777                                RTS51X_WRITE_REG(chip, SD_PAD_CTL,
2778                                                 SD_IO_USING_1V8, 0);
2779                                if (sd_check_reset_fail(chip, SD_RESET_FAIL))
2780                                        sd_clear_reset_fail(chip);
2781                                else
2782                                        retval = reset_mmc(chip);
2783                        }
2784                } else { /* reset MMC first */
2785                        retval = reset_mmc(chip);
2786                        if (retval != STATUS_SUCCESS) {
2787                                if (sd_check_reset_fail(chip, MMC_RESET_FAIL)) {
2788                                        sd_clear_reset_fail(chip);
2789                                } else {
2790                                        retval = reset_sd(chip);
2791                                        if (retval != STATUS_SUCCESS) {
2792                                                /* Switch SD bus to
2793                                                 * 3V3 signal */
2794                                                RTS51X_WRITE_REG(chip,
2795                                                        SD_PAD_CTL,
2796                                                        SD_IO_USING_1V8, 0);
2797                                        }
2798                                }
2799                        }
2800                }
2801
2802                if ((retval == STATUS_SUCCESS) || (!chip->reset_need_retry)) {
2803                        /* if reset success or don't need retry,then break */
2804                        break;
2805                }
2806                if (monitor_card_cd(chip, SD_CARD) == CD_NOT_EXIST) {
2807                        /* card is extracted */
2808                        break;
2809                }
2810                RTS51X_DEBUGP("retry reset sd card,%d\n", i);
2811                chip->reset_need_retry = 0;
2812        }
2813
2814        sd_clear_reset_fail(chip);
2815        chip->reset_need_retry = 0;
2816
2817        if (retval == STATUS_SUCCESS) {
2818                rts51x_init_cmd(chip);
2819                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CFG1, SD_CLK_DIVIDE_MASK,
2820                               SD_CLK_DIVIDE_0);
2821                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BYTE_CNT_L, 0xFF, 0);
2822                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BYTE_CNT_H, 0xFF, 2);
2823                retval = rts51x_send_cmd(chip, MODE_C, 100);
2824                if (retval != STATUS_SUCCESS)
2825                        TRACE_RET(chip, retval);
2826        } else {
2827                chip->capacity[chip->card2lun[SD_CARD]] = sd_card->capacity = 0;
2828                if (chip->option.reset_or_rw_fail_set_pad_drive) {
2829                        rts51x_write_register(chip, CARD_DRIVE_SEL,
2830                                              SD20_DRIVE_MASK, DRIVE_8mA);
2831                }
2832                TRACE_RET(chip, STATUS_FAIL);
2833        }
2834
2835        chip->capacity[chip->card2lun[SD_CARD]] = sd_card->capacity;
2836
2837        if (chip->option.sd_send_status_en) {
2838                sd_card->sd_send_status_en = 1;
2839        } else {
2840                if (sd_card->capacity > 0x20000) { /* 64MB */
2841                        sd_card->sd_send_status_en = 0;
2842                } else {
2843                        sd_card->sd_send_status_en = 1;
2844                }
2845        }
2846        RTS51X_DEBUGP("sd_card->sd_send_status = %d\n",
2847                       sd_card->sd_send_status_en);
2848
2849        retval = sd_set_init_para(chip);
2850        if (retval != STATUS_SUCCESS)
2851                TRACE_RET(chip, retval);
2852
2853        RTS51X_DEBUGP("sd_card->sd_type = 0x%x\n", sd_card->sd_type);
2854
2855        return STATUS_SUCCESS;
2856}
2857
2858#define WAIT_DATA_READY_RTY_CNT         255
2859
2860static int wait_data_buf_ready(struct rts51x_chip *chip)
2861{
2862        struct sd_info *sd_card = &(chip->sd_card);
2863        int i, retval;
2864
2865        for (i = 0; i < WAIT_DATA_READY_RTY_CNT; i++) {
2866                if (monitor_card_cd(chip, SD_CARD) == CD_NOT_EXIST)
2867                        TRACE_RET(chip, STATUS_FAIL);
2868
2869                sd_card->sd_data_buf_ready = 0;
2870
2871                retval = sd_send_cmd_get_rsp(chip, SEND_STATUS,
2872                                             sd_card->sd_addr, SD_RSP_TYPE_R1,
2873                                             NULL, 0);
2874                if (retval != STATUS_SUCCESS)
2875                        TRACE_RET(chip, retval);
2876
2877                if (sd_card->sd_data_buf_ready)
2878                        return sd_send_cmd_get_rsp(chip, SEND_STATUS,
2879                                                   sd_card->sd_addr,
2880                                                   SD_RSP_TYPE_R1, NULL, 0);
2881        }
2882
2883        sd_set_err_code(chip, SD_TO_ERR);
2884
2885        TRACE_RET(chip, STATUS_FAIL);
2886}
2887
2888static void sd_stop_seq_mode(struct rts51x_chip *chip)
2889{
2890        struct sd_info *sd_card = &(chip->sd_card);
2891        int retval;
2892
2893        if (sd_card->seq_mode) {
2894                retval = rts51x_sd_switch_clock(chip);
2895                if (retval != STATUS_SUCCESS)
2896                        return;
2897
2898                retval = sd_send_cmd_get_rsp(chip, STOP_TRANSMISSION, 0,
2899                                             SD_RSP_TYPE_R1b, NULL, 0);
2900                if (retval != STATUS_SUCCESS)
2901                        sd_set_err_code(chip, SD_STS_ERR);
2902                sd_card->seq_mode = 0;
2903
2904                rts51x_ep0_write_register(chip, MC_FIFO_CTL, FIFO_FLUSH,
2905                                          FIFO_FLUSH);
2906        }
2907}
2908
2909static inline int sd_auto_tune_clock(struct rts51x_chip *chip)
2910{
2911        struct sd_info *sd_card = &(chip->sd_card);
2912        int retval;
2913
2914        if (chip->asic_code) {
2915                if (sd_card->sd_clock > 30)
2916                        sd_card->sd_clock -= 20;
2917        } else {
2918                if (sd_card->sd_clock == CLK_100)
2919                        sd_card->sd_clock = CLK_80;
2920                else if (sd_card->sd_clock == CLK_80)
2921                        sd_card->sd_clock = CLK_60;
2922                else if (sd_card->sd_clock == CLK_60)
2923                        sd_card->sd_clock = CLK_50;
2924        }
2925
2926        retval = rts51x_sd_switch_clock(chip);
2927        if (retval != STATUS_SUCCESS)
2928                TRACE_RET(chip, retval);
2929
2930        return STATUS_SUCCESS;
2931}
2932
2933int rts51x_sd_rw(struct scsi_cmnd *srb, struct rts51x_chip *chip, u32 start_sector,
2934          u16 sector_cnt)
2935{
2936        struct sd_info *sd_card = &(chip->sd_card);
2937        u32 data_addr;
2938        int retval;
2939        u8 flag;
2940        unsigned int pipe;
2941        u8 stageflag;
2942
2943        sd_card->counter = 0;
2944
2945        if (!CHK_SD_HCXC(sd_card) && !CHK_MMC_SECTOR_MODE(sd_card))
2946                data_addr = start_sector << 9;
2947        else
2948                data_addr = start_sector;
2949
2950        RTS51X_DEBUGP("rts51x_sd_rw, data_addr = 0x%x\n", data_addr);
2951
2952        sd_clr_err_code(chip);
2953
2954        retval = rts51x_sd_switch_clock(chip);
2955        if (retval != STATUS_SUCCESS)
2956                TRACE_RET(chip, retval);
2957
2958        if (sd_card->seq_mode && ((sd_card->pre_dir != srb->sc_data_direction)
2959                                  ||
2960                                  ((sd_card->pre_sec_addr +
2961                                    sd_card->pre_sec_cnt) != start_sector))) {
2962                if ((sd_card->pre_dir == DMA_FROM_DEVICE)
2963                    && !CHK_SD30_SPEED(sd_card)
2964                    && !CHK_SD_HS(sd_card)
2965                    && !CHK_MMC_HS(sd_card)
2966                    && sd_card->sd_send_status_en) {
2967                        sd_send_cmd_get_rsp(chip, SEND_STATUS,
2968                                            sd_card->sd_addr, SD_RSP_TYPE_R1,
2969                                            NULL, 0);
2970                }
2971
2972                retval =
2973                    sd_send_cmd_get_rsp(chip, STOP_TRANSMISSION, 0,
2974                                        SD_RSP_TYPE_R1b, NULL, 0);
2975                if (retval != STATUS_SUCCESS) {
2976                        sd_set_err_code(chip, SD_STS_ERR);
2977                        TRACE_RET(chip, sd_parse_err_code(chip));
2978                }
2979
2980                sd_card->seq_mode = 0;
2981
2982                RTS51X_WRITE_REG(chip, MC_FIFO_CTL, FIFO_FLUSH, FIFO_FLUSH);
2983
2984                if (!CHK_SD30_SPEED(sd_card)
2985                    && !CHK_SD_HS(sd_card)
2986                    && !CHK_MMC_HS(sd_card)
2987                    && sd_card->sd_send_status_en) {
2988                        /* random rw, so pre_sec_cnt < 0x80 */
2989                        sd_send_cmd_get_rsp(chip, SEND_STATUS,
2990                                            sd_card->sd_addr, SD_RSP_TYPE_R1,
2991                                            NULL, 0);
2992                }
2993        }
2994
2995        rts51x_init_cmd(chip);
2996
2997        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BYTE_CNT_L, 0xFF, 0x00);
2998        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BYTE_CNT_H, 0xFF, 0x02);
2999        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BLOCK_CNT_L, 0xFF,
3000                       (u8) sector_cnt);
3001        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_BLOCK_CNT_H, 0xFF,
3002                       (u8) (sector_cnt >> 8));
3003
3004        rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01,
3005                       RING_BUFFER);
3006
3007        if (CHK_MMC_8BIT(sd_card))
3008                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CFG1, 0x03,
3009                               SD_BUS_WIDTH_8);
3010        else if (CHK_MMC_4BIT(sd_card) || CHK_SD(sd_card))
3011                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CFG1, 0x03,
3012                               SD_BUS_WIDTH_4);
3013        else
3014                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CFG1, 0x03,
3015                               SD_BUS_WIDTH_1);
3016
3017        if (sd_card->seq_mode) {
3018                rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CFG2, 0xFF,
3019                               SD_NO_CALCULATE_CRC7 | SD_CHECK_CRC16 |
3020                               SD_NO_WAIT_BUSY_END | SD_NO_CHECK_CRC7 |
3021                               SD_RSP_LEN_0);
3022
3023                rts51x_trans_dma_enable(srb->sc_data_direction, chip, sector_cnt * 512,
3024                                 DMA_512);
3025
3026                if (srb->sc_data_direction == DMA_FROM_DEVICE) {
3027                        flag = MODE_CDIR;
3028                        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_TRANSFER, 0xFF,
3029                                       SD_TM_AUTO_READ_3 | SD_TRANSFER_START);
3030                } else {
3031                        flag = MODE_CDOR;
3032                        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_TRANSFER, 0xFF,
3033                                       SD_TM_AUTO_WRITE_3 | SD_TRANSFER_START);
3034                }
3035
3036                rts51x_add_cmd(chip, CHECK_REG_CMD, SD_TRANSFER,
3037                               SD_TRANSFER_END, SD_TRANSFER_END);
3038
3039                retval = rts51x_send_cmd(chip, flag, 100);
3040                if (retval != STATUS_SUCCESS)
3041                        TRACE_RET(chip, retval);
3042        } else {
3043                if (srb->sc_data_direction == DMA_FROM_DEVICE) {
3044                        RTS51X_DEBUGP("SD/MMC CMD %d\n", READ_MULTIPLE_BLOCK);
3045                        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CMD0, 0xFF,
3046                                       0x40 | READ_MULTIPLE_BLOCK);
3047                        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CMD1, 0xFF,
3048                                       (u8) (data_addr >> 24));
3049                        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CMD2, 0xFF,
3050                                       (u8) (data_addr >> 16));
3051                        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CMD3, 0xFF,
3052                                       (u8) (data_addr >> 8));
3053                        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CMD4, 0xFF,
3054                                       (u8) data_addr);
3055
3056                        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CFG2, 0xFF,
3057                                       SD_CALCULATE_CRC7 | SD_CHECK_CRC16 |
3058                                       SD_NO_WAIT_BUSY_END | SD_CHECK_CRC7 |
3059                                       SD_RSP_LEN_6);
3060
3061                        rts51x_trans_dma_enable(srb->sc_data_direction, chip,
3062                                         sector_cnt * 512, DMA_512);
3063
3064                        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_TRANSFER, 0xFF,
3065                                       SD_TM_AUTO_READ_2 | SD_TRANSFER_START);
3066                        rts51x_add_cmd(chip, CHECK_REG_CMD, SD_TRANSFER,
3067                                       SD_TRANSFER_END, SD_TRANSFER_END);
3068
3069                        retval = rts51x_send_cmd(chip, MODE_CDIR, 100);
3070                        if (retval != STATUS_SUCCESS)
3071                                TRACE_RET(chip, retval);
3072                } else {
3073                        retval = rts51x_send_cmd(chip, MODE_C, 50);
3074                        if (retval != STATUS_SUCCESS) {
3075                                rts51x_clear_sd_error(chip);
3076
3077                                sd_set_err_code(chip, SD_TO_ERR);
3078                                TRACE_RET(chip, sd_parse_err_code(chip));
3079                        }
3080
3081                        retval = wait_data_buf_ready(chip);
3082                        if (retval != STATUS_SUCCESS) {
3083                                sd_set_err_code(chip, SD_TO_ERR);
3084                                TRACE_RET(chip, sd_parse_err_code(chip));
3085                        }
3086
3087                        retval = sd_send_cmd_get_rsp(chip, WRITE_MULTIPLE_BLOCK,
3088                                                     data_addr, SD_RSP_TYPE_R1,
3089                                                     NULL, 0);
3090                        if (retval != STATUS_SUCCESS) {
3091                                sd_set_err_code(chip, SD_CRC_ERR);
3092                                TRACE_RET(chip, sd_parse_err_code(chip));
3093                        }
3094
3095                        rts51x_init_cmd(chip);
3096
3097                        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_CFG2, 0xFF,
3098                                       SD_NO_CALCULATE_CRC7 | SD_CHECK_CRC16 |
3099                                       SD_NO_WAIT_BUSY_END | SD_NO_CHECK_CRC7 |
3100                                       SD_RSP_LEN_0);
3101
3102                        rts51x_trans_dma_enable(srb->sc_data_direction, chip,
3103                                         sector_cnt * 512, DMA_512);
3104
3105                        rts51x_add_cmd(chip, WRITE_REG_CMD, SD_TRANSFER, 0xFF,
3106                                       SD_TM_AUTO_WRITE_3 | SD_TRANSFER_START);
3107                        rts51x_add_cmd(chip, CHECK_REG_CMD, SD_TRANSFER,
3108                                       SD_TRANSFER_END, SD_TRANSFER_END);
3109
3110                        retval = rts51x_send_cmd(chip, MODE_CDOR, 100);
3111                        if (retval != STATUS_SUCCESS)
3112                                TRACE_RET(chip, retval);
3113                }
3114
3115                sd_card->seq_mode = 1;
3116        }
3117
3118        if (srb->sc_data_direction == DMA_FROM_DEVICE) {
3119                pipe = RCV_BULK_PIPE(chip);
3120                stageflag = STAGE_DI;
3121        } else {
3122                pipe = SND_BULK_PIPE(chip);
3123                stageflag = STAGE_DO;
3124        }
3125
3126        retval =
3127            rts51x_transfer_data_rcc(chip, pipe, scsi_sglist(srb),
3128                                     scsi_bufflen(srb), scsi_sg_count(srb),
3129                                     NULL, 10000, stageflag);
3130        if (retval != STATUS_SUCCESS) {
3131                u8 stat = 0;
3132                int err = retval;
3133
3134                sd_print_debug_reg(chip);
3135
3136                rts51x_ep0_read_register(chip, SD_STAT1, &stat);
3137                RTS51X_DEBUGP("SD_STAT1: 0x%x\n", stat);
3138
3139                rts51x_clear_sd_error(chip);
3140
3141                retval =
3142                    sd_send_cmd_get_rsp(chip, STOP_TRANSMISSION, 0,
3143                                        SD_RSP_TYPE_R1b, NULL, 0);
3144                if (retval != STATUS_SUCCESS) {
3145                        sd_set_err_code(chip, SD_STS_ERR);
3146                        TRACE_RET(chip, retval);
3147                }
3148
3149                if (stat & (SD_CRC7_ERR | SD_CRC16_ERR | SD_CRC_WRITE_ERR)) {
3150                        RTS51X_DEBUGP("SD CRC error, tune clock!\n");
3151                        sd_auto_tune_clock(chip);
3152                }
3153
3154                sd_card->seq_mode = 0;
3155
3156                TRACE_RET(chip, err);
3157        }
3158        retval = rts51x_get_rsp(chip, 1, 2000);
3159        if (CHECK_SD_TRANS_FAIL(chip, retval)) {
3160                rts51x_clear_sd_error(chip);
3161                TRACE_RET(chip, STATUS_FAIL);
3162        }
3163
3164        sd_card->pre_sec_addr = start_sector;
3165        sd_card->pre_sec_cnt = sector_cnt;
3166        sd_card->pre_dir = srb->sc_data_direction;
3167
3168        return STATUS_SUCCESS;
3169}
3170
3171void rts51x_sd_cleanup_work(struct rts51x_chip *chip)
3172{
3173        struct sd_info *sd_card = &(chip->sd_card);
3174
3175        if (sd_card->seq_mode) {
3176                RTS51X_DEBUGP("SD: stop transmission\n");
3177                sd_stop_seq_mode(chip);
3178                sd_card->counter = 0;
3179        }
3180}
3181
3182static inline void sd_fill_power_off_card3v3(struct rts51x_chip *chip)
3183{
3184        rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_CLK_EN, SD_CLK_EN, 0);
3185
3186        rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_OE, SD_OUTPUT_EN, 0);
3187        if (!chip->option.FT2_fast_mode) {
3188#ifdef SD_XD_IO_FOLLOW_PWR
3189                if (CHECK_PKG(chip, LQFP48)
3190                    || chip->option.rts5129_D3318_off_enable)
3191                        rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PWR_CTL,
3192                                       POWER_MASK | LDO_OFF,
3193                                       POWER_OFF | LDO_OFF);
3194                else
3195                        rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PWR_CTL,
3196                                       POWER_MASK, POWER_OFF);
3197#else
3198                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PWR_CTL, POWER_MASK,
3199                               POWER_OFF);
3200#endif
3201        }
3202}
3203
3204static int sd_power_off_card3v3(struct rts51x_chip *chip)
3205{
3206        int retval;
3207
3208        rts51x_init_cmd(chip);
3209
3210        sd_fill_power_off_card3v3(chip);
3211
3212        retval = rts51x_send_cmd(chip, MODE_C, 100);
3213        if (retval != STATUS_SUCCESS)
3214                TRACE_RET(chip, retval);
3215#ifdef SD_XD_IO_FOLLOW_PWR
3216        if (!chip->option.FT2_fast_mode)
3217                wait_timeout(chip->option.D3318_off_delay);
3218#endif
3219
3220        return STATUS_SUCCESS;
3221}
3222
3223int rts51x_release_sd_card(struct rts51x_chip *chip)
3224{
3225        struct sd_info *sd_card = &(chip->sd_card);
3226        int retval;
3227
3228        RTS51X_DEBUGP("rts51x_release_sd_card\n");
3229
3230        chip->card_ready &= ~SD_CARD;
3231        chip->card_fail &= ~SD_CARD;
3232        chip->card_wp &= ~SD_CARD;
3233
3234        memset(sd_card->raw_csd, 0, 16);
3235        memset(sd_card->raw_scr, 0, 8);
3236
3237        rts51x_write_register(chip, SFSM_ED, HW_CMD_STOP, HW_CMD_STOP);
3238        rts51x_write_register(chip, SD_PAD_CTL, SD_IO_USING_1V8, 0);
3239        if (CHECK_PKG(chip, LQFP48) || chip->option.rts5129_D3318_off_enable)
3240                sd_power_off_card3v3(chip);
3241
3242        rts51x_init_cmd(chip);
3243        if (!(CHECK_PKG(chip, LQFP48) || chip->option.rts5129_D3318_off_enable))
3244                sd_fill_power_off_card3v3(chip);
3245
3246        if (chip->asic_code)
3247                sd_pull_ctl_disable(chip);
3248        else
3249                rts51x_add_cmd(chip, WRITE_REG_CMD, FPGA_PULL_CTL,
3250                               FPGA_SD_PULL_CTL_BIT | 0x20,
3251                               FPGA_SD_PULL_CTL_BIT);
3252
3253        /* Switch LDO3318 to 3.3V */
3254        rts51x_add_cmd(chip, WRITE_REG_CMD, LDO_POWER_CFG, TUNE_SD18_MASK,
3255                       TUNE_SD18_3V3);
3256
3257        if (CHK_MMC_DDR52(sd_card) && CHK_MMC_8BIT(sd_card))
3258                rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_DMA1_CTL,
3259                               EXTEND_DMA1_ASYNC_SIGNAL,
3260                               EXTEND_DMA1_ASYNC_SIGNAL);
3261        if (CHK_SD30_SPEED(sd_card) || CHK_MMC(sd_card))
3262                rts51x_add_cmd(chip, WRITE_REG_CMD, SD30_DRIVE_SEL,
3263                               SD30_DRIVE_MASK, chip->option.sd30_pad_drive);
3264        /* Suspend LDO3318 */
3265        rts51x_add_cmd(chip, WRITE_REG_CMD, CARD_PWR_CTL, LDO3318_PWR_MASK,
3266                       LDO_SUSPEND);
3267
3268        retval = rts51x_send_cmd(chip, MODE_C, 100);
3269        if (retval != STATUS_SUCCESS)
3270                TRACE_RET(chip, retval);
3271        wait_timeout(20);
3272
3273        return STATUS_SUCCESS;
3274}
3275