|
@@ -415,6 +415,7 @@ static int check_mem_type(void __iomem *dmc_reg)
|
|
|
static int __init s5pv210_cpu_init(struct cpufreq_policy *policy)
|
|
|
{
|
|
|
unsigned long mem_type;
|
|
|
+ int ret;
|
|
|
|
|
|
cpu_clk = clk_get(NULL, "armclk");
|
|
|
if (IS_ERR(cpu_clk))
|
|
@@ -422,19 +423,20 @@ static int __init s5pv210_cpu_init(struct cpufreq_policy *policy)
|
|
|
|
|
|
dmc0_clk = clk_get(NULL, "sclk_dmc0");
|
|
|
if (IS_ERR(dmc0_clk)) {
|
|
|
- clk_put(cpu_clk);
|
|
|
- return PTR_ERR(dmc0_clk);
|
|
|
+ ret = PTR_ERR(dmc0_clk);
|
|
|
+ goto out_dmc0;
|
|
|
}
|
|
|
|
|
|
dmc1_clk = clk_get(NULL, "hclk_msys");
|
|
|
if (IS_ERR(dmc1_clk)) {
|
|
|
- clk_put(dmc0_clk);
|
|
|
- clk_put(cpu_clk);
|
|
|
- return PTR_ERR(dmc1_clk);
|
|
|
+ ret = PTR_ERR(dmc1_clk);
|
|
|
+ goto out_dmc1;
|
|
|
}
|
|
|
|
|
|
- if (policy->cpu != 0)
|
|
|
- return -EINVAL;
|
|
|
+ if (policy->cpu != 0) {
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto out_dmc1;
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* check_mem_type : This driver only support LPDDR & LPDDR2.
|
|
@@ -444,7 +446,8 @@ static int __init s5pv210_cpu_init(struct cpufreq_policy *policy)
|
|
|
|
|
|
if ((mem_type != LPDDR) && (mem_type != LPDDR2)) {
|
|
|
printk(KERN_ERR "CPUFreq doesn't support this memory type\n");
|
|
|
- return -EINVAL;
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto out_dmc1;
|
|
|
}
|
|
|
|
|
|
/* Find current refresh counter and frequency each DMC */
|
|
@@ -461,6 +464,12 @@ static int __init s5pv210_cpu_init(struct cpufreq_policy *policy)
|
|
|
policy->cpuinfo.transition_latency = 40000;
|
|
|
|
|
|
return cpufreq_frequency_table_cpuinfo(policy, s5pv210_freq_table);
|
|
|
+
|
|
|
+out_dmc1:
|
|
|
+ clk_put(dmc0_clk);
|
|
|
+out_dmc0:
|
|
|
+ clk_put(cpu_clk);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static struct cpufreq_driver s5pv210_driver = {
|