cpufreq: tegra124: Allow building as a module
This requires four changes: * Using the cpufreq-dt register helper to establish a hard dependency for depmod to track * Adding a remove routine to remove the cpufreq-dt device * Adding a exit routine to handle cleaning up the driver * Populate module license Signed-off-by: Aaron Kling <webgeek1234@gmail.com>
This commit is contained in:
@@ -229,7 +229,7 @@ config ARM_TEGRA20_CPUFREQ
|
||||
This adds the CPUFreq driver support for Tegra20/30 SOCs.
|
||||
|
||||
config ARM_TEGRA124_CPUFREQ
|
||||
bool "Tegra124 CPUFreq support"
|
||||
tristate "Tegra124 CPUFreq support"
|
||||
depends on ARCH_TEGRA || COMPILE_TEST
|
||||
depends on CPUFREQ_DT
|
||||
default y
|
||||
|
||||
@@ -16,6 +16,10 @@
|
||||
#include <linux/pm_opp.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include "cpufreq-dt.h"
|
||||
|
||||
static struct platform_device *tegra124_cpufreq_pdev;
|
||||
|
||||
struct tegra124_cpufreq_priv {
|
||||
struct clk *cpu_clk;
|
||||
struct clk *pllp_clk;
|
||||
@@ -55,7 +59,6 @@ static int tegra124_cpufreq_probe(struct platform_device *pdev)
|
||||
struct device_node *np __free(device_node) = of_cpu_device_node_get(0);
|
||||
struct tegra124_cpufreq_priv *priv;
|
||||
struct device *cpu_dev;
|
||||
struct platform_device_info cpufreq_dt_devinfo = {};
|
||||
int ret;
|
||||
|
||||
if (!np)
|
||||
@@ -95,11 +98,7 @@ static int tegra124_cpufreq_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
goto out_put_pllp_clk;
|
||||
|
||||
cpufreq_dt_devinfo.name = "cpufreq-dt";
|
||||
cpufreq_dt_devinfo.parent = &pdev->dev;
|
||||
|
||||
priv->cpufreq_dt_pdev =
|
||||
platform_device_register_full(&cpufreq_dt_devinfo);
|
||||
priv->cpufreq_dt_pdev = cpufreq_dt_pdev_register(&pdev->dev);
|
||||
if (IS_ERR(priv->cpufreq_dt_pdev)) {
|
||||
ret = PTR_ERR(priv->cpufreq_dt_pdev);
|
||||
goto out_put_pllp_clk;
|
||||
@@ -173,6 +172,21 @@ disable_cpufreq:
|
||||
return err;
|
||||
}
|
||||
|
||||
static void tegra124_cpufreq_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct tegra124_cpufreq_priv *priv = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
if (!IS_ERR(priv->cpufreq_dt_pdev)) {
|
||||
platform_device_unregister(priv->cpufreq_dt_pdev);
|
||||
priv->cpufreq_dt_pdev = ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
clk_put(priv->pllp_clk);
|
||||
clk_put(priv->pllx_clk);
|
||||
clk_put(priv->dfll_clk);
|
||||
clk_put(priv->cpu_clk);
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops tegra124_cpufreq_pm_ops = {
|
||||
SET_SYSTEM_SLEEP_PM_OPS(tegra124_cpufreq_suspend,
|
||||
tegra124_cpufreq_resume)
|
||||
@@ -182,12 +196,12 @@ static struct platform_driver tegra124_cpufreq_platdrv = {
|
||||
.driver.name = "cpufreq-tegra124",
|
||||
.driver.pm = &tegra124_cpufreq_pm_ops,
|
||||
.probe = tegra124_cpufreq_probe,
|
||||
.remove = tegra124_cpufreq_remove,
|
||||
};
|
||||
|
||||
static int __init tegra_cpufreq_init(void)
|
||||
{
|
||||
int ret;
|
||||
struct platform_device *pdev;
|
||||
|
||||
if (!(of_machine_is_compatible("nvidia,tegra124") ||
|
||||
of_machine_is_compatible("nvidia,tegra210")))
|
||||
@@ -201,15 +215,25 @@ static int __init tegra_cpufreq_init(void)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pdev = platform_device_register_simple("cpufreq-tegra124", -1, NULL, 0);
|
||||
if (IS_ERR(pdev)) {
|
||||
tegra124_cpufreq_pdev = platform_device_register_simple("cpufreq-tegra124", -1, NULL, 0);
|
||||
if (IS_ERR(tegra124_cpufreq_pdev)) {
|
||||
platform_driver_unregister(&tegra124_cpufreq_platdrv);
|
||||
return PTR_ERR(pdev);
|
||||
return PTR_ERR(tegra124_cpufreq_pdev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
module_init(tegra_cpufreq_init);
|
||||
|
||||
static void __exit tegra_cpufreq_module_exit(void)
|
||||
{
|
||||
if (!IS_ERR_OR_NULL(tegra124_cpufreq_pdev))
|
||||
platform_device_unregister(tegra124_cpufreq_pdev);
|
||||
|
||||
platform_driver_unregister(&tegra124_cpufreq_platdrv);
|
||||
}
|
||||
module_exit(tegra_cpufreq_module_exit);
|
||||
|
||||
MODULE_AUTHOR("Tuomas Tynkkynen <ttynkkynen@nvidia.com>");
|
||||
MODULE_DESCRIPTION("cpufreq driver for NVIDIA Tegra124");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
Reference in New Issue
Block a user