Message ID | 20201110111040.280231-1-sudeep.holla@arm.com |
---|---|
State | Accepted |
Commit | 8410e7f3b31e53bfa7a34c282b4313e79ed7ff8d |
Headers | show |
Series | cpufreq: scmi: Fix OPP addition failure with a dummy clock provider | expand |
On 10-11-20, 11:10, Sudeep Holla wrote: > Commit dd461cd9183f ("opp: Allow dev_pm_opp_get_opp_table() to return > -EPROBE_DEFER") handles -EPROBE_DEFER for the clock/interconnects within > _allocate_opp_table() which is called from dev_pm_opp_add and it > now propagates the error back to the caller. > > SCMI performance domain re-used clock bindings to keep it simple. However > with the above mentioned change, if clock property is present in a device > node, opps fails to get added with below errors until clk_get succeeds. > > cpu0: failed to add opp 450000000Hz > cpu0: failed to add opps to the device > ....(errors on cpu1-cpu4) > cpu5: failed to add opp 450000000Hz > cpu5: failed to add opps to the device > > So, in order to fix the issue, we need to register dummy clock provider. > With the dummy clock provider, clk_get returns NULL(no errors!), then opp > core proceeds to add OPPs for the CPUs. > > Cc: Rafael J. Wysocki <rjw@rjwysocki.net> > Cc: Viresh Kumar <viresh.kumar@linaro.org> > Fixes: dd461cd9183f ("opp: Allow dev_pm_opp_get_opp_table() to return -EPROBE_DEFER") > Signed-off-by: Sudeep Holla <sudeep.holla@arm.com> > --- > drivers/cpufreq/scmi-cpufreq.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/drivers/cpufreq/scmi-cpufreq.c b/drivers/cpufreq/scmi-cpufreq.c > index e855e8612a67..78318508a6d6 100644 > --- a/drivers/cpufreq/scmi-cpufreq.c > +++ b/drivers/cpufreq/scmi-cpufreq.c > @@ -8,6 +8,7 @@ > > #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt > > +#include <linux/clk-provider.h> > #include <linux/cpu.h> > #include <linux/cpufreq.h> > #include <linux/cpumask.h> > @@ -228,12 +229,17 @@ static struct cpufreq_driver scmi_cpufreq_driver = { > static int scmi_cpufreq_probe(struct scmi_device *sdev) > { > int ret; > + struct device *dev = &sdev->dev; > > handle = sdev->handle; > > if (!handle || !handle->perf_ops) > return -ENODEV; > > + /* dummy clock provider as needed by OPP if clocks property is used */ > + if (of_find_property(dev->of_node, "#clock-cells", NULL)) > + devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, NULL); > + > ret = cpufreq_register_driver(&scmi_cpufreq_driver); > if (ret) { > dev_err(&sdev->dev, "%s: registering cpufreq failed, err: %d\n", For 5.10-rc. Acked-by: Viresh Kumar <viresh.kumar@linaro.org> -- viresh
On Tue, Nov 10, 2020 at 04:54:14PM +0530, Viresh Kumar wrote: > On 10-11-20, 11:10, Sudeep Holla wrote: > > Commit dd461cd9183f ("opp: Allow dev_pm_opp_get_opp_table() to return > > -EPROBE_DEFER") handles -EPROBE_DEFER for the clock/interconnects within > > _allocate_opp_table() which is called from dev_pm_opp_add and it > > now propagates the error back to the caller. > > > > SCMI performance domain re-used clock bindings to keep it simple. However > > with the above mentioned change, if clock property is present in a device > > node, opps fails to get added with below errors until clk_get succeeds. > > > > cpu0: failed to add opp 450000000Hz > > cpu0: failed to add opps to the device > > ....(errors on cpu1-cpu4) > > cpu5: failed to add opp 450000000Hz > > cpu5: failed to add opps to the device > > > > So, in order to fix the issue, we need to register dummy clock provider. > > With the dummy clock provider, clk_get returns NULL(no errors!), then opp > > core proceeds to add OPPs for the CPUs. > > > > Cc: Rafael J. Wysocki <rjw@rjwysocki.net> > > Cc: Viresh Kumar <viresh.kumar@linaro.org> > > Fixes: dd461cd9183f ("opp: Allow dev_pm_opp_get_opp_table() to return -EPROBE_DEFER") > > Signed-off-by: Sudeep Holla <sudeep.holla@arm.com> > > --- > > drivers/cpufreq/scmi-cpufreq.c | 6 ++++++ > > 1 file changed, 6 insertions(+) > > > > diff --git a/drivers/cpufreq/scmi-cpufreq.c b/drivers/cpufreq/scmi-cpufreq.c > > index e855e8612a67..78318508a6d6 100644 > > --- a/drivers/cpufreq/scmi-cpufreq.c > > +++ b/drivers/cpufreq/scmi-cpufreq.c > > @@ -8,6 +8,7 @@ > > > > #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt > > > > +#include <linux/clk-provider.h> > > #include <linux/cpu.h> > > #include <linux/cpufreq.h> > > #include <linux/cpumask.h> > > @@ -228,12 +229,17 @@ static struct cpufreq_driver scmi_cpufreq_driver = { > > static int scmi_cpufreq_probe(struct scmi_device *sdev) > > { > > int ret; > > + struct device *dev = &sdev->dev; > > > > handle = sdev->handle; > > > > if (!handle || !handle->perf_ops) > > return -ENODEV; > > > > + /* dummy clock provider as needed by OPP if clocks property is used */ > > + if (of_find_property(dev->of_node, "#clock-cells", NULL)) > > + devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, NULL); > > + > > ret = cpufreq_register_driver(&scmi_cpufreq_driver); > > if (ret) { > > dev_err(&sdev->dev, "%s: registering cpufreq failed, err: %d\n", > > For 5.10-rc. > > Acked-by: Viresh Kumar <viresh.kumar@linaro.org> > Thanks Viresh, I assume Rafael will take this directly as fix for v5.10 -- Regards, Sudeep
On 10-11-20, 11:10, Sudeep Holla wrote: > Commit dd461cd9183f ("opp: Allow dev_pm_opp_get_opp_table() to return > -EPROBE_DEFER") handles -EPROBE_DEFER for the clock/interconnects within > _allocate_opp_table() which is called from dev_pm_opp_add and it > now propagates the error back to the caller. > > SCMI performance domain re-used clock bindings to keep it simple. However > with the above mentioned change, if clock property is present in a device > node, opps fails to get added with below errors until clk_get succeeds. > > cpu0: failed to add opp 450000000Hz > cpu0: failed to add opps to the device > ....(errors on cpu1-cpu4) > cpu5: failed to add opp 450000000Hz > cpu5: failed to add opps to the device > > So, in order to fix the issue, we need to register dummy clock provider. > With the dummy clock provider, clk_get returns NULL(no errors!), then opp > core proceeds to add OPPs for the CPUs. > > Cc: Rafael J. Wysocki <rjw@rjwysocki.net> > Cc: Viresh Kumar <viresh.kumar@linaro.org> > Fixes: dd461cd9183f ("opp: Allow dev_pm_opp_get_opp_table() to return -EPROBE_DEFER") > Signed-off-by: Sudeep Holla <sudeep.holla@arm.com> > --- > drivers/cpufreq/scmi-cpufreq.c | 6 ++++++ > 1 file changed, 6 insertions(+) Applied. Thanks. -- viresh
diff --git a/drivers/cpufreq/scmi-cpufreq.c b/drivers/cpufreq/scmi-cpufreq.c index e855e8612a67..78318508a6d6 100644 --- a/drivers/cpufreq/scmi-cpufreq.c +++ b/drivers/cpufreq/scmi-cpufreq.c @@ -8,6 +8,7 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +#include <linux/clk-provider.h> #include <linux/cpu.h> #include <linux/cpufreq.h> #include <linux/cpumask.h> @@ -228,12 +229,17 @@ static struct cpufreq_driver scmi_cpufreq_driver = { static int scmi_cpufreq_probe(struct scmi_device *sdev) { int ret; + struct device *dev = &sdev->dev; handle = sdev->handle; if (!handle || !handle->perf_ops) return -ENODEV; + /* dummy clock provider as needed by OPP if clocks property is used */ + if (of_find_property(dev->of_node, "#clock-cells", NULL)) + devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, NULL); + ret = cpufreq_register_driver(&scmi_cpufreq_driver); if (ret) { dev_err(&sdev->dev, "%s: registering cpufreq failed, err: %d\n",
Commit dd461cd9183f ("opp: Allow dev_pm_opp_get_opp_table() to return -EPROBE_DEFER") handles -EPROBE_DEFER for the clock/interconnects within _allocate_opp_table() which is called from dev_pm_opp_add and it now propagates the error back to the caller. SCMI performance domain re-used clock bindings to keep it simple. However with the above mentioned change, if clock property is present in a device node, opps fails to get added with below errors until clk_get succeeds. cpu0: failed to add opp 450000000Hz cpu0: failed to add opps to the device ....(errors on cpu1-cpu4) cpu5: failed to add opp 450000000Hz cpu5: failed to add opps to the device So, in order to fix the issue, we need to register dummy clock provider. With the dummy clock provider, clk_get returns NULL(no errors!), then opp core proceeds to add OPPs for the CPUs. Cc: Rafael J. Wysocki <rjw@rjwysocki.net> Cc: Viresh Kumar <viresh.kumar@linaro.org> Fixes: dd461cd9183f ("opp: Allow dev_pm_opp_get_opp_table() to return -EPROBE_DEFER") Signed-off-by: Sudeep Holla <sudeep.holla@arm.com> --- drivers/cpufreq/scmi-cpufreq.c | 6 ++++++ 1 file changed, 6 insertions(+) -- 2.25.1