diff options
Diffstat (limited to 'drivers/of/selftest.c')
-rw-r--r-- | drivers/of/selftest.c | 51 |
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 | ||
296 | static 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 | |||
296 | static void __init of_selftest_parse_interrupts(void) | 346 | static 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(); |