Message ID | 20230803103102.323987-2-biju.das.jz@bp.renesas.com |
---|---|
State | Superseded |
Headers | show |
Series | Extend device_get_match_data() to struct bus_type | expand |
On Thu, Aug 03, 2023 at 03:00:23PM +0300, Andy Shevchenko wrote: > On Thu, Aug 03, 2023 at 11:30:59AM +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(). > > With this resend you were too fast to forgot Sakari's tag... I guess it arrived after the patches were resent?
On Thu, Aug 03, 2023 at 12:02:56PM +0000, Sakari Ailus wrote: > On Thu, Aug 03, 2023 at 03:00:23PM +0300, Andy Shevchenko wrote: > > On Thu, Aug 03, 2023 at 11:30:59AM +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(). > > > > With this resend you were too fast to forgot Sakari's tag... > > I guess it arrived after the patches were resent? Yes, and this is my point, too fast to resend :-)
Hi Sakari, > Subject: Re: [PATCH v5 RESEND 1/4] drivers: fwnode: Extend > device_get_match_data() to struct bus_type > > On Thu, Aug 03, 2023 at 03:00:23PM +0300, Andy Shevchenko wrote: > > On Thu, Aug 03, 2023 at 11:30:59AM +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(). > > > > With this resend you were too fast to forgot Sakari's tag... > > I guess it arrived after the patches were resent? I send v5 and v5 resent, then got Rb tag from you. OK, will add Rb tag in v6. Cheers, Biju
diff --git a/drivers/base/property.c b/drivers/base/property.c index 8c40abed7852..a3c188cf68bb 100644 --- a/drivers/base/property.c +++ b/drivers/base/property.c @@ -1275,9 +1275,34 @@ 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. + * + * 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 convert those either to avoid + * 0 or use a real pointer to the predefined driver data. + */ 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;