cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

rtsx_card.c (26632B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * Driver for Realtek PCI-Express card reader
      4 *
      5 * Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved.
      6 *
      7 * Author:
      8 *   Wei WANG (wei_wang@realsil.com.cn)
      9 *   Micky Ching (micky_ching@realsil.com.cn)
     10 */
     11
     12#include <linux/blkdev.h>
     13#include <linux/kthread.h>
     14#include <linux/sched.h>
     15#include <linux/workqueue.h>
     16#include <linux/kernel.h>
     17
     18#include "rtsx.h"
     19#include "sd.h"
     20#include "xd.h"
     21#include "ms.h"
     22
     23void do_remaining_work(struct rtsx_chip *chip)
     24{
     25	struct sd_info *sd_card = &chip->sd_card;
     26#ifdef XD_DELAY_WRITE
     27	struct xd_info *xd_card = &chip->xd_card;
     28#endif
     29	struct ms_info *ms_card = &chip->ms_card;
     30
     31	if (chip->card_ready & SD_CARD) {
     32		if (sd_card->seq_mode) {
     33			rtsx_set_stat(chip, RTSX_STAT_RUN);
     34			sd_card->cleanup_counter++;
     35		} else {
     36			sd_card->cleanup_counter = 0;
     37		}
     38	}
     39
     40#ifdef XD_DELAY_WRITE
     41	if (chip->card_ready & XD_CARD) {
     42		if (xd_card->delay_write.delay_write_flag) {
     43			rtsx_set_stat(chip, RTSX_STAT_RUN);
     44			xd_card->cleanup_counter++;
     45		} else {
     46			xd_card->cleanup_counter = 0;
     47		}
     48	}
     49#endif
     50
     51	if (chip->card_ready & MS_CARD) {
     52		if (CHK_MSPRO(ms_card)) {
     53			if (ms_card->seq_mode) {
     54				rtsx_set_stat(chip, RTSX_STAT_RUN);
     55				ms_card->cleanup_counter++;
     56			} else {
     57				ms_card->cleanup_counter = 0;
     58			}
     59		} else {
     60#ifdef MS_DELAY_WRITE
     61			if (ms_card->delay_write.delay_write_flag) {
     62				rtsx_set_stat(chip, RTSX_STAT_RUN);
     63				ms_card->cleanup_counter++;
     64			} else {
     65				ms_card->cleanup_counter = 0;
     66			}
     67#endif
     68		}
     69	}
     70
     71	if (sd_card->cleanup_counter > POLLING_WAIT_CNT)
     72		sd_cleanup_work(chip);
     73
     74	if (xd_card->cleanup_counter > POLLING_WAIT_CNT)
     75		xd_cleanup_work(chip);
     76
     77	if (ms_card->cleanup_counter > POLLING_WAIT_CNT)
     78		ms_cleanup_work(chip);
     79}
     80
     81void try_to_switch_sdio_ctrl(struct rtsx_chip *chip)
     82{
     83	u8 reg1 = 0, reg2 = 0;
     84
     85	rtsx_read_register(chip, 0xFF34, &reg1);
     86	rtsx_read_register(chip, 0xFF38, &reg2);
     87	dev_dbg(rtsx_dev(chip), "reg 0xFF34: 0x%x, reg 0xFF38: 0x%x\n",
     88		reg1, reg2);
     89	if ((reg1 & 0xC0) && (reg2 & 0xC0)) {
     90		chip->sd_int = 1;
     91		rtsx_write_register(chip, SDIO_CTRL, 0xFF,
     92				    SDIO_BUS_CTRL | SDIO_CD_CTRL);
     93		rtsx_write_register(chip, PWR_GATE_CTRL,
     94				    LDO3318_PWR_MASK, LDO_ON);
     95	}
     96}
     97
     98#ifdef SUPPORT_SDIO_ASPM
     99void dynamic_configure_sdio_aspm(struct rtsx_chip *chip)
    100{
    101	u8 buf[12], reg;
    102	int i;
    103
    104	for (i = 0; i < 12; i++)
    105		rtsx_read_register(chip, 0xFF08 + i, &buf[i]);
    106	rtsx_read_register(chip, 0xFF25, &reg);
    107	if ((memcmp(buf, chip->sdio_raw_data, 12) != 0) || (reg & 0x03)) {
    108		chip->sdio_counter = 0;
    109		chip->sdio_idle = 0;
    110	} else {
    111		if (!chip->sdio_idle) {
    112			chip->sdio_counter++;
    113			if (chip->sdio_counter >= SDIO_IDLE_COUNT) {
    114				chip->sdio_counter = 0;
    115				chip->sdio_idle = 1;
    116			}
    117		}
    118	}
    119	memcpy(chip->sdio_raw_data, buf, 12);
    120
    121	if (chip->sdio_idle) {
    122		if (!chip->sdio_aspm) {
    123			dev_dbg(rtsx_dev(chip), "SDIO enter ASPM!\n");
    124			rtsx_write_register(chip, ASPM_FORCE_CTL, 0xFC,
    125					    0x30 | (chip->aspm_level[1] << 2));
    126			chip->sdio_aspm = 1;
    127		}
    128	} else {
    129		if (chip->sdio_aspm) {
    130			dev_dbg(rtsx_dev(chip), "SDIO exit ASPM!\n");
    131			rtsx_write_register(chip, ASPM_FORCE_CTL, 0xFC, 0x30);
    132			chip->sdio_aspm = 0;
    133		}
    134	}
    135}
    136#endif
    137
    138void do_reset_sd_card(struct rtsx_chip *chip)
    139{
    140	int retval;
    141
    142	dev_dbg(rtsx_dev(chip), "%s: %d, card2lun = 0x%x\n", __func__,
    143		chip->sd_reset_counter, chip->card2lun[SD_CARD]);
    144
    145	if (chip->card2lun[SD_CARD] >= MAX_ALLOWED_LUN_CNT) {
    146		clear_bit(SD_NR, &chip->need_reset);
    147		chip->sd_reset_counter = 0;
    148		chip->sd_show_cnt = 0;
    149		return;
    150	}
    151
    152	chip->rw_fail_cnt[chip->card2lun[SD_CARD]] = 0;
    153
    154	rtsx_set_stat(chip, RTSX_STAT_RUN);
    155	rtsx_write_register(chip, SDIO_CTRL, 0xFF, 0);
    156
    157	retval = reset_sd_card(chip);
    158	if (chip->need_release & SD_CARD)
    159		return;
    160	if (retval == STATUS_SUCCESS) {
    161		clear_bit(SD_NR, &chip->need_reset);
    162		chip->sd_reset_counter = 0;
    163		chip->sd_show_cnt = 0;
    164		chip->card_ready |= SD_CARD;
    165		chip->card_fail &= ~SD_CARD;
    166		chip->rw_card[chip->card2lun[SD_CARD]] = sd_rw;
    167	} else {
    168		if (chip->sd_io || chip->sd_reset_counter >= MAX_RESET_CNT) {
    169			clear_bit(SD_NR, &chip->need_reset);
    170			chip->sd_reset_counter = 0;
    171			chip->sd_show_cnt = 0;
    172		} else {
    173			chip->sd_reset_counter++;
    174		}
    175		chip->card_ready &= ~SD_CARD;
    176		chip->card_fail |= SD_CARD;
    177		chip->capacity[chip->card2lun[SD_CARD]] = 0;
    178		chip->rw_card[chip->card2lun[SD_CARD]] = NULL;
    179
    180		rtsx_write_register(chip, CARD_OE, SD_OUTPUT_EN, 0);
    181		if (!chip->ft2_fast_mode)
    182			card_power_off(chip, SD_CARD);
    183		if (chip->sd_io) {
    184			chip->sd_int = 0;
    185			try_to_switch_sdio_ctrl(chip);
    186		} else {
    187			disable_card_clock(chip, SD_CARD);
    188		}
    189	}
    190}
    191
    192void do_reset_xd_card(struct rtsx_chip *chip)
    193{
    194	int retval;
    195
    196	dev_dbg(rtsx_dev(chip), "%s: %d, card2lun = 0x%x\n", __func__,
    197		chip->xd_reset_counter, chip->card2lun[XD_CARD]);
    198
    199	if (chip->card2lun[XD_CARD] >= MAX_ALLOWED_LUN_CNT) {
    200		clear_bit(XD_NR, &chip->need_reset);
    201		chip->xd_reset_counter = 0;
    202		chip->xd_show_cnt = 0;
    203		return;
    204	}
    205
    206	chip->rw_fail_cnt[chip->card2lun[XD_CARD]] = 0;
    207
    208	rtsx_set_stat(chip, RTSX_STAT_RUN);
    209	rtsx_write_register(chip, SDIO_CTRL, 0xFF, 0);
    210
    211	retval = reset_xd_card(chip);
    212	if (chip->need_release & XD_CARD)
    213		return;
    214	if (retval == STATUS_SUCCESS) {
    215		clear_bit(XD_NR, &chip->need_reset);
    216		chip->xd_reset_counter = 0;
    217		chip->card_ready |= XD_CARD;
    218		chip->card_fail &= ~XD_CARD;
    219		chip->rw_card[chip->card2lun[XD_CARD]] = xd_rw;
    220	} else {
    221		if (chip->xd_reset_counter >= MAX_RESET_CNT) {
    222			clear_bit(XD_NR, &chip->need_reset);
    223			chip->xd_reset_counter = 0;
    224			chip->xd_show_cnt = 0;
    225		} else {
    226			chip->xd_reset_counter++;
    227		}
    228		chip->card_ready &= ~XD_CARD;
    229		chip->card_fail |= XD_CARD;
    230		chip->capacity[chip->card2lun[XD_CARD]] = 0;
    231		chip->rw_card[chip->card2lun[XD_CARD]] = NULL;
    232
    233		rtsx_write_register(chip, CARD_OE, XD_OUTPUT_EN, 0);
    234		if (!chip->ft2_fast_mode)
    235			card_power_off(chip, XD_CARD);
    236		disable_card_clock(chip, XD_CARD);
    237	}
    238}
    239
    240void do_reset_ms_card(struct rtsx_chip *chip)
    241{
    242	int retval;
    243
    244	dev_dbg(rtsx_dev(chip), "%s: %d, card2lun = 0x%x\n", __func__,
    245		chip->ms_reset_counter, chip->card2lun[MS_CARD]);
    246
    247	if (chip->card2lun[MS_CARD] >= MAX_ALLOWED_LUN_CNT) {
    248		clear_bit(MS_NR, &chip->need_reset);
    249		chip->ms_reset_counter = 0;
    250		chip->ms_show_cnt = 0;
    251		return;
    252	}
    253
    254	chip->rw_fail_cnt[chip->card2lun[MS_CARD]] = 0;
    255
    256	rtsx_set_stat(chip, RTSX_STAT_RUN);
    257	rtsx_write_register(chip, SDIO_CTRL, 0xFF, 0);
    258
    259	retval = reset_ms_card(chip);
    260	if (chip->need_release & MS_CARD)
    261		return;
    262	if (retval == STATUS_SUCCESS) {
    263		clear_bit(MS_NR, &chip->need_reset);
    264		chip->ms_reset_counter = 0;
    265		chip->card_ready |= MS_CARD;
    266		chip->card_fail &= ~MS_CARD;
    267		chip->rw_card[chip->card2lun[MS_CARD]] = ms_rw;
    268	} else {
    269		if (chip->ms_reset_counter >= MAX_RESET_CNT) {
    270			clear_bit(MS_NR, &chip->need_reset);
    271			chip->ms_reset_counter = 0;
    272			chip->ms_show_cnt = 0;
    273		} else {
    274			chip->ms_reset_counter++;
    275		}
    276		chip->card_ready &= ~MS_CARD;
    277		chip->card_fail |= MS_CARD;
    278		chip->capacity[chip->card2lun[MS_CARD]] = 0;
    279		chip->rw_card[chip->card2lun[MS_CARD]] = NULL;
    280
    281		rtsx_write_register(chip, CARD_OE, MS_OUTPUT_EN, 0);
    282		if (!chip->ft2_fast_mode)
    283			card_power_off(chip, MS_CARD);
    284		disable_card_clock(chip, MS_CARD);
    285	}
    286}
    287
    288static void release_sdio(struct rtsx_chip *chip)
    289{
    290	if (chip->sd_io) {
    291		rtsx_write_register(chip, CARD_STOP, SD_STOP | SD_CLR_ERR,
    292				    SD_STOP | SD_CLR_ERR);
    293
    294		if (chip->chip_insert_with_sdio) {
    295			chip->chip_insert_with_sdio = 0;
    296
    297			if (CHECK_PID(chip, 0x5288))
    298				rtsx_write_register(chip, 0xFE5A, 0x08, 0x00);
    299			else
    300				rtsx_write_register(chip, 0xFE70, 0x80, 0x00);
    301		}
    302
    303		rtsx_write_register(chip, SDIO_CTRL, SDIO_CD_CTRL, 0);
    304		chip->sd_io = 0;
    305	}
    306}
    307
    308void rtsx_power_off_card(struct rtsx_chip *chip)
    309{
    310	if ((chip->card_ready & SD_CARD) || chip->sd_io) {
    311		sd_cleanup_work(chip);
    312		sd_power_off_card3v3(chip);
    313	}
    314
    315	if (chip->card_ready & XD_CARD) {
    316		xd_cleanup_work(chip);
    317		xd_power_off_card3v3(chip);
    318	}
    319
    320	if (chip->card_ready & MS_CARD) {
    321		ms_cleanup_work(chip);
    322		ms_power_off_card3v3(chip);
    323	}
    324}
    325
    326void rtsx_release_cards(struct rtsx_chip *chip)
    327{
    328	chip->int_reg = rtsx_readl(chip, RTSX_BIPR);
    329
    330	if ((chip->card_ready & SD_CARD) || chip->sd_io) {
    331		if (chip->int_reg & SD_EXIST)
    332			sd_cleanup_work(chip);
    333		release_sd_card(chip);
    334	}
    335
    336	if (chip->card_ready & XD_CARD) {
    337		if (chip->int_reg & XD_EXIST)
    338			xd_cleanup_work(chip);
    339		release_xd_card(chip);
    340	}
    341
    342	if (chip->card_ready & MS_CARD) {
    343		if (chip->int_reg & MS_EXIST)
    344			ms_cleanup_work(chip);
    345		release_ms_card(chip);
    346	}
    347}
    348
    349void rtsx_reset_cards(struct rtsx_chip *chip)
    350{
    351	if (!chip->need_reset)
    352		return;
    353
    354	rtsx_set_stat(chip, RTSX_STAT_RUN);
    355
    356	rtsx_force_power_on(chip, SSC_PDCTL | OC_PDCTL);
    357
    358	rtsx_disable_aspm(chip);
    359
    360	if ((chip->need_reset & SD_CARD) && chip->chip_insert_with_sdio)
    361		clear_bit(SD_NR, &chip->need_reset);
    362
    363	if (chip->need_reset & XD_CARD) {
    364		chip->card_exist |= XD_CARD;
    365
    366		if (chip->xd_show_cnt >= MAX_SHOW_CNT)
    367			do_reset_xd_card(chip);
    368		else
    369			chip->xd_show_cnt++;
    370	}
    371	if (CHECK_PID(chip, 0x5288) && CHECK_BARO_PKG(chip, QFN)) {
    372		if (chip->card_exist & XD_CARD) {
    373			clear_bit(SD_NR, &chip->need_reset);
    374			clear_bit(MS_NR, &chip->need_reset);
    375		}
    376	}
    377	if (chip->need_reset & SD_CARD) {
    378		chip->card_exist |= SD_CARD;
    379
    380		if (chip->sd_show_cnt >= MAX_SHOW_CNT) {
    381			rtsx_write_register(chip, RBCTL, RB_FLUSH, RB_FLUSH);
    382			do_reset_sd_card(chip);
    383		} else {
    384			chip->sd_show_cnt++;
    385		}
    386	}
    387	if (chip->need_reset & MS_CARD) {
    388		chip->card_exist |= MS_CARD;
    389
    390		if (chip->ms_show_cnt >= MAX_SHOW_CNT)
    391			do_reset_ms_card(chip);
    392		else
    393			chip->ms_show_cnt++;
    394	}
    395}
    396
    397void rtsx_reinit_cards(struct rtsx_chip *chip, int reset_chip)
    398{
    399	rtsx_set_stat(chip, RTSX_STAT_RUN);
    400
    401	rtsx_force_power_on(chip, SSC_PDCTL | OC_PDCTL);
    402
    403	if (reset_chip)
    404		rtsx_reset_chip(chip);
    405
    406	chip->int_reg = rtsx_readl(chip, RTSX_BIPR);
    407
    408	if ((chip->int_reg & SD_EXIST) && (chip->need_reinit & SD_CARD)) {
    409		release_sdio(chip);
    410		release_sd_card(chip);
    411
    412		wait_timeout(100);
    413
    414		chip->card_exist |= SD_CARD;
    415		do_reset_sd_card(chip);
    416	}
    417
    418	if ((chip->int_reg & XD_EXIST) && (chip->need_reinit & XD_CARD)) {
    419		release_xd_card(chip);
    420
    421		wait_timeout(100);
    422
    423		chip->card_exist |= XD_CARD;
    424		do_reset_xd_card(chip);
    425	}
    426
    427	if ((chip->int_reg & MS_EXIST) && (chip->need_reinit & MS_CARD)) {
    428		release_ms_card(chip);
    429
    430		wait_timeout(100);
    431
    432		chip->card_exist |= MS_CARD;
    433		do_reset_ms_card(chip);
    434	}
    435
    436	chip->need_reinit = 0;
    437}
    438
    439#ifdef DISABLE_CARD_INT
    440void card_cd_debounce(struct rtsx_chip *chip, unsigned long *need_reset,
    441		      unsigned long *need_release)
    442{
    443	u8 release_map = 0, reset_map = 0;
    444
    445	chip->int_reg = rtsx_readl(chip, RTSX_BIPR);
    446
    447	if (chip->card_exist) {
    448		if (chip->card_exist & XD_CARD) {
    449			if (!(chip->int_reg & XD_EXIST))
    450				release_map |= XD_CARD;
    451		} else if (chip->card_exist & SD_CARD) {
    452			if (!(chip->int_reg & SD_EXIST))
    453				release_map |= SD_CARD;
    454		} else if (chip->card_exist & MS_CARD) {
    455			if (!(chip->int_reg & MS_EXIST))
    456				release_map |= MS_CARD;
    457		}
    458	} else {
    459		if (chip->int_reg & XD_EXIST)
    460			reset_map |= XD_CARD;
    461		else if (chip->int_reg & SD_EXIST)
    462			reset_map |= SD_CARD;
    463		else if (chip->int_reg & MS_EXIST)
    464			reset_map |= MS_CARD;
    465	}
    466
    467	if (reset_map) {
    468		int xd_cnt = 0, sd_cnt = 0, ms_cnt = 0;
    469		int i;
    470
    471		for (i = 0; i < (DEBOUNCE_CNT); i++) {
    472			chip->int_reg = rtsx_readl(chip, RTSX_BIPR);
    473
    474			if (chip->int_reg & XD_EXIST)
    475				xd_cnt++;
    476			else
    477				xd_cnt = 0;
    478
    479			if (chip->int_reg & SD_EXIST)
    480				sd_cnt++;
    481			else
    482				sd_cnt = 0;
    483
    484			if (chip->int_reg & MS_EXIST)
    485				ms_cnt++;
    486			else
    487				ms_cnt = 0;
    488
    489			wait_timeout(30);
    490		}
    491
    492		reset_map = 0;
    493		if (!(chip->card_exist & XD_CARD) &&
    494		    (xd_cnt > (DEBOUNCE_CNT - 1)))
    495			reset_map |= XD_CARD;
    496		if (!(chip->card_exist & SD_CARD) &&
    497		    (sd_cnt > (DEBOUNCE_CNT - 1)))
    498			reset_map |= SD_CARD;
    499		if (!(chip->card_exist & MS_CARD) &&
    500		    (ms_cnt > (DEBOUNCE_CNT - 1)))
    501			reset_map |= MS_CARD;
    502	}
    503
    504	if (CHECK_PID(chip, 0x5288) && CHECK_BARO_PKG(chip, QFN))
    505		rtsx_write_register(chip, HOST_SLEEP_STATE, 0xC0, 0x00);
    506
    507	if (need_reset)
    508		*need_reset = reset_map;
    509	if (need_release)
    510		*need_release = release_map;
    511}
    512#endif
    513
    514void rtsx_init_cards(struct rtsx_chip *chip)
    515{
    516	if (RTSX_TST_DELINK(chip) && (rtsx_get_stat(chip) != RTSX_STAT_SS)) {
    517		dev_dbg(rtsx_dev(chip), "Reset chip in polling thread!\n");
    518		rtsx_reset_chip(chip);
    519		RTSX_CLR_DELINK(chip);
    520	}
    521
    522#ifdef DISABLE_CARD_INT
    523	card_cd_debounce(chip, &chip->need_reset, &chip->need_release);
    524#endif
    525
    526	if (chip->need_release) {
    527		if (CHECK_PID(chip, 0x5288) && CHECK_BARO_PKG(chip, QFN)) {
    528			if (chip->int_reg & XD_EXIST) {
    529				clear_bit(SD_NR, &chip->need_release);
    530				clear_bit(MS_NR, &chip->need_release);
    531			}
    532		}
    533
    534		if (!(chip->card_exist & SD_CARD) && !chip->sd_io)
    535			clear_bit(SD_NR, &chip->need_release);
    536		if (!(chip->card_exist & XD_CARD))
    537			clear_bit(XD_NR, &chip->need_release);
    538		if (!(chip->card_exist & MS_CARD))
    539			clear_bit(MS_NR, &chip->need_release);
    540
    541		dev_dbg(rtsx_dev(chip), "chip->need_release = 0x%x\n",
    542			(unsigned int)(chip->need_release));
    543
    544#ifdef SUPPORT_OCP
    545		if (chip->need_release) {
    546			if (chip->ocp_stat & (CARD_OC_NOW | CARD_OC_EVER))
    547				rtsx_write_register(chip, OCPCLR,
    548						    CARD_OC_INT_CLR |
    549						    CARD_OC_CLR,
    550						    CARD_OC_INT_CLR |
    551						    CARD_OC_CLR);
    552			chip->ocp_stat = 0;
    553		}
    554#endif
    555		if (chip->need_release) {
    556			rtsx_set_stat(chip, RTSX_STAT_RUN);
    557			rtsx_force_power_on(chip, SSC_PDCTL | OC_PDCTL);
    558		}
    559
    560		if (chip->need_release & SD_CARD) {
    561			clear_bit(SD_NR, &chip->need_release);
    562			chip->card_exist &= ~SD_CARD;
    563			chip->card_ejected &= ~SD_CARD;
    564			chip->card_fail &= ~SD_CARD;
    565			CLR_BIT(chip->lun_mc, chip->card2lun[SD_CARD]);
    566			chip->rw_fail_cnt[chip->card2lun[SD_CARD]] = 0;
    567			rtsx_write_register(chip, RBCTL, RB_FLUSH, RB_FLUSH);
    568
    569			release_sdio(chip);
    570			release_sd_card(chip);
    571		}
    572
    573		if (chip->need_release & XD_CARD) {
    574			clear_bit(XD_NR, &chip->need_release);
    575			chip->card_exist &= ~XD_CARD;
    576			chip->card_ejected &= ~XD_CARD;
    577			chip->card_fail &= ~XD_CARD;
    578			CLR_BIT(chip->lun_mc, chip->card2lun[XD_CARD]);
    579			chip->rw_fail_cnt[chip->card2lun[XD_CARD]] = 0;
    580
    581			release_xd_card(chip);
    582
    583			if (CHECK_PID(chip, 0x5288) &&
    584			    CHECK_BARO_PKG(chip, QFN))
    585				rtsx_write_register(chip, HOST_SLEEP_STATE,
    586						    0xC0, 0xC0);
    587		}
    588
    589		if (chip->need_release & MS_CARD) {
    590			clear_bit(MS_NR, &chip->need_release);
    591			chip->card_exist &= ~MS_CARD;
    592			chip->card_ejected &= ~MS_CARD;
    593			chip->card_fail &= ~MS_CARD;
    594			CLR_BIT(chip->lun_mc, chip->card2lun[MS_CARD]);
    595			chip->rw_fail_cnt[chip->card2lun[MS_CARD]] = 0;
    596
    597			release_ms_card(chip);
    598		}
    599
    600		dev_dbg(rtsx_dev(chip), "chip->card_exist = 0x%x\n",
    601			chip->card_exist);
    602
    603		if (!chip->card_exist)
    604			turn_off_led(chip, LED_GPIO);
    605	}
    606
    607	if (chip->need_reset) {
    608		dev_dbg(rtsx_dev(chip), "chip->need_reset = 0x%x\n",
    609			(unsigned int)(chip->need_reset));
    610
    611		rtsx_reset_cards(chip);
    612	}
    613
    614	if (chip->need_reinit) {
    615		dev_dbg(rtsx_dev(chip), "chip->need_reinit = 0x%x\n",
    616			(unsigned int)(chip->need_reinit));
    617
    618		rtsx_reinit_cards(chip, 0);
    619	}
    620}
    621
    622int switch_ssc_clock(struct rtsx_chip *chip, int clk)
    623{
    624	int retval;
    625	u8 n = (u8)(clk - 2), min_n, max_n;
    626	u8 mcu_cnt, div, max_div, ssc_depth, ssc_depth_mask;
    627	int sd_vpclk_phase_reset = 0;
    628
    629	if (chip->cur_clk == clk)
    630		return STATUS_SUCCESS;
    631
    632	min_n = 60;
    633	max_n = 120;
    634	max_div = CLK_DIV_4;
    635
    636	dev_dbg(rtsx_dev(chip), "Switch SSC clock to %dMHz (cur_clk = %d)\n",
    637		clk, chip->cur_clk);
    638
    639	if (clk <= 2 || n > max_n)
    640		return STATUS_FAIL;
    641
    642	mcu_cnt = (u8)(125 / clk + 3);
    643	if (mcu_cnt > 7)
    644		mcu_cnt = 7;
    645
    646	div = CLK_DIV_1;
    647	while ((n < min_n) && (div < max_div)) {
    648		n = (n + 2) * 2 - 2;
    649		div++;
    650	}
    651	dev_dbg(rtsx_dev(chip), "n = %d, div = %d\n", n, div);
    652
    653	if (chip->ssc_en) {
    654		ssc_depth = 0x01;
    655		n -= 2;
    656	} else {
    657		ssc_depth = 0;
    658	}
    659
    660	ssc_depth_mask = 0x03;
    661
    662	dev_dbg(rtsx_dev(chip), "ssc_depth = %d\n", ssc_depth);
    663
    664	rtsx_init_cmd(chip);
    665	rtsx_add_cmd(chip, WRITE_REG_CMD, CLK_CTL, CLK_LOW_FREQ, CLK_LOW_FREQ);
    666	rtsx_add_cmd(chip, WRITE_REG_CMD, CLK_DIV, 0xFF, (div << 4) | mcu_cnt);
    667	rtsx_add_cmd(chip, WRITE_REG_CMD, SSC_CTL1, SSC_RSTB, 0);
    668	rtsx_add_cmd(chip, WRITE_REG_CMD, SSC_CTL2, ssc_depth_mask, ssc_depth);
    669	rtsx_add_cmd(chip, WRITE_REG_CMD, SSC_DIV_N_0, 0xFF, n);
    670	rtsx_add_cmd(chip, WRITE_REG_CMD, SSC_CTL1, SSC_RSTB, SSC_RSTB);
    671	if (sd_vpclk_phase_reset) {
    672		rtsx_add_cmd(chip, WRITE_REG_CMD, SD_VPCLK0_CTL,
    673			     PHASE_NOT_RESET, 0);
    674		rtsx_add_cmd(chip, WRITE_REG_CMD, SD_VPCLK0_CTL,
    675			     PHASE_NOT_RESET, PHASE_NOT_RESET);
    676	}
    677
    678	retval = rtsx_send_cmd(chip, 0, WAIT_TIME);
    679	if (retval < 0)
    680		return STATUS_ERROR;
    681
    682	udelay(10);
    683	retval = rtsx_write_register(chip, CLK_CTL, CLK_LOW_FREQ, 0);
    684	if (retval)
    685		return retval;
    686
    687	chip->cur_clk = clk;
    688
    689	return STATUS_SUCCESS;
    690}
    691
    692int switch_normal_clock(struct rtsx_chip *chip, int clk)
    693{
    694	int retval;
    695	u8 sel, div, mcu_cnt;
    696	int sd_vpclk_phase_reset = 0;
    697
    698	if (chip->cur_clk == clk)
    699		return STATUS_SUCCESS;
    700
    701	switch (clk) {
    702	case CLK_20:
    703		dev_dbg(rtsx_dev(chip), "Switch clock to 20MHz\n");
    704		sel = SSC_80;
    705		div = CLK_DIV_4;
    706		mcu_cnt = 7;
    707		break;
    708
    709	case CLK_30:
    710		dev_dbg(rtsx_dev(chip), "Switch clock to 30MHz\n");
    711		sel = SSC_120;
    712		div = CLK_DIV_4;
    713		mcu_cnt = 7;
    714		break;
    715
    716	case CLK_40:
    717		dev_dbg(rtsx_dev(chip), "Switch clock to 40MHz\n");
    718		sel = SSC_80;
    719		div = CLK_DIV_2;
    720		mcu_cnt = 7;
    721		break;
    722
    723	case CLK_50:
    724		dev_dbg(rtsx_dev(chip), "Switch clock to 50MHz\n");
    725		sel = SSC_100;
    726		div = CLK_DIV_2;
    727		mcu_cnt = 6;
    728		break;
    729
    730	case CLK_60:
    731		dev_dbg(rtsx_dev(chip), "Switch clock to 60MHz\n");
    732		sel = SSC_120;
    733		div = CLK_DIV_2;
    734		mcu_cnt = 6;
    735		break;
    736
    737	case CLK_80:
    738		dev_dbg(rtsx_dev(chip), "Switch clock to 80MHz\n");
    739		sel = SSC_80;
    740		div = CLK_DIV_1;
    741		mcu_cnt = 5;
    742		break;
    743
    744	case CLK_100:
    745		dev_dbg(rtsx_dev(chip), "Switch clock to 100MHz\n");
    746		sel = SSC_100;
    747		div = CLK_DIV_1;
    748		mcu_cnt = 5;
    749		break;
    750
    751	case CLK_120:
    752		dev_dbg(rtsx_dev(chip), "Switch clock to 120MHz\n");
    753		sel = SSC_120;
    754		div = CLK_DIV_1;
    755		mcu_cnt = 5;
    756		break;
    757
    758	case CLK_150:
    759		dev_dbg(rtsx_dev(chip), "Switch clock to 150MHz\n");
    760		sel = SSC_150;
    761		div = CLK_DIV_1;
    762		mcu_cnt = 4;
    763		break;
    764
    765	case CLK_200:
    766		dev_dbg(rtsx_dev(chip), "Switch clock to 200MHz\n");
    767		sel = SSC_200;
    768		div = CLK_DIV_1;
    769		mcu_cnt = 4;
    770		break;
    771
    772	default:
    773		dev_dbg(rtsx_dev(chip), "Try to switch to an illegal clock (%d)\n",
    774			clk);
    775		return STATUS_FAIL;
    776	}
    777
    778	retval = rtsx_write_register(chip, CLK_CTL, 0xFF, CLK_LOW_FREQ);
    779	if (retval)
    780		return retval;
    781	if (sd_vpclk_phase_reset) {
    782		retval = rtsx_write_register(chip, SD_VPCLK0_CTL,
    783					     PHASE_NOT_RESET, 0);
    784		if (retval)
    785			return retval;
    786		retval = rtsx_write_register(chip, SD_VPCLK1_CTL,
    787					     PHASE_NOT_RESET, 0);
    788		if (retval)
    789			return retval;
    790	}
    791	retval = rtsx_write_register(chip, CLK_DIV, 0xFF,
    792				     (div << 4) | mcu_cnt);
    793	if (retval)
    794		return retval;
    795	retval = rtsx_write_register(chip, CLK_SEL, 0xFF, sel);
    796	if (retval)
    797		return retval;
    798
    799	if (sd_vpclk_phase_reset) {
    800		udelay(200);
    801		retval = rtsx_write_register(chip, SD_VPCLK0_CTL,
    802					     PHASE_NOT_RESET, PHASE_NOT_RESET);
    803		if (retval)
    804			return retval;
    805		retval = rtsx_write_register(chip, SD_VPCLK1_CTL,
    806					     PHASE_NOT_RESET, PHASE_NOT_RESET);
    807		if (retval)
    808			return retval;
    809		udelay(200);
    810	}
    811	retval = rtsx_write_register(chip, CLK_CTL, 0xFF, 0);
    812	if (retval)
    813		return retval;
    814
    815	chip->cur_clk = clk;
    816
    817	return STATUS_SUCCESS;
    818}
    819
    820void trans_dma_enable(enum dma_data_direction dir, struct rtsx_chip *chip,
    821		      u32 byte_cnt, u8 pack_size)
    822{
    823	if (pack_size > DMA_1024)
    824		pack_size = DMA_512;
    825
    826	rtsx_add_cmd(chip, WRITE_REG_CMD, IRQSTAT0, DMA_DONE_INT, DMA_DONE_INT);
    827
    828	rtsx_add_cmd(chip, WRITE_REG_CMD, DMATC3, 0xFF, (u8)(byte_cnt >> 24));
    829	rtsx_add_cmd(chip, WRITE_REG_CMD, DMATC2, 0xFF, (u8)(byte_cnt >> 16));
    830	rtsx_add_cmd(chip, WRITE_REG_CMD, DMATC1, 0xFF, (u8)(byte_cnt >> 8));
    831	rtsx_add_cmd(chip, WRITE_REG_CMD, DMATC0, 0xFF, (u8)byte_cnt);
    832
    833	if (dir == DMA_FROM_DEVICE) {
    834		rtsx_add_cmd(chip, WRITE_REG_CMD, DMACTL,
    835			     0x03 | DMA_PACK_SIZE_MASK,
    836			     DMA_DIR_FROM_CARD | DMA_EN | pack_size);
    837	} else {
    838		rtsx_add_cmd(chip, WRITE_REG_CMD, DMACTL,
    839			     0x03 | DMA_PACK_SIZE_MASK,
    840			     DMA_DIR_TO_CARD | DMA_EN | pack_size);
    841	}
    842
    843	rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01, RING_BUFFER);
    844}
    845
    846int enable_card_clock(struct rtsx_chip *chip, u8 card)
    847{
    848	int retval;
    849	u8 clk_en = 0;
    850
    851	if (card & XD_CARD)
    852		clk_en |= XD_CLK_EN;
    853	if (card & SD_CARD)
    854		clk_en |= SD_CLK_EN;
    855	if (card & MS_CARD)
    856		clk_en |= MS_CLK_EN;
    857
    858	retval = rtsx_write_register(chip, CARD_CLK_EN, clk_en, clk_en);
    859	if (retval)
    860		return retval;
    861
    862	return STATUS_SUCCESS;
    863}
    864
    865int disable_card_clock(struct rtsx_chip *chip, u8 card)
    866{
    867	int retval;
    868	u8 clk_en = 0;
    869
    870	if (card & XD_CARD)
    871		clk_en |= XD_CLK_EN;
    872	if (card & SD_CARD)
    873		clk_en |= SD_CLK_EN;
    874	if (card & MS_CARD)
    875		clk_en |= MS_CLK_EN;
    876
    877	retval = rtsx_write_register(chip, CARD_CLK_EN, clk_en, 0);
    878	if (retval)
    879		return retval;
    880
    881	return STATUS_SUCCESS;
    882}
    883
    884int card_power_on(struct rtsx_chip *chip, u8 card)
    885{
    886	int retval;
    887	u8 mask, val1, val2;
    888
    889	if (CHECK_LUN_MODE(chip, SD_MS_2LUN) && card == MS_CARD) {
    890		mask = MS_POWER_MASK;
    891		val1 = MS_PARTIAL_POWER_ON;
    892		val2 = MS_POWER_ON;
    893	} else {
    894		mask = SD_POWER_MASK;
    895		val1 = SD_PARTIAL_POWER_ON;
    896		val2 = SD_POWER_ON;
    897	}
    898
    899	rtsx_init_cmd(chip);
    900	rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PWR_CTL, mask, val1);
    901
    902	retval = rtsx_send_cmd(chip, 0, 100);
    903	if (retval != STATUS_SUCCESS)
    904		return STATUS_FAIL;
    905
    906	udelay(chip->pmos_pwr_on_interval);
    907
    908	rtsx_init_cmd(chip);
    909	rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_PWR_CTL, mask, val2);
    910
    911	retval = rtsx_send_cmd(chip, 0, 100);
    912	if (retval != STATUS_SUCCESS)
    913		return STATUS_FAIL;
    914
    915	return STATUS_SUCCESS;
    916}
    917
    918int card_power_off(struct rtsx_chip *chip, u8 card)
    919{
    920	int retval;
    921	u8 mask, val;
    922
    923	if (CHECK_LUN_MODE(chip, SD_MS_2LUN) && card == MS_CARD) {
    924		mask = MS_POWER_MASK;
    925		val = MS_POWER_OFF;
    926	} else {
    927		mask = SD_POWER_MASK;
    928		val = SD_POWER_OFF;
    929	}
    930
    931	retval = rtsx_write_register(chip, CARD_PWR_CTL, mask, val);
    932	if (retval)
    933		return retval;
    934
    935	return STATUS_SUCCESS;
    936}
    937
    938int card_rw(struct scsi_cmnd *srb, struct rtsx_chip *chip,
    939	    u32 sec_addr, u16 sec_cnt)
    940{
    941	int retval;
    942	unsigned int lun = SCSI_LUN(srb);
    943	int i;
    944
    945	if (!chip->rw_card[lun])
    946		return STATUS_FAIL;
    947
    948	for (i = 0; i < 3; i++) {
    949		chip->rw_need_retry = 0;
    950
    951		retval = chip->rw_card[lun](srb, chip, sec_addr, sec_cnt);
    952		if (retval != STATUS_SUCCESS) {
    953			if (rtsx_check_chip_exist(chip) != STATUS_SUCCESS) {
    954				rtsx_release_chip(chip);
    955				return STATUS_FAIL;
    956			}
    957			if (detect_card_cd(chip, chip->cur_card) !=
    958							STATUS_SUCCESS) {
    959				return STATUS_FAIL;
    960			}
    961
    962			if (!chip->rw_need_retry) {
    963				dev_dbg(rtsx_dev(chip), "RW fail, but no need to retry\n");
    964				break;
    965			}
    966		} else {
    967			chip->rw_need_retry = 0;
    968			break;
    969		}
    970
    971		dev_dbg(rtsx_dev(chip), "Retry RW, (i = %d)\n", i);
    972	}
    973
    974	return retval;
    975}
    976
    977int card_share_mode(struct rtsx_chip *chip, int card)
    978{
    979	int retval;
    980	u8 mask, value;
    981
    982	if (CHECK_PID(chip, 0x5208)) {
    983		mask = CARD_SHARE_MASK;
    984		if (card == SD_CARD)
    985			value = CARD_SHARE_48_SD;
    986		else if (card == MS_CARD)
    987			value = CARD_SHARE_48_MS;
    988		else if (card == XD_CARD)
    989			value = CARD_SHARE_48_XD;
    990		else
    991			return STATUS_FAIL;
    992
    993	} else if (CHECK_PID(chip, 0x5288)) {
    994		mask = 0x03;
    995		if (card == SD_CARD)
    996			value = CARD_SHARE_BAROSSA_SD;
    997		else if (card == MS_CARD)
    998			value = CARD_SHARE_BAROSSA_MS;
    999		else if (card == XD_CARD)
   1000			value = CARD_SHARE_BAROSSA_XD;
   1001		else
   1002			return STATUS_FAIL;
   1003
   1004	} else {
   1005		return STATUS_FAIL;
   1006	}
   1007
   1008	retval = rtsx_write_register(chip, CARD_SHARE_MODE, mask, value);
   1009	if (retval)
   1010		return retval;
   1011
   1012	return STATUS_SUCCESS;
   1013}
   1014
   1015int select_card(struct rtsx_chip *chip, int card)
   1016{
   1017	int retval;
   1018
   1019	if (chip->cur_card != card) {
   1020		u8 mod;
   1021
   1022		if (card == SD_CARD)
   1023			mod = SD_MOD_SEL;
   1024		else if (card == MS_CARD)
   1025			mod = MS_MOD_SEL;
   1026		else if (card == XD_CARD)
   1027			mod = XD_MOD_SEL;
   1028		else if (card == SPI_CARD)
   1029			mod = SPI_MOD_SEL;
   1030		else
   1031			return STATUS_FAIL;
   1032
   1033		retval = rtsx_write_register(chip, CARD_SELECT, 0x07, mod);
   1034		if (retval)
   1035			return retval;
   1036		chip->cur_card = card;
   1037
   1038		retval =  card_share_mode(chip, card);
   1039		if (retval != STATUS_SUCCESS)
   1040			return STATUS_FAIL;
   1041	}
   1042
   1043	return STATUS_SUCCESS;
   1044}
   1045
   1046void toggle_gpio(struct rtsx_chip *chip, u8 gpio)
   1047{
   1048	u8 temp_reg;
   1049
   1050	rtsx_read_register(chip, CARD_GPIO, &temp_reg);
   1051	temp_reg ^= (0x01 << gpio);
   1052	rtsx_write_register(chip, CARD_GPIO, 0xFF, temp_reg);
   1053}
   1054
   1055void turn_on_led(struct rtsx_chip *chip, u8 gpio)
   1056{
   1057	if (CHECK_PID(chip, 0x5288))
   1058		rtsx_write_register(chip, CARD_GPIO, (u8)(1 << gpio),
   1059				    (u8)(1 << gpio));
   1060	else
   1061		rtsx_write_register(chip, CARD_GPIO, (u8)(1 << gpio), 0);
   1062}
   1063
   1064void turn_off_led(struct rtsx_chip *chip, u8 gpio)
   1065{
   1066	if (CHECK_PID(chip, 0x5288))
   1067		rtsx_write_register(chip, CARD_GPIO, (u8)(1 << gpio), 0);
   1068	else
   1069		rtsx_write_register(chip, CARD_GPIO, (u8)(1 << gpio),
   1070				    (u8)(1 << gpio));
   1071}
   1072
   1073int detect_card_cd(struct rtsx_chip *chip, int card)
   1074{
   1075	u32 card_cd, status;
   1076
   1077	if (card == SD_CARD) {
   1078		card_cd = SD_EXIST;
   1079	} else if (card == MS_CARD) {
   1080		card_cd = MS_EXIST;
   1081	} else if (card == XD_CARD) {
   1082		card_cd = XD_EXIST;
   1083	} else {
   1084		dev_dbg(rtsx_dev(chip), "Wrong card type: 0x%x\n", card);
   1085		return STATUS_FAIL;
   1086	}
   1087
   1088	status = rtsx_readl(chip, RTSX_BIPR);
   1089	if (!(status & card_cd))
   1090		return STATUS_FAIL;
   1091
   1092	return STATUS_SUCCESS;
   1093}
   1094
   1095int check_card_exist(struct rtsx_chip *chip, unsigned int lun)
   1096{
   1097	if (chip->card_exist & chip->lun2card[lun])
   1098		return 1;
   1099
   1100	return 0;
   1101}
   1102
   1103int check_card_ready(struct rtsx_chip *chip, unsigned int lun)
   1104{
   1105	if (chip->card_ready & chip->lun2card[lun])
   1106		return 1;
   1107
   1108	return 0;
   1109}
   1110
   1111int check_card_wp(struct rtsx_chip *chip, unsigned int lun)
   1112{
   1113	if (chip->card_wp & chip->lun2card[lun])
   1114		return 1;
   1115
   1116	return 0;
   1117}
   1118
   1119u8 get_lun_card(struct rtsx_chip *chip, unsigned int lun)
   1120{
   1121	if ((chip->card_ready & chip->lun2card[lun]) == XD_CARD)
   1122		return (u8)XD_CARD;
   1123	else if ((chip->card_ready & chip->lun2card[lun]) == SD_CARD)
   1124		return (u8)SD_CARD;
   1125	else if ((chip->card_ready & chip->lun2card[lun]) == MS_CARD)
   1126		return (u8)MS_CARD;
   1127
   1128	return 0;
   1129}
   1130
   1131void eject_card(struct rtsx_chip *chip, unsigned int lun)
   1132{
   1133	do_remaining_work(chip);
   1134
   1135	if ((chip->card_ready & chip->lun2card[lun]) == SD_CARD) {
   1136		release_sd_card(chip);
   1137		chip->card_ejected |= SD_CARD;
   1138		chip->card_ready &= ~SD_CARD;
   1139		chip->capacity[lun] = 0;
   1140	} else if ((chip->card_ready & chip->lun2card[lun]) == XD_CARD) {
   1141		release_xd_card(chip);
   1142		chip->card_ejected |= XD_CARD;
   1143		chip->card_ready &= ~XD_CARD;
   1144		chip->capacity[lun] = 0;
   1145	} else if ((chip->card_ready & chip->lun2card[lun]) == MS_CARD) {
   1146		release_ms_card(chip);
   1147		chip->card_ejected |= MS_CARD;
   1148		chip->card_ready &= ~MS_CARD;
   1149		chip->capacity[lun] = 0;
   1150	}
   1151}