sandbox_mmc.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /*
  2. * Copyright (c) 2015 Google, Inc
  3. * Written by Simon Glass <sjg@chromium.org>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <dm.h>
  9. #include <errno.h>
  10. #include <fdtdec.h>
  11. #include <mmc.h>
  12. #include <asm/test.h>
  13. DECLARE_GLOBAL_DATA_PTR;
  14. struct sandbox_mmc_plat {
  15. struct mmc_config cfg;
  16. struct mmc mmc;
  17. };
  18. /**
  19. * sandbox_mmc_send_cmd() - Emulate SD commands
  20. *
  21. * This emulate an SD card version 2. Single-block reads result in zero data.
  22. * Multiple-block reads return a test string.
  23. */
  24. static int sandbox_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
  25. struct mmc_data *data)
  26. {
  27. switch (cmd->cmdidx) {
  28. case MMC_CMD_ALL_SEND_CID:
  29. break;
  30. case SD_CMD_SEND_RELATIVE_ADDR:
  31. cmd->response[0] = 0 << 16; /* mmc->rca */
  32. case MMC_CMD_GO_IDLE_STATE:
  33. break;
  34. case SD_CMD_SEND_IF_COND:
  35. cmd->response[0] = 0xaa;
  36. break;
  37. case MMC_CMD_SEND_STATUS:
  38. cmd->response[0] = MMC_STATUS_RDY_FOR_DATA;
  39. break;
  40. case MMC_CMD_SELECT_CARD:
  41. break;
  42. case MMC_CMD_SEND_CSD:
  43. cmd->response[0] = 0;
  44. cmd->response[1] = 10 << 16; /* 1 << block_len */
  45. break;
  46. case SD_CMD_SWITCH_FUNC: {
  47. u32 *resp = (u32 *)data->dest;
  48. resp[7] = cpu_to_be32(SD_HIGHSPEED_BUSY);
  49. break;
  50. }
  51. case MMC_CMD_READ_SINGLE_BLOCK:
  52. memset(data->dest, '\0', data->blocksize);
  53. break;
  54. case MMC_CMD_READ_MULTIPLE_BLOCK:
  55. strcpy(data->dest, "this is a test");
  56. break;
  57. case MMC_CMD_STOP_TRANSMISSION:
  58. break;
  59. case SD_CMD_APP_SEND_OP_COND:
  60. cmd->response[0] = OCR_BUSY | OCR_HCS;
  61. cmd->response[1] = 0;
  62. cmd->response[2] = 0;
  63. break;
  64. case MMC_CMD_APP_CMD:
  65. break;
  66. case MMC_CMD_SET_BLOCKLEN:
  67. debug("block len %d\n", cmd->cmdarg);
  68. break;
  69. case SD_CMD_APP_SEND_SCR: {
  70. u32 *scr = (u32 *)data->dest;
  71. scr[0] = cpu_to_be32(2 << 24 | 1 << 15); /* SD version 3 */
  72. break;
  73. }
  74. default:
  75. debug("%s: Unknown command %d\n", __func__, cmd->cmdidx);
  76. break;
  77. }
  78. return 0;
  79. }
  80. static int sandbox_mmc_set_ios(struct udevice *dev)
  81. {
  82. return 0;
  83. }
  84. static int sandbox_mmc_get_cd(struct udevice *dev)
  85. {
  86. return 1;
  87. }
  88. static const struct dm_mmc_ops sandbox_mmc_ops = {
  89. .send_cmd = sandbox_mmc_send_cmd,
  90. .set_ios = sandbox_mmc_set_ios,
  91. .get_cd = sandbox_mmc_get_cd,
  92. };
  93. int sandbox_mmc_probe(struct udevice *dev)
  94. {
  95. struct sandbox_mmc_plat *plat = dev_get_platdata(dev);
  96. return mmc_init(&plat->mmc);
  97. }
  98. int sandbox_mmc_bind(struct udevice *dev)
  99. {
  100. struct sandbox_mmc_plat *plat = dev_get_platdata(dev);
  101. struct mmc_config *cfg = &plat->cfg;
  102. cfg->name = dev->name;
  103. cfg->host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS | MMC_MODE_8BIT;
  104. cfg->voltages = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34;
  105. cfg->f_min = 1000000;
  106. cfg->f_max = 52000000;
  107. cfg->b_max = U32_MAX;
  108. return mmc_bind(dev, &plat->mmc, cfg);
  109. }
  110. int sandbox_mmc_unbind(struct udevice *dev)
  111. {
  112. mmc_unbind(dev);
  113. return 0;
  114. }
  115. static const struct udevice_id sandbox_mmc_ids[] = {
  116. { .compatible = "sandbox,mmc" },
  117. { }
  118. };
  119. U_BOOT_DRIVER(mmc_sandbox) = {
  120. .name = "mmc_sandbox",
  121. .id = UCLASS_MMC,
  122. .of_match = sandbox_mmc_ids,
  123. .ops = &sandbox_mmc_ops,
  124. .bind = sandbox_mmc_bind,
  125. .unbind = sandbox_mmc_unbind,
  126. .probe = sandbox_mmc_probe,
  127. .platdata_auto_alloc_size = sizeof(struct sandbox_mmc_plat),
  128. };