mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge branch 'devicetree/next-overlay' into devicetree/next
Conflicts: drivers/of/testcase-data/testcases.dts
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
A DT changeset is a method which allows one to apply changes
|
||||
in the live tree in such a way that either the full set of changes
|
||||
will be applied, or none of them will be. If an error occurs partway
|
||||
through applying the changeset, then the tree will be rolled back to the
|
||||
previous state. A changeset can also be removed after it has been
|
||||
applied.
|
||||
|
||||
When a changeset is applied, all of the changes get applied to the tree
|
||||
at once before emitting OF_RECONFIG notifiers. This is so that the
|
||||
receiver sees a complete and consistent state of the tree when it
|
||||
receives the notifier.
|
||||
|
||||
The sequence of a changeset is as follows.
|
||||
|
||||
1. of_changeset_init() - initializes a changeset
|
||||
|
||||
2. A number of DT tree change calls, of_changeset_attach_node(),
|
||||
of_changeset_detach_node(), of_changeset_add_property(),
|
||||
of_changeset_remove_property, of_changeset_update_property() to prepare
|
||||
a set of changes. No changes to the active tree are made at this point.
|
||||
All the change operations are recorded in the of_changeset 'entries'
|
||||
list.
|
||||
|
||||
3. mutex_lock(of_mutex) - starts a changeset; The global of_mutex
|
||||
ensures there can only be one editor at a time.
|
||||
|
||||
4. of_changeset_apply() - Apply the changes to the tree. Either the
|
||||
entire changeset will get applied, or if there is an error the tree will
|
||||
be restored to the previous state
|
||||
|
||||
5. mutex_unlock(of_mutex) - All operations complete, release the mutex
|
||||
|
||||
If a successfully applied changeset needs to be removed, it can be done
|
||||
with the following sequence.
|
||||
|
||||
1. mutex_lock(of_mutex)
|
||||
|
||||
2. of_changeset_revert()
|
||||
|
||||
3. mutex_unlock(of_mutex)
|
||||
@@ -821,76 +821,6 @@ int cpu_to_chip_id(int cpu)
|
||||
}
|
||||
EXPORT_SYMBOL(cpu_to_chip_id);
|
||||
|
||||
#ifdef CONFIG_PPC_PSERIES
|
||||
/*
|
||||
* Fix up the uninitialized fields in a new device node:
|
||||
* name, type and pci-specific fields
|
||||
*/
|
||||
|
||||
static int of_finish_dynamic_node(struct device_node *node)
|
||||
{
|
||||
struct device_node *parent = of_get_parent(node);
|
||||
int err = 0;
|
||||
const phandle *ibm_phandle;
|
||||
|
||||
node->name = of_get_property(node, "name", NULL);
|
||||
node->type = of_get_property(node, "device_type", NULL);
|
||||
|
||||
if (!node->name)
|
||||
node->name = "<NULL>";
|
||||
if (!node->type)
|
||||
node->type = "<NULL>";
|
||||
|
||||
if (!parent) {
|
||||
err = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* We don't support that function on PowerMac, at least
|
||||
* not yet
|
||||
*/
|
||||
if (machine_is(powermac))
|
||||
return -ENODEV;
|
||||
|
||||
/* fix up new node's phandle field */
|
||||
if ((ibm_phandle = of_get_property(node, "ibm,phandle", NULL)))
|
||||
node->phandle = *ibm_phandle;
|
||||
|
||||
out:
|
||||
of_node_put(parent);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int prom_reconfig_notifier(struct notifier_block *nb,
|
||||
unsigned long action, void *node)
|
||||
{
|
||||
int err;
|
||||
|
||||
switch (action) {
|
||||
case OF_RECONFIG_ATTACH_NODE:
|
||||
err = of_finish_dynamic_node(node);
|
||||
if (err < 0)
|
||||
printk(KERN_ERR "finish_node returned %d\n", err);
|
||||
break;
|
||||
default:
|
||||
err = 0;
|
||||
break;
|
||||
}
|
||||
return notifier_from_errno(err);
|
||||
}
|
||||
|
||||
static struct notifier_block prom_reconfig_nb = {
|
||||
.notifier_call = prom_reconfig_notifier,
|
||||
.priority = 10, /* This one needs to run first */
|
||||
};
|
||||
|
||||
static int __init prom_reconfig_setup(void)
|
||||
{
|
||||
return of_reconfig_notifier_register(&prom_reconfig_nb);
|
||||
}
|
||||
__initcall(prom_reconfig_setup);
|
||||
#endif
|
||||
|
||||
bool arch_match_cpu_phys_id(int cpu, u64 phys_id)
|
||||
{
|
||||
return (int)phys_id == get_hard_smp_processor_id(cpu);
|
||||
|
||||
@@ -194,7 +194,7 @@ static int pseries_update_drconf_memory(struct of_prop_reconfig *pr)
|
||||
if (!memblock_size)
|
||||
return -EINVAL;
|
||||
|
||||
p = (u32 *)of_get_property(pr->dn, "ibm,dynamic-memory", NULL);
|
||||
p = (u32 *) pr->old_prop->value;
|
||||
if (!p)
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
@@ -936,28 +936,14 @@ static int nx842_OF_upd(struct property *new_prop)
|
||||
goto error_out;
|
||||
}
|
||||
|
||||
/* Set ptr to new property if provided */
|
||||
if (new_prop) {
|
||||
/* Single property */
|
||||
if (!strncmp(new_prop->name, "status", new_prop->length)) {
|
||||
status = new_prop;
|
||||
|
||||
} else if (!strncmp(new_prop->name, "ibm,max-sg-len",
|
||||
new_prop->length)) {
|
||||
maxsglen = new_prop;
|
||||
|
||||
} else if (!strncmp(new_prop->name, "ibm,max-sync-cop",
|
||||
new_prop->length)) {
|
||||
maxsyncop = new_prop;
|
||||
|
||||
} else {
|
||||
/*
|
||||
* Skip the update, the property being updated
|
||||
* has no impact.
|
||||
*/
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* If this is a property update, there are only certain properties that
|
||||
* we care about. Bail if it isn't in the below list
|
||||
*/
|
||||
if (new_prop && (strncmp(new_prop->name, "status", new_prop->length) ||
|
||||
strncmp(new_prop->name, "ibm,max-sg-len", new_prop->length) ||
|
||||
strncmp(new_prop->name, "ibm,max-sync-cop", new_prop->length)))
|
||||
goto out;
|
||||
|
||||
/* Perform property updates */
|
||||
ret = nx842_OF_upd_status(new_devdata, status);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
obj-y = base.o device.o platform.o
|
||||
obj-$(CONFIG_OF_DYNAMIC) += dynamic.o
|
||||
obj-$(CONFIG_OF_FLATTREE) += fdt.o
|
||||
obj-$(CONFIG_OF_EARLY_FLATTREE) += fdt_address.o
|
||||
obj-$(CONFIG_OF_PROMTREE) += pdt.o
|
||||
|
||||
+110
-321
File diff suppressed because it is too large
Load Diff
+2
-2
@@ -160,7 +160,7 @@ void of_device_uevent(struct device *dev, struct kobj_uevent_env *env)
|
||||
add_uevent_var(env, "OF_COMPATIBLE_N=%d", seen);
|
||||
|
||||
seen = 0;
|
||||
mutex_lock(&of_aliases_mutex);
|
||||
mutex_lock(&of_mutex);
|
||||
list_for_each_entry(app, &aliases_lookup, link) {
|
||||
if (dev->of_node == app->np) {
|
||||
add_uevent_var(env, "OF_ALIAS_%d=%s", seen,
|
||||
@@ -168,7 +168,7 @@ void of_device_uevent(struct device *dev, struct kobj_uevent_env *env)
|
||||
seen++;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&of_aliases_mutex);
|
||||
mutex_unlock(&of_mutex);
|
||||
}
|
||||
|
||||
int of_device_uevent_modalias(struct device *dev, struct kobj_uevent_env *env)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+58
-1
@@ -31,6 +31,63 @@ struct alias_prop {
|
||||
char stem[0];
|
||||
};
|
||||
|
||||
extern struct mutex of_aliases_mutex;
|
||||
extern struct mutex of_mutex;
|
||||
extern struct list_head aliases_lookup;
|
||||
extern struct kset *of_kset;
|
||||
|
||||
|
||||
static inline struct device_node *kobj_to_device_node(struct kobject *kobj)
|
||||
{
|
||||
return container_of(kobj, struct device_node, kobj);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_OF_DYNAMIC)
|
||||
extern int of_property_notify(int action, struct device_node *np,
|
||||
struct property *prop, struct property *old_prop);
|
||||
extern void of_node_release(struct kobject *kobj);
|
||||
#else /* CONFIG_OF_DYNAMIC */
|
||||
static inline int of_property_notify(int action, struct device_node *np,
|
||||
struct property *prop, struct property *old_prop)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_OF_DYNAMIC */
|
||||
|
||||
/**
|
||||
* General utilities for working with live trees.
|
||||
*
|
||||
* All functions with two leading underscores operate
|
||||
* without taking node references, so you either have to
|
||||
* own the devtree lock or work on detached trees only.
|
||||
*/
|
||||
struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags);
|
||||
struct device_node *__of_node_alloc(const char *full_name, gfp_t allocflags);
|
||||
|
||||
extern const void *__of_get_property(const struct device_node *np,
|
||||
const char *name, int *lenp);
|
||||
extern int __of_add_property(struct device_node *np, struct property *prop);
|
||||
extern int __of_add_property_sysfs(struct device_node *np,
|
||||
struct property *prop);
|
||||
extern int __of_remove_property(struct device_node *np, struct property *prop);
|
||||
extern void __of_remove_property_sysfs(struct device_node *np,
|
||||
struct property *prop);
|
||||
extern int __of_update_property(struct device_node *np,
|
||||
struct property *newprop, struct property **oldprop);
|
||||
extern void __of_update_property_sysfs(struct device_node *np,
|
||||
struct property *newprop, struct property *oldprop);
|
||||
|
||||
extern void __of_attach_node(struct device_node *np);
|
||||
extern int __of_attach_node_sysfs(struct device_node *np);
|
||||
extern void __of_detach_node(struct device_node *np);
|
||||
extern void __of_detach_node_sysfs(struct device_node *np);
|
||||
|
||||
/* iterators for transactions, used for overlays */
|
||||
/* forward iterator */
|
||||
#define for_each_transaction_entry(_oft, _te) \
|
||||
list_for_each_entry(_te, &(_oft)->te_list, node)
|
||||
|
||||
/* reverse iterator */
|
||||
#define for_each_transaction_entry_reverse(_oft, _te) \
|
||||
list_for_each_entry_reverse(_te, &(_oft)->te_list, node)
|
||||
|
||||
#endif /* _LINUX_OF_PRIVATE_H */
|
||||
|
||||
+9
-23
@@ -422,6 +422,7 @@ static int of_platform_bus_create(struct device_node *bus,
|
||||
break;
|
||||
}
|
||||
}
|
||||
of_node_set_flag(bus, OF_POPULATED_BUS);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -508,19 +509,13 @@ EXPORT_SYMBOL_GPL(of_platform_populate);
|
||||
|
||||
static int of_platform_device_destroy(struct device *dev, void *data)
|
||||
{
|
||||
bool *children_left = data;
|
||||
|
||||
/* Do not touch devices not populated from the device tree */
|
||||
if (!dev->of_node || !of_node_check_flag(dev->of_node, OF_POPULATED)) {
|
||||
*children_left = true;
|
||||
if (!dev->of_node || !of_node_check_flag(dev->of_node, OF_POPULATED))
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Recurse, but don't touch this device if it has any children left */
|
||||
if (of_platform_depopulate(dev) != 0) {
|
||||
*children_left = true;
|
||||
return 0;
|
||||
}
|
||||
/* Recurse for any nodes that were treated as busses */
|
||||
if (of_node_check_flag(dev->of_node, OF_POPULATED_BUS))
|
||||
device_for_each_child(dev, NULL, of_platform_device_destroy);
|
||||
|
||||
if (dev->bus == &platform_bus_type)
|
||||
platform_device_unregister(to_platform_device(dev));
|
||||
@@ -528,19 +523,15 @@ static int of_platform_device_destroy(struct device *dev, void *data)
|
||||
else if (dev->bus == &amba_bustype)
|
||||
amba_device_unregister(to_amba_device(dev));
|
||||
#endif
|
||||
else {
|
||||
*children_left = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
of_node_clear_flag(dev->of_node, OF_POPULATED);
|
||||
|
||||
of_node_clear_flag(dev->of_node, OF_POPULATED_BUS);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* of_platform_depopulate() - Remove devices populated from device tree
|
||||
* @parent: device which childred will be removed
|
||||
* @parent: device which children will be removed
|
||||
*
|
||||
* Complementary to of_platform_populate(), this function removes children
|
||||
* of the given device (and, recurrently, their children) that have been
|
||||
@@ -550,14 +541,9 @@ static int of_platform_device_destroy(struct device *dev, void *data)
|
||||
* Returns 0 when all children devices have been removed or
|
||||
* -EBUSY when some children remained.
|
||||
*/
|
||||
int of_platform_depopulate(struct device *parent)
|
||||
void of_platform_depopulate(struct device *parent)
|
||||
{
|
||||
bool children_left = false;
|
||||
|
||||
device_for_each_child(parent, &children_left,
|
||||
of_platform_device_destroy);
|
||||
|
||||
return children_left ? -EBUSY : 0;
|
||||
device_for_each_child(parent, NULL, of_platform_device_destroy);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_platform_depopulate);
|
||||
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/device.h>
|
||||
|
||||
#include "of_private.h"
|
||||
|
||||
static struct selftest_results {
|
||||
int passed;
|
||||
int failed;
|
||||
@@ -271,6 +273,81 @@ static void __init of_selftest_property_match_string(void)
|
||||
selftest(rc == -EILSEQ, "unterminated string; rc=%i", rc);
|
||||
}
|
||||
|
||||
#define propcmp(p1, p2) (((p1)->length == (p2)->length) && \
|
||||
(p1)->value && (p2)->value && \
|
||||
!memcmp((p1)->value, (p2)->value, (p1)->length) && \
|
||||
!strcmp((p1)->name, (p2)->name))
|
||||
static void __init of_selftest_property_copy(void)
|
||||
{
|
||||
#ifdef CONFIG_OF_DYNAMIC
|
||||
struct property p1 = { .name = "p1", .length = 0, .value = "" };
|
||||
struct property p2 = { .name = "p2", .length = 5, .value = "abcd" };
|
||||
struct property *new;
|
||||
|
||||
new = __of_prop_dup(&p1, GFP_KERNEL);
|
||||
selftest(new && propcmp(&p1, new), "empty property didn't copy correctly\n");
|
||||
kfree(new->value);
|
||||
kfree(new->name);
|
||||
kfree(new);
|
||||
|
||||
new = __of_prop_dup(&p2, GFP_KERNEL);
|
||||
selftest(new && propcmp(&p2, new), "non-empty property didn't copy correctly\n");
|
||||
kfree(new->value);
|
||||
kfree(new->name);
|
||||
kfree(new);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __init of_selftest_changeset(void)
|
||||
{
|
||||
#ifdef CONFIG_OF_DYNAMIC
|
||||
struct property *ppadd, padd = { .name = "prop-add", .length = 0, .value = "" };
|
||||
struct property *ppupdate, pupdate = { .name = "prop-update", .length = 5, .value = "abcd" };
|
||||
struct property *ppremove;
|
||||
struct device_node *n1, *n2, *n21, *nremove, *parent;
|
||||
struct of_changeset chgset;
|
||||
|
||||
of_changeset_init(&chgset);
|
||||
n1 = __of_node_alloc("/testcase-data/changeset/n1", GFP_KERNEL);
|
||||
selftest(n1, "testcase setup failure\n");
|
||||
n2 = __of_node_alloc("/testcase-data/changeset/n2", GFP_KERNEL);
|
||||
selftest(n2, "testcase setup failure\n");
|
||||
n21 = __of_node_alloc("/testcase-data/changeset/n2/n21", GFP_KERNEL);
|
||||
selftest(n21, "testcase setup failure %p\n", n21);
|
||||
nremove = of_find_node_by_path("/testcase-data/changeset/node-remove");
|
||||
selftest(nremove, "testcase setup failure\n");
|
||||
ppadd = __of_prop_dup(&padd, GFP_KERNEL);
|
||||
selftest(ppadd, "testcase setup failure\n");
|
||||
ppupdate = __of_prop_dup(&pupdate, GFP_KERNEL);
|
||||
selftest(ppupdate, "testcase setup failure\n");
|
||||
parent = nremove->parent;
|
||||
n1->parent = parent;
|
||||
n2->parent = parent;
|
||||
n21->parent = n2;
|
||||
n2->child = n21;
|
||||
ppremove = of_find_property(parent, "prop-remove", NULL);
|
||||
selftest(ppremove, "failed to find removal prop");
|
||||
|
||||
of_changeset_init(&chgset);
|
||||
selftest(!of_changeset_attach_node(&chgset, n1), "fail attach n1\n");
|
||||
selftest(!of_changeset_attach_node(&chgset, n2), "fail attach n2\n");
|
||||
selftest(!of_changeset_detach_node(&chgset, nremove), "fail remove node\n");
|
||||
selftest(!of_changeset_attach_node(&chgset, n21), "fail attach n21\n");
|
||||
selftest(!of_changeset_add_property(&chgset, parent, ppadd), "fail add prop\n");
|
||||
selftest(!of_changeset_update_property(&chgset, parent, ppupdate), "fail update prop\n");
|
||||
selftest(!of_changeset_remove_property(&chgset, parent, ppremove), "fail remove prop\n");
|
||||
mutex_lock(&of_mutex);
|
||||
selftest(!of_changeset_apply(&chgset), "apply failed\n");
|
||||
mutex_unlock(&of_mutex);
|
||||
|
||||
mutex_lock(&of_mutex);
|
||||
selftest(!of_changeset_revert(&chgset), "revert failed\n");
|
||||
mutex_unlock(&of_mutex);
|
||||
|
||||
of_changeset_destroy(&chgset);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __init of_selftest_parse_interrupts(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
@@ -685,6 +762,8 @@ static int __init of_selftest(void)
|
||||
of_selftest_dynamic();
|
||||
of_selftest_parse_phandle_with_args();
|
||||
of_selftest_property_match_string();
|
||||
of_selftest_property_copy();
|
||||
of_selftest_changeset();
|
||||
of_selftest_parse_interrupts();
|
||||
of_selftest_parse_interrupts_extended();
|
||||
of_selftest_match_node();
|
||||
|
||||
@@ -1,4 +1,14 @@
|
||||
/dts-v1/;
|
||||
/ {
|
||||
testcase-data {
|
||||
changeset {
|
||||
prop-update = "hello";
|
||||
prop-remove = "world";
|
||||
node-remove {
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
#include "tests-phandle.dtsi"
|
||||
#include "tests-interrupts.dtsi"
|
||||
#include "tests-match.dtsi"
|
||||
|
||||
+78
-2
@@ -74,8 +74,6 @@ struct of_phandle_args {
|
||||
uint32_t args[MAX_PHANDLE_ARGS];
|
||||
};
|
||||
|
||||
extern int of_node_add(struct device_node *node);
|
||||
|
||||
/* initialize a node */
|
||||
extern struct kobj_type of_node_ktype;
|
||||
static inline void of_node_init(struct device_node *node)
|
||||
@@ -205,6 +203,7 @@ static inline unsigned long of_read_ulong(const __be32 *cell, int size)
|
||||
#define OF_DYNAMIC 1 /* node and properties were allocated via kmalloc */
|
||||
#define OF_DETACHED 2 /* node has been detached from the device tree */
|
||||
#define OF_POPULATED 3 /* device already created for the node */
|
||||
#define OF_POPULATED_BUS 4 /* of_platform_populate recursed to children of this node */
|
||||
|
||||
#define OF_IS_DYNAMIC(x) test_bit(OF_DYNAMIC, &x->_flags)
|
||||
#define OF_MARK_DYNAMIC(x) set_bit(OF_DYNAMIC, &x->_flags)
|
||||
@@ -323,6 +322,7 @@ extern int of_update_property(struct device_node *np, struct property *newprop);
|
||||
struct of_prop_reconfig {
|
||||
struct device_node *dn;
|
||||
struct property *prop;
|
||||
struct property *old_prop;
|
||||
};
|
||||
|
||||
extern int of_reconfig_notifier_register(struct notifier_block *);
|
||||
@@ -787,4 +787,80 @@ typedef void (*of_init_fn_1)(struct device_node *);
|
||||
#define OF_DECLARE_2(table, name, compat, fn) \
|
||||
_OF_DECLARE(table, name, compat, fn, of_init_fn_2)
|
||||
|
||||
/**
|
||||
* struct of_changeset_entry - Holds a changeset entry
|
||||
*
|
||||
* @node: list_head for the log list
|
||||
* @action: notifier action
|
||||
* @np: pointer to the device node affected
|
||||
* @prop: pointer to the property affected
|
||||
* @old_prop: hold a pointer to the original property
|
||||
*
|
||||
* Every modification of the device tree during a changeset
|
||||
* is held in a list of of_changeset_entry structures.
|
||||
* That way we can recover from a partial application, or we can
|
||||
* revert the changeset
|
||||
*/
|
||||
struct of_changeset_entry {
|
||||
struct list_head node;
|
||||
unsigned long action;
|
||||
struct device_node *np;
|
||||
struct property *prop;
|
||||
struct property *old_prop;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct of_changeset - changeset tracker structure
|
||||
*
|
||||
* @entries: list_head for the changeset entries
|
||||
*
|
||||
* changesets are a convenient way to apply bulk changes to the
|
||||
* live tree. In case of an error, changes are rolled-back.
|
||||
* changesets live on after initial application, and if not
|
||||
* destroyed after use, they can be reverted in one single call.
|
||||
*/
|
||||
struct of_changeset {
|
||||
struct list_head entries;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_OF_DYNAMIC
|
||||
extern void of_changeset_init(struct of_changeset *ocs);
|
||||
extern void of_changeset_destroy(struct of_changeset *ocs);
|
||||
extern int of_changeset_apply(struct of_changeset *ocs);
|
||||
extern int of_changeset_revert(struct of_changeset *ocs);
|
||||
extern int of_changeset_action(struct of_changeset *ocs,
|
||||
unsigned long action, struct device_node *np,
|
||||
struct property *prop);
|
||||
|
||||
static inline int of_changeset_attach_node(struct of_changeset *ocs,
|
||||
struct device_node *np)
|
||||
{
|
||||
return of_changeset_action(ocs, OF_RECONFIG_ATTACH_NODE, np, NULL);
|
||||
}
|
||||
|
||||
static inline int of_changeset_detach_node(struct of_changeset *ocs,
|
||||
struct device_node *np)
|
||||
{
|
||||
return of_changeset_action(ocs, OF_RECONFIG_DETACH_NODE, np, NULL);
|
||||
}
|
||||
|
||||
static inline int of_changeset_add_property(struct of_changeset *ocs,
|
||||
struct device_node *np, struct property *prop)
|
||||
{
|
||||
return of_changeset_action(ocs, OF_RECONFIG_ADD_PROPERTY, np, prop);
|
||||
}
|
||||
|
||||
static inline int of_changeset_remove_property(struct of_changeset *ocs,
|
||||
struct device_node *np, struct property *prop)
|
||||
{
|
||||
return of_changeset_action(ocs, OF_RECONFIG_REMOVE_PROPERTY, np, prop);
|
||||
}
|
||||
|
||||
static inline int of_changeset_update_property(struct of_changeset *ocs,
|
||||
struct device_node *np, struct property *prop)
|
||||
{
|
||||
return of_changeset_action(ocs, OF_RECONFIG_UPDATE_PROPERTY, np, prop);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_OF_H */
|
||||
|
||||
@@ -72,7 +72,7 @@ extern int of_platform_populate(struct device_node *root,
|
||||
const struct of_device_id *matches,
|
||||
const struct of_dev_auxdata *lookup,
|
||||
struct device *parent);
|
||||
extern int of_platform_depopulate(struct device *parent);
|
||||
extern void of_platform_depopulate(struct device *parent);
|
||||
#else
|
||||
static inline int of_platform_populate(struct device_node *root,
|
||||
const struct of_device_id *matches,
|
||||
@@ -81,10 +81,7 @@ static inline int of_platform_populate(struct device_node *root,
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
static inline int of_platform_depopulate(struct device *parent)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
static inline void of_platform_depopulate(struct device *parent) { }
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_OF_PLATFORM_H */
|
||||
|
||||
Reference in New Issue
Block a user