]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
memory: tegra: Unify drivers
authorThierry Reding <treding@nvidia.com>
Wed, 2 Jun 2021 16:33:00 +0000 (18:33 +0200)
committerKrzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Thu, 3 Jun 2021 19:49:41 +0000 (21:49 +0200)
The Tegra210 (and earlier) driver now supports all the functionality
that the Tegra186 (and later) driver does, so they can be unified.

Note that previously the Tegra186 (and later) driver could be unloaded,
even if that was perhaps not very useful. Older chips don't support that
yet, but once they do this code can be reenabled.

Signed-off-by: Thierry Reding <treding@nvidia.com>
Link: https://lore.kernel.org/r/20210602163302.120041-11-thierry.reding@gmail.com
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
drivers/memory/tegra/Makefile
drivers/memory/tegra/mc.c
drivers/memory/tegra/mc.h
drivers/memory/tegra/tegra186.c
include/soc/tegra/mc.h

index 6c1a2ecc6628495242223e2f097a8e7cec4f0991..1af0fefacdda75df9ff0addb8e27ebc8560514bd 100644 (file)
@@ -7,6 +7,8 @@ tegra-mc-$(CONFIG_ARCH_TEGRA_114_SOC) += tegra114.o
 tegra-mc-$(CONFIG_ARCH_TEGRA_124_SOC) += tegra124.o
 tegra-mc-$(CONFIG_ARCH_TEGRA_132_SOC) += tegra124.o
 tegra-mc-$(CONFIG_ARCH_TEGRA_210_SOC) += tegra210.o
+tegra-mc-$(CONFIG_ARCH_TEGRA_186_SOC) += tegra186.o
+tegra-mc-$(CONFIG_ARCH_TEGRA_194_SOC) += tegra186.o
 
 obj-$(CONFIG_TEGRA_MC) += tegra-mc.o
 
@@ -15,7 +17,7 @@ obj-$(CONFIG_TEGRA30_EMC)  += tegra30-emc.o
 obj-$(CONFIG_TEGRA124_EMC) += tegra124-emc.o
 obj-$(CONFIG_TEGRA210_EMC_TABLE) += tegra210-emc-table.o
 obj-$(CONFIG_TEGRA210_EMC) += tegra210-emc.o
-obj-$(CONFIG_ARCH_TEGRA_186_SOC) += tegra186.o tegra186-emc.o
-obj-$(CONFIG_ARCH_TEGRA_194_SOC) += tegra186.o tegra186-emc.o
+obj-$(CONFIG_ARCH_TEGRA_186_SOC) += tegra186-emc.o
+obj-$(CONFIG_ARCH_TEGRA_194_SOC) += tegra186-emc.o
 
 tegra210-emc-y := tegra210-emc-core.o tegra210-emc-cc-r21021.o
index 4aa17bdd63921f13ece4e0d279429e9ad7dfce2f..11b83de9361cf4140aa53df85e4169e5cf106870 100644 (file)
@@ -39,7 +39,13 @@ static const struct of_device_id tegra_mc_of_match[] = {
 #ifdef CONFIG_ARCH_TEGRA_210_SOC
        { .compatible = "nvidia,tegra210-mc", .data = &tegra210_mc_soc },
 #endif
-       { }
+#ifdef CONFIG_ARCH_TEGRA_186_SOC
+       { .compatible = "nvidia,tegra186-mc", .data = &tegra186_mc_soc },
+#endif
+#ifdef CONFIG_ARCH_TEGRA_194_SOC
+       { .compatible = "nvidia,tegra194-mc", .data = &tegra194_mc_soc },
+#endif
+       { /* sentinel */ }
 };
 MODULE_DEVICE_TABLE(of, tegra_mc_of_match);
 
index 83c605e42e9a0ff7e93fc4f93d3e05191470e8e4..24f95e06d18af02b2c746f85a920f82cf87992d1 100644 (file)
@@ -129,6 +129,14 @@ extern const struct tegra_mc_soc tegra132_mc_soc;
 extern const struct tegra_mc_soc tegra210_mc_soc;
 #endif
 
+#ifdef CONFIG_ARCH_TEGRA_186_SOC
+extern const struct tegra_mc_soc tegra186_mc_soc;
+#endif
+
+#ifdef CONFIG_ARCH_TEGRA_194_SOC
+extern const struct tegra_mc_soc tegra194_mc_soc;
+#endif
+
 #if defined(CONFIG_ARCH_TEGRA_3x_SOC) || \
     defined(CONFIG_ARCH_TEGRA_114_SOC) || \
     defined(CONFIG_ARCH_TEGRA_124_SOC) || \
index 9d3fdb609d559052571b0d4ce2318b9cd1ebc957..20efbbea587b69fc16b8d214952c61e7738f3bdd 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (C) 2017 NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (C) 2017-2021 NVIDIA CORPORATION.  All rights reserved.
  */
 
 #include <linux/io.h>
@@ -45,6 +45,24 @@ static void tegra186_mc_program_sid(struct tegra_mc *mc)
        }
 }
 
+static int tegra186_mc_probe(struct tegra_mc *mc)
+{
+       int err;
+
+       err = of_platform_populate(mc->dev->of_node, NULL, NULL, mc->dev);
+       if (err < 0)
+               return err;
+
+       tegra186_mc_program_sid(mc);
+
+       return 0;
+}
+
+static void tegra186_mc_remove(struct tegra_mc *mc)
+{
+       of_platform_depopulate(mc->dev);
+}
+
 static int tegra186_mc_resume(struct tegra_mc *mc)
 {
        tegra186_mc_program_sid(mc);
@@ -53,6 +71,8 @@ static int tegra186_mc_resume(struct tegra_mc *mc)
 }
 
 static const struct tegra_mc_ops tegra186_mc_ops = {
+       .probe = tegra186_mc_probe,
+       .remove = tegra186_mc_remove,
        .resume = tegra186_mc_resume,
 };
 
@@ -709,9 +729,10 @@ static const struct tegra_mc_client tegra186_mc_clients[] = {
        },
 };
 
-static const struct tegra_mc_soc tegra186_mc_soc = {
+const struct tegra_mc_soc tegra186_mc_soc = {
        .num_clients = ARRAY_SIZE(tegra186_mc_clients),
        .clients = tegra186_mc_clients,
+       .num_address_bits = 40,
        .ops = &tegra186_mc_ops,
 };
 #endif
@@ -1918,98 +1939,10 @@ static const struct tegra_mc_client tegra194_mc_clients[] = {
        },
 };
 
-static const struct tegra_mc_soc tegra194_mc_soc = {
+const struct tegra_mc_soc tegra194_mc_soc = {
        .num_clients = ARRAY_SIZE(tegra194_mc_clients),
        .clients = tegra194_mc_clients,
+       .num_address_bits = 40,
        .ops = &tegra186_mc_ops,
 };
 #endif
-
-static int tegra186_mc_probe(struct platform_device *pdev)
-{
-       struct resource *res;
-       struct tegra_mc *mc;
-       int err;
-
-       mc = devm_kzalloc(&pdev->dev, sizeof(*mc), GFP_KERNEL);
-       if (!mc)
-               return -ENOMEM;
-
-       mc->soc = of_device_get_match_data(&pdev->dev);
-
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       mc->regs = devm_ioremap_resource(&pdev->dev, res);
-       if (IS_ERR(mc->regs))
-               return PTR_ERR(mc->regs);
-
-       mc->dev = &pdev->dev;
-
-       err = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
-       if (err < 0)
-               return err;
-
-       platform_set_drvdata(pdev, mc);
-       tegra186_mc_program_sid(mc);
-
-       return 0;
-}
-
-static int tegra186_mc_remove(struct platform_device *pdev)
-{
-       struct tegra_mc *mc = platform_get_drvdata(pdev);
-
-       of_platform_depopulate(mc->dev);
-
-       return 0;
-}
-
-static const struct of_device_id tegra186_mc_of_match[] = {
-#if defined(CONFIG_ARCH_TEGRA_186_SOC)
-       { .compatible = "nvidia,tegra186-mc", .data = &tegra186_mc_soc },
-#endif
-#if defined(CONFIG_ARCH_TEGRA_194_SOC)
-       { .compatible = "nvidia,tegra194-mc", .data = &tegra194_mc_soc },
-#endif
-       { /* sentinel */ }
-};
-MODULE_DEVICE_TABLE(of, tegra186_mc_of_match);
-
-static int __maybe_unused tegra_mc_suspend(struct device *dev)
-{
-       struct tegra_mc *mc = dev_get_drvdata(dev);
-
-       if (mc->soc->ops && mc->soc->ops->suspend)
-               return mc->soc->ops->suspend(mc);
-
-       return 0;
-}
-
-static int __maybe_unused tegra_mc_resume(struct device *dev)
-{
-       struct tegra_mc *mc = dev_get_drvdata(dev);
-
-       if (mc->soc->ops && mc->soc->ops->resume)
-               return mc->soc->ops->resume(mc);
-
-       return 0;
-}
-
-static const struct dev_pm_ops tegra186_mc_pm_ops = {
-       SET_SYSTEM_SLEEP_PM_OPS(tegra_mc_suspend, tegra_mc_resume)
-};
-
-static struct platform_driver tegra186_mc_driver = {
-       .driver = {
-               .name = "tegra186-mc",
-               .of_match_table = tegra186_mc_of_match,
-               .pm = &tegra186_mc_pm_ops,
-               .suppress_bind_attrs = true,
-       },
-       .probe = tegra186_mc_probe,
-       .remove = tegra186_mc_remove,
-};
-module_platform_driver(tegra186_mc_driver);
-
-MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>");
-MODULE_DESCRIPTION("NVIDIA Tegra186 Memory Controller driver");
-MODULE_LICENSE("GPL v2");
index 87668ebab2a1202570177d12ce2e76256e53aace..1bd5aed81868e7e720ec3b785cea2c3c49f3bc15 100644 (file)
@@ -176,6 +176,7 @@ struct tegra_mc_ops {
         * after basic, common set up that is done by the SoC-agnostic bits.
         */
        int (*probe)(struct tegra_mc *mc);
+       void (*remove)(struct tegra_mc *mc);
        int (*suspend)(struct tegra_mc *mc);
        int (*resume)(struct tegra_mc *mc);
        irqreturn_t (*handle_irq)(int irq, void *data);