Lines Matching refs:mc

76 static int tegra_mc_setup_latency_allowance(struct tegra_mc *mc)  in tegra_mc_setup_latency_allowance()  argument
83 tick = mc->tick * clk_get_rate(mc->clk); in tegra_mc_setup_latency_allowance()
86 value = readl(mc->regs + MC_EMEM_ARB_CFG); in tegra_mc_setup_latency_allowance()
89 writel(value, mc->regs + MC_EMEM_ARB_CFG); in tegra_mc_setup_latency_allowance()
92 for (i = 0; i < mc->soc->num_clients; i++) { in tegra_mc_setup_latency_allowance()
93 const struct tegra_mc_la *la = &mc->soc->clients[i].la; in tegra_mc_setup_latency_allowance()
96 value = readl(mc->regs + la->reg); in tegra_mc_setup_latency_allowance()
99 writel(value, mc->regs + la->reg); in tegra_mc_setup_latency_allowance()
105 void tegra_mc_write_emem_configuration(struct tegra_mc *mc, unsigned long rate) in tegra_mc_write_emem_configuration() argument
110 for (i = 0; i < mc->num_timings; i++) { in tegra_mc_write_emem_configuration()
111 if (mc->timings[i].rate == rate) { in tegra_mc_write_emem_configuration()
112 timing = &mc->timings[i]; in tegra_mc_write_emem_configuration()
118 dev_err(mc->dev, "no memory timing registered for rate %lu\n", in tegra_mc_write_emem_configuration()
123 for (i = 0; i < mc->soc->num_emem_regs; ++i) in tegra_mc_write_emem_configuration()
124 mc_writel(mc, timing->emem_data[i], mc->soc->emem_regs[i]); in tegra_mc_write_emem_configuration()
127 unsigned int tegra_mc_get_emem_device_count(struct tegra_mc *mc) in tegra_mc_get_emem_device_count() argument
131 dram_count = mc_readl(mc, MC_EMEM_ADR_CFG); in tegra_mc_get_emem_device_count()
138 static int load_one_timing(struct tegra_mc *mc, in load_one_timing() argument
147 dev_err(mc->dev, in load_one_timing()
153 timing->emem_data = devm_kcalloc(mc->dev, mc->soc->num_emem_regs, in load_one_timing()
160 mc->soc->num_emem_regs); in load_one_timing()
162 dev_err(mc->dev, in load_one_timing()
171 static int load_timings(struct tegra_mc *mc, struct device_node *node) in load_timings() argument
178 mc->timings = devm_kcalloc(mc->dev, child_count, sizeof(*timing), in load_timings()
180 if (!mc->timings) in load_timings()
183 mc->num_timings = child_count; in load_timings()
186 timing = &mc->timings[i++]; in load_timings()
188 err = load_one_timing(mc, timing, child); in load_timings()
196 static int tegra_mc_setup_timings(struct tegra_mc *mc) in tegra_mc_setup_timings() argument
204 mc->num_timings = 0; in tegra_mc_setup_timings()
206 for_each_child_of_node(mc->dev->of_node, node) { in tegra_mc_setup_timings()
214 err = load_timings(mc, node); in tegra_mc_setup_timings()
221 if (mc->num_timings == 0) in tegra_mc_setup_timings()
222 dev_warn(mc->dev, in tegra_mc_setup_timings()
250 struct tegra_mc *mc = data; in tegra_mc_irq() local
255 status = mc_readl(mc, MC_INTSTATUS); in tegra_mc_irq()
256 mask = mc_readl(mc, MC_INTMASK); in tegra_mc_irq()
268 value = mc_readl(mc, MC_ERR_STATUS); in tegra_mc_irq()
271 if (mc->soc->num_address_bits > 32) { in tegra_mc_irq()
288 id = value & mc->soc->client_id_mask; in tegra_mc_irq()
290 for (i = 0; i < mc->soc->num_clients; i++) { in tegra_mc_irq()
291 if (mc->soc->clients[i].id == id) { in tegra_mc_irq()
292 client = mc->soc->clients[i].name; in tegra_mc_irq()
330 value = mc_readl(mc, MC_ERR_ADR); in tegra_mc_irq()
333 dev_err_ratelimited(mc->dev, "%s: %s%s @%pa: %s (%s%s)\n", in tegra_mc_irq()
339 mc_writel(mc, status, MC_INTSTATUS); in tegra_mc_irq()
348 struct tegra_mc *mc; in tegra_mc_probe() local
356 mc = devm_kzalloc(&pdev->dev, sizeof(*mc), GFP_KERNEL); in tegra_mc_probe()
357 if (!mc) in tegra_mc_probe()
360 platform_set_drvdata(pdev, mc); in tegra_mc_probe()
361 mc->soc = match->data; in tegra_mc_probe()
362 mc->dev = &pdev->dev; in tegra_mc_probe()
365 mc->tick = 30; in tegra_mc_probe()
368 mc->regs = devm_ioremap_resource(&pdev->dev, res); in tegra_mc_probe()
369 if (IS_ERR(mc->regs)) in tegra_mc_probe()
370 return PTR_ERR(mc->regs); in tegra_mc_probe()
372 mc->clk = devm_clk_get(&pdev->dev, "mc"); in tegra_mc_probe()
373 if (IS_ERR(mc->clk)) { in tegra_mc_probe()
375 PTR_ERR(mc->clk)); in tegra_mc_probe()
376 return PTR_ERR(mc->clk); in tegra_mc_probe()
379 err = tegra_mc_setup_latency_allowance(mc); in tegra_mc_probe()
386 err = tegra_mc_setup_timings(mc); in tegra_mc_probe()
393 mc->smmu = tegra_smmu_probe(&pdev->dev, mc->soc->smmu, mc); in tegra_mc_probe()
394 if (IS_ERR(mc->smmu)) { in tegra_mc_probe()
396 PTR_ERR(mc->smmu)); in tegra_mc_probe()
397 return PTR_ERR(mc->smmu); in tegra_mc_probe()
401 mc->irq = platform_get_irq(pdev, 0); in tegra_mc_probe()
402 if (mc->irq < 0) { in tegra_mc_probe()
404 return mc->irq; in tegra_mc_probe()
407 err = devm_request_irq(&pdev->dev, mc->irq, tegra_mc_irq, IRQF_SHARED, in tegra_mc_probe()
408 dev_name(&pdev->dev), mc); in tegra_mc_probe()
410 dev_err(&pdev->dev, "failed to request IRQ#%u: %d\n", mc->irq, in tegra_mc_probe()
415 WARN(!mc->soc->client_id_mask, "Missing client ID mask for this SoC\n"); in tegra_mc_probe()
421 mc_writel(mc, value, MC_INTMASK); in tegra_mc_probe()