diff options
| author | Rob Herring <robh@kernel.org> | 2015-02-04 11:43:01 -0500 |
|---|---|---|
| committer | Rob Herring <robh@kernel.org> | 2015-02-04 11:43:01 -0500 |
| commit | 962a70d05edac2e2eb53cd077715930083964b9e (patch) | |
| tree | f0b3a7bd574b2edfa76ce960e7f8630aea77e257 /drivers/of | |
| parent | 10638a4ed2b8618f20fabf9ed19df60a68446e90 (diff) | |
| parent | 26bc420b59a38e4e6685a73345a0def461136dce (diff) | |
Merge tag 'v3.19-rc6' into HEAD
Linux 3.19-rc6
Diffstat (limited to 'drivers/of')
| -rw-r--r-- | drivers/of/overlay.c | 11 | ||||
| -rw-r--r-- | drivers/of/platform.c | 9 | ||||
| -rw-r--r-- | drivers/of/unittest-data/tests-overlay.dtsi | 55 | ||||
| -rw-r--r-- | drivers/of/unittest.c | 39 |
4 files changed, 103 insertions, 11 deletions
diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c index ea63fbd228ed..352b4f28f82c 100644 --- a/drivers/of/overlay.c +++ b/drivers/of/overlay.c | |||
| @@ -114,17 +114,6 @@ static int of_overlay_apply_single_device_node(struct of_overlay *ov, | |||
| 114 | ret = of_overlay_apply_one(ov, tchild, child); | 114 | ret = of_overlay_apply_one(ov, tchild, child); |
| 115 | if (ret) | 115 | if (ret) |
| 116 | return ret; | 116 | return ret; |
| 117 | |||
| 118 | /* The properties are already copied, now do the child nodes */ | ||
| 119 | for_each_child_of_node(child, grandchild) { | ||
| 120 | ret = of_overlay_apply_single_device_node(ov, tchild, grandchild); | ||
| 121 | if (ret) { | ||
| 122 | pr_err("%s: Failed to apply single node @%s/%s\n", | ||
| 123 | __func__, tchild->full_name, | ||
| 124 | grandchild->name); | ||
| 125 | return ret; | ||
| 126 | } | ||
| 127 | } | ||
| 128 | } | 117 | } |
| 129 | 118 | ||
| 130 | return ret; | 119 | return ret; |
diff --git a/drivers/of/platform.c b/drivers/of/platform.c index a54ec1087fd2..b0d50d70a8a1 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c | |||
| @@ -566,6 +566,10 @@ static int of_platform_notify(struct notifier_block *nb, | |||
| 566 | if (!of_node_check_flag(rd->dn->parent, OF_POPULATED_BUS)) | 566 | if (!of_node_check_flag(rd->dn->parent, OF_POPULATED_BUS)) |
| 567 | return NOTIFY_OK; /* not for us */ | 567 | return NOTIFY_OK; /* not for us */ |
| 568 | 568 | ||
| 569 | /* already populated? (driver using of_populate manually) */ | ||
| 570 | if (of_node_check_flag(rd->dn, OF_POPULATED)) | ||
| 571 | return NOTIFY_OK; | ||
| 572 | |||
| 569 | /* pdev_parent may be NULL when no bus platform device */ | 573 | /* pdev_parent may be NULL when no bus platform device */ |
| 570 | pdev_parent = of_find_device_by_node(rd->dn->parent); | 574 | pdev_parent = of_find_device_by_node(rd->dn->parent); |
| 571 | pdev = of_platform_device_create(rd->dn, NULL, | 575 | pdev = of_platform_device_create(rd->dn, NULL, |
| @@ -581,6 +585,11 @@ static int of_platform_notify(struct notifier_block *nb, | |||
| 581 | break; | 585 | break; |
| 582 | 586 | ||
| 583 | case OF_RECONFIG_CHANGE_REMOVE: | 587 | case OF_RECONFIG_CHANGE_REMOVE: |
| 588 | |||
| 589 | /* already depopulated? */ | ||
| 590 | if (!of_node_check_flag(rd->dn, OF_POPULATED)) | ||
| 591 | return NOTIFY_OK; | ||
| 592 | |||
| 584 | /* find our device by node */ | 593 | /* find our device by node */ |
| 585 | pdev = of_find_device_by_node(rd->dn); | 594 | pdev = of_find_device_by_node(rd->dn); |
| 586 | if (pdev == NULL) | 595 | if (pdev == NULL) |
diff --git a/drivers/of/unittest-data/tests-overlay.dtsi b/drivers/of/unittest-data/tests-overlay.dtsi index 75976da22b2e..a2b687d5f324 100644 --- a/drivers/of/unittest-data/tests-overlay.dtsi +++ b/drivers/of/unittest-data/tests-overlay.dtsi | |||
| @@ -176,5 +176,60 @@ | |||
| 176 | }; | 176 | }; |
| 177 | }; | 177 | }; |
| 178 | 178 | ||
| 179 | overlay10 { | ||
| 180 | fragment@0 { | ||
| 181 | target-path = "/testcase-data/overlay-node/test-bus"; | ||
| 182 | __overlay__ { | ||
| 183 | |||
| 184 | /* suppress DTC warning */ | ||
| 185 | #address-cells = <1>; | ||
| 186 | #size-cells = <0>; | ||
| 187 | |||
| 188 | test-selftest10 { | ||
| 189 | compatible = "selftest"; | ||
| 190 | status = "okay"; | ||
| 191 | reg = <10>; | ||
| 192 | |||
| 193 | #address-cells = <1>; | ||
| 194 | #size-cells = <0>; | ||
| 195 | |||
| 196 | test-selftest101 { | ||
| 197 | compatible = "selftest"; | ||
| 198 | status = "okay"; | ||
| 199 | reg = <1>; | ||
| 200 | }; | ||
| 201 | |||
| 202 | }; | ||
| 203 | }; | ||
| 204 | }; | ||
| 205 | }; | ||
| 206 | |||
| 207 | overlay11 { | ||
| 208 | fragment@0 { | ||
| 209 | target-path = "/testcase-data/overlay-node/test-bus"; | ||
| 210 | __overlay__ { | ||
| 211 | |||
| 212 | /* suppress DTC warning */ | ||
| 213 | #address-cells = <1>; | ||
| 214 | #size-cells = <0>; | ||
| 215 | |||
| 216 | test-selftest11 { | ||
| 217 | compatible = "selftest"; | ||
| 218 | status = "okay"; | ||
| 219 | reg = <11>; | ||
| 220 | |||
| 221 | #address-cells = <1>; | ||
| 222 | #size-cells = <0>; | ||
| 223 | |||
| 224 | test-selftest111 { | ||
| 225 | compatible = "selftest"; | ||
| 226 | status = "okay"; | ||
| 227 | reg = <1>; | ||
| 228 | }; | ||
| 229 | |||
| 230 | }; | ||
| 231 | }; | ||
| 232 | }; | ||
| 233 | }; | ||
| 179 | }; | 234 | }; |
| 180 | }; | 235 | }; |
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c index 139363af5c88..12cdbc1e3042 100644 --- a/drivers/of/unittest.c +++ b/drivers/of/unittest.c | |||
| @@ -935,6 +935,9 @@ static int selftest_probe(struct platform_device *pdev) | |||
| 935 | } | 935 | } |
| 936 | 936 | ||
| 937 | dev_dbg(dev, "%s for node @%s\n", __func__, np->full_name); | 937 | dev_dbg(dev, "%s for node @%s\n", __func__, np->full_name); |
| 938 | |||
| 939 | of_platform_populate(np, NULL, NULL, &pdev->dev); | ||
| 940 | |||
| 938 | return 0; | 941 | return 0; |
| 939 | } | 942 | } |
| 940 | 943 | ||
| @@ -1342,6 +1345,39 @@ static void of_selftest_overlay_8(void) | |||
| 1342 | selftest(1, "overlay test %d passed\n", 8); | 1345 | selftest(1, "overlay test %d passed\n", 8); |
| 1343 | } | 1346 | } |
| 1344 | 1347 | ||
| 1348 | /* test insertion of a bus with parent devices */ | ||
| 1349 | static void of_selftest_overlay_10(void) | ||
| 1350 | { | ||
| 1351 | int ret; | ||
| 1352 | char *child_path; | ||
| 1353 | |||
| 1354 | /* device should disable */ | ||
| 1355 | ret = of_selftest_apply_overlay_check(10, 10, 0, 1); | ||
| 1356 | if (selftest(ret == 0, "overlay test %d failed; overlay application\n", 10)) | ||
| 1357 | return; | ||
| 1358 | |||
| 1359 | child_path = kasprintf(GFP_KERNEL, "%s/test-selftest101", | ||
| 1360 | selftest_path(10)); | ||
| 1361 | if (selftest(child_path, "overlay test %d failed; kasprintf\n", 10)) | ||
| 1362 | return; | ||
| 1363 | |||
| 1364 | ret = of_path_platform_device_exists(child_path); | ||
| 1365 | kfree(child_path); | ||
| 1366 | if (selftest(ret, "overlay test %d failed; no child device\n", 10)) | ||
| 1367 | return; | ||
| 1368 | } | ||
| 1369 | |||
| 1370 | /* test insertion of a bus with parent devices (and revert) */ | ||
| 1371 | static void of_selftest_overlay_11(void) | ||
| 1372 | { | ||
| 1373 | int ret; | ||
| 1374 | |||
| 1375 | /* device should disable */ | ||
| 1376 | ret = of_selftest_apply_revert_overlay_check(11, 11, 0, 1); | ||
| 1377 | if (selftest(ret == 0, "overlay test %d failed; overlay application\n", 11)) | ||
| 1378 | return; | ||
| 1379 | } | ||
| 1380 | |||
| 1345 | static void __init of_selftest_overlay(void) | 1381 | static void __init of_selftest_overlay(void) |
| 1346 | { | 1382 | { |
| 1347 | struct device_node *bus_np = NULL; | 1383 | struct device_node *bus_np = NULL; |
| @@ -1390,6 +1426,9 @@ static void __init of_selftest_overlay(void) | |||
| 1390 | of_selftest_overlay_6(); | 1426 | of_selftest_overlay_6(); |
| 1391 | of_selftest_overlay_8(); | 1427 | of_selftest_overlay_8(); |
| 1392 | 1428 | ||
| 1429 | of_selftest_overlay_10(); | ||
| 1430 | of_selftest_overlay_11(); | ||
| 1431 | |||
| 1393 | out: | 1432 | out: |
| 1394 | of_node_put(bus_np); | 1433 | of_node_put(bus_np); |
| 1395 | } | 1434 | } |
