Update the include/linux/scpi_protocol.h with the new registry calls. Switch following drivers to use the new SCPI registry layer : - drivers/clk/clk-scpi.c - drivers/cpufreq/scpi-cpufreq.c - drivers/hwmon/scpi-hwmon.c
And finally switch drivers/firmware/arm_scpi.c to use scpi_driver_register(). Signed-off-by: Neil Armstrong <narmstr...@baylibre.com> --- drivers/clk/clk-scpi.c | 18 +++++++++++------- drivers/cpufreq/scpi-cpufreq.c | 7 ++++--- drivers/firmware/arm_scpi.c | 18 +++++++++--------- drivers/hwmon/scpi-hwmon.c | 6 +++--- include/linux/scpi_protocol.h | 33 +++++++++++++++++++++++++++++++-- 5 files changed, 58 insertions(+), 24 deletions(-) diff --git a/drivers/clk/clk-scpi.c b/drivers/clk/clk-scpi.c index 6962ee5..18ffaf5 100644 --- a/drivers/clk/clk-scpi.c +++ b/drivers/clk/clk-scpi.c @@ -148,7 +148,8 @@ static const struct of_device_id scpi_clk_match[] = { static struct clk * scpi_clk_ops_init(struct device *dev, const struct of_device_id *match, - struct scpi_clk *sclk, const char *name) + struct scpi_clk *sclk, const char *name, + struct scpi_ops *scpi_ops) { struct clk_init_data init; struct clk *clk; @@ -159,7 +160,7 @@ scpi_clk_ops_init(struct device *dev, const struct of_device_id *match, init.num_parents = 0; init.ops = match->data; sclk->hw.init = &init; - sclk->scpi_ops = get_scpi_ops(); + sclk->scpi_ops = scpi_ops; if (init.ops == &scpi_dvfs_ops) { sclk->info = sclk->scpi_ops->dvfs_get_info(sclk->id); @@ -200,7 +201,8 @@ scpi_of_clk_src_get(struct of_phandle_args *clkspec, void *data) } static int scpi_clk_add(struct device *dev, struct device_node *np, - const struct of_device_id *match) + const struct of_device_id *match, + struct scpi_ops *scpi_ops) { struct clk **clks; int idx, count; @@ -249,7 +251,7 @@ static int scpi_clk_add(struct device *dev, struct device_node *np, sclk->id = val; - clks[idx] = scpi_clk_ops_init(dev, match, sclk, name); + clks[idx] = scpi_clk_ops_init(dev, match, sclk, name, scpi_ops); if (IS_ERR_OR_NULL(clks[idx])) dev_err(dev, "failed to register clock '%s'\n", name); else @@ -281,15 +283,17 @@ static int scpi_clocks_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct device_node *child, *np = dev->of_node; const struct of_device_id *match; + struct scpi_ops *scpi_ops; - if (!get_scpi_ops()) - return -ENXIO; + scpi_ops = of_scpi_ops_get(of_get_parent(np)); + if (IS_ERR(scpi_ops)) + return PTR_ERR(scpi_ops); for_each_available_child_of_node(np, child) { match = of_match_node(scpi_clk_match, child); if (!match) continue; - ret = scpi_clk_add(dev, child, match); + ret = scpi_clk_add(dev, child, match, scpi_ops); if (ret) { scpi_clocks_remove(pdev); of_node_put(child); diff --git a/drivers/cpufreq/scpi-cpufreq.c b/drivers/cpufreq/scpi-cpufreq.c index e8a7bf5..158f1d80 100644 --- a/drivers/cpufreq/scpi-cpufreq.c +++ b/drivers/cpufreq/scpi-cpufreq.c @@ -25,6 +25,7 @@ #include <linux/pm_opp.h> #include <linux/scpi_protocol.h> #include <linux/types.h> +#include <linux/of.h> #include "arm_big_little.h" @@ -88,9 +89,9 @@ static struct cpufreq_arm_bL_ops scpi_cpufreq_ops = { static int scpi_cpufreq_probe(struct platform_device *pdev) { - scpi_ops = get_scpi_ops(); - if (!scpi_ops) - return -EIO; + scpi_ops = of_scpi_ops_get(of_get_parent(pdev->dev.of_node)); + if (IS_ERR(scpi_ops)) + return PTR_ERR(scpi_ops); return bL_cpufreq_register(&scpi_cpufreq_ops); } diff --git a/drivers/firmware/arm_scpi.c b/drivers/firmware/arm_scpi.c index 7e3e595..00fc849 100644 --- a/drivers/firmware/arm_scpi.c +++ b/drivers/firmware/arm_scpi.c @@ -162,9 +162,9 @@ struct scpi_drvinfo { u32 firmware_version; int num_chans; atomic_t next_chan; - struct scpi_ops *scpi_ops; struct scpi_chan *channels; struct scpi_dvfs_info *dvfs[MAX_DVFS_DOMAINS]; + struct scpi_driver drv; }; /* @@ -526,7 +526,7 @@ static int scpi_sensor_get_info(u16 sensor_id, struct scpi_sensor_info *info) return ret; } -int scpi_sensor_get_value(u16 sensor, u64 *val) +static int scpi_sensor_get_value(u16 sensor, u64 *val) { __le16 id = cpu_to_le16(sensor); struct sensor_value buf; @@ -554,12 +554,6 @@ static struct scpi_ops scpi_ops = { .sensor_get_value = scpi_sensor_get_value, }; -struct scpi_ops *get_scpi_ops(void) -{ - return scpi_info ? scpi_info->scpi_ops : NULL; -} -EXPORT_SYMBOL_GPL(get_scpi_ops); - static int scpi_init_versions(struct scpi_drvinfo *info) { int ret; @@ -743,7 +737,13 @@ err: FW_REV_MAJOR(scpi_info->firmware_version), FW_REV_MINOR(scpi_info->firmware_version), FW_REV_PATCH(scpi_info->firmware_version)); - scpi_info->scpi_ops = &scpi_ops; + + scpi_info->drv.node = dev->of_node; + scpi_info->drv.ops = &scpi_ops; + + ret = devm_scpi_driver_register(dev, &scpi_info->drv); + if (ret) + return ret; ret = sysfs_create_groups(&dev->kobj, versions_groups); if (ret) diff --git a/drivers/hwmon/scpi-hwmon.c b/drivers/hwmon/scpi-hwmon.c index 912b449..45d36d1 100644 --- a/drivers/hwmon/scpi-hwmon.c +++ b/drivers/hwmon/scpi-hwmon.c @@ -120,9 +120,9 @@ static int scpi_hwmon_probe(struct platform_device *pdev) struct scpi_sensors *scpi_sensors; int ret, idx; - scpi_ops = get_scpi_ops(); - if (!scpi_ops) - return -EPROBE_DEFER; + scpi_ops = of_scpi_ops_get(of_get_parent(dev.of_node)); + if (IS_ERR(scpi_ops)) + return PTR_ERR(scpi_ops); ret = scpi_ops->sensor_get_capability(&nr_sensors); if (ret) diff --git a/include/linux/scpi_protocol.h b/include/linux/scpi_protocol.h index 35de50a..fc27034 100644 --- a/include/linux/scpi_protocol.h +++ b/include/linux/scpi_protocol.h @@ -72,8 +72,37 @@ struct scpi_ops { int (*sensor_get_value)(u16, u64 *); }; +struct scpi_driver { + struct device_node *node; + struct scpi_ops *ops; + struct list_head list; +}; + #if IS_REACHABLE(CONFIG_ARM_SCPI_PROTOCOL) -struct scpi_ops *get_scpi_ops(void); +struct scpi_ops *of_scpi_ops_get(struct device_node *node); + +int scpi_driver_register(struct scpi_driver *drv); + +void scpi_driver_unregister(struct scpi_driver *drv); + +int devm_scpi_driver_register(struct device *dev, + struct scpi_driver *drv); #else -static inline struct scpi_ops *get_scpi_ops(void) { return NULL; } +struct scpi_ops *of_scpi_ops_get(struct device_node *node) +{ + return ERR_PTR(-ENOTSUPP); +} + +int scpi_driver_register(struct scpi_driver *drv) +{ + return -ENOTSUPP; +} + +void scpi_driver_unregister(struct scpi_driver *drv) { } + +int devm_scpi_driver_register(struct device *dev, + struct scpi_driver *drv) +{ + return -ENOTSUPP; +} #endif -- 2.7.0