diff options
author | Ahmad Fatoum <a.fatoum@pengutronix.de> | 2020-10-07 11:50:52 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2020-10-09 08:48:02 +0200 |
commit | 8ef0ae4842c1cabf0e6fe00a26d15e3b3b942da8 (patch) | |
tree | 229b1029e86d14cd2dc1b321d91f0b9b68124a96 /include | |
parent | 578ba96236e155311c45bcab3536541e7532c41a (diff) | |
download | barebox-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.h | 18 |
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 */ |