Lines Matching refs:mc
54 struct tegra_mc *mc = data; in tegra_mc_devm_action_put_device() local
56 put_device(mc->dev); in tegra_mc_devm_action_put_device()
72 struct tegra_mc *mc; in devm_tegra_memory_controller_get() local
84 mc = platform_get_drvdata(pdev); in devm_tegra_memory_controller_get()
85 if (!mc) { in devm_tegra_memory_controller_get()
90 err = devm_add_action_or_reset(dev, tegra_mc_devm_action_put_device, mc); in devm_tegra_memory_controller_get()
94 return mc; in devm_tegra_memory_controller_get()
98 int tegra_mc_probe_device(struct tegra_mc *mc, struct device *dev) in tegra_mc_probe_device() argument
100 if (mc->soc->ops && mc->soc->ops->probe_device) in tegra_mc_probe_device()
101 return mc->soc->ops->probe_device(mc, dev); in tegra_mc_probe_device()
107 static int tegra_mc_block_dma_common(struct tegra_mc *mc, in tegra_mc_block_dma_common() argument
113 spin_lock_irqsave(&mc->lock, flags); in tegra_mc_block_dma_common()
115 value = mc_readl(mc, rst->control) | BIT(rst->bit); in tegra_mc_block_dma_common()
116 mc_writel(mc, value, rst->control); in tegra_mc_block_dma_common()
118 spin_unlock_irqrestore(&mc->lock, flags); in tegra_mc_block_dma_common()
123 static bool tegra_mc_dma_idling_common(struct tegra_mc *mc, in tegra_mc_dma_idling_common() argument
126 return (mc_readl(mc, rst->status) & BIT(rst->bit)) != 0; in tegra_mc_dma_idling_common()
129 static int tegra_mc_unblock_dma_common(struct tegra_mc *mc, in tegra_mc_unblock_dma_common() argument
135 spin_lock_irqsave(&mc->lock, flags); in tegra_mc_unblock_dma_common()
137 value = mc_readl(mc, rst->control) & ~BIT(rst->bit); in tegra_mc_unblock_dma_common()
138 mc_writel(mc, value, rst->control); in tegra_mc_unblock_dma_common()
140 spin_unlock_irqrestore(&mc->lock, flags); in tegra_mc_unblock_dma_common()
145 static int tegra_mc_reset_status_common(struct tegra_mc *mc, in tegra_mc_reset_status_common() argument
148 return (mc_readl(mc, rst->control) & BIT(rst->bit)) != 0; in tegra_mc_reset_status_common()
163 static const struct tegra_mc_reset *tegra_mc_reset_find(struct tegra_mc *mc, in tegra_mc_reset_find() argument
168 for (i = 0; i < mc->soc->num_resets; i++) in tegra_mc_reset_find()
169 if (mc->soc->resets[i].id == id) in tegra_mc_reset_find()
170 return &mc->soc->resets[i]; in tegra_mc_reset_find()
178 struct tegra_mc *mc = reset_to_mc(rcdev); in tegra_mc_hotreset_assert() local
184 rst = tegra_mc_reset_find(mc, id); in tegra_mc_hotreset_assert()
188 rst_ops = mc->soc->reset_ops; in tegra_mc_hotreset_assert()
195 if (rst_ops->reset_status(mc, rst)) in tegra_mc_hotreset_assert()
201 err = rst_ops->block_dma(mc, rst); in tegra_mc_hotreset_assert()
203 dev_err(mc->dev, "failed to block %s DMA: %d\n", in tegra_mc_hotreset_assert()
211 while (!rst_ops->dma_idling(mc, rst)) { in tegra_mc_hotreset_assert()
213 dev_err(mc->dev, "failed to flush %s DMA\n", in tegra_mc_hotreset_assert()
224 err = rst_ops->hotreset_assert(mc, rst); in tegra_mc_hotreset_assert()
226 dev_err(mc->dev, "failed to hot reset %s: %d\n", in tegra_mc_hotreset_assert()
238 struct tegra_mc *mc = reset_to_mc(rcdev); in tegra_mc_hotreset_deassert() local
243 rst = tegra_mc_reset_find(mc, id); in tegra_mc_hotreset_deassert()
247 rst_ops = mc->soc->reset_ops; in tegra_mc_hotreset_deassert()
253 err = rst_ops->hotreset_deassert(mc, rst); in tegra_mc_hotreset_deassert()
255 dev_err(mc->dev, "failed to deassert hot reset %s: %d\n", in tegra_mc_hotreset_deassert()
263 err = rst_ops->unblock_dma(mc, rst); in tegra_mc_hotreset_deassert()
265 dev_err(mc->dev, "failed to unblock %s DMA : %d\n", in tegra_mc_hotreset_deassert()
277 struct tegra_mc *mc = reset_to_mc(rcdev); in tegra_mc_hotreset_status() local
281 rst = tegra_mc_reset_find(mc, id); in tegra_mc_hotreset_status()
285 rst_ops = mc->soc->reset_ops; in tegra_mc_hotreset_status()
289 return rst_ops->reset_status(mc, rst); in tegra_mc_hotreset_status()
298 static int tegra_mc_reset_setup(struct tegra_mc *mc) in tegra_mc_reset_setup() argument
302 mc->reset.ops = &tegra_mc_reset_ops; in tegra_mc_reset_setup()
303 mc->reset.owner = THIS_MODULE; in tegra_mc_reset_setup()
304 mc->reset.of_node = mc->dev->of_node; in tegra_mc_reset_setup()
305 mc->reset.of_reset_n_cells = 1; in tegra_mc_reset_setup()
306 mc->reset.nr_resets = mc->soc->num_resets; in tegra_mc_reset_setup()
308 err = reset_controller_register(&mc->reset); in tegra_mc_reset_setup()
315 int tegra_mc_write_emem_configuration(struct tegra_mc *mc, unsigned long rate) in tegra_mc_write_emem_configuration() argument
320 for (i = 0; i < mc->num_timings; i++) { in tegra_mc_write_emem_configuration()
321 if (mc->timings[i].rate == rate) { in tegra_mc_write_emem_configuration()
322 timing = &mc->timings[i]; in tegra_mc_write_emem_configuration()
328 dev_err(mc->dev, "no memory timing registered for rate %lu\n", in tegra_mc_write_emem_configuration()
333 for (i = 0; i < mc->soc->num_emem_regs; ++i) in tegra_mc_write_emem_configuration()
334 mc_writel(mc, timing->emem_data[i], mc->soc->emem_regs[i]); in tegra_mc_write_emem_configuration()
340 unsigned int tegra_mc_get_emem_device_count(struct tegra_mc *mc) in tegra_mc_get_emem_device_count() argument
344 dram_count = mc_readl(mc, MC_EMEM_ADR_CFG); in tegra_mc_get_emem_device_count()
357 static int tegra_mc_setup_latency_allowance(struct tegra_mc *mc) in tegra_mc_setup_latency_allowance() argument
364 tick = (unsigned long long)mc->tick * clk_get_rate(mc->clk); in tegra_mc_setup_latency_allowance()
367 value = mc_readl(mc, MC_EMEM_ARB_CFG); in tegra_mc_setup_latency_allowance()
370 mc_writel(mc, value, MC_EMEM_ARB_CFG); in tegra_mc_setup_latency_allowance()
373 for (i = 0; i < mc->soc->num_clients; i++) { in tegra_mc_setup_latency_allowance()
374 const struct tegra_mc_client *client = &mc->soc->clients[i]; in tegra_mc_setup_latency_allowance()
377 value = mc_readl(mc, client->regs.la.reg); in tegra_mc_setup_latency_allowance()
380 mc_writel(mc, value, client->regs.la.reg); in tegra_mc_setup_latency_allowance()
384 mc_writel(mc, MC_TIMING_UPDATE, MC_TIMING_CONTROL); in tegra_mc_setup_latency_allowance()
389 static int load_one_timing(struct tegra_mc *mc, in load_one_timing() argument
398 dev_err(mc->dev, in load_one_timing()
404 timing->emem_data = devm_kcalloc(mc->dev, mc->soc->num_emem_regs, in load_one_timing()
411 mc->soc->num_emem_regs); in load_one_timing()
413 dev_err(mc->dev, in load_one_timing()
422 static int load_timings(struct tegra_mc *mc, struct device_node *node) in load_timings() argument
429 mc->timings = devm_kcalloc(mc->dev, child_count, sizeof(*timing), in load_timings()
431 if (!mc->timings) in load_timings()
434 mc->num_timings = child_count; in load_timings()
437 timing = &mc->timings[i++]; in load_timings()
439 err = load_one_timing(mc, timing, child); in load_timings()
449 static int tegra_mc_setup_timings(struct tegra_mc *mc) in tegra_mc_setup_timings() argument
457 mc->num_timings = 0; in tegra_mc_setup_timings()
459 for_each_child_of_node(mc->dev->of_node, node) { in tegra_mc_setup_timings()
465 err = load_timings(mc, node); in tegra_mc_setup_timings()
472 if (mc->num_timings == 0) in tegra_mc_setup_timings()
473 dev_warn(mc->dev, in tegra_mc_setup_timings()
480 int tegra30_mc_probe(struct tegra_mc *mc) in tegra30_mc_probe() argument
484 mc->clk = devm_clk_get_optional(mc->dev, "mc"); in tegra30_mc_probe()
485 if (IS_ERR(mc->clk)) { in tegra30_mc_probe()
486 dev_err(mc->dev, "failed to get MC clock: %ld\n", PTR_ERR(mc->clk)); in tegra30_mc_probe()
487 return PTR_ERR(mc->clk); in tegra30_mc_probe()
491 mc_writel(mc, 0x00000000, MC_TIMING_CONTROL_DBG); in tegra30_mc_probe()
493 err = tegra_mc_setup_latency_allowance(mc); in tegra30_mc_probe()
495 dev_err(mc->dev, "failed to setup latency allowance: %d\n", err); in tegra30_mc_probe()
499 err = tegra_mc_setup_timings(mc); in tegra30_mc_probe()
501 dev_err(mc->dev, "failed to setup timings: %d\n", err); in tegra30_mc_probe()
510 struct tegra_mc *mc = data; in tegra30_mc_handle_irq() local
515 status = mc_readl(mc, MC_INTSTATUS) & mc->soc->intmask; in tegra30_mc_handle_irq()
529 value = mc_readl(mc, MC_ERR_STATUS); in tegra30_mc_handle_irq()
532 if (mc->soc->num_address_bits > 32) { in tegra30_mc_handle_irq()
549 id = value & mc->soc->client_id_mask; in tegra30_mc_handle_irq()
551 for (i = 0; i < mc->soc->num_clients; i++) { in tegra30_mc_handle_irq()
552 if (mc->soc->clients[i].id == id) { in tegra30_mc_handle_irq()
553 client = mc->soc->clients[i].name; in tegra30_mc_handle_irq()
591 value = mc_readl(mc, MC_ERR_ADR); in tegra30_mc_handle_irq()
594 dev_err_ratelimited(mc->dev, "%s: %s%s @%pa: %s (%s%s)\n", in tegra30_mc_handle_irq()
600 mc_writel(mc, status, MC_INTSTATUS); in tegra30_mc_handle_irq()
654 static int tegra_mc_interconnect_setup(struct tegra_mc *mc) in tegra_mc_interconnect_setup() argument
661 if (!device_property_present(mc->dev, "#interconnect-cells") || in tegra_mc_interconnect_setup()
662 !mc->soc->icc_ops) in tegra_mc_interconnect_setup()
665 mc->provider.dev = mc->dev; in tegra_mc_interconnect_setup()
666 mc->provider.data = &mc->provider; in tegra_mc_interconnect_setup()
667 mc->provider.set = mc->soc->icc_ops->set; in tegra_mc_interconnect_setup()
668 mc->provider.aggregate = mc->soc->icc_ops->aggregate; in tegra_mc_interconnect_setup()
669 mc->provider.xlate_extended = mc->soc->icc_ops->xlate_extended; in tegra_mc_interconnect_setup()
671 err = icc_provider_add(&mc->provider); in tegra_mc_interconnect_setup()
683 icc_node_add(node, &mc->provider); in tegra_mc_interconnect_setup()
690 for (i = 0; i < mc->soc->num_clients; i++) { in tegra_mc_interconnect_setup()
692 node = icc_node_create(mc->soc->clients[i].id); in tegra_mc_interconnect_setup()
698 node->name = mc->soc->clients[i].name; in tegra_mc_interconnect_setup()
699 icc_node_add(node, &mc->provider); in tegra_mc_interconnect_setup()
710 icc_nodes_remove(&mc->provider); in tegra_mc_interconnect_setup()
712 icc_provider_del(&mc->provider); in tegra_mc_interconnect_setup()
720 struct tegra_mc *mc; in tegra_mc_probe() local
724 mc = devm_kzalloc(&pdev->dev, sizeof(*mc), GFP_KERNEL); in tegra_mc_probe()
725 if (!mc) in tegra_mc_probe()
728 platform_set_drvdata(pdev, mc); in tegra_mc_probe()
729 spin_lock_init(&mc->lock); in tegra_mc_probe()
730 mc->soc = of_device_get_match_data(&pdev->dev); in tegra_mc_probe()
731 mc->dev = &pdev->dev; in tegra_mc_probe()
733 mask = DMA_BIT_MASK(mc->soc->num_address_bits); in tegra_mc_probe()
742 mc->tick = 30; in tegra_mc_probe()
745 mc->regs = devm_ioremap_resource(&pdev->dev, res); in tegra_mc_probe()
746 if (IS_ERR(mc->regs)) in tegra_mc_probe()
747 return PTR_ERR(mc->regs); in tegra_mc_probe()
749 mc->debugfs.root = debugfs_create_dir("mc", NULL); in tegra_mc_probe()
751 if (mc->soc->ops && mc->soc->ops->probe) { in tegra_mc_probe()
752 err = mc->soc->ops->probe(mc); in tegra_mc_probe()
757 if (mc->soc->ops && mc->soc->ops->handle_irq) { in tegra_mc_probe()
758 mc->irq = platform_get_irq(pdev, 0); in tegra_mc_probe()
759 if (mc->irq < 0) in tegra_mc_probe()
760 return mc->irq; in tegra_mc_probe()
762 WARN(!mc->soc->client_id_mask, "missing client ID mask for this SoC\n"); in tegra_mc_probe()
764 mc_writel(mc, mc->soc->intmask, MC_INTMASK); in tegra_mc_probe()
766 err = devm_request_irq(&pdev->dev, mc->irq, mc->soc->ops->handle_irq, 0, in tegra_mc_probe()
767 dev_name(&pdev->dev), mc); in tegra_mc_probe()
769 dev_err(&pdev->dev, "failed to request IRQ#%u: %d\n", mc->irq, in tegra_mc_probe()
775 if (mc->soc->reset_ops) { in tegra_mc_probe()
776 err = tegra_mc_reset_setup(mc); in tegra_mc_probe()
781 err = tegra_mc_interconnect_setup(mc); in tegra_mc_probe()
786 if (IS_ENABLED(CONFIG_TEGRA_IOMMU_SMMU) && mc->soc->smmu) { in tegra_mc_probe()
787 mc->smmu = tegra_smmu_probe(&pdev->dev, mc->soc->smmu, mc); in tegra_mc_probe()
788 if (IS_ERR(mc->smmu)) { in tegra_mc_probe()
790 PTR_ERR(mc->smmu)); in tegra_mc_probe()
791 mc->smmu = NULL; in tegra_mc_probe()
795 if (IS_ENABLED(CONFIG_TEGRA_IOMMU_GART) && !mc->soc->smmu) { in tegra_mc_probe()
796 mc->gart = tegra_gart_probe(&pdev->dev, mc); in tegra_mc_probe()
797 if (IS_ERR(mc->gart)) { in tegra_mc_probe()
799 PTR_ERR(mc->gart)); in tegra_mc_probe()
800 mc->gart = NULL; in tegra_mc_probe()
809 struct tegra_mc *mc = dev_get_drvdata(dev); in tegra_mc_suspend() local
811 if (mc->soc->ops && mc->soc->ops->suspend) in tegra_mc_suspend()
812 return mc->soc->ops->suspend(mc); in tegra_mc_suspend()
819 struct tegra_mc *mc = dev_get_drvdata(dev); in tegra_mc_resume() local
821 if (mc->soc->ops && mc->soc->ops->resume) in tegra_mc_resume()
822 return mc->soc->ops->resume(mc); in tegra_mc_resume()
829 struct tegra_mc *mc = dev_get_drvdata(dev); in tegra_mc_sync_state() local
832 if (mc->provider.dev == dev) in tegra_mc_sync_state()