summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorAhmad Fatoum <a.fatoum@pengutronix.de>2020-10-07 11:50:52 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2020-10-09 08:48:02 +0200
commit8ef0ae4842c1cabf0e6fe00a26d15e3b3b942da8 (patch)
tree229b1029e86d14cd2dc1b321d91f0b9b68124a96 /include
parent578ba96236e155311c45bcab3536541e7532c41a (diff)
downloadbarebox-8ef0ae4842c1cabf0e6fe00a26d15e3b3b942da8.tar.gz
barebox-8ef0ae4842c1cabf0e6fe00a26d15e3b3b942da8.tar.xz
driver: introduce less error-prone dev_get_drvdata alternative
We use dev_get_drvdata to get the driver match data associated with a device. This has two shortcomings: - Linux has dev_get_drvdata too, which returns a private pointer for driver specific info to associate with a device. We use dev->priv (or more often container_of) for that in barebox instead - It nearly always involves a cast to a double pointer, which is error-prone as size and alignment match need to be ensured on the programmer's part and can easily be gotten wrong: enum dev_type type; dev_get_drvdata(dev, (const void **)&type); // UB! Add a new function that instead of using a double pointer argument, returns the pointer directly: - For normal pointer driver data, no cast is necessary - For integer driver data casted to a pointer for storage, the cast is still necessary, but it's only a single pointer this way Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'include')
-rw-r--r--include/driver.h18
1 files changed, 18 insertions, 0 deletions
diff --git a/include/driver.h b/include/driver.h
index 154525e0fd..14220431f2 100644
--- a/include/driver.h
+++ b/include/driver.h
@@ -534,8 +534,26 @@ int devfs_create_partitions(const char *devname,
#define DRV_OF_COMPAT(compat) \
IS_ENABLED(CONFIG_OFDEVICE) ? (compat) : NULL
+/**
+ * dev_get_drvdata - get driver match data associated with device
+ * @dev: device instance
+ * @data: pointer to void *, where match data is stored
+ *
+ * Returns 0 on success and error code otherwise.
+ *
+ * DEPRECATED: use device_get_match_data instead, which avoids
+ * common pitfalls due to explicit pointer casts
+ */
int dev_get_drvdata(struct device_d *dev, const void **data);
+/**
+ * device_get_match_data - get driver match data associated with device
+ * @dev: device instance
+ *
+ * Returns match data on success and NULL otherwise
+ */
+const void *device_get_match_data(struct device_d *dev);
+
int device_match_of_modalias(struct device_d *dev, struct driver_d *drv);
#endif /* DRIVER_H */