diff options
| -rw-r--r-- | drivers/of/selftest.c | 67 | ||||
| -rw-r--r-- | drivers/of/testcase-data/testcases.dtsi | 1 | ||||
| -rw-r--r-- | drivers/of/testcase-data/tests-match.dtsi | 19 |
3 files changed, 87 insertions, 0 deletions
diff --git a/drivers/of/selftest.c b/drivers/of/selftest.c index e21012bde639..6643d1920985 100644 --- a/drivers/of/selftest.c +++ b/drivers/of/selftest.c | |||
| @@ -300,6 +300,72 @@ static void __init of_selftest_parse_interrupts_extended(void) | |||
| 300 | of_node_put(np); | 300 | of_node_put(np); |
| 301 | } | 301 | } |
| 302 | 302 | ||
| 303 | static struct of_device_id match_node_table[] = { | ||
| 304 | { .data = "A", .name = "name0", }, /* Name alone is lowest priority */ | ||
| 305 | { .data = "B", .type = "type1", }, /* followed by type alone */ | ||
| 306 | |||
| 307 | { .data = "Ca", .name = "name2", .type = "type1", }, /* followed by both together */ | ||
| 308 | { .data = "Cb", .name = "name2", }, /* Only match when type doesn't match */ | ||
| 309 | { .data = "Cc", .name = "name2", .type = "type2", }, | ||
| 310 | |||
| 311 | { .data = "E", .compatible = "compat3" }, | ||
| 312 | { .data = "G", .compatible = "compat2", }, | ||
| 313 | { .data = "H", .compatible = "compat2", .name = "name5", }, | ||
| 314 | { .data = "I", .compatible = "compat2", .type = "type1", }, | ||
| 315 | { .data = "J", .compatible = "compat2", .type = "type1", .name = "name8", }, | ||
| 316 | { .data = "K", .compatible = "compat2", .name = "name9", }, | ||
| 317 | {} | ||
| 318 | }; | ||
| 319 | |||
| 320 | static struct { | ||
| 321 | const char *path; | ||
| 322 | const char *data; | ||
| 323 | } match_node_tests[] = { | ||
| 324 | { .path = "/testcase-data/match-node/name0", .data = "A", }, | ||
| 325 | { .path = "/testcase-data/match-node/name1", .data = "B", }, | ||
| 326 | { .path = "/testcase-data/match-node/a/name2", .data = "Ca", }, | ||
| 327 | { .path = "/testcase-data/match-node/b/name2", .data = "Cb", }, | ||
| 328 | { .path = "/testcase-data/match-node/c/name2", .data = "Cc", }, | ||
| 329 | { .path = "/testcase-data/match-node/name3", .data = "E", }, | ||
| 330 | { .path = "/testcase-data/match-node/name4", .data = "G", }, | ||
| 331 | { .path = "/testcase-data/match-node/name5", .data = "H", }, | ||
| 332 | { .path = "/testcase-data/match-node/name6", .data = "G", }, | ||
| 333 | { .path = "/testcase-data/match-node/name7", .data = "I", }, | ||
| 334 | { .path = "/testcase-data/match-node/name8", .data = "J", }, | ||
| 335 | { .path = "/testcase-data/match-node/name9", .data = "K", }, | ||
| 336 | }; | ||
| 337 | |||
| 338 | static void __init of_selftest_match_node(void) | ||
| 339 | { | ||
| 340 | struct device_node *np; | ||
| 341 | const struct of_device_id *match; | ||
| 342 | int i; | ||
| 343 | |||
| 344 | for (i = 0; i < ARRAY_SIZE(match_node_tests); i++) { | ||
| 345 | np = of_find_node_by_path(match_node_tests[i].path); | ||
| 346 | if (!np) { | ||
| 347 | selftest(0, "missing testcase node %s\n", | ||
| 348 | match_node_tests[i].path); | ||
| 349 | continue; | ||
| 350 | } | ||
| 351 | |||
| 352 | match = of_match_node(match_node_table, np); | ||
| 353 | if (!match) { | ||
| 354 | selftest(0, "%s didn't match anything\n", | ||
| 355 | match_node_tests[i].path); | ||
| 356 | continue; | ||
| 357 | } | ||
| 358 | |||
| 359 | if (strcmp(match->data, match_node_tests[i].data) != 0) { | ||
| 360 | selftest(0, "%s got wrong match. expected %s, got %s\n", | ||
| 361 | match_node_tests[i].path, match_node_tests[i].data, | ||
| 362 | (const char *)match->data); | ||
| 363 | continue; | ||
| 364 | } | ||
| 365 | selftest(1, "passed"); | ||
| 366 | } | ||
| 367 | } | ||
| 368 | |||
| 303 | static int __init of_selftest(void) | 369 | static int __init of_selftest(void) |
| 304 | { | 370 | { |
| 305 | struct device_node *np; | 371 | struct device_node *np; |
| @@ -316,6 +382,7 @@ static int __init of_selftest(void) | |||
| 316 | of_selftest_property_match_string(); | 382 | of_selftest_property_match_string(); |
| 317 | of_selftest_parse_interrupts(); | 383 | of_selftest_parse_interrupts(); |
| 318 | of_selftest_parse_interrupts_extended(); | 384 | of_selftest_parse_interrupts_extended(); |
| 385 | of_selftest_match_node(); | ||
| 319 | pr_info("end of selftest - %i passed, %i failed\n", | 386 | pr_info("end of selftest - %i passed, %i failed\n", |
| 320 | selftest_results.passed, selftest_results.failed); | 387 | selftest_results.passed, selftest_results.failed); |
| 321 | return 0; | 388 | return 0; |
diff --git a/drivers/of/testcase-data/testcases.dtsi b/drivers/of/testcase-data/testcases.dtsi index 3cc2f55534ac..3a5b75a8e4d7 100644 --- a/drivers/of/testcase-data/testcases.dtsi +++ b/drivers/of/testcase-data/testcases.dtsi | |||
| @@ -1,2 +1,3 @@ | |||
| 1 | #include "tests-phandle.dtsi" | 1 | #include "tests-phandle.dtsi" |
| 2 | #include "tests-interrupts.dtsi" | 2 | #include "tests-interrupts.dtsi" |
| 3 | #include "tests-match.dtsi" | ||
diff --git a/drivers/of/testcase-data/tests-match.dtsi b/drivers/of/testcase-data/tests-match.dtsi new file mode 100644 index 000000000000..c9e541129534 --- /dev/null +++ b/drivers/of/testcase-data/tests-match.dtsi | |||
| @@ -0,0 +1,19 @@ | |||
| 1 | |||
| 2 | / { | ||
| 3 | testcase-data { | ||
| 4 | match-node { | ||
| 5 | name0 { }; | ||
| 6 | name1 { device_type = "type1"; }; | ||
| 7 | a { name2 { device_type = "type1"; }; }; | ||
| 8 | b { name2 { }; }; | ||
| 9 | c { name2 { device_type = "type2"; }; }; | ||
| 10 | name3 { compatible = "compat3"; }; | ||
| 11 | name4 { compatible = "compat2", "compat3"; }; | ||
| 12 | name5 { compatible = "compat2", "compat3"; }; | ||
| 13 | name6 { compatible = "compat1", "compat2", "compat3"; }; | ||
| 14 | name7 { compatible = "compat2"; device_type = "type1"; }; | ||
| 15 | name8 { compatible = "compat2"; device_type = "type1"; }; | ||
| 16 | name9 { compatible = "compat2"; }; | ||
| 17 | }; | ||
| 18 | }; | ||
| 19 | }; | ||
