diff mbox series

[v5,RESEND,1/4] drivers: fwnode: Extend device_get_match_data() to struct bus_type

Message ID 20230803103102.323987-2-biju.das.jz@bp.renesas.com (mailing list archive)
State Handled Elsewhere, archived
Headers show
Series Extend device_get_match_data() to struct bus_type | expand

Commit Message

Biju Das Aug. 3, 2023, 10:30 a.m. UTC
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().

Suggested-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
v4->v5:
 * No change
v3->v4:
 * Documented corner case.
v2->v3:
 * Added Rb tag from Andy.
RFC v1-> v2:
 * Replaced "Signed-off-by"->"Suggested-by" tag for Dmitry.
 * Documented device_get_match_data().
 * Added multiple returns to make code path for generic fwnode-based
   lookup faster.
---
 drivers/base/property.c    | 27 ++++++++++++++++++++++++++-
 include/linux/device/bus.h |  3 +++
 2 files changed, 29 insertions(+), 1 deletion(-)

Comments

Andy Shevchenko Aug. 3, 2023, noon UTC | #1
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...
Sakari Ailus Aug. 3, 2023, 12:02 p.m. UTC | #2
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?
Biju Das Aug. 3, 2023, 12:05 p.m. UTC | #3
Hi Andy Shevchenko,

Thanks for the feedback.

> Subject: Re: [PATCH v5 RESEND 1/4] drivers: fwnode: Extend
> device_get_match_data() to struct bus_type
> 
> 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...

In my mailbox, I received Sakari's tag after sending RESEND patch series.
It may be some race situation with mailboxes.

Cheers,
Biju
Andy Shevchenko Aug. 3, 2023, 12:07 p.m. UTC | #4
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 :-)
Andy Shevchenko Aug. 3, 2023, 12:12 p.m. UTC | #5
On Thu, Aug 03, 2023 at 12:05:58PM +0000, Biju Das wrote:
> > Subject: Re: [PATCH v5 RESEND 1/4] drivers: fwnode: Extend
> > device_get_match_data() to struct bus_type
> > 
> > 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...
> 
> In my mailbox, I received Sakari's tag after sending RESEND patch series.
> It may be some race situation with mailboxes.

Right. My point is, give some time before resend even if something is wrong.
Jest reply to your own message to inform people that "the vX is wrong and
I am going to resend it soon",
Biju Das Aug. 3, 2023, 12:13 p.m. UTC | #6
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 mbox series

Patch

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;