Lines Matching defs:host
11 #include <linux/mmc/host.h>
79 static inline u8 dw_mci_exynos_get_ciu_div(struct dw_mci *host)
81 struct dw_mci_exynos_priv_data *priv = host->priv;
90 return SDMMC_CLKSEL_GET_DIV(mci_readl(host, CLKSEL64)) + 1;
92 return SDMMC_CLKSEL_GET_DIV(mci_readl(host, CLKSEL)) + 1;
95 static void dw_mci_exynos_config_smu(struct dw_mci *host)
97 struct dw_mci_exynos_priv_data *priv = host->priv;
105 mci_writel(host, MPSBEGIN0, 0);
106 mci_writel(host, MPSEND0, SDMMC_ENDING_SEC_NR_MAX);
107 mci_writel(host, MPSCTRL0, SDMMC_MPSCTRL_SECURE_WRITE_BIT |
114 static int dw_mci_exynos_priv_init(struct dw_mci *host)
116 struct dw_mci_exynos_priv_data *priv = host->priv;
118 dw_mci_exynos_config_smu(host);
121 priv->saved_strobe_ctrl = mci_readl(host, HS400_DLINE_CTRL);
122 priv->saved_dqs_en = mci_readl(host, HS400_DQS_EN);
124 mci_writel(host, HS400_DQS_EN, priv->saved_dqs_en);
132 host->quirks |= DW_MMC_QUIRK_EXTENDED_TMOUT;
135 host->bus_hz /= (priv->ciu_div + 1);
140 static void dw_mci_exynos_set_clksel_timing(struct dw_mci *host, u32 timing)
142 struct dw_mci_exynos_priv_data *priv = host->priv;
148 clksel = mci_readl(host, CLKSEL64);
150 clksel = mci_readl(host, CLKSEL);
157 mci_writel(host, CLKSEL64, clksel);
159 mci_writel(host, CLKSEL, clksel);
168 if (!SDMMC_CLKSEL_GET_DRV_WD3(clksel) && host->slot)
169 set_bit(DW_MMC_CARD_NO_USE_HOLD, &host->slot->flags);
175 struct dw_mci *host = dev_get_drvdata(dev);
182 dw_mci_exynos_config_smu(host);
215 struct dw_mci *host = dev_get_drvdata(dev);
216 struct dw_mci_exynos_priv_data *priv = host->priv;
227 clksel = mci_readl(host, CLKSEL64);
229 clksel = mci_readl(host, CLKSEL);
235 mci_writel(host, CLKSEL64, clksel);
237 mci_writel(host, CLKSEL, clksel);
246 static void dw_mci_exynos_config_hs400(struct dw_mci *host, u32 timing)
248 struct dw_mci_exynos_priv_data *priv = host->priv;
258 dev_warn(host->dev,
275 mci_writel(host, HS400_DQS_EN, dqs);
276 mci_writel(host, HS400_DLINE_CTRL, strobe);
279 static void dw_mci_exynos_adjust_clock(struct dw_mci *host, unsigned int wanted)
281 struct dw_mci_exynos_priv_data *priv = host->priv;
289 if (!wanted || IS_ERR(host->ciu_clk))
299 div = dw_mci_exynos_get_ciu_div(host);
300 ret = clk_set_rate(host->ciu_clk, wanted * div);
302 dev_warn(host->dev,
305 actual = clk_get_rate(host->ciu_clk);
306 host->bus_hz = actual / div;
308 host->current_speed = 0;
311 static void dw_mci_exynos_set_ios(struct dw_mci *host, struct mmc_ios *ios)
313 struct dw_mci_exynos_priv_data *priv = host->priv;
344 dw_mci_exynos_set_clksel_timing(host, clksel);
347 dw_mci_exynos_config_hs400(host, timing);
350 dw_mci_exynos_adjust_clock(host, wanted);
353 static int dw_mci_exynos_parse_dt(struct dw_mci *host)
356 struct device_node *np = host->dev->of_node;
362 priv = devm_kzalloc(host->dev, sizeof(*priv), GFP_KERNEL);
398 dev_dbg(host->dev,
403 host->priv = priv;
407 static inline u8 dw_mci_exynos_get_clksmpl(struct dw_mci *host)
409 struct dw_mci_exynos_priv_data *priv = host->priv;
414 return SDMMC_CLKSEL_CCLK_SAMPLE(mci_readl(host, CLKSEL64));
416 return SDMMC_CLKSEL_CCLK_SAMPLE(mci_readl(host, CLKSEL));
419 static inline void dw_mci_exynos_set_clksmpl(struct dw_mci *host, u8 sample)
422 struct dw_mci_exynos_priv_data *priv = host->priv;
427 clksel = mci_readl(host, CLKSEL64);
429 clksel = mci_readl(host, CLKSEL);
434 mci_writel(host, CLKSEL64, clksel);
436 mci_writel(host, CLKSEL, clksel);
439 static inline u8 dw_mci_exynos_move_next_clksmpl(struct dw_mci *host)
441 struct dw_mci_exynos_priv_data *priv = host->priv;
448 clksel = mci_readl(host, CLKSEL64);
450 clksel = mci_readl(host, CLKSEL);
458 mci_writel(host, CLKSEL64, clksel);
460 mci_writel(host, CLKSEL, clksel);
505 struct dw_mci *host = slot->host;
506 struct dw_mci_exynos_priv_data *priv = host->priv;
512 start_smpl = dw_mci_exynos_get_clksmpl(host);
515 mci_writel(host, TMOUT, ~0);
516 smpl = dw_mci_exynos_move_next_clksmpl(host);
525 dw_mci_exynos_set_clksmpl(host, found);
536 static int dw_mci_exynos_prepare_hs400_tuning(struct dw_mci *host,
539 struct dw_mci_exynos_priv_data *priv = host->priv;
541 dw_mci_exynos_set_clksel_timing(host, priv->hs400_timing);
542 dw_mci_exynos_adjust_clock(host, (ios->clock) << 1);
547 static void dw_mci_exynos_set_data_timeout(struct dw_mci *host,
554 clk_div = (mci_readl(host, CLKDIV) & 0xFF) * 2;
558 tmp = DIV_ROUND_UP_ULL((u64)timeout_ns * host->bus_hz, NSEC_PER_SEC);
580 mci_writel(host, TMOUT, tmout);
581 dev_dbg(host->dev, "timeout_ns: %u => TMOUT[31:8]: %#08x",
585 static u32 dw_mci_exynos_get_drto_clks(struct dw_mci *host)
589 drto_clks = mci_readl(host, TMOUT) >> 8;