Lines Matching defs:host

23 #include <linux/mmc/host.h>
123 static int litex_mmc_send_cmd(struct litex_mmc_host *host,
126 struct device *dev = mmc_dev(host->mmc);
131 litex_write32(host->sdcore + LITEX_CORE_CMDARG, arg);
132 litex_write32(host->sdcore + LITEX_CORE_CMDCMD,
134 litex_write8(host->sdcore + LITEX_CORE_CMDSND, 1);
140 if (host->irq > 0 &&
143 reinit_completion(&host->cmd_done);
144 litex_write32(host->sdirq + LITEX_IRQ_ENABLE,
146 wait_for_completion(&host->cmd_done);
149 ret = litex_mmc_sdcard_wait_done(host->sdcore + LITEX_CORE_CMDEVT, dev);
160 memcpy_fromio(host->resp,
161 host->sdcore + LITEX_CORE_CMDRSP, 0x10);
164 if (!host->app_cmd && cmd == SD_SEND_RELATIVE_ADDR)
165 host->rca = (host->resp[3] >> 16);
167 host->app_cmd = (cmd == MMC_APP_CMD);
172 ret = litex_mmc_sdcard_wait_done(host->sdcore + LITEX_CORE_DATEVT, dev);
180 host->sdreader + LITEX_BLK2MEM_DONE :
181 host->sdwriter + LITEX_MEM2BLK_DONE;
190 static int litex_mmc_send_app_cmd(struct litex_mmc_host *host)
192 return litex_mmc_send_cmd(host, MMC_APP_CMD, host->rca << 16,
196 static int litex_mmc_send_set_bus_w_cmd(struct litex_mmc_host *host, u32 width)
198 return litex_mmc_send_cmd(host, SD_APP_SET_BUS_WIDTH, width,
202 static int litex_mmc_set_bus_width(struct litex_mmc_host *host)
207 if (host->is_bus_width_set)
211 app_cmd_sent = host->app_cmd; /* was preceding command app_cmd? */
213 ret = litex_mmc_send_app_cmd(host);
219 ret = litex_mmc_send_set_bus_w_cmd(host, MMC_BUS_WIDTH_4);
225 ret = litex_mmc_send_app_cmd(host);
230 host->is_bus_width_set = true;
237 struct litex_mmc_host *host = mmc_priv(mmc);
243 ret = !litex_read8(host->sdphy + LITEX_PHY_CARDDETECT);
248 host->is_bus_width_set = false;
256 struct litex_mmc_host *host = mmc_priv(mmc);
257 u32 pending = litex_read32(host->sdirq + LITEX_IRQ_PENDING);
262 litex_write32(host->sdirq + LITEX_IRQ_PENDING,
271 litex_write32(host->sdirq + LITEX_IRQ_ENABLE,
273 complete(&host->cmd_done);
291 static void litex_mmc_do_dma(struct litex_mmc_host *host, struct mmc_data *data,
294 struct device *dev = mmc_dev(host->mmc);
303 dma = host->dma;
311 } else if (*len > host->buf_size)
312 *len = host->buf_size;
315 litex_write8(host->sdreader + LITEX_BLK2MEM_ENA, 0);
316 litex_write64(host->sdreader + LITEX_BLK2MEM_BASE, dma);
317 litex_write32(host->sdreader + LITEX_BLK2MEM_LEN, *len);
318 litex_write8(host->sdreader + LITEX_BLK2MEM_ENA, 1);
323 host->buffer, *len);
324 litex_write8(host->sdwriter + LITEX_MEM2BLK_ENA, 0);
325 litex_write64(host->sdwriter + LITEX_MEM2BLK_BASE, dma);
326 litex_write32(host->sdwriter + LITEX_MEM2BLK_LEN, *len);
327 litex_write8(host->sdwriter + LITEX_MEM2BLK_ENA, 1);
334 litex_write16(host->sdcore + LITEX_CORE_BLKLEN, data->blksz);
335 litex_write32(host->sdcore + LITEX_CORE_BLKCNT, data->blocks);
340 struct litex_mmc_host *host = mmc_priv(mmc);
361 sbc->error = litex_mmc_send_cmd(host, sbc->opcode, sbc->arg,
365 host->is_bus_width_set = false;
378 cmd->error = litex_mmc_set_bus_width(host);
385 litex_mmc_do_dma(host, data, &len, &direct, &transfer);
389 cmd->error = litex_mmc_send_cmd(host, cmd->opcode, cmd->arg,
395 host->is_bus_width_set = false;
399 /* Pull short response fields from appropriate host registers */
400 cmd->resp[0] = host->resp[3];
401 cmd->resp[1] = host->resp[2] & 0xFF;
403 cmd->resp[0] = host->resp[0];
404 cmd->resp[1] = host->resp[1];
405 cmd->resp[2] = host->resp[2];
406 cmd->resp[3] = host->resp[3];
411 stop->error = litex_mmc_send_cmd(host, stop->opcode, stop->arg,
415 host->is_bus_width_set = false;
427 host->buffer, data->bytes_xfered);
434 static void litex_mmc_setclk(struct litex_mmc_host *host, unsigned int freq)
436 struct device *dev = mmc_dev(host->mmc);
439 div = freq ? host->ref_clk / freq : 256U;
443 freq, host->ref_clk / div, div);
444 litex_write16(host->sdphy + LITEX_PHY_CLOCKERDIV, div);
445 host->sd_clk = freq;
450 struct litex_mmc_host *host = mmc_priv(mmc);
460 if (ios->clock != host->sd_clk)
461 litex_mmc_setclk(host, ios->clock);
471 struct litex_mmc_host *host)
473 struct device *dev = mmc_dev(host->mmc);
480 host->irq = ret;
486 host->sdirq = devm_platform_ioremap_resource_byname(pdev, "irq");
487 if (IS_ERR(host->sdirq))
488 return PTR_ERR(host->sdirq);
490 ret = devm_request_irq(dev, host->irq, litex_mmc_interrupt, 0,
491 "litex-mmc", host->mmc);
498 litex_write32(host->sdirq + LITEX_IRQ_PENDING, SDIRQ_CARD_DETECT);
499 litex_write32(host->sdirq + LITEX_IRQ_ENABLE, SDIRQ_CARD_DETECT);
504 host->mmc->caps |= MMC_CAP_NEEDS_POLL;
505 host->irq = 0;
517 struct litex_mmc_host *host;
537 host = mmc_priv(mmc);
538 host->mmc = mmc;
544 host->ref_clk = clk_get_rate(clk);
545 host->sd_clk = 0;
552 host->is_bus_width_set = false;
553 host->app_cmd = false;
560 host->buf_size = mmc->max_req_size * 2;
561 host->buffer = dmam_alloc_coherent(dev, host->buf_size,
562 &host->dma, GFP_KERNEL);
563 if (host->buffer == NULL)
566 host->sdphy = devm_platform_ioremap_resource_byname(pdev, "phy");
567 if (IS_ERR(host->sdphy))
568 return PTR_ERR(host->sdphy);
570 host->sdcore = devm_platform_ioremap_resource_byname(pdev, "core");
571 if (IS_ERR(host->sdcore))
572 return PTR_ERR(host->sdcore);
574 host->sdreader = devm_platform_ioremap_resource_byname(pdev, "reader");
575 if (IS_ERR(host->sdreader))
576 return PTR_ERR(host->sdreader);
578 host->sdwriter = devm_platform_ioremap_resource_byname(pdev, "writer");
579 if (IS_ERR(host->sdwriter))
580 return PTR_ERR(host->sdwriter);
583 litex_write8(host->sdreader + LITEX_BLK2MEM_ENA, 0);
584 litex_write8(host->sdwriter + LITEX_MEM2BLK_ENA, 0);
586 init_completion(&host->cmd_done);
587 ret = litex_mmc_irq_init(pdev, host);
622 platform_set_drvdata(pdev, host);
634 struct litex_mmc_host *host = platform_get_drvdata(pdev);
636 mmc_remove_host(host->mmc);