Lines Matching refs:emc
152 struct tegra_emc *emc = data; in tegra_emc_isr() local
156 status = readl_relaxed(emc->regs + EMC_INTSTATUS) & intmask; in tegra_emc_isr()
162 complete(&emc->clk_handshake_complete); in tegra_emc_isr()
166 dev_err_ratelimited(emc->dev, in tegra_emc_isr()
170 writel_relaxed(status, emc->regs + EMC_INTSTATUS); in tegra_emc_isr()
175 static struct emc_timing *tegra_emc_find_timing(struct tegra_emc *emc, in tegra_emc_find_timing() argument
181 for (i = 0; i < emc->num_timings; i++) { in tegra_emc_find_timing()
182 if (emc->timings[i].rate >= rate) { in tegra_emc_find_timing()
183 timing = &emc->timings[i]; in tegra_emc_find_timing()
189 dev_err(emc->dev, "no timing for rate %lu\n", rate); in tegra_emc_find_timing()
196 static int emc_prepare_timing_change(struct tegra_emc *emc, unsigned long rate) in emc_prepare_timing_change() argument
198 struct emc_timing *timing = tegra_emc_find_timing(emc, rate); in emc_prepare_timing_change()
204 dev_dbg(emc->dev, "%s: using timing rate %lu for requested rate %lu\n", in emc_prepare_timing_change()
210 emc->regs + emc_timing_registers[i]); in emc_prepare_timing_change()
213 readl_relaxed(emc->regs + emc_timing_registers[i - 1]); in emc_prepare_timing_change()
215 reinit_completion(&emc->clk_handshake_complete); in emc_prepare_timing_change()
220 static int emc_complete_timing_change(struct tegra_emc *emc, bool flush) in emc_complete_timing_change() argument
224 dev_dbg(emc->dev, "%s: flush %d\n", __func__, flush); in emc_complete_timing_change()
229 emc->regs + EMC_TIMING_CONTROL); in emc_complete_timing_change()
233 timeout = wait_for_completion_timeout(&emc->clk_handshake_complete, in emc_complete_timing_change()
236 dev_err(emc->dev, "EMC-CAR handshake failed\n"); in emc_complete_timing_change()
239 dev_err(emc->dev, "failed to wait for EMC-CAR handshake: %ld\n", in emc_complete_timing_change()
250 struct tegra_emc *emc = container_of(nb, struct tegra_emc, clk_nb); in tegra_emc_clk_change_notify() local
256 err = emc_prepare_timing_change(emc, cnd->new_rate); in tegra_emc_clk_change_notify()
260 err = emc_prepare_timing_change(emc, cnd->old_rate); in tegra_emc_clk_change_notify()
264 err = emc_complete_timing_change(emc, true); in tegra_emc_clk_change_notify()
268 err = emc_complete_timing_change(emc, false); in tegra_emc_clk_change_notify()
278 static int load_one_timing_from_dt(struct tegra_emc *emc, in load_one_timing_from_dt() argument
286 dev_err(emc->dev, "incompatible DT node: %pOF\n", node); in load_one_timing_from_dt()
292 dev_err(emc->dev, "timing %pOF: failed to read rate: %d\n", in load_one_timing_from_dt()
301 dev_err(emc->dev, in load_one_timing_from_dt()
313 dev_dbg(emc->dev, "%s: %pOF: EMC rate %lu\n", in load_one_timing_from_dt()
333 static int tegra_emc_load_timings_from_dt(struct tegra_emc *emc, in tegra_emc_load_timings_from_dt() argument
343 dev_err(emc->dev, "no memory timings in DT node: %pOF\n", node); in tegra_emc_load_timings_from_dt()
347 emc->timings = devm_kcalloc(emc->dev, child_count, sizeof(*timing), in tegra_emc_load_timings_from_dt()
349 if (!emc->timings) in tegra_emc_load_timings_from_dt()
352 emc->num_timings = child_count; in tegra_emc_load_timings_from_dt()
353 timing = emc->timings; in tegra_emc_load_timings_from_dt()
356 err = load_one_timing_from_dt(emc, timing++, child); in tegra_emc_load_timings_from_dt()
363 sort(emc->timings, emc->num_timings, sizeof(*timing), cmp_timings, in tegra_emc_load_timings_from_dt()
398 static int emc_setup_hw(struct tegra_emc *emc) in emc_setup_hw() argument
403 emc_cfg = readl_relaxed(emc->regs + EMC_CFG_2); in emc_setup_hw()
411 dev_err(emc->dev, in emc_setup_hw()
418 writel_relaxed(emc_cfg, emc->regs + EMC_CFG_2); in emc_setup_hw()
421 writel_relaxed(intmask, emc->regs + EMC_INTMASK); in emc_setup_hw()
422 writel_relaxed(intmask, emc->regs + EMC_INTSTATUS); in emc_setup_hw()
427 static int emc_init(struct tegra_emc *emc, unsigned long rate) in emc_init() argument
431 err = clk_set_parent(emc->emc_mux, emc->backup_clk); in emc_init()
433 dev_err(emc->dev, in emc_init()
438 err = clk_set_rate(emc->pll_m, rate); in emc_init()
440 dev_err(emc->dev, in emc_init()
445 err = clk_set_parent(emc->emc_mux, emc->pll_m); in emc_init()
447 dev_err(emc->dev, in emc_init()
452 err = clk_set_rate(emc->clk, rate); in emc_init()
454 dev_err(emc->dev, in emc_init()
465 struct tegra_emc *emc; in tegra_emc_probe() local
487 emc = devm_kzalloc(&pdev->dev, sizeof(*emc), GFP_KERNEL); in tegra_emc_probe()
488 if (!emc) { in tegra_emc_probe()
493 init_completion(&emc->clk_handshake_complete); in tegra_emc_probe()
494 emc->clk_nb.notifier_call = tegra_emc_clk_change_notify; in tegra_emc_probe()
495 emc->dev = &pdev->dev; in tegra_emc_probe()
497 err = tegra_emc_load_timings_from_dt(emc, np); in tegra_emc_probe()
503 emc->regs = devm_ioremap_resource(&pdev->dev, res); in tegra_emc_probe()
504 if (IS_ERR(emc->regs)) in tegra_emc_probe()
505 return PTR_ERR(emc->regs); in tegra_emc_probe()
507 err = emc_setup_hw(emc); in tegra_emc_probe()
512 dev_name(&pdev->dev), emc); in tegra_emc_probe()
518 emc->clk = devm_clk_get(&pdev->dev, "emc"); in tegra_emc_probe()
519 if (IS_ERR(emc->clk)) { in tegra_emc_probe()
520 err = PTR_ERR(emc->clk); in tegra_emc_probe()
525 emc->pll_m = clk_get_sys(NULL, "pll_m"); in tegra_emc_probe()
526 if (IS_ERR(emc->pll_m)) { in tegra_emc_probe()
527 err = PTR_ERR(emc->pll_m); in tegra_emc_probe()
532 emc->backup_clk = clk_get_sys(NULL, "pll_p"); in tegra_emc_probe()
533 if (IS_ERR(emc->backup_clk)) { in tegra_emc_probe()
534 err = PTR_ERR(emc->backup_clk); in tegra_emc_probe()
539 emc->emc_mux = clk_get_parent(emc->clk); in tegra_emc_probe()
540 if (IS_ERR(emc->emc_mux)) { in tegra_emc_probe()
541 err = PTR_ERR(emc->emc_mux); in tegra_emc_probe()
546 err = clk_notifier_register(emc->clk, &emc->clk_nb); in tegra_emc_probe()
554 err = emc_init(emc, emc->timings[emc->num_timings - 1].rate); in tegra_emc_probe()
564 clk_notifier_unregister(emc->clk, &emc->clk_nb); in tegra_emc_probe()
566 clk_put(emc->backup_clk); in tegra_emc_probe()
568 clk_put(emc->pll_m); in tegra_emc_probe()