Lines Matching +full:cmd +full:- +full:cnt +full:- +full:name
1 // SPDX-License-Identifier: GPL-2.0-only
3 * tifm_sd.c - TI FlashMedia driver
45 #define TIFM_MMCSD_DTO 0x0020 /* data time-out */
47 #define TIFM_MMCSD_CTO 0x0080 /* command time-out */
56 #define TIFM_MMCSD_CARD_RO 0x0200 /* card is read-only */
114 unsigned int off, unsigned int cnt) in tifm_sd_read_fifo() argument
116 struct tifm_dev *sock = host->dev; in tifm_sd_read_fifo()
121 if (host->cmd_flags & DATA_CARRY) { in tifm_sd_read_fifo()
122 buf[pos++] = host->bounce_buf_data[0]; in tifm_sd_read_fifo()
123 host->cmd_flags &= ~DATA_CARRY; in tifm_sd_read_fifo()
126 while (pos < cnt) { in tifm_sd_read_fifo()
127 val = readl(sock->addr + SOCK_MMCSD_DATA); in tifm_sd_read_fifo()
129 if (pos == cnt) { in tifm_sd_read_fifo()
130 host->bounce_buf_data[0] = (val >> 8) & 0xff; in tifm_sd_read_fifo()
131 host->cmd_flags |= DATA_CARRY; in tifm_sd_read_fifo()
136 kunmap_local(buf - off); in tifm_sd_read_fifo()
140 unsigned int off, unsigned int cnt) in tifm_sd_write_fifo() argument
142 struct tifm_dev *sock = host->dev; in tifm_sd_write_fifo()
147 if (host->cmd_flags & DATA_CARRY) { in tifm_sd_write_fifo()
148 val = host->bounce_buf_data[0] | ((buf[pos++] << 8) & 0xff00); in tifm_sd_write_fifo()
149 writel(val, sock->addr + SOCK_MMCSD_DATA); in tifm_sd_write_fifo()
150 host->cmd_flags &= ~DATA_CARRY; in tifm_sd_write_fifo()
153 while (pos < cnt) { in tifm_sd_write_fifo()
155 if (pos == cnt) { in tifm_sd_write_fifo()
156 host->bounce_buf_data[0] = val & 0xff; in tifm_sd_write_fifo()
157 host->cmd_flags |= DATA_CARRY; in tifm_sd_write_fifo()
161 writel(val, sock->addr + SOCK_MMCSD_DATA); in tifm_sd_write_fifo()
163 kunmap_local(buf - off); in tifm_sd_write_fifo()
168 struct mmc_data *r_data = host->req->cmd->data; in tifm_sd_transfer_data()
169 struct scatterlist *sg = r_data->sg; in tifm_sd_transfer_data()
170 unsigned int off, cnt, t_size = TIFM_MMCSD_FIFO_SIZE * 2; in tifm_sd_transfer_data() local
174 if (host->sg_pos == host->sg_len) in tifm_sd_transfer_data()
177 cnt = sg[host->sg_pos].length - host->block_pos; in tifm_sd_transfer_data()
178 if (!cnt) { in tifm_sd_transfer_data()
179 host->block_pos = 0; in tifm_sd_transfer_data()
180 host->sg_pos++; in tifm_sd_transfer_data()
181 if (host->sg_pos == host->sg_len) { in tifm_sd_transfer_data()
182 if ((r_data->flags & MMC_DATA_WRITE) in tifm_sd_transfer_data()
183 && (host->cmd_flags & DATA_CARRY)) in tifm_sd_transfer_data()
184 writel(host->bounce_buf_data[0], in tifm_sd_transfer_data()
185 host->dev->addr in tifm_sd_transfer_data()
190 cnt = sg[host->sg_pos].length; in tifm_sd_transfer_data()
192 off = sg[host->sg_pos].offset + host->block_pos; in tifm_sd_transfer_data()
194 pg = nth_page(sg_page(&sg[host->sg_pos]), off >> PAGE_SHIFT); in tifm_sd_transfer_data()
196 p_cnt = PAGE_SIZE - p_off; in tifm_sd_transfer_data()
197 p_cnt = min(p_cnt, cnt); in tifm_sd_transfer_data()
200 if (r_data->flags & MMC_DATA_READ) in tifm_sd_transfer_data()
202 else if (r_data->flags & MMC_DATA_WRITE) in tifm_sd_transfer_data()
205 t_size -= p_cnt; in tifm_sd_transfer_data()
206 host->block_pos += p_cnt; in tifm_sd_transfer_data()
219 kunmap_local(dst_buf - dst_off); in tifm_sd_copy_page()
220 kunmap_local(src_buf - src_off); in tifm_sd_copy_page()
225 struct scatterlist *sg = r_data->sg; in tifm_sd_bounce_block()
226 unsigned int t_size = r_data->blksz; in tifm_sd_bounce_block()
227 unsigned int off, cnt; in tifm_sd_bounce_block() local
231 dev_dbg(&host->dev->dev, "bouncing block\n"); in tifm_sd_bounce_block()
233 cnt = sg[host->sg_pos].length - host->block_pos; in tifm_sd_bounce_block()
234 if (!cnt) { in tifm_sd_bounce_block()
235 host->block_pos = 0; in tifm_sd_bounce_block()
236 host->sg_pos++; in tifm_sd_bounce_block()
237 if (host->sg_pos == host->sg_len) in tifm_sd_bounce_block()
239 cnt = sg[host->sg_pos].length; in tifm_sd_bounce_block()
241 off = sg[host->sg_pos].offset + host->block_pos; in tifm_sd_bounce_block()
243 pg = nth_page(sg_page(&sg[host->sg_pos]), off >> PAGE_SHIFT); in tifm_sd_bounce_block()
245 p_cnt = PAGE_SIZE - p_off; in tifm_sd_bounce_block()
246 p_cnt = min(p_cnt, cnt); in tifm_sd_bounce_block()
249 if (r_data->flags & MMC_DATA_WRITE) in tifm_sd_bounce_block()
250 tifm_sd_copy_page(sg_page(&host->bounce_buf), in tifm_sd_bounce_block()
251 r_data->blksz - t_size, in tifm_sd_bounce_block()
253 else if (r_data->flags & MMC_DATA_READ) in tifm_sd_bounce_block()
254 tifm_sd_copy_page(pg, p_off, sg_page(&host->bounce_buf), in tifm_sd_bounce_block()
255 r_data->blksz - t_size, p_cnt); in tifm_sd_bounce_block()
257 t_size -= p_cnt; in tifm_sd_bounce_block()
258 host->block_pos += p_cnt; in tifm_sd_bounce_block()
264 struct tifm_dev *sock = host->dev; in tifm_sd_set_dma_data()
265 unsigned int t_size = TIFM_DMA_TSIZE * r_data->blksz; in tifm_sd_set_dma_data()
269 if (host->sg_pos == host->sg_len) in tifm_sd_set_dma_data()
272 if (host->cmd_flags & DATA_CARRY) { in tifm_sd_set_dma_data()
273 host->cmd_flags &= ~DATA_CARRY; in tifm_sd_set_dma_data()
275 if (host->sg_pos == host->sg_len) in tifm_sd_set_dma_data()
279 dma_len = sg_dma_len(&r_data->sg[host->sg_pos]) - host->block_pos; in tifm_sd_set_dma_data()
281 host->block_pos = 0; in tifm_sd_set_dma_data()
282 host->sg_pos++; in tifm_sd_set_dma_data()
283 if (host->sg_pos == host->sg_len) in tifm_sd_set_dma_data()
285 dma_len = sg_dma_len(&r_data->sg[host->sg_pos]); in tifm_sd_set_dma_data()
289 dma_blk_cnt = dma_len / r_data->blksz; in tifm_sd_set_dma_data()
290 dma_off = host->block_pos; in tifm_sd_set_dma_data()
291 host->block_pos += dma_blk_cnt * r_data->blksz; in tifm_sd_set_dma_data()
294 dma_off = host->block_pos; in tifm_sd_set_dma_data()
295 host->block_pos += t_size; in tifm_sd_set_dma_data()
299 sg = &r_data->sg[host->sg_pos]; in tifm_sd_set_dma_data()
301 if (r_data->flags & MMC_DATA_WRITE) in tifm_sd_set_dma_data()
304 host->cmd_flags |= DATA_CARRY; in tifm_sd_set_dma_data()
306 sg = &host->bounce_buf; in tifm_sd_set_dma_data()
312 dev_dbg(&sock->dev, "setting dma for %d blocks\n", dma_blk_cnt); in tifm_sd_set_dma_data()
313 writel(sg_dma_address(sg) + dma_off, sock->addr + SOCK_DMA_ADDRESS); in tifm_sd_set_dma_data()
314 if (r_data->flags & MMC_DATA_WRITE) in tifm_sd_set_dma_data()
316 sock->addr + SOCK_DMA_CONTROL); in tifm_sd_set_dma_data()
319 sock->addr + SOCK_DMA_CONTROL); in tifm_sd_set_dma_data()
324 static unsigned int tifm_sd_op_flags(struct mmc_command *cmd) in tifm_sd_op_flags() argument
328 switch (mmc_resp_type(cmd)) { in tifm_sd_op_flags()
348 switch (mmc_cmd_type(cmd)) { in tifm_sd_op_flags()
367 static void tifm_sd_exec(struct tifm_sd *host, struct mmc_command *cmd) in tifm_sd_exec() argument
369 struct tifm_dev *sock = host->dev; in tifm_sd_exec()
370 unsigned int cmd_mask = tifm_sd_op_flags(cmd); in tifm_sd_exec()
372 if (host->open_drain) in tifm_sd_exec()
375 if (cmd->data && (cmd->data->flags & MMC_DATA_READ)) in tifm_sd_exec()
378 dev_dbg(&sock->dev, "executing opcode 0x%x, arg: 0x%x, mask: 0x%x\n", in tifm_sd_exec()
379 cmd->opcode, cmd->arg, cmd_mask); in tifm_sd_exec()
381 writel((cmd->arg >> 16) & 0xffff, sock->addr + SOCK_MMCSD_ARG_HIGH); in tifm_sd_exec()
382 writel(cmd->arg & 0xffff, sock->addr + SOCK_MMCSD_ARG_LOW); in tifm_sd_exec()
383 writel(cmd->opcode | cmd_mask, sock->addr + SOCK_MMCSD_COMMAND); in tifm_sd_exec()
386 static void tifm_sd_fetch_resp(struct mmc_command *cmd, struct tifm_dev *sock) in tifm_sd_fetch_resp() argument
388 cmd->resp[0] = (readl(sock->addr + SOCK_MMCSD_RESPONSE + 0x1c) << 16) in tifm_sd_fetch_resp()
389 | readl(sock->addr + SOCK_MMCSD_RESPONSE + 0x18); in tifm_sd_fetch_resp()
390 cmd->resp[1] = (readl(sock->addr + SOCK_MMCSD_RESPONSE + 0x14) << 16) in tifm_sd_fetch_resp()
391 | readl(sock->addr + SOCK_MMCSD_RESPONSE + 0x10); in tifm_sd_fetch_resp()
392 cmd->resp[2] = (readl(sock->addr + SOCK_MMCSD_RESPONSE + 0x0c) << 16) in tifm_sd_fetch_resp()
393 | readl(sock->addr + SOCK_MMCSD_RESPONSE + 0x08); in tifm_sd_fetch_resp()
394 cmd->resp[3] = (readl(sock->addr + SOCK_MMCSD_RESPONSE + 0x04) << 16) in tifm_sd_fetch_resp()
395 | readl(sock->addr + SOCK_MMCSD_RESPONSE + 0x00); in tifm_sd_fetch_resp()
400 struct tifm_dev *sock = host->dev; in tifm_sd_check_status()
401 struct mmc_command *cmd = host->req->cmd; in tifm_sd_check_status() local
403 if (cmd->error) in tifm_sd_check_status()
406 if (!(host->cmd_flags & CMD_READY)) in tifm_sd_check_status()
409 if (cmd->data) { in tifm_sd_check_status()
410 if (cmd->data->error) { in tifm_sd_check_status()
411 if ((host->cmd_flags & SCMD_ACTIVE) in tifm_sd_check_status()
412 && !(host->cmd_flags & SCMD_READY)) in tifm_sd_check_status()
418 if (!(host->cmd_flags & BRS_READY)) in tifm_sd_check_status()
421 if (!(host->no_dma || (host->cmd_flags & FIFO_READY))) in tifm_sd_check_status()
424 if (cmd->data->flags & MMC_DATA_WRITE) { in tifm_sd_check_status()
425 if (host->req->stop) { in tifm_sd_check_status()
426 if (!(host->cmd_flags & SCMD_ACTIVE)) { in tifm_sd_check_status()
427 host->cmd_flags |= SCMD_ACTIVE; in tifm_sd_check_status()
429 | readl(sock->addr in tifm_sd_check_status()
431 sock->addr in tifm_sd_check_status()
433 tifm_sd_exec(host, host->req->stop); in tifm_sd_check_status()
436 if (!(host->cmd_flags & SCMD_READY) in tifm_sd_check_status()
437 || (host->cmd_flags & CARD_BUSY)) in tifm_sd_check_status()
440 & readl(sock->addr in tifm_sd_check_status()
442 sock->addr in tifm_sd_check_status()
446 if (host->cmd_flags & CARD_BUSY) in tifm_sd_check_status()
449 & readl(sock->addr in tifm_sd_check_status()
451 sock->addr + SOCK_MMCSD_INT_ENABLE); in tifm_sd_check_status()
454 if (host->req->stop) { in tifm_sd_check_status()
455 if (!(host->cmd_flags & SCMD_ACTIVE)) { in tifm_sd_check_status()
456 host->cmd_flags |= SCMD_ACTIVE; in tifm_sd_check_status()
457 tifm_sd_exec(host, host->req->stop); in tifm_sd_check_status()
460 if (!(host->cmd_flags & SCMD_READY)) in tifm_sd_check_status()
467 queue_work(system_bh_wq, &host->finish_bh_work); in tifm_sd_check_status()
477 spin_lock(&sock->lock); in tifm_sd_data_event()
479 fifo_status = readl(sock->addr + SOCK_DMA_FIFO_STATUS); in tifm_sd_data_event()
480 dev_dbg(&sock->dev, "data event: fifo_status %x, flags %x\n", in tifm_sd_data_event()
481 fifo_status, host->cmd_flags); in tifm_sd_data_event()
483 if (host->req) { in tifm_sd_data_event()
484 r_data = host->req->cmd->data; in tifm_sd_data_event()
488 host->cmd_flags |= FIFO_READY; in tifm_sd_data_event()
494 writel(fifo_status, sock->addr + SOCK_DMA_FIFO_STATUS); in tifm_sd_data_event()
495 spin_unlock(&sock->lock); in tifm_sd_data_event()
504 struct mmc_command *cmd = NULL; in tifm_sd_card_event() local
506 spin_lock(&sock->lock); in tifm_sd_card_event()
508 host_status = readl(sock->addr + SOCK_MMCSD_STATUS); in tifm_sd_card_event()
509 dev_dbg(&sock->dev, "host event: host_status %x, flags %x\n", in tifm_sd_card_event()
510 host_status, host->cmd_flags); in tifm_sd_card_event()
512 if (host->req) { in tifm_sd_card_event()
513 cmd = host->req->cmd; in tifm_sd_card_event()
517 sock->addr + SOCK_MMCSD_STATUS); in tifm_sd_card_event()
519 cmd_error = -ETIMEDOUT; in tifm_sd_card_event()
521 cmd_error = -EILSEQ; in tifm_sd_card_event()
523 if (cmd->data) { in tifm_sd_card_event()
525 cmd->data->error = -ETIMEDOUT; in tifm_sd_card_event()
527 cmd->data->error = -EILSEQ; in tifm_sd_card_event()
531 sock->addr + SOCK_DMA_FIFO_INT_ENABLE_CLEAR); in tifm_sd_card_event()
532 writel(TIFM_DMA_RESET, sock->addr + SOCK_DMA_CONTROL); in tifm_sd_card_event()
534 if (host->req->stop) { in tifm_sd_card_event()
535 if (host->cmd_flags & SCMD_ACTIVE) { in tifm_sd_card_event()
536 host->req->stop->error = cmd_error; in tifm_sd_card_event()
537 host->cmd_flags |= SCMD_READY; in tifm_sd_card_event()
539 cmd->error = cmd_error; in tifm_sd_card_event()
540 host->cmd_flags |= SCMD_ACTIVE; in tifm_sd_card_event()
541 tifm_sd_exec(host, host->req->stop); in tifm_sd_card_event()
545 cmd->error = cmd_error; in tifm_sd_card_event()
548 if (!(host->cmd_flags & CMD_READY)) { in tifm_sd_card_event()
549 host->cmd_flags |= CMD_READY; in tifm_sd_card_event()
550 tifm_sd_fetch_resp(cmd, sock); in tifm_sd_card_event()
551 } else if (host->cmd_flags & SCMD_ACTIVE) { in tifm_sd_card_event()
552 host->cmd_flags |= SCMD_READY; in tifm_sd_card_event()
553 tifm_sd_fetch_resp(host->req->stop, in tifm_sd_card_event()
558 host->cmd_flags |= BRS_READY; in tifm_sd_card_event()
561 if (host->no_dma && cmd->data) { in tifm_sd_card_event()
564 sock->addr + SOCK_MMCSD_STATUS); in tifm_sd_card_event()
574 host->cmd_flags &= ~CARD_BUSY; in tifm_sd_card_event()
576 host->cmd_flags |= CARD_BUSY; in tifm_sd_card_event()
581 writel(host_status, sock->addr + SOCK_MMCSD_STATUS); in tifm_sd_card_event()
582 spin_unlock(&sock->lock); in tifm_sd_card_event()
588 struct tifm_dev *sock = host->dev; in tifm_sd_set_data_timeout()
589 unsigned int data_timeout = data->timeout_clks; in tifm_sd_set_data_timeout()
594 data_timeout += data->timeout_ns / in tifm_sd_set_data_timeout()
595 ((1000000000UL / host->clk_freq) * host->clk_div); in tifm_sd_set_data_timeout()
598 writel(data_timeout, sock->addr + SOCK_MMCSD_DATA_TO); in tifm_sd_set_data_timeout()
600 & readl(sock->addr + SOCK_MMCSD_SDIO_MODE_CONFIG), in tifm_sd_set_data_timeout()
601 sock->addr + SOCK_MMCSD_SDIO_MODE_CONFIG); in tifm_sd_set_data_timeout()
606 writel(data_timeout, sock->addr + SOCK_MMCSD_DATA_TO); in tifm_sd_set_data_timeout()
608 | readl(sock->addr + SOCK_MMCSD_SDIO_MODE_CONFIG), in tifm_sd_set_data_timeout()
609 sock->addr + SOCK_MMCSD_SDIO_MODE_CONFIG); in tifm_sd_set_data_timeout()
616 struct tifm_dev *sock = host->dev; in tifm_sd_request()
618 struct mmc_data *r_data = mrq->cmd->data; in tifm_sd_request()
620 spin_lock_irqsave(&sock->lock, flags); in tifm_sd_request()
621 if (host->eject) { in tifm_sd_request()
622 mrq->cmd->error = -ENOMEDIUM; in tifm_sd_request()
626 if (host->req) { in tifm_sd_request()
628 dev_name(&sock->dev)); in tifm_sd_request()
629 mrq->cmd->error = -ETIMEDOUT; in tifm_sd_request()
633 host->cmd_flags = 0; in tifm_sd_request()
634 host->block_pos = 0; in tifm_sd_request()
635 host->sg_pos = 0; in tifm_sd_request()
637 if (mrq->data && !is_power_of_2(mrq->data->blksz)) in tifm_sd_request()
638 host->no_dma = 1; in tifm_sd_request()
640 host->no_dma = no_dma ? 1 : 0; in tifm_sd_request()
645 if ((r_data->flags & MMC_DATA_WRITE) && !mrq->stop) in tifm_sd_request()
647 | readl(sock->addr + SOCK_MMCSD_INT_ENABLE), in tifm_sd_request()
648 sock->addr + SOCK_MMCSD_INT_ENABLE); in tifm_sd_request()
650 if (host->no_dma) { in tifm_sd_request()
652 | readl(sock->addr + SOCK_MMCSD_INT_ENABLE), in tifm_sd_request()
653 sock->addr + SOCK_MMCSD_INT_ENABLE); in tifm_sd_request()
654 writel(((TIFM_MMCSD_FIFO_SIZE - 1) << 8) in tifm_sd_request()
655 | (TIFM_MMCSD_FIFO_SIZE - 1), in tifm_sd_request()
656 sock->addr + SOCK_MMCSD_BUFFER_CONFIG); in tifm_sd_request()
658 host->sg_len = r_data->sg_len; in tifm_sd_request()
660 sg_init_one(&host->bounce_buf, host->bounce_buf_data, in tifm_sd_request()
661 r_data->blksz); in tifm_sd_request()
663 if(1 != tifm_map_sg(sock, &host->bounce_buf, 1, in tifm_sd_request()
664 r_data->flags & MMC_DATA_WRITE in tifm_sd_request()
668 dev_name(&sock->dev)); in tifm_sd_request()
669 mrq->cmd->error = -ENOMEM; in tifm_sd_request()
672 host->sg_len = tifm_map_sg(sock, r_data->sg, in tifm_sd_request()
673 r_data->sg_len, in tifm_sd_request()
674 r_data->flags in tifm_sd_request()
678 if (host->sg_len < 1) { in tifm_sd_request()
680 dev_name(&sock->dev)); in tifm_sd_request()
681 tifm_unmap_sg(sock, &host->bounce_buf, 1, in tifm_sd_request()
682 r_data->flags & MMC_DATA_WRITE in tifm_sd_request()
685 mrq->cmd->error = -ENOMEM; in tifm_sd_request()
690 sock->addr + SOCK_DMA_FIFO_INT_ENABLE_CLEAR); in tifm_sd_request()
691 writel(ilog2(r_data->blksz) - 2, in tifm_sd_request()
692 sock->addr + SOCK_FIFO_PAGE_SIZE); in tifm_sd_request()
694 sock->addr + SOCK_FIFO_CONTROL); in tifm_sd_request()
696 sock->addr + SOCK_DMA_FIFO_INT_ENABLE_SET); in tifm_sd_request()
698 if (r_data->flags & MMC_DATA_WRITE) in tifm_sd_request()
700 sock->addr + SOCK_MMCSD_BUFFER_CONFIG); in tifm_sd_request()
703 sock->addr + SOCK_MMCSD_BUFFER_CONFIG); in tifm_sd_request()
708 writel(r_data->blocks - 1, in tifm_sd_request()
709 sock->addr + SOCK_MMCSD_NUM_BLOCKS); in tifm_sd_request()
710 writel(r_data->blksz - 1, in tifm_sd_request()
711 sock->addr + SOCK_MMCSD_BLOCK_LEN); in tifm_sd_request()
714 host->req = mrq; in tifm_sd_request()
715 mod_timer(&host->timer, jiffies + host->timeout_jiffies); in tifm_sd_request()
716 writel(TIFM_CTRL_LED | readl(sock->addr + SOCK_CONTROL), in tifm_sd_request()
717 sock->addr + SOCK_CONTROL); in tifm_sd_request()
718 tifm_sd_exec(host, mrq->cmd); in tifm_sd_request()
719 spin_unlock_irqrestore(&sock->lock, flags); in tifm_sd_request()
723 spin_unlock_irqrestore(&sock->lock, flags); in tifm_sd_request()
730 struct tifm_dev *sock = host->dev; in tifm_sd_end_cmd()
736 spin_lock_irqsave(&sock->lock, flags); in tifm_sd_end_cmd()
738 del_timer(&host->timer); in tifm_sd_end_cmd()
739 mrq = host->req; in tifm_sd_end_cmd()
740 host->req = NULL; in tifm_sd_end_cmd()
744 dev_name(&sock->dev)); in tifm_sd_end_cmd()
745 spin_unlock_irqrestore(&sock->lock, flags); in tifm_sd_end_cmd()
749 r_data = mrq->cmd->data; in tifm_sd_end_cmd()
751 if (host->no_dma) { in tifm_sd_end_cmd()
753 & readl(sock->addr + SOCK_MMCSD_INT_ENABLE), in tifm_sd_end_cmd()
754 sock->addr + SOCK_MMCSD_INT_ENABLE); in tifm_sd_end_cmd()
756 tifm_unmap_sg(sock, &host->bounce_buf, 1, in tifm_sd_end_cmd()
757 (r_data->flags & MMC_DATA_WRITE) in tifm_sd_end_cmd()
759 tifm_unmap_sg(sock, r_data->sg, r_data->sg_len, in tifm_sd_end_cmd()
760 (r_data->flags & MMC_DATA_WRITE) in tifm_sd_end_cmd()
764 r_data->bytes_xfered = r_data->blocks in tifm_sd_end_cmd()
765 - readl(sock->addr + SOCK_MMCSD_NUM_BLOCKS) - 1; in tifm_sd_end_cmd()
766 r_data->bytes_xfered *= r_data->blksz; in tifm_sd_end_cmd()
767 r_data->bytes_xfered += r_data->blksz in tifm_sd_end_cmd()
768 - readl(sock->addr + SOCK_MMCSD_BLOCK_LEN) + 1; in tifm_sd_end_cmd()
771 writel((~TIFM_CTRL_LED) & readl(sock->addr + SOCK_CONTROL), in tifm_sd_end_cmd()
772 sock->addr + SOCK_CONTROL); in tifm_sd_end_cmd()
774 spin_unlock_irqrestore(&sock->lock, flags); in tifm_sd_end_cmd()
784 dev_name(&host->dev->dev), host->req->cmd->opcode, host->cmd_flags); in tifm_sd_abort()
786 tifm_eject(host->dev); in tifm_sd_abort()
792 struct tifm_dev *sock = host->dev; in tifm_sd_ios()
796 spin_lock_irqsave(&sock->lock, flags); in tifm_sd_ios()
798 dev_dbg(&sock->dev, "ios: clock = %u, vdd = %x, bus_mode = %x, " in tifm_sd_ios()
800 ios->clock, ios->vdd, ios->bus_mode, ios->chip_select, in tifm_sd_ios()
801 ios->power_mode, ios->bus_width); in tifm_sd_ios()
803 if (ios->bus_width == MMC_BUS_WIDTH_4) { in tifm_sd_ios()
804 writel(TIFM_MMCSD_4BBUS | readl(sock->addr + SOCK_MMCSD_CONFIG), in tifm_sd_ios()
805 sock->addr + SOCK_MMCSD_CONFIG); in tifm_sd_ios()
808 & readl(sock->addr + SOCK_MMCSD_CONFIG), in tifm_sd_ios()
809 sock->addr + SOCK_MMCSD_CONFIG); in tifm_sd_ios()
812 if (ios->clock) { in tifm_sd_ios()
813 clk_div1 = 20000000 / ios->clock; in tifm_sd_ios()
817 clk_div2 = 24000000 / ios->clock; in tifm_sd_ios()
821 if ((20000000 / clk_div1) > ios->clock) in tifm_sd_ios()
823 if ((24000000 / clk_div2) > ios->clock) in tifm_sd_ios()
826 host->clk_freq = 20000000; in tifm_sd_ios()
827 host->clk_div = clk_div1; in tifm_sd_ios()
829 & readl(sock->addr + SOCK_CONTROL), in tifm_sd_ios()
830 sock->addr + SOCK_CONTROL); in tifm_sd_ios()
832 host->clk_freq = 24000000; in tifm_sd_ios()
833 host->clk_div = clk_div2; in tifm_sd_ios()
835 | readl(sock->addr + SOCK_CONTROL), in tifm_sd_ios()
836 sock->addr + SOCK_CONTROL); in tifm_sd_ios()
839 host->clk_div = 0; in tifm_sd_ios()
841 host->clk_div &= TIFM_MMCSD_CLKMASK; in tifm_sd_ios()
842 writel(host->clk_div in tifm_sd_ios()
844 & readl(sock->addr + SOCK_MMCSD_CONFIG)), in tifm_sd_ios()
845 sock->addr + SOCK_MMCSD_CONFIG); in tifm_sd_ios()
847 host->open_drain = (ios->bus_mode == MMC_BUSMODE_OPENDRAIN); in tifm_sd_ios()
853 spin_unlock_irqrestore(&sock->lock, flags); in tifm_sd_ios()
860 struct tifm_dev *sock = host->dev; in tifm_sd_ro()
863 spin_lock_irqsave(&sock->lock, flags); in tifm_sd_ro()
864 if (TIFM_MMCSD_CARD_RO & readl(sock->addr + SOCK_PRESENT_STATE)) in tifm_sd_ro()
866 spin_unlock_irqrestore(&sock->lock, flags); in tifm_sd_ro()
880 struct tifm_dev *sock = host->dev; in tifm_sd_initialize_host()
882 writel(0, sock->addr + SOCK_MMCSD_INT_ENABLE); in tifm_sd_initialize_host()
883 host->clk_div = 61; in tifm_sd_initialize_host()
884 host->clk_freq = 20000000; in tifm_sd_initialize_host()
885 writel(TIFM_MMCSD_RESET, sock->addr + SOCK_MMCSD_SYSTEM_CONTROL); in tifm_sd_initialize_host()
886 writel(host->clk_div | TIFM_MMCSD_POWER, in tifm_sd_initialize_host()
887 sock->addr + SOCK_MMCSD_CONFIG); in tifm_sd_initialize_host()
891 if (1 & readl(sock->addr + SOCK_MMCSD_SYSTEM_STATUS)) { in tifm_sd_initialize_host()
900 dev_name(&sock->dev)); in tifm_sd_initialize_host()
901 return -ENODEV; in tifm_sd_initialize_host()
904 writel(0, sock->addr + SOCK_MMCSD_NUM_BLOCKS); in tifm_sd_initialize_host()
905 writel(host->clk_div | TIFM_MMCSD_POWER, in tifm_sd_initialize_host()
906 sock->addr + SOCK_MMCSD_CONFIG); in tifm_sd_initialize_host()
907 writel(TIFM_MMCSD_RXDE, sock->addr + SOCK_MMCSD_BUFFER_CONFIG); in tifm_sd_initialize_host()
910 writel(64, sock->addr + SOCK_MMCSD_COMMAND_TO); in tifm_sd_initialize_host()
911 writel(TIFM_MMCSD_INAB, sock->addr + SOCK_MMCSD_COMMAND); in tifm_sd_initialize_host()
914 host_status = readl(sock->addr + SOCK_MMCSD_STATUS); in tifm_sd_initialize_host()
915 writel(host_status, sock->addr + SOCK_MMCSD_STATUS); in tifm_sd_initialize_host()
925 pr_err("%s : card not ready - probe failed on initialization\n", in tifm_sd_initialize_host()
926 dev_name(&sock->dev)); in tifm_sd_initialize_host()
927 return -ENODEV; in tifm_sd_initialize_host()
932 sock->addr + SOCK_MMCSD_INT_ENABLE); in tifm_sd_initialize_host()
941 int rc = -EIO; in tifm_sd_probe()
944 & readl(sock->addr + SOCK_PRESENT_STATE))) { in tifm_sd_probe()
946 dev_name(&sock->dev)); in tifm_sd_probe()
950 mmc = mmc_alloc_host(sizeof(struct tifm_sd), &sock->dev); in tifm_sd_probe()
952 return -ENOMEM; in tifm_sd_probe()
956 host->dev = sock; in tifm_sd_probe()
957 host->timeout_jiffies = msecs_to_jiffies(TIFM_MMCSD_REQ_TIMEOUT_MS); in tifm_sd_probe()
960 * A future improvement should instead respect the cmd->busy_timeout. in tifm_sd_probe()
962 mmc->max_busy_timeout = TIFM_MMCSD_REQ_TIMEOUT_MS; in tifm_sd_probe()
964 INIT_WORK(&host->finish_bh_work, tifm_sd_end_cmd); in tifm_sd_probe()
965 timer_setup(&host->timer, tifm_sd_abort, 0); in tifm_sd_probe()
967 mmc->ops = &tifm_sd_ops; in tifm_sd_probe()
968 mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; in tifm_sd_probe()
969 mmc->caps = MMC_CAP_4_BIT_DATA; in tifm_sd_probe()
970 mmc->f_min = 20000000 / 60; in tifm_sd_probe()
971 mmc->f_max = 24000000; in tifm_sd_probe()
973 mmc->max_blk_count = 2048; in tifm_sd_probe()
974 mmc->max_segs = mmc->max_blk_count; in tifm_sd_probe()
975 mmc->max_blk_size = min(TIFM_MMCSD_MAX_BLOCK_SIZE, PAGE_SIZE); in tifm_sd_probe()
976 mmc->max_seg_size = mmc->max_blk_count * mmc->max_blk_size; in tifm_sd_probe()
977 mmc->max_req_size = mmc->max_seg_size; in tifm_sd_probe()
979 sock->card_event = tifm_sd_card_event; in tifm_sd_probe()
980 sock->data_event = tifm_sd_data_event; in tifm_sd_probe()
998 spin_lock_irqsave(&sock->lock, flags); in tifm_sd_remove()
999 host->eject = 1; in tifm_sd_remove()
1000 writel(0, sock->addr + SOCK_MMCSD_INT_ENABLE); in tifm_sd_remove()
1001 spin_unlock_irqrestore(&sock->lock, flags); in tifm_sd_remove()
1003 cancel_work_sync(&host->finish_bh_work); in tifm_sd_remove()
1005 spin_lock_irqsave(&sock->lock, flags); in tifm_sd_remove()
1006 if (host->req) { in tifm_sd_remove()
1008 sock->addr + SOCK_DMA_FIFO_INT_ENABLE_CLEAR); in tifm_sd_remove()
1009 writel(0, sock->addr + SOCK_DMA_FIFO_INT_ENABLE_SET); in tifm_sd_remove()
1010 host->req->cmd->error = -ENOMEDIUM; in tifm_sd_remove()
1011 if (host->req->stop) in tifm_sd_remove()
1012 host->req->stop->error = -ENOMEDIUM; in tifm_sd_remove()
1013 queue_work(system_bh_wq, &host->finish_bh_work); in tifm_sd_remove()
1015 spin_unlock_irqrestore(&sock->lock, flags); in tifm_sd_remove()
1017 dev_dbg(&sock->dev, "after remove\n"); in tifm_sd_remove()
1036 dev_dbg(&sock->dev, "resume initialize %d\n", rc); in tifm_sd_resume()
1039 host->eject = 1; in tifm_sd_resume()
1057 .name = DRIVER_NAME,