jz4740_mmc.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922
  1. /*
  2. * Copyright (C) 2009-2010, Lars-Peter Clausen <lars@metafoo.de>
  3. * JZ4740 SD/MMC controller driver
  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 as published by the
  7. * Free Software Foundation; either version 2 of the License, or (at your
  8. * option) any later version.
  9. *
  10. * You should have received a copy of the GNU General Public License along
  11. * with this program; if not, write to the Free Software Foundation, Inc.,
  12. * 675 Mass Ave, Cambridge, MA 02139, USA.
  13. *
  14. */
  15. #include <linux/mmc/host.h>
  16. #include <linux/mmc/slot-gpio.h>
  17. #include <linux/err.h>
  18. #include <linux/io.h>
  19. #include <linux/irq.h>
  20. #include <linux/interrupt.h>
  21. #include <linux/module.h>
  22. #include <linux/platform_device.h>
  23. #include <linux/delay.h>
  24. #include <linux/scatterlist.h>
  25. #include <linux/clk.h>
  26. #include <linux/bitops.h>
  27. #include <linux/gpio.h>
  28. #include <asm/mach-jz4740/gpio.h>
  29. #include <asm/cacheflush.h>
  30. #include <linux/dma-mapping.h>
  31. #include <asm/mach-jz4740/jz4740_mmc.h>
  32. #define JZ_REG_MMC_STRPCL 0x00
  33. #define JZ_REG_MMC_STATUS 0x04
  34. #define JZ_REG_MMC_CLKRT 0x08
  35. #define JZ_REG_MMC_CMDAT 0x0C
  36. #define JZ_REG_MMC_RESTO 0x10
  37. #define JZ_REG_MMC_RDTO 0x14
  38. #define JZ_REG_MMC_BLKLEN 0x18
  39. #define JZ_REG_MMC_NOB 0x1C
  40. #define JZ_REG_MMC_SNOB 0x20
  41. #define JZ_REG_MMC_IMASK 0x24
  42. #define JZ_REG_MMC_IREG 0x28
  43. #define JZ_REG_MMC_CMD 0x2C
  44. #define JZ_REG_MMC_ARG 0x30
  45. #define JZ_REG_MMC_RESP_FIFO 0x34
  46. #define JZ_REG_MMC_RXFIFO 0x38
  47. #define JZ_REG_MMC_TXFIFO 0x3C
  48. #define JZ_MMC_STRPCL_EXIT_MULTIPLE BIT(7)
  49. #define JZ_MMC_STRPCL_EXIT_TRANSFER BIT(6)
  50. #define JZ_MMC_STRPCL_START_READWAIT BIT(5)
  51. #define JZ_MMC_STRPCL_STOP_READWAIT BIT(4)
  52. #define JZ_MMC_STRPCL_RESET BIT(3)
  53. #define JZ_MMC_STRPCL_START_OP BIT(2)
  54. #define JZ_MMC_STRPCL_CLOCK_CONTROL (BIT(1) | BIT(0))
  55. #define JZ_MMC_STRPCL_CLOCK_STOP BIT(0)
  56. #define JZ_MMC_STRPCL_CLOCK_START BIT(1)
  57. #define JZ_MMC_STATUS_IS_RESETTING BIT(15)
  58. #define JZ_MMC_STATUS_SDIO_INT_ACTIVE BIT(14)
  59. #define JZ_MMC_STATUS_PRG_DONE BIT(13)
  60. #define JZ_MMC_STATUS_DATA_TRAN_DONE BIT(12)
  61. #define JZ_MMC_STATUS_END_CMD_RES BIT(11)
  62. #define JZ_MMC_STATUS_DATA_FIFO_AFULL BIT(10)
  63. #define JZ_MMC_STATUS_IS_READWAIT BIT(9)
  64. #define JZ_MMC_STATUS_CLK_EN BIT(8)
  65. #define JZ_MMC_STATUS_DATA_FIFO_FULL BIT(7)
  66. #define JZ_MMC_STATUS_DATA_FIFO_EMPTY BIT(6)
  67. #define JZ_MMC_STATUS_CRC_RES_ERR BIT(5)
  68. #define JZ_MMC_STATUS_CRC_READ_ERROR BIT(4)
  69. #define JZ_MMC_STATUS_TIMEOUT_WRITE BIT(3)
  70. #define JZ_MMC_STATUS_CRC_WRITE_ERROR BIT(2)
  71. #define JZ_MMC_STATUS_TIMEOUT_RES BIT(1)
  72. #define JZ_MMC_STATUS_TIMEOUT_READ BIT(0)
  73. #define JZ_MMC_STATUS_READ_ERROR_MASK (BIT(4) | BIT(0))
  74. #define JZ_MMC_STATUS_WRITE_ERROR_MASK (BIT(3) | BIT(2))
  75. #define JZ_MMC_CMDAT_IO_ABORT BIT(11)
  76. #define JZ_MMC_CMDAT_BUS_WIDTH_4BIT BIT(10)
  77. #define JZ_MMC_CMDAT_DMA_EN BIT(8)
  78. #define JZ_MMC_CMDAT_INIT BIT(7)
  79. #define JZ_MMC_CMDAT_BUSY BIT(6)
  80. #define JZ_MMC_CMDAT_STREAM BIT(5)
  81. #define JZ_MMC_CMDAT_WRITE BIT(4)
  82. #define JZ_MMC_CMDAT_DATA_EN BIT(3)
  83. #define JZ_MMC_CMDAT_RESPONSE_FORMAT (BIT(2) | BIT(1) | BIT(0))
  84. #define JZ_MMC_CMDAT_RSP_R1 1
  85. #define JZ_MMC_CMDAT_RSP_R2 2
  86. #define JZ_MMC_CMDAT_RSP_R3 3
  87. #define JZ_MMC_IRQ_SDIO BIT(7)
  88. #define JZ_MMC_IRQ_TXFIFO_WR_REQ BIT(6)
  89. #define JZ_MMC_IRQ_RXFIFO_RD_REQ BIT(5)
  90. #define JZ_MMC_IRQ_END_CMD_RES BIT(2)
  91. #define JZ_MMC_IRQ_PRG_DONE BIT(1)
  92. #define JZ_MMC_IRQ_DATA_TRAN_DONE BIT(0)
  93. #define JZ_MMC_CLK_RATE 24000000
  94. enum jz4740_mmc_state {
  95. JZ4740_MMC_STATE_READ_RESPONSE,
  96. JZ4740_MMC_STATE_TRANSFER_DATA,
  97. JZ4740_MMC_STATE_SEND_STOP,
  98. JZ4740_MMC_STATE_DONE,
  99. };
  100. struct jz4740_mmc_host {
  101. struct mmc_host *mmc;
  102. struct platform_device *pdev;
  103. struct jz4740_mmc_platform_data *pdata;
  104. struct clk *clk;
  105. int irq;
  106. int card_detect_irq;
  107. void __iomem *base;
  108. struct mmc_request *req;
  109. struct mmc_command *cmd;
  110. unsigned long waiting;
  111. uint32_t cmdat;
  112. uint16_t irq_mask;
  113. spinlock_t lock;
  114. struct timer_list timeout_timer;
  115. struct sg_mapping_iter miter;
  116. enum jz4740_mmc_state state;
  117. };
  118. static void jz4740_mmc_set_irq_enabled(struct jz4740_mmc_host *host,
  119. unsigned int irq, bool enabled)
  120. {
  121. unsigned long flags;
  122. spin_lock_irqsave(&host->lock, flags);
  123. if (enabled)
  124. host->irq_mask &= ~irq;
  125. else
  126. host->irq_mask |= irq;
  127. spin_unlock_irqrestore(&host->lock, flags);
  128. writew(host->irq_mask, host->base + JZ_REG_MMC_IMASK);
  129. }
  130. static void jz4740_mmc_clock_enable(struct jz4740_mmc_host *host,
  131. bool start_transfer)
  132. {
  133. uint16_t val = JZ_MMC_STRPCL_CLOCK_START;
  134. if (start_transfer)
  135. val |= JZ_MMC_STRPCL_START_OP;
  136. writew(val, host->base + JZ_REG_MMC_STRPCL);
  137. }
  138. static void jz4740_mmc_clock_disable(struct jz4740_mmc_host *host)
  139. {
  140. uint32_t status;
  141. unsigned int timeout = 1000;
  142. writew(JZ_MMC_STRPCL_CLOCK_STOP, host->base + JZ_REG_MMC_STRPCL);
  143. do {
  144. status = readl(host->base + JZ_REG_MMC_STATUS);
  145. } while (status & JZ_MMC_STATUS_CLK_EN && --timeout);
  146. }
  147. static void jz4740_mmc_reset(struct jz4740_mmc_host *host)
  148. {
  149. uint32_t status;
  150. unsigned int timeout = 1000;
  151. writew(JZ_MMC_STRPCL_RESET, host->base + JZ_REG_MMC_STRPCL);
  152. udelay(10);
  153. do {
  154. status = readl(host->base + JZ_REG_MMC_STATUS);
  155. } while (status & JZ_MMC_STATUS_IS_RESETTING && --timeout);
  156. }
  157. static void jz4740_mmc_request_done(struct jz4740_mmc_host *host)
  158. {
  159. struct mmc_request *req;
  160. req = host->req;
  161. host->req = NULL;
  162. mmc_request_done(host->mmc, req);
  163. }
  164. static unsigned int jz4740_mmc_poll_irq(struct jz4740_mmc_host *host,
  165. unsigned int irq)
  166. {
  167. unsigned int timeout = 0x800;
  168. uint16_t status;
  169. do {
  170. status = readw(host->base + JZ_REG_MMC_IREG);
  171. } while (!(status & irq) && --timeout);
  172. if (timeout == 0) {
  173. set_bit(0, &host->waiting);
  174. mod_timer(&host->timeout_timer, jiffies + 5*HZ);
  175. jz4740_mmc_set_irq_enabled(host, irq, true);
  176. return true;
  177. }
  178. return false;
  179. }
  180. static void jz4740_mmc_transfer_check_state(struct jz4740_mmc_host *host,
  181. struct mmc_data *data)
  182. {
  183. int status;
  184. status = readl(host->base + JZ_REG_MMC_STATUS);
  185. if (status & JZ_MMC_STATUS_WRITE_ERROR_MASK) {
  186. if (status & (JZ_MMC_STATUS_TIMEOUT_WRITE)) {
  187. host->req->cmd->error = -ETIMEDOUT;
  188. data->error = -ETIMEDOUT;
  189. } else {
  190. host->req->cmd->error = -EIO;
  191. data->error = -EIO;
  192. }
  193. } else if (status & JZ_MMC_STATUS_READ_ERROR_MASK) {
  194. if (status & (JZ_MMC_STATUS_TIMEOUT_READ)) {
  195. host->req->cmd->error = -ETIMEDOUT;
  196. data->error = -ETIMEDOUT;
  197. } else {
  198. host->req->cmd->error = -EIO;
  199. data->error = -EIO;
  200. }
  201. }
  202. }
  203. static bool jz4740_mmc_write_data(struct jz4740_mmc_host *host,
  204. struct mmc_data *data)
  205. {
  206. struct sg_mapping_iter *miter = &host->miter;
  207. void __iomem *fifo_addr = host->base + JZ_REG_MMC_TXFIFO;
  208. uint32_t *buf;
  209. bool timeout;
  210. size_t i, j;
  211. while (sg_miter_next(miter)) {
  212. buf = miter->addr;
  213. i = miter->length / 4;
  214. j = i / 8;
  215. i = i & 0x7;
  216. while (j) {
  217. timeout = jz4740_mmc_poll_irq(host, JZ_MMC_IRQ_TXFIFO_WR_REQ);
  218. if (unlikely(timeout))
  219. goto poll_timeout;
  220. writel(buf[0], fifo_addr);
  221. writel(buf[1], fifo_addr);
  222. writel(buf[2], fifo_addr);
  223. writel(buf[3], fifo_addr);
  224. writel(buf[4], fifo_addr);
  225. writel(buf[5], fifo_addr);
  226. writel(buf[6], fifo_addr);
  227. writel(buf[7], fifo_addr);
  228. buf += 8;
  229. --j;
  230. }
  231. if (unlikely(i)) {
  232. timeout = jz4740_mmc_poll_irq(host, JZ_MMC_IRQ_TXFIFO_WR_REQ);
  233. if (unlikely(timeout))
  234. goto poll_timeout;
  235. while (i) {
  236. writel(*buf, fifo_addr);
  237. ++buf;
  238. --i;
  239. }
  240. }
  241. data->bytes_xfered += miter->length;
  242. }
  243. sg_miter_stop(miter);
  244. return false;
  245. poll_timeout:
  246. miter->consumed = (void *)buf - miter->addr;
  247. data->bytes_xfered += miter->consumed;
  248. sg_miter_stop(miter);
  249. return true;
  250. }
  251. static bool jz4740_mmc_read_data(struct jz4740_mmc_host *host,
  252. struct mmc_data *data)
  253. {
  254. struct sg_mapping_iter *miter = &host->miter;
  255. void __iomem *fifo_addr = host->base + JZ_REG_MMC_RXFIFO;
  256. uint32_t *buf;
  257. uint32_t d;
  258. uint16_t status;
  259. size_t i, j;
  260. unsigned int timeout;
  261. while (sg_miter_next(miter)) {
  262. buf = miter->addr;
  263. i = miter->length;
  264. j = i / 32;
  265. i = i & 0x1f;
  266. while (j) {
  267. timeout = jz4740_mmc_poll_irq(host, JZ_MMC_IRQ_RXFIFO_RD_REQ);
  268. if (unlikely(timeout))
  269. goto poll_timeout;
  270. buf[0] = readl(fifo_addr);
  271. buf[1] = readl(fifo_addr);
  272. buf[2] = readl(fifo_addr);
  273. buf[3] = readl(fifo_addr);
  274. buf[4] = readl(fifo_addr);
  275. buf[5] = readl(fifo_addr);
  276. buf[6] = readl(fifo_addr);
  277. buf[7] = readl(fifo_addr);
  278. buf += 8;
  279. --j;
  280. }
  281. if (unlikely(i)) {
  282. timeout = jz4740_mmc_poll_irq(host, JZ_MMC_IRQ_RXFIFO_RD_REQ);
  283. if (unlikely(timeout))
  284. goto poll_timeout;
  285. while (i >= 4) {
  286. *buf++ = readl(fifo_addr);
  287. i -= 4;
  288. }
  289. if (unlikely(i > 0)) {
  290. d = readl(fifo_addr);
  291. memcpy(buf, &d, i);
  292. }
  293. }
  294. data->bytes_xfered += miter->length;
  295. /* This can go away once MIPS implements
  296. * flush_kernel_dcache_page */
  297. flush_dcache_page(miter->page);
  298. }
  299. sg_miter_stop(miter);
  300. /* For whatever reason there is sometime one word more in the fifo then
  301. * requested */
  302. timeout = 1000;
  303. status = readl(host->base + JZ_REG_MMC_STATUS);
  304. while (!(status & JZ_MMC_STATUS_DATA_FIFO_EMPTY) && --timeout) {
  305. d = readl(fifo_addr);
  306. status = readl(host->base + JZ_REG_MMC_STATUS);
  307. }
  308. return false;
  309. poll_timeout:
  310. miter->consumed = (void *)buf - miter->addr;
  311. data->bytes_xfered += miter->consumed;
  312. sg_miter_stop(miter);
  313. return true;
  314. }
  315. static void jz4740_mmc_timeout(unsigned long data)
  316. {
  317. struct jz4740_mmc_host *host = (struct jz4740_mmc_host *)data;
  318. if (!test_and_clear_bit(0, &host->waiting))
  319. return;
  320. jz4740_mmc_set_irq_enabled(host, JZ_MMC_IRQ_END_CMD_RES, false);
  321. host->req->cmd->error = -ETIMEDOUT;
  322. jz4740_mmc_request_done(host);
  323. }
  324. static void jz4740_mmc_read_response(struct jz4740_mmc_host *host,
  325. struct mmc_command *cmd)
  326. {
  327. int i;
  328. uint16_t tmp;
  329. void __iomem *fifo_addr = host->base + JZ_REG_MMC_RESP_FIFO;
  330. if (cmd->flags & MMC_RSP_136) {
  331. tmp = readw(fifo_addr);
  332. for (i = 0; i < 4; ++i) {
  333. cmd->resp[i] = tmp << 24;
  334. tmp = readw(fifo_addr);
  335. cmd->resp[i] |= tmp << 8;
  336. tmp = readw(fifo_addr);
  337. cmd->resp[i] |= tmp >> 8;
  338. }
  339. } else {
  340. cmd->resp[0] = readw(fifo_addr) << 24;
  341. cmd->resp[0] |= readw(fifo_addr) << 8;
  342. cmd->resp[0] |= readw(fifo_addr) & 0xff;
  343. }
  344. }
  345. static void jz4740_mmc_send_command(struct jz4740_mmc_host *host,
  346. struct mmc_command *cmd)
  347. {
  348. uint32_t cmdat = host->cmdat;
  349. host->cmdat &= ~JZ_MMC_CMDAT_INIT;
  350. jz4740_mmc_clock_disable(host);
  351. host->cmd = cmd;
  352. if (cmd->flags & MMC_RSP_BUSY)
  353. cmdat |= JZ_MMC_CMDAT_BUSY;
  354. switch (mmc_resp_type(cmd)) {
  355. case MMC_RSP_R1B:
  356. case MMC_RSP_R1:
  357. cmdat |= JZ_MMC_CMDAT_RSP_R1;
  358. break;
  359. case MMC_RSP_R2:
  360. cmdat |= JZ_MMC_CMDAT_RSP_R2;
  361. break;
  362. case MMC_RSP_R3:
  363. cmdat |= JZ_MMC_CMDAT_RSP_R3;
  364. break;
  365. default:
  366. break;
  367. }
  368. if (cmd->data) {
  369. cmdat |= JZ_MMC_CMDAT_DATA_EN;
  370. if (cmd->data->flags & MMC_DATA_WRITE)
  371. cmdat |= JZ_MMC_CMDAT_WRITE;
  372. if (cmd->data->flags & MMC_DATA_STREAM)
  373. cmdat |= JZ_MMC_CMDAT_STREAM;
  374. writew(cmd->data->blksz, host->base + JZ_REG_MMC_BLKLEN);
  375. writew(cmd->data->blocks, host->base + JZ_REG_MMC_NOB);
  376. }
  377. writeb(cmd->opcode, host->base + JZ_REG_MMC_CMD);
  378. writel(cmd->arg, host->base + JZ_REG_MMC_ARG);
  379. writel(cmdat, host->base + JZ_REG_MMC_CMDAT);
  380. jz4740_mmc_clock_enable(host, 1);
  381. }
  382. static void jz_mmc_prepare_data_transfer(struct jz4740_mmc_host *host)
  383. {
  384. struct mmc_command *cmd = host->req->cmd;
  385. struct mmc_data *data = cmd->data;
  386. int direction;
  387. if (data->flags & MMC_DATA_READ)
  388. direction = SG_MITER_TO_SG;
  389. else
  390. direction = SG_MITER_FROM_SG;
  391. sg_miter_start(&host->miter, data->sg, data->sg_len, direction);
  392. }
  393. static irqreturn_t jz_mmc_irq_worker(int irq, void *devid)
  394. {
  395. struct jz4740_mmc_host *host = (struct jz4740_mmc_host *)devid;
  396. struct mmc_command *cmd = host->req->cmd;
  397. struct mmc_request *req = host->req;
  398. bool timeout = false;
  399. if (cmd->error)
  400. host->state = JZ4740_MMC_STATE_DONE;
  401. switch (host->state) {
  402. case JZ4740_MMC_STATE_READ_RESPONSE:
  403. if (cmd->flags & MMC_RSP_PRESENT)
  404. jz4740_mmc_read_response(host, cmd);
  405. if (!cmd->data)
  406. break;
  407. jz_mmc_prepare_data_transfer(host);
  408. case JZ4740_MMC_STATE_TRANSFER_DATA:
  409. if (cmd->data->flags & MMC_DATA_READ)
  410. timeout = jz4740_mmc_read_data(host, cmd->data);
  411. else
  412. timeout = jz4740_mmc_write_data(host, cmd->data);
  413. if (unlikely(timeout)) {
  414. host->state = JZ4740_MMC_STATE_TRANSFER_DATA;
  415. break;
  416. }
  417. jz4740_mmc_transfer_check_state(host, cmd->data);
  418. timeout = jz4740_mmc_poll_irq(host, JZ_MMC_IRQ_DATA_TRAN_DONE);
  419. if (unlikely(timeout)) {
  420. host->state = JZ4740_MMC_STATE_SEND_STOP;
  421. break;
  422. }
  423. writew(JZ_MMC_IRQ_DATA_TRAN_DONE, host->base + JZ_REG_MMC_IREG);
  424. case JZ4740_MMC_STATE_SEND_STOP:
  425. if (!req->stop)
  426. break;
  427. jz4740_mmc_send_command(host, req->stop);
  428. timeout = jz4740_mmc_poll_irq(host, JZ_MMC_IRQ_PRG_DONE);
  429. if (timeout) {
  430. host->state = JZ4740_MMC_STATE_DONE;
  431. break;
  432. }
  433. case JZ4740_MMC_STATE_DONE:
  434. break;
  435. }
  436. if (!timeout)
  437. jz4740_mmc_request_done(host);
  438. return IRQ_HANDLED;
  439. }
  440. static irqreturn_t jz_mmc_irq(int irq, void *devid)
  441. {
  442. struct jz4740_mmc_host *host = devid;
  443. struct mmc_command *cmd = host->cmd;
  444. uint16_t irq_reg, status, tmp;
  445. irq_reg = readw(host->base + JZ_REG_MMC_IREG);
  446. tmp = irq_reg;
  447. irq_reg &= ~host->irq_mask;
  448. tmp &= ~(JZ_MMC_IRQ_TXFIFO_WR_REQ | JZ_MMC_IRQ_RXFIFO_RD_REQ |
  449. JZ_MMC_IRQ_PRG_DONE | JZ_MMC_IRQ_DATA_TRAN_DONE);
  450. if (tmp != irq_reg)
  451. writew(tmp & ~irq_reg, host->base + JZ_REG_MMC_IREG);
  452. if (irq_reg & JZ_MMC_IRQ_SDIO) {
  453. writew(JZ_MMC_IRQ_SDIO, host->base + JZ_REG_MMC_IREG);
  454. mmc_signal_sdio_irq(host->mmc);
  455. irq_reg &= ~JZ_MMC_IRQ_SDIO;
  456. }
  457. if (host->req && cmd && irq_reg) {
  458. if (test_and_clear_bit(0, &host->waiting)) {
  459. del_timer(&host->timeout_timer);
  460. status = readl(host->base + JZ_REG_MMC_STATUS);
  461. if (status & JZ_MMC_STATUS_TIMEOUT_RES) {
  462. cmd->error = -ETIMEDOUT;
  463. } else if (status & JZ_MMC_STATUS_CRC_RES_ERR) {
  464. cmd->error = -EIO;
  465. } else if (status & (JZ_MMC_STATUS_CRC_READ_ERROR |
  466. JZ_MMC_STATUS_CRC_WRITE_ERROR)) {
  467. if (cmd->data)
  468. cmd->data->error = -EIO;
  469. cmd->error = -EIO;
  470. }
  471. jz4740_mmc_set_irq_enabled(host, irq_reg, false);
  472. writew(irq_reg, host->base + JZ_REG_MMC_IREG);
  473. return IRQ_WAKE_THREAD;
  474. }
  475. }
  476. return IRQ_HANDLED;
  477. }
  478. static int jz4740_mmc_set_clock_rate(struct jz4740_mmc_host *host, int rate)
  479. {
  480. int div = 0;
  481. int real_rate;
  482. jz4740_mmc_clock_disable(host);
  483. clk_set_rate(host->clk, JZ_MMC_CLK_RATE);
  484. real_rate = clk_get_rate(host->clk);
  485. while (real_rate > rate && div < 7) {
  486. ++div;
  487. real_rate >>= 1;
  488. }
  489. writew(div, host->base + JZ_REG_MMC_CLKRT);
  490. return real_rate;
  491. }
  492. static void jz4740_mmc_request(struct mmc_host *mmc, struct mmc_request *req)
  493. {
  494. struct jz4740_mmc_host *host = mmc_priv(mmc);
  495. host->req = req;
  496. writew(0xffff, host->base + JZ_REG_MMC_IREG);
  497. writew(JZ_MMC_IRQ_END_CMD_RES, host->base + JZ_REG_MMC_IREG);
  498. jz4740_mmc_set_irq_enabled(host, JZ_MMC_IRQ_END_CMD_RES, true);
  499. host->state = JZ4740_MMC_STATE_READ_RESPONSE;
  500. set_bit(0, &host->waiting);
  501. mod_timer(&host->timeout_timer, jiffies + 5*HZ);
  502. jz4740_mmc_send_command(host, req->cmd);
  503. }
  504. static void jz4740_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
  505. {
  506. struct jz4740_mmc_host *host = mmc_priv(mmc);
  507. if (ios->clock)
  508. jz4740_mmc_set_clock_rate(host, ios->clock);
  509. switch (ios->power_mode) {
  510. case MMC_POWER_UP:
  511. jz4740_mmc_reset(host);
  512. if (gpio_is_valid(host->pdata->gpio_power))
  513. gpio_set_value(host->pdata->gpio_power,
  514. !host->pdata->power_active_low);
  515. host->cmdat |= JZ_MMC_CMDAT_INIT;
  516. clk_prepare_enable(host->clk);
  517. break;
  518. case MMC_POWER_ON:
  519. break;
  520. default:
  521. if (gpio_is_valid(host->pdata->gpio_power))
  522. gpio_set_value(host->pdata->gpio_power,
  523. host->pdata->power_active_low);
  524. clk_disable_unprepare(host->clk);
  525. break;
  526. }
  527. switch (ios->bus_width) {
  528. case MMC_BUS_WIDTH_1:
  529. host->cmdat &= ~JZ_MMC_CMDAT_BUS_WIDTH_4BIT;
  530. break;
  531. case MMC_BUS_WIDTH_4:
  532. host->cmdat |= JZ_MMC_CMDAT_BUS_WIDTH_4BIT;
  533. break;
  534. default:
  535. break;
  536. }
  537. }
  538. static void jz4740_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
  539. {
  540. struct jz4740_mmc_host *host = mmc_priv(mmc);
  541. jz4740_mmc_set_irq_enabled(host, JZ_MMC_IRQ_SDIO, enable);
  542. }
  543. static const struct mmc_host_ops jz4740_mmc_ops = {
  544. .request = jz4740_mmc_request,
  545. .set_ios = jz4740_mmc_set_ios,
  546. .get_ro = mmc_gpio_get_ro,
  547. .get_cd = mmc_gpio_get_cd,
  548. .enable_sdio_irq = jz4740_mmc_enable_sdio_irq,
  549. };
  550. static const struct jz_gpio_bulk_request jz4740_mmc_pins[] = {
  551. JZ_GPIO_BULK_PIN(MSC_CMD),
  552. JZ_GPIO_BULK_PIN(MSC_CLK),
  553. JZ_GPIO_BULK_PIN(MSC_DATA0),
  554. JZ_GPIO_BULK_PIN(MSC_DATA1),
  555. JZ_GPIO_BULK_PIN(MSC_DATA2),
  556. JZ_GPIO_BULK_PIN(MSC_DATA3),
  557. };
  558. static int jz4740_mmc_request_gpio(struct device *dev, int gpio,
  559. const char *name, bool output, int value)
  560. {
  561. int ret;
  562. if (!gpio_is_valid(gpio))
  563. return 0;
  564. ret = gpio_request(gpio, name);
  565. if (ret) {
  566. dev_err(dev, "Failed to request %s gpio: %d\n", name, ret);
  567. return ret;
  568. }
  569. if (output)
  570. gpio_direction_output(gpio, value);
  571. else
  572. gpio_direction_input(gpio);
  573. return 0;
  574. }
  575. static int jz4740_mmc_request_gpios(struct mmc_host *mmc,
  576. struct platform_device *pdev)
  577. {
  578. struct jz4740_mmc_platform_data *pdata = pdev->dev.platform_data;
  579. int ret = 0;
  580. if (!pdata)
  581. return 0;
  582. if (!pdata->card_detect_active_low)
  583. mmc->caps2 |= MMC_CAP2_CD_ACTIVE_HIGH;
  584. if (!pdata->read_only_active_low)
  585. mmc->caps2 |= MMC_CAP2_RO_ACTIVE_HIGH;
  586. if (gpio_is_valid(pdata->gpio_card_detect)) {
  587. ret = mmc_gpio_request_cd(mmc, pdata->gpio_card_detect, 0);
  588. if (ret)
  589. return ret;
  590. }
  591. if (gpio_is_valid(pdata->gpio_read_only)) {
  592. ret = mmc_gpio_request_ro(mmc, pdata->gpio_read_only);
  593. if (ret)
  594. return ret;
  595. }
  596. return jz4740_mmc_request_gpio(&pdev->dev, pdata->gpio_power,
  597. "MMC read only", true, pdata->power_active_low);
  598. }
  599. static void jz4740_mmc_free_gpios(struct platform_device *pdev)
  600. {
  601. struct jz4740_mmc_platform_data *pdata = pdev->dev.platform_data;
  602. if (!pdata)
  603. return;
  604. if (gpio_is_valid(pdata->gpio_power))
  605. gpio_free(pdata->gpio_power);
  606. }
  607. static inline size_t jz4740_mmc_num_pins(struct jz4740_mmc_host *host)
  608. {
  609. size_t num_pins = ARRAY_SIZE(jz4740_mmc_pins);
  610. if (host->pdata && host->pdata->data_1bit)
  611. num_pins -= 3;
  612. return num_pins;
  613. }
  614. static int jz4740_mmc_probe(struct platform_device* pdev)
  615. {
  616. int ret;
  617. struct mmc_host *mmc;
  618. struct jz4740_mmc_host *host;
  619. struct jz4740_mmc_platform_data *pdata;
  620. struct resource *res;
  621. pdata = pdev->dev.platform_data;
  622. mmc = mmc_alloc_host(sizeof(struct jz4740_mmc_host), &pdev->dev);
  623. if (!mmc) {
  624. dev_err(&pdev->dev, "Failed to alloc mmc host structure\n");
  625. return -ENOMEM;
  626. }
  627. host = mmc_priv(mmc);
  628. host->pdata = pdata;
  629. host->irq = platform_get_irq(pdev, 0);
  630. if (host->irq < 0) {
  631. ret = host->irq;
  632. dev_err(&pdev->dev, "Failed to get platform irq: %d\n", ret);
  633. goto err_free_host;
  634. }
  635. host->clk = devm_clk_get(&pdev->dev, "mmc");
  636. if (IS_ERR(host->clk)) {
  637. ret = PTR_ERR(host->clk);
  638. dev_err(&pdev->dev, "Failed to get mmc clock\n");
  639. goto err_free_host;
  640. }
  641. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  642. host->base = devm_ioremap_resource(&pdev->dev, res);
  643. if (IS_ERR(host->base)) {
  644. ret = PTR_ERR(host->base);
  645. goto err_free_host;
  646. }
  647. ret = jz_gpio_bulk_request(jz4740_mmc_pins, jz4740_mmc_num_pins(host));
  648. if (ret) {
  649. dev_err(&pdev->dev, "Failed to request mmc pins: %d\n", ret);
  650. goto err_free_host;
  651. }
  652. ret = jz4740_mmc_request_gpios(mmc, pdev);
  653. if (ret)
  654. goto err_gpio_bulk_free;
  655. mmc->ops = &jz4740_mmc_ops;
  656. mmc->f_min = JZ_MMC_CLK_RATE / 128;
  657. mmc->f_max = JZ_MMC_CLK_RATE;
  658. mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
  659. mmc->caps = (pdata && pdata->data_1bit) ? 0 : MMC_CAP_4_BIT_DATA;
  660. mmc->caps |= MMC_CAP_SDIO_IRQ;
  661. mmc->max_blk_size = (1 << 10) - 1;
  662. mmc->max_blk_count = (1 << 15) - 1;
  663. mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
  664. mmc->max_segs = 128;
  665. mmc->max_seg_size = mmc->max_req_size;
  666. host->mmc = mmc;
  667. host->pdev = pdev;
  668. spin_lock_init(&host->lock);
  669. host->irq_mask = 0xffff;
  670. ret = request_threaded_irq(host->irq, jz_mmc_irq, jz_mmc_irq_worker, 0,
  671. dev_name(&pdev->dev), host);
  672. if (ret) {
  673. dev_err(&pdev->dev, "Failed to request irq: %d\n", ret);
  674. goto err_free_gpios;
  675. }
  676. jz4740_mmc_reset(host);
  677. jz4740_mmc_clock_disable(host);
  678. setup_timer(&host->timeout_timer, jz4740_mmc_timeout,
  679. (unsigned long)host);
  680. /* It is not important when it times out, it just needs to timeout. */
  681. set_timer_slack(&host->timeout_timer, HZ);
  682. platform_set_drvdata(pdev, host);
  683. ret = mmc_add_host(mmc);
  684. if (ret) {
  685. dev_err(&pdev->dev, "Failed to add mmc host: %d\n", ret);
  686. goto err_free_irq;
  687. }
  688. dev_info(&pdev->dev, "JZ SD/MMC card driver registered\n");
  689. return 0;
  690. err_free_irq:
  691. free_irq(host->irq, host);
  692. err_free_gpios:
  693. jz4740_mmc_free_gpios(pdev);
  694. err_gpio_bulk_free:
  695. jz_gpio_bulk_free(jz4740_mmc_pins, jz4740_mmc_num_pins(host));
  696. err_free_host:
  697. mmc_free_host(mmc);
  698. return ret;
  699. }
  700. static int jz4740_mmc_remove(struct platform_device *pdev)
  701. {
  702. struct jz4740_mmc_host *host = platform_get_drvdata(pdev);
  703. del_timer_sync(&host->timeout_timer);
  704. jz4740_mmc_set_irq_enabled(host, 0xff, false);
  705. jz4740_mmc_reset(host);
  706. mmc_remove_host(host->mmc);
  707. free_irq(host->irq, host);
  708. jz4740_mmc_free_gpios(pdev);
  709. jz_gpio_bulk_free(jz4740_mmc_pins, jz4740_mmc_num_pins(host));
  710. mmc_free_host(host->mmc);
  711. return 0;
  712. }
  713. #ifdef CONFIG_PM_SLEEP
  714. static int jz4740_mmc_suspend(struct device *dev)
  715. {
  716. struct jz4740_mmc_host *host = dev_get_drvdata(dev);
  717. mmc_suspend_host(host->mmc);
  718. jz_gpio_bulk_suspend(jz4740_mmc_pins, jz4740_mmc_num_pins(host));
  719. return 0;
  720. }
  721. static int jz4740_mmc_resume(struct device *dev)
  722. {
  723. struct jz4740_mmc_host *host = dev_get_drvdata(dev);
  724. jz_gpio_bulk_resume(jz4740_mmc_pins, jz4740_mmc_num_pins(host));
  725. mmc_resume_host(host->mmc);
  726. return 0;
  727. }
  728. static SIMPLE_DEV_PM_OPS(jz4740_mmc_pm_ops, jz4740_mmc_suspend,
  729. jz4740_mmc_resume);
  730. #define JZ4740_MMC_PM_OPS (&jz4740_mmc_pm_ops)
  731. #else
  732. #define JZ4740_MMC_PM_OPS NULL
  733. #endif
  734. static struct platform_driver jz4740_mmc_driver = {
  735. .probe = jz4740_mmc_probe,
  736. .remove = jz4740_mmc_remove,
  737. .driver = {
  738. .name = "jz4740-mmc",
  739. .owner = THIS_MODULE,
  740. .pm = JZ4740_MMC_PM_OPS,
  741. },
  742. };
  743. module_platform_driver(jz4740_mmc_driver);
  744. MODULE_DESCRIPTION("JZ4740 SD/MMC controller driver");
  745. MODULE_LICENSE("GPL");
  746. MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");