rtsx_usb_ms.c 21 KB

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