of: fix race when matching drivers
If two drivers are probing devices at the same time, both will write their match table result to the dev->of_match cache at the same time. Only write the result if the device matches. In a thread titled "SBus devices sometimes detected, sometimes not", Meelis reported his SBus hme was not detected about 50% of the time. From the debug suggested by Grant it was obvious another driver matched some devices between the call to match the hme and the hme discovery failling. Reported-by: Meelis Roos <mroos@linux.ee> Signed-off-by: Milton Miller <miltonm@bga.com> [grant.likely: modified to only call of_match_device() once] Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
This commit is contained in:
parent
2e9521fd65
commit
01294d8262
1 changed files with 6 additions and 2 deletions
|
@ -21,8 +21,12 @@ extern void of_device_make_bus_id(struct device *dev);
|
|||
static inline int of_driver_match_device(struct device *dev,
|
||||
const struct device_driver *drv)
|
||||
{
|
||||
dev->of_match = of_match_device(drv->of_match_table, dev);
|
||||
return dev->of_match != NULL;
|
||||
const struct of_device_id *match;
|
||||
|
||||
match = of_match_device(drv->of_match_table, dev);
|
||||
if (match)
|
||||
dev->of_match = match;
|
||||
return match != NULL;
|
||||
}
|
||||
|
||||
extern struct platform_device *of_dev_get(struct platform_device *dev);
|
||||
|
|
Loading…
Reference in a new issue