mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-21 03:33:59 +08:00
cpufreq: dt: No need to allocate resources anymore
OPP layer manages it now and cpufreq-dt driver doesn't need it. But, we still need to check for availability of resources for deferred probing. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Reviewed-by: Stephen Boyd <sboyd@codeaurora.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
df2c8ec28e
commit
dd02a3d920
@ -31,7 +31,6 @@
|
|||||||
|
|
||||||
struct private_data {
|
struct private_data {
|
||||||
struct device *cpu_dev;
|
struct device *cpu_dev;
|
||||||
struct regulator *cpu_reg;
|
|
||||||
struct thermal_cooling_device *cdev;
|
struct thermal_cooling_device *cdev;
|
||||||
const char *reg_name;
|
const char *reg_name;
|
||||||
};
|
};
|
||||||
@ -88,73 +87,59 @@ node_put:
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int allocate_resources(int cpu, struct device **cdev,
|
static int resources_available(void)
|
||||||
struct regulator **creg, struct clk **cclk)
|
|
||||||
{
|
{
|
||||||
struct device *cpu_dev;
|
struct device *cpu_dev;
|
||||||
struct regulator *cpu_reg;
|
struct regulator *cpu_reg;
|
||||||
struct clk *cpu_clk;
|
struct clk *cpu_clk;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
char *reg_cpu0 = "cpu0", *reg_cpu = "cpu", *reg;
|
const char *name;
|
||||||
|
|
||||||
cpu_dev = get_cpu_device(cpu);
|
cpu_dev = get_cpu_device(0);
|
||||||
if (!cpu_dev) {
|
if (!cpu_dev) {
|
||||||
pr_err("failed to get cpu%d device\n", cpu);
|
pr_err("failed to get cpu0 device\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try "cpu0" for older DTs */
|
cpu_clk = clk_get(cpu_dev, NULL);
|
||||||
if (!cpu)
|
ret = PTR_ERR_OR_ZERO(cpu_clk);
|
||||||
reg = reg_cpu0;
|
if (ret) {
|
||||||
else
|
/*
|
||||||
reg = reg_cpu;
|
* If cpu's clk node is present, but clock is not yet
|
||||||
|
* registered, we should try defering probe.
|
||||||
|
*/
|
||||||
|
if (ret == -EPROBE_DEFER)
|
||||||
|
dev_dbg(cpu_dev, "clock not ready, retry\n");
|
||||||
|
else
|
||||||
|
dev_err(cpu_dev, "failed to get clock: %d\n", ret);
|
||||||
|
|
||||||
try_again:
|
return ret;
|
||||||
cpu_reg = regulator_get_optional(cpu_dev, reg);
|
}
|
||||||
|
|
||||||
|
clk_put(cpu_clk);
|
||||||
|
|
||||||
|
name = find_supply_name(cpu_dev);
|
||||||
|
/* Platform doesn't require regulator */
|
||||||
|
if (!name)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
cpu_reg = regulator_get_optional(cpu_dev, name);
|
||||||
ret = PTR_ERR_OR_ZERO(cpu_reg);
|
ret = PTR_ERR_OR_ZERO(cpu_reg);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
/*
|
/*
|
||||||
* If cpu's regulator supply node is present, but regulator is
|
* If cpu's regulator supply node is present, but regulator is
|
||||||
* not yet registered, we should try defering probe.
|
* not yet registered, we should try defering probe.
|
||||||
*/
|
*/
|
||||||
if (ret == -EPROBE_DEFER) {
|
|
||||||
dev_dbg(cpu_dev, "cpu%d regulator not ready, retry\n",
|
|
||||||
cpu);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Try with "cpu-supply" */
|
|
||||||
if (reg == reg_cpu0) {
|
|
||||||
reg = reg_cpu;
|
|
||||||
goto try_again;
|
|
||||||
}
|
|
||||||
|
|
||||||
dev_dbg(cpu_dev, "no regulator for cpu%d: %d\n", cpu, ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
cpu_clk = clk_get(cpu_dev, NULL);
|
|
||||||
ret = PTR_ERR_OR_ZERO(cpu_clk);
|
|
||||||
if (ret) {
|
|
||||||
/* put regulator */
|
|
||||||
if (!IS_ERR(cpu_reg))
|
|
||||||
regulator_put(cpu_reg);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If cpu's clk node is present, but clock is not yet
|
|
||||||
* registered, we should try defering probe.
|
|
||||||
*/
|
|
||||||
if (ret == -EPROBE_DEFER)
|
if (ret == -EPROBE_DEFER)
|
||||||
dev_dbg(cpu_dev, "cpu%d clock not ready, retry\n", cpu);
|
dev_dbg(cpu_dev, "cpu0 regulator not ready, retry\n");
|
||||||
else
|
else
|
||||||
dev_err(cpu_dev, "failed to get cpu%d clock: %d\n", cpu,
|
dev_dbg(cpu_dev, "no regulator for cpu0: %d\n", ret);
|
||||||
ret);
|
|
||||||
} else {
|
return ret;
|
||||||
*cdev = cpu_dev;
|
|
||||||
*creg = cpu_reg;
|
|
||||||
*cclk = cpu_clk;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
regulator_put(cpu_reg);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cpufreq_init(struct cpufreq_policy *policy)
|
static int cpufreq_init(struct cpufreq_policy *policy)
|
||||||
@ -162,7 +147,6 @@ static int cpufreq_init(struct cpufreq_policy *policy)
|
|||||||
struct cpufreq_frequency_table *freq_table;
|
struct cpufreq_frequency_table *freq_table;
|
||||||
struct private_data *priv;
|
struct private_data *priv;
|
||||||
struct device *cpu_dev;
|
struct device *cpu_dev;
|
||||||
struct regulator *cpu_reg;
|
|
||||||
struct clk *cpu_clk;
|
struct clk *cpu_clk;
|
||||||
struct dev_pm_opp *suspend_opp;
|
struct dev_pm_opp *suspend_opp;
|
||||||
unsigned int transition_latency;
|
unsigned int transition_latency;
|
||||||
@ -170,9 +154,16 @@ static int cpufreq_init(struct cpufreq_policy *policy)
|
|||||||
const char *name;
|
const char *name;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = allocate_resources(policy->cpu, &cpu_dev, &cpu_reg, &cpu_clk);
|
cpu_dev = get_cpu_device(policy->cpu);
|
||||||
if (ret) {
|
if (!cpu_dev) {
|
||||||
pr_err("%s: Failed to allocate resources: %d\n", __func__, ret);
|
pr_err("failed to get cpu%d device\n", policy->cpu);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
cpu_clk = clk_get(cpu_dev, NULL);
|
||||||
|
if (IS_ERR(cpu_clk)) {
|
||||||
|
ret = PTR_ERR(cpu_clk);
|
||||||
|
dev_err(cpu_dev, "%s: failed to get clk: %d\n", __func__, ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -186,7 +177,7 @@ static int cpufreq_init(struct cpufreq_policy *policy)
|
|||||||
if (ret == -ENOENT)
|
if (ret == -ENOENT)
|
||||||
opp_v1 = true;
|
opp_v1 = true;
|
||||||
else
|
else
|
||||||
goto out_put_reg_clk;
|
goto out_put_clk;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -199,7 +190,7 @@ static int cpufreq_init(struct cpufreq_policy *policy)
|
|||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(cpu_dev, "Failed to set regulator for cpu%d: %d\n",
|
dev_err(cpu_dev, "Failed to set regulator for cpu%d: %d\n",
|
||||||
policy->cpu, ret);
|
policy->cpu, ret);
|
||||||
goto out_put_reg_clk;
|
goto out_put_clk;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -257,9 +248,7 @@ static int cpufreq_init(struct cpufreq_policy *policy)
|
|||||||
}
|
}
|
||||||
|
|
||||||
priv->cpu_dev = cpu_dev;
|
priv->cpu_dev = cpu_dev;
|
||||||
priv->cpu_reg = cpu_reg;
|
|
||||||
policy->driver_data = priv;
|
policy->driver_data = priv;
|
||||||
|
|
||||||
policy->clk = cpu_clk;
|
policy->clk = cpu_clk;
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
@ -300,10 +289,8 @@ out_free_opp:
|
|||||||
dev_pm_opp_of_cpumask_remove_table(policy->cpus);
|
dev_pm_opp_of_cpumask_remove_table(policy->cpus);
|
||||||
if (name)
|
if (name)
|
||||||
dev_pm_opp_put_regulator(cpu_dev);
|
dev_pm_opp_put_regulator(cpu_dev);
|
||||||
out_put_reg_clk:
|
out_put_clk:
|
||||||
clk_put(cpu_clk);
|
clk_put(cpu_clk);
|
||||||
if (!IS_ERR(cpu_reg))
|
|
||||||
regulator_put(cpu_reg);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -319,8 +306,6 @@ static int cpufreq_exit(struct cpufreq_policy *policy)
|
|||||||
dev_pm_opp_put_regulator(priv->cpu_dev);
|
dev_pm_opp_put_regulator(priv->cpu_dev);
|
||||||
|
|
||||||
clk_put(policy->clk);
|
clk_put(policy->clk);
|
||||||
if (!IS_ERR(priv->cpu_reg))
|
|
||||||
regulator_put(priv->cpu_reg);
|
|
||||||
kfree(priv);
|
kfree(priv);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -373,9 +358,6 @@ static struct cpufreq_driver dt_cpufreq_driver = {
|
|||||||
|
|
||||||
static int dt_cpufreq_probe(struct platform_device *pdev)
|
static int dt_cpufreq_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct device *cpu_dev;
|
|
||||||
struct regulator *cpu_reg;
|
|
||||||
struct clk *cpu_clk;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -385,19 +367,15 @@ static int dt_cpufreq_probe(struct platform_device *pdev)
|
|||||||
*
|
*
|
||||||
* FIXME: Is checking this only for CPU0 sufficient ?
|
* FIXME: Is checking this only for CPU0 sufficient ?
|
||||||
*/
|
*/
|
||||||
ret = allocate_resources(0, &cpu_dev, &cpu_reg, &cpu_clk);
|
ret = resources_available();
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
clk_put(cpu_clk);
|
|
||||||
if (!IS_ERR(cpu_reg))
|
|
||||||
regulator_put(cpu_reg);
|
|
||||||
|
|
||||||
dt_cpufreq_driver.driver_data = dev_get_platdata(&pdev->dev);
|
dt_cpufreq_driver.driver_data = dev_get_platdata(&pdev->dev);
|
||||||
|
|
||||||
ret = cpufreq_register_driver(&dt_cpufreq_driver);
|
ret = cpufreq_register_driver(&dt_cpufreq_driver);
|
||||||
if (ret)
|
if (ret)
|
||||||
dev_err(cpu_dev, "failed register driver: %d\n", ret);
|
dev_err(&pdev->dev, "failed register driver: %d\n", ret);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user