loongson2-mmc.c 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Loongson-2K MMC/SDIO controller driver
  4. *
  5. * Copyright (C) 2018-2025 Loongson Technology Corporation Limited.
  6. *
  7. */
  8. #include <linux/bitfield.h>
  9. #include <linux/bitrev.h>
  10. #include <linux/clk.h>
  11. #include <linux/delay.h>
  12. #include <linux/dmaengine.h>
  13. #include <linux/dma-mapping.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/io.h>
  16. #include <linux/mmc/core.h>
  17. #include <linux/mmc/host.h>
  18. #include <linux/mmc/mmc.h>
  19. #include <linux/mmc/sd.h>
  20. #include <linux/mmc/sdio.h>
  21. #include <linux/mmc/slot-gpio.h>
  22. #include <linux/module.h>
  23. #include <linux/of.h>
  24. #include <linux/platform_device.h>
  25. #include <linux/regmap.h>
  26. #define LOONGSON2_MMC_REG_CTL 0x00 /* Control Register */
  27. #define LOONGSON2_MMC_REG_PRE 0x04 /* Prescaler Register */
  28. #define LOONGSON2_MMC_REG_CARG 0x08 /* Command Register */
  29. #define LOONGSON2_MMC_REG_CCTL 0x0c /* Command Control Register */
  30. #define LOONGSON2_MMC_REG_CSTS 0x10 /* Command Status Register */
  31. #define LOONGSON2_MMC_REG_RSP0 0x14 /* Command Response Register 0 */
  32. #define LOONGSON2_MMC_REG_RSP1 0x18 /* Command Response Register 1 */
  33. #define LOONGSON2_MMC_REG_RSP2 0x1c /* Command Response Register 2 */
  34. #define LOONGSON2_MMC_REG_RSP3 0x20 /* Command Response Register 3 */
  35. #define LOONGSON2_MMC_REG_TIMER 0x24 /* Data Timeout Register */
  36. #define LOONGSON2_MMC_REG_BSIZE 0x28 /* Block Size Register */
  37. #define LOONGSON2_MMC_REG_DCTL 0x2c /* Data Control Register */
  38. #define LOONGSON2_MMC_REG_DCNT 0x30 /* Data Counter Register */
  39. #define LOONGSON2_MMC_REG_DSTS 0x34 /* Data Status Register */
  40. #define LOONGSON2_MMC_REG_FSTS 0x38 /* FIFO Status Register */
  41. #define LOONGSON2_MMC_REG_INT 0x3c /* Interrupt Register */
  42. #define LOONGSON2_MMC_REG_DATA 0x40 /* Data Register */
  43. #define LOONGSON2_MMC_REG_IEN 0x64 /* Interrupt Enable Register */
  44. /* EMMC DLL Mode Registers */
  45. #define LOONGSON2_MMC_REG_DLLVAL 0xf0 /* DLL Master Lock-value Register */
  46. #define LOONGSON2_MMC_REG_DLLCTL 0xf4 /* DLL Control Register */
  47. #define LOONGSON2_MMC_REG_DELAY 0xf8 /* DLL Delayed Parameter Register */
  48. #define LOONGSON2_MMC_REG_SEL 0xfc /* Bus Mode Selection Register */
  49. /* Exclusive DMA R/W Registers */
  50. #define LOONGSON2_MMC_REG_WDMA_LO 0x400
  51. #define LOONGSON2_MMC_REG_WDMA_HI 0x404
  52. #define LOONGSON2_MMC_REG_RDMA_LO 0x800
  53. #define LOONGSON2_MMC_REG_RDMA_HI 0x804
  54. /* Bitfields of control register */
  55. #define LOONGSON2_MMC_CTL_ENCLK BIT(0)
  56. #define LOONGSON2_MMC_CTL_EXTCLK BIT(1)
  57. #define LOONGSON2_MMC_CTL_RESET BIT(8)
  58. /* Bitfields of prescaler register */
  59. #define LOONGSON2_MMC_PRE GENMASK(9, 0)
  60. #define LOONGSON2_MMC_PRE_EN BIT(31)
  61. /* Bitfields of command control register */
  62. #define LOONGSON2_MMC_CCTL_INDEX GENMASK(5, 0)
  63. #define LOONGSON2_MMC_CCTL_HOST BIT(6)
  64. #define LOONGSON2_MMC_CCTL_START BIT(8)
  65. #define LOONGSON2_MMC_CCTL_WAIT_RSP BIT(9)
  66. #define LOONGSON2_MMC_CCTL_LONG_RSP BIT(10)
  67. #define LOONGSON2_MMC_CCTL_ABORT BIT(12)
  68. #define LOONGSON2_MMC_CCTL_CHECK BIT(13)
  69. #define LOONGSON2_MMC_CCTL_SDIO BIT(14)
  70. #define LOONGSON2_MMC_CCTL_CMD6 BIT(18)
  71. /* Bitfields of command status register */
  72. #define LOONGSON2_MMC_CSTS_INDEX GENMASK(7, 0)
  73. #define LOONGSON2_MMC_CSTS_ON BIT(8)
  74. #define LOONGSON2_MMC_CSTS_RSP BIT(9)
  75. #define LOONGSON2_MMC_CSTS_TIMEOUT BIT(10)
  76. #define LOONGSON2_MMC_CSTS_END BIT(11)
  77. #define LOONGSON2_MMC_CSTS_CRC_ERR BIT(12)
  78. #define LOONGSON2_MMC_CSTS_AUTO_STOP BIT(13)
  79. #define LOONGSON2_MMC_CSTS_FIN BIT(14)
  80. /* Bitfields of data timeout register */
  81. #define LOONGSON2_MMC_DTIMR GENMASK(23, 0)
  82. /* Bitfields of block size register */
  83. #define LOONGSON2_MMC_BSIZE GENMASK(11, 0)
  84. /* Bitfields of data control register */
  85. #define LOONGSON2_MMC_DCTL_BNUM GENMASK(11, 0)
  86. #define LOONGSON2_MMC_DCTL_START BIT(14)
  87. #define LOONGSON2_MMC_DCTL_ENDMA BIT(15)
  88. #define LOONGSON2_MMC_DCTL_WIDE BIT(16)
  89. #define LOONGSON2_MMC_DCTL_RWAIT BIT(17)
  90. #define LOONGSON2_MMC_DCTL_IO_SUSPEND BIT(18)
  91. #define LOONGSON2_MMC_DCTL_IO_RESUME BIT(19)
  92. #define LOONGSON2_MMC_DCTL_RW_RESUME BIT(20)
  93. #define LOONGSON2_MMC_DCTL_8BIT_BUS BIT(26)
  94. /* Bitfields of sata counter register */
  95. #define LOONGSON2_MMC_DCNT_BNUM GENMASK(11, 0)
  96. #define LOONGSON2_MMC_DCNT_BYTE GENMASK(23, 12)
  97. /* Bitfields of command status register */
  98. #define LOONGSON2_MMC_DSTS_RXON BIT(0)
  99. #define LOONGSON2_MMC_DSTS_TXON BIT(1)
  100. #define LOONGSON2_MMC_DSTS_SBITERR BIT(2)
  101. #define LOONGSON2_MMC_DSTS_BUSYFIN BIT(3)
  102. #define LOONGSON2_MMC_DSTS_XFERFIN BIT(4)
  103. #define LOONGSON2_MMC_DSTS_DTIMEOUT BIT(5)
  104. #define LOONGSON2_MMC_DSTS_RXCRC BIT(6)
  105. #define LOONGSON2_MMC_DSTS_TXCRC BIT(7)
  106. #define LOONGSON2_MMC_DSTS_IRQ BIT(8)
  107. #define LOONGSON2_MMC_DSTS_START BIT(13)
  108. #define LOONGSON2_MMC_DSTS_RESUME BIT(15)
  109. #define LOONGSON2_MMC_DSTS_SUSPEND BIT(16)
  110. /* Bitfields of FIFO Status Register */
  111. #define LOONGSON2_MMC_FSTS_TXFULL BIT(11)
  112. /* Bitfields of interrupt register */
  113. #define LOONGSON2_MMC_INT_DFIN BIT(0)
  114. #define LOONGSON2_MMC_INT_DTIMEOUT BIT(1)
  115. #define LOONGSON2_MMC_INT_RXCRC BIT(2)
  116. #define LOONGSON2_MMC_INT_TXCRC BIT(3)
  117. #define LOONGSON2_MMC_INT_PROGERR BIT(4)
  118. #define LOONGSON2_MMC_INT_SDIOIRQ BIT(5)
  119. #define LOONGSON2_MMC_INT_CSENT BIT(6)
  120. #define LOONGSON2_MMC_INT_CTIMEOUT BIT(7)
  121. #define LOONGSON2_MMC_INT_RESPCRC BIT(8)
  122. #define LOONGSON2_MMC_INT_BUSYEND BIT(9)
  123. /* Bitfields of interrupt enable register */
  124. #define LOONGSON2_MMC_IEN_DFIN BIT(0)
  125. #define LOONGSON2_MMC_IEN_DTIMEOUT BIT(1)
  126. #define LOONGSON2_MMC_IEN_RXCRC BIT(2)
  127. #define LOONGSON2_MMC_IEN_TXCRC BIT(3)
  128. #define LOONGSON2_MMC_IEN_PROGERR BIT(4)
  129. #define LOONGSON2_MMC_IEN_SDIOIRQ BIT(5)
  130. #define LOONGSON2_MMC_IEN_CSENT BIT(6)
  131. #define LOONGSON2_MMC_IEN_CTIMEOUT BIT(7)
  132. #define LOONGSON2_MMC_IEN_RESPCRC BIT(8)
  133. #define LOONGSON2_MMC_IEN_BUSYEND BIT(9)
  134. #define LOONGSON2_MMC_IEN_ALL GENMASK(9, 0)
  135. #define LOONGSON2_MMC_INT_CLEAR GENMASK(9, 0)
  136. /* Bitfields of DLL master lock-value register */
  137. #define LOONGSON2_MMC_DLLVAL_DONE BIT(8)
  138. /* Bitfields of DLL control register */
  139. #define LOONGSON2_MMC_DLLCTL_TIME GENMASK(7, 0)
  140. #define LOONGSON2_MMC_DLLCTL_INCRE GENMASK(15, 8)
  141. #define LOONGSON2_MMC_DLLCTL_START GENMASK(23, 16)
  142. #define LOONGSON2_MMC_DLLCTL_CLK_MODE BIT(24)
  143. #define LOONGSON2_MMC_DLLCTL_START_BIT BIT(25)
  144. #define LOONGSON2_MMC_DLLCTL_TIME_BPASS GENMASK(29, 26)
  145. #define LOONGSON2_MMC_DELAY_PAD GENMASK(7, 0)
  146. #define LOONGSON2_MMC_DELAY_RD GENMASK(15, 8)
  147. #define LOONGSON2_MMC_SEL_DATA BIT(0) /* 0: SDR, 1: DDR */
  148. #define LOONGSON2_MMC_SEL_BUS BIT(0) /* 0: EMMC, 1: SDIO */
  149. /* Internal dma controller registers */
  150. /* Bitfields of Global Configuration Register */
  151. #define LOONGSON2_MMC_DMA_64BIT_EN BIT(0) /* 1: 64 bit support */
  152. #define LOONGSON2_MMC_DMA_UNCOHERENT_EN BIT(1) /* 0: cache, 1: uncache */
  153. #define LOONGSON2_MMC_DMA_ASK_VALID BIT(2)
  154. #define LOONGSON2_MMC_DMA_START BIT(3) /* DMA start operation */
  155. #define LOONGSON2_MMC_DMA_STOP BIT(4) /* DMA stop operation */
  156. #define LOONGSON2_MMC_DMA_CONFIG_MASK GENMASK_ULL(4, 0) /* DMA controller config bits mask */
  157. /* Bitfields of ndesc_addr field of HW descriptor */
  158. #define LOONGSON2_MMC_DMA_DESC_EN BIT(0) /*1: The next descriptor is valid */
  159. #define LOONGSON2_MMC_DMA_DESC_ADDR_LOW GENMASK(31, 1)
  160. /* Bitfields of cmd field of HW descriptor */
  161. #define LOONGSON2_MMC_DMA_INT BIT(1) /* Enable DMA interrupts */
  162. #define LOONGSON2_MMC_DMA_DATA_DIR BIT(12) /* 1: write to device, 0: read from device */
  163. #define LOONGSON2_MMC_DLLVAL_TIMEOUT_US 4000
  164. #define LOONGSON2_MMC_TXFULL_TIMEOUT_US 500
  165. /* Loongson-2K1000 SDIO2 DMA routing register */
  166. #define LS2K1000_SDIO_DMA_MASK GENMASK(17, 15)
  167. #define LS2K1000_DMA0_CONF 0x0
  168. #define LS2K1000_DMA1_CONF 0x1
  169. #define LS2K1000_DMA2_CONF 0x2
  170. #define LS2K1000_DMA3_CONF 0x3
  171. #define LS2K1000_DMA4_CONF 0x4
  172. /* Loongson-2K0500 SDIO2 DMA routing register */
  173. #define LS2K0500_SDIO_DMA_MASK GENMASK(15, 14)
  174. #define LS2K0500_DMA0_CONF 0x1
  175. #define LS2K0500_DMA1_CONF 0x2
  176. #define LS2K0500_DMA2_CONF 0x3
  177. enum loongson2_mmc_state {
  178. STATE_NONE,
  179. STATE_FINALIZE,
  180. STATE_CMDSENT,
  181. STATE_RSPFIN,
  182. STATE_XFERFINISH,
  183. STATE_XFERFINISH_RSPFIN,
  184. };
  185. struct loongson2_dma_desc {
  186. u32 ndesc_addr;
  187. u32 mem_addr;
  188. u32 apb_addr;
  189. u32 len;
  190. u32 step_len;
  191. u32 step_times;
  192. u32 cmd;
  193. u32 stats;
  194. u32 high_ndesc_addr;
  195. u32 high_mem_addr;
  196. u32 reserved[2];
  197. } __packed;
  198. struct loongson2_mmc_host {
  199. struct device *dev;
  200. struct mmc_request *mrq;
  201. struct regmap *regmap;
  202. struct resource *res;
  203. struct clk *clk;
  204. u32 current_clk;
  205. void *sg_cpu;
  206. dma_addr_t sg_dma;
  207. int dma_complete;
  208. struct dma_chan *chan;
  209. int cmd_is_stop;
  210. int bus_width;
  211. spinlock_t lock; /* Prevent races with irq handler */
  212. enum loongson2_mmc_state state;
  213. const struct loongson2_mmc_pdata *pdata;
  214. };
  215. struct loongson2_mmc_pdata {
  216. const struct regmap_config *regmap_config;
  217. void (*reorder_cmd_data)(struct loongson2_mmc_host *host, struct mmc_command *cmd);
  218. void (*fix_data_timeout)(struct loongson2_mmc_host *host, struct mmc_command *cmd);
  219. int (*setting_dma)(struct loongson2_mmc_host *host, struct platform_device *pdev);
  220. int (*prepare_dma)(struct loongson2_mmc_host *host, struct mmc_data *data);
  221. void (*release_dma)(struct loongson2_mmc_host *host, struct device *dev);
  222. };
  223. static void loongson2_mmc_send_command(struct loongson2_mmc_host *host,
  224. struct mmc_command *cmd)
  225. {
  226. u32 cctrl;
  227. if (cmd->data)
  228. host->state = STATE_XFERFINISH_RSPFIN;
  229. else if (cmd->flags & MMC_RSP_PRESENT)
  230. host->state = STATE_RSPFIN;
  231. else
  232. host->state = STATE_CMDSENT;
  233. regmap_write(host->regmap, LOONGSON2_MMC_REG_CARG, cmd->arg);
  234. cctrl = FIELD_PREP(LOONGSON2_MMC_CCTL_INDEX, cmd->opcode);
  235. cctrl |= LOONGSON2_MMC_CCTL_HOST | LOONGSON2_MMC_CCTL_START;
  236. if (cmd->opcode == SD_SWITCH && cmd->data)
  237. cctrl |= LOONGSON2_MMC_CCTL_CMD6;
  238. if (cmd->flags & MMC_RSP_PRESENT)
  239. cctrl |= LOONGSON2_MMC_CCTL_WAIT_RSP;
  240. if (cmd->flags & MMC_RSP_136)
  241. cctrl |= LOONGSON2_MMC_CCTL_LONG_RSP;
  242. regmap_write(host->regmap, LOONGSON2_MMC_REG_CCTL, cctrl);
  243. }
  244. static int loongson2_mmc_setup_data(struct loongson2_mmc_host *host,
  245. struct mmc_data *data)
  246. {
  247. u32 dctrl;
  248. if ((data->blksz & 3) != 0)
  249. return -EINVAL;
  250. dctrl = FIELD_PREP(LOONGSON2_MMC_DCTL_BNUM, data->blocks);
  251. dctrl |= LOONGSON2_MMC_DCTL_START | LOONGSON2_MMC_DCTL_ENDMA;
  252. if (host->bus_width == MMC_BUS_WIDTH_4)
  253. dctrl |= LOONGSON2_MMC_DCTL_WIDE;
  254. else if (host->bus_width == MMC_BUS_WIDTH_8)
  255. dctrl |= LOONGSON2_MMC_DCTL_8BIT_BUS;
  256. regmap_write(host->regmap, LOONGSON2_MMC_REG_DCTL, dctrl);
  257. regmap_write(host->regmap, LOONGSON2_MMC_REG_BSIZE, data->blksz);
  258. regmap_write(host->regmap, LOONGSON2_MMC_REG_TIMER, U32_MAX);
  259. return 0;
  260. }
  261. static int loongson2_mmc_prepare_dma(struct loongson2_mmc_host *host,
  262. struct mmc_data *data)
  263. {
  264. int ret;
  265. if (!data)
  266. return 0;
  267. ret = loongson2_mmc_setup_data(host, data);
  268. if (ret)
  269. return ret;
  270. host->dma_complete = 0;
  271. return host->pdata->prepare_dma(host, data);
  272. }
  273. static void loongson2_mmc_send_request(struct mmc_host *mmc)
  274. {
  275. int ret;
  276. struct loongson2_mmc_host *host = mmc_priv(mmc);
  277. struct mmc_request *mrq = host->mrq;
  278. struct mmc_command *cmd = host->cmd_is_stop ? mrq->stop : mrq->cmd;
  279. ret = loongson2_mmc_prepare_dma(host, cmd->data);
  280. if (ret) {
  281. dev_err(host->dev, "DMA data prepared failed with %d\n", ret);
  282. cmd->error = ret;
  283. cmd->data->error = ret;
  284. mmc_request_done(mmc, mrq);
  285. return;
  286. }
  287. if (host->pdata->fix_data_timeout)
  288. host->pdata->fix_data_timeout(host, cmd);
  289. loongson2_mmc_send_command(host, cmd);
  290. /* Fix deselect card */
  291. if (cmd->opcode == MMC_SELECT_CARD && cmd->arg == 0) {
  292. cmd->error = 0;
  293. mmc_request_done(mmc, mrq);
  294. }
  295. }
  296. static irqreturn_t loongson2_mmc_irq_worker(int irq, void *devid)
  297. {
  298. struct loongson2_mmc_host *host = (struct loongson2_mmc_host *)devid;
  299. struct mmc_host *mmc = mmc_from_priv(host);
  300. struct mmc_request *mrq = host->mrq;
  301. struct mmc_command *cmd = host->cmd_is_stop ? mrq->stop : mrq->cmd;
  302. if (cmd->data)
  303. dma_unmap_sg(mmc_dev(mmc), cmd->data->sg, cmd->data->sg_len,
  304. mmc_get_dma_dir(cmd->data));
  305. if (cmd->data && !cmd->error &&
  306. !cmd->data->error && !host->dma_complete)
  307. return IRQ_HANDLED;
  308. /* Read response from controller. */
  309. regmap_read(host->regmap, LOONGSON2_MMC_REG_RSP0, &cmd->resp[0]);
  310. regmap_read(host->regmap, LOONGSON2_MMC_REG_RSP1, &cmd->resp[1]);
  311. regmap_read(host->regmap, LOONGSON2_MMC_REG_RSP2, &cmd->resp[2]);
  312. regmap_read(host->regmap, LOONGSON2_MMC_REG_RSP3, &cmd->resp[3]);
  313. /* Cleanup controller */
  314. regmap_write(host->regmap, LOONGSON2_MMC_REG_CARG, 0);
  315. regmap_write(host->regmap, LOONGSON2_MMC_REG_CCTL, 0);
  316. if (cmd->data && cmd->error)
  317. cmd->data->error = cmd->error;
  318. if (cmd->data && cmd->data->stop && !host->cmd_is_stop) {
  319. host->cmd_is_stop = 1;
  320. loongson2_mmc_send_request(mmc);
  321. return IRQ_HANDLED;
  322. }
  323. /* If we have no data transfer we are finished here */
  324. if (!mrq->data)
  325. goto request_done;
  326. /* Calculate the amount of bytes transfer if there was no error */
  327. if (mrq->data->error == 0) {
  328. mrq->data->bytes_xfered =
  329. (mrq->data->blocks * mrq->data->blksz);
  330. } else {
  331. mrq->data->bytes_xfered = 0;
  332. }
  333. request_done:
  334. host->state = STATE_NONE;
  335. host->mrq = NULL;
  336. mmc_request_done(mmc, mrq);
  337. return IRQ_HANDLED;
  338. }
  339. static irqreturn_t loongson2_mmc_irq(int irq, void *devid)
  340. {
  341. struct loongson2_mmc_host *host = (struct loongson2_mmc_host *)devid;
  342. struct mmc_host *mmc = mmc_from_priv(host);
  343. struct mmc_command *cmd;
  344. unsigned long iflags;
  345. u32 dsts, imsk;
  346. regmap_read(host->regmap, LOONGSON2_MMC_REG_INT, &imsk);
  347. regmap_read(host->regmap, LOONGSON2_MMC_REG_DSTS, &dsts);
  348. if ((dsts & LOONGSON2_MMC_DSTS_IRQ) &&
  349. (imsk & LOONGSON2_MMC_INT_SDIOIRQ)) {
  350. regmap_update_bits(host->regmap, LOONGSON2_MMC_REG_INT,
  351. LOONGSON2_MMC_INT_SDIOIRQ, LOONGSON2_MMC_INT_SDIOIRQ);
  352. sdio_signal_irq(mmc);
  353. return IRQ_HANDLED;
  354. }
  355. spin_lock_irqsave(&host->lock, iflags);
  356. if (host->state == STATE_NONE || host->state == STATE_FINALIZE || !host->mrq)
  357. goto irq_out;
  358. cmd = host->cmd_is_stop ? host->mrq->stop : host->mrq->cmd;
  359. if (!cmd)
  360. goto irq_out;
  361. cmd->error = 0;
  362. if (imsk & LOONGSON2_MMC_INT_CTIMEOUT) {
  363. cmd->error = -ETIMEDOUT;
  364. goto close_transfer;
  365. }
  366. if (imsk & LOONGSON2_MMC_INT_CSENT) {
  367. if (host->state == STATE_RSPFIN || host->state == STATE_CMDSENT)
  368. goto close_transfer;
  369. if (host->state == STATE_XFERFINISH_RSPFIN)
  370. host->state = STATE_XFERFINISH;
  371. }
  372. if (!cmd->data)
  373. goto irq_out;
  374. if (imsk & (LOONGSON2_MMC_INT_RXCRC | LOONGSON2_MMC_INT_TXCRC)) {
  375. cmd->data->error = -EILSEQ;
  376. goto close_transfer;
  377. }
  378. if (imsk & LOONGSON2_MMC_INT_DTIMEOUT) {
  379. cmd->data->error = -ETIMEDOUT;
  380. goto close_transfer;
  381. }
  382. if (imsk & LOONGSON2_MMC_INT_DFIN) {
  383. if (host->state == STATE_XFERFINISH) {
  384. host->dma_complete = 1;
  385. goto close_transfer;
  386. }
  387. if (host->state == STATE_XFERFINISH_RSPFIN)
  388. host->state = STATE_RSPFIN;
  389. }
  390. irq_out:
  391. regmap_write(host->regmap, LOONGSON2_MMC_REG_INT, imsk);
  392. spin_unlock_irqrestore(&host->lock, iflags);
  393. return IRQ_HANDLED;
  394. close_transfer:
  395. host->state = STATE_FINALIZE;
  396. host->pdata->reorder_cmd_data(host, cmd);
  397. regmap_write(host->regmap, LOONGSON2_MMC_REG_INT, imsk);
  398. spin_unlock_irqrestore(&host->lock, iflags);
  399. return IRQ_WAKE_THREAD;
  400. }
  401. static void loongson2_mmc_dll_mode_init(struct loongson2_mmc_host *host)
  402. {
  403. u32 val, pad_delay, delay;
  404. int ret;
  405. regmap_update_bits(host->regmap, LOONGSON2_MMC_REG_SEL,
  406. LOONGSON2_MMC_SEL_DATA, LOONGSON2_MMC_SEL_DATA);
  407. val = FIELD_PREP(LOONGSON2_MMC_DLLCTL_TIME, 0xc8)
  408. | FIELD_PREP(LOONGSON2_MMC_DLLCTL_INCRE, 0x1)
  409. | FIELD_PREP(LOONGSON2_MMC_DLLCTL_START, 0x1)
  410. | FIELD_PREP(LOONGSON2_MMC_DLLCTL_CLK_MODE, 0x1)
  411. | FIELD_PREP(LOONGSON2_MMC_DLLCTL_START_BIT, 0x1)
  412. | FIELD_PREP(LOONGSON2_MMC_DLLCTL_TIME_BPASS, 0xf);
  413. regmap_write(host->regmap, LOONGSON2_MMC_REG_DLLCTL, val);
  414. ret = regmap_read_poll_timeout(host->regmap, LOONGSON2_MMC_REG_DLLVAL, val,
  415. (val & LOONGSON2_MMC_DLLVAL_DONE), 0,
  416. LOONGSON2_MMC_DLLVAL_TIMEOUT_US);
  417. if (ret < 0)
  418. return;
  419. regmap_read(host->regmap, LOONGSON2_MMC_REG_DLLVAL, &val);
  420. pad_delay = FIELD_GET(GENMASK(7, 1), val);
  421. delay = FIELD_PREP(LOONGSON2_MMC_DELAY_PAD, pad_delay)
  422. | FIELD_PREP(LOONGSON2_MMC_DELAY_RD, pad_delay + 1);
  423. regmap_write(host->regmap, LOONGSON2_MMC_REG_DELAY, delay);
  424. }
  425. static void loongson2_mmc_set_clk(struct loongson2_mmc_host *host, struct mmc_ios *ios)
  426. {
  427. u32 pre;
  428. pre = DIV_ROUND_UP(host->current_clk, ios->clock);
  429. if (pre > 255)
  430. pre = 255;
  431. regmap_write(host->regmap, LOONGSON2_MMC_REG_PRE, pre | LOONGSON2_MMC_PRE_EN);
  432. regmap_update_bits(host->regmap, LOONGSON2_MMC_REG_CTL,
  433. LOONGSON2_MMC_CTL_ENCLK, LOONGSON2_MMC_CTL_ENCLK);
  434. /* EMMC DLL mode setting */
  435. if (ios->timing == MMC_TIMING_UHS_DDR50 || ios->timing == MMC_TIMING_MMC_DDR52)
  436. loongson2_mmc_dll_mode_init(host);
  437. }
  438. static void loongson2_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
  439. {
  440. struct loongson2_mmc_host *host = mmc_priv(mmc);
  441. int ret;
  442. if (ios->power_mode == MMC_POWER_UP) {
  443. if (!IS_ERR(mmc->supply.vmmc)) {
  444. ret = mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, ios->vdd);
  445. if (ret) {
  446. dev_err(host->dev, "failed to enable vmmc regulator\n");
  447. return; /* return, if failed turn on vmmc */
  448. }
  449. }
  450. regmap_write(host->regmap, LOONGSON2_MMC_REG_CTL, LOONGSON2_MMC_CTL_RESET);
  451. mdelay(10);
  452. regmap_write(host->regmap, LOONGSON2_MMC_REG_CTL, LOONGSON2_MMC_CTL_EXTCLK);
  453. regmap_write(host->regmap, LOONGSON2_MMC_REG_INT, LOONGSON2_MMC_IEN_ALL);
  454. regmap_write(host->regmap, LOONGSON2_MMC_REG_IEN, LOONGSON2_MMC_INT_CLEAR);
  455. } else if (ios->power_mode == MMC_POWER_OFF) {
  456. regmap_update_bits(host->regmap, LOONGSON2_MMC_REG_CTL,
  457. LOONGSON2_MMC_CTL_RESET, LOONGSON2_MMC_CTL_RESET);
  458. if (!IS_ERR(mmc->supply.vmmc))
  459. mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, 0);
  460. return;
  461. }
  462. loongson2_mmc_set_clk(host, ios);
  463. host->bus_width = ios->bus_width;
  464. }
  465. static void loongson2_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
  466. {
  467. struct loongson2_mmc_host *host = mmc_priv(mmc);
  468. host->cmd_is_stop = 0;
  469. host->mrq = mrq;
  470. loongson2_mmc_send_request(mmc);
  471. }
  472. static void loongson2_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
  473. {
  474. struct loongson2_mmc_host *host = mmc_priv(mmc);
  475. regmap_update_bits(host->regmap, LOONGSON2_MMC_REG_IEN, LOONGSON2_MMC_INT_SDIOIRQ, enable);
  476. }
  477. static void loongson2_mmc_ack_sdio_irq(struct mmc_host *mmc)
  478. {
  479. loongson2_mmc_enable_sdio_irq(mmc, 1);
  480. }
  481. static struct mmc_host_ops loongson2_mmc_ops = {
  482. .request = loongson2_mmc_request,
  483. .set_ios = loongson2_mmc_set_ios,
  484. .get_ro = mmc_gpio_get_ro,
  485. .get_cd = mmc_gpio_get_cd,
  486. .enable_sdio_irq = loongson2_mmc_enable_sdio_irq,
  487. .ack_sdio_irq = loongson2_mmc_ack_sdio_irq,
  488. };
  489. static const struct regmap_config ls2k0500_mmc_regmap_config = {
  490. .reg_bits = 32,
  491. .val_bits = 32,
  492. .reg_stride = 4,
  493. .max_register = LOONGSON2_MMC_REG_IEN,
  494. };
  495. static int loongson2_reorder_cmd_list[] = { SD_APP_SEND_SCR, SD_APP_SEND_NUM_WR_BLKS,
  496. SD_APP_SD_STATUS, MMC_SEND_WRITE_PROT, SD_SWITCH };
  497. /*
  498. * According to SD spec, ACMD13, ACMD22, ACMD51 and CMD30
  499. * response datas has different byte order with usual data packets.
  500. * However sdio controller will send these datas in usual data format,
  501. * so we need to adjust these datas to a protocol consistent byte order.
  502. */
  503. static void ls2k0500_mmc_reorder_cmd_data(struct loongson2_mmc_host *host,
  504. struct mmc_command *cmd)
  505. {
  506. struct scatterlist *sg;
  507. u32 *data;
  508. int i, j;
  509. if (mmc_cmd_type(cmd) != MMC_CMD_ADTC)
  510. return;
  511. for (i = 0; i < ARRAY_SIZE(loongson2_reorder_cmd_list); i++)
  512. if (cmd->opcode == loongson2_reorder_cmd_list[i])
  513. break;
  514. if (i == ARRAY_SIZE(loongson2_reorder_cmd_list))
  515. return;
  516. for_each_sg(cmd->data->sg, sg, cmd->data->sg_len, i) {
  517. data = sg_virt(&sg[i]);
  518. for (j = 0; j < (sg_dma_len(&sg[i]) / 4); j++)
  519. if (cmd->opcode == SD_SWITCH)
  520. data[j] = bitrev8x4(data[j]);
  521. else
  522. data[j] = (__force u32)cpu_to_be32(data[j]);
  523. }
  524. }
  525. static int loongson2_mmc_prepare_external_dma(struct loongson2_mmc_host *host,
  526. struct mmc_data *data)
  527. {
  528. struct mmc_host *mmc = mmc_from_priv(host);
  529. struct dma_slave_config dma_conf = { };
  530. struct dma_async_tx_descriptor *desc;
  531. int ret;
  532. ret = dma_map_sg(mmc_dev(mmc), data->sg, data->sg_len,
  533. mmc_get_dma_dir(data));
  534. if (!ret)
  535. return -ENOMEM;
  536. dma_conf.src_addr = host->res->start + LOONGSON2_MMC_REG_DATA,
  537. dma_conf.dst_addr = host->res->start + LOONGSON2_MMC_REG_DATA,
  538. dma_conf.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES,
  539. dma_conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES,
  540. dma_conf.direction = !(data->flags & MMC_DATA_WRITE) ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV;
  541. dmaengine_slave_config(host->chan, &dma_conf);
  542. desc = dmaengine_prep_slave_sg(host->chan, data->sg, data->sg_len,
  543. dma_conf.direction,
  544. DMA_CTRL_ACK | DMA_PREP_INTERRUPT);
  545. if (!desc)
  546. goto unmap_exit;
  547. dmaengine_submit(desc);
  548. dma_async_issue_pending(host->chan);
  549. return 0;
  550. unmap_exit:
  551. dma_unmap_sg(mmc_dev(mmc), data->sg, data->sg_len, mmc_get_dma_dir(data));
  552. return -ENOMEM;
  553. }
  554. static void loongson2_mmc_release_external_dma(struct loongson2_mmc_host *host,
  555. struct device *dev)
  556. {
  557. dma_release_channel(host->chan);
  558. }
  559. static int ls2k0500_mmc_set_external_dma(struct loongson2_mmc_host *host,
  560. struct platform_device *pdev)
  561. {
  562. int ret, val;
  563. void __iomem *regs;
  564. regs = devm_platform_ioremap_resource(pdev, 1);
  565. if (IS_ERR(regs))
  566. return PTR_ERR(regs);
  567. val = readl(regs);
  568. val |= FIELD_PREP(LS2K0500_SDIO_DMA_MASK, LS2K0500_DMA2_CONF);
  569. writel(val, regs);
  570. host->chan = dma_request_chan(&pdev->dev, "rx-tx");
  571. ret = PTR_ERR_OR_ZERO(host->chan);
  572. if (ret) {
  573. dev_err(&pdev->dev, "Cannot get DMA channel.\n");
  574. return ret;
  575. }
  576. return 0;
  577. }
  578. static struct loongson2_mmc_pdata ls2k0500_mmc_pdata = {
  579. .regmap_config = &ls2k0500_mmc_regmap_config,
  580. .reorder_cmd_data = ls2k0500_mmc_reorder_cmd_data,
  581. .setting_dma = ls2k0500_mmc_set_external_dma,
  582. .prepare_dma = loongson2_mmc_prepare_external_dma,
  583. .release_dma = loongson2_mmc_release_external_dma,
  584. };
  585. static int ls2k1000_mmc_set_external_dma(struct loongson2_mmc_host *host,
  586. struct platform_device *pdev)
  587. {
  588. int ret, val;
  589. void __iomem *regs;
  590. regs = devm_platform_ioremap_resource(pdev, 1);
  591. if (IS_ERR(regs))
  592. return PTR_ERR(regs);
  593. val = readl(regs);
  594. val |= FIELD_PREP(LS2K1000_SDIO_DMA_MASK, LS2K1000_DMA1_CONF);
  595. writel(val, regs);
  596. host->chan = dma_request_chan(&pdev->dev, "rx-tx");
  597. ret = PTR_ERR_OR_ZERO(host->chan);
  598. if (ret) {
  599. dev_err(&pdev->dev, "Cannot get DMA channel.\n");
  600. return ret;
  601. }
  602. return 0;
  603. }
  604. static struct loongson2_mmc_pdata ls2k1000_mmc_pdata = {
  605. .regmap_config = &ls2k0500_mmc_regmap_config,
  606. .reorder_cmd_data = ls2k0500_mmc_reorder_cmd_data,
  607. .setting_dma = ls2k1000_mmc_set_external_dma,
  608. .prepare_dma = loongson2_mmc_prepare_external_dma,
  609. .release_dma = loongson2_mmc_release_external_dma,
  610. };
  611. static const struct regmap_config ls2k2000_mmc_regmap_config = {
  612. .reg_bits = 32,
  613. .val_bits = 32,
  614. .reg_stride = 4,
  615. .max_register = LOONGSON2_MMC_REG_RDMA_HI,
  616. };
  617. static void ls2k2000_mmc_reorder_cmd_data(struct loongson2_mmc_host *host,
  618. struct mmc_command *cmd)
  619. {
  620. struct scatterlist *sg;
  621. u32 *data;
  622. int i, j;
  623. if (cmd->opcode != SD_SWITCH || mmc_cmd_type(cmd) != MMC_CMD_ADTC)
  624. return;
  625. for_each_sg(cmd->data->sg, sg, cmd->data->sg_len, i) {
  626. data = sg_virt(&sg[i]);
  627. for (j = 0; j < (sg_dma_len(&sg[i]) / 4); j++)
  628. data[j] = bitrev8x4(data[j]);
  629. }
  630. }
  631. /*
  632. * This is a controller hardware defect. Single/multiple block write commands
  633. * must be sent after the TX FULL flag is set, otherwise a data timeout interrupt
  634. * will occur.
  635. */
  636. static void ls2k2000_mmc_fix_data_timeout(struct loongson2_mmc_host *host,
  637. struct mmc_command *cmd)
  638. {
  639. int val;
  640. if (cmd->opcode != MMC_WRITE_BLOCK && cmd->opcode != MMC_WRITE_MULTIPLE_BLOCK)
  641. return;
  642. regmap_read_poll_timeout(host->regmap, LOONGSON2_MMC_REG_FSTS, val,
  643. (val & LOONGSON2_MMC_FSTS_TXFULL), 0,
  644. LOONGSON2_MMC_TXFULL_TIMEOUT_US);
  645. }
  646. static int loongson2_mmc_prepare_internal_dma(struct loongson2_mmc_host *host,
  647. struct mmc_data *data)
  648. {
  649. struct loongson2_dma_desc *pdes = (struct loongson2_dma_desc *)host->sg_cpu;
  650. struct mmc_host *mmc = mmc_from_priv(host);
  651. dma_addr_t next_desc = host->sg_dma;
  652. struct scatterlist *sg;
  653. int reg_lo, reg_hi;
  654. u64 dma_order;
  655. int i, ret;
  656. ret = dma_map_sg(mmc_dev(mmc), data->sg, data->sg_len,
  657. mmc_get_dma_dir(data));
  658. if (!ret)
  659. return -ENOMEM;
  660. for_each_sg(data->sg, sg, data->sg_len, i) {
  661. pdes[i].len = sg_dma_len(&sg[i]) / 4;
  662. pdes[i].step_len = 0;
  663. pdes[i].step_times = 1;
  664. pdes[i].mem_addr = lower_32_bits(sg_dma_address(&sg[i]));
  665. pdes[i].high_mem_addr = upper_32_bits(sg_dma_address(&sg[i]));
  666. pdes[i].apb_addr = host->res->start + LOONGSON2_MMC_REG_DATA;
  667. pdes[i].cmd = LOONGSON2_MMC_DMA_INT;
  668. if (data->flags & MMC_DATA_READ) {
  669. reg_lo = LOONGSON2_MMC_REG_RDMA_LO;
  670. reg_hi = LOONGSON2_MMC_REG_RDMA_HI;
  671. } else {
  672. pdes[i].cmd |= LOONGSON2_MMC_DMA_DATA_DIR;
  673. reg_lo = LOONGSON2_MMC_REG_WDMA_LO;
  674. reg_hi = LOONGSON2_MMC_REG_WDMA_HI;
  675. }
  676. next_desc += sizeof(struct loongson2_dma_desc);
  677. pdes[i].ndesc_addr = lower_32_bits(next_desc) |
  678. LOONGSON2_MMC_DMA_DESC_EN;
  679. pdes[i].high_ndesc_addr = upper_32_bits(next_desc);
  680. }
  681. /* Setting the last descriptor enable bit */
  682. pdes[i - 1].ndesc_addr &= ~LOONGSON2_MMC_DMA_DESC_EN;
  683. dma_order = (host->sg_dma & ~LOONGSON2_MMC_DMA_CONFIG_MASK) |
  684. LOONGSON2_MMC_DMA_64BIT_EN |
  685. LOONGSON2_MMC_DMA_START;
  686. regmap_write(host->regmap, reg_hi, upper_32_bits(dma_order));
  687. regmap_write(host->regmap, reg_lo, lower_32_bits(dma_order));
  688. return 0;
  689. }
  690. static int ls2k2000_mmc_set_internal_dma(struct loongson2_mmc_host *host,
  691. struct platform_device *pdev)
  692. {
  693. host->sg_cpu = dma_alloc_coherent(&pdev->dev, PAGE_SIZE,
  694. &host->sg_dma, GFP_KERNEL);
  695. if (!host->sg_cpu)
  696. return -ENOMEM;
  697. memset(host->sg_cpu, 0, PAGE_SIZE);
  698. return 0;
  699. }
  700. static void loongson2_mmc_release_internal_dma(struct loongson2_mmc_host *host,
  701. struct device *dev)
  702. {
  703. dma_free_coherent(dev, PAGE_SIZE, host->sg_cpu, host->sg_dma);
  704. }
  705. static struct loongson2_mmc_pdata ls2k2000_mmc_pdata = {
  706. .regmap_config = &ls2k2000_mmc_regmap_config,
  707. .reorder_cmd_data = ls2k2000_mmc_reorder_cmd_data,
  708. .fix_data_timeout = ls2k2000_mmc_fix_data_timeout,
  709. .setting_dma = ls2k2000_mmc_set_internal_dma,
  710. .prepare_dma = loongson2_mmc_prepare_internal_dma,
  711. .release_dma = loongson2_mmc_release_internal_dma,
  712. };
  713. static int loongson2_mmc_resource_request(struct platform_device *pdev,
  714. struct loongson2_mmc_host *host)
  715. {
  716. struct device *dev = &pdev->dev;
  717. void __iomem *base;
  718. int ret, irq;
  719. base = devm_platform_get_and_ioremap_resource(pdev, 0, &host->res);
  720. if (IS_ERR(base))
  721. return PTR_ERR(base);
  722. host->regmap = devm_regmap_init_mmio(dev, base, host->pdata->regmap_config);
  723. if (IS_ERR(host->regmap))
  724. return PTR_ERR(host->regmap);
  725. host->clk = devm_clk_get_optional_enabled(dev, NULL);
  726. if (IS_ERR(host->clk))
  727. return PTR_ERR(host->clk);
  728. if (host->clk) {
  729. ret = devm_clk_rate_exclusive_get(dev, host->clk);
  730. if (ret)
  731. return ret;
  732. host->current_clk = clk_get_rate(host->clk);
  733. } else {
  734. /* For ACPI, the clock is accessed via the clock-frequency attribute. */
  735. device_property_read_u32(dev, "clock-frequency", &host->current_clk);
  736. }
  737. irq = platform_get_irq(pdev, 0);
  738. if (irq < 0)
  739. return irq;
  740. ret = devm_request_threaded_irq(dev, irq, loongson2_mmc_irq,
  741. loongson2_mmc_irq_worker,
  742. IRQF_ONESHOT, "loongson2-mmc", host);
  743. if (ret)
  744. return ret;
  745. ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64));
  746. if (ret)
  747. return ret;
  748. return host->pdata->setting_dma(host, pdev);
  749. }
  750. static int loongson2_mmc_probe(struct platform_device *pdev)
  751. {
  752. struct device *dev = &pdev->dev;
  753. struct loongson2_mmc_host *host;
  754. struct mmc_host *mmc;
  755. int ret;
  756. mmc = devm_mmc_alloc_host(dev, sizeof(*host));
  757. if (!mmc)
  758. return -ENOMEM;
  759. platform_set_drvdata(pdev, mmc);
  760. host = mmc_priv(mmc);
  761. host->state = STATE_NONE;
  762. spin_lock_init(&host->lock);
  763. host->pdata = device_get_match_data(dev);
  764. if (!host->pdata)
  765. return dev_err_probe(dev, -EINVAL, "Failed to get match data\n");
  766. ret = loongson2_mmc_resource_request(pdev, host);
  767. if (ret)
  768. return dev_err_probe(dev, ret, "Failed to request resource\n");
  769. mmc->ops = &loongson2_mmc_ops;
  770. mmc->f_min = DIV_ROUND_UP(host->current_clk, 256);
  771. mmc->f_max = host->current_clk;
  772. mmc->max_blk_count = 4095;
  773. mmc->max_blk_size = 4095;
  774. mmc->max_req_size = mmc->max_blk_count * mmc->max_blk_size;
  775. mmc->max_segs = 1;
  776. mmc->max_seg_size = mmc->max_req_size;
  777. /* Process SDIO IRQs through the sdio_irq_work. */
  778. if (mmc->caps & MMC_CAP_SDIO_IRQ)
  779. mmc->caps2 |= MMC_CAP2_SDIO_IRQ_NOTHREAD;
  780. ret = mmc_regulator_get_supply(mmc);
  781. if (ret || mmc->ocr_avail == 0) {
  782. dev_warn(dev, "Can't get voltage, defaulting to 3.3V\n");
  783. mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
  784. }
  785. ret = mmc_of_parse(mmc);
  786. if (ret) {
  787. dev_err(dev, "Failed to parse device node\n");
  788. goto free_dma;
  789. }
  790. ret = mmc_add_host(mmc);
  791. if (ret) {
  792. dev_err(dev, "Failed to add mmc host\n");
  793. goto free_dma;
  794. }
  795. return 0;
  796. free_dma:
  797. host->pdata->release_dma(host, dev);
  798. return ret;
  799. }
  800. static void loongson2_mmc_remove(struct platform_device *pdev)
  801. {
  802. struct mmc_host *mmc = platform_get_drvdata(pdev);
  803. struct loongson2_mmc_host *host = mmc_priv(mmc);
  804. mmc_remove_host(mmc);
  805. host->pdata->release_dma(host, &pdev->dev);
  806. }
  807. static const struct of_device_id loongson2_mmc_of_ids[] = {
  808. { .compatible = "loongson,ls2k0500-mmc", .data = &ls2k0500_mmc_pdata },
  809. { .compatible = "loongson,ls2k1000-mmc", .data = &ls2k1000_mmc_pdata },
  810. { .compatible = "loongson,ls2k2000-mmc", .data = &ls2k2000_mmc_pdata },
  811. { },
  812. };
  813. MODULE_DEVICE_TABLE(of, loongson2_mmc_of_ids);
  814. static int loongson2_mmc_suspend(struct device *dev)
  815. {
  816. struct mmc_host *mmc = dev_get_drvdata(dev);
  817. struct loongson2_mmc_host *host = mmc_priv(mmc);
  818. clk_disable_unprepare(host->clk);
  819. return 0;
  820. }
  821. static int loongson2_mmc_resume(struct device *dev)
  822. {
  823. struct mmc_host *mmc = dev_get_drvdata(dev);
  824. struct loongson2_mmc_host *host = mmc_priv(mmc);
  825. return clk_prepare_enable(host->clk);
  826. }
  827. static DEFINE_SIMPLE_DEV_PM_OPS(loongson2_mmc_pm_ops, loongson2_mmc_suspend, loongson2_mmc_resume);
  828. static struct platform_driver loongson2_mmc_driver = {
  829. .driver = {
  830. .name = "loongson2-mmc",
  831. .of_match_table = loongson2_mmc_of_ids,
  832. .pm = pm_ptr(&loongson2_mmc_pm_ops),
  833. .probe_type = PROBE_PREFER_ASYNCHRONOUS,
  834. },
  835. .probe = loongson2_mmc_probe,
  836. .remove = loongson2_mmc_remove,
  837. };
  838. module_platform_driver(loongson2_mmc_driver);
  839. MODULE_DESCRIPTION("Loongson-2K SD/SDIO/eMMC Interface driver");
  840. MODULE_AUTHOR("Loongson Technology Corporation Limited");
  841. MODULE_LICENSE("GPL");