Lines Matching defs:host
25 #include <linux/mmc/host.h>
128 struct meson_mx_mmc_host *host = mmc_priv(mmc);
131 regval = readl(host->base + reg);
135 writel(regval, host->base + reg);
138 static void meson_mx_mmc_soft_reset(struct meson_mx_mmc_host *host)
140 writel(MESON_MX_SDIO_IRQC_SOFT_RESET, host->base + MESON_MX_SDIO_IRQC);
158 struct meson_mx_mmc_host *host = mmc_priv(mmc);
163 host->cmd = cmd;
216 spin_lock_irqsave(&host->irq_lock, irqflags);
218 mult = readl(host->base + MESON_MX_SDIO_MULT);
220 mult |= FIELD_PREP(MESON_MX_SDIO_MULT_PORT_SEL_MASK, host->slot_id);
222 writel(mult, host->base + MESON_MX_SDIO_MULT);
234 writel(cmd->arg, host->base + MESON_MX_SDIO_ARGU);
235 writel(ext, host->base + MESON_MX_SDIO_EXT);
236 writel(send, host->base + MESON_MX_SDIO_SEND);
238 spin_unlock_irqrestore(&host->irq_lock, irqflags);
240 mod_timer(&host->cmd_timeout, jiffies + timeout);
243 static void meson_mx_mmc_request_done(struct meson_mx_mmc_host *host)
247 mrq = host->mrq;
249 if (host->cmd->error)
250 meson_mx_mmc_soft_reset(host);
252 host->mrq = NULL;
253 host->cmd = NULL;
255 mmc_request_done(host->mmc, mrq);
260 struct meson_mx_mmc_host *host = mmc_priv(mmc);
280 host->error = -EINVAL;
284 host->error = clk_set_rate(host->cfg_div_clk, ios->clock);
285 if (host->error) {
288 clk_rate, host->error);
292 mmc->actual_clock = clk_get_rate(host->cfg_div_clk);
300 host->error = mmc_regulator_set_ocr(mmc,
303 if (host->error)
339 struct meson_mx_mmc_host *host = mmc_priv(mmc);
342 if (!host->error)
343 host->error = meson_mx_mmc_map_dma(mmc, mrq);
345 if (host->error) {
346 cmd->error = host->error;
351 host->mrq = mrq;
355 host->base + MESON_MX_SDIO_ADDR);
366 struct meson_mx_mmc_host *host = mmc_priv(mmc);
370 mult = readl(host->base + MESON_MX_SDIO_MULT);
374 writel(mult, host->base + MESON_MX_SDIO_MULT);
378 resp[3 - i] = readl(host->base + MESON_MX_SDIO_ARGU);
384 cmd->resp[0] = readl(host->base + MESON_MX_SDIO_ARGU);
388 static irqreturn_t meson_mx_mmc_process_cmd_irq(struct meson_mx_mmc_host *host,
391 struct mmc_command *cmd = host->cmd;
402 meson_mx_mmc_read_response(host->mmc, cmd);
419 struct meson_mx_mmc_host *host = (void *) data;
424 spin_lock_irqsave(&host->irq_lock, irqflags);
426 irqs = readl(host->base + MESON_MX_SDIO_IRQS);
427 send = readl(host->base + MESON_MX_SDIO_SEND);
430 ret = meson_mx_mmc_process_cmd_irq(host, irqs, send);
435 writel(irqs, host->base + MESON_MX_SDIO_IRQS);
437 spin_unlock_irqrestore(&host->irq_lock, irqflags);
444 struct meson_mx_mmc_host *host = (void *) irq_data;
445 struct mmc_command *cmd = host->cmd, *next_cmd;
450 del_timer_sync(&host->cmd_timeout);
453 dma_unmap_sg(mmc_dev(host->mmc), cmd->data->sg,
462 meson_mx_mmc_start_cmd(host->mmc, next_cmd);
464 meson_mx_mmc_request_done(host);
471 struct meson_mx_mmc_host *host = from_timer(host, t, cmd_timeout);
475 spin_lock_irqsave(&host->irq_lock, irqflags);
478 irqc = readl(host->base + MESON_MX_SDIO_IRQC);
480 writel(irqc, host->base + MESON_MX_SDIO_IRQC);
482 spin_unlock_irqrestore(&host->irq_lock, irqflags);
488 if (!host->cmd)
491 dev_dbg(mmc_dev(host->mmc),
493 host->cmd->opcode, readl(host->base + MESON_MX_SDIO_IRQS),
494 readl(host->base + MESON_MX_SDIO_ARGU));
496 host->cmd->error = -ETIMEDOUT;
498 meson_mx_mmc_request_done(host);
530 static int meson_mx_mmc_add_host(struct meson_mx_mmc_host *host)
532 struct mmc_host *mmc = host->mmc;
536 if (of_property_read_u32(slot_dev->of_node, "reg", &host->slot_id)) {
541 if (host->slot_id >= MESON_MX_SDIO_MAX_SLOTS) {
543 host->slot_id);
563 mmc->f_min = clk_round_rate(host->cfg_div_clk, 1);
564 mmc->f_max = clk_round_rate(host->cfg_div_clk,
565 clk_get_rate(host->parent_clk));
581 static int meson_mx_mmc_register_clks(struct meson_mx_mmc_host *host)
586 clk_fixed_factor_parent = __clk_get_name(host->parent_clk);
587 init.name = devm_kasprintf(host->controller_dev, GFP_KERNEL,
589 dev_name(host->controller_dev));
597 host->fixed_factor.div = 2;
598 host->fixed_factor.mult = 1;
599 host->fixed_factor.hw.init = &init;
601 host->fixed_factor_clk = devm_clk_register(host->controller_dev,
602 &host->fixed_factor.hw);
603 if (WARN_ON(IS_ERR(host->fixed_factor_clk)))
604 return PTR_ERR(host->fixed_factor_clk);
606 clk_div_parent = __clk_get_name(host->fixed_factor_clk);
607 init.name = devm_kasprintf(host->controller_dev, GFP_KERNEL,
608 "%s#div", dev_name(host->controller_dev));
616 host->cfg_div.reg = host->base + MESON_MX_SDIO_CONF;
617 host->cfg_div.shift = MESON_MX_SDIO_CONF_CMD_CLK_DIV_SHIFT;
618 host->cfg_div.width = MESON_MX_SDIO_CONF_CMD_CLK_DIV_WIDTH;
619 host->cfg_div.hw.init = &init;
620 host->cfg_div.flags = CLK_DIVIDER_ALLOW_ZERO;
622 host->cfg_div_clk = devm_clk_register(host->controller_dev,
623 &host->cfg_div.hw);
624 if (WARN_ON(IS_ERR(host->cfg_div_clk)))
625 return PTR_ERR(host->cfg_div_clk);
634 struct meson_mx_mmc_host *host;
644 mmc = mmc_alloc_host(sizeof(*host), &slot_pdev->dev);
650 host = mmc_priv(mmc);
651 host->mmc = mmc;
652 host->controller_dev = &pdev->dev;
654 spin_lock_init(&host->irq_lock);
655 timer_setup(&host->cmd_timeout, meson_mx_mmc_timeout, 0);
657 platform_set_drvdata(pdev, host);
659 host->base = devm_platform_ioremap_resource(pdev, 0);
660 if (IS_ERR(host->base)) {
661 ret = PTR_ERR(host->base);
671 ret = devm_request_threaded_irq(host->controller_dev, irq,
674 NULL, host);
678 host->core_clk = devm_clk_get(host->controller_dev, "core");
679 if (IS_ERR(host->core_clk)) {
680 ret = PTR_ERR(host->core_clk);
684 host->parent_clk = devm_clk_get(host->controller_dev, "clkin");
685 if (IS_ERR(host->parent_clk)) {
686 ret = PTR_ERR(host->parent_clk);
690 ret = meson_mx_mmc_register_clks(host);
694 ret = clk_prepare_enable(host->core_clk);
696 dev_err(host->controller_dev, "Failed to enable core clock\n");
700 ret = clk_prepare_enable(host->cfg_div_clk);
702 dev_err(host->controller_dev, "Failed to enable MMC clock\n");
711 writel(conf, host->base + MESON_MX_SDIO_CONF);
713 meson_mx_mmc_soft_reset(host);
715 ret = meson_mx_mmc_add_host(host);
722 clk_disable_unprepare(host->cfg_div_clk);
724 clk_disable_unprepare(host->core_clk);
734 struct meson_mx_mmc_host *host = platform_get_drvdata(pdev);
735 struct device *slot_dev = mmc_dev(host->mmc);
737 del_timer_sync(&host->cmd_timeout);
739 mmc_remove_host(host->mmc);
743 clk_disable_unprepare(host->cfg_div_clk);
744 clk_disable_unprepare(host->core_clk);
746 mmc_free_host(host->mmc);