rtsx_usb_ms.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* Realtek USB Memstick Card Interface driver
  3. *
  4. * Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved.
  5. *
  6. * Author:
  7. * Roger Tseng <[email protected]>
  8. */
  9. #include <linux/module.h>
  10. #include <linux/highmem.h>
  11. #include <linux/delay.h>
  12. #include <linux/platform_device.h>
  13. #include <linux/workqueue.h>
  14. #include <linux/memstick.h>
  15. #include <linux/kthread.h>
  16. #include <linux/rtsx_usb.h>
  17. #include <linux/pm_runtime.h>
  18. #include <linux/mutex.h>
  19. #include <linux/sched.h>
  20. #include <linux/completion.h>
  21. #include <asm/unaligned.h>
  22. struct rtsx_usb_ms {
  23. struct platform_device *pdev;
  24. struct rtsx_ucr *ucr;
  25. struct memstick_host *msh;
  26. struct memstick_request *req;
  27. struct mutex host_mutex;
  28. struct work_struct handle_req;
  29. struct delayed_work poll_card;
  30. u8 ssc_depth;
  31. unsigned int clock;
  32. int power_mode;
  33. unsigned char ifmode;
  34. bool eject;
  35. bool system_suspending;
  36. };
  37. static inline struct device *ms_dev(struct rtsx_usb_ms *host)
  38. {
  39. return &(host->pdev->dev);
  40. }
  41. static inline void ms_clear_error(struct rtsx_usb_ms *host)
  42. {
  43. struct rtsx_ucr *ucr = host->ucr;
  44. rtsx_usb_ep0_write_register(ucr, CARD_STOP,
  45. MS_STOP | MS_CLR_ERR,
  46. MS_STOP | MS_CLR_ERR);
  47. rtsx_usb_clear_dma_err(ucr);
  48. rtsx_usb_clear_fsm_err(ucr);
  49. }
  50. #ifdef DEBUG
  51. static void ms_print_debug_regs(struct rtsx_usb_ms *host)
  52. {
  53. struct rtsx_ucr *ucr = host->ucr;
  54. u16 i;
  55. u8 *ptr;
  56. /* Print MS host internal registers */
  57. rtsx_usb_init_cmd(ucr);
  58. /* MS_CFG to MS_INT_REG */
  59. for (i = 0xFD40; i <= 0xFD44; i++)
  60. rtsx_usb_add_cmd(ucr, READ_REG_CMD, i, 0, 0);
  61. /* CARD_SHARE_MODE to CARD_GPIO */
  62. for (i = 0xFD51; i <= 0xFD56; i++)
  63. rtsx_usb_add_cmd(ucr, READ_REG_CMD, i, 0, 0);
  64. /* CARD_PULL_CTLx */
  65. for (i = 0xFD60; i <= 0xFD65; i++)
  66. rtsx_usb_add_cmd(ucr, READ_REG_CMD, i, 0, 0);
  67. /* CARD_DATA_SOURCE, CARD_SELECT, CARD_CLK_EN, CARD_PWR_CTL */
  68. rtsx_usb_add_cmd(ucr, READ_REG_CMD, CARD_DATA_SOURCE, 0, 0);
  69. rtsx_usb_add_cmd(ucr, READ_REG_CMD, CARD_SELECT, 0, 0);
  70. rtsx_usb_add_cmd(ucr, READ_REG_CMD, CARD_CLK_EN, 0, 0);
  71. rtsx_usb_add_cmd(ucr, READ_REG_CMD, CARD_PWR_CTL, 0, 0);
  72. rtsx_usb_send_cmd(ucr, MODE_CR, 100);
  73. rtsx_usb_get_rsp(ucr, 21, 100);
  74. ptr = ucr->rsp_buf;
  75. for (i = 0xFD40; i <= 0xFD44; i++)
  76. dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", i, *(ptr++));
  77. for (i = 0xFD51; i <= 0xFD56; i++)
  78. dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", i, *(ptr++));
  79. for (i = 0xFD60; i <= 0xFD65; i++)
  80. dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", i, *(ptr++));
  81. dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", CARD_DATA_SOURCE, *(ptr++));
  82. dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", CARD_SELECT, *(ptr++));
  83. dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", CARD_CLK_EN, *(ptr++));
  84. dev_dbg(ms_dev(host), "0x%04X: 0x%02x\n", CARD_PWR_CTL, *(ptr++));
  85. }
  86. #else
  87. static void ms_print_debug_regs(struct rtsx_usb_ms *host)
  88. {
  89. }
  90. #endif
  91. static int ms_pull_ctl_disable_lqfp48(struct rtsx_ucr *ucr)
  92. {
  93. rtsx_usb_init_cmd(ucr);
  94. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0x55);
  95. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55);
  96. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0x95);
  97. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x55);
  98. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF, 0x55);
  99. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, 0xA5);
  100. return rtsx_usb_send_cmd(ucr, MODE_C, 100);
  101. }
  102. static int ms_pull_ctl_disable_qfn24(struct rtsx_ucr *ucr)
  103. {
  104. rtsx_usb_init_cmd(ucr);
  105. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0x65);
  106. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55);
  107. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0x95);
  108. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x55);
  109. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF, 0x56);
  110. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, 0x59);
  111. return rtsx_usb_send_cmd(ucr, MODE_C, 100);
  112. }
  113. static int ms_pull_ctl_enable_lqfp48(struct rtsx_ucr *ucr)
  114. {
  115. rtsx_usb_init_cmd(ucr);
  116. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0x55);
  117. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55);
  118. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0x95);
  119. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x55);
  120. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF, 0x55);
  121. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, 0xA5);
  122. return rtsx_usb_send_cmd(ucr, MODE_C, 100);
  123. }
  124. static int ms_pull_ctl_enable_qfn24(struct rtsx_ucr *ucr)
  125. {
  126. rtsx_usb_init_cmd(ucr);
  127. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL1, 0xFF, 0x65);
  128. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL2, 0xFF, 0x55);
  129. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL3, 0xFF, 0x95);
  130. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL4, 0xFF, 0x55);
  131. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL5, 0xFF, 0x55);
  132. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PULL_CTL6, 0xFF, 0x59);
  133. return rtsx_usb_send_cmd(ucr, MODE_C, 100);
  134. }
  135. static int ms_power_on(struct rtsx_usb_ms *host)
  136. {
  137. struct rtsx_ucr *ucr = host->ucr;
  138. int err;
  139. dev_dbg(ms_dev(host), "%s\n", __func__);
  140. rtsx_usb_init_cmd(ucr);
  141. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_SELECT, 0x07, MS_MOD_SEL);
  142. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_SHARE_MODE,
  143. CARD_SHARE_MASK, CARD_SHARE_MS);
  144. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_CLK_EN,
  145. MS_CLK_EN, MS_CLK_EN);
  146. err = rtsx_usb_send_cmd(ucr, MODE_C, 100);
  147. if (err < 0)
  148. return err;
  149. if (CHECK_PKG(ucr, LQFP48))
  150. err = ms_pull_ctl_enable_lqfp48(ucr);
  151. else
  152. err = ms_pull_ctl_enable_qfn24(ucr);
  153. if (err < 0)
  154. return err;
  155. err = rtsx_usb_write_register(ucr, CARD_PWR_CTL,
  156. POWER_MASK, PARTIAL_POWER_ON);
  157. if (err)
  158. return err;
  159. usleep_range(800, 1000);
  160. rtsx_usb_init_cmd(ucr);
  161. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_PWR_CTL,
  162. POWER_MASK, POWER_ON);
  163. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_OE,
  164. MS_OUTPUT_EN, MS_OUTPUT_EN);
  165. return rtsx_usb_send_cmd(ucr, MODE_C, 100);
  166. }
  167. static int ms_power_off(struct rtsx_usb_ms *host)
  168. {
  169. struct rtsx_ucr *ucr = host->ucr;
  170. int err;
  171. dev_dbg(ms_dev(host), "%s\n", __func__);
  172. rtsx_usb_init_cmd(ucr);
  173. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_CLK_EN, MS_CLK_EN, 0);
  174. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_OE, MS_OUTPUT_EN, 0);
  175. err = rtsx_usb_send_cmd(ucr, MODE_C, 100);
  176. if (err < 0)
  177. return err;
  178. if (CHECK_PKG(ucr, LQFP48))
  179. return ms_pull_ctl_disable_lqfp48(ucr);
  180. return ms_pull_ctl_disable_qfn24(ucr);
  181. }
  182. static int ms_transfer_data(struct rtsx_usb_ms *host, unsigned char data_dir,
  183. u8 tpc, u8 cfg, struct scatterlist *sg)
  184. {
  185. struct rtsx_ucr *ucr = host->ucr;
  186. int err;
  187. unsigned int length = sg->length;
  188. u16 sec_cnt = (u16)(length / 512);
  189. u8 trans_mode, dma_dir, flag;
  190. unsigned int pipe;
  191. struct memstick_dev *card = host->msh->card;
  192. dev_dbg(ms_dev(host), "%s: tpc = 0x%02x, data_dir = %s, length = %d\n",
  193. __func__, tpc, (data_dir == READ) ? "READ" : "WRITE",
  194. length);
  195. if (data_dir == READ) {
  196. flag = MODE_CDIR;
  197. dma_dir = DMA_DIR_FROM_CARD;
  198. if (card->id.type != MEMSTICK_TYPE_PRO)
  199. trans_mode = MS_TM_NORMAL_READ;
  200. else
  201. trans_mode = MS_TM_AUTO_READ;
  202. pipe = usb_rcvbulkpipe(ucr->pusb_dev, EP_BULK_IN);
  203. } else {
  204. flag = MODE_CDOR;
  205. dma_dir = DMA_DIR_TO_CARD;
  206. if (card->id.type != MEMSTICK_TYPE_PRO)
  207. trans_mode = MS_TM_NORMAL_WRITE;
  208. else
  209. trans_mode = MS_TM_AUTO_WRITE;
  210. pipe = usb_sndbulkpipe(ucr->pusb_dev, EP_BULK_OUT);
  211. }
  212. rtsx_usb_init_cmd(ucr);
  213. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_TPC, 0xFF, tpc);
  214. if (card->id.type == MEMSTICK_TYPE_PRO) {
  215. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_SECTOR_CNT_H,
  216. 0xFF, (u8)(sec_cnt >> 8));
  217. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_SECTOR_CNT_L,
  218. 0xFF, (u8)sec_cnt);
  219. }
  220. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, cfg);
  221. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MC_DMA_TC3,
  222. 0xFF, (u8)(length >> 24));
  223. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MC_DMA_TC2,
  224. 0xFF, (u8)(length >> 16));
  225. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MC_DMA_TC1,
  226. 0xFF, (u8)(length >> 8));
  227. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MC_DMA_TC0, 0xFF,
  228. (u8)length);
  229. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MC_DMA_CTL,
  230. 0x03 | DMA_PACK_SIZE_MASK, dma_dir | DMA_EN | DMA_512);
  231. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_DATA_SOURCE,
  232. 0x01, RING_BUFFER);
  233. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_TRANSFER,
  234. 0xFF, MS_TRANSFER_START | trans_mode);
  235. rtsx_usb_add_cmd(ucr, CHECK_REG_CMD, MS_TRANSFER,
  236. MS_TRANSFER_END, MS_TRANSFER_END);
  237. err = rtsx_usb_send_cmd(ucr, flag | STAGE_MS_STATUS, 100);
  238. if (err)
  239. return err;
  240. err = rtsx_usb_transfer_data(ucr, pipe, sg, length,
  241. 1, NULL, 10000);
  242. if (err)
  243. goto err_out;
  244. err = rtsx_usb_get_rsp(ucr, 3, 15000);
  245. if (err)
  246. goto err_out;
  247. if (ucr->rsp_buf[0] & MS_TRANSFER_ERR ||
  248. ucr->rsp_buf[1] & (MS_CRC16_ERR | MS_RDY_TIMEOUT)) {
  249. err = -EIO;
  250. goto err_out;
  251. }
  252. return 0;
  253. err_out:
  254. ms_clear_error(host);
  255. return err;
  256. }
  257. static int ms_write_bytes(struct rtsx_usb_ms *host, u8 tpc,
  258. u8 cfg, u8 cnt, u8 *data, u8 *int_reg)
  259. {
  260. struct rtsx_ucr *ucr = host->ucr;
  261. int err, i;
  262. dev_dbg(ms_dev(host), "%s: tpc = 0x%02x\n", __func__, tpc);
  263. rtsx_usb_init_cmd(ucr);
  264. for (i = 0; i < cnt; i++)
  265. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD,
  266. PPBUF_BASE2 + i, 0xFF, data[i]);
  267. if (cnt % 2)
  268. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD,
  269. PPBUF_BASE2 + i, 0xFF, 0xFF);
  270. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_TPC, 0xFF, tpc);
  271. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_BYTE_CNT, 0xFF, cnt);
  272. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, cfg);
  273. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_DATA_SOURCE,
  274. 0x01, PINGPONG_BUFFER);
  275. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_TRANSFER,
  276. 0xFF, MS_TRANSFER_START | MS_TM_WRITE_BYTES);
  277. rtsx_usb_add_cmd(ucr, CHECK_REG_CMD, MS_TRANSFER,
  278. MS_TRANSFER_END, MS_TRANSFER_END);
  279. rtsx_usb_add_cmd(ucr, READ_REG_CMD, MS_TRANS_CFG, 0, 0);
  280. err = rtsx_usb_send_cmd(ucr, MODE_CR, 100);
  281. if (err)
  282. return err;
  283. err = rtsx_usb_get_rsp(ucr, 2, 5000);
  284. if (err || (ucr->rsp_buf[0] & MS_TRANSFER_ERR)) {
  285. u8 val;
  286. rtsx_usb_ep0_read_register(ucr, MS_TRANS_CFG, &val);
  287. dev_dbg(ms_dev(host), "MS_TRANS_CFG: 0x%02x\n", val);
  288. if (int_reg)
  289. *int_reg = val & 0x0F;
  290. ms_print_debug_regs(host);
  291. ms_clear_error(host);
  292. if (!(tpc & 0x08)) {
  293. if (val & MS_CRC16_ERR)
  294. return -EIO;
  295. } else {
  296. if (!(val & 0x80)) {
  297. if (val & (MS_INT_ERR | MS_INT_CMDNK))
  298. return -EIO;
  299. }
  300. }
  301. return -ETIMEDOUT;
  302. }
  303. if (int_reg)
  304. *int_reg = ucr->rsp_buf[1] & 0x0F;
  305. return 0;
  306. }
  307. static int ms_read_bytes(struct rtsx_usb_ms *host, u8 tpc,
  308. u8 cfg, u8 cnt, u8 *data, u8 *int_reg)
  309. {
  310. struct rtsx_ucr *ucr = host->ucr;
  311. int err, i;
  312. u8 *ptr;
  313. dev_dbg(ms_dev(host), "%s: tpc = 0x%02x\n", __func__, tpc);
  314. rtsx_usb_init_cmd(ucr);
  315. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_TPC, 0xFF, tpc);
  316. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_BYTE_CNT, 0xFF, cnt);
  317. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_TRANS_CFG, 0xFF, cfg);
  318. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, CARD_DATA_SOURCE,
  319. 0x01, PINGPONG_BUFFER);
  320. rtsx_usb_add_cmd(ucr, WRITE_REG_CMD, MS_TRANSFER,
  321. 0xFF, MS_TRANSFER_START | MS_TM_READ_BYTES);
  322. rtsx_usb_add_cmd(ucr, CHECK_REG_CMD, MS_TRANSFER,
  323. MS_TRANSFER_END, MS_TRANSFER_END);
  324. for (i = 0; i < cnt - 1; i++)
  325. rtsx_usb_add_cmd(ucr, READ_REG_CMD, PPBUF_BASE2 + i, 0, 0);
  326. if (cnt % 2)
  327. rtsx_usb_add_cmd(ucr, READ_REG_CMD, PPBUF_BASE2 + cnt, 0, 0);
  328. else
  329. rtsx_usb_add_cmd(ucr, READ_REG_CMD,
  330. PPBUF_BASE2 + cnt - 1, 0, 0);
  331. rtsx_usb_add_cmd(ucr, READ_REG_CMD, MS_TRANS_CFG, 0, 0);
  332. err = rtsx_usb_send_cmd(ucr, MODE_CR, 100);
  333. if (err)
  334. return err;
  335. err = rtsx_usb_get_rsp(ucr, cnt + 2, 5000);
  336. if (err || (ucr->rsp_buf[0] & MS_TRANSFER_ERR)) {
  337. u8 val;
  338. rtsx_usb_ep0_read_register(ucr, MS_TRANS_CFG, &val);
  339. dev_dbg(ms_dev(host), "MS_TRANS_CFG: 0x%02x\n", val);
  340. if (int_reg && (host->ifmode != MEMSTICK_SERIAL))
  341. *int_reg = val & 0x0F;
  342. ms_print_debug_regs(host);
  343. ms_clear_error(host);
  344. if (!(tpc & 0x08)) {
  345. if (val & MS_CRC16_ERR)
  346. return -EIO;
  347. } else {
  348. if (!(val & 0x80)) {
  349. if (val & (MS_INT_ERR | MS_INT_CMDNK))
  350. return -EIO;
  351. }
  352. }
  353. return -ETIMEDOUT;
  354. }
  355. ptr = ucr->rsp_buf + 1;
  356. for (i = 0; i < cnt; i++)
  357. data[i] = *ptr++;
  358. if (int_reg && (host->ifmode != MEMSTICK_SERIAL))
  359. *int_reg = *ptr & 0x0F;
  360. return 0;
  361. }
  362. static int rtsx_usb_ms_issue_cmd(struct rtsx_usb_ms *host)
  363. {
  364. struct memstick_request *req = host->req;
  365. int err = 0;
  366. u8 cfg = 0, int_reg;
  367. dev_dbg(ms_dev(host), "%s\n", __func__);
  368. if (req->need_card_int) {
  369. if (host->ifmode != MEMSTICK_SERIAL)
  370. cfg = WAIT_INT;
  371. }
  372. if (req->long_data) {
  373. err = ms_transfer_data(host, req->data_dir,
  374. req->tpc, cfg, &(req->sg));
  375. } else {
  376. if (req->data_dir == READ)
  377. err = ms_read_bytes(host, req->tpc, cfg,
  378. req->data_len, req->data, &int_reg);
  379. else
  380. err = ms_write_bytes(host, req->tpc, cfg,
  381. req->data_len, req->data, &int_reg);
  382. }
  383. if (err < 0)
  384. return err;
  385. if (req->need_card_int) {
  386. if (host->ifmode == MEMSTICK_SERIAL) {
  387. err = ms_read_bytes(host, MS_TPC_GET_INT,
  388. NO_WAIT_INT, 1, &req->int_reg, NULL);
  389. if (err < 0)
  390. return err;
  391. } else {
  392. if (int_reg & MS_INT_CMDNK)
  393. req->int_reg |= MEMSTICK_INT_CMDNAK;
  394. if (int_reg & MS_INT_BREQ)
  395. req->int_reg |= MEMSTICK_INT_BREQ;
  396. if (int_reg & MS_INT_ERR)
  397. req->int_reg |= MEMSTICK_INT_ERR;
  398. if (int_reg & MS_INT_CED)
  399. req->int_reg |= MEMSTICK_INT_CED;
  400. }
  401. dev_dbg(ms_dev(host), "int_reg: 0x%02x\n", req->int_reg);
  402. }
  403. return 0;
  404. }
  405. static void rtsx_usb_ms_handle_req(struct work_struct *work)
  406. {
  407. struct rtsx_usb_ms *host = container_of(work,
  408. struct rtsx_usb_ms, handle_req);
  409. struct rtsx_ucr *ucr = host->ucr;
  410. struct memstick_host *msh = host->msh;
  411. int rc;
  412. if (!host->req) {
  413. pm_runtime_get_sync(ms_dev(host));
  414. do {
  415. rc = memstick_next_req(msh, &host->req);
  416. dev_dbg(ms_dev(host), "next req %d\n", rc);
  417. if (!rc) {
  418. mutex_lock(&ucr->dev_mutex);
  419. if (rtsx_usb_card_exclusive_check(ucr,
  420. RTSX_USB_MS_CARD))
  421. host->req->error = -EIO;
  422. else
  423. host->req->error =
  424. rtsx_usb_ms_issue_cmd(host);
  425. mutex_unlock(&ucr->dev_mutex);
  426. dev_dbg(ms_dev(host), "req result %d\n",
  427. host->req->error);
  428. }
  429. } while (!rc);
  430. pm_runtime_put_sync(ms_dev(host));
  431. }
  432. }
  433. static void rtsx_usb_ms_request(struct memstick_host *msh)
  434. {
  435. struct rtsx_usb_ms *host = memstick_priv(msh);
  436. dev_dbg(ms_dev(host), "--> %s\n", __func__);
  437. if (!host->eject)
  438. schedule_work(&host->handle_req);
  439. }
  440. static int rtsx_usb_ms_set_param(struct memstick_host *msh,
  441. enum memstick_param param, int value)
  442. {
  443. struct rtsx_usb_ms *host = memstick_priv(msh);
  444. struct rtsx_ucr *ucr = host->ucr;
  445. unsigned int clock = 0;
  446. u8 ssc_depth = 0;
  447. int err;
  448. dev_dbg(ms_dev(host), "%s: param = %d, value = %d\n",
  449. __func__, param, value);
  450. pm_runtime_get_sync(ms_dev(host));
  451. mutex_lock(&ucr->dev_mutex);
  452. err = rtsx_usb_card_exclusive_check(ucr, RTSX_USB_MS_CARD);
  453. if (err)
  454. goto out;
  455. switch (param) {
  456. case MEMSTICK_POWER:
  457. if (value == host->power_mode)
  458. break;
  459. if (value == MEMSTICK_POWER_ON) {
  460. pm_runtime_get_noresume(ms_dev(host));
  461. err = ms_power_on(host);
  462. if (err)
  463. pm_runtime_put_noidle(ms_dev(host));
  464. } else if (value == MEMSTICK_POWER_OFF) {
  465. err = ms_power_off(host);
  466. if (!err)
  467. pm_runtime_put_noidle(ms_dev(host));
  468. } else
  469. err = -EINVAL;
  470. if (!err)
  471. host->power_mode = value;
  472. break;
  473. case MEMSTICK_INTERFACE:
  474. if (value == MEMSTICK_SERIAL) {
  475. clock = 19000000;
  476. ssc_depth = SSC_DEPTH_512K;
  477. err = rtsx_usb_write_register(ucr, MS_CFG, 0x5A,
  478. MS_BUS_WIDTH_1 | PUSH_TIME_DEFAULT);
  479. if (err < 0)
  480. break;
  481. } else if (value == MEMSTICK_PAR4) {
  482. clock = 39000000;
  483. ssc_depth = SSC_DEPTH_1M;
  484. err = rtsx_usb_write_register(ucr, MS_CFG, 0x5A,
  485. MS_BUS_WIDTH_4 | PUSH_TIME_ODD |
  486. MS_NO_CHECK_INT);
  487. if (err < 0)
  488. break;
  489. } else {
  490. err = -EINVAL;
  491. break;
  492. }
  493. err = rtsx_usb_switch_clock(ucr, clock,
  494. ssc_depth, false, true, false);
  495. if (err < 0) {
  496. dev_dbg(ms_dev(host), "switch clock failed\n");
  497. break;
  498. }
  499. host->ssc_depth = ssc_depth;
  500. host->clock = clock;
  501. host->ifmode = value;
  502. break;
  503. default:
  504. err = -EINVAL;
  505. break;
  506. }
  507. out:
  508. mutex_unlock(&ucr->dev_mutex);
  509. pm_runtime_put_sync(ms_dev(host));
  510. /* power-on delay */
  511. if (param == MEMSTICK_POWER && value == MEMSTICK_POWER_ON) {
  512. usleep_range(10000, 12000);
  513. if (!host->eject)
  514. schedule_delayed_work(&host->poll_card, 100);
  515. }
  516. dev_dbg(ms_dev(host), "%s: return = %d\n", __func__, err);
  517. return err;
  518. }
  519. #ifdef CONFIG_PM_SLEEP
  520. static int rtsx_usb_ms_suspend(struct device *dev)
  521. {
  522. struct rtsx_usb_ms *host = dev_get_drvdata(dev);
  523. struct memstick_host *msh = host->msh;
  524. /* Since we use rtsx_usb's resume callback to runtime resume its
  525. * children to implement remote wakeup signaling, this causes
  526. * rtsx_usb_ms' runtime resume callback runs after its suspend
  527. * callback:
  528. * rtsx_usb_ms_suspend()
  529. * rtsx_usb_resume()
  530. * -> rtsx_usb_ms_runtime_resume()
  531. * -> memstick_detect_change()
  532. *
  533. * rtsx_usb_suspend()
  534. *
  535. * To avoid this, skip runtime resume/suspend if system suspend is
  536. * underway.
  537. */
  538. host->system_suspending = true;
  539. memstick_suspend_host(msh);
  540. return 0;
  541. }
  542. static int rtsx_usb_ms_resume(struct device *dev)
  543. {
  544. struct rtsx_usb_ms *host = dev_get_drvdata(dev);
  545. struct memstick_host *msh = host->msh;
  546. memstick_resume_host(msh);
  547. host->system_suspending = false;
  548. return 0;
  549. }
  550. #endif /* CONFIG_PM_SLEEP */
  551. #ifdef CONFIG_PM
  552. static int rtsx_usb_ms_runtime_suspend(struct device *dev)
  553. {
  554. struct rtsx_usb_ms *host = dev_get_drvdata(dev);
  555. if (host->system_suspending)
  556. return 0;
  557. if (host->msh->card || host->power_mode != MEMSTICK_POWER_OFF)
  558. return -EAGAIN;
  559. return 0;
  560. }
  561. static int rtsx_usb_ms_runtime_resume(struct device *dev)
  562. {
  563. struct rtsx_usb_ms *host = dev_get_drvdata(dev);
  564. if (host->system_suspending)
  565. return 0;
  566. memstick_detect_change(host->msh);
  567. return 0;
  568. }
  569. #endif /* CONFIG_PM */
  570. static const struct dev_pm_ops rtsx_usb_ms_pm_ops = {
  571. SET_SYSTEM_SLEEP_PM_OPS(rtsx_usb_ms_suspend, rtsx_usb_ms_resume)
  572. SET_RUNTIME_PM_OPS(rtsx_usb_ms_runtime_suspend, rtsx_usb_ms_runtime_resume, NULL)
  573. };
  574. static void rtsx_usb_ms_poll_card(struct work_struct *work)
  575. {
  576. struct rtsx_usb_ms *host = container_of(work, struct rtsx_usb_ms,
  577. poll_card.work);
  578. struct rtsx_ucr *ucr = host->ucr;
  579. int err;
  580. u8 val;
  581. if (host->eject || host->power_mode != MEMSTICK_POWER_ON)
  582. return;
  583. pm_runtime_get_sync(ms_dev(host));
  584. mutex_lock(&ucr->dev_mutex);
  585. /* Check pending MS card changes */
  586. err = rtsx_usb_read_register(ucr, CARD_INT_PEND, &val);
  587. if (err) {
  588. mutex_unlock(&ucr->dev_mutex);
  589. goto poll_again;
  590. }
  591. /* Clear the pending */
  592. rtsx_usb_write_register(ucr, CARD_INT_PEND,
  593. XD_INT | MS_INT | SD_INT,
  594. XD_INT | MS_INT | SD_INT);
  595. mutex_unlock(&ucr->dev_mutex);
  596. if (val & MS_INT) {
  597. dev_dbg(ms_dev(host), "MS slot change detected\n");
  598. memstick_detect_change(host->msh);
  599. }
  600. poll_again:
  601. pm_runtime_put_sync(ms_dev(host));
  602. if (!host->eject && host->power_mode == MEMSTICK_POWER_ON)
  603. schedule_delayed_work(&host->poll_card, 100);
  604. }
  605. static int rtsx_usb_ms_drv_probe(struct platform_device *pdev)
  606. {
  607. struct memstick_host *msh;
  608. struct rtsx_usb_ms *host;
  609. struct rtsx_ucr *ucr;
  610. int err;
  611. ucr = usb_get_intfdata(to_usb_interface(pdev->dev.parent));
  612. if (!ucr)
  613. return -ENXIO;
  614. dev_dbg(&(pdev->dev),
  615. "Realtek USB Memstick controller found\n");
  616. msh = memstick_alloc_host(sizeof(*host), &pdev->dev);
  617. if (!msh)
  618. return -ENOMEM;
  619. host = memstick_priv(msh);
  620. host->ucr = ucr;
  621. host->msh = msh;
  622. host->pdev = pdev;
  623. host->power_mode = MEMSTICK_POWER_OFF;
  624. platform_set_drvdata(pdev, host);
  625. mutex_init(&host->host_mutex);
  626. INIT_WORK(&host->handle_req, rtsx_usb_ms_handle_req);
  627. INIT_DELAYED_WORK(&host->poll_card, rtsx_usb_ms_poll_card);
  628. msh->request = rtsx_usb_ms_request;
  629. msh->set_param = rtsx_usb_ms_set_param;
  630. msh->caps = MEMSTICK_CAP_PAR4;
  631. pm_runtime_get_noresume(ms_dev(host));
  632. pm_runtime_set_active(ms_dev(host));
  633. pm_runtime_enable(ms_dev(host));
  634. err = memstick_add_host(msh);
  635. if (err)
  636. goto err_out;
  637. pm_runtime_put(ms_dev(host));
  638. return 0;
  639. err_out:
  640. pm_runtime_disable(ms_dev(host));
  641. pm_runtime_put_noidle(ms_dev(host));
  642. memstick_free_host(msh);
  643. return err;
  644. }
  645. static int rtsx_usb_ms_drv_remove(struct platform_device *pdev)
  646. {
  647. struct rtsx_usb_ms *host = platform_get_drvdata(pdev);
  648. struct memstick_host *msh = host->msh;
  649. int err;
  650. host->eject = true;
  651. cancel_work_sync(&host->handle_req);
  652. mutex_lock(&host->host_mutex);
  653. if (host->req) {
  654. dev_dbg(ms_dev(host),
  655. "%s: Controller removed during transfer\n",
  656. dev_name(&msh->dev));
  657. host->req->error = -ENOMEDIUM;
  658. do {
  659. err = memstick_next_req(msh, &host->req);
  660. if (!err)
  661. host->req->error = -ENOMEDIUM;
  662. } while (!err);
  663. }
  664. mutex_unlock(&host->host_mutex);
  665. /* Balance possible unbalanced usage count
  666. * e.g. unconditional module removal
  667. */
  668. if (pm_runtime_active(ms_dev(host)))
  669. pm_runtime_put(ms_dev(host));
  670. pm_runtime_disable(ms_dev(host));
  671. memstick_remove_host(msh);
  672. dev_dbg(ms_dev(host),
  673. ": Realtek USB Memstick controller has been removed\n");
  674. memstick_free_host(msh);
  675. platform_set_drvdata(pdev, NULL);
  676. return 0;
  677. }
  678. static struct platform_device_id rtsx_usb_ms_ids[] = {
  679. {
  680. .name = "rtsx_usb_ms",
  681. }, {
  682. /* sentinel */
  683. }
  684. };
  685. MODULE_DEVICE_TABLE(platform, rtsx_usb_ms_ids);
  686. static struct platform_driver rtsx_usb_ms_driver = {
  687. .probe = rtsx_usb_ms_drv_probe,
  688. .remove = rtsx_usb_ms_drv_remove,
  689. .id_table = rtsx_usb_ms_ids,
  690. .driver = {
  691. .name = "rtsx_usb_ms",
  692. .pm = &rtsx_usb_ms_pm_ops,
  693. },
  694. };
  695. module_platform_driver(rtsx_usb_ms_driver);
  696. MODULE_LICENSE("GPL v2");
  697. MODULE_AUTHOR("Roger Tseng <[email protected]>");
  698. MODULE_DESCRIPTION("Realtek USB Memstick Card Host Driver");