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;
423 spin_lock(&host->irq_lock);
425 irqs = readl(host->base + MESON_MX_SDIO_IRQS);
426 send = readl(host->base + MESON_MX_SDIO_SEND);
429 ret = meson_mx_mmc_process_cmd_irq(host, irqs, send);
434 writel(irqs, host->base + MESON_MX_SDIO_IRQS);
436 spin_unlock(&host->irq_lock);
443 struct meson_mx_mmc_host *host = (void *) irq_data;
444 struct mmc_command *cmd = host->cmd, *next_cmd;
449 del_timer_sync(&host->cmd_timeout);
452 dma_unmap_sg(mmc_dev(host->mmc), cmd->data->sg,
461 meson_mx_mmc_start_cmd(host->mmc, next_cmd);
463 meson_mx_mmc_request_done(host);
470 struct meson_mx_mmc_host *host = from_timer(host, t, cmd_timeout);
474 spin_lock_irqsave(&host->irq_lock, irqflags);
477 irqc = readl(host->base + MESON_MX_SDIO_IRQC);
479 writel(irqc, host->base + MESON_MX_SDIO_IRQC);
481 spin_unlock_irqrestore(&host->irq_lock, irqflags);
487 if (!host->cmd)
490 dev_dbg(mmc_dev(host->mmc),
492 host->cmd->opcode, readl(host->base + MESON_MX_SDIO_IRQS),
493 readl(host->base + MESON_MX_SDIO_ARGU));
495 host->cmd->error = -ETIMEDOUT;
497 meson_mx_mmc_request_done(host);
529 static int meson_mx_mmc_add_host(struct meson_mx_mmc_host *host)
531 struct mmc_host *mmc = host->mmc;
535 if (of_property_read_u32(slot_dev->of_node, "reg", &host->slot_id)) {
540 if (host->slot_id >= MESON_MX_SDIO_MAX_SLOTS) {
542 host->slot_id);
562 mmc->f_min = clk_round_rate(host->cfg_div_clk, 1);
563 mmc->f_max = clk_round_rate(host->cfg_div_clk,
564 clk_get_rate(host->parent_clk));
580 static int meson_mx_mmc_register_clks(struct meson_mx_mmc_host *host)
585 clk_fixed_factor_parent = __clk_get_name(host->parent_clk);
586 init.name = devm_kasprintf(host->controller_dev, GFP_KERNEL,
588 dev_name(host->controller_dev));
596 host->fixed_factor.div = 2;
597 host->fixed_factor.mult = 1;
598 host->fixed_factor.hw.init = &init;
600 host->fixed_factor_clk = devm_clk_register(host->controller_dev,
601 &host->fixed_factor.hw);
602 if (WARN_ON(IS_ERR(host->fixed_factor_clk)))
603 return PTR_ERR(host->fixed_factor_clk);
605 clk_div_parent = __clk_get_name(host->fixed_factor_clk);
606 init.name = devm_kasprintf(host->controller_dev, GFP_KERNEL,
607 "%s#div", dev_name(host->controller_dev));
615 host->cfg_div.reg = host->base + MESON_MX_SDIO_CONF;
616 host->cfg_div.shift = MESON_MX_SDIO_CONF_CMD_CLK_DIV_SHIFT;
617 host->cfg_div.width = MESON_MX_SDIO_CONF_CMD_CLK_DIV_WIDTH;
618 host->cfg_div.hw.init = &init;
619 host->cfg_div.flags = CLK_DIVIDER_ALLOW_ZERO;
621 host->cfg_div_clk = devm_clk_register(host->controller_dev,
622 &host->cfg_div.hw);
623 if (WARN_ON(IS_ERR(host->cfg_div_clk)))
624 return PTR_ERR(host->cfg_div_clk);
633 struct meson_mx_mmc_host *host;
643 mmc = mmc_alloc_host(sizeof(*host), &slot_pdev->dev);
649 host = mmc_priv(mmc);
650 host->mmc = mmc;
651 host->controller_dev = &pdev->dev;
653 spin_lock_init(&host->irq_lock);
654 timer_setup(&host->cmd_timeout, meson_mx_mmc_timeout, 0);
656 platform_set_drvdata(pdev, host);
658 host->base = devm_platform_ioremap_resource(pdev, 0);
659 if (IS_ERR(host->base)) {
660 ret = PTR_ERR(host->base);
670 ret = devm_request_threaded_irq(host->controller_dev, irq,
673 NULL, host);
677 host->core_clk = devm_clk_get(host->controller_dev, "core");
678 if (IS_ERR(host->core_clk)) {
679 ret = PTR_ERR(host->core_clk);
683 host->parent_clk = devm_clk_get(host->controller_dev, "clkin");
684 if (IS_ERR(host->parent_clk)) {
685 ret = PTR_ERR(host->parent_clk);
689 ret = meson_mx_mmc_register_clks(host);
693 ret = clk_prepare_enable(host->core_clk);
695 dev_err(host->controller_dev, "Failed to enable core clock\n");
699 ret = clk_prepare_enable(host->cfg_div_clk);
701 dev_err(host->controller_dev, "Failed to enable MMC clock\n");
710 writel(conf, host->base + MESON_MX_SDIO_CONF);
712 meson_mx_mmc_soft_reset(host);
714 ret = meson_mx_mmc_add_host(host);
721 clk_disable_unprepare(host->cfg_div_clk);
723 clk_disable_unprepare(host->core_clk);
733 struct meson_mx_mmc_host *host = platform_get_drvdata(pdev);
734 struct device *slot_dev = mmc_dev(host->mmc);
736 del_timer_sync(&host->cmd_timeout);
738 mmc_remove_host(host->mmc);
742 clk_disable_unprepare(host->cfg_div_clk);
743 clk_disable_unprepare(host->core_clk);
745 mmc_free_host(host->mmc);