Message ID | 1522317660-11080-2-git-send-email-dongsheng.wang@hxt-semitech.com (mailing list archive) |
---|---|
State | RFC, archived |
Headers | show |
On Thu, Mar 29, 2018 at 12:00 PM, Wang Dongsheng <dongsheng.wang@hxt-semitech.com> wrote: > Currently the initialization state of device is DL_DEV_NO_DRIVER. > The problem is, after probe failure the state will also be set to > DL_DEV_NO_DRIVER as well. And the device is not linked, it has no > supplier or consumer. Thus adding a new state to distinguish > probe failure and not-probed-yet. > > Signed-off-by: Wang Dongsheng <dongsheng.wang@hxt-semitech.com> I guess what you want is a cleanup after a failing probe, but after that the state really is "no driver" again, isn't it? > --- > Documentation/driver-api/device_link.rst | 2 +- > drivers/base/base.h | 2 +- > drivers/base/core.c | 22 ++++++++++++++++++++-- > drivers/base/dd.c | 2 +- > include/linux/device.h | 1 + > 5 files changed, 24 insertions(+), 5 deletions(-) > > diff --git a/Documentation/driver-api/device_link.rst b/Documentation/driver-api/device_link.rst > index 70e328e..9054403 100644 > --- a/Documentation/driver-api/device_link.rst > +++ b/Documentation/driver-api/device_link.rst > @@ -247,7 +247,7 @@ State machine > :c:func:`device_links_unbind_consumers()`.) > > * If the probe fails, links to suppliers revert back to ``DL_STATE_AVAILABLE``. > - (Call to :c:func:`device_links_no_driver()` from :c:func:`really_probe()`.) > + (Call to :c:func:`device_links_probe_failed()` from :c:func:`really_probe()`.) > > * If the probe succeeds, links to suppliers progress to ``DL_STATE_ACTIVE``. > (Call to :c:func:`device_links_driver_bound()` from :c:func:`driver_bound()`.) > diff --git a/drivers/base/base.h b/drivers/base/base.h > index d800de6..f9931d9 100644 > --- a/drivers/base/base.h > +++ b/drivers/base/base.h > @@ -158,6 +158,6 @@ extern void device_links_read_unlock(int idx); > extern int device_links_check_suppliers(struct device *dev); > extern void device_links_driver_bound(struct device *dev); > extern void device_links_driver_cleanup(struct device *dev); > -extern void device_links_no_driver(struct device *dev); > +extern void device_links_probe_failed(struct device *dev); > extern bool device_links_busy(struct device *dev); > extern void device_links_unbind_consumers(struct device *dev); > diff --git a/drivers/base/core.c b/drivers/base/core.c > index 5847364..31d4f68 100644 > --- a/drivers/base/core.c > +++ b/drivers/base/core.c > @@ -452,10 +452,28 @@ static void __device_links_no_driver(struct device *dev) > dev->links.status = DL_DEV_NO_DRIVER; > } > > -void device_links_no_driver(struct device *dev) > +static void __device_links_probe_failed(struct device *dev) > +{ > + struct device_link *link, *ln; > + > + list_for_each_entry_safe_reverse(link, ln, &dev->links.suppliers, > + c_node) { > + if (link->flags & DL_FLAG_STATELESS) > + continue; > + > + if (link->flags & DL_FLAG_AUTOREMOVE) > + __device_link_del(link); > + else if (link->status != DL_STATE_SUPPLIER_UNBIND) > + WRITE_ONCE(link->status, DL_STATE_AVAILABLE); > + } > + > + dev->links.status = DL_DEV_PROBE_FAILED; > +} > + > +void device_links_probe_failed(struct device *dev) > { > device_links_write_lock(); > - __device_links_no_driver(dev); > + __device_links_probe_failed(dev); > device_links_write_unlock(); > } > > diff --git a/drivers/base/dd.c b/drivers/base/dd.c > index de6fd09..90d57e0 100644 > --- a/drivers/base/dd.c > +++ b/drivers/base/dd.c > @@ -492,7 +492,7 @@ static int really_probe(struct device *dev, struct device_driver *drv) > blocking_notifier_call_chain(&dev->bus->p->bus_notifier, > BUS_NOTIFY_DRIVER_NOT_BOUND, dev); > pinctrl_bind_failed: > - device_links_no_driver(dev); > + device_links_probe_failed(dev); > devres_release_all(dev); > driver_sysfs_remove(dev); > dev->driver = NULL; > diff --git a/include/linux/device.h b/include/linux/device.h > index b093405..bf9630a 100644 > --- a/include/linux/device.h > +++ b/include/linux/device.h > @@ -794,6 +794,7 @@ struct device_link { > enum dl_dev_state { > DL_DEV_NO_DRIVER = 0, > DL_DEV_PROBING, > + DL_DEV_PROBE_FAILED, > DL_DEV_DRIVER_BOUND, > DL_DEV_UNBINDING, > }; > -- > 2.7.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-acpi" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
T24gVGh1LCAyMDE4LTAzLTI5IGF0IDEyOjUxICswMjAwLCBSYWZhZWwgSi4gV3lzb2NraSB3cm90 ZToNCj4gT24gVGh1LCBNYXIgMjksIDIwMTggYXQgMTI6MDAgUE0sIFdhbmcgRG9uZ3NoZW5nDQo+ IDxkb25nc2hlbmcud2FuZ0BoeHQtc2VtaXRlY2guY29tPiB3cm90ZToNCj4gPiBDdXJyZW50bHkg dGhlIGluaXRpYWxpemF0aW9uIHN0YXRlIG9mIGRldmljZSBpcyBETF9ERVZfTk9fRFJJVkVSLg0K PiA+IFRoZSBwcm9ibGVtIGlzLCBhZnRlciBwcm9iZSBmYWlsdXJlIHRoZSBzdGF0ZSB3aWxsIGFs c28gYmUgc2V0IHRvDQo+ID4gRExfREVWX05PX0RSSVZFUiBhcyB3ZWxsLiBBbmQgdGhlIGRldmlj ZSBpcyBub3QgbGlua2VkLCBpdCBoYXMgbm8NCj4gPiBzdXBwbGllciBvciBjb25zdW1lci4gVGh1 cyBhZGRpbmcgYSBuZXcgc3RhdGUgdG8gZGlzdGluZ3Vpc2gNCj4gPiBwcm9iZSBmYWlsdXJlIGFu ZCBub3QtcHJvYmVkLXlldC4NCj4gPiANCj4gPiBTaWduZWQtb2ZmLWJ5OiBXYW5nIERvbmdzaGVu ZyA8ZG9uZ3NoZW5nLndhbmdAaHh0LXNlbWl0ZWNoLmNvbT4NCj4gDQo+IEkgZ3Vlc3Mgd2hhdCB5 b3Ugd2FudCBpcyBhIGNsZWFudXAgYWZ0ZXIgYSBmYWlsaW5nIHByb2JlLCBidXQgYWZ0ZXINCj4g dGhhdCB0aGUgc3RhdGUgcmVhbGx5IGlzICJubyBkcml2ZXIiIGFnYWluLCBpc24ndCBpdD8NClll cywgYWdyZWUgIm5vIGRyaXZlciIsIGRldmljZSBpcyBuZXZlciBnZXQgYSBkcml2ZXIgYWdhaW4u DQoNCkJ1dCBBIGRlcGVuZCBvbiBCIHN1Y2Nlc3NmdWwgcHJvYmUuIGlmIEIgZmFpbGVkLCBBIHdp bGwgbmV2ZXIga25vdzoNCjEuIEIgY2FuJ3Qgd29yay4NCjIuIEIgaGFzbid0IGdvdCBhIHByb2Jl IHlldC4NCg0KTGlrZSBJT01NVS4gQWZ0ZXIgU01NVSBzdWNjZXNzZnVsIHByb2JlZCwgdGhlIGRy aXZlciBhZGQgYSByZXNvdXJjZQ0KaW50byAiaW9tbXVfZGV2aWNlX2xpc3QiLiBNYXN0ZXIgbG9v a3VwIHRoZSBjb3JyZXNwb25kaW5nIFNNTVUgZndub2RlDQpmcm9tICJpb21tdV9kZXZpY2VfbGlz dCIsIGFmdGVyIG1hdGNoZWQgbWFzdGVyIHdpbGwgZG8gcHJvYmUuIGJ1dCBpZg0KdGhlIGxpc3Qg aXMgTlVMTCBtYXN0ZXIgd2lsbCBnZXQgLUVQUk9CRV9ERUZFUiwgbWVhbnMgU01NVSBkZXZpY2Ug bWF5DQpub3QgcHJvYmUgeWV0LCBpbiBmYWN0IFNNTVUgbWF5IHByb2JlIGZhaWxlZC4NCg0KSSB0 cnkgdG8gdXNlIERMX0RFViBzdGF0ZSB0byBmaXggdGhpcyBpc3N1ZSwgYnV0IE5PX0RSSVZFUiBk b2VzIG5vdA0KZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgdHdvIGNhc2VzLg0KDQpDaGVlcnMsDQot RG9uZ3NoZW5nDQoNCj4gDQo+ID4gLS0tDQo+ID4gIERvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9k ZXZpY2VfbGluay5yc3QgfCAgMiArLQ0KPiA+ICBkcml2ZXJzL2Jhc2UvYmFzZS5oICAgICAgICAg ICAgICAgICAgICAgIHwgIDIgKy0NCj4gPiAgZHJpdmVycy9iYXNlL2NvcmUuYyAgICAgICAgICAg ICAgICAgICAgICB8IDIyDQo+ID4gKysrKysrKysrKysrKysrKysrKystLQ0KPiA+ICBkcml2ZXJz L2Jhc2UvZGQuYyAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIgKy0NCj4gPiAgaW5jbHVkZS9s aW51eC9kZXZpY2UuaCAgICAgICAgICAgICAgICAgICB8ICAxICsNCj4gPiAgNSBmaWxlcyBjaGFu Z2VkLCAyNCBpbnNlcnRpb25zKCspLCA1IGRlbGV0aW9ucygtKQ0KPiA+IA0KPiA+IGRpZmYgLS1n aXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvZGV2aWNlX2xpbmsucnN0DQo+ID4gYi9Eb2N1 bWVudGF0aW9uL2RyaXZlci1hcGkvZGV2aWNlX2xpbmsucnN0DQo+ID4gaW5kZXggNzBlMzI4ZS4u OTA1NDQwMyAxMDA2NDQNCj4gPiAtLS0gYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvZGV2aWNl X2xpbmsucnN0DQo+ID4gKysrIGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2RldmljZV9saW5r LnJzdA0KPiA+IEBAIC0yNDcsNyArMjQ3LDcgQEAgU3RhdGUgbWFjaGluZQ0KPiA+ICAgIDpjOmZ1 bmM6YGRldmljZV9saW5rc191bmJpbmRfY29uc3VtZXJzKClgLikNCj4gPiANCj4gPiAgKiBJZiB0 aGUgcHJvYmUgZmFpbHMsIGxpbmtzIHRvIHN1cHBsaWVycyByZXZlcnQgYmFjayB0bw0KPiA+IGBg RExfU1RBVEVfQVZBSUxBQkxFYGAuDQo+ID4gLSAgKENhbGwgdG8gOmM6ZnVuYzpgZGV2aWNlX2xp bmtzX25vX2RyaXZlcigpYCBmcm9tDQo+ID4gOmM6ZnVuYzpgcmVhbGx5X3Byb2JlKClgLikNCj4g PiArICAoQ2FsbCB0byA6YzpmdW5jOmBkZXZpY2VfbGlua3NfcHJvYmVfZmFpbGVkKClgIGZyb20N Cj4gPiA6YzpmdW5jOmByZWFsbHlfcHJvYmUoKWAuKQ0KPiA+IA0KPiA+ICAqIElmIHRoZSBwcm9i ZSBzdWNjZWVkcywgbGlua3MgdG8gc3VwcGxpZXJzIHByb2dyZXNzIHRvDQo+ID4gYGBETF9TVEFU RV9BQ1RJVkVgYC4NCj4gPiAgICAoQ2FsbCB0byA6YzpmdW5jOmBkZXZpY2VfbGlua3NfZHJpdmVy X2JvdW5kKClgIGZyb20NCj4gPiA6YzpmdW5jOmBkcml2ZXJfYm91bmQoKWAuKQ0KPiA+IGRpZmYg LS1naXQgYS9kcml2ZXJzL2Jhc2UvYmFzZS5oIGIvZHJpdmVycy9iYXNlL2Jhc2UuaA0KPiA+IGlu ZGV4IGQ4MDBkZTYuLmY5OTMxZDkgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9iYXNlL2Jhc2Uu aA0KPiA+ICsrKyBiL2RyaXZlcnMvYmFzZS9iYXNlLmgNCj4gPiBAQCAtMTU4LDYgKzE1OCw2IEBA IGV4dGVybiB2b2lkIGRldmljZV9saW5rc19yZWFkX3VubG9jayhpbnQgaWR4KTsNCj4gPiAgZXh0 ZXJuIGludCBkZXZpY2VfbGlua3NfY2hlY2tfc3VwcGxpZXJzKHN0cnVjdCBkZXZpY2UgKmRldik7 DQo+ID4gIGV4dGVybiB2b2lkIGRldmljZV9saW5rc19kcml2ZXJfYm91bmQoc3RydWN0IGRldmlj ZSAqZGV2KTsNCj4gPiAgZXh0ZXJuIHZvaWQgZGV2aWNlX2xpbmtzX2RyaXZlcl9jbGVhbnVwKHN0 cnVjdCBkZXZpY2UgKmRldik7DQo+ID4gLWV4dGVybiB2b2lkIGRldmljZV9saW5rc19ub19kcml2 ZXIoc3RydWN0IGRldmljZSAqZGV2KTsNCj4gPiArZXh0ZXJuIHZvaWQgZGV2aWNlX2xpbmtzX3By b2JlX2ZhaWxlZChzdHJ1Y3QgZGV2aWNlICpkZXYpOw0KPiA+ICBleHRlcm4gYm9vbCBkZXZpY2Vf bGlua3NfYnVzeShzdHJ1Y3QgZGV2aWNlICpkZXYpOw0KPiA+ICBleHRlcm4gdm9pZCBkZXZpY2Vf bGlua3NfdW5iaW5kX2NvbnN1bWVycyhzdHJ1Y3QgZGV2aWNlICpkZXYpOw0KPiA+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL2Jhc2UvY29yZS5jIGIvZHJpdmVycy9iYXNlL2NvcmUuYw0KPiA+IGluZGV4 IDU4NDczNjQuLjMxZDRmNjggMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9iYXNlL2NvcmUuYw0K PiA+ICsrKyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMNCj4gPiBAQCAtNDUyLDEwICs0NTIsMjggQEAg c3RhdGljIHZvaWQgX19kZXZpY2VfbGlua3Nfbm9fZHJpdmVyKHN0cnVjdA0KPiA+IGRldmljZSAq ZGV2KQ0KPiA+ICAgICAgICAgZGV2LT5saW5rcy5zdGF0dXMgPSBETF9ERVZfTk9fRFJJVkVSOw0K PiA+ICB9DQo+ID4gDQo+ID4gLXZvaWQgZGV2aWNlX2xpbmtzX25vX2RyaXZlcihzdHJ1Y3QgZGV2 aWNlICpkZXYpDQo+ID4gK3N0YXRpYyB2b2lkIF9fZGV2aWNlX2xpbmtzX3Byb2JlX2ZhaWxlZChz dHJ1Y3QgZGV2aWNlICpkZXYpDQo+ID4gK3sNCj4gPiArICAgICAgIHN0cnVjdCBkZXZpY2VfbGlu ayAqbGluaywgKmxuOw0KPiA+ICsNCj4gPiArICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnlfc2Fm ZV9yZXZlcnNlKGxpbmssIGxuLCAmZGV2LQ0KPiA+ID5saW5rcy5zdXBwbGllcnMsDQo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX25vZGUpIHsNCj4gPiArICAg ICAgICAgICAgICAgaWYgKGxpbmstPmZsYWdzICYgRExfRkxBR19TVEFURUxFU1MpDQo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAg ICBpZiAobGluay0+ZmxhZ3MgJiBETF9GTEFHX0FVVE9SRU1PVkUpDQo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgX19kZXZpY2VfbGlua19kZWwobGluayk7DQo+ID4gKyAgICAgICAgICAgICAg IGVsc2UgaWYgKGxpbmstPnN0YXR1cyAhPSBETF9TVEFURV9TVVBQTElFUl9VTkJJTkQpDQo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgV1JJVEVfT05DRShsaW5rLT5zdGF0dXMsDQo+ID4gRExf U1RBVEVfQVZBSUxBQkxFKTsNCj4gPiArICAgICAgIH0NCj4gPiArDQo+ID4gKyAgICAgICBkZXYt PmxpbmtzLnN0YXR1cyA9IERMX0RFVl9QUk9CRV9GQUlMRUQ7DQo+ID4gK30NCj4gPiArDQo+ID4g K3ZvaWQgZGV2aWNlX2xpbmtzX3Byb2JlX2ZhaWxlZChzdHJ1Y3QgZGV2aWNlICpkZXYpDQo+ID4g IHsNCj4gPiAgICAgICAgIGRldmljZV9saW5rc193cml0ZV9sb2NrKCk7DQo+ID4gLSAgICAgICBf X2RldmljZV9saW5rc19ub19kcml2ZXIoZGV2KTsNCj4gPiArICAgICAgIF9fZGV2aWNlX2xpbmtz X3Byb2JlX2ZhaWxlZChkZXYpOw0KPiA+ICAgICAgICAgZGV2aWNlX2xpbmtzX3dyaXRlX3VubG9j aygpOw0KPiA+ICB9DQo+ID4gDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kZC5jIGIv ZHJpdmVycy9iYXNlL2RkLmMNCj4gPiBpbmRleCBkZTZmZDA5Li45MGQ1N2UwIDEwMDY0NA0KPiA+ IC0tLSBhL2RyaXZlcnMvYmFzZS9kZC5jDQo+ID4gKysrIGIvZHJpdmVycy9iYXNlL2RkLmMNCj4g PiBAQCAtNDkyLDcgKzQ5Miw3IEBAIHN0YXRpYyBpbnQgcmVhbGx5X3Byb2JlKHN0cnVjdCBkZXZp Y2UgKmRldiwNCj4gPiBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQ0KPiA+ICAgICAgICAgICAg ICAgICBibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZkZXYtPmJ1cy0+cC0NCj4gPiA+YnVz X25vdGlmaWVyLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIEJVU19OT1RJRllfRFJJVkVSX05PVF8NCj4gPiBCT1VORCwgZGV2KTsNCj4gPiAgcGluY3Ry bF9iaW5kX2ZhaWxlZDoNCj4gPiAtICAgICAgIGRldmljZV9saW5rc19ub19kcml2ZXIoZGV2KTsN Cj4gPiArICAgICAgIGRldmljZV9saW5rc19wcm9iZV9mYWlsZWQoZGV2KTsNCj4gPiAgICAgICAg IGRldnJlc19yZWxlYXNlX2FsbChkZXYpOw0KPiA+ICAgICAgICAgZHJpdmVyX3N5c2ZzX3JlbW92 ZShkZXYpOw0KPiA+ICAgICAgICAgZGV2LT5kcml2ZXIgPSBOVUxMOw0KPiA+IGRpZmYgLS1naXQg YS9pbmNsdWRlL2xpbnV4L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaA0KPiA+IGlu ZGV4IGIwOTM0MDUuLmJmOTYzMGEgMTAwNjQ0DQo+ID4gLS0tIGEvaW5jbHVkZS9saW51eC9kZXZp Y2UuaA0KPiA+ICsrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgNCj4gPiBAQCAtNzk0LDYgKzc5 NCw3IEBAIHN0cnVjdCBkZXZpY2VfbGluayB7DQo+ID4gIGVudW0gZGxfZGV2X3N0YXRlIHsNCj4g PiAgICAgICAgIERMX0RFVl9OT19EUklWRVIgPSAwLA0KPiA+ICAgICAgICAgRExfREVWX1BST0JJ TkcsDQo+ID4gKyAgICAgICBETF9ERVZfUFJPQkVfRkFJTEVELA0KPiA+ICAgICAgICAgRExfREVW X0RSSVZFUl9CT1VORCwNCj4gPiAgICAgICAgIERMX0RFVl9VTkJJTkRJTkcsDQo+ID4gIH07DQo+ ID4gLS0NCj4gPiAyLjcuNA0KPiA+IA0KPiA+IC0tDQo+ID4gVG8gdW5zdWJzY3JpYmUgZnJvbSB0 aGlzIGxpc3Q6IHNlbmQgdGhlIGxpbmUgInVuc3Vic2NyaWJlIGxpbnV4LQ0KPiA+IGFjcGkiIGlu DQo+ID4gdGhlIGJvZHkgb2YgYSBtZXNzYWdlIHRvIG1ham9yZG9tb0B2Z2VyLmtlcm5lbC5vcmcN Cj4gPiBNb3JlIG1ham9yZG9tbyBpbmZvIGF0ICBodHRwOi8vdmdlci5rZXJuZWwub3JnL21ham9y ZG9tby1pbmZvLmh0bWwNCj4gDQo+IC0tDQo+IFRvIHVuc3Vic2NyaWJlIGZyb20gdGhpcyBsaXN0 OiBzZW5kIHRoZSBsaW5lICJ1bnN1YnNjcmliZSBsaW51eC1hY3BpIiANCj4gaW4NCj4gdGhlIGJv ZHkgb2YgYSBtZXNzYWdlIHRvIG1ham9yZG9tb0B2Z2VyLmtlcm5lbC5vcmcNCj4gTW9yZSBtYWpv cmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRvbW8taW5mby5odG1s -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/Documentation/driver-api/device_link.rst b/Documentation/driver-api/device_link.rst index 70e328e..9054403 100644 --- a/Documentation/driver-api/device_link.rst +++ b/Documentation/driver-api/device_link.rst @@ -247,7 +247,7 @@ State machine :c:func:`device_links_unbind_consumers()`.) * If the probe fails, links to suppliers revert back to ``DL_STATE_AVAILABLE``. - (Call to :c:func:`device_links_no_driver()` from :c:func:`really_probe()`.) + (Call to :c:func:`device_links_probe_failed()` from :c:func:`really_probe()`.) * If the probe succeeds, links to suppliers progress to ``DL_STATE_ACTIVE``. (Call to :c:func:`device_links_driver_bound()` from :c:func:`driver_bound()`.) diff --git a/drivers/base/base.h b/drivers/base/base.h index d800de6..f9931d9 100644 --- a/drivers/base/base.h +++ b/drivers/base/base.h @@ -158,6 +158,6 @@ extern void device_links_read_unlock(int idx); extern int device_links_check_suppliers(struct device *dev); extern void device_links_driver_bound(struct device *dev); extern void device_links_driver_cleanup(struct device *dev); -extern void device_links_no_driver(struct device *dev); +extern void device_links_probe_failed(struct device *dev); extern bool device_links_busy(struct device *dev); extern void device_links_unbind_consumers(struct device *dev); diff --git a/drivers/base/core.c b/drivers/base/core.c index 5847364..31d4f68 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -452,10 +452,28 @@ static void __device_links_no_driver(struct device *dev) dev->links.status = DL_DEV_NO_DRIVER; } -void device_links_no_driver(struct device *dev) +static void __device_links_probe_failed(struct device *dev) +{ + struct device_link *link, *ln; + + list_for_each_entry_safe_reverse(link, ln, &dev->links.suppliers, + c_node) { + if (link->flags & DL_FLAG_STATELESS) + continue; + + if (link->flags & DL_FLAG_AUTOREMOVE) + __device_link_del(link); + else if (link->status != DL_STATE_SUPPLIER_UNBIND) + WRITE_ONCE(link->status, DL_STATE_AVAILABLE); + } + + dev->links.status = DL_DEV_PROBE_FAILED; +} + +void device_links_probe_failed(struct device *dev) { device_links_write_lock(); - __device_links_no_driver(dev); + __device_links_probe_failed(dev); device_links_write_unlock(); } diff --git a/drivers/base/dd.c b/drivers/base/dd.c index de6fd09..90d57e0 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c @@ -492,7 +492,7 @@ static int really_probe(struct device *dev, struct device_driver *drv) blocking_notifier_call_chain(&dev->bus->p->bus_notifier, BUS_NOTIFY_DRIVER_NOT_BOUND, dev); pinctrl_bind_failed: - device_links_no_driver(dev); + device_links_probe_failed(dev); devres_release_all(dev); driver_sysfs_remove(dev); dev->driver = NULL; diff --git a/include/linux/device.h b/include/linux/device.h index b093405..bf9630a 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -794,6 +794,7 @@ struct device_link { enum dl_dev_state { DL_DEV_NO_DRIVER = 0, DL_DEV_PROBING, + DL_DEV_PROBE_FAILED, DL_DEV_DRIVER_BOUND, DL_DEV_UNBINDING, };
Currently the initialization state of device is DL_DEV_NO_DRIVER. The problem is, after probe failure the state will also be set to DL_DEV_NO_DRIVER as well. And the device is not linked, it has no supplier or consumer. Thus adding a new state to distinguish probe failure and not-probed-yet. Signed-off-by: Wang Dongsheng <dongsheng.wang@hxt-semitech.com> --- Documentation/driver-api/device_link.rst | 2 +- drivers/base/base.h | 2 +- drivers/base/core.c | 22 ++++++++++++++++++++-- drivers/base/dd.c | 2 +- include/linux/device.h | 1 + 5 files changed, 24 insertions(+), 5 deletions(-)