On Tue, Apr 23, 2024 at 12:46:58AM +0800, Sui Jingfeng wrote: > Because the software node backend of the fwnode API framework lacks an > implementation for the .device_get_match_data function callback. This > makes it difficult to use(and/or test) a few drivers that originates Missing space before opening parenthesis. > from DT world on the non-DT platform. > > Implement the .device_get_match_data fwnode callback, device drivers or > platform setup codes are expected to provide a string property, named as > "compatible", the value of this software node string property is used to > match against the compatible entries in the of_device_id table. Yep and again, how is this related? If you want to test a driver originating from DT, you would probably want to have a DT (overlay) to be provided. > This also helps to keep the three backends of the fwnode API aligned as > much as possible, which is a fundamential step to make device driver > OF-independent truely possible. > > Fixes: ffb42e64561e ("drm/tiny/repaper: Make driver OF-independent") > Fixes: 5703d6ae9573 ("drm/tiny/st7735r: Make driver OF-independent") How is it a fix? > Closes: https://lore.kernel.org/lkml/20230223203713.hcse3mkbq3m6sogb@skbuf/ Yes, and then Reported-by, which is missing here. > Cc: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> > Cc: Daniel Scally <djrscally@xxxxxxxxx> > Cc: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx> > Cc: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx> > Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> > Cc: "Rafael J. Wysocki" <rafael@xxxxxxxxxx> Please, move these after the cutter '---' line (note you may have that line in your local repo). ... > +static const void * > +software_node_get_match_data(const struct fwnode_handle *fwnode, > + const struct device *dev) > +{ > + struct swnode *swnode = to_swnode(fwnode); > + const struct of_device_id *matches = dev->driver->of_match_table; > + const char *val = NULL; > + int ret; > + ret = property_entry_read_string_array(swnode->node->properties, > + "compatible", &val, 1); And if there are more than one compatible provided? > + if (ret < 0 || !val) > + return NULL; > + while (matches && matches->compatible[0]) { First part of the conditional is invariant to the loop. Can be simply matches = dev->driver->of_match_table; if (!matches) return NULL; while (...) > + if (!strcmp(matches->compatible, val)) > + return matches->data; > + > + matches++; > + } > + > + return NULL; > +} -- With Best Regards, Andy Shevchenko