0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/scatterlist.h>
0009
0010 #include <linux/mmc/host.h>
0011 #include <linux/mmc/card.h>
0012 #include <linux/mmc/mmc.h>
0013 #include <linux/mmc/sdio.h>
0014
0015 #include "core.h"
0016 #include "sdio_ops.h"
0017
0018 int mmc_send_io_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr)
0019 {
0020 struct mmc_command cmd = {};
0021 int i, err = 0;
0022
0023 cmd.opcode = SD_IO_SEND_OP_COND;
0024 cmd.arg = ocr;
0025 cmd.flags = MMC_RSP_SPI_R4 | MMC_RSP_R4 | MMC_CMD_BCR;
0026
0027 for (i = 100; i; i--) {
0028 err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES);
0029 if (err)
0030 break;
0031
0032
0033 if (ocr == 0)
0034 break;
0035
0036
0037 if (mmc_host_is_spi(host)) {
0038
0039
0040
0041
0042
0043
0044 if (cmd.resp[1] & MMC_CARD_BUSY)
0045 break;
0046 } else {
0047 if (cmd.resp[0] & MMC_CARD_BUSY)
0048 break;
0049 }
0050
0051 err = -ETIMEDOUT;
0052
0053 mmc_delay(10);
0054 }
0055
0056 if (rocr)
0057 *rocr = cmd.resp[mmc_host_is_spi(host) ? 1 : 0];
0058
0059 return err;
0060 }
0061
0062 static int mmc_io_rw_direct_host(struct mmc_host *host, int write, unsigned fn,
0063 unsigned addr, u8 in, u8 *out)
0064 {
0065 struct mmc_command cmd = {};
0066 int err;
0067
0068 if (fn > 7)
0069 return -EINVAL;
0070
0071
0072 if (addr & ~0x1FFFF)
0073 return -EINVAL;
0074
0075 cmd.opcode = SD_IO_RW_DIRECT;
0076 cmd.arg = write ? 0x80000000 : 0x00000000;
0077 cmd.arg |= fn << 28;
0078 cmd.arg |= (write && out) ? 0x08000000 : 0x00000000;
0079 cmd.arg |= addr << 9;
0080 cmd.arg |= in;
0081 cmd.flags = MMC_RSP_SPI_R5 | MMC_RSP_R5 | MMC_CMD_AC;
0082
0083 err = mmc_wait_for_cmd(host, &cmd, 0);
0084 if (err)
0085 return err;
0086
0087 if (mmc_host_is_spi(host)) {
0088
0089 } else {
0090 if (cmd.resp[0] & R5_ERROR)
0091 return -EIO;
0092 if (cmd.resp[0] & R5_FUNCTION_NUMBER)
0093 return -EINVAL;
0094 if (cmd.resp[0] & R5_OUT_OF_RANGE)
0095 return -ERANGE;
0096 }
0097
0098 if (out) {
0099 if (mmc_host_is_spi(host))
0100 *out = (cmd.resp[0] >> 8) & 0xFF;
0101 else
0102 *out = cmd.resp[0] & 0xFF;
0103 }
0104
0105 return 0;
0106 }
0107
0108 int mmc_io_rw_direct(struct mmc_card *card, int write, unsigned fn,
0109 unsigned addr, u8 in, u8 *out)
0110 {
0111 return mmc_io_rw_direct_host(card->host, write, fn, addr, in, out);
0112 }
0113
0114 int mmc_io_rw_extended(struct mmc_card *card, int write, unsigned fn,
0115 unsigned addr, int incr_addr, u8 *buf, unsigned blocks, unsigned blksz)
0116 {
0117 struct mmc_request mrq = {};
0118 struct mmc_command cmd = {};
0119 struct mmc_data data = {};
0120 struct scatterlist sg, *sg_ptr;
0121 struct sg_table sgtable;
0122 unsigned int nents, left_size, i;
0123 unsigned int seg_size = card->host->max_seg_size;
0124 int err;
0125
0126 WARN_ON(blksz == 0);
0127
0128
0129 if (addr & ~0x1FFFF)
0130 return -EINVAL;
0131
0132 mrq.cmd = &cmd;
0133 mrq.data = &data;
0134
0135 cmd.opcode = SD_IO_RW_EXTENDED;
0136 cmd.arg = write ? 0x80000000 : 0x00000000;
0137 cmd.arg |= fn << 28;
0138 cmd.arg |= incr_addr ? 0x04000000 : 0x00000000;
0139 cmd.arg |= addr << 9;
0140 if (blocks == 0)
0141 cmd.arg |= (blksz == 512) ? 0 : blksz;
0142 else
0143 cmd.arg |= 0x08000000 | blocks;
0144 cmd.flags = MMC_RSP_SPI_R5 | MMC_RSP_R5 | MMC_CMD_ADTC;
0145
0146 data.blksz = blksz;
0147
0148 data.blocks = blocks ? blocks : 1;
0149 data.flags = write ? MMC_DATA_WRITE : MMC_DATA_READ;
0150
0151 left_size = data.blksz * data.blocks;
0152 nents = DIV_ROUND_UP(left_size, seg_size);
0153 if (nents > 1) {
0154 if (sg_alloc_table(&sgtable, nents, GFP_KERNEL))
0155 return -ENOMEM;
0156
0157 data.sg = sgtable.sgl;
0158 data.sg_len = nents;
0159
0160 for_each_sg(data.sg, sg_ptr, data.sg_len, i) {
0161 sg_set_buf(sg_ptr, buf + i * seg_size,
0162 min(seg_size, left_size));
0163 left_size -= seg_size;
0164 }
0165 } else {
0166 data.sg = &sg;
0167 data.sg_len = 1;
0168
0169 sg_init_one(&sg, buf, left_size);
0170 }
0171
0172 mmc_set_data_timeout(&data, card);
0173
0174 mmc_pre_req(card->host, &mrq);
0175
0176 mmc_wait_for_req(card->host, &mrq);
0177
0178 if (cmd.error)
0179 err = cmd.error;
0180 else if (data.error)
0181 err = data.error;
0182 else if (mmc_host_is_spi(card->host))
0183
0184 err = 0;
0185 else if (cmd.resp[0] & R5_ERROR)
0186 err = -EIO;
0187 else if (cmd.resp[0] & R5_FUNCTION_NUMBER)
0188 err = -EINVAL;
0189 else if (cmd.resp[0] & R5_OUT_OF_RANGE)
0190 err = -ERANGE;
0191 else
0192 err = 0;
0193
0194 mmc_post_req(card->host, &mrq, err);
0195
0196 if (nents > 1)
0197 sg_free_table(&sgtable);
0198
0199 return err;
0200 }
0201
0202 int sdio_reset(struct mmc_host *host)
0203 {
0204 int ret;
0205 u8 abort;
0206
0207
0208
0209 ret = mmc_io_rw_direct_host(host, 0, 0, SDIO_CCCR_ABORT, 0, &abort);
0210 if (ret)
0211 abort = 0x08;
0212 else
0213 abort |= 0x08;
0214
0215 return mmc_io_rw_direct_host(host, 1, 0, SDIO_CCCR_ABORT, abort, NULL);
0216 }
0217