aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/of/selftest.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/of/selftest.c')
-rw-r--r--drivers/of/selftest.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/drivers/of/selftest.c b/drivers/of/selftest.c
index ee2166f0f36a..04e39a183e53 100644
--- a/drivers/of/selftest.c
+++ b/drivers/of/selftest.c
@@ -293,6 +293,56 @@ static void __init of_selftest_property_copy(void)
293#endif 293#endif
294} 294}
295 295
296static void __init of_selftest_changeset(void)
297{
298#ifdef CONFIG_OF_DYNAMIC
299 struct property *ppadd, padd = { .name = "prop-add", .length = 0, .value = "" };
300 struct property *ppupdate, pupdate = { .name = "prop-update", .length = 5, .value = "abcd" };
301 struct property *ppremove;
302 struct device_node *n1, *n2, *n21, *nremove, *parent;
303 struct of_changeset chgset;
304
305 of_changeset_init(&chgset);
306 n1 = __of_node_alloc("/testcase-data/changeset/n1", GFP_KERNEL);
307 selftest(n1, "testcase setup failure\n");
308 n2 = __of_node_alloc("/testcase-data/changeset/n2", GFP_KERNEL);
309 selftest(n2, "testcase setup failure\n");
310 n21 = __of_node_alloc("/testcase-data/changeset/n2/n21", GFP_KERNEL);
311 selftest(n21, "testcase setup failure %p\n", n21);
312 nremove = of_find_node_by_path("/testcase-data/changeset/node-remove");
313 selftest(nremove, "testcase setup failure\n");
314 ppadd = __of_prop_dup(&padd, GFP_KERNEL);
315 selftest(ppadd, "testcase setup failure\n");
316 ppupdate = __of_prop_dup(&pupdate, GFP_KERNEL);
317 selftest(ppupdate, "testcase setup failure\n");
318 parent = nremove->parent;
319 n1->parent = parent;
320 n2->parent = parent;
321 n21->parent = n2;
322 n2->child = n21;
323 ppremove = of_find_property(parent, "prop-remove", NULL);
324 selftest(ppremove, "failed to find removal prop");
325
326 of_changeset_init(&chgset);
327 selftest(!of_changeset_attach_node(&chgset, n1), "fail attach n1\n");
328 selftest(!of_changeset_attach_node(&chgset, n2), "fail attach n2\n");
329 selftest(!of_changeset_detach_node(&chgset, nremove), "fail remove node\n");
330 selftest(!of_changeset_attach_node(&chgset, n21), "fail attach n21\n");
331 selftest(!of_changeset_add_property(&chgset, parent, ppadd), "fail add prop\n");
332 selftest(!of_changeset_update_property(&chgset, parent, ppupdate), "fail update prop\n");
333 selftest(!of_changeset_remove_property(&chgset, parent, ppremove), "fail remove prop\n");
334 mutex_lock(&of_mutex);
335 selftest(!of_changeset_apply(&chgset), "apply failed\n");
336 mutex_unlock(&of_mutex);
337
338 mutex_lock(&of_mutex);
339 selftest(!of_changeset_revert(&chgset), "revert failed\n");
340 mutex_unlock(&of_mutex);
341
342 of_changeset_destroy(&chgset);
343#endif
344}
345
296static void __init of_selftest_parse_interrupts(void) 346static void __init of_selftest_parse_interrupts(void)
297{ 347{
298 struct device_node *np; 348 struct device_node *np;
@@ -561,6 +611,7 @@ static int __init of_selftest(void)
561 of_selftest_parse_phandle_with_args(); 611 of_selftest_parse_phandle_with_args();
562 of_selftest_property_match_string(); 612 of_selftest_property_match_string();
563 of_selftest_property_copy(); 613 of_selftest_property_copy();
614 of_selftest_changeset();
564 of_selftest_parse_interrupts(); 615 of_selftest_parse_interrupts();
565 of_selftest_parse_interrupts_extended(); 616 of_selftest_parse_interrupts_extended();
566 of_selftest_match_node(); 617 of_selftest_match_node();