Message ID | 20230801170318.82682-2-biju.das.jz@bp.renesas.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Geert Uytterhoeven |
Headers | show |
Series | Extend device_get_match_data() to struct bus_type | expand |
On Tue, Aug 01, 2023 at 06:03:17PM +0100, Biju Das wrote: > Extend device_get_match_data() to buses (for eg: I2C) by adding a > callback device_get_match_data() to struct bus_type() and call this method > as a fallback for generic fwnode based device_get_match_data(). Because of anticipation of v4, see one additional comment below. ... > +/** > + * device_get_match_data - get match data from OF/ACPI/Bus match tables > + * @dev: device to find the match data > + * > + * Find match data using generic fwnode-based lookup and if there is no > + * match, call the bus->get_match_data() for finding match data. > + * > + * Return: a match data pointer or NULL if there is no match in the matching > + * table. Also add a note for the corner case. """ * * Besides the fact that some drivers abuse the device ID driver_data type * and claim it to be integer, for the bus specific ID tables the driver_data * may be defined as kernel_ulong_t. For these tables 0 is a valid response, * but not for this function. It's recommended to covert those either to avoid * 0 or use a real pointer to the predefined driver data. """ > + */
Hi Andy Shevchenko, Thanks for the feedback. > Subject: Re: [PATCH v3 1/2] drivers: fwnode: Extend > device_get_match_data() to struct bus_type > > On Tue, Aug 01, 2023 at 06:03:17PM +0100, Biju Das wrote: > > Extend device_get_match_data() to buses (for eg: I2C) by adding a > > callback device_get_match_data() to struct bus_type() and call this > > method as a fallback for generic fwnode based device_get_match_data(). > > Because of anticipation of v4, see one additional comment below. Ok. > ... > > > +/** > > + * device_get_match_data - get match data from OF/ACPI/Bus match > > +tables > > + * @dev: device to find the match data > > + * > > + * Find match data using generic fwnode-based lookup and if there is > > +no > > + * match, call the bus->get_match_data() for finding match data. > > + * > > + * Return: a match data pointer or NULL if there is no match in the > > +matching > > + * table. > > Also add a note for the corner case. > > """ > * > * Besides the fact that some drivers abuse the device ID driver_data > type > * and claim it to be integer, for the bus specific ID tables the > driver_data > * may be defined as kernel_ulong_t. For these tables 0 is a valid > response, > * but not for this function. It's recommended to covert those either to Will fix the typo covert->convert Cheers, Biju > avoid > * 0 or use a real pointer to the predefined driver data. > """ >
On Wed, Aug 02, 2023 at 06:32:18AM +0000, Biju Das wrote: > > On Tue, Aug 01, 2023 at 06:03:17PM +0100, Biju Das wrote: ... > > * > > * Besides the fact that some drivers abuse the device ID driver_data > > type > > * and claim it to be integer, for the bus specific ID tables the > > driver_data > > * may be defined as kernel_ulong_t. For these tables 0 is a valid > > response, > > * but not for this function. It's recommended to covert those either to > > Will fix the typo covert->convert Thank you! > > avoid > > * 0 or use a real pointer to the predefined driver data.
diff --git a/drivers/base/property.c b/drivers/base/property.c index 8c40abed7852..e12af9ff0f51 100644 --- a/drivers/base/property.c +++ b/drivers/base/property.c @@ -1275,9 +1275,28 @@ int fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode, } EXPORT_SYMBOL(fwnode_graph_parse_endpoint); +/** + * device_get_match_data - get match data from OF/ACPI/Bus match tables + * @dev: device to find the match data + * + * Find match data using generic fwnode-based lookup and if there is no + * match, call the bus->get_match_data() for finding match data. + * + * Return: a match data pointer or NULL if there is no match in the matching + * table. + */ const void *device_get_match_data(const struct device *dev) { - return fwnode_call_ptr_op(dev_fwnode(dev), device_get_match_data, dev); + const void *data; + + data = fwnode_call_ptr_op(dev_fwnode(dev), device_get_match_data, dev); + if (data) + return data; + + if (dev->bus && dev->bus->get_match_data) + return dev->bus->get_match_data(dev); + + return NULL; } EXPORT_SYMBOL_GPL(device_get_match_data); diff --git a/include/linux/device/bus.h b/include/linux/device/bus.h index ae10c4322754..2e15b0ae5384 100644 --- a/include/linux/device/bus.h +++ b/include/linux/device/bus.h @@ -60,6 +60,7 @@ struct fwnode_handle; * this bus. * @dma_cleanup: Called to cleanup DMA configuration on a device on * this bus. + * @get_match_data: Called to get match data on a device on this bus. * @pm: Power management operations of this bus, callback the specific * device driver's pm-ops. * @iommu_ops: IOMMU specific operations for this bus, used to attach IOMMU @@ -102,6 +103,8 @@ struct bus_type { int (*dma_configure)(struct device *dev); void (*dma_cleanup)(struct device *dev); + const void *(*get_match_data)(const struct device *dev); + const struct dev_pm_ops *pm; const struct iommu_ops *iommu_ops;