Lines Matching refs:host

24 #include <linux/mmc/host.h>
72 static inline void alcor_rmw8(struct alcor_sdmmc_host *host, unsigned int addr,
75 struct alcor_pci_priv *priv = host->alcor_pci;
87 static inline void alcor_mask_sd_irqs(struct alcor_sdmmc_host *host)
89 struct alcor_pci_priv *priv = host->alcor_pci;
94 static inline void alcor_unmask_sd_irqs(struct alcor_sdmmc_host *host)
96 struct alcor_pci_priv *priv = host->alcor_pci;
104 static void alcor_reset(struct alcor_sdmmc_host *host, u8 val)
106 struct alcor_pci_priv *priv = host->alcor_pci;
116 dev_err(host->dev, "%s: timeout\n", __func__);
122 static void alcor_data_set_dma(struct alcor_sdmmc_host *host)
124 struct alcor_pci_priv *priv = host->alcor_pci;
127 if (!host->sg_count)
130 if (!host->sg) {
131 dev_err(host->dev, "have blocks, but no SG\n");
135 if (!sg_dma_len(host->sg)) {
136 dev_err(host->dev, "DMA SG len == 0\n");
141 addr = (u32)sg_dma_address(host->sg);
144 host->sg = sg_next(host->sg);
145 host->sg_count--;
148 static void alcor_trigger_data_transfer(struct alcor_sdmmc_host *host)
150 struct alcor_pci_priv *priv = host->alcor_pci;
151 struct mmc_data *data = host->data;
166 alcor_data_set_dma(host);
168 host->dma_on = 1;
185 static void alcor_trf_block_pio(struct alcor_sdmmc_host *host, bool read)
187 struct alcor_pci_priv *priv = host->alcor_pci;
191 if (!host->blocks)
194 if (host->dma_on) {
195 dev_err(host->dev, "configured DMA but got PIO request.\n");
199 if (!!(host->data->flags & MMC_DATA_READ) != read) {
200 dev_err(host->dev, "got unexpected direction %i != %i\n",
201 !!(host->data->flags & MMC_DATA_READ), read);
204 if (!sg_miter_next(&host->sg_miter))
207 blksize = host->data->blksz;
208 len = min(host->sg_miter.length, blksize);
210 dev_dbg(host->dev, "PIO, %s block size: 0x%zx\n",
213 host->sg_miter.consumed = len;
214 host->blocks--;
216 buf = host->sg_miter.addr;
223 sg_miter_stop(&host->sg_miter);
226 static void alcor_prepare_sg_miter(struct alcor_sdmmc_host *host)
229 struct mmc_data *data = host->data;
235 sg_miter_start(&host->sg_miter, data->sg, data->sg_len, flags);
238 static void alcor_prepare_data(struct alcor_sdmmc_host *host,
241 struct alcor_pci_priv *priv = host->alcor_pci;
248 host->data = data;
249 host->data->bytes_xfered = 0;
250 host->blocks = data->blocks;
251 host->sg = data->sg;
252 host->sg_count = data->sg_count;
253 dev_dbg(host->dev, "prepare DATA: sg %i, blocks: %i\n",
254 host->sg_count, host->blocks);
257 alcor_prepare_sg_miter(host);
262 static void alcor_send_cmd(struct alcor_sdmmc_host *host,
265 struct alcor_pci_priv *priv = host->alcor_pci;
269 host->cmd = cmd;
270 alcor_prepare_data(host, cmd);
272 dev_dbg(host->dev, "send CMD. opcode: 0x%02x, arg; 0x%08x\n",
294 dev_err(host->dev, "%s: cmd->flag (0x%02x) is not valid\n",
295 mmc_hostname(mmc_from_priv(host)), mmc_resp_type(cmd));
305 schedule_delayed_work(&host->timeout_work,
309 dev_dbg(host->dev, "xfer ctrl: 0x%02x; timeout: %lu\n", ctrl, timeout);
314 static void alcor_request_complete(struct alcor_sdmmc_host *host,
323 if (!host->mrq)
327 cancel_delayed_work(&host->timeout_work);
329 mrq = host->mrq;
331 host->mrq = NULL;
332 host->cmd = NULL;
333 host->data = NULL;
334 host->dma_on = 0;
336 mmc_request_done(mmc_from_priv(host), mrq);
339 static void alcor_finish_data(struct alcor_sdmmc_host *host)
343 data = host->data;
344 host->data = NULL;
345 host->dma_on = 0;
366 !host->mrq->sbc)) {
373 alcor_reset(host, AU6601_RESET_CMD | AU6601_RESET_DATA);
375 alcor_unmask_sd_irqs(host);
376 alcor_send_cmd(host, data->stop, false);
380 alcor_request_complete(host, 1);
383 static void alcor_err_irq(struct alcor_sdmmc_host *host, u32 intmask)
385 dev_dbg(host->dev, "ERR IRQ %x\n", intmask);
387 if (host->cmd) {
389 host->cmd->error = -ETIMEDOUT;
391 host->cmd->error = -EILSEQ;
394 if (host->data) {
396 host->data->error = -ETIMEDOUT;
398 host->data->error = -EILSEQ;
400 host->data->bytes_xfered = 0;
403 alcor_reset(host, AU6601_RESET_CMD | AU6601_RESET_DATA);
404 alcor_request_complete(host, 1);
407 static int alcor_cmd_irq_done(struct alcor_sdmmc_host *host, u32 intmask)
409 struct alcor_pci_priv *priv = host->alcor_pci;
419 if (!host->cmd)
422 if (host->cmd->flags & MMC_RSP_PRESENT) {
423 struct mmc_command *cmd = host->cmd;
426 dev_dbg(host->dev, "RSP0: 0x%04x\n", cmd->resp[0]);
427 if (host->cmd->flags & MMC_RSP_136) {
434 dev_dbg(host->dev, "RSP1,2,3: 0x%04x 0x%04x 0x%04x\n",
440 host->cmd->error = 0;
443 if (!host->data)
446 alcor_trigger_data_transfer(host);
447 host->cmd = NULL;
451 static void alcor_cmd_irq_thread(struct alcor_sdmmc_host *host, u32 intmask)
458 if (!host->cmd && intmask & AU6601_INT_CMD_END) {
459 dev_dbg(host->dev, "Got command interrupt 0x%08x even though no command operation was in progress.\n",
464 if (!host->data)
465 alcor_request_complete(host, 1);
467 alcor_trigger_data_transfer(host);
468 host->cmd = NULL;
471 static int alcor_data_irq_done(struct alcor_sdmmc_host *host, u32 intmask)
484 if (!host->data && intmask == AU6601_INT_DATA_END)
488 if (!host->data)
497 alcor_trf_block_pio(host, true);
500 alcor_trf_block_pio(host, false);
503 if (!host->sg_count)
506 alcor_data_set_dma(host);
509 dev_err(host->dev, "Got READ_BUF_RDY and WRITE_BUF_RDY at same time\n");
514 if (!host->dma_on && host->blocks) {
515 alcor_trigger_data_transfer(host);
525 static void alcor_data_irq_thread(struct alcor_sdmmc_host *host, u32 intmask)
532 if (!host->data) {
533 dev_dbg(host->dev, "Got data interrupt 0x%08x even though no data operation was in progress.\n",
535 alcor_reset(host, AU6601_RESET_DATA);
539 if (alcor_data_irq_done(host, intmask))
542 if ((intmask & AU6601_INT_DATA_END) || !host->blocks ||
543 (host->dma_on && !host->sg_count))
544 alcor_finish_data(host);
547 static void alcor_cd_irq(struct alcor_sdmmc_host *host, u32 intmask)
549 dev_dbg(host->dev, "card %s\n",
552 if (host->mrq) {
553 dev_dbg(host->dev, "cancel all pending tasks.\n");
555 if (host->data)
556 host->data->error = -ENOMEDIUM;
558 if (host->cmd)
559 host->cmd->error = -ENOMEDIUM;
561 host->mrq->cmd->error = -ENOMEDIUM;
563 alcor_request_complete(host, 1);
566 mmc_detect_change(mmc_from_priv(host), msecs_to_jiffies(1));
571 struct alcor_sdmmc_host *host = d;
575 mutex_lock(&host->cmd_mutex);
577 intmask = host->irq_status_sd;
581 dev_dbg(host->dev, "unexpected IRQ: 0x%04x\n", intmask);
589 alcor_err_irq(host, tmp);
591 alcor_cmd_irq_thread(host, tmp);
592 alcor_data_irq_thread(host, tmp);
598 alcor_cd_irq(host, intmask);
603 dev_warn(host->dev,
609 dev_dbg(host->dev, "got not handled IRQ: 0x%04x\n", intmask);
612 mutex_unlock(&host->cmd_mutex);
613 alcor_unmask_sd_irqs(host);
620 struct alcor_sdmmc_host *host = d;
621 struct alcor_pci_priv *priv = host->alcor_pci;
636 cmd_done = alcor_cmd_irq_done(host, tmp);
637 data_done = alcor_data_irq_done(host, tmp);
645 host->irq_status_sd = status;
647 alcor_mask_sd_irqs(host);
652 static void alcor_set_clock(struct alcor_sdmmc_host *host, unsigned int clock)
654 struct alcor_pci_priv *priv = host->alcor_pci;
685 dev_dbg(host->dev, "set freq %d cal freq %d, use div %d, mod %x\n",
694 struct alcor_sdmmc_host *host = mmc_priv(mmc);
697 alcor_rmw8(host, AU6601_CLK_DELAY,
700 alcor_rmw8(host, AU6601_CLK_DELAY,
707 struct alcor_sdmmc_host *host = mmc_priv(mmc);
708 struct alcor_pci_priv *priv = host->alcor_pci;
716 dev_err(host->dev, "Unknown BUS mode\n");
722 struct alcor_sdmmc_host *host = mmc_priv(mmc);
723 struct alcor_pci_priv *priv = host->alcor_pci;
734 struct alcor_sdmmc_host *host = mmc_priv(mmc);
735 struct alcor_pci_priv *priv = host->alcor_pci;
746 struct alcor_sdmmc_host *host = mmc_priv(mmc);
747 struct alcor_pci_priv *priv = host->alcor_pci;
758 struct alcor_sdmmc_host *host = mmc_priv(mmc);
760 mutex_lock(&host->cmd_mutex);
762 host->mrq = mrq;
766 alcor_send_cmd(host, mrq->cmd, true);
769 alcor_request_complete(host, 1);
772 mutex_unlock(&host->cmd_mutex);
778 struct alcor_sdmmc_host *host = mmc_priv(mmc);
817 sg_len = dma_map_sg(host->dev, data->sg, data->sg_len,
829 struct alcor_sdmmc_host *host = mmc_priv(mmc);
836 dma_unmap_sg(host->dev,
847 struct alcor_sdmmc_host *host = mmc_priv(mmc);
848 struct alcor_pci_priv *priv = host->alcor_pci;
852 alcor_set_clock(host, ios->clock);
880 alcor_set_clock(host, ios->clock);
887 alcor_set_clock(host, ios->clock);
902 dev_err(host->dev, "Unknown power parameter\n");
908 struct alcor_sdmmc_host *host = mmc_priv(mmc);
910 mutex_lock(&host->cmd_mutex);
912 dev_dbg(host->dev, "set ios. bus width: %x, power mode: %x\n",
915 if (ios->power_mode != host->cur_power_mode) {
917 host->cur_power_mode = ios->power_mode;
921 alcor_set_clock(host, ios->clock);
924 mutex_unlock(&host->cmd_mutex);
930 struct alcor_sdmmc_host *host = mmc_priv(mmc);
932 mutex_lock(&host->cmd_mutex);
936 alcor_rmw8(host, AU6601_OPT, AU6601_OPT_SD_18V, 0);
939 alcor_rmw8(host, AU6601_OPT, 0, AU6601_OPT_SD_18V);
946 mutex_unlock(&host->cmd_mutex);
964 struct alcor_sdmmc_host *host = container_of(d, struct alcor_sdmmc_host,
966 mutex_lock(&host->cmd_mutex);
968 dev_dbg(host->dev, "triggered timeout\n");
969 if (host->mrq) {
970 dev_err(host->dev, "Timeout waiting for hardware interrupt.\n");
972 if (host->data) {
973 host->data->error = -ETIMEDOUT;
975 if (host->cmd)
976 host->cmd->error = -ETIMEDOUT;
978 host->mrq->cmd->error = -ETIMEDOUT;
981 alcor_reset(host, AU6601_RESET_CMD | AU6601_RESET_DATA);
982 alcor_request_complete(host, 0);
985 mutex_unlock(&host->cmd_mutex);
988 static void alcor_hw_init(struct alcor_sdmmc_host *host)
990 struct alcor_pci_priv *priv = host->alcor_pci;
999 alcor_reset(host, AU6601_RESET_CMD);
1009 alcor_reset(host, AU6601_RESET_DATA);
1030 alcor_unmask_sd_irqs(host);
1033 static void alcor_hw_uninit(struct alcor_sdmmc_host *host)
1035 struct alcor_pci_priv *priv = host->alcor_pci;
1037 alcor_mask_sd_irqs(host);
1038 alcor_reset(host, AU6601_RESET_CMD | AU6601_RESET_DATA);
1048 static void alcor_init_mmc(struct alcor_sdmmc_host *host)
1050 struct mmc_host *mmc = mmc_from_priv(host);
1076 dma_set_max_seg_size(host->dev, mmc->max_seg_size);
1083 struct alcor_sdmmc_host *host;
1086 mmc = mmc_alloc_host(sizeof(*host), &pdev->dev);
1092 host = mmc_priv(mmc);
1093 host->dev = &pdev->dev;
1094 host->cur_power_mode = MMC_POWER_UNDEFINED;
1095 host->alcor_pci = priv;
1103 DRV_NAME_ALCOR_PCI_SDMMC, host);
1110 mutex_init(&host->cmd_mutex);
1111 INIT_DELAYED_WORK(&host->timeout_work, alcor_timeout_timer);
1113 alcor_init_mmc(host);
1114 alcor_hw_init(host);
1116 dev_set_drvdata(&pdev->dev, host);
1130 struct alcor_sdmmc_host *host = dev_get_drvdata(&pdev->dev);
1131 struct mmc_host *mmc = mmc_from_priv(host);
1133 if (cancel_delayed_work_sync(&host->timeout_work))
1134 alcor_request_complete(host, 0);
1136 alcor_hw_uninit(host);
1144 struct alcor_sdmmc_host *host = dev_get_drvdata(dev);
1146 if (cancel_delayed_work_sync(&host->timeout_work))
1147 alcor_request_complete(host, 0);
1149 alcor_hw_uninit(host);
1156 struct alcor_sdmmc_host *host = dev_get_drvdata(dev);
1158 alcor_hw_init(host);