summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2019-12-29 21:19:21 -0700
committerSimon Glass <sjg@chromium.org>2020-01-07 16:02:38 -0700
commit153851ddfa39dc1bd4f3b5402d80487d52c644aa (patch)
tree3c4d8ba6098fae5410decb45a559d6f339f43fc4
parentbcd90cb6928414e14942c01af374863d4049a25d (diff)
downloadu-boot-153851ddfa39dc1bd4f3b5402d80487d52c644aa.tar.gz
u-boot-153851ddfa39dc1bd4f3b5402d80487d52c644aa.tar.bz2
u-boot-153851ddfa39dc1bd4f3b5402d80487d52c644aa.zip
dm: core: Add a new flag to track platform data
We want to avoid allocating platform data twice. This could happen if device_probe() is called after device_ofdata_to_platdata() for the same device. Add a flag to track whether device_ofdata_to_platdata() has been called on a device. Check the flag to make sure it doesn't happen twice, and clear the flag when the data is freed. Signed-off-by: Simon Glass <sjg@chromium.org>
-rw-r--r--drivers/core/device-remove.c1
-rw-r--r--drivers/core/device.c4
-rw-r--r--include/dm/device.h3
3 files changed, 7 insertions, 1 deletions
diff --git a/drivers/core/device-remove.c b/drivers/core/device-remove.c
index 5c8dc4ad70..444e34b492 100644
--- a/drivers/core/device-remove.c
+++ b/drivers/core/device-remove.c
@@ -140,6 +140,7 @@ void device_free(struct udevice *dev)
dev->parent_priv = NULL;
}
}
+ dev->flags &= ~DM_FLAG_PLATDATA_VALID;
devres_release_probe(dev);
}
diff --git a/drivers/core/device.c b/drivers/core/device.c
index 9506c7df8d..9f39218423 100644
--- a/drivers/core/device.c
+++ b/drivers/core/device.c
@@ -320,7 +320,7 @@ int device_ofdata_to_platdata(struct udevice *dev)
if (!dev)
return -EINVAL;
- if (dev->flags & DM_FLAG_ACTIVATED)
+ if (dev->flags & DM_FLAG_PLATDATA_VALID)
return 0;
drv = dev->driver;
@@ -368,6 +368,8 @@ int device_ofdata_to_platdata(struct udevice *dev)
goto fail;
}
+ dev->flags |= DM_FLAG_PLATDATA_VALID;
+
return 0;
fail:
device_free(dev);
diff --git a/include/dm/device.h b/include/dm/device.h
index 21774708e7..9ebfd0a34e 100644
--- a/include/dm/device.h
+++ b/include/dm/device.h
@@ -65,6 +65,9 @@ struct driver_info;
/* DM does not enable/disable the power domains corresponding to this device */
#define DM_FLAG_DEFAULT_PD_CTRL_OFF (1 << 11)
+/* Driver platdata has been read. Cleared when the device is removed */
+#define DM_FLAG_PLATDATA_VALID (1 << 12)
+
/*
* One or multiple of these flags are passed to device_remove() so that
* a selective device removal as specified by the remove-stage and the