toshsd.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710
  1. /*
  2. * Toshiba PCI Secure Digital Host Controller Interface driver
  3. *
  4. * Copyright (C) 2014 Ondrej Zary
  5. * Copyright (C) 2007 Richard Betts, All Rights Reserved.
  6. *
  7. * Based on asic3_mmc.c, copyright (c) 2005 SDG Systems, LLC and,
  8. * sdhci.c, copyright (C) 2005-2006 Pierre Ossman
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or (at
  13. * your option) any later version.
  14. */
  15. #include <linux/delay.h>
  16. #include <linux/device.h>
  17. #include <linux/module.h>
  18. #include <linux/pci.h>
  19. #include <linux/scatterlist.h>
  20. #include <linux/interrupt.h>
  21. #include <linux/io.h>
  22. #include <linux/pm.h>
  23. #include <linux/pm_runtime.h>
  24. #include <linux/mmc/host.h>
  25. #include <linux/mmc/mmc.h>
  26. #include "toshsd.h"
  27. #define DRIVER_NAME "toshsd"
  28. static const struct pci_device_id pci_ids[] = {
  29. { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA, 0x0805) },
  30. { /* end: all zeroes */ },
  31. };
  32. MODULE_DEVICE_TABLE(pci, pci_ids);
  33. static void toshsd_init(struct toshsd_host *host)
  34. {
  35. /* enable clock */
  36. pci_write_config_byte(host->pdev, SD_PCICFG_CLKSTOP,
  37. SD_PCICFG_CLKSTOP_ENABLE_ALL);
  38. pci_write_config_byte(host->pdev, SD_PCICFG_CARDDETECT, 2);
  39. /* reset */
  40. iowrite16(0, host->ioaddr + SD_SOFTWARERESET); /* assert */
  41. mdelay(2);
  42. iowrite16(1, host->ioaddr + SD_SOFTWARERESET); /* deassert */
  43. mdelay(2);
  44. /* Clear card registers */
  45. iowrite16(0, host->ioaddr + SD_CARDCLOCKCTRL);
  46. iowrite32(0, host->ioaddr + SD_CARDSTATUS);
  47. iowrite32(0, host->ioaddr + SD_ERRORSTATUS0);
  48. iowrite16(0, host->ioaddr + SD_STOPINTERNAL);
  49. /* SDIO clock? */
  50. iowrite16(0x100, host->ioaddr + SDIO_BASE + SDIO_CLOCKNWAITCTRL);
  51. /* enable LED */
  52. pci_write_config_byte(host->pdev, SD_PCICFG_SDLED_ENABLE1,
  53. SD_PCICFG_LED_ENABLE1_START);
  54. pci_write_config_byte(host->pdev, SD_PCICFG_SDLED_ENABLE2,
  55. SD_PCICFG_LED_ENABLE2_START);
  56. /* set interrupt masks */
  57. iowrite32(~(u32)(SD_CARD_RESP_END | SD_CARD_RW_END
  58. | SD_CARD_CARD_REMOVED_0 | SD_CARD_CARD_INSERTED_0
  59. | SD_BUF_READ_ENABLE | SD_BUF_WRITE_ENABLE
  60. | SD_BUF_CMD_TIMEOUT),
  61. host->ioaddr + SD_INTMASKCARD);
  62. iowrite16(0x1000, host->ioaddr + SD_TRANSACTIONCTRL);
  63. }
  64. /* Set MMC clock / power.
  65. * Note: This controller uses a simple divider scheme therefore it cannot run
  66. * SD/MMC cards at full speed (24/20MHz). HCLK (=33MHz PCI clock?) is too high
  67. * and the next slowest is 16MHz (div=2).
  68. */
  69. static void __toshsd_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
  70. {
  71. struct toshsd_host *host = mmc_priv(mmc);
  72. if (ios->clock) {
  73. u16 clk;
  74. int div = 1;
  75. while (ios->clock < HCLK / div)
  76. div *= 2;
  77. clk = div >> 2;
  78. if (div == 1) { /* disable the divider */
  79. pci_write_config_byte(host->pdev, SD_PCICFG_CLKMODE,
  80. SD_PCICFG_CLKMODE_DIV_DISABLE);
  81. clk |= SD_CARDCLK_DIV_DISABLE;
  82. } else
  83. pci_write_config_byte(host->pdev, SD_PCICFG_CLKMODE, 0);
  84. clk |= SD_CARDCLK_ENABLE_CLOCK;
  85. iowrite16(clk, host->ioaddr + SD_CARDCLOCKCTRL);
  86. mdelay(10);
  87. } else
  88. iowrite16(0, host->ioaddr + SD_CARDCLOCKCTRL);
  89. switch (ios->power_mode) {
  90. case MMC_POWER_OFF:
  91. pci_write_config_byte(host->pdev, SD_PCICFG_POWER1,
  92. SD_PCICFG_PWR1_OFF);
  93. mdelay(1);
  94. break;
  95. case MMC_POWER_UP:
  96. break;
  97. case MMC_POWER_ON:
  98. pci_write_config_byte(host->pdev, SD_PCICFG_POWER1,
  99. SD_PCICFG_PWR1_33V);
  100. pci_write_config_byte(host->pdev, SD_PCICFG_POWER2,
  101. SD_PCICFG_PWR2_AUTO);
  102. mdelay(20);
  103. break;
  104. }
  105. switch (ios->bus_width) {
  106. case MMC_BUS_WIDTH_1:
  107. iowrite16(SD_CARDOPT_REQUIRED | SD_CARDOPT_DATA_RESP_TIMEOUT(14)
  108. | SD_CARDOPT_C2_MODULE_ABSENT
  109. | SD_CARDOPT_DATA_XFR_WIDTH_1,
  110. host->ioaddr + SD_CARDOPTIONSETUP);
  111. break;
  112. case MMC_BUS_WIDTH_4:
  113. iowrite16(SD_CARDOPT_REQUIRED | SD_CARDOPT_DATA_RESP_TIMEOUT(14)
  114. | SD_CARDOPT_C2_MODULE_ABSENT
  115. | SD_CARDOPT_DATA_XFR_WIDTH_4,
  116. host->ioaddr + SD_CARDOPTIONSETUP);
  117. break;
  118. }
  119. }
  120. static void toshsd_set_led(struct toshsd_host *host, unsigned char state)
  121. {
  122. iowrite16(state, host->ioaddr + SDIO_BASE + SDIO_LEDCTRL);
  123. }
  124. static void toshsd_finish_request(struct toshsd_host *host)
  125. {
  126. struct mmc_request *mrq = host->mrq;
  127. /* Write something to end the command */
  128. host->mrq = NULL;
  129. host->cmd = NULL;
  130. host->data = NULL;
  131. toshsd_set_led(host, 0);
  132. mmc_request_done(host->mmc, mrq);
  133. }
  134. static irqreturn_t toshsd_thread_irq(int irq, void *dev_id)
  135. {
  136. struct toshsd_host *host = dev_id;
  137. struct mmc_data *data = host->data;
  138. struct sg_mapping_iter *sg_miter = &host->sg_miter;
  139. unsigned short *buf;
  140. int count;
  141. unsigned long flags;
  142. if (!data) {
  143. dev_warn(&host->pdev->dev, "Spurious Data IRQ\n");
  144. if (host->cmd) {
  145. host->cmd->error = -EIO;
  146. toshsd_finish_request(host);
  147. }
  148. return IRQ_NONE;
  149. }
  150. spin_lock_irqsave(&host->lock, flags);
  151. if (!sg_miter_next(sg_miter))
  152. goto done;
  153. buf = sg_miter->addr;
  154. /* Ensure we dont read more than one block. The chip will interrupt us
  155. * When the next block is available.
  156. */
  157. count = sg_miter->length;
  158. if (count > data->blksz)
  159. count = data->blksz;
  160. dev_dbg(&host->pdev->dev, "count: %08x, flags %08x\n", count,
  161. data->flags);
  162. /* Transfer the data */
  163. if (data->flags & MMC_DATA_READ)
  164. ioread32_rep(host->ioaddr + SD_DATAPORT, buf, count >> 2);
  165. else
  166. iowrite32_rep(host->ioaddr + SD_DATAPORT, buf, count >> 2);
  167. sg_miter->consumed = count;
  168. sg_miter_stop(sg_miter);
  169. done:
  170. spin_unlock_irqrestore(&host->lock, flags);
  171. return IRQ_HANDLED;
  172. }
  173. static void toshsd_cmd_irq(struct toshsd_host *host)
  174. {
  175. struct mmc_command *cmd = host->cmd;
  176. u8 *buf;
  177. u16 data;
  178. if (!host->cmd) {
  179. dev_warn(&host->pdev->dev, "Spurious CMD irq\n");
  180. return;
  181. }
  182. buf = (u8 *)cmd->resp;
  183. host->cmd = NULL;
  184. if (cmd->flags & MMC_RSP_PRESENT && cmd->flags & MMC_RSP_136) {
  185. /* R2 */
  186. buf[12] = 0xff;
  187. data = ioread16(host->ioaddr + SD_RESPONSE0);
  188. buf[13] = data & 0xff;
  189. buf[14] = data >> 8;
  190. data = ioread16(host->ioaddr + SD_RESPONSE1);
  191. buf[15] = data & 0xff;
  192. buf[8] = data >> 8;
  193. data = ioread16(host->ioaddr + SD_RESPONSE2);
  194. buf[9] = data & 0xff;
  195. buf[10] = data >> 8;
  196. data = ioread16(host->ioaddr + SD_RESPONSE3);
  197. buf[11] = data & 0xff;
  198. buf[4] = data >> 8;
  199. data = ioread16(host->ioaddr + SD_RESPONSE4);
  200. buf[5] = data & 0xff;
  201. buf[6] = data >> 8;
  202. data = ioread16(host->ioaddr + SD_RESPONSE5);
  203. buf[7] = data & 0xff;
  204. buf[0] = data >> 8;
  205. data = ioread16(host->ioaddr + SD_RESPONSE6);
  206. buf[1] = data & 0xff;
  207. buf[2] = data >> 8;
  208. data = ioread16(host->ioaddr + SD_RESPONSE7);
  209. buf[3] = data & 0xff;
  210. } else if (cmd->flags & MMC_RSP_PRESENT) {
  211. /* R1, R1B, R3, R6, R7 */
  212. data = ioread16(host->ioaddr + SD_RESPONSE0);
  213. buf[0] = data & 0xff;
  214. buf[1] = data >> 8;
  215. data = ioread16(host->ioaddr + SD_RESPONSE1);
  216. buf[2] = data & 0xff;
  217. buf[3] = data >> 8;
  218. }
  219. dev_dbg(&host->pdev->dev, "Command IRQ complete %d %d %x\n",
  220. cmd->opcode, cmd->error, cmd->flags);
  221. /* If there is data to handle we will
  222. * finish the request in the mmc_data_end_irq handler.*/
  223. if (host->data)
  224. return;
  225. toshsd_finish_request(host);
  226. }
  227. static void toshsd_data_end_irq(struct toshsd_host *host)
  228. {
  229. struct mmc_data *data = host->data;
  230. host->data = NULL;
  231. if (!data) {
  232. dev_warn(&host->pdev->dev, "Spurious data end IRQ\n");
  233. return;
  234. }
  235. if (data->error == 0)
  236. data->bytes_xfered = data->blocks * data->blksz;
  237. else
  238. data->bytes_xfered = 0;
  239. dev_dbg(&host->pdev->dev, "Completed data request xfr=%d\n",
  240. data->bytes_xfered);
  241. iowrite16(0, host->ioaddr + SD_STOPINTERNAL);
  242. toshsd_finish_request(host);
  243. }
  244. static irqreturn_t toshsd_irq(int irq, void *dev_id)
  245. {
  246. struct toshsd_host *host = dev_id;
  247. u32 int_reg, int_mask, int_status, detail;
  248. int error = 0, ret = IRQ_HANDLED;
  249. spin_lock(&host->lock);
  250. int_status = ioread32(host->ioaddr + SD_CARDSTATUS);
  251. int_mask = ioread32(host->ioaddr + SD_INTMASKCARD);
  252. int_reg = int_status & ~int_mask & ~IRQ_DONT_CARE_BITS;
  253. dev_dbg(&host->pdev->dev, "IRQ status:%x mask:%x\n",
  254. int_status, int_mask);
  255. /* nothing to do: it's not our IRQ */
  256. if (!int_reg) {
  257. ret = IRQ_NONE;
  258. goto irq_end;
  259. }
  260. if (int_reg & SD_BUF_CMD_TIMEOUT) {
  261. error = -ETIMEDOUT;
  262. dev_dbg(&host->pdev->dev, "Timeout\n");
  263. } else if (int_reg & SD_BUF_CRC_ERR) {
  264. error = -EILSEQ;
  265. dev_err(&host->pdev->dev, "BadCRC\n");
  266. } else if (int_reg & (SD_BUF_ILLEGAL_ACCESS
  267. | SD_BUF_CMD_INDEX_ERR
  268. | SD_BUF_STOP_BIT_END_ERR
  269. | SD_BUF_OVERFLOW
  270. | SD_BUF_UNDERFLOW
  271. | SD_BUF_DATA_TIMEOUT)) {
  272. dev_err(&host->pdev->dev, "Buffer status error: { %s%s%s%s%s%s}\n",
  273. int_reg & SD_BUF_ILLEGAL_ACCESS ? "ILLEGAL_ACC " : "",
  274. int_reg & SD_BUF_CMD_INDEX_ERR ? "CMD_INDEX " : "",
  275. int_reg & SD_BUF_STOP_BIT_END_ERR ? "STOPBIT_END " : "",
  276. int_reg & SD_BUF_OVERFLOW ? "OVERFLOW " : "",
  277. int_reg & SD_BUF_UNDERFLOW ? "UNDERFLOW " : "",
  278. int_reg & SD_BUF_DATA_TIMEOUT ? "DATA_TIMEOUT " : "");
  279. detail = ioread32(host->ioaddr + SD_ERRORSTATUS0);
  280. dev_err(&host->pdev->dev, "detail error status { %s%s%s%s%s%s%s%s%s%s%s%s%s}\n",
  281. detail & SD_ERR0_RESP_CMD_ERR ? "RESP_CMD " : "",
  282. detail & SD_ERR0_RESP_NON_CMD12_END_BIT_ERR ? "RESP_END_BIT " : "",
  283. detail & SD_ERR0_RESP_CMD12_END_BIT_ERR ? "RESP_END_BIT " : "",
  284. detail & SD_ERR0_READ_DATA_END_BIT_ERR ? "READ_DATA_END_BIT " : "",
  285. detail & SD_ERR0_WRITE_CRC_STATUS_END_BIT_ERR ? "WRITE_CMD_END_BIT " : "",
  286. detail & SD_ERR0_RESP_NON_CMD12_CRC_ERR ? "RESP_CRC " : "",
  287. detail & SD_ERR0_RESP_CMD12_CRC_ERR ? "RESP_CRC " : "",
  288. detail & SD_ERR0_READ_DATA_CRC_ERR ? "READ_DATA_CRC " : "",
  289. detail & SD_ERR0_WRITE_CMD_CRC_ERR ? "WRITE_CMD_CRC " : "",
  290. detail & SD_ERR1_NO_CMD_RESP ? "NO_CMD_RESP " : "",
  291. detail & SD_ERR1_TIMEOUT_READ_DATA ? "READ_DATA_TIMEOUT " : "",
  292. detail & SD_ERR1_TIMEOUT_CRS_STATUS ? "CRS_STATUS_TIMEOUT " : "",
  293. detail & SD_ERR1_TIMEOUT_CRC_BUSY ? "CRC_BUSY_TIMEOUT " : "");
  294. error = -EIO;
  295. }
  296. if (error) {
  297. if (host->cmd)
  298. host->cmd->error = error;
  299. if (error == -ETIMEDOUT) {
  300. iowrite32(int_status &
  301. ~(SD_BUF_CMD_TIMEOUT | SD_CARD_RESP_END),
  302. host->ioaddr + SD_CARDSTATUS);
  303. } else {
  304. toshsd_init(host);
  305. __toshsd_set_ios(host->mmc, &host->mmc->ios);
  306. goto irq_end;
  307. }
  308. }
  309. /* Card insert/remove. The mmc controlling code is stateless. */
  310. if (int_reg & (SD_CARD_CARD_INSERTED_0 | SD_CARD_CARD_REMOVED_0)) {
  311. iowrite32(int_status &
  312. ~(SD_CARD_CARD_REMOVED_0 | SD_CARD_CARD_INSERTED_0),
  313. host->ioaddr + SD_CARDSTATUS);
  314. if (int_reg & SD_CARD_CARD_INSERTED_0)
  315. toshsd_init(host);
  316. mmc_detect_change(host->mmc, 1);
  317. }
  318. /* Data transfer */
  319. if (int_reg & (SD_BUF_READ_ENABLE | SD_BUF_WRITE_ENABLE)) {
  320. iowrite32(int_status &
  321. ~(SD_BUF_WRITE_ENABLE | SD_BUF_READ_ENABLE),
  322. host->ioaddr + SD_CARDSTATUS);
  323. ret = IRQ_WAKE_THREAD;
  324. goto irq_end;
  325. }
  326. /* Command completion */
  327. if (int_reg & SD_CARD_RESP_END) {
  328. iowrite32(int_status & ~(SD_CARD_RESP_END),
  329. host->ioaddr + SD_CARDSTATUS);
  330. toshsd_cmd_irq(host);
  331. }
  332. /* Data transfer completion */
  333. if (int_reg & SD_CARD_RW_END) {
  334. iowrite32(int_status & ~(SD_CARD_RW_END),
  335. host->ioaddr + SD_CARDSTATUS);
  336. toshsd_data_end_irq(host);
  337. }
  338. irq_end:
  339. spin_unlock(&host->lock);
  340. return ret;
  341. }
  342. static void toshsd_start_cmd(struct toshsd_host *host, struct mmc_command *cmd)
  343. {
  344. struct mmc_data *data = host->data;
  345. int c = cmd->opcode;
  346. dev_dbg(&host->pdev->dev, "Command opcode: %d\n", cmd->opcode);
  347. if (cmd->opcode == MMC_STOP_TRANSMISSION) {
  348. iowrite16(SD_STOPINT_ISSUE_CMD12,
  349. host->ioaddr + SD_STOPINTERNAL);
  350. cmd->resp[0] = cmd->opcode;
  351. cmd->resp[1] = 0;
  352. cmd->resp[2] = 0;
  353. cmd->resp[3] = 0;
  354. toshsd_finish_request(host);
  355. return;
  356. }
  357. switch (mmc_resp_type(cmd)) {
  358. case MMC_RSP_NONE:
  359. c |= SD_CMD_RESP_TYPE_NONE;
  360. break;
  361. case MMC_RSP_R1:
  362. c |= SD_CMD_RESP_TYPE_EXT_R1;
  363. break;
  364. case MMC_RSP_R1B:
  365. c |= SD_CMD_RESP_TYPE_EXT_R1B;
  366. break;
  367. case MMC_RSP_R2:
  368. c |= SD_CMD_RESP_TYPE_EXT_R2;
  369. break;
  370. case MMC_RSP_R3:
  371. c |= SD_CMD_RESP_TYPE_EXT_R3;
  372. break;
  373. default:
  374. dev_err(&host->pdev->dev, "Unknown response type %d\n",
  375. mmc_resp_type(cmd));
  376. break;
  377. }
  378. host->cmd = cmd;
  379. if (cmd->opcode == MMC_APP_CMD)
  380. c |= SD_CMD_TYPE_ACMD;
  381. if (cmd->opcode == MMC_GO_IDLE_STATE)
  382. c |= (3 << 8); /* removed from ipaq-asic3.h for some reason */
  383. if (data) {
  384. c |= SD_CMD_DATA_PRESENT;
  385. if (data->blocks > 1) {
  386. iowrite16(SD_STOPINT_AUTO_ISSUE_CMD12,
  387. host->ioaddr + SD_STOPINTERNAL);
  388. c |= SD_CMD_MULTI_BLOCK;
  389. }
  390. if (data->flags & MMC_DATA_READ)
  391. c |= SD_CMD_TRANSFER_READ;
  392. /* MMC_DATA_WRITE does not require a bit to be set */
  393. }
  394. /* Send the command */
  395. iowrite32(cmd->arg, host->ioaddr + SD_ARG0);
  396. iowrite16(c, host->ioaddr + SD_CMD);
  397. }
  398. static void toshsd_start_data(struct toshsd_host *host, struct mmc_data *data)
  399. {
  400. unsigned int flags = SG_MITER_ATOMIC;
  401. dev_dbg(&host->pdev->dev, "setup data transfer: blocksize %08x nr_blocks %d, offset: %08x\n",
  402. data->blksz, data->blocks, data->sg->offset);
  403. host->data = data;
  404. if (data->flags & MMC_DATA_READ)
  405. flags |= SG_MITER_TO_SG;
  406. else
  407. flags |= SG_MITER_FROM_SG;
  408. sg_miter_start(&host->sg_miter, data->sg, data->sg_len, flags);
  409. /* Set transfer length and blocksize */
  410. iowrite16(data->blocks, host->ioaddr + SD_BLOCKCOUNT);
  411. iowrite16(data->blksz, host->ioaddr + SD_CARDXFERDATALEN);
  412. }
  413. /* Process requests from the MMC layer */
  414. static void toshsd_request(struct mmc_host *mmc, struct mmc_request *mrq)
  415. {
  416. struct toshsd_host *host = mmc_priv(mmc);
  417. unsigned long flags;
  418. /* abort if card not present */
  419. if (!(ioread16(host->ioaddr + SD_CARDSTATUS) & SD_CARD_PRESENT_0)) {
  420. mrq->cmd->error = -ENOMEDIUM;
  421. mmc_request_done(mmc, mrq);
  422. return;
  423. }
  424. spin_lock_irqsave(&host->lock, flags);
  425. WARN_ON(host->mrq != NULL);
  426. host->mrq = mrq;
  427. if (mrq->data)
  428. toshsd_start_data(host, mrq->data);
  429. toshsd_set_led(host, 1);
  430. toshsd_start_cmd(host, mrq->cmd);
  431. spin_unlock_irqrestore(&host->lock, flags);
  432. }
  433. static void toshsd_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
  434. {
  435. struct toshsd_host *host = mmc_priv(mmc);
  436. unsigned long flags;
  437. spin_lock_irqsave(&host->lock, flags);
  438. __toshsd_set_ios(mmc, ios);
  439. spin_unlock_irqrestore(&host->lock, flags);
  440. }
  441. static int toshsd_get_ro(struct mmc_host *mmc)
  442. {
  443. struct toshsd_host *host = mmc_priv(mmc);
  444. /* active low */
  445. return !(ioread16(host->ioaddr + SD_CARDSTATUS) & SD_CARD_WRITE_PROTECT);
  446. }
  447. static int toshsd_get_cd(struct mmc_host *mmc)
  448. {
  449. struct toshsd_host *host = mmc_priv(mmc);
  450. return !!(ioread16(host->ioaddr + SD_CARDSTATUS) & SD_CARD_PRESENT_0);
  451. }
  452. static struct mmc_host_ops toshsd_ops = {
  453. .request = toshsd_request,
  454. .set_ios = toshsd_set_ios,
  455. .get_ro = toshsd_get_ro,
  456. .get_cd = toshsd_get_cd,
  457. };
  458. static void toshsd_powerdown(struct toshsd_host *host)
  459. {
  460. /* mask all interrupts */
  461. iowrite32(0xffffffff, host->ioaddr + SD_INTMASKCARD);
  462. /* disable card clock */
  463. iowrite16(0x000, host->ioaddr + SDIO_BASE + SDIO_CLOCKNWAITCTRL);
  464. iowrite16(0, host->ioaddr + SD_CARDCLOCKCTRL);
  465. /* power down card */
  466. pci_write_config_byte(host->pdev, SD_PCICFG_POWER1, SD_PCICFG_PWR1_OFF);
  467. /* disable clock */
  468. pci_write_config_byte(host->pdev, SD_PCICFG_CLKSTOP, 0);
  469. }
  470. #ifdef CONFIG_PM_SLEEP
  471. static int toshsd_pm_suspend(struct device *dev)
  472. {
  473. struct pci_dev *pdev = to_pci_dev(dev);
  474. struct toshsd_host *host = pci_get_drvdata(pdev);
  475. toshsd_powerdown(host);
  476. pci_save_state(pdev);
  477. pci_enable_wake(pdev, PCI_D3hot, 0);
  478. pci_disable_device(pdev);
  479. pci_set_power_state(pdev, PCI_D3hot);
  480. return 0;
  481. }
  482. static int toshsd_pm_resume(struct device *dev)
  483. {
  484. struct pci_dev *pdev = to_pci_dev(dev);
  485. struct toshsd_host *host = pci_get_drvdata(pdev);
  486. int ret;
  487. pci_set_power_state(pdev, PCI_D0);
  488. pci_restore_state(pdev);
  489. ret = pci_enable_device(pdev);
  490. if (ret)
  491. return ret;
  492. toshsd_init(host);
  493. return 0;
  494. }
  495. #endif /* CONFIG_PM_SLEEP */
  496. static int toshsd_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
  497. {
  498. int ret;
  499. struct toshsd_host *host;
  500. struct mmc_host *mmc;
  501. resource_size_t base;
  502. ret = pci_enable_device(pdev);
  503. if (ret)
  504. return ret;
  505. mmc = mmc_alloc_host(sizeof(struct toshsd_host), &pdev->dev);
  506. if (!mmc) {
  507. ret = -ENOMEM;
  508. goto err;
  509. }
  510. host = mmc_priv(mmc);
  511. host->mmc = mmc;
  512. host->pdev = pdev;
  513. pci_set_drvdata(pdev, host);
  514. ret = pci_request_regions(pdev, DRIVER_NAME);
  515. if (ret)
  516. goto free;
  517. host->ioaddr = pci_iomap(pdev, 0, 0);
  518. if (!host->ioaddr) {
  519. ret = -ENOMEM;
  520. goto release;
  521. }
  522. /* Set MMC host parameters */
  523. mmc->ops = &toshsd_ops;
  524. mmc->caps = MMC_CAP_4_BIT_DATA;
  525. mmc->ocr_avail = MMC_VDD_32_33;
  526. mmc->f_min = HCLK / 512;
  527. mmc->f_max = HCLK;
  528. spin_lock_init(&host->lock);
  529. toshsd_init(host);
  530. ret = request_threaded_irq(pdev->irq, toshsd_irq, toshsd_thread_irq,
  531. IRQF_SHARED, DRIVER_NAME, host);
  532. if (ret)
  533. goto unmap;
  534. mmc_add_host(mmc);
  535. base = pci_resource_start(pdev, 0);
  536. dev_dbg(&pdev->dev, "MMIO %pa, IRQ %d\n", &base, pdev->irq);
  537. pm_suspend_ignore_children(&pdev->dev, 1);
  538. return 0;
  539. unmap:
  540. pci_iounmap(pdev, host->ioaddr);
  541. release:
  542. pci_release_regions(pdev);
  543. free:
  544. mmc_free_host(mmc);
  545. pci_set_drvdata(pdev, NULL);
  546. err:
  547. pci_disable_device(pdev);
  548. return ret;
  549. }
  550. static void toshsd_remove(struct pci_dev *pdev)
  551. {
  552. struct toshsd_host *host = pci_get_drvdata(pdev);
  553. mmc_remove_host(host->mmc);
  554. toshsd_powerdown(host);
  555. free_irq(pdev->irq, host);
  556. pci_iounmap(pdev, host->ioaddr);
  557. pci_release_regions(pdev);
  558. mmc_free_host(host->mmc);
  559. pci_set_drvdata(pdev, NULL);
  560. pci_disable_device(pdev);
  561. }
  562. static const struct dev_pm_ops toshsd_pm_ops = {
  563. SET_SYSTEM_SLEEP_PM_OPS(toshsd_pm_suspend, toshsd_pm_resume)
  564. };
  565. static struct pci_driver toshsd_driver = {
  566. .name = DRIVER_NAME,
  567. .id_table = pci_ids,
  568. .probe = toshsd_probe,
  569. .remove = toshsd_remove,
  570. .driver.pm = &toshsd_pm_ops,
  571. };
  572. module_pci_driver(toshsd_driver);
  573. MODULE_AUTHOR("Ondrej Zary, Richard Betts");
  574. MODULE_DESCRIPTION("Toshiba PCI Secure Digital Host Controller Interface driver");
  575. MODULE_LICENSE("GPL");