Lines Matching refs:host
73 #define mmc_omap7xx() (host->features & MMC_OMAP7XX)
74 #define mmc_omap15xx() (host->features & MMC_OMAP15XX)
75 #define mmc_omap16xx() (host->features & MMC_OMAP16XX)
77 #define mmc_omap1() (host->features & MMC_OMAP1_MASK)
80 #define OMAP_MMC_REG(host, reg) (OMAP_MMC_REG_##reg << (host)->reg_shift) argument
81 #define OMAP_MMC_READ(host, reg) __raw_readw((host)->virt_base + OMAP_MMC_REG(host, reg)) argument
82 #define OMAP_MMC_WRITE(host, reg, val) __raw_writew((val), (host)->virt_base + OMAP_MMC_REG(host, r… argument
113 struct mmc_omap_host *host; member
181 if (slot != NULL && slot->host->fclk_enabled && slot->fclk_freq > 0) { in mmc_omap_fclk_offdelay()
187 static void mmc_omap_fclk_enable(struct mmc_omap_host *host, unsigned int enable) in mmc_omap_fclk_enable() argument
191 spin_lock_irqsave(&host->clk_lock, flags); in mmc_omap_fclk_enable()
192 if (host->fclk_enabled != enable) { in mmc_omap_fclk_enable()
193 host->fclk_enabled = enable; in mmc_omap_fclk_enable()
195 clk_enable(host->fclk); in mmc_omap_fclk_enable()
197 clk_disable(host->fclk); in mmc_omap_fclk_enable()
199 spin_unlock_irqrestore(&host->clk_lock, flags); in mmc_omap_fclk_enable()
204 struct mmc_omap_host *host = slot->host; in mmc_omap_select_slot() local
209 spin_lock_irqsave(&host->slot_lock, flags); in mmc_omap_select_slot()
210 while (host->mmc != NULL) { in mmc_omap_select_slot()
211 spin_unlock_irqrestore(&host->slot_lock, flags); in mmc_omap_select_slot()
212 wait_event(host->slot_wq, host->mmc == NULL); in mmc_omap_select_slot()
213 spin_lock_irqsave(&host->slot_lock, flags); in mmc_omap_select_slot()
215 host->mmc = slot->mmc; in mmc_omap_select_slot()
216 spin_unlock_irqrestore(&host->slot_lock, flags); in mmc_omap_select_slot()
218 del_timer(&host->clk_timer); in mmc_omap_select_slot()
219 if (host->current_slot != slot || !claimed) in mmc_omap_select_slot()
220 mmc_omap_fclk_offdelay(host->current_slot); in mmc_omap_select_slot()
222 if (host->current_slot != slot) { in mmc_omap_select_slot()
223 OMAP_MMC_WRITE(host, CON, slot->saved_con & 0xFC00); in mmc_omap_select_slot()
224 if (host->slot_switch) in mmc_omap_select_slot()
230 gpiod_set_value(host->slot_switch, slot->id); in mmc_omap_select_slot()
231 host->current_slot = slot; in mmc_omap_select_slot()
235 mmc_omap_fclk_enable(host, 1); in mmc_omap_select_slot()
240 OMAP_MMC_READ(host, CON); in mmc_omap_select_slot()
242 OMAP_MMC_WRITE(host, CON, slot->saved_con); in mmc_omap_select_slot()
244 mmc_omap_fclk_enable(host, 0); in mmc_omap_select_slot()
247 static void mmc_omap_start_request(struct mmc_omap_host *host,
252 struct mmc_omap_host *host = container_of(work, struct mmc_omap_host, in mmc_omap_slot_release_work() local
254 struct mmc_omap_slot *next_slot = host->next_slot; in mmc_omap_slot_release_work()
257 host->next_slot = NULL; in mmc_omap_slot_release_work()
262 mmc_omap_start_request(host, rq); in mmc_omap_slot_release_work()
267 struct mmc_omap_host *host = slot->host; in mmc_omap_release_slot() local
271 BUG_ON(slot == NULL || host->mmc == NULL); in mmc_omap_release_slot()
275 mod_timer(&host->clk_timer, jiffies + HZ/10); in mmc_omap_release_slot()
277 del_timer(&host->clk_timer); in mmc_omap_release_slot()
279 mmc_omap_fclk_enable(host, 0); in mmc_omap_release_slot()
282 spin_lock_irqsave(&host->slot_lock, flags); in mmc_omap_release_slot()
284 for (i = 0; i < host->nr_slots; i++) { in mmc_omap_release_slot()
287 if (host->slots[i] == NULL || host->slots[i]->mrq == NULL) in mmc_omap_release_slot()
290 BUG_ON(host->next_slot != NULL); in mmc_omap_release_slot()
291 new_slot = host->slots[i]; in mmc_omap_release_slot()
293 BUG_ON(new_slot == host->current_slot); in mmc_omap_release_slot()
295 host->next_slot = new_slot; in mmc_omap_release_slot()
296 host->mmc = new_slot->mmc; in mmc_omap_release_slot()
297 spin_unlock_irqrestore(&host->slot_lock, flags); in mmc_omap_release_slot()
298 queue_work(host->mmc_omap_wq, &host->slot_release_work); in mmc_omap_release_slot()
302 host->mmc = NULL; in mmc_omap_release_slot()
303 wake_up(&host->slot_wq); in mmc_omap_release_slot()
304 spin_unlock_irqrestore(&host->slot_lock, flags); in mmc_omap_release_slot()
345 mmc_omap_start_command(struct mmc_omap_host *host, struct mmc_command *cmd) in mmc_omap_start_command() argument
352 host->cmd = cmd; in mmc_omap_start_command()
373 dev_err(mmc_dev(host->mmc), "Invalid response type: %04x\n", mmc_resp_type(cmd)); in mmc_omap_start_command()
389 if (host->current_slot->bus_mode == MMC_BUSMODE_OPENDRAIN) in mmc_omap_start_command()
395 if (host->data && !(host->data->flags & MMC_DATA_WRITE)) in mmc_omap_start_command()
398 mod_timer(&host->cmd_abort_timer, jiffies + HZ/2); in mmc_omap_start_command()
400 OMAP_MMC_WRITE(host, CTO, 200); in mmc_omap_start_command()
401 OMAP_MMC_WRITE(host, ARGL, cmd->arg & 0xffff); in mmc_omap_start_command()
402 OMAP_MMC_WRITE(host, ARGH, cmd->arg >> 16); in mmc_omap_start_command()
410 OMAP_MMC_WRITE(host, IE, irq_mask); in mmc_omap_start_command()
411 OMAP_MMC_WRITE(host, CMD, cmdreg); in mmc_omap_start_command()
415 mmc_omap_release_dma(struct mmc_omap_host *host, struct mmc_data *data, in mmc_omap_release_dma() argument
419 struct device *dev = mmc_dev(host->mmc); in mmc_omap_release_dma()
424 c = host->dma_tx; in mmc_omap_release_dma()
427 c = host->dma_rx; in mmc_omap_release_dma()
437 dma_unmap_sg(dev, data->sg, host->sg_len, dma_data_dir); in mmc_omap_release_dma()
442 struct mmc_omap_host *host = container_of(work, struct mmc_omap_host, in mmc_omap_send_stop_work() local
444 struct mmc_omap_slot *slot = host->current_slot; in mmc_omap_send_stop_work()
445 struct mmc_data *data = host->stop_data; in mmc_omap_send_stop_work()
451 mmc_omap_start_command(host, data->stop); in mmc_omap_send_stop_work()
455 mmc_omap_xfer_done(struct mmc_omap_host *host, struct mmc_data *data) in mmc_omap_xfer_done() argument
457 if (host->dma_in_use) in mmc_omap_xfer_done()
458 mmc_omap_release_dma(host, data, data->error); in mmc_omap_xfer_done()
460 host->data = NULL; in mmc_omap_xfer_done()
461 host->sg_len = 0; in mmc_omap_xfer_done()
471 host->mrq = NULL; in mmc_omap_xfer_done()
472 mmc = host->mmc; in mmc_omap_xfer_done()
473 mmc_omap_release_slot(host->current_slot, 1); in mmc_omap_xfer_done()
478 host->stop_data = data; in mmc_omap_xfer_done()
479 queue_work(host->mmc_omap_wq, &host->send_stop_work); in mmc_omap_xfer_done()
483 mmc_omap_send_abort(struct mmc_omap_host *host, int maxloops) in mmc_omap_send_abort() argument
485 struct mmc_omap_slot *slot = host->current_slot; in mmc_omap_send_abort()
493 OMAP_MMC_WRITE(host, STAT, 0xFFFF); in mmc_omap_send_abort()
494 OMAP_MMC_WRITE(host, CMD, (3 << 12) | (1 << 7)); in mmc_omap_send_abort()
498 stat = OMAP_MMC_READ(host, STAT); in mmc_omap_send_abort()
508 OMAP_MMC_WRITE(host, STAT, stat); in mmc_omap_send_abort()
512 mmc_omap_abort_xfer(struct mmc_omap_host *host, struct mmc_data *data) in mmc_omap_abort_xfer() argument
514 if (host->dma_in_use) in mmc_omap_abort_xfer()
515 mmc_omap_release_dma(host, data, 1); in mmc_omap_abort_xfer()
517 host->data = NULL; in mmc_omap_abort_xfer()
518 host->sg_len = 0; in mmc_omap_abort_xfer()
520 mmc_omap_send_abort(host, 10000); in mmc_omap_abort_xfer()
524 mmc_omap_end_of_data(struct mmc_omap_host *host, struct mmc_data *data) in mmc_omap_end_of_data() argument
529 if (!host->dma_in_use) { in mmc_omap_end_of_data()
530 mmc_omap_xfer_done(host, data); in mmc_omap_end_of_data()
534 spin_lock_irqsave(&host->dma_lock, flags); in mmc_omap_end_of_data()
535 if (host->dma_done) in mmc_omap_end_of_data()
538 host->brs_received = 1; in mmc_omap_end_of_data()
539 spin_unlock_irqrestore(&host->dma_lock, flags); in mmc_omap_end_of_data()
541 mmc_omap_xfer_done(host, data); in mmc_omap_end_of_data()
545 mmc_omap_dma_done(struct mmc_omap_host *host, struct mmc_data *data) in mmc_omap_dma_done() argument
551 spin_lock_irqsave(&host->dma_lock, flags); in mmc_omap_dma_done()
552 if (host->brs_received) in mmc_omap_dma_done()
555 host->dma_done = 1; in mmc_omap_dma_done()
556 spin_unlock_irqrestore(&host->dma_lock, flags); in mmc_omap_dma_done()
558 mmc_omap_xfer_done(host, data); in mmc_omap_dma_done()
562 mmc_omap_cmd_done(struct mmc_omap_host *host, struct mmc_command *cmd) in mmc_omap_cmd_done() argument
564 host->cmd = NULL; in mmc_omap_cmd_done()
566 del_timer(&host->cmd_abort_timer); in mmc_omap_cmd_done()
572 OMAP_MMC_READ(host, RSP0) | in mmc_omap_cmd_done()
573 (OMAP_MMC_READ(host, RSP1) << 16); in mmc_omap_cmd_done()
575 OMAP_MMC_READ(host, RSP2) | in mmc_omap_cmd_done()
576 (OMAP_MMC_READ(host, RSP3) << 16); in mmc_omap_cmd_done()
578 OMAP_MMC_READ(host, RSP4) | in mmc_omap_cmd_done()
579 (OMAP_MMC_READ(host, RSP5) << 16); in mmc_omap_cmd_done()
581 OMAP_MMC_READ(host, RSP6) | in mmc_omap_cmd_done()
582 (OMAP_MMC_READ(host, RSP7) << 16); in mmc_omap_cmd_done()
586 OMAP_MMC_READ(host, RSP6) | in mmc_omap_cmd_done()
587 (OMAP_MMC_READ(host, RSP7) << 16); in mmc_omap_cmd_done()
591 if (host->data == NULL || cmd->error) { in mmc_omap_cmd_done()
594 if (host->data != NULL) in mmc_omap_cmd_done()
595 mmc_omap_abort_xfer(host, host->data); in mmc_omap_cmd_done()
596 host->mrq = NULL; in mmc_omap_cmd_done()
597 mmc = host->mmc; in mmc_omap_cmd_done()
598 mmc_omap_release_slot(host->current_slot, 1); in mmc_omap_cmd_done()
609 struct mmc_omap_host *host = container_of(work, struct mmc_omap_host, in mmc_omap_abort_command() local
611 BUG_ON(!host->cmd); in mmc_omap_abort_command()
613 dev_dbg(mmc_dev(host->mmc), "Aborting stuck command CMD%d\n", in mmc_omap_abort_command()
614 host->cmd->opcode); in mmc_omap_abort_command()
616 if (host->cmd->error == 0) in mmc_omap_abort_command()
617 host->cmd->error = -ETIMEDOUT; in mmc_omap_abort_command()
619 if (host->data == NULL) { in mmc_omap_abort_command()
623 cmd = host->cmd; in mmc_omap_abort_command()
624 host->cmd = NULL; in mmc_omap_abort_command()
625 mmc_omap_send_abort(host, 10000); in mmc_omap_abort_command()
627 host->mrq = NULL; in mmc_omap_abort_command()
628 mmc = host->mmc; in mmc_omap_abort_command()
629 mmc_omap_release_slot(host->current_slot, 1); in mmc_omap_abort_command()
632 mmc_omap_cmd_done(host, host->cmd); in mmc_omap_abort_command()
634 host->abort = 0; in mmc_omap_abort_command()
635 enable_irq(host->irq); in mmc_omap_abort_command()
641 struct mmc_omap_host *host = from_timer(host, t, cmd_abort_timer); in mmc_omap_cmd_timer() local
644 spin_lock_irqsave(&host->slot_lock, flags); in mmc_omap_cmd_timer()
645 if (host->cmd != NULL && !host->abort) { in mmc_omap_cmd_timer()
646 OMAP_MMC_WRITE(host, IE, 0); in mmc_omap_cmd_timer()
647 disable_irq(host->irq); in mmc_omap_cmd_timer()
648 host->abort = 1; in mmc_omap_cmd_timer()
649 queue_work(host->mmc_omap_wq, &host->cmd_abort_work); in mmc_omap_cmd_timer()
651 spin_unlock_irqrestore(&host->slot_lock, flags); in mmc_omap_cmd_timer()
656 mmc_omap_sg_to_buf(struct mmc_omap_host *host) in mmc_omap_sg_to_buf() argument
660 sg = host->data->sg + host->sg_idx; in mmc_omap_sg_to_buf()
661 host->buffer_bytes_left = sg->length; in mmc_omap_sg_to_buf()
662 host->buffer = sg_virt(sg); in mmc_omap_sg_to_buf()
663 if (host->buffer_bytes_left > host->total_bytes_left) in mmc_omap_sg_to_buf()
664 host->buffer_bytes_left = host->total_bytes_left; in mmc_omap_sg_to_buf()
670 struct mmc_omap_host *host = from_timer(host, t, clk_timer); in mmc_omap_clk_timer() local
672 mmc_omap_fclk_enable(host, 0); in mmc_omap_clk_timer()
677 mmc_omap_xfer_data(struct mmc_omap_host *host, int write) in mmc_omap_xfer_data() argument
681 if (host->buffer_bytes_left == 0) { in mmc_omap_xfer_data()
682 host->sg_idx++; in mmc_omap_xfer_data()
683 BUG_ON(host->sg_idx == host->sg_len); in mmc_omap_xfer_data()
684 mmc_omap_sg_to_buf(host); in mmc_omap_xfer_data()
687 if (n > host->buffer_bytes_left) in mmc_omap_xfer_data()
688 n = host->buffer_bytes_left; in mmc_omap_xfer_data()
693 host->buffer_bytes_left -= n; in mmc_omap_xfer_data()
694 host->total_bytes_left -= n; in mmc_omap_xfer_data()
695 host->data->bytes_xfered += n; in mmc_omap_xfer_data()
698 __raw_writesw(host->virt_base + OMAP_MMC_REG(host, DATA), in mmc_omap_xfer_data()
699 host->buffer, nwords); in mmc_omap_xfer_data()
701 __raw_readsw(host->virt_base + OMAP_MMC_REG(host, DATA), in mmc_omap_xfer_data()
702 host->buffer, nwords); in mmc_omap_xfer_data()
705 host->buffer += nwords; in mmc_omap_xfer_data()
709 static void mmc_omap_report_irq(struct mmc_omap_host *host, u16 status) in mmc_omap_report_irq() argument
723 dev_vdbg(mmc_dev(host->mmc), "%s\n", res); in mmc_omap_report_irq()
726 static void mmc_omap_report_irq(struct mmc_omap_host *host, u16 status) in mmc_omap_report_irq() argument
734 struct mmc_omap_host * host = (struct mmc_omap_host *)dev_id; in mmc_omap_irq() local
740 if (host->cmd == NULL && host->data == NULL) { in mmc_omap_irq()
741 status = OMAP_MMC_READ(host, STAT); in mmc_omap_irq()
742 dev_info(mmc_dev(host->slots[0]->mmc), in mmc_omap_irq()
745 OMAP_MMC_WRITE(host, STAT, status); in mmc_omap_irq()
746 OMAP_MMC_WRITE(host, IE, 0); in mmc_omap_irq()
756 while ((status = OMAP_MMC_READ(host, STAT)) != 0) { in mmc_omap_irq()
759 OMAP_MMC_WRITE(host, STAT, status); in mmc_omap_irq()
760 if (host->cmd != NULL) in mmc_omap_irq()
761 cmd = host->cmd->opcode; in mmc_omap_irq()
764 dev_dbg(mmc_dev(host->mmc), "MMC IRQ %04x (CMD %d): ", in mmc_omap_irq()
766 mmc_omap_report_irq(host, status); in mmc_omap_irq()
768 if (host->total_bytes_left) { in mmc_omap_irq()
771 mmc_omap_xfer_data(host, 0); in mmc_omap_irq()
773 mmc_omap_xfer_data(host, 1); in mmc_omap_irq()
780 dev_dbg(mmc_dev(host->mmc), "data timeout (CMD%d)\n", in mmc_omap_irq()
782 if (host->data) { in mmc_omap_irq()
783 host->data->error = -ETIMEDOUT; in mmc_omap_irq()
789 if (host->data) { in mmc_omap_irq()
790 host->data->error = -EILSEQ; in mmc_omap_irq()
791 dev_dbg(mmc_dev(host->mmc), in mmc_omap_irq()
793 host->total_bytes_left); in mmc_omap_irq()
796 dev_dbg(mmc_dev(host->mmc), "data CRC error\n"); in mmc_omap_irq()
802 if (host->cmd) { in mmc_omap_irq()
804 host->current_slot; in mmc_omap_irq()
807 dev_err(mmc_dev(host->mmc), in mmc_omap_irq()
810 host->cmd->error = -ETIMEDOUT; in mmc_omap_irq()
817 if (host->cmd) { in mmc_omap_irq()
818 dev_err(mmc_dev(host->mmc), in mmc_omap_irq()
820 cmd, host->cmd->arg); in mmc_omap_irq()
821 host->cmd->error = -EILSEQ; in mmc_omap_irq()
825 dev_err(mmc_dev(host->mmc), in mmc_omap_irq()
830 dev_dbg(mmc_dev(host->mmc), in mmc_omap_irq()
846 if (cmd_error && host->data) { in mmc_omap_irq()
847 del_timer(&host->cmd_abort_timer); in mmc_omap_irq()
848 host->abort = 1; in mmc_omap_irq()
849 OMAP_MMC_WRITE(host, IE, 0); in mmc_omap_irq()
850 disable_irq_nosync(host->irq); in mmc_omap_irq()
851 queue_work(host->mmc_omap_wq, &host->cmd_abort_work); in mmc_omap_irq()
855 if (end_command && host->cmd) in mmc_omap_irq()
856 mmc_omap_cmd_done(host, host->cmd); in mmc_omap_irq()
857 if (host->data != NULL) { in mmc_omap_irq()
859 mmc_omap_xfer_done(host, host->data); in mmc_omap_irq()
861 mmc_omap_end_of_data(host, host->data); in mmc_omap_irq()
870 struct mmc_omap_host *host = dev_get_drvdata(dev); in omap_mmc_notify_cover_event() local
871 struct mmc_omap_slot *slot = host->slots[num]; in omap_mmc_notify_cover_event()
873 BUG_ON(num >= host->nr_slots); in omap_mmc_notify_cover_event()
876 if (host->nr_slots == 0 || !host->slots[num]) in omap_mmc_notify_cover_event()
916 struct mmc_omap_host *host = priv; in mmc_omap_dma_callback() local
917 struct mmc_data *data = host->data; in mmc_omap_dma_callback()
922 mmc_omap_dma_done(host, data); in mmc_omap_dma_callback()
925 static inline void set_cmd_timeout(struct mmc_omap_host *host, struct mmc_request *req) in set_cmd_timeout() argument
929 reg = OMAP_MMC_READ(host, SDIO); in set_cmd_timeout()
931 OMAP_MMC_WRITE(host, SDIO, reg); in set_cmd_timeout()
933 OMAP_MMC_WRITE(host, CTO, 0xfd); in set_cmd_timeout()
936 static inline void set_data_timeout(struct mmc_omap_host *host, struct mmc_request *req) in set_data_timeout() argument
941 cycle_ns = 1000000000 / host->current_slot->fclk_freq; in set_data_timeout()
946 reg = OMAP_MMC_READ(host, SDIO); in set_data_timeout()
952 OMAP_MMC_WRITE(host, SDIO, reg); in set_data_timeout()
953 OMAP_MMC_WRITE(host, DTO, timeout); in set_data_timeout()
957 mmc_omap_prepare_data(struct mmc_omap_host *host, struct mmc_request *req) in mmc_omap_prepare_data() argument
964 host->data = data; in mmc_omap_prepare_data()
966 OMAP_MMC_WRITE(host, BLEN, 0); in mmc_omap_prepare_data()
967 OMAP_MMC_WRITE(host, NBLK, 0); in mmc_omap_prepare_data()
968 OMAP_MMC_WRITE(host, BUF, 0); in mmc_omap_prepare_data()
969 host->dma_in_use = 0; in mmc_omap_prepare_data()
970 set_cmd_timeout(host, req); in mmc_omap_prepare_data()
976 OMAP_MMC_WRITE(host, NBLK, data->blocks - 1); in mmc_omap_prepare_data()
977 OMAP_MMC_WRITE(host, BLEN, block_size - 1); in mmc_omap_prepare_data()
978 set_data_timeout(host, req); in mmc_omap_prepare_data()
993 host->sg_idx = 0; in mmc_omap_prepare_data()
1014 c = host->dma_tx; in mmc_omap_prepare_data()
1015 bp = &host->dma_tx_burst; in mmc_omap_prepare_data()
1019 c = host->dma_rx; in mmc_omap_prepare_data()
1020 bp = &host->dma_rx_burst; in mmc_omap_prepare_data()
1031 .src_addr = host->phys_base + in mmc_omap_prepare_data()
1032 OMAP_MMC_REG(host, DATA), in mmc_omap_prepare_data()
1033 .dst_addr = host->phys_base + in mmc_omap_prepare_data()
1034 OMAP_MMC_REG(host, DATA), in mmc_omap_prepare_data()
1047 host->sg_len = dma_map_sg(c->device->dev, data->sg, sg_len, in mmc_omap_prepare_data()
1049 if (host->sg_len == 0) in mmc_omap_prepare_data()
1052 tx = dmaengine_prep_slave_sg(c, data->sg, host->sg_len, in mmc_omap_prepare_data()
1058 OMAP_MMC_WRITE(host, BUF, buf); in mmc_omap_prepare_data()
1061 tx->callback_param = host; in mmc_omap_prepare_data()
1063 host->brs_received = 0; in mmc_omap_prepare_data()
1064 host->dma_done = 0; in mmc_omap_prepare_data()
1065 host->dma_in_use = 1; in mmc_omap_prepare_data()
1071 OMAP_MMC_WRITE(host, BUF, 0x1f1f); in mmc_omap_prepare_data()
1072 host->total_bytes_left = data->blocks * block_size; in mmc_omap_prepare_data()
1073 host->sg_len = sg_len; in mmc_omap_prepare_data()
1074 mmc_omap_sg_to_buf(host); in mmc_omap_prepare_data()
1075 host->dma_in_use = 0; in mmc_omap_prepare_data()
1078 static void mmc_omap_start_request(struct mmc_omap_host *host, in mmc_omap_start_request() argument
1081 BUG_ON(host->mrq != NULL); in mmc_omap_start_request()
1083 host->mrq = req; in mmc_omap_start_request()
1086 mmc_omap_prepare_data(host, req); in mmc_omap_start_request()
1087 mmc_omap_start_command(host, req->cmd); in mmc_omap_start_request()
1088 if (host->dma_in_use) { in mmc_omap_start_request()
1089 struct dma_chan *c = host->data->flags & MMC_DATA_WRITE ? in mmc_omap_start_request()
1090 host->dma_tx : host->dma_rx; in mmc_omap_start_request()
1099 struct mmc_omap_host *host = slot->host; in mmc_omap_request() local
1102 spin_lock_irqsave(&host->slot_lock, flags); in mmc_omap_request()
1103 if (host->mmc != NULL) { in mmc_omap_request()
1106 spin_unlock_irqrestore(&host->slot_lock, flags); in mmc_omap_request()
1109 host->mmc = mmc; in mmc_omap_request()
1110 spin_unlock_irqrestore(&host->slot_lock, flags); in mmc_omap_request()
1112 mmc_omap_start_request(host, req); in mmc_omap_request()
1118 struct mmc_omap_host *host; in mmc_omap_set_power() local
1120 host = slot->host; in mmc_omap_set_power()
1149 w = OMAP_MMC_READ(host, CON); in mmc_omap_set_power()
1150 OMAP_MMC_WRITE(host, CON, w | (1 << 11)); in mmc_omap_set_power()
1152 w = OMAP_MMC_READ(host, CON); in mmc_omap_set_power()
1153 OMAP_MMC_WRITE(host, CON, w & ~(1 << 11)); in mmc_omap_set_power()
1161 struct mmc_omap_host *host = slot->host; in mmc_omap_calc_divisor() local
1162 int func_clk_rate = clk_get_rate(host->fclk); in mmc_omap_calc_divisor()
1189 struct mmc_omap_host *host = slot->host; in mmc_omap_set_ios() local
1212 mmc_omap_fclk_enable(host, 1); in mmc_omap_set_ios()
1233 OMAP_MMC_WRITE(host, CON, dsor); in mmc_omap_set_ios()
1240 OMAP_MMC_WRITE(host, IE, 0); in mmc_omap_set_ios()
1241 OMAP_MMC_WRITE(host, STAT, 0xffff); in mmc_omap_set_ios()
1242 OMAP_MMC_WRITE(host, CMD, 1 << 7); in mmc_omap_set_ios()
1243 while (usecs > 0 && (OMAP_MMC_READ(host, STAT) & 1) == 0) { in mmc_omap_set_ios()
1247 OMAP_MMC_WRITE(host, STAT, 1); in mmc_omap_set_ios()
1259 static int mmc_omap_new_slot(struct mmc_omap_host *host, int id) in mmc_omap_new_slot() argument
1265 mmc = mmc_alloc_host(sizeof(struct mmc_omap_slot), host->dev); in mmc_omap_new_slot()
1270 slot->host = host; in mmc_omap_new_slot()
1274 slot->pdata = &host->pdata->slots[id]; in mmc_omap_new_slot()
1277 slot->vsd = devm_gpiod_get_index_optional(host->dev, "vsd", in mmc_omap_new_slot()
1280 return dev_err_probe(host->dev, PTR_ERR(slot->vsd), in mmc_omap_new_slot()
1282 slot->vio = devm_gpiod_get_index_optional(host->dev, "vio", in mmc_omap_new_slot()
1285 return dev_err_probe(host->dev, PTR_ERR(slot->vio), in mmc_omap_new_slot()
1287 slot->cover = devm_gpiod_get_index_optional(host->dev, "cover", in mmc_omap_new_slot()
1290 return dev_err_probe(host->dev, PTR_ERR(slot->cover), in mmc_omap_new_slot()
1293 host->slots[id] = slot; in mmc_omap_new_slot()
1296 if (host->pdata->slots[id].wires >= 4) in mmc_omap_new_slot()
1306 if (host->pdata->max_freq) in mmc_omap_new_slot()
1307 mmc->f_max = min(host->pdata->max_freq, mmc->f_max); in mmc_omap_new_slot()
1366 flush_workqueue(slot->host->mmc_omap_wq); in mmc_omap_remove_slot()
1375 struct mmc_omap_host *host = NULL; in mmc_omap_probe() local
1389 host = devm_kzalloc(&pdev->dev, sizeof(struct mmc_omap_host), in mmc_omap_probe()
1391 if (host == NULL) in mmc_omap_probe()
1398 host->virt_base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); in mmc_omap_probe()
1399 if (IS_ERR(host->virt_base)) in mmc_omap_probe()
1400 return PTR_ERR(host->virt_base); in mmc_omap_probe()
1402 INIT_WORK(&host->slot_release_work, mmc_omap_slot_release_work); in mmc_omap_probe()
1403 INIT_WORK(&host->send_stop_work, mmc_omap_send_stop_work); in mmc_omap_probe()
1405 INIT_WORK(&host->cmd_abort_work, mmc_omap_abort_command); in mmc_omap_probe()
1406 timer_setup(&host->cmd_abort_timer, mmc_omap_cmd_timer, 0); in mmc_omap_probe()
1408 spin_lock_init(&host->clk_lock); in mmc_omap_probe()
1409 timer_setup(&host->clk_timer, mmc_omap_clk_timer, 0); in mmc_omap_probe()
1411 spin_lock_init(&host->dma_lock); in mmc_omap_probe()
1412 spin_lock_init(&host->slot_lock); in mmc_omap_probe()
1413 init_waitqueue_head(&host->slot_wq); in mmc_omap_probe()
1415 host->pdata = pdata; in mmc_omap_probe()
1416 host->features = host->pdata->slots[0].features; in mmc_omap_probe()
1417 host->dev = &pdev->dev; in mmc_omap_probe()
1418 platform_set_drvdata(pdev, host); in mmc_omap_probe()
1420 host->slot_switch = devm_gpiod_get_optional(host->dev, "switch", in mmc_omap_probe()
1422 if (IS_ERR(host->slot_switch)) in mmc_omap_probe()
1423 return dev_err_probe(host->dev, PTR_ERR(host->slot_switch), in mmc_omap_probe()
1426 host->id = pdev->id; in mmc_omap_probe()
1427 host->irq = irq; in mmc_omap_probe()
1428 host->phys_base = res->start; in mmc_omap_probe()
1429 host->iclk = clk_get(&pdev->dev, "ick"); in mmc_omap_probe()
1430 if (IS_ERR(host->iclk)) in mmc_omap_probe()
1431 return PTR_ERR(host->iclk); in mmc_omap_probe()
1432 clk_prepare_enable(host->iclk); in mmc_omap_probe()
1434 host->fclk = clk_get(&pdev->dev, "fck"); in mmc_omap_probe()
1435 if (IS_ERR(host->fclk)) { in mmc_omap_probe()
1436 ret = PTR_ERR(host->fclk); in mmc_omap_probe()
1440 ret = clk_prepare(host->fclk); in mmc_omap_probe()
1444 host->dma_tx_burst = -1; in mmc_omap_probe()
1445 host->dma_rx_burst = -1; in mmc_omap_probe()
1447 host->dma_tx = dma_request_chan(&pdev->dev, "tx"); in mmc_omap_probe()
1448 if (IS_ERR(host->dma_tx)) { in mmc_omap_probe()
1449 ret = PTR_ERR(host->dma_tx); in mmc_omap_probe()
1453 host->dma_tx = NULL; in mmc_omap_probe()
1454 dev_warn(host->dev, "TX DMA channel request failed\n"); in mmc_omap_probe()
1457 host->dma_rx = dma_request_chan(&pdev->dev, "rx"); in mmc_omap_probe()
1458 if (IS_ERR(host->dma_rx)) { in mmc_omap_probe()
1459 ret = PTR_ERR(host->dma_rx); in mmc_omap_probe()
1461 if (host->dma_tx) in mmc_omap_probe()
1462 dma_release_channel(host->dma_tx); in mmc_omap_probe()
1466 host->dma_rx = NULL; in mmc_omap_probe()
1467 dev_warn(host->dev, "RX DMA channel request failed\n"); in mmc_omap_probe()
1470 ret = request_irq(host->irq, mmc_omap_irq, 0, DRIVER_NAME, host); in mmc_omap_probe()
1480 host->nr_slots = pdata->nr_slots; in mmc_omap_probe()
1481 host->reg_shift = (mmc_omap7xx() ? 1 : 2); in mmc_omap_probe()
1483 host->mmc_omap_wq = alloc_workqueue("mmc_omap", 0, 0); in mmc_omap_probe()
1484 if (!host->mmc_omap_wq) { in mmc_omap_probe()
1490 ret = mmc_omap_new_slot(host, i); in mmc_omap_probe()
1493 mmc_omap_remove_slot(host->slots[i]); in mmc_omap_probe()
1502 destroy_workqueue(host->mmc_omap_wq); in mmc_omap_probe()
1507 free_irq(host->irq, host); in mmc_omap_probe()
1509 if (host->dma_tx) in mmc_omap_probe()
1510 dma_release_channel(host->dma_tx); in mmc_omap_probe()
1511 if (host->dma_rx) in mmc_omap_probe()
1512 dma_release_channel(host->dma_rx); in mmc_omap_probe()
1514 clk_unprepare(host->fclk); in mmc_omap_probe()
1516 clk_put(host->fclk); in mmc_omap_probe()
1518 clk_disable_unprepare(host->iclk); in mmc_omap_probe()
1519 clk_put(host->iclk); in mmc_omap_probe()
1525 struct mmc_omap_host *host = platform_get_drvdata(pdev); in mmc_omap_remove() local
1528 BUG_ON(host == NULL); in mmc_omap_remove()
1530 for (i = 0; i < host->nr_slots; i++) in mmc_omap_remove()
1531 mmc_omap_remove_slot(host->slots[i]); in mmc_omap_remove()
1533 if (host->pdata->cleanup) in mmc_omap_remove()
1534 host->pdata->cleanup(&pdev->dev); in mmc_omap_remove()
1536 mmc_omap_fclk_enable(host, 0); in mmc_omap_remove()
1537 free_irq(host->irq, host); in mmc_omap_remove()
1538 clk_unprepare(host->fclk); in mmc_omap_remove()
1539 clk_put(host->fclk); in mmc_omap_remove()
1540 clk_disable_unprepare(host->iclk); in mmc_omap_remove()
1541 clk_put(host->iclk); in mmc_omap_remove()
1543 if (host->dma_tx) in mmc_omap_remove()
1544 dma_release_channel(host->dma_tx); in mmc_omap_remove()
1545 if (host->dma_rx) in mmc_omap_remove()
1546 dma_release_channel(host->dma_rx); in mmc_omap_remove()
1548 destroy_workqueue(host->mmc_omap_wq); in mmc_omap_remove()