Quoting Taniya Das (2018-12-12 23:49:54) > The CPUfreq HW present in some QCOM chipsets offloads the steps necessary > for changing the frequency of CPUs. The driver implements the cpufreq > driver interface for this hardware engine. > > Signed-off-by: Saravana Kannan <skannan@xxxxxxxxxxxxxx> > Signed-off-by: Stephen Boyd <swboyd@xxxxxxxxxxxx> > Signed-off-by: Taniya Das <tdas@xxxxxxxxxxxxxx> > --- Reviewed-by: Stephen Boyd <swboyd@xxxxxxxxxxxx> But I noticed that we don't release the I/O region anymore so hotplug and replug of a whole clk domain fails. I guess devm_ioremap_resource() was just too much magic so how about we downgrade to devm_ioremap() instead? BTW, Viresh, I see a lockdep splat when cpufreq_init returns an error upon bringing the policy online the second time. I guess cpufreq_stats aren't able to be freed from there because they take locks in different order vs. the normal path? -----8<------- diff --git a/drivers/cpufreq/qcom-cpufreq-hw.c b/drivers/cpufreq/qcom-cpufreq-hw.c index fce7a1162e87..0e1105151478 100644 --- a/drivers/cpufreq/qcom-cpufreq-hw.c +++ b/drivers/cpufreq/qcom-cpufreq-hw.c @@ -182,9 +182,12 @@ static int qcom_cpufreq_hw_cpu_init(struct cpufreq_policy *policy) index = args.args[0]; res = platform_get_resource(global_pdev, IORESOURCE_MEM, index); - base = devm_ioremap_resource(dev, res); - if (IS_ERR(base)) - return PTR_ERR(base); + if (!res) + return -ENODEV; + + base = devm_ioremap(dev, res->start, resource_size(res)); + if (!base) + return -ENOMEM; /* HW should be in enabled state to proceed */ if (!(readl_relaxed(base + REG_ENABLE) & 0x1)) {