18 #include <linux/kernel.h>
19 #include <linux/device.h>
23 #include <linux/module.h>
33 #ifdef CONFIG_TEGRA_EMC_SCALING_ENABLE
34 static bool emc_enable =
true;
36 static bool emc_enable;
41 static void __iomem *emc_regbase;
43 static inline void emc_writel(
u32 val,
unsigned long addr)
45 writel(val, emc_regbase + addr);
48 static inline u32 emc_readl(
unsigned long addr)
50 return readl(emc_regbase + addr);
113 pdata = emc_pdev->
dev.platform_data;
115 pr_debug(
"%s: %lu\n", __func__, rate);
121 rate = rate / 2 / 1000;
124 if (pdata->
tables[i].rate >= rate &&
125 (pdata->
tables[i].rate - rate) < distance) {
136 return pdata->
tables[best].rate * 2 * 1000;
156 pdata = emc_pdev->
dev.platform_data;
162 rate = rate / 2 / 1000;
165 if (pdata->
tables[i].rate == rate)
171 pr_debug(
"%s: setting to %lu\n", __func__, rate);
174 emc_writel(pdata->
tables[i].regs[j], emc_reg_addr[j]);
176 emc_readl(pdata->
tables[i].regs[TEGRA_EMC_NUM_REGS - 1]);
188 if (of_property_read_u32(np,
"nvidia,ram-code", ®))
191 return of_node_get(iter);
209 tnp = tegra_emc_ramcode_devnode(np);
212 "can't find emc table for ram-code 0x%02x\n",
215 tnp = of_node_get(np);
232 sizeof(*pdata->
tables) * num_tables,
239 ret = of_property_read_u32(iter,
"clock-frequency", &prop);
241 dev_err(&pdev->
dev,
"no clock-frequency in %s\n",
252 "malformed emc-registers property in %s\n",
281 BUG_ON(IS_ERR_OR_NULL(c));
290 pdata->
tables[0].regs[i] = emc_readl(emc_reg_addr[i]);
294 khz = pdata->
tables[0].rate;
295 dev_info(&pdev->
dev,
"no tables provided, using %ld kHz emc, "
296 "%ld kHz mem\n", khz * 2, khz);
307 dev_err(&pdev->
dev,
"disabled per module parameter\n");
313 dev_err(&pdev->
dev,
"missing register base\n");
319 dev_err(&pdev->
dev,
"failed to remap registers\n");
323 pdata = pdev->
dev.platform_data;
326 pdata = tegra_emc_dt_parse_pdata(pdev);
329 pdata = tegra_emc_fill_pdata(pdev);
339 { .compatible =
"nvidia,tegra20-emc", },
347 .of_match_table = tegra_emc_of_match,
349 .probe = tegra_emc_probe,
352 static int __init tegra_emc_init(
void)