Lines Matching +full:emc +full:- +full:mode +full:- +full:1

1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2019 GRATE-DRIVER project
28 #define EMC_GATHER_CLEAR (1 << 8)
41 struct devfreq *devfreq = tegra->devfreq; in tegra_devfreq_target()
53 err = clk_set_min_rate(tegra->emc_clock, rate); in tegra_devfreq_target()
57 err = clk_set_rate(tegra->emc_clock, 0); in tegra_devfreq_target()
64 clk_set_min_rate(tegra->emc_clock, devfreq->previous_freq); in tegra_devfreq_target()
76 * than the number of clocks. Conversion ratio of 1/8 results in a in tegra_devfreq_get_dev_status()
84 stat->busy_time = readl_relaxed(tegra->regs + MC_STAT_EMC_COUNT); in tegra_devfreq_get_dev_status()
85 stat->total_time = readl_relaxed(tegra->regs + MC_STAT_EMC_CLOCKS) / 8; in tegra_devfreq_get_dev_status()
86 stat->current_frequency = clk_get_rate(tegra->emc_clock); in tegra_devfreq_get_dev_status()
88 writel_relaxed(EMC_GATHER_CLEAR, tegra->regs + MC_STAT_CONTROL); in tegra_devfreq_get_dev_status()
89 writel_relaxed(EMC_GATHER_ENABLE, tegra->regs + MC_STAT_CONTROL); in tegra_devfreq_get_dev_status()
106 np = of_find_compatible_node(NULL, NULL, "nvidia,tegra20-mc-gart"); in tegra_get_memory_controller()
108 return ERR_PTR(-ENOENT); in tegra_get_memory_controller()
113 return ERR_PTR(-ENODEV); in tegra_get_memory_controller()
117 return ERR_PTR(-EPROBE_DEFER); in tegra_get_memory_controller()
133 dev_err(&pdev->dev, "failed to get memory controller: %d\n", in tegra_devfreq_probe()
138 tegra = devm_kzalloc(&pdev->dev, sizeof(*tegra), GFP_KERNEL); in tegra_devfreq_probe()
140 return -ENOMEM; in tegra_devfreq_probe()
142 /* EMC is a system-critical clock that is always enabled */ in tegra_devfreq_probe()
143 tegra->emc_clock = devm_clk_get(&pdev->dev, "emc"); in tegra_devfreq_probe()
144 if (IS_ERR(tegra->emc_clock)) { in tegra_devfreq_probe()
145 err = PTR_ERR(tegra->emc_clock); in tegra_devfreq_probe()
146 dev_err(&pdev->dev, "failed to get emc clock: %d\n", err); in tegra_devfreq_probe()
150 tegra->regs = mc->regs; in tegra_devfreq_probe()
152 max_rate = clk_round_rate(tegra->emc_clock, ULONG_MAX); in tegra_devfreq_probe()
155 rate = clk_round_rate(tegra->emc_clock, rate); in tegra_devfreq_probe()
157 err = dev_pm_opp_add(&pdev->dev, rate, 0); in tegra_devfreq_probe()
159 dev_err(&pdev->dev, "failed to add opp: %d\n", err); in tegra_devfreq_probe()
166 * statistics collection mode and set clocks counter saturation in tegra_devfreq_probe()
169 writel_relaxed(0x00000000, tegra->regs + MC_STAT_CONTROL); in tegra_devfreq_probe()
170 writel_relaxed(0x00000000, tegra->regs + MC_STAT_EMC_CONTROL); in tegra_devfreq_probe()
171 writel_relaxed(0xffffffff, tegra->regs + MC_STAT_EMC_CLOCK_LIMIT); in tegra_devfreq_probe()
175 tegra->devfreq = devfreq_add_device(&pdev->dev, &tegra_devfreq_profile, in tegra_devfreq_probe()
177 if (IS_ERR(tegra->devfreq)) { in tegra_devfreq_probe()
178 err = PTR_ERR(tegra->devfreq); in tegra_devfreq_probe()
185 dev_pm_opp_remove_all_dynamic(&pdev->dev); in tegra_devfreq_probe()
194 devfreq_remove_device(tegra->devfreq); in tegra_devfreq_remove()
195 dev_pm_opp_remove_all_dynamic(&pdev->dev); in tegra_devfreq_remove()
204 .name = "tegra20-devfreq",
209 MODULE_ALIAS("platform:tegra20-devfreq");