static int sd_read_data(struct rtsx_usb_sdmmc *host, struct mmc_command *cmd, u16 byte_cnt, u8 *buf, int buf_len, int timeout) { struct rtsx_ucr *ucr = host->ucr; int err; u8 trans_mode; if (!buf) buf_len = 0; rtsx_usb_init_cmd(ucr); if (cmd != NULL) { dev_dbg(sdmmc_dev(host), "%s: SD/MMC CMD%d\n", __func__ , cmd->opcode); if (cmd->opcode == MMC_SEND_TUNING_BLOCK) trans_mode = SD_TM_AUTO_TUNING; else trans_mode = SD_TM_NORMAL_READ; rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SD_CMD0, 0xFF, (u8)(cmd->opcode) | 0x40); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SD_CMD1, 0xFF, (u8)(cmd->arg >> 24)); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SD_CMD2, 0xFF, (u8)(cmd->arg >> 16)); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SD_CMD3, 0xFF, (u8)(cmd->arg >> 8)); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, SD_CMD4, 0xFF, (u8)cmd->arg); } else {
static int ms_power_on(struct rtsx_usb_ms *host) { struct rtsx_ucr *ucr = host->ucr; int err; dev_dbg(ms_dev(host), "%s\n", __func__); rtsx_usb_init_cmd(ucr); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_SELECT, 0x07, MS_MOD_SEL); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_SHARE_MODE, CARD_SHARE_MASK, CARD_SHARE_MS); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_CLK_EN, MS_CLK_EN, MS_CLK_EN); err = rtsx_usb_send_cmd(ucr, MODE_C, 100); if (err < 0) return err; if (CHECK_PKG(ucr, LQFP48)) err = ms_pull_ctl_enable_lqfp48(ucr); else err = ms_pull_ctl_enable_qfn24(ucr); if (err < 0) return err; err = rtsx_usb_write_register(ucr, CARD_PWR_CTL, POWER_MASK, PARTIAL_POWER_ON); if (err) return err; usleep_range(800, 1000); rtsx_usb_init_cmd(ucr); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PWR_CTL, POWER_MASK, POWER_ON); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_OE, MS_OUTPUT_EN, MS_OUTPUT_EN); return rtsx_usb_send_cmd(ucr, MODE_C, 100); }
static int ms_pull_ctl_enable_qfn24(struct rtsx_ucr *ucr) { rtsx_usb_init_cmd(ucr); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0x65); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0x95); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x55); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF, 0x55); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, 0x59); return rtsx_usb_send_cmd(ucr, MODE_C, 100); }
static void ms_print_debug_regs(struct rtsx_usb_ms *host) { struct rtsx_ucr *ucr = host->ucr; u16 i; u8 *ptr; /* Print MS host internal registers */ rtsx_usb_init_cmd(ucr); /* MS_CFG to MS_INT_REG */ for (i = 0xFD40; i <= 0xFD44; i++) rtsx_usb_add_cmd(ucr, READ_REG_CMD, i, 0, 0); /* CARD_SHARE_MODE to CARD_GPIO */ for (i = 0xFD51; i <= 0xFD56; i++) rtsx_usb_add_cmd(ucr, READ_REG_CMD, i, 0, 0); /* CARD_PULL_CTLx */ for (i = 0xFD60; i <= 0xFD65; i++) rtsx_usb_add_cmd(ucr, READ_REG_CMD, i, 0, 0); /* CARD_DATA_SOURCE, CARD_SELECT, CARD_CLK_EN, CARD_PWR_CTL */ rtsx_usb_add_cmd(ucr, READ_REG_CMD, CARD_DATA_SOURCE, 0, 0); rtsx_usb_add_cmd(ucr, READ_REG_CMD, CARD_SELECT, 0, 0); rtsx_usb_add_cmd(ucr, READ_REG_CMD, CARD_CLK_EN, 0, 0); rtsx_usb_add_cmd(ucr, READ_REG_CMD, CARD_PWR_CTL, 0, 0); rtsx_usb_send_cmd(ucr, MODE_CR, 100); rtsx_usb_get_rsp(ucr, 21, 100); ptr = ucr->rsp_buf; for (i = 0xFD40; i <= 0xFD44; i++) dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", i, *(ptr++)); for (i = 0xFD51; i <= 0xFD56; i++) dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", i, *(ptr++)); for (i = 0xFD60; i <= 0xFD65; i++) dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", i, *(ptr++)); dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", CARD_DATA_SOURCE, *(ptr++)); dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", CARD_SELECT, *(ptr++)); dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", CARD_CLK_EN, *(ptr++)); dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", CARD_PWR_CTL, *(ptr++)); }
static int ms_transfer_data(struct rtsx_usb_ms *host, unsigned char data_dir, u8 tpc, u8 cfg, struct scatterlist *sg) { struct rtsx_ucr *ucr = host->ucr; int err; unsigned int length = sg->length; u16 sec_cnt = (u16)(length / 512); u8 trans_mode, dma_dir, flag; unsigned int pipe; struct memstick_dev *card = host->msh->card; dev_dbg(ms_dev(host), "%s: tpc = 0x%02x, data_dir = %s, length = %d\n", __func__, tpc, (data_dir == READ) ? "READ" : "WRITE", length); if (data_dir == READ) { flag = MODE_CDIR; dma_dir = DMA_DIR_FROM_CARD; if (card->id.type != MEMSTICK_TYPE_PRO) trans_mode = MS_TM_NORMAL_READ; else trans_mode = MS_TM_AUTO_READ; pipe = usb_rcvbulkpipe(ucr->pusb_dev, EP_BULK_IN); } else { flag = MODE_CDOR; dma_dir = DMA_DIR_TO_CARD; if (card->id.type != MEMSTICK_TYPE_PRO) trans_mode = MS_TM_NORMAL_WRITE; else trans_mode = MS_TM_AUTO_WRITE; pipe = usb_sndbulkpipe(ucr->pusb_dev, EP_BULK_OUT); } rtsx_usb_init_cmd(ucr); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_TPC, 0xFF, tpc); if (card->id.type == MEMSTICK_TYPE_PRO) { rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_SECTOR_CNT_H, 0xFF, (u8)(sec_cnt >> 8)); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_SECTOR_CNT_L, 0xFF, (u8)sec_cnt); }
static int ms_power_off(struct rtsx_usb_ms *host) { struct rtsx_ucr *ucr = host->ucr; int err; dev_dbg(ms_dev(host), "%s\n", __func__); rtsx_usb_init_cmd(ucr); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_CLK_EN, MS_CLK_EN, 0); rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_OE, MS_OUTPUT_EN, 0); err = rtsx_usb_send_cmd(ucr, MODE_C, 100); if (err < 0) return err; if (CHECK_PKG(ucr, LQFP48)) return ms_pull_ctl_disable_lqfp48(ucr); return ms_pull_ctl_disable_qfn24(ucr); }