0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/module.h>
0011 #include <linux/highmem.h>
0012 #include <linux/delay.h>
0013 #include <linux/platform_device.h>
0014 #include <linux/workqueue.h>
0015 #include <linux/memstick.h>
0016 #include <linux/kthread.h>
0017 #include <linux/rtsx_usb.h>
0018 #include <linux/pm_runtime.h>
0019 #include <linux/mutex.h>
0020 #include <linux/sched.h>
0021 #include <linux/completion.h>
0022 #include <asm/unaligned.h>
0023
0024 struct rtsx_usb_ms {
0025 struct platform_device *pdev;
0026 struct rtsx_ucr *ucr;
0027 struct memstick_host *msh;
0028 struct memstick_request *req;
0029
0030 struct mutex host_mutex;
0031 struct work_struct handle_req;
0032 struct delayed_work poll_card;
0033
0034 u8 ssc_depth;
0035 unsigned int clock;
0036 int power_mode;
0037 unsigned char ifmode;
0038 bool eject;
0039 bool system_suspending;
0040 };
0041
0042 static inline struct device *ms_dev(struct rtsx_usb_ms *host)
0043 {
0044 return &(host->pdev->dev);
0045 }
0046
0047 static inline void ms_clear_error(struct rtsx_usb_ms *host)
0048 {
0049 struct rtsx_ucr *ucr = host->ucr;
0050 rtsx_usb_ep0_write_register(ucr, CARD_STOP,
0051 MS_STOP | MS_CLR_ERR,
0052 MS_STOP | MS_CLR_ERR);
0053
0054 rtsx_usb_clear_dma_err(ucr);
0055 rtsx_usb_clear_fsm_err(ucr);
0056 }
0057
0058 #ifdef DEBUG
0059
0060 static void ms_print_debug_regs(struct rtsx_usb_ms *host)
0061 {
0062 struct rtsx_ucr *ucr = host->ucr;
0063 u16 i;
0064 u8 *ptr;
0065
0066
0067 rtsx_usb_init_cmd(ucr);
0068
0069
0070 for (i = 0xFD40; i <= 0xFD44; i++)
0071 rtsx_usb_add_cmd(ucr, READ_REG_CMD, i, 0, 0);
0072
0073
0074 for (i = 0xFD51; i <= 0xFD56; i++)
0075 rtsx_usb_add_cmd(ucr, READ_REG_CMD, i, 0, 0);
0076
0077
0078 for (i = 0xFD60; i <= 0xFD65; i++)
0079 rtsx_usb_add_cmd(ucr, READ_REG_CMD, i, 0, 0);
0080
0081
0082 rtsx_usb_add_cmd(ucr, READ_REG_CMD, CARD_DATA_SOURCE, 0, 0);
0083 rtsx_usb_add_cmd(ucr, READ_REG_CMD, CARD_SELECT, 0, 0);
0084 rtsx_usb_add_cmd(ucr, READ_REG_CMD, CARD_CLK_EN, 0, 0);
0085 rtsx_usb_add_cmd(ucr, READ_REG_CMD, CARD_PWR_CTL, 0, 0);
0086
0087 rtsx_usb_send_cmd(ucr, MODE_CR, 100);
0088 rtsx_usb_get_rsp(ucr, 21, 100);
0089
0090 ptr = ucr->rsp_buf;
0091 for (i = 0xFD40; i <= 0xFD44; i++)
0092 dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", i, *(ptr++));
0093 for (i = 0xFD51; i <= 0xFD56; i++)
0094 dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", i, *(ptr++));
0095 for (i = 0xFD60; i <= 0xFD65; i++)
0096 dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", i, *(ptr++));
0097
0098 dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", CARD_DATA_SOURCE, *(ptr++));
0099 dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", CARD_SELECT, *(ptr++));
0100 dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", CARD_CLK_EN, *(ptr++));
0101 dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", CARD_PWR_CTL, *(ptr++));
0102 }
0103
0104 #else
0105
0106 static void ms_print_debug_regs(struct rtsx_usb_ms *host)
0107 {
0108 }
0109
0110 #endif
0111
0112 static int ms_pull_ctl_disable_lqfp48(struct rtsx_ucr *ucr)
0113 {
0114 rtsx_usb_init_cmd(ucr);
0115
0116 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0x55);
0117 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55);
0118 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0x95);
0119 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x55);
0120 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF, 0x55);
0121 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, 0xA5);
0122
0123 return rtsx_usb_send_cmd(ucr, MODE_C, 100);
0124 }
0125
0126 static int ms_pull_ctl_disable_qfn24(struct rtsx_ucr *ucr)
0127 {
0128 rtsx_usb_init_cmd(ucr);
0129
0130 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0x65);
0131 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55);
0132 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0x95);
0133 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x55);
0134 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF, 0x56);
0135 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, 0x59);
0136
0137 return rtsx_usb_send_cmd(ucr, MODE_C, 100);
0138 }
0139
0140 static int ms_pull_ctl_enable_lqfp48(struct rtsx_ucr *ucr)
0141 {
0142 rtsx_usb_init_cmd(ucr);
0143
0144 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0x55);
0145 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55);
0146 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0x95);
0147 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x55);
0148 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF, 0x55);
0149 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, 0xA5);
0150
0151 return rtsx_usb_send_cmd(ucr, MODE_C, 100);
0152 }
0153
0154 static int ms_pull_ctl_enable_qfn24(struct rtsx_ucr *ucr)
0155 {
0156 rtsx_usb_init_cmd(ucr);
0157
0158 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0x65);
0159 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55);
0160 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0x95);
0161 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x55);
0162 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF, 0x55);
0163 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, 0x59);
0164
0165 return rtsx_usb_send_cmd(ucr, MODE_C, 100);
0166 }
0167
0168 static int ms_power_on(struct rtsx_usb_ms *host)
0169 {
0170 struct rtsx_ucr *ucr = host->ucr;
0171 int err;
0172
0173 dev_dbg(ms_dev(host), "%s\n", __func__);
0174
0175 rtsx_usb_init_cmd(ucr);
0176 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_SELECT, 0x07, MS_MOD_SEL);
0177 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_SHARE_MODE,
0178 CARD_SHARE_MASK, CARD_SHARE_MS);
0179 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_CLK_EN,
0180 MS_CLK_EN, MS_CLK_EN);
0181 err = rtsx_usb_send_cmd(ucr, MODE_C, 100);
0182 if (err < 0)
0183 return err;
0184
0185 if (CHECK_PKG(ucr, LQFP48))
0186 err = ms_pull_ctl_enable_lqfp48(ucr);
0187 else
0188 err = ms_pull_ctl_enable_qfn24(ucr);
0189 if (err < 0)
0190 return err;
0191
0192 err = rtsx_usb_write_register(ucr, CARD_PWR_CTL,
0193 POWER_MASK, PARTIAL_POWER_ON);
0194 if (err)
0195 return err;
0196
0197 usleep_range(800, 1000);
0198
0199 rtsx_usb_init_cmd(ucr);
0200 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PWR_CTL,
0201 POWER_MASK, POWER_ON);
0202 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_OE,
0203 MS_OUTPUT_EN, MS_OUTPUT_EN);
0204
0205 return rtsx_usb_send_cmd(ucr, MODE_C, 100);
0206 }
0207
0208 static int ms_power_off(struct rtsx_usb_ms *host)
0209 {
0210 struct rtsx_ucr *ucr = host->ucr;
0211 int err;
0212
0213 dev_dbg(ms_dev(host), "%s\n", __func__);
0214
0215 rtsx_usb_init_cmd(ucr);
0216
0217 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_CLK_EN, MS_CLK_EN, 0);
0218 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_OE, MS_OUTPUT_EN, 0);
0219
0220 err = rtsx_usb_send_cmd(ucr, MODE_C, 100);
0221 if (err < 0)
0222 return err;
0223
0224 if (CHECK_PKG(ucr, LQFP48))
0225 return ms_pull_ctl_disable_lqfp48(ucr);
0226
0227 return ms_pull_ctl_disable_qfn24(ucr);
0228 }
0229
0230 static int ms_transfer_data(struct rtsx_usb_ms *host, unsigned char data_dir,
0231 u8 tpc, u8 cfg, struct scatterlist *sg)
0232 {
0233 struct rtsx_ucr *ucr = host->ucr;
0234 int err;
0235 unsigned int length = sg->length;
0236 u16 sec_cnt = (u16)(length / 512);
0237 u8 trans_mode, dma_dir, flag;
0238 unsigned int pipe;
0239 struct memstick_dev *card = host->msh->card;
0240
0241 dev_dbg(ms_dev(host), "%s: tpc = 0x%02x, data_dir = %s, length = %d\n",
0242 __func__, tpc, (data_dir == READ) ? "READ" : "WRITE",
0243 length);
0244
0245 if (data_dir == READ) {
0246 flag = MODE_CDIR;
0247 dma_dir = DMA_DIR_FROM_CARD;
0248 if (card->id.type != MEMSTICK_TYPE_PRO)
0249 trans_mode = MS_TM_NORMAL_READ;
0250 else
0251 trans_mode = MS_TM_AUTO_READ;
0252 pipe = usb_rcvbulkpipe(ucr->pusb_dev, EP_BULK_IN);
0253 } else {
0254 flag = MODE_CDOR;
0255 dma_dir = DMA_DIR_TO_CARD;
0256 if (card->id.type != MEMSTICK_TYPE_PRO)
0257 trans_mode = MS_TM_NORMAL_WRITE;
0258 else
0259 trans_mode = MS_TM_AUTO_WRITE;
0260 pipe = usb_sndbulkpipe(ucr->pusb_dev, EP_BULK_OUT);
0261 }
0262
0263 rtsx_usb_init_cmd(ucr);
0264
0265 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_TPC, 0xFF, tpc);
0266 if (card->id.type == MEMSTICK_TYPE_PRO) {
0267 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_SECTOR_CNT_H,
0268 0xFF, (u8)(sec_cnt >> 8));
0269 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_SECTOR_CNT_L,
0270 0xFF, (u8)sec_cnt);
0271 }
0272 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, cfg);
0273
0274 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MC_DMA_TC3,
0275 0xFF, (u8)(length >> 24));
0276 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MC_DMA_TC2,
0277 0xFF, (u8)(length >> 16));
0278 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MC_DMA_TC1,
0279 0xFF, (u8)(length >> 8));
0280 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MC_DMA_TC0, 0xFF,
0281 (u8)length);
0282 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MC_DMA_CTL,
0283 0x03 | DMA_PACK_SIZE_MASK, dma_dir | DMA_EN | DMA_512);
0284 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_DATA_SOURCE,
0285 0x01, RING_BUFFER);
0286
0287 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_TRANSFER,
0288 0xFF, MS_TRANSFER_START | trans_mode);
0289 rtsx_usb_add_cmd(ucr, CHECK_REG_CMD, MS_TRANSFER,
0290 MS_TRANSFER_END, MS_TRANSFER_END);
0291
0292 err = rtsx_usb_send_cmd(ucr, flag | STAGE_MS_STATUS, 100);
0293 if (err)
0294 return err;
0295
0296 err = rtsx_usb_transfer_data(ucr, pipe, sg, length,
0297 1, NULL, 10000);
0298 if (err)
0299 goto err_out;
0300
0301 err = rtsx_usb_get_rsp(ucr, 3, 15000);
0302 if (err)
0303 goto err_out;
0304
0305 if (ucr->rsp_buf[0] & MS_TRANSFER_ERR ||
0306 ucr->rsp_buf[1] & (MS_CRC16_ERR | MS_RDY_TIMEOUT)) {
0307 err = -EIO;
0308 goto err_out;
0309 }
0310 return 0;
0311 err_out:
0312 ms_clear_error(host);
0313 return err;
0314 }
0315
0316 static int ms_write_bytes(struct rtsx_usb_ms *host, u8 tpc,
0317 u8 cfg, u8 cnt, u8 *data, u8 *int_reg)
0318 {
0319 struct rtsx_ucr *ucr = host->ucr;
0320 int err, i;
0321
0322 dev_dbg(ms_dev(host), "%s: tpc = 0x%02x\n", __func__, tpc);
0323
0324 rtsx_usb_init_cmd(ucr);
0325
0326 for (i = 0; i < cnt; i++)
0327 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD,
0328 PPBUF_BASE2 + i, 0xFF, data[i]);
0329
0330 if (cnt % 2)
0331 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD,
0332 PPBUF_BASE2 + i, 0xFF, 0xFF);
0333
0334 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_TPC, 0xFF, tpc);
0335 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_BYTE_CNT, 0xFF, cnt);
0336 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, cfg);
0337 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_DATA_SOURCE,
0338 0x01, PINGPONG_BUFFER);
0339
0340 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_TRANSFER,
0341 0xFF, MS_TRANSFER_START | MS_TM_WRITE_BYTES);
0342 rtsx_usb_add_cmd(ucr, CHECK_REG_CMD, MS_TRANSFER,
0343 MS_TRANSFER_END, MS_TRANSFER_END);
0344 rtsx_usb_add_cmd(ucr, READ_REG_CMD, MS_TRANS_CFG, 0, 0);
0345
0346 err = rtsx_usb_send_cmd(ucr, MODE_CR, 100);
0347 if (err)
0348 return err;
0349
0350 err = rtsx_usb_get_rsp(ucr, 2, 5000);
0351 if (err || (ucr->rsp_buf[0] & MS_TRANSFER_ERR)) {
0352 u8 val;
0353
0354 rtsx_usb_ep0_read_register(ucr, MS_TRANS_CFG, &val);
0355 dev_dbg(ms_dev(host), "MS_TRANS_CFG: 0x%02x\n", val);
0356
0357 if (int_reg)
0358 *int_reg = val & 0x0F;
0359
0360 ms_print_debug_regs(host);
0361
0362 ms_clear_error(host);
0363
0364 if (!(tpc & 0x08)) {
0365 if (val & MS_CRC16_ERR)
0366 return -EIO;
0367 } else {
0368 if (!(val & 0x80)) {
0369 if (val & (MS_INT_ERR | MS_INT_CMDNK))
0370 return -EIO;
0371 }
0372 }
0373
0374 return -ETIMEDOUT;
0375 }
0376
0377 if (int_reg)
0378 *int_reg = ucr->rsp_buf[1] & 0x0F;
0379
0380 return 0;
0381 }
0382
0383 static int ms_read_bytes(struct rtsx_usb_ms *host, u8 tpc,
0384 u8 cfg, u8 cnt, u8 *data, u8 *int_reg)
0385 {
0386 struct rtsx_ucr *ucr = host->ucr;
0387 int err, i;
0388 u8 *ptr;
0389
0390 dev_dbg(ms_dev(host), "%s: tpc = 0x%02x\n", __func__, tpc);
0391
0392 rtsx_usb_init_cmd(ucr);
0393
0394 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_TPC, 0xFF, tpc);
0395 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_BYTE_CNT, 0xFF, cnt);
0396 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, cfg);
0397 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_DATA_SOURCE,
0398 0x01, PINGPONG_BUFFER);
0399
0400 rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_TRANSFER,
0401 0xFF, MS_TRANSFER_START | MS_TM_READ_BYTES);
0402 rtsx_usb_add_cmd(ucr, CHECK_REG_CMD, MS_TRANSFER,
0403 MS_TRANSFER_END, MS_TRANSFER_END);
0404 for (i = 0; i < cnt - 1; i++)
0405 rtsx_usb_add_cmd(ucr, READ_REG_CMD, PPBUF_BASE2 + i, 0, 0);
0406 if (cnt % 2)
0407 rtsx_usb_add_cmd(ucr, READ_REG_CMD, PPBUF_BASE2 + cnt, 0, 0);
0408 else
0409 rtsx_usb_add_cmd(ucr, READ_REG_CMD,
0410 PPBUF_BASE2 + cnt - 1, 0, 0);
0411
0412 rtsx_usb_add_cmd(ucr, READ_REG_CMD, MS_TRANS_CFG, 0, 0);
0413
0414 err = rtsx_usb_send_cmd(ucr, MODE_CR, 100);
0415 if (err)
0416 return err;
0417
0418 err = rtsx_usb_get_rsp(ucr, cnt + 2, 5000);
0419 if (err || (ucr->rsp_buf[0] & MS_TRANSFER_ERR)) {
0420 u8 val;
0421
0422 rtsx_usb_ep0_read_register(ucr, MS_TRANS_CFG, &val);
0423 dev_dbg(ms_dev(host), "MS_TRANS_CFG: 0x%02x\n", val);
0424
0425 if (int_reg && (host->ifmode != MEMSTICK_SERIAL))
0426 *int_reg = val & 0x0F;
0427
0428 ms_print_debug_regs(host);
0429
0430 ms_clear_error(host);
0431
0432 if (!(tpc & 0x08)) {
0433 if (val & MS_CRC16_ERR)
0434 return -EIO;
0435 } else {
0436 if (!(val & 0x80)) {
0437 if (val & (MS_INT_ERR | MS_INT_CMDNK))
0438 return -EIO;
0439 }
0440 }
0441
0442 return -ETIMEDOUT;
0443 }
0444
0445 ptr = ucr->rsp_buf + 1;
0446 for (i = 0; i < cnt; i++)
0447 data[i] = *ptr++;
0448
0449
0450 if (int_reg && (host->ifmode != MEMSTICK_SERIAL))
0451 *int_reg = *ptr & 0x0F;
0452
0453 return 0;
0454 }
0455
0456 static int rtsx_usb_ms_issue_cmd(struct rtsx_usb_ms *host)
0457 {
0458 struct memstick_request *req = host->req;
0459 int err = 0;
0460 u8 cfg = 0, int_reg;
0461
0462 dev_dbg(ms_dev(host), "%s\n", __func__);
0463
0464 if (req->need_card_int) {
0465 if (host->ifmode != MEMSTICK_SERIAL)
0466 cfg = WAIT_INT;
0467 }
0468
0469 if (req->long_data) {
0470 err = ms_transfer_data(host, req->data_dir,
0471 req->tpc, cfg, &(req->sg));
0472 } else {
0473 if (req->data_dir == READ)
0474 err = ms_read_bytes(host, req->tpc, cfg,
0475 req->data_len, req->data, &int_reg);
0476 else
0477 err = ms_write_bytes(host, req->tpc, cfg,
0478 req->data_len, req->data, &int_reg);
0479 }
0480 if (err < 0)
0481 return err;
0482
0483 if (req->need_card_int) {
0484 if (host->ifmode == MEMSTICK_SERIAL) {
0485 err = ms_read_bytes(host, MS_TPC_GET_INT,
0486 NO_WAIT_INT, 1, &req->int_reg, NULL);
0487 if (err < 0)
0488 return err;
0489 } else {
0490
0491 if (int_reg & MS_INT_CMDNK)
0492 req->int_reg |= MEMSTICK_INT_CMDNAK;
0493 if (int_reg & MS_INT_BREQ)
0494 req->int_reg |= MEMSTICK_INT_BREQ;
0495 if (int_reg & MS_INT_ERR)
0496 req->int_reg |= MEMSTICK_INT_ERR;
0497 if (int_reg & MS_INT_CED)
0498 req->int_reg |= MEMSTICK_INT_CED;
0499 }
0500 dev_dbg(ms_dev(host), "int_reg: 0x%02x\n", req->int_reg);
0501 }
0502
0503 return 0;
0504 }
0505
0506 static void rtsx_usb_ms_handle_req(struct work_struct *work)
0507 {
0508 struct rtsx_usb_ms *host = container_of(work,
0509 struct rtsx_usb_ms, handle_req);
0510 struct rtsx_ucr *ucr = host->ucr;
0511 struct memstick_host *msh = host->msh;
0512 int rc;
0513
0514 if (!host->req) {
0515 pm_runtime_get_sync(ms_dev(host));
0516 do {
0517 rc = memstick_next_req(msh, &host->req);
0518 dev_dbg(ms_dev(host), "next req %d\n", rc);
0519
0520 if (!rc) {
0521 mutex_lock(&ucr->dev_mutex);
0522
0523 if (rtsx_usb_card_exclusive_check(ucr,
0524 RTSX_USB_MS_CARD))
0525 host->req->error = -EIO;
0526 else
0527 host->req->error =
0528 rtsx_usb_ms_issue_cmd(host);
0529
0530 mutex_unlock(&ucr->dev_mutex);
0531
0532 dev_dbg(ms_dev(host), "req result %d\n",
0533 host->req->error);
0534 }
0535 } while (!rc);
0536 pm_runtime_put_sync(ms_dev(host));
0537 }
0538
0539 }
0540
0541 static void rtsx_usb_ms_request(struct memstick_host *msh)
0542 {
0543 struct rtsx_usb_ms *host = memstick_priv(msh);
0544
0545 dev_dbg(ms_dev(host), "--> %s\n", __func__);
0546
0547 if (!host->eject)
0548 schedule_work(&host->handle_req);
0549 }
0550
0551 static int rtsx_usb_ms_set_param(struct memstick_host *msh,
0552 enum memstick_param param, int value)
0553 {
0554 struct rtsx_usb_ms *host = memstick_priv(msh);
0555 struct rtsx_ucr *ucr = host->ucr;
0556 unsigned int clock = 0;
0557 u8 ssc_depth = 0;
0558 int err;
0559
0560 dev_dbg(ms_dev(host), "%s: param = %d, value = %d\n",
0561 __func__, param, value);
0562
0563 pm_runtime_get_sync(ms_dev(host));
0564 mutex_lock(&ucr->dev_mutex);
0565
0566 err = rtsx_usb_card_exclusive_check(ucr, RTSX_USB_MS_CARD);
0567 if (err)
0568 goto out;
0569
0570 switch (param) {
0571 case MEMSTICK_POWER:
0572 if (value == host->power_mode)
0573 break;
0574
0575 if (value == MEMSTICK_POWER_ON) {
0576 pm_runtime_get_noresume(ms_dev(host));
0577 err = ms_power_on(host);
0578 if (err)
0579 pm_runtime_put_noidle(ms_dev(host));
0580 } else if (value == MEMSTICK_POWER_OFF) {
0581 err = ms_power_off(host);
0582 if (!err)
0583 pm_runtime_put_noidle(ms_dev(host));
0584 } else
0585 err = -EINVAL;
0586 if (!err)
0587 host->power_mode = value;
0588 break;
0589
0590 case MEMSTICK_INTERFACE:
0591 if (value == MEMSTICK_SERIAL) {
0592 clock = 19000000;
0593 ssc_depth = SSC_DEPTH_512K;
0594 err = rtsx_usb_write_register(ucr, MS_CFG, 0x5A,
0595 MS_BUS_WIDTH_1 | PUSH_TIME_DEFAULT);
0596 if (err < 0)
0597 break;
0598 } else if (value == MEMSTICK_PAR4) {
0599 clock = 39000000;
0600 ssc_depth = SSC_DEPTH_1M;
0601
0602 err = rtsx_usb_write_register(ucr, MS_CFG, 0x5A,
0603 MS_BUS_WIDTH_4 | PUSH_TIME_ODD |
0604 MS_NO_CHECK_INT);
0605 if (err < 0)
0606 break;
0607 } else {
0608 err = -EINVAL;
0609 break;
0610 }
0611
0612 err = rtsx_usb_switch_clock(ucr, clock,
0613 ssc_depth, false, true, false);
0614 if (err < 0) {
0615 dev_dbg(ms_dev(host), "switch clock failed\n");
0616 break;
0617 }
0618
0619 host->ssc_depth = ssc_depth;
0620 host->clock = clock;
0621 host->ifmode = value;
0622 break;
0623 default:
0624 err = -EINVAL;
0625 break;
0626 }
0627 out:
0628 mutex_unlock(&ucr->dev_mutex);
0629 pm_runtime_put_sync(ms_dev(host));
0630
0631
0632 if (param == MEMSTICK_POWER && value == MEMSTICK_POWER_ON) {
0633 usleep_range(10000, 12000);
0634
0635 if (!host->eject)
0636 schedule_delayed_work(&host->poll_card, 100);
0637 }
0638
0639 dev_dbg(ms_dev(host), "%s: return = %d\n", __func__, err);
0640 return err;
0641 }
0642
0643 #ifdef CONFIG_PM_SLEEP
0644 static int rtsx_usb_ms_suspend(struct device *dev)
0645 {
0646 struct rtsx_usb_ms *host = dev_get_drvdata(dev);
0647 struct memstick_host *msh = host->msh;
0648
0649
0650
0651
0652
0653
0654
0655
0656
0657
0658
0659
0660
0661
0662
0663
0664 host->system_suspending = true;
0665 memstick_suspend_host(msh);
0666
0667 return 0;
0668 }
0669
0670 static int rtsx_usb_ms_resume(struct device *dev)
0671 {
0672 struct rtsx_usb_ms *host = dev_get_drvdata(dev);
0673 struct memstick_host *msh = host->msh;
0674
0675 memstick_resume_host(msh);
0676 host->system_suspending = false;
0677
0678 return 0;
0679 }
0680 #endif
0681
0682 #ifdef CONFIG_PM
0683 static int rtsx_usb_ms_runtime_suspend(struct device *dev)
0684 {
0685 struct rtsx_usb_ms *host = dev_get_drvdata(dev);
0686
0687 if (host->system_suspending)
0688 return 0;
0689
0690 if (host->msh->card || host->power_mode != MEMSTICK_POWER_OFF)
0691 return -EAGAIN;
0692
0693 return 0;
0694 }
0695
0696 static int rtsx_usb_ms_runtime_resume(struct device *dev)
0697 {
0698 struct rtsx_usb_ms *host = dev_get_drvdata(dev);
0699
0700
0701 if (host->system_suspending)
0702 return 0;
0703
0704 memstick_detect_change(host->msh);
0705
0706 return 0;
0707 }
0708 #endif
0709
0710 static const struct dev_pm_ops rtsx_usb_ms_pm_ops = {
0711 SET_SYSTEM_SLEEP_PM_OPS(rtsx_usb_ms_suspend, rtsx_usb_ms_resume)
0712 SET_RUNTIME_PM_OPS(rtsx_usb_ms_runtime_suspend, rtsx_usb_ms_runtime_resume, NULL)
0713 };
0714
0715
0716 static void rtsx_usb_ms_poll_card(struct work_struct *work)
0717 {
0718 struct rtsx_usb_ms *host = container_of(work, struct rtsx_usb_ms,
0719 poll_card.work);
0720 struct rtsx_ucr *ucr = host->ucr;
0721 int err;
0722 u8 val;
0723
0724 if (host->eject || host->power_mode != MEMSTICK_POWER_ON)
0725 return;
0726
0727 pm_runtime_get_sync(ms_dev(host));
0728 mutex_lock(&ucr->dev_mutex);
0729
0730
0731 err = rtsx_usb_read_register(ucr, CARD_INT_PEND, &val);
0732 if (err) {
0733 mutex_unlock(&ucr->dev_mutex);
0734 goto poll_again;
0735 }
0736
0737
0738 rtsx_usb_write_register(ucr, CARD_INT_PEND,
0739 XD_INT | MS_INT | SD_INT,
0740 XD_INT | MS_INT | SD_INT);
0741
0742 mutex_unlock(&ucr->dev_mutex);
0743
0744 if (val & MS_INT) {
0745 dev_dbg(ms_dev(host), "MS slot change detected\n");
0746 memstick_detect_change(host->msh);
0747 }
0748
0749 poll_again:
0750 pm_runtime_put_sync(ms_dev(host));
0751
0752 if (!host->eject && host->power_mode == MEMSTICK_POWER_ON)
0753 schedule_delayed_work(&host->poll_card, 100);
0754 }
0755
0756 static int rtsx_usb_ms_drv_probe(struct platform_device *pdev)
0757 {
0758 struct memstick_host *msh;
0759 struct rtsx_usb_ms *host;
0760 struct rtsx_ucr *ucr;
0761 int err;
0762
0763 ucr = usb_get_intfdata(to_usb_interface(pdev->dev.parent));
0764 if (!ucr)
0765 return -ENXIO;
0766
0767 dev_dbg(&(pdev->dev),
0768 "Realtek USB Memstick controller found\n");
0769
0770 msh = memstick_alloc_host(sizeof(*host), &pdev->dev);
0771 if (!msh)
0772 return -ENOMEM;
0773
0774 host = memstick_priv(msh);
0775 host->ucr = ucr;
0776 host->msh = msh;
0777 host->pdev = pdev;
0778 host->power_mode = MEMSTICK_POWER_OFF;
0779 platform_set_drvdata(pdev, host);
0780
0781 mutex_init(&host->host_mutex);
0782 INIT_WORK(&host->handle_req, rtsx_usb_ms_handle_req);
0783
0784 INIT_DELAYED_WORK(&host->poll_card, rtsx_usb_ms_poll_card);
0785
0786 msh->request = rtsx_usb_ms_request;
0787 msh->set_param = rtsx_usb_ms_set_param;
0788 msh->caps = MEMSTICK_CAP_PAR4;
0789
0790 pm_runtime_get_noresume(ms_dev(host));
0791 pm_runtime_set_active(ms_dev(host));
0792 pm_runtime_enable(ms_dev(host));
0793
0794 err = memstick_add_host(msh);
0795 if (err)
0796 goto err_out;
0797
0798 pm_runtime_put(ms_dev(host));
0799
0800 return 0;
0801 err_out:
0802 pm_runtime_disable(ms_dev(host));
0803 pm_runtime_put_noidle(ms_dev(host));
0804 memstick_free_host(msh);
0805 return err;
0806 }
0807
0808 static int rtsx_usb_ms_drv_remove(struct platform_device *pdev)
0809 {
0810 struct rtsx_usb_ms *host = platform_get_drvdata(pdev);
0811 struct memstick_host *msh = host->msh;
0812 int err;
0813
0814 host->eject = true;
0815 cancel_work_sync(&host->handle_req);
0816
0817 mutex_lock(&host->host_mutex);
0818 if (host->req) {
0819 dev_dbg(ms_dev(host),
0820 "%s: Controller removed during transfer\n",
0821 dev_name(&msh->dev));
0822 host->req->error = -ENOMEDIUM;
0823 do {
0824 err = memstick_next_req(msh, &host->req);
0825 if (!err)
0826 host->req->error = -ENOMEDIUM;
0827 } while (!err);
0828 }
0829 mutex_unlock(&host->host_mutex);
0830
0831
0832
0833
0834 if (pm_runtime_active(ms_dev(host)))
0835 pm_runtime_put(ms_dev(host));
0836
0837 pm_runtime_disable(ms_dev(host));
0838 memstick_remove_host(msh);
0839 dev_dbg(ms_dev(host),
0840 ": Realtek USB Memstick controller has been removed\n");
0841 memstick_free_host(msh);
0842 platform_set_drvdata(pdev, NULL);
0843
0844 return 0;
0845 }
0846
0847 static struct platform_device_id rtsx_usb_ms_ids[] = {
0848 {
0849 .name = "rtsx_usb_ms",
0850 }, {
0851
0852 }
0853 };
0854 MODULE_DEVICE_TABLE(platform, rtsx_usb_ms_ids);
0855
0856 static struct platform_driver rtsx_usb_ms_driver = {
0857 .probe = rtsx_usb_ms_drv_probe,
0858 .remove = rtsx_usb_ms_drv_remove,
0859 .id_table = rtsx_usb_ms_ids,
0860 .driver = {
0861 .name = "rtsx_usb_ms",
0862 .pm = &rtsx_usb_ms_pm_ops,
0863 },
0864 };
0865 module_platform_driver(rtsx_usb_ms_driver);
0866
0867 MODULE_LICENSE("GPL v2");
0868 MODULE_AUTHOR("Roger Tseng <rogerable@realtek.com>");
0869 MODULE_DESCRIPTION("Realtek USB Memstick Card Host Driver");