]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
arm64: tegra21: emc: modify EMC driver init
authorAlex Waterman <alexw@nvidia.com>
Tue, 4 Nov 2014 21:42:21 +0000 (13:42 -0800)
committerMitch Luban <mluban@nvidia.com>
Thu, 18 Dec 2014 00:06:52 +0000 (16:06 -0800)
Change the EMC driver init so that the emc timers - thermal and
periodic training for t21x - happen as a subcall of the general
EMC probe. One caveat is that the thermal device registration
has to be delayed because the EMC driver init runs before the
thermal framework seems to exist.

Change-Id: I7184dcd8629cbf29547262418a6a283de6ef5b26
Signed-off-by: Alex Waterman <alexw@nvidia.com>
Reviewed-on: http://git-master/r/660451
(cherry picked from commit 5922fd8b60ae4d197925dd6142fdc1a7799102e1)
Reviewed-on: http://git-master/r/663395
Reviewed-by: Mitch Luban <mluban@nvidia.com>
arch/arm/mach-tegra/include/mach/tegra_emc.h
drivers/platform/tegra/mc/tegra12_emc.c
drivers/platform/tegra/mc/tegra21_emc.c
drivers/platform/tegra/mc/tegra_emc.c

index b4a046e5ac9d2a292498830b8108c618c612bc55..20842774d2b6622d2e110ae4dbf54d9fc7fe8184 100644 (file)
@@ -72,6 +72,7 @@ struct dentry;
 
 void tegra_emc_iso_usage_table_init(struct emc_iso_usage *table, int size);
 int  tegra_emc_iso_usage_debugfs_init(struct dentry *emc_debugfs_root);
+int tegra_emc_timers_init(struct dentry *parent);
 void tegra_emc_dvfs_table_ops_init(
                struct tegra_emc_dvfs_table_ops *dvfs_table_ops_to_copy);
 unsigned long tegra_emc_apply_efficiency(unsigned long total_bw,
index d6ab7ad3363c7d04aa264f0380c0458e6501f6e4..ac610344bcb59191dfa4379114b7f527a8dedf88 100644 (file)
@@ -1669,78 +1669,6 @@ void tegra12_mc_holdoff_enable(void)
                MC_EMEM_ARB_HYSTERESIS_3_0);
 }
 
-static int tegra12_emc_probe(struct platform_device *pdev)
-{
-       struct tegra12_emc_pdata *pdata;
-       struct resource *res;
-       int ret;
-
-       if (tegra_emc_table) {
-               ret = -EINVAL;
-               goto fail;
-       }
-
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res) {
-               dev_err(&pdev->dev, "missing register base\n");
-               ret = -ENOMEM;
-               goto fail;
-       }
-
-       pdata = pdev->dev.platform_data;
-
-       if (!pdata) {
-               pdata = tegra_emc_dt_parse_pdata(pdev);
-       }
-
-       if (!pdata) {
-               dev_err(&pdev->dev, "missing platform data\n");
-               ret = -ENODATA;
-               goto fail;
-       }
-
-       ret = init_emc_table(pdata->tables, pdata->tables_derated,
-                             pdata->num_tables);
-
-       if (!ret) {
-               tegra_emc_iso_usage_table_init(tegra12_emc_iso_usage,
-                               ARRAY_SIZE(tegra12_emc_iso_usage));
-               if (emc_enable) {
-                       unsigned long rate = tegra_emc_round_rate_updown(
-                               emc->boot_rate, false);
-                       if (!IS_ERR_VALUE(rate))
-                               tegra_clk_preset_emc_monitor(rate);
-               }
-       }
-
-fail:
-       /* We need to do this even if rest of the logic fails */
-       tegra12_mc_holdoff_enable();
-       tegra_emc_dvfs_table_ops_init(&tegra12_emc_dvfs_table_ops);
-
-       return ret;
-}
-
-static struct of_device_id tegra12_emc_of_match[] = {
-       { .compatible = "nvidia,tegra12-emc", },
-       { },
-};
-
-static struct platform_driver tegra12_emc_driver = {
-       .driver         = {
-               .name   = "tegra-emc",
-               .owner  = THIS_MODULE,
-       },
-       .probe          = tegra12_emc_probe,
-};
-
-int __init tegra12_emc_init(void)
-{
-       if (!tegra_emc_device.dev.platform_data)
-               tegra12_emc_driver.driver.of_match_table = tegra12_emc_of_match;
-       return platform_driver_register(&tegra12_emc_driver);
-}
-
 void tegra_emc_timing_invalidate(void)
 {
        emc_timing = NULL;
@@ -2096,7 +2024,7 @@ static int efficiency_set(void *data, u64 val)
 DEFINE_SIMPLE_ATTRIBUTE(efficiency_fops, efficiency_get,
                        efficiency_set, "%llu\n");
 
-static int __init tegra_emc_debug_init(void)
+static int tegra_emc_debug_init(void)
 {
        if (!tegra_emc_table)
                return 0;
@@ -2144,6 +2072,83 @@ err_out:
        debugfs_remove_recursive(emc_debugfs_root);
        return -ENOMEM;
 }
+#endif
 
-late_initcall(tegra_emc_debug_init);
+static int tegra12_emc_probe(struct platform_device *pdev)
+{
+       struct tegra12_emc_pdata *pdata;
+       struct resource *res;
+       int ret;
+
+       if (tegra_emc_table) {
+               ret = -EINVAL;
+               goto fail;
+       }
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               dev_err(&pdev->dev, "missing register base\n");
+               ret = -ENOMEM;
+               goto fail;
+       }
+
+       pdata = pdev->dev.platform_data;
+
+       if (!pdata) {
+               pdata = tegra_emc_dt_parse_pdata(pdev);
+       }
+
+       if (!pdata) {
+               dev_err(&pdev->dev, "missing platform data\n");
+               ret = -ENODATA;
+               goto fail;
+       }
+
+       ret = init_emc_table(pdata->tables, pdata->tables_derated,
+                             pdata->num_tables);
+
+       if (!ret) {
+               tegra_emc_iso_usage_table_init(tegra12_emc_iso_usage,
+                               ARRAY_SIZE(tegra12_emc_iso_usage));
+               if (emc_enable) {
+                       unsigned long rate = tegra_emc_round_rate_updown(
+                               emc->boot_rate, false);
+                       if (!IS_ERR_VALUE(rate))
+                               tegra_clk_preset_emc_monitor(rate);
+               }
+       }
+
+fail:
+       /* We need to do this even if rest of the logic fails */
+       tegra12_mc_holdoff_enable();
+       tegra_emc_dvfs_table_ops_init(&tegra12_emc_dvfs_table_ops);
+
+#ifdef CONFIG_DEBUG_FS
+       tegra_emc_debug_init();
+       ret = tegra_emc_timers_init(emc_debugfs_root);
+#else
+       ret = tegra_emc_timers_init(NULL);
 #endif
+
+       return ret;
+}
+
+static struct of_device_id tegra12_emc_of_match[] = {
+       { .compatible = "nvidia,tegra12-emc", },
+       { },
+};
+
+static struct platform_driver tegra12_emc_driver = {
+       .driver         = {
+               .name   = "tegra-emc",
+               .owner  = THIS_MODULE,
+       },
+       .probe          = tegra12_emc_probe,
+};
+
+int __init tegra12_emc_init(void)
+{
+       if (!tegra_emc_device.dev.platform_data)
+               tegra12_emc_driver.driver.of_match_table = tegra12_emc_of_match;
+       return platform_driver_register(&tegra12_emc_driver);
+}
index 4216ee0a7ac7cc7a680fd337ccb2296023533eb2..a094b2d9ff22691c552a9b8b812fcc239d868701 100644 (file)
@@ -1192,70 +1192,6 @@ void tegra21_mc_holdoff_enable(void)
                MC_EMEM_ARB_HYSTERESIS_3_0);
 }
 
-static int tegra21_emc_probe(struct platform_device *pdev)
-{
-       struct tegra21_emc_pdata *pdata;
-       struct resource *res;
-       int ret;
-
-       if (tegra_emc_table) {
-               ret = -EINVAL;
-               goto out;
-       }
-
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res) {
-               dev_err(&pdev->dev, "missing register base\n");
-               ret = -ENOMEM;
-               goto out;
-       }
-
-       pdata = tegra_emc_dt_parse_pdata(pdev);
-
-       if (!pdata) {
-               dev_err(&pdev->dev, "missing platform data\n");
-               ret = -ENODATA;
-               goto out;
-       }
-
-       pr_info("Loading EMC tables...\n");
-       ret = init_emc_table(pdata->tables, pdata->tables_derated,
-                             pdata->num_tables);
-
-       if (!ret) {
-               tegra_emc_iso_usage_table_init(tegra21_emc_iso_usage,
-                               ARRAY_SIZE(tegra21_emc_iso_usage));
-               if (emc_enable) {
-                       unsigned long rate = tegra_emc_round_rate_updown(
-                               emc->boot_rate, false);
-                       if (!IS_ERR_VALUE(rate))
-                               tegra_clk_preset_emc_monitor(rate);
-               }
-       }
-
-out:
-       return ret;
-}
-
-static struct of_device_id tegra21_emc_of_match[] = {
-       { .compatible = "nvidia,tegra21-emc", },
-       { },
-};
-
-static struct platform_driver tegra21_emc_driver = {
-       .driver         = {
-               .name   = "tegra-emc",
-               .owner  = THIS_MODULE,
-               .of_match_table = tegra21_emc_of_match
-       },
-       .probe          = tegra21_emc_probe,
-};
-
-int __init tegra21_emc_init(void)
-{
-       return platform_driver_register(&tegra21_emc_driver);
-}
-
 void tegra_emc_timing_invalidate(void)
 {
        emc_timing = NULL;
@@ -1640,11 +1576,8 @@ static int efficiency_set(void *data, u64 val)
 DEFINE_SIMPLE_ATTRIBUTE(efficiency_fops, efficiency_get,
                        efficiency_set, "%llu\n");
 
-static int __init tegra_emc_debug_init(void)
+static int tegra_emc_debug_init(void)
 {
-       if (!tegra_emc_table)
-               return 0;
-
        emc_debugfs_root = debugfs_create_dir("tegra_emc", NULL);
        if (!emc_debugfs_root)
                return -ENOMEM;
@@ -1688,6 +1621,75 @@ err_out:
        debugfs_remove_recursive(emc_debugfs_root);
        return -ENOMEM;
 }
+#endif
+
+static int tegra21_emc_probe(struct platform_device *pdev)
+{
+       struct tegra21_emc_pdata *pdata;
+       struct resource *res;
+       int err;
+
+       if (tegra_emc_table) {
+               err = -EINVAL;
+               goto out;
+       }
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               dev_err(&pdev->dev, "missing register base\n");
+               err = -ENOMEM;
+               goto out;
+       }
+
+       pdata = tegra_emc_dt_parse_pdata(pdev);
+
+       if (!pdata) {
+               dev_err(&pdev->dev, "missing platform data\n");
+               err = -ENODATA;
+               goto out;
+       }
+
+       pr_info("Loading EMC tables...\n");
+       err = init_emc_table(pdata->tables, pdata->tables_derated,
+                             pdata->num_tables);
+       if (err)
+               goto out;
 
-late_initcall(tegra_emc_debug_init);
+#ifdef CONFIG_DEBUG_FS
+       tegra_emc_debug_init();
+       err = tegra_emc_timers_init(emc_debugfs_root);
+#else
+       err = tegra_emc_timers_init(NULL);
 #endif
+
+out:
+       tegra_emc_iso_usage_table_init(tegra21_emc_iso_usage,
+                                      ARRAY_SIZE(tegra21_emc_iso_usage));
+       if (emc_enable) {
+               unsigned long rate = tegra_emc_round_rate_updown(
+                                                       emc->boot_rate, false);
+               if (!IS_ERR_VALUE(rate))
+                       tegra_clk_preset_emc_monitor(rate);
+       }
+
+       return err;
+}
+
+static struct of_device_id tegra21_emc_of_match[] = {
+       { .compatible = "nvidia,tegra21-emc", },
+       { },
+};
+
+static struct platform_driver tegra21_emc_driver = {
+       .driver         = {
+               .name   = "tegra-emc",
+               .owner  = THIS_MODULE,
+               .of_match_table = tegra21_emc_of_match,
+       },
+       .probe          = tegra21_emc_probe,
+};
+
+int __init tegra21_emc_init(void)
+{
+       return platform_driver_register(&tegra21_emc_driver);
+}
index 82cd3aec612f2eba1222a9051333c46159280b5c..530bedc3c0872563252b9f9d2a9aec17865fe03f 100644 (file)
@@ -180,7 +180,7 @@ static const struct file_operations emc_usage_table_fops = {
        .release        = single_release,
 };
 
-int __init tegra_emc_iso_usage_debugfs_init(struct dentry *emc_debugfs_root)
+int tegra_emc_iso_usage_debugfs_init(struct dentry *emc_debugfs_root)
 {
        struct dentry *d;