0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/module.h>
0010 #include <linux/init.h>
0011 #include <linux/io.h>
0012 #include <linux/platform_device.h>
0013 #include <linux/mbus.h>
0014 #include <linux/delay.h>
0015 #include <linux/interrupt.h>
0016 #include <linux/dma-mapping.h>
0017 #include <linux/scatterlist.h>
0018 #include <linux/irq.h>
0019 #include <linux/clk.h>
0020 #include <linux/of_irq.h>
0021 #include <linux/mmc/host.h>
0022 #include <linux/mmc/slot-gpio.h>
0023
0024 #include <linux/sizes.h>
0025 #include <asm/unaligned.h>
0026
0027 #include "mvsdio.h"
0028
0029 #define DRIVER_NAME "mvsdio"
0030
0031 static int maxfreq;
0032 static int nodma;
0033
0034 struct mvsd_host {
0035 void __iomem *base;
0036 struct mmc_request *mrq;
0037 spinlock_t lock;
0038 unsigned int xfer_mode;
0039 unsigned int intr_en;
0040 unsigned int ctrl;
0041 unsigned int pio_size;
0042 void *pio_ptr;
0043 unsigned int sg_frags;
0044 unsigned int ns_per_clk;
0045 unsigned int clock;
0046 unsigned int base_clock;
0047 struct timer_list timer;
0048 struct mmc_host *mmc;
0049 struct device *dev;
0050 struct clk *clk;
0051 };
0052
0053 #define mvsd_write(offs, val) writel(val, iobase + (offs))
0054 #define mvsd_read(offs) readl(iobase + (offs))
0055
0056 static int mvsd_setup_data(struct mvsd_host *host, struct mmc_data *data)
0057 {
0058 void __iomem *iobase = host->base;
0059 unsigned int tmout;
0060 int tmout_index;
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071 if (!(mvsd_read(MVSD_HW_STATE) & (1 << 13))) {
0072 unsigned long t = jiffies + HZ;
0073 unsigned int hw_state, count = 0;
0074 do {
0075 hw_state = mvsd_read(MVSD_HW_STATE);
0076 if (time_after(jiffies, t)) {
0077 dev_warn(host->dev, "FIFO_EMPTY bit missing\n");
0078 break;
0079 }
0080 count++;
0081 } while (!(hw_state & (1 << 13)));
0082 dev_dbg(host->dev, "*** wait for FIFO_EMPTY bit "
0083 "(hw=0x%04x, count=%d, jiffies=%ld)\n",
0084 hw_state, count, jiffies - (t - HZ));
0085 }
0086
0087
0088 tmout = DIV_ROUND_UP(data->timeout_ns, host->ns_per_clk);
0089 tmout += data->timeout_clks;
0090 tmout_index = fls(tmout - 1) - 12;
0091 if (tmout_index < 0)
0092 tmout_index = 0;
0093 if (tmout_index > MVSD_HOST_CTRL_TMOUT_MAX)
0094 tmout_index = MVSD_HOST_CTRL_TMOUT_MAX;
0095
0096 dev_dbg(host->dev, "data %s at 0x%08x: blocks=%d blksz=%d tmout=%u (%d)\n",
0097 (data->flags & MMC_DATA_READ) ? "read" : "write",
0098 (u32)sg_virt(data->sg), data->blocks, data->blksz,
0099 tmout, tmout_index);
0100
0101 host->ctrl &= ~MVSD_HOST_CTRL_TMOUT_MASK;
0102 host->ctrl |= MVSD_HOST_CTRL_TMOUT(tmout_index);
0103 mvsd_write(MVSD_HOST_CTRL, host->ctrl);
0104 mvsd_write(MVSD_BLK_COUNT, data->blocks);
0105 mvsd_write(MVSD_BLK_SIZE, data->blksz);
0106
0107 if (nodma || (data->blksz | data->sg->offset) & 3 ||
0108 ((!(data->flags & MMC_DATA_READ) && data->sg->offset & 0x3f))) {
0109
0110
0111
0112
0113
0114
0115
0116
0117 host->pio_size = data->blocks * data->blksz;
0118 host->pio_ptr = sg_virt(data->sg);
0119 if (!nodma)
0120 dev_dbg(host->dev, "fallback to PIO for data at 0x%p size %d\n",
0121 host->pio_ptr, host->pio_size);
0122 return 1;
0123 } else {
0124 dma_addr_t phys_addr;
0125
0126 host->sg_frags = dma_map_sg(mmc_dev(host->mmc),
0127 data->sg, data->sg_len,
0128 mmc_get_dma_dir(data));
0129 phys_addr = sg_dma_address(data->sg);
0130 mvsd_write(MVSD_SYS_ADDR_LOW, (u32)phys_addr & 0xffff);
0131 mvsd_write(MVSD_SYS_ADDR_HI, (u32)phys_addr >> 16);
0132 return 0;
0133 }
0134 }
0135
0136 static void mvsd_request(struct mmc_host *mmc, struct mmc_request *mrq)
0137 {
0138 struct mvsd_host *host = mmc_priv(mmc);
0139 void __iomem *iobase = host->base;
0140 struct mmc_command *cmd = mrq->cmd;
0141 u32 cmdreg = 0, xfer = 0, intr = 0;
0142 unsigned long flags;
0143 unsigned int timeout;
0144
0145 BUG_ON(host->mrq != NULL);
0146 host->mrq = mrq;
0147
0148 dev_dbg(host->dev, "cmd %d (hw state 0x%04x)\n",
0149 cmd->opcode, mvsd_read(MVSD_HW_STATE));
0150
0151 cmdreg = MVSD_CMD_INDEX(cmd->opcode);
0152
0153 if (cmd->flags & MMC_RSP_BUSY)
0154 cmdreg |= MVSD_CMD_RSP_48BUSY;
0155 else if (cmd->flags & MMC_RSP_136)
0156 cmdreg |= MVSD_CMD_RSP_136;
0157 else if (cmd->flags & MMC_RSP_PRESENT)
0158 cmdreg |= MVSD_CMD_RSP_48;
0159 else
0160 cmdreg |= MVSD_CMD_RSP_NONE;
0161
0162 if (cmd->flags & MMC_RSP_CRC)
0163 cmdreg |= MVSD_CMD_CHECK_CMDCRC;
0164
0165 if (cmd->flags & MMC_RSP_OPCODE)
0166 cmdreg |= MVSD_CMD_INDX_CHECK;
0167
0168 if (cmd->flags & MMC_RSP_PRESENT) {
0169 cmdreg |= MVSD_UNEXPECTED_RESP;
0170 intr |= MVSD_NOR_UNEXP_RSP;
0171 }
0172
0173 if (mrq->data) {
0174 struct mmc_data *data = mrq->data;
0175 int pio;
0176
0177 cmdreg |= MVSD_CMD_DATA_PRESENT | MVSD_CMD_CHECK_DATACRC16;
0178 xfer |= MVSD_XFER_MODE_HW_WR_DATA_EN;
0179 if (data->flags & MMC_DATA_READ)
0180 xfer |= MVSD_XFER_MODE_TO_HOST;
0181
0182 pio = mvsd_setup_data(host, data);
0183 if (pio) {
0184 xfer |= MVSD_XFER_MODE_PIO;
0185
0186 if (data->flags & MMC_DATA_WRITE)
0187 intr |= MVSD_NOR_TX_AVAIL;
0188 else if (host->pio_size > 32)
0189 intr |= MVSD_NOR_RX_FIFO_8W;
0190 else
0191 intr |= MVSD_NOR_RX_READY;
0192 }
0193
0194 if (data->stop) {
0195 struct mmc_command *stop = data->stop;
0196 u32 cmd12reg = 0;
0197
0198 mvsd_write(MVSD_AUTOCMD12_ARG_LOW, stop->arg & 0xffff);
0199 mvsd_write(MVSD_AUTOCMD12_ARG_HI, stop->arg >> 16);
0200
0201 if (stop->flags & MMC_RSP_BUSY)
0202 cmd12reg |= MVSD_AUTOCMD12_BUSY;
0203 if (stop->flags & MMC_RSP_OPCODE)
0204 cmd12reg |= MVSD_AUTOCMD12_INDX_CHECK;
0205 cmd12reg |= MVSD_AUTOCMD12_INDEX(stop->opcode);
0206 mvsd_write(MVSD_AUTOCMD12_CMD, cmd12reg);
0207
0208 xfer |= MVSD_XFER_MODE_AUTO_CMD12;
0209 intr |= MVSD_NOR_AUTOCMD12_DONE;
0210 } else {
0211 intr |= MVSD_NOR_XFER_DONE;
0212 }
0213 } else {
0214 intr |= MVSD_NOR_CMD_DONE;
0215 }
0216
0217 mvsd_write(MVSD_ARG_LOW, cmd->arg & 0xffff);
0218 mvsd_write(MVSD_ARG_HI, cmd->arg >> 16);
0219
0220 spin_lock_irqsave(&host->lock, flags);
0221
0222 host->xfer_mode &= MVSD_XFER_MODE_INT_CHK_EN;
0223 host->xfer_mode |= xfer;
0224 mvsd_write(MVSD_XFER_MODE, host->xfer_mode);
0225
0226 mvsd_write(MVSD_NOR_INTR_STATUS, ~MVSD_NOR_CARD_INT);
0227 mvsd_write(MVSD_ERR_INTR_STATUS, 0xffff);
0228 mvsd_write(MVSD_CMD, cmdreg);
0229
0230 host->intr_en &= MVSD_NOR_CARD_INT;
0231 host->intr_en |= intr | MVSD_NOR_ERROR;
0232 mvsd_write(MVSD_NOR_INTR_EN, host->intr_en);
0233 mvsd_write(MVSD_ERR_INTR_EN, 0xffff);
0234
0235 timeout = cmd->busy_timeout ? cmd->busy_timeout : 5000;
0236 mod_timer(&host->timer, jiffies + msecs_to_jiffies(timeout));
0237
0238 spin_unlock_irqrestore(&host->lock, flags);
0239 }
0240
0241 static u32 mvsd_finish_cmd(struct mvsd_host *host, struct mmc_command *cmd,
0242 u32 err_status)
0243 {
0244 void __iomem *iobase = host->base;
0245
0246 if (cmd->flags & MMC_RSP_136) {
0247 unsigned int response[8], i;
0248 for (i = 0; i < 8; i++)
0249 response[i] = mvsd_read(MVSD_RSP(i));
0250 cmd->resp[0] = ((response[0] & 0x03ff) << 22) |
0251 ((response[1] & 0xffff) << 6) |
0252 ((response[2] & 0xfc00) >> 10);
0253 cmd->resp[1] = ((response[2] & 0x03ff) << 22) |
0254 ((response[3] & 0xffff) << 6) |
0255 ((response[4] & 0xfc00) >> 10);
0256 cmd->resp[2] = ((response[4] & 0x03ff) << 22) |
0257 ((response[5] & 0xffff) << 6) |
0258 ((response[6] & 0xfc00) >> 10);
0259 cmd->resp[3] = ((response[6] & 0x03ff) << 22) |
0260 ((response[7] & 0x3fff) << 8);
0261 } else if (cmd->flags & MMC_RSP_PRESENT) {
0262 unsigned int response[3], i;
0263 for (i = 0; i < 3; i++)
0264 response[i] = mvsd_read(MVSD_RSP(i));
0265 cmd->resp[0] = ((response[2] & 0x003f) << (8 - 8)) |
0266 ((response[1] & 0xffff) << (14 - 8)) |
0267 ((response[0] & 0x03ff) << (30 - 8));
0268 cmd->resp[1] = ((response[0] & 0xfc00) >> 10);
0269 cmd->resp[2] = 0;
0270 cmd->resp[3] = 0;
0271 }
0272
0273 if (err_status & MVSD_ERR_CMD_TIMEOUT) {
0274 cmd->error = -ETIMEDOUT;
0275 } else if (err_status & (MVSD_ERR_CMD_CRC | MVSD_ERR_CMD_ENDBIT |
0276 MVSD_ERR_CMD_INDEX | MVSD_ERR_CMD_STARTBIT)) {
0277 cmd->error = -EILSEQ;
0278 }
0279 err_status &= ~(MVSD_ERR_CMD_TIMEOUT | MVSD_ERR_CMD_CRC |
0280 MVSD_ERR_CMD_ENDBIT | MVSD_ERR_CMD_INDEX |
0281 MVSD_ERR_CMD_STARTBIT);
0282
0283 return err_status;
0284 }
0285
0286 static u32 mvsd_finish_data(struct mvsd_host *host, struct mmc_data *data,
0287 u32 err_status)
0288 {
0289 void __iomem *iobase = host->base;
0290
0291 if (host->pio_ptr) {
0292 host->pio_ptr = NULL;
0293 host->pio_size = 0;
0294 } else {
0295 dma_unmap_sg(mmc_dev(host->mmc), data->sg, host->sg_frags,
0296 mmc_get_dma_dir(data));
0297 }
0298
0299 if (err_status & MVSD_ERR_DATA_TIMEOUT)
0300 data->error = -ETIMEDOUT;
0301 else if (err_status & (MVSD_ERR_DATA_CRC | MVSD_ERR_DATA_ENDBIT))
0302 data->error = -EILSEQ;
0303 else if (err_status & MVSD_ERR_XFER_SIZE)
0304 data->error = -EBADE;
0305 err_status &= ~(MVSD_ERR_DATA_TIMEOUT | MVSD_ERR_DATA_CRC |
0306 MVSD_ERR_DATA_ENDBIT | MVSD_ERR_XFER_SIZE);
0307
0308 dev_dbg(host->dev, "data done: blocks_left=%d, bytes_left=%d\n",
0309 mvsd_read(MVSD_CURR_BLK_LEFT), mvsd_read(MVSD_CURR_BYTE_LEFT));
0310 data->bytes_xfered =
0311 (data->blocks - mvsd_read(MVSD_CURR_BLK_LEFT)) * data->blksz;
0312
0313 if (data->bytes_xfered && data->error)
0314 data->bytes_xfered -= data->blksz;
0315
0316
0317 if (data->stop) {
0318 unsigned int response[3], i;
0319 for (i = 0; i < 3; i++)
0320 response[i] = mvsd_read(MVSD_AUTO_RSP(i));
0321 data->stop->resp[0] = ((response[2] & 0x003f) << (8 - 8)) |
0322 ((response[1] & 0xffff) << (14 - 8)) |
0323 ((response[0] & 0x03ff) << (30 - 8));
0324 data->stop->resp[1] = ((response[0] & 0xfc00) >> 10);
0325 data->stop->resp[2] = 0;
0326 data->stop->resp[3] = 0;
0327
0328 if (err_status & MVSD_ERR_AUTOCMD12) {
0329 u32 err_cmd12 = mvsd_read(MVSD_AUTOCMD12_ERR_STATUS);
0330 dev_dbg(host->dev, "c12err 0x%04x\n", err_cmd12);
0331 if (err_cmd12 & MVSD_AUTOCMD12_ERR_NOTEXE)
0332 data->stop->error = -ENOEXEC;
0333 else if (err_cmd12 & MVSD_AUTOCMD12_ERR_TIMEOUT)
0334 data->stop->error = -ETIMEDOUT;
0335 else if (err_cmd12)
0336 data->stop->error = -EILSEQ;
0337 err_status &= ~MVSD_ERR_AUTOCMD12;
0338 }
0339 }
0340
0341 return err_status;
0342 }
0343
0344 static irqreturn_t mvsd_irq(int irq, void *dev)
0345 {
0346 struct mvsd_host *host = dev;
0347 void __iomem *iobase = host->base;
0348 u32 intr_status, intr_done_mask;
0349 int irq_handled = 0;
0350
0351 intr_status = mvsd_read(MVSD_NOR_INTR_STATUS);
0352 dev_dbg(host->dev, "intr 0x%04x intr_en 0x%04x hw_state 0x%04x\n",
0353 intr_status, mvsd_read(MVSD_NOR_INTR_EN),
0354 mvsd_read(MVSD_HW_STATE));
0355
0356
0357
0358
0359
0360
0361 if (!mvsd_read(MVSD_NOR_INTR_EN) && !mvsd_read(MVSD_ERR_INTR_EN)) {
0362 dev_dbg(host->dev, "spurious irq detected intr 0x%04x intr_en 0x%04x erri 0x%04x erri_en 0x%04x\n",
0363 mvsd_read(MVSD_NOR_INTR_STATUS),
0364 mvsd_read(MVSD_NOR_INTR_EN),
0365 mvsd_read(MVSD_ERR_INTR_STATUS),
0366 mvsd_read(MVSD_ERR_INTR_EN));
0367 return IRQ_HANDLED;
0368 }
0369
0370 spin_lock(&host->lock);
0371
0372
0373 if (host->pio_size &&
0374 (intr_status & host->intr_en &
0375 (MVSD_NOR_RX_READY | MVSD_NOR_RX_FIFO_8W))) {
0376 u16 *p = host->pio_ptr;
0377 int s = host->pio_size;
0378 while (s >= 32 && (intr_status & MVSD_NOR_RX_FIFO_8W)) {
0379 readsw(iobase + MVSD_FIFO, p, 16);
0380 p += 16;
0381 s -= 32;
0382 intr_status = mvsd_read(MVSD_NOR_INTR_STATUS);
0383 }
0384
0385
0386
0387
0388
0389 if (s <= 32) {
0390 while (s >= 4 && (intr_status & MVSD_NOR_RX_READY)) {
0391 put_unaligned(mvsd_read(MVSD_FIFO), p++);
0392 put_unaligned(mvsd_read(MVSD_FIFO), p++);
0393 s -= 4;
0394 intr_status = mvsd_read(MVSD_NOR_INTR_STATUS);
0395 }
0396 if (s && s < 4 && (intr_status & MVSD_NOR_RX_READY)) {
0397 u16 val[2] = {0, 0};
0398 val[0] = mvsd_read(MVSD_FIFO);
0399 val[1] = mvsd_read(MVSD_FIFO);
0400 memcpy(p, ((void *)&val) + 4 - s, s);
0401 s = 0;
0402 intr_status = mvsd_read(MVSD_NOR_INTR_STATUS);
0403 }
0404 if (s == 0) {
0405 host->intr_en &=
0406 ~(MVSD_NOR_RX_READY | MVSD_NOR_RX_FIFO_8W);
0407 mvsd_write(MVSD_NOR_INTR_EN, host->intr_en);
0408 } else if (host->intr_en & MVSD_NOR_RX_FIFO_8W) {
0409 host->intr_en &= ~MVSD_NOR_RX_FIFO_8W;
0410 host->intr_en |= MVSD_NOR_RX_READY;
0411 mvsd_write(MVSD_NOR_INTR_EN, host->intr_en);
0412 }
0413 }
0414 dev_dbg(host->dev, "pio %d intr 0x%04x hw_state 0x%04x\n",
0415 s, intr_status, mvsd_read(MVSD_HW_STATE));
0416 host->pio_ptr = p;
0417 host->pio_size = s;
0418 irq_handled = 1;
0419 } else if (host->pio_size &&
0420 (intr_status & host->intr_en &
0421 (MVSD_NOR_TX_AVAIL | MVSD_NOR_TX_FIFO_8W))) {
0422 u16 *p = host->pio_ptr;
0423 int s = host->pio_size;
0424
0425
0426
0427
0428
0429
0430 while (s >= 4 && (intr_status & MVSD_NOR_TX_AVAIL)) {
0431 mvsd_write(MVSD_FIFO, get_unaligned(p++));
0432 mvsd_write(MVSD_FIFO, get_unaligned(p++));
0433 s -= 4;
0434 intr_status = mvsd_read(MVSD_NOR_INTR_STATUS);
0435 }
0436 if (s < 4) {
0437 if (s && (intr_status & MVSD_NOR_TX_AVAIL)) {
0438 u16 val[2] = {0, 0};
0439 memcpy(((void *)&val) + 4 - s, p, s);
0440 mvsd_write(MVSD_FIFO, val[0]);
0441 mvsd_write(MVSD_FIFO, val[1]);
0442 s = 0;
0443 intr_status = mvsd_read(MVSD_NOR_INTR_STATUS);
0444 }
0445 if (s == 0) {
0446 host->intr_en &=
0447 ~(MVSD_NOR_TX_AVAIL | MVSD_NOR_TX_FIFO_8W);
0448 mvsd_write(MVSD_NOR_INTR_EN, host->intr_en);
0449 }
0450 }
0451 dev_dbg(host->dev, "pio %d intr 0x%04x hw_state 0x%04x\n",
0452 s, intr_status, mvsd_read(MVSD_HW_STATE));
0453 host->pio_ptr = p;
0454 host->pio_size = s;
0455 irq_handled = 1;
0456 }
0457
0458 mvsd_write(MVSD_NOR_INTR_STATUS, intr_status);
0459
0460 intr_done_mask = MVSD_NOR_CARD_INT | MVSD_NOR_RX_READY |
0461 MVSD_NOR_RX_FIFO_8W | MVSD_NOR_TX_FIFO_8W;
0462 if (intr_status & host->intr_en & ~intr_done_mask) {
0463 struct mmc_request *mrq = host->mrq;
0464 struct mmc_command *cmd = mrq->cmd;
0465 u32 err_status = 0;
0466
0467 del_timer(&host->timer);
0468 host->mrq = NULL;
0469
0470 host->intr_en &= MVSD_NOR_CARD_INT;
0471 mvsd_write(MVSD_NOR_INTR_EN, host->intr_en);
0472 mvsd_write(MVSD_ERR_INTR_EN, 0);
0473
0474 spin_unlock(&host->lock);
0475
0476 if (intr_status & MVSD_NOR_UNEXP_RSP) {
0477 cmd->error = -EPROTO;
0478 } else if (intr_status & MVSD_NOR_ERROR) {
0479 err_status = mvsd_read(MVSD_ERR_INTR_STATUS);
0480 dev_dbg(host->dev, "err 0x%04x\n", err_status);
0481 }
0482
0483 err_status = mvsd_finish_cmd(host, cmd, err_status);
0484 if (mrq->data)
0485 err_status = mvsd_finish_data(host, mrq->data, err_status);
0486 if (err_status) {
0487 dev_err(host->dev, "unhandled error status %#04x\n",
0488 err_status);
0489 cmd->error = -ENOMSG;
0490 }
0491
0492 mmc_request_done(host->mmc, mrq);
0493 irq_handled = 1;
0494 } else
0495 spin_unlock(&host->lock);
0496
0497 if (intr_status & MVSD_NOR_CARD_INT) {
0498 mmc_signal_sdio_irq(host->mmc);
0499 irq_handled = 1;
0500 }
0501
0502 if (irq_handled)
0503 return IRQ_HANDLED;
0504
0505 dev_err(host->dev, "unhandled interrupt status=0x%04x en=0x%04x pio=%d\n",
0506 intr_status, host->intr_en, host->pio_size);
0507 return IRQ_NONE;
0508 }
0509
0510 static void mvsd_timeout_timer(struct timer_list *t)
0511 {
0512 struct mvsd_host *host = from_timer(host, t, timer);
0513 void __iomem *iobase = host->base;
0514 struct mmc_request *mrq;
0515 unsigned long flags;
0516
0517 spin_lock_irqsave(&host->lock, flags);
0518 mrq = host->mrq;
0519 if (mrq) {
0520 dev_err(host->dev, "Timeout waiting for hardware interrupt.\n");
0521 dev_err(host->dev, "hw_state=0x%04x, intr_status=0x%04x intr_en=0x%04x\n",
0522 mvsd_read(MVSD_HW_STATE),
0523 mvsd_read(MVSD_NOR_INTR_STATUS),
0524 mvsd_read(MVSD_NOR_INTR_EN));
0525
0526 host->mrq = NULL;
0527
0528 mvsd_write(MVSD_SW_RESET, MVSD_SW_RESET_NOW);
0529
0530 host->xfer_mode &= MVSD_XFER_MODE_INT_CHK_EN;
0531 mvsd_write(MVSD_XFER_MODE, host->xfer_mode);
0532
0533 host->intr_en &= MVSD_NOR_CARD_INT;
0534 mvsd_write(MVSD_NOR_INTR_EN, host->intr_en);
0535 mvsd_write(MVSD_ERR_INTR_EN, 0);
0536 mvsd_write(MVSD_ERR_INTR_STATUS, 0xffff);
0537
0538 mrq->cmd->error = -ETIMEDOUT;
0539 mvsd_finish_cmd(host, mrq->cmd, 0);
0540 if (mrq->data) {
0541 mrq->data->error = -ETIMEDOUT;
0542 mvsd_finish_data(host, mrq->data, 0);
0543 }
0544 }
0545 spin_unlock_irqrestore(&host->lock, flags);
0546
0547 if (mrq)
0548 mmc_request_done(host->mmc, mrq);
0549 }
0550
0551 static void mvsd_enable_sdio_irq(struct mmc_host *mmc, int enable)
0552 {
0553 struct mvsd_host *host = mmc_priv(mmc);
0554 void __iomem *iobase = host->base;
0555 unsigned long flags;
0556
0557 spin_lock_irqsave(&host->lock, flags);
0558 if (enable) {
0559 host->xfer_mode |= MVSD_XFER_MODE_INT_CHK_EN;
0560 host->intr_en |= MVSD_NOR_CARD_INT;
0561 } else {
0562 host->xfer_mode &= ~MVSD_XFER_MODE_INT_CHK_EN;
0563 host->intr_en &= ~MVSD_NOR_CARD_INT;
0564 }
0565 mvsd_write(MVSD_XFER_MODE, host->xfer_mode);
0566 mvsd_write(MVSD_NOR_INTR_EN, host->intr_en);
0567 spin_unlock_irqrestore(&host->lock, flags);
0568 }
0569
0570 static void mvsd_power_up(struct mvsd_host *host)
0571 {
0572 void __iomem *iobase = host->base;
0573 dev_dbg(host->dev, "power up\n");
0574 mvsd_write(MVSD_NOR_INTR_EN, 0);
0575 mvsd_write(MVSD_ERR_INTR_EN, 0);
0576 mvsd_write(MVSD_SW_RESET, MVSD_SW_RESET_NOW);
0577 mvsd_write(MVSD_XFER_MODE, 0);
0578 mvsd_write(MVSD_NOR_STATUS_EN, 0xffff);
0579 mvsd_write(MVSD_ERR_STATUS_EN, 0xffff);
0580 mvsd_write(MVSD_NOR_INTR_STATUS, 0xffff);
0581 mvsd_write(MVSD_ERR_INTR_STATUS, 0xffff);
0582 }
0583
0584 static void mvsd_power_down(struct mvsd_host *host)
0585 {
0586 void __iomem *iobase = host->base;
0587 dev_dbg(host->dev, "power down\n");
0588 mvsd_write(MVSD_NOR_INTR_EN, 0);
0589 mvsd_write(MVSD_ERR_INTR_EN, 0);
0590 mvsd_write(MVSD_SW_RESET, MVSD_SW_RESET_NOW);
0591 mvsd_write(MVSD_XFER_MODE, MVSD_XFER_MODE_STOP_CLK);
0592 mvsd_write(MVSD_NOR_STATUS_EN, 0);
0593 mvsd_write(MVSD_ERR_STATUS_EN, 0);
0594 mvsd_write(MVSD_NOR_INTR_STATUS, 0xffff);
0595 mvsd_write(MVSD_ERR_INTR_STATUS, 0xffff);
0596 }
0597
0598 static void mvsd_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
0599 {
0600 struct mvsd_host *host = mmc_priv(mmc);
0601 void __iomem *iobase = host->base;
0602 u32 ctrl_reg = 0;
0603
0604 if (ios->power_mode == MMC_POWER_UP)
0605 mvsd_power_up(host);
0606
0607 if (ios->clock == 0) {
0608 mvsd_write(MVSD_XFER_MODE, MVSD_XFER_MODE_STOP_CLK);
0609 mvsd_write(MVSD_CLK_DIV, MVSD_BASE_DIV_MAX);
0610 host->clock = 0;
0611 dev_dbg(host->dev, "clock off\n");
0612 } else if (ios->clock != host->clock) {
0613 u32 m = DIV_ROUND_UP(host->base_clock, ios->clock) - 1;
0614 if (m > MVSD_BASE_DIV_MAX)
0615 m = MVSD_BASE_DIV_MAX;
0616 mvsd_write(MVSD_CLK_DIV, m);
0617 host->clock = ios->clock;
0618 host->ns_per_clk = 1000000000 / (host->base_clock / (m+1));
0619 dev_dbg(host->dev, "clock=%d (%d), div=0x%04x\n",
0620 ios->clock, host->base_clock / (m+1), m);
0621 }
0622
0623
0624 ctrl_reg |= MVSD_HOST_CTRL_BIG_ENDIAN;
0625 ctrl_reg &= ~MVSD_HOST_CTRL_LSB_FIRST;
0626
0627
0628 ctrl_reg |= MVSD_HOST_CTRL_TMOUT_MASK;
0629 ctrl_reg |= MVSD_HOST_CTRL_TMOUT_EN;
0630
0631 if (ios->bus_mode == MMC_BUSMODE_PUSHPULL)
0632 ctrl_reg |= MVSD_HOST_CTRL_PUSH_PULL_EN;
0633
0634 if (ios->bus_width == MMC_BUS_WIDTH_4)
0635 ctrl_reg |= MVSD_HOST_CTRL_DATA_WIDTH_4_BITS;
0636
0637
0638
0639
0640
0641
0642
0643
0644 #if 0
0645 if (ios->timing == MMC_TIMING_MMC_HS ||
0646 ios->timing == MMC_TIMING_SD_HS)
0647 ctrl_reg |= MVSD_HOST_CTRL_HI_SPEED_EN;
0648 #endif
0649
0650 host->ctrl = ctrl_reg;
0651 mvsd_write(MVSD_HOST_CTRL, ctrl_reg);
0652 dev_dbg(host->dev, "ctrl 0x%04x: %s %s %s\n", ctrl_reg,
0653 (ctrl_reg & MVSD_HOST_CTRL_PUSH_PULL_EN) ?
0654 "push-pull" : "open-drain",
0655 (ctrl_reg & MVSD_HOST_CTRL_DATA_WIDTH_4_BITS) ?
0656 "4bit-width" : "1bit-width",
0657 (ctrl_reg & MVSD_HOST_CTRL_HI_SPEED_EN) ?
0658 "high-speed" : "");
0659
0660 if (ios->power_mode == MMC_POWER_OFF)
0661 mvsd_power_down(host);
0662 }
0663
0664 static const struct mmc_host_ops mvsd_ops = {
0665 .request = mvsd_request,
0666 .get_ro = mmc_gpio_get_ro,
0667 .set_ios = mvsd_set_ios,
0668 .enable_sdio_irq = mvsd_enable_sdio_irq,
0669 };
0670
0671 static void
0672 mv_conf_mbus_windows(struct mvsd_host *host,
0673 const struct mbus_dram_target_info *dram)
0674 {
0675 void __iomem *iobase = host->base;
0676 int i;
0677
0678 for (i = 0; i < 4; i++) {
0679 writel(0, iobase + MVSD_WINDOW_CTRL(i));
0680 writel(0, iobase + MVSD_WINDOW_BASE(i));
0681 }
0682
0683 for (i = 0; i < dram->num_cs; i++) {
0684 const struct mbus_dram_window *cs = dram->cs + i;
0685 writel(((cs->size - 1) & 0xffff0000) |
0686 (cs->mbus_attr << 8) |
0687 (dram->mbus_dram_target_id << 4) | 1,
0688 iobase + MVSD_WINDOW_CTRL(i));
0689 writel(cs->base, iobase + MVSD_WINDOW_BASE(i));
0690 }
0691 }
0692
0693 static int mvsd_probe(struct platform_device *pdev)
0694 {
0695 struct device_node *np = pdev->dev.of_node;
0696 struct mmc_host *mmc = NULL;
0697 struct mvsd_host *host = NULL;
0698 const struct mbus_dram_target_info *dram;
0699 int ret, irq;
0700
0701 if (!np) {
0702 dev_err(&pdev->dev, "no DT node\n");
0703 return -ENODEV;
0704 }
0705 irq = platform_get_irq(pdev, 0);
0706 if (irq < 0)
0707 return -ENXIO;
0708
0709 mmc = mmc_alloc_host(sizeof(struct mvsd_host), &pdev->dev);
0710 if (!mmc) {
0711 ret = -ENOMEM;
0712 goto out;
0713 }
0714
0715 host = mmc_priv(mmc);
0716 host->mmc = mmc;
0717 host->dev = &pdev->dev;
0718
0719
0720
0721
0722
0723
0724
0725
0726 host->clk = devm_clk_get(&pdev->dev, NULL);
0727 if (IS_ERR(host->clk)) {
0728 dev_err(&pdev->dev, "no clock associated\n");
0729 ret = -EINVAL;
0730 goto out;
0731 }
0732 clk_prepare_enable(host->clk);
0733
0734 mmc->ops = &mvsd_ops;
0735
0736 mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
0737
0738 mmc->f_min = DIV_ROUND_UP(host->base_clock, MVSD_BASE_DIV_MAX);
0739 mmc->f_max = MVSD_CLOCKRATE_MAX;
0740
0741 mmc->max_blk_size = 2048;
0742 mmc->max_blk_count = 65535;
0743
0744 mmc->max_segs = 1;
0745 mmc->max_seg_size = mmc->max_blk_size * mmc->max_blk_count;
0746 mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
0747
0748 host->base_clock = clk_get_rate(host->clk) / 2;
0749 ret = mmc_of_parse(mmc);
0750 if (ret < 0)
0751 goto out;
0752 if (maxfreq)
0753 mmc->f_max = maxfreq;
0754
0755 spin_lock_init(&host->lock);
0756
0757 host->base = devm_platform_ioremap_resource(pdev, 0);
0758 if (IS_ERR(host->base)) {
0759 ret = PTR_ERR(host->base);
0760 goto out;
0761 }
0762
0763
0764 dram = mv_mbus_dram_info();
0765 if (dram)
0766 mv_conf_mbus_windows(host, dram);
0767
0768 mvsd_power_down(host);
0769
0770 ret = devm_request_irq(&pdev->dev, irq, mvsd_irq, 0, DRIVER_NAME, host);
0771 if (ret) {
0772 dev_err(&pdev->dev, "cannot assign irq %d\n", irq);
0773 goto out;
0774 }
0775
0776 timer_setup(&host->timer, mvsd_timeout_timer, 0);
0777 platform_set_drvdata(pdev, mmc);
0778 ret = mmc_add_host(mmc);
0779 if (ret)
0780 goto out;
0781
0782 if (!(mmc->caps & MMC_CAP_NEEDS_POLL))
0783 dev_dbg(&pdev->dev, "using GPIO for card detection\n");
0784 else
0785 dev_dbg(&pdev->dev, "lacking card detect (fall back to polling)\n");
0786
0787 return 0;
0788
0789 out:
0790 if (mmc) {
0791 if (!IS_ERR(host->clk))
0792 clk_disable_unprepare(host->clk);
0793 mmc_free_host(mmc);
0794 }
0795
0796 return ret;
0797 }
0798
0799 static int mvsd_remove(struct platform_device *pdev)
0800 {
0801 struct mmc_host *mmc = platform_get_drvdata(pdev);
0802
0803 struct mvsd_host *host = mmc_priv(mmc);
0804
0805 mmc_remove_host(mmc);
0806 del_timer_sync(&host->timer);
0807 mvsd_power_down(host);
0808
0809 if (!IS_ERR(host->clk))
0810 clk_disable_unprepare(host->clk);
0811 mmc_free_host(mmc);
0812
0813 return 0;
0814 }
0815
0816 static const struct of_device_id mvsdio_dt_ids[] = {
0817 { .compatible = "marvell,orion-sdio" },
0818 { }
0819 };
0820 MODULE_DEVICE_TABLE(of, mvsdio_dt_ids);
0821
0822 static struct platform_driver mvsd_driver = {
0823 .probe = mvsd_probe,
0824 .remove = mvsd_remove,
0825 .driver = {
0826 .name = DRIVER_NAME,
0827 .probe_type = PROBE_PREFER_ASYNCHRONOUS,
0828 .of_match_table = mvsdio_dt_ids,
0829 },
0830 };
0831
0832 module_platform_driver(mvsd_driver);
0833
0834
0835 module_param(maxfreq, int, 0);
0836
0837
0838 module_param(nodma, int, 0);
0839
0840 MODULE_AUTHOR("Maen Suleiman, Nicolas Pitre");
0841 MODULE_DESCRIPTION("Marvell MMC,SD,SDIO Host Controller driver");
0842 MODULE_LICENSE("GPL");
0843 MODULE_ALIAS("platform:mvsdio");