@@ -845,7 +845,7 @@ static int cpu_cache_sysfs_init(unsigned int cpu)
if (per_cpu_cacheinfo(cpu) == NULL)
return -ENOENT;
- per_cpu_cache_dev(cpu) = cpu_device_create(dev, NULL, NULL, "cache");
+ per_cpu_cache_dev(cpu) = cpu_device_create(dev, NULL, NULL, NULL, "cache");
if (IS_ERR(per_cpu_cache_dev(cpu)))
return PTR_ERR(per_cpu_cache_dev(cpu));
@@ -882,7 +882,9 @@ static int cache_add_dev(unsigned int cpu)
if (this_leaf->type == CACHE_TYPE_NOCACHE)
break;
cache_groups = cache_get_attribute_groups(this_leaf);
- ci_dev = cpu_device_create(parent, this_leaf, cache_groups,
+ ci_dev = cpu_device_create(parent, this_leaf,
+ NULL,
+ cache_groups,
"index%1u", i);
if (IS_ERR(ci_dev)) {
rc = PTR_ERR(ci_dev);
@@ -16,6 +16,7 @@
#include <linux/percpu.h>
#include <linux/acpi.h>
#include <linux/of.h>
+#include <linux/of_device.h>
#include <linux/cpufeature.h>
#include <linux/tick.h>
#include <linux/pm_qos.h>
@@ -28,7 +29,11 @@ static DEFINE_PER_CPU(struct device *, cpu_sys_devices);
static int cpu_subsys_match(struct device *dev, struct device_driver *drv)
{
- /* ACPI style match is the only one that may succeed. */
+ /* Attempt an OF style match first */
+ if (of_driver_match_device(dev, drv))
+ return 1;
+
+ /* Then try ACPI style match */
if (acpi_driver_match_device(dev, drv))
return 1;
@@ -428,12 +433,14 @@ EXPORT_SYMBOL_GPL(get_cpu_device);
static void device_create_release(struct device *dev)
{
+ of_node_put(dev->of_node);
kfree(dev);
}
-__printf(4, 0)
+__printf(5, 0)
static struct device *
__cpu_device_create(struct device *parent, void *drvdata,
+ struct device_node *np,
const struct attribute_group **groups,
const char *fmt, va_list args)
{
@@ -447,6 +454,7 @@ __cpu_device_create(struct device *parent, void *drvdata,
device_initialize(dev);
dev->parent = parent;
dev->groups = groups;
+ dev->of_node = of_node_get(np);
dev->release = device_create_release;
device_set_pm_not_required(dev);
dev_set_drvdata(dev, drvdata);
@@ -467,6 +475,7 @@ __cpu_device_create(struct device *parent, void *drvdata,
}
struct device *cpu_device_create(struct device *parent, void *drvdata,
+ struct device_node *np,
const struct attribute_group **groups,
const char *fmt, ...)
{
@@ -474,7 +483,7 @@ struct device *cpu_device_create(struct device *parent, void *drvdata,
struct device *dev;
va_start(vargs, fmt);
- dev = __cpu_device_create(parent, drvdata, groups, fmt, vargs);
+ dev = __cpu_device_create(parent, drvdata, np, groups, fmt, vargs);
va_end(vargs);
return dev;
}
@@ -76,8 +76,9 @@ extern ssize_t cpu_show_spec_rstack_overflow(struct device *dev,
extern ssize_t cpu_show_gds(struct device *dev,
struct device_attribute *attr, char *buf);
-extern __printf(4, 5)
+extern __printf(5, 6)
struct device *cpu_device_create(struct device *parent, void *drvdata,
+ struct device_node *np,
const struct attribute_group **groups,
const char *fmt, ...);
extern bool arch_cpu_is_hotpluggable(int cpu);
Currently cpu_sybsys devices support only ACPI style matching. Pass DT node pointer to cpu_device_create to support OF style matching for cpu_subsys devices. Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> --- drivers/base/cacheinfo.c | 6 ++++-- drivers/base/cpu.c | 15 ++++++++++++--- include/linux/cpu.h | 3 ++- 3 files changed, 18 insertions(+), 6 deletions(-)