Skip to content

Commit 25cad69

Browse files
Martin Wilckgregkh
authored andcommitted
base/platform: Fix platform drivers with no probe callback
Since b8b2c7d, platform_drv_probe() is called for all platform devices. If drv->probe is NULL, and dev_pm_domain_attach() fails, platform_drv_probe() will return the error code from dev_pm_domain_attach(). This causes real_probe() to enter the "probe_failed" path and set dev->driver to NULL. Before b8b2c7d, real_probe() would assume success if both dev->bus->probe and drv->probe were missing. As a result, a device and driver could be "bound" together just by matching their names; this doesn't work any more after b8b2c7d. This may cause problems later for certain usage of platform_driver_register() and platform_device_register_simple(). I observed a panic while loading the tpm_tis driver with parameter "force=1" (i.e. registering tpm_tis as a platform driver), because tpm_tis_init's assumption that the device returned by platform_device_register_simple() was bound didn't hold any more (tpmm_chip_alloc() dereferences chip->pdev->driver, causing panic). This patch restores the previous (4.3.0 and earlier) behavior of platform_drv_probe() in the case when the associated platform driver has no "probe" function. Fixes: b8b2c7d ("base/platform: assert that dev_pm_domain callbacks are called unconditionally") Signed-off-by: Martin Wilck <Martin.Wilck@ts.fujitsu.com> Cc: stable <stable@vger.kernel.org> # 4.4 Cc: Martin Fuzzey <mfuzzey@parkeon.com> Acked-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 92e963f commit 25cad69

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

drivers/base/platform.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -558,10 +558,15 @@ static int platform_drv_probe(struct device *_dev)
558558
return ret;
559559

560560
ret = dev_pm_domain_attach(_dev, true);
561-
if (ret != -EPROBE_DEFER && drv->probe) {
562-
ret = drv->probe(dev);
563-
if (ret)
564-
dev_pm_domain_detach(_dev, true);
561+
if (ret != -EPROBE_DEFER) {
562+
if (drv->probe) {
563+
ret = drv->probe(dev);
564+
if (ret)
565+
dev_pm_domain_detach(_dev, true);
566+
} else {
567+
/* don't fail if just dev_pm_domain_attach failed */
568+
ret = 0;
569+
}
565570
}
566571

567572
if (drv->prevent_deferred_probe && ret == -EPROBE_DEFER) {

0 commit comments

Comments
 (0)