of/platform: Handle of_populate drivers in notifier
authorPantelis Antoniou <pantelis.antoniou@konsulko.com>
Tue, 16 Dec 2014 17:45:26 +0000 (19:45 +0200)
committerMark Brown <broonie@kernel.org>
Tue, 17 Feb 2015 02:56:15 +0000 (11:56 +0900)
When using overlays with drivers calling of_populate the notifier
will try to create the device twice. Using the populated bit
before proceeding protects against this.

Signed-off-by: Pantelis Antoniou <pantelis.antoniou@konsulko.com>
Signed-off-by: Grant Likely <grant.likely@linaro.org>
(cherry picked from commit 15204ab1ebc5aba608cd19c83c37b98438b938b0)
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/of/platform.c

index 6523eb5bb4eb4eb237e51711cdf0d0153c23c9e5..41bff21a08293757d0254fa54f7951b0e89308dc 100644 (file)
@@ -540,6 +540,10 @@ static int of_platform_notify(struct notifier_block *nb,
                if (!of_node_check_flag(rd->dn->parent, OF_POPULATED_BUS))
                        return NOTIFY_OK;       /* not for us */
 
+               /* already populated? (driver using of_populate manually) */
+               if (of_node_check_flag(rd->dn, OF_POPULATED))
+                       return NOTIFY_OK;
+
                /* pdev_parent may be NULL when no bus platform device */
                pdev_parent = of_find_device_by_node(rd->dn->parent);
                pdev = of_platform_device_create(rd->dn, NULL,
@@ -555,6 +559,11 @@ static int of_platform_notify(struct notifier_block *nb,
                break;
 
        case OF_RECONFIG_CHANGE_REMOVE:
+
+               /* already depopulated? */
+               if (!of_node_check_flag(rd->dn, OF_POPULATED))
+                       return NOTIFY_OK;
+
                /* find our device by node */
                pdev = of_find_device_by_node(rd->dn);
                if (pdev == NULL)