Lines Matching refs:host

79 static inline u8 dw_mci_exynos_get_ciu_div(struct dw_mci *host)  in dw_mci_exynos_get_ciu_div()  argument
81 struct dw_mci_exynos_priv_data *priv = host->priv; in dw_mci_exynos_get_ciu_div()
89 return SDMMC_CLKSEL_GET_DIV(mci_readl(host, CLKSEL64)) + 1; in dw_mci_exynos_get_ciu_div()
91 return SDMMC_CLKSEL_GET_DIV(mci_readl(host, CLKSEL)) + 1; in dw_mci_exynos_get_ciu_div()
94 static int dw_mci_exynos_priv_init(struct dw_mci *host) in dw_mci_exynos_priv_init() argument
96 struct dw_mci_exynos_priv_data *priv = host->priv; in dw_mci_exynos_priv_init()
100 mci_writel(host, MPSBEGIN0, 0); in dw_mci_exynos_priv_init()
101 mci_writel(host, MPSEND0, SDMMC_ENDING_SEC_NR_MAX); in dw_mci_exynos_priv_init()
102 mci_writel(host, MPSCTRL0, SDMMC_MPSCTRL_SECURE_WRITE_BIT | in dw_mci_exynos_priv_init()
109 priv->saved_strobe_ctrl = mci_readl(host, HS400_DLINE_CTRL); in dw_mci_exynos_priv_init()
110 priv->saved_dqs_en = mci_readl(host, HS400_DQS_EN); in dw_mci_exynos_priv_init()
112 mci_writel(host, HS400_DQS_EN, priv->saved_dqs_en); in dw_mci_exynos_priv_init()
121 static int dw_mci_exynos_setup_clock(struct dw_mci *host) in dw_mci_exynos_setup_clock() argument
123 struct dw_mci_exynos_priv_data *priv = host->priv; in dw_mci_exynos_setup_clock()
125 host->bus_hz /= (priv->ciu_div + 1); in dw_mci_exynos_setup_clock()
130 static void dw_mci_exynos_set_clksel_timing(struct dw_mci *host, u32 timing) in dw_mci_exynos_set_clksel_timing() argument
132 struct dw_mci_exynos_priv_data *priv = host->priv; in dw_mci_exynos_set_clksel_timing()
137 clksel = mci_readl(host, CLKSEL64); in dw_mci_exynos_set_clksel_timing()
139 clksel = mci_readl(host, CLKSEL); in dw_mci_exynos_set_clksel_timing()
145 mci_writel(host, CLKSEL64, clksel); in dw_mci_exynos_set_clksel_timing()
147 mci_writel(host, CLKSEL, clksel); in dw_mci_exynos_set_clksel_timing()
153 struct dw_mci *host = dev_get_drvdata(dev); in dw_mci_exynos_suspend() local
155 return dw_mci_suspend(host); in dw_mci_exynos_suspend()
160 struct dw_mci *host = dev_get_drvdata(dev); in dw_mci_exynos_resume() local
162 dw_mci_exynos_priv_init(host); in dw_mci_exynos_resume()
163 return dw_mci_resume(host); in dw_mci_exynos_resume()
179 struct dw_mci *host = dev_get_drvdata(dev); in dw_mci_exynos_resume_noirq() local
180 struct dw_mci_exynos_priv_data *priv = host->priv; in dw_mci_exynos_resume_noirq()
185 clksel = mci_readl(host, CLKSEL64); in dw_mci_exynos_resume_noirq()
187 clksel = mci_readl(host, CLKSEL); in dw_mci_exynos_resume_noirq()
192 mci_writel(host, CLKSEL64, clksel); in dw_mci_exynos_resume_noirq()
194 mci_writel(host, CLKSEL, clksel); in dw_mci_exynos_resume_noirq()
205 static void dw_mci_exynos_prepare_command(struct dw_mci *host, u32 *cmdr) in dw_mci_exynos_prepare_command() argument
207 struct dw_mci_exynos_priv_data *priv = host->priv; in dw_mci_exynos_prepare_command()
217 if (SDMMC_CLKSEL_GET_DRV_WD3(mci_readl(host, CLKSEL64))) in dw_mci_exynos_prepare_command()
220 if (SDMMC_CLKSEL_GET_DRV_WD3(mci_readl(host, CLKSEL))) in dw_mci_exynos_prepare_command()
225 static void dw_mci_exynos_config_hs400(struct dw_mci *host, u32 timing) in dw_mci_exynos_config_hs400() argument
227 struct dw_mci_exynos_priv_data *priv = host->priv; in dw_mci_exynos_config_hs400()
247 mci_writel(host, HS400_DQS_EN, dqs); in dw_mci_exynos_config_hs400()
248 mci_writel(host, HS400_DLINE_CTRL, strobe); in dw_mci_exynos_config_hs400()
251 static void dw_mci_exynos_adjust_clock(struct dw_mci *host, unsigned int wanted) in dw_mci_exynos_adjust_clock() argument
253 struct dw_mci_exynos_priv_data *priv = host->priv; in dw_mci_exynos_adjust_clock()
261 if (!wanted || IS_ERR(host->ciu_clk)) in dw_mci_exynos_adjust_clock()
271 div = dw_mci_exynos_get_ciu_div(host); in dw_mci_exynos_adjust_clock()
272 ret = clk_set_rate(host->ciu_clk, wanted * div); in dw_mci_exynos_adjust_clock()
274 dev_warn(host->dev, in dw_mci_exynos_adjust_clock()
277 actual = clk_get_rate(host->ciu_clk); in dw_mci_exynos_adjust_clock()
278 host->bus_hz = actual / div; in dw_mci_exynos_adjust_clock()
280 host->current_speed = 0; in dw_mci_exynos_adjust_clock()
283 static void dw_mci_exynos_set_ios(struct dw_mci *host, struct mmc_ios *ios) in dw_mci_exynos_set_ios() argument
285 struct dw_mci_exynos_priv_data *priv = host->priv; in dw_mci_exynos_set_ios()
307 dw_mci_exynos_set_clksel_timing(host, clksel); in dw_mci_exynos_set_ios()
310 dw_mci_exynos_config_hs400(host, timing); in dw_mci_exynos_set_ios()
313 dw_mci_exynos_adjust_clock(host, wanted); in dw_mci_exynos_set_ios()
316 static int dw_mci_exynos_parse_dt(struct dw_mci *host) in dw_mci_exynos_parse_dt() argument
319 struct device_node *np = host->dev->of_node; in dw_mci_exynos_parse_dt()
325 priv = devm_kzalloc(host->dev, sizeof(*priv), GFP_KERNEL); in dw_mci_exynos_parse_dt()
361 dev_dbg(host->dev, in dw_mci_exynos_parse_dt()
366 host->priv = priv; in dw_mci_exynos_parse_dt()
370 static inline u8 dw_mci_exynos_get_clksmpl(struct dw_mci *host) in dw_mci_exynos_get_clksmpl() argument
372 struct dw_mci_exynos_priv_data *priv = host->priv; in dw_mci_exynos_get_clksmpl()
376 return SDMMC_CLKSEL_CCLK_SAMPLE(mci_readl(host, CLKSEL64)); in dw_mci_exynos_get_clksmpl()
378 return SDMMC_CLKSEL_CCLK_SAMPLE(mci_readl(host, CLKSEL)); in dw_mci_exynos_get_clksmpl()
381 static inline void dw_mci_exynos_set_clksmpl(struct dw_mci *host, u8 sample) in dw_mci_exynos_set_clksmpl() argument
384 struct dw_mci_exynos_priv_data *priv = host->priv; in dw_mci_exynos_set_clksmpl()
388 clksel = mci_readl(host, CLKSEL64); in dw_mci_exynos_set_clksmpl()
390 clksel = mci_readl(host, CLKSEL); in dw_mci_exynos_set_clksmpl()
394 mci_writel(host, CLKSEL64, clksel); in dw_mci_exynos_set_clksmpl()
396 mci_writel(host, CLKSEL, clksel); in dw_mci_exynos_set_clksmpl()
399 static inline u8 dw_mci_exynos_move_next_clksmpl(struct dw_mci *host) in dw_mci_exynos_move_next_clksmpl() argument
401 struct dw_mci_exynos_priv_data *priv = host->priv; in dw_mci_exynos_move_next_clksmpl()
407 clksel = mci_readl(host, CLKSEL64); in dw_mci_exynos_move_next_clksmpl()
409 clksel = mci_readl(host, CLKSEL); in dw_mci_exynos_move_next_clksmpl()
416 mci_writel(host, CLKSEL64, clksel); in dw_mci_exynos_move_next_clksmpl()
418 mci_writel(host, CLKSEL, clksel); in dw_mci_exynos_move_next_clksmpl()
451 struct dw_mci *host = slot->host; in dw_mci_exynos_execute_tuning() local
452 struct dw_mci_exynos_priv_data *priv = host->priv; in dw_mci_exynos_execute_tuning()
458 start_smpl = dw_mci_exynos_get_clksmpl(host); in dw_mci_exynos_execute_tuning()
461 mci_writel(host, TMOUT, ~0); in dw_mci_exynos_execute_tuning()
462 smpl = dw_mci_exynos_move_next_clksmpl(host); in dw_mci_exynos_execute_tuning()
471 dw_mci_exynos_set_clksmpl(host, found); in dw_mci_exynos_execute_tuning()
480 static int dw_mci_exynos_prepare_hs400_tuning(struct dw_mci *host, in dw_mci_exynos_prepare_hs400_tuning() argument
483 struct dw_mci_exynos_priv_data *priv = host->priv; in dw_mci_exynos_prepare_hs400_tuning()
485 dw_mci_exynos_set_clksel_timing(host, priv->hs400_timing); in dw_mci_exynos_prepare_hs400_tuning()
486 dw_mci_exynos_adjust_clock(host, (ios->clock) << 1); in dw_mci_exynos_prepare_hs400_tuning()