From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jani Nikula Subject: Re: [PATCH 1/6] driver-core: platform: Provide helpers for multi-driver modules Date: Fri, 25 Sep 2015 13:27:28 +0300 Message-ID: <87wpven69b.fsf@intel.com> References: <1443114161-7965-1-git-send-email-thierry.reding@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTP id 8E9A66F068 for ; Fri, 25 Sep 2015 03:24:11 -0700 (PDT) In-Reply-To: <1443114161-7965-1-git-send-email-thierry.reding@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Thierry Reding , dri-devel@lists.freedesktop.org Cc: Greg Kroah-Hartman , linux-kernel@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org T24gVGh1LCAyNCBTZXAgMjAxNSwgVGhpZXJyeSBSZWRpbmcgPHRoaWVycnkucmVkaW5nQGdtYWls LmNvbT4gd3JvdGU6Cj4gRnJvbTogVGhpZXJyeSBSZWRpbmcgPHRyZWRpbmdAbnZpZGlhLmNvbT4K Pgo+IFNvbWUgbW9kdWxlcyByZWdpc3RlciBzZXZlcmFsIHN1Yi1kcml2ZXJzLiBQcm92aWRlIGEg aGVscGVyIHRoYXQgbWFrZXMKPiBpdCBlYXN5IHRvIHJlZ2lzdGVyIGFuZCB1bnJlZ2lzdGVyIGEg bGlzdCBvZiBzdWItZHJpdmVycywgYXMgd2VsbCBhcwo+IHVud2luZCBwcm9wZXJseSBvbiBlcnJv ci4KPgo+IENjOiBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBsaW51eGZvdW5kYXRpb24ub3Jn Pgo+IFNpZ25lZC1vZmYtYnk6IFRoaWVycnkgUmVkaW5nIDx0cmVkaW5nQG52aWRpYS5jb20+Cj4g LS0tCj4gIERvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL3BsYXRmb3JtLnR4dCB8IDExICsrKysr Kwo+ICBkcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYyAgICAgICAgICAgICAgICAgfCA2MCArKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysKPiAgaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZp Y2UuaCAgICAgICAgIHwgIDUgKysrCj4gIDMgZmlsZXMgY2hhbmdlZCwgNzYgaW5zZXJ0aW9ucygr KQo+Cj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL3BsYXRmb3JtLnR4 dCBiL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL3BsYXRmb3JtLnR4dAo+IGluZGV4IDA3Nzk1 ZWM1MWNkZS4uZTgwNDY4NzM4YmE5IDEwMDY0NAo+IC0tLSBhL0RvY3VtZW50YXRpb24vZHJpdmVy LW1vZGVsL3BsYXRmb3JtLnR4dAo+ICsrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL3Bs YXRmb3JtLnR4dAo+IEBAIC02Myw2ICs2MywxNyBAQCBydW50aW1lIG1lbW9yeSBmb290cHJpbnQ6 Cj4gIAlpbnQgcGxhdGZvcm1fZHJpdmVyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKmRy diwKPiAgCQkJICBpbnQgKCpwcm9iZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKSkKPiAgCj4g K0tlcm5lbCBtb2R1bGVzIGNhbiBiZSBjb21wb3NlZCBvZiBzZXZlcmFsIHBsYXRmb3JtIGRyaXZl cnMuIFRoZSBwbGF0Zm9ybSBjb3JlCj4gK3Byb3ZpZGVzIGhlbHBlcnMgdG8gcmVnaXN0ZXIgYW5k IHVucmVnaXN0ZXIgYW4gYXJyYXkgb2YgZHJpdmVyczoKPiArCj4gKwlpbnQgcGxhdGZvcm1fcmVn aXN0ZXJfZHJpdmVycyhzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyICogY29uc3QgKmRyaXZlcnMsCj4g KwkJCQkgICAgICB1bnNpZ25lZCBpbnQgY291bnQpOwo+ICsJdm9pZCBwbGF0Zm9ybV91bnJlZ2lz dGVyX2RyaXZlcnMoc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqIGNvbnN0ICpkcml2ZXJzLAo+ICsJ CQkJCSB1bnNpZ25lZCBpbnQgY291bnQpOwo+ICsKPiArSWYgb25lIG9mIHRoZSBkcml2ZXJzIGZh aWxzIHRvIHJlZ2lzdGVyLCBhbGwgZHJpdmVycyByZWdpc3RlcmVkIHVwIHRvIHRoYXQKPiArcG9p bnQgd2lsbCBiZSB1bnJlZ2lzdGVyZWQgaW4gcmV2ZXJzZSBvcmRlci4KPiArCj4gIAo+ICBEZXZp Y2UgRW51bWVyYXRpb24KPiAgfn5+fn5+fn5+fn5+fn5+fn5+Cj4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvYmFzZS9wbGF0Zm9ybS5jIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKPiBpbmRleCBmODBh YWFmOWY2MTAuLmI3ZDc5ODdmZGE5NyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2Jhc2UvcGxhdGZv cm0uYwo+ICsrKyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCj4gQEAgLTcxMSw2ICs3MTEsNjYg QEAgZXJyX291dDoKPiAgfQo+ICBFWFBPUlRfU1lNQk9MX0dQTChfX3BsYXRmb3JtX2NyZWF0ZV9i dW5kbGUpOwo+ICAKPiArLyoqCj4gKyAqIHBsYXRmb3JtX3JlZ2lzdGVyX2RyaXZlcnMgLSByZWdp c3RlciBhbiBhcnJheSBvZiBwbGF0Zm9ybSBkcml2ZXJzCj4gKyAqIEBkcml2ZXJzOiBhbiBhcnJh eSBvZiBkcml2ZXJzIHRvIHJlZ2lzdGVyCj4gKyAqIEBjb3VudDogdGhlIG51bWJlciBvZiBkcml2 ZXJzIHRvIHJlZ2lzdGVyCj4gKyAqCj4gKyAqIFJlZ2lzdGVycyBwbGF0Zm9ybSBkcml2ZXJzIHNw ZWNpZmllZCBieSBhbiBhcnJheS4gT24gZmFpbHVyZSB0byByZWdpc3RlciBhCj4gKyAqIGRyaXZl ciwgYWxsIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBkcml2ZXJzIHdpbGwgYmUgdW5yZWdpc3RlcmVk LiBDYWxsZXJzIG9mCj4gKyAqIHRoaXMgQVBJIHNob3VsZCB1c2UgcGxhdGZvcm1fdW5yZWdpc3Rl cl9kcml2ZXJzKCkgdG8gdW5yZWdpc3RlciBkcml2ZXJzIGluCj4gKyAqIHRoZSByZXZlcnNlIG9y ZGVyLgo+ICsgKgo+ICsgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJv ciBjb2RlIG9uIGZhaWx1cmUuCj4gKyAqLwo+ICtpbnQgcGxhdGZvcm1fcmVnaXN0ZXJfZHJpdmVy cyhzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyICogY29uc3QgKmRyaXZlcnMsCj4gKwkJCSAgICAgIHVu c2lnbmVkIGludCBjb3VudCkKPiArewo+ICsJdW5zaWduZWQgaW50IGk7Cj4gKwlpbnQgZXJyOwo+ ICsKPiArCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Cj4gKwkJcHJfZGVidWcoInJlZ2lz dGVyaW5nIHBsYXRmb3JtIGRyaXZlciAlcHNcbiIsIGRyaXZlcnNbaV0pOwo+ICsKPiArCQllcnIg PSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoZHJpdmVyc1tpXSk7Cj4gKwkJaWYgKGVyciA8IDAp IHsKPiArCQkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgcGxhdGZvcm0gZHJpdmVyICVwczog JWRcbiIsCj4gKwkJCSAgICAgICBkcml2ZXJzW2ldLCBlcnIpOwo+ICsJCQlnb3RvIGVycm9yOwo+ ICsJCX0KPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArCj4gK2Vycm9yOgo+ICsJd2hpbGUgKGkt LSkgewo+ICsJCXByX2RlYnVnKCJ1bnJlZ2lzdGVyaW5nIHBsYXRmb3JtIGRyaXZlciAlcHNcbiIs IGRyaXZlcnNbaV0pOwo+ICsJCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKGRyaXZlcnNbaV0p Owo+ICsJfQoKVGhpcyB3aWxsIGNhbGwgcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoKSBvbiB0 aGUgZHJpdmVyIHRoYXQgZmFpbGVkLApidXQgbm90IHRoZSBmaXJzdCBkcml2ZXIuCgpZb3Ugc2hv dWxkIHByb2JhYmx5IG1ha2UgaSBhbiBpbnQsIGFuZCB1c2Ugd2hpbGUgKC0taSA+PSAwKS4KCkJS LApKYW5pLgoKPiArCj4gKwlyZXR1cm4gZXJyOwo+ICt9Cj4gK0VYUE9SVF9TWU1CT0xfR1BMKHBs YXRmb3JtX3JlZ2lzdGVyX2RyaXZlcnMpOwo+ICsKPiArLyoqCj4gKyAqIHBsYXRmb3JtX3VucmVn aXN0ZXJfZHJpdmVycyAtIHVucmVnaXN0ZXIgYW4gYXJyYXkgb2YgcGxhdGZvcm0gZHJpdmVycwo+ ICsgKiBAZHJpdmVyczogYW4gYXJyYXkgb2YgZHJpdmVycyB0byB1bnJlZ2lzdGVyCj4gKyAqIEBj b3VudDogdGhlIG51bWJlciBvZiBkcml2ZXJzIHRvIHVucmVnaXN0ZXIKPiArICoKPiArICogVW5l Z2lzdGVycyBwbGF0Zm9ybSBkcml2ZXJzIHNwZWNpZmllZCBieSBhbiBhcnJheS4gVGhpcyBpcyB0 eXBpY2FsbHkgdXNlZAo+ICsgKiB0byBjb21wbGVtZW50IGFuIGVhcmxpZXIgY2FsbCB0byBwbGF0 Zm9ybV9yZWdpc3Rlcl9kcml2ZXJzKCkuIERyaXZlcnMgYXJlCj4gKyAqIHVucmVnaXN0ZXJlZCBp biB0aGUgcmV2ZXJzZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4KPiArICov Cj4gK3ZvaWQgcGxhdGZvcm1fdW5yZWdpc3Rlcl9kcml2ZXJzKHN0cnVjdCBwbGF0Zm9ybV9kcml2 ZXIgKiBjb25zdCAqZHJpdmVycywKPiArCQkJCSB1bnNpZ25lZCBpbnQgY291bnQpCj4gK3sKPiAr CXdoaWxlIChjb3VudC0tKSB7Cj4gKwkJcHJfZGVidWcoInVucmVnaXN0ZXJpbmcgcGxhdGZvcm0g ZHJpdmVyICVwc1xuIiwgZHJpdmVyc1tjb3VudF0pOwo+ICsJCXBsYXRmb3JtX2RyaXZlcl91bnJl Z2lzdGVyKGRyaXZlcnNbY291bnRdKTsKPiArCX0KPiArfQo+ICtFWFBPUlRfU1lNQk9MX0dQTChw bGF0Zm9ybV91bnJlZ2lzdGVyX2RyaXZlcnMpOwo+ICsKPiAgLyogbW9kYWxpYXMgc3VwcG9ydCBl bmFibGVzIG1vcmUgaGFuZHMtb2ZmIHVzZXJzcGFjZSBzZXR1cDoKPiAgICogKGEpIGVudmlyb25t ZW50IHZhcmlhYmxlIGxldHMgbmV3LXN0eWxlIGhvdHBsdWcgZXZlbnRzIHdvcmsgb25jZSBzeXN0 ZW0gaXMKPiAgICogICAgIGZ1bGx5IHJ1bm5pbmc6ICAibW9kcHJvYmUgJE1PREFMSUFTIgo+IGRp ZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oIGIvaW5jbHVkZS9saW51 eC9wbGF0Zm9ybV9kZXZpY2UuaAo+IGluZGV4IGJiYTA4ZjQ0Y2M5Ny4uMGM5ZjE2YmZkZDk5IDEw MDY0NAo+IC0tLSBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmgKPiArKysgYi9pbmNs dWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCj4gQEAgLTI3MCw2ICsyNzAsMTEgQEAgZXh0ZXJu IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9fcGxhdGZvcm1fY3JlYXRlX2J1bmRsZSgKPiAgCXN0 cnVjdCByZXNvdXJjZSAqcmVzLCB1bnNpZ25lZCBpbnQgbl9yZXMsCj4gIAljb25zdCB2b2lkICpk YXRhLCBzaXplX3Qgc2l6ZSwgc3RydWN0IG1vZHVsZSAqbW9kdWxlKTsKPiAgCj4gK2ludCBwbGF0 Zm9ybV9yZWdpc3Rlcl9kcml2ZXJzKHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKiBjb25zdCAqZHJp dmVycywKPiArCQkJICAgICAgdW5zaWduZWQgaW50IGNvdW50KTsKPiArdm9pZCBwbGF0Zm9ybV91 bnJlZ2lzdGVyX2RyaXZlcnMoc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqIGNvbnN0ICpkcml2ZXJz LAo+ICsJCQkJIHVuc2lnbmVkIGludCBjb3VudCk7Cj4gKwo+ICAvKiBlYXJseSBwbGF0Zm9ybSBk cml2ZXIgaW50ZXJmYWNlICovCj4gIHN0cnVjdCBlYXJseV9wbGF0Zm9ybV9kcml2ZXIgewo+ICAJ Y29uc3QgY2hhciAqY2xhc3Nfc3RyOwo+IC0tIAo+IDIuNS4wCj4KPiBfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+IGRyaS1kZXZlbCBtYWlsaW5nIGxpc3QK PiBkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4gaHR0cDovL2xpc3RzLmZyZWVkZXNr dG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAoKLS0gCkphbmkgTmlrdWxhLCBJbnRl bCBPcGVuIFNvdXJjZSBUZWNobm9sb2d5IENlbnRlcgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBs aXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFu L2xpc3RpbmZvL2RyaS1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753399AbbIYKYN (ORCPT ); Fri, 25 Sep 2015 06:24:13 -0400 Received: from mga09.intel.com ([134.134.136.24]:33868 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752442AbbIYKYL (ORCPT ); Fri, 25 Sep 2015 06:24:11 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.17,586,1437462000"; d="scan'208";a="812733328" From: Jani Nikula To: Thierry Reding , dri-devel@lists.freedesktop.org Cc: Greg Kroah-Hartman , linux-kernel@vger.kernel.org Subject: Re: [PATCH 1/6] driver-core: platform: Provide helpers for multi-driver modules In-Reply-To: <1443114161-7965-1-git-send-email-thierry.reding@gmail.com> Organization: Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo References: <1443114161-7965-1-git-send-email-thierry.reding@gmail.com> User-Agent: Notmuch/0.20.2+58~g39779b9 (http://notmuchmail.org) Emacs/24.4.1 (x86_64-pc-linux-gnu) Date: Fri, 25 Sep 2015 13:27:28 +0300 Message-ID: <87wpven69b.fsf@intel.com> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 24 Sep 2015, Thierry Reding wrote: > From: Thierry Reding > > Some modules register several sub-drivers. Provide a helper that makes > it easy to register and unregister a list of sub-drivers, as well as > unwind properly on error. > > Cc: Greg Kroah-Hartman > Signed-off-by: Thierry Reding > --- > Documentation/driver-model/platform.txt | 11 ++++++ > drivers/base/platform.c | 60 +++++++++++++++++++++++++++++++++ > include/linux/platform_device.h | 5 +++ > 3 files changed, 76 insertions(+) > > diff --git a/Documentation/driver-model/platform.txt b/Documentation/driver-model/platform.txt > index 07795ec51cde..e80468738ba9 100644 > --- a/Documentation/driver-model/platform.txt > +++ b/Documentation/driver-model/platform.txt > @@ -63,6 +63,17 @@ runtime memory footprint: > int platform_driver_probe(struct platform_driver *drv, > int (*probe)(struct platform_device *)) > > +Kernel modules can be composed of several platform drivers. The platform core > +provides helpers to register and unregister an array of drivers: > + > + int platform_register_drivers(struct platform_driver * const *drivers, > + unsigned int count); > + void platform_unregister_drivers(struct platform_driver * const *drivers, > + unsigned int count); > + > +If one of the drivers fails to register, all drivers registered up to that > +point will be unregistered in reverse order. > + > > Device Enumeration > ~~~~~~~~~~~~~~~~~~ > diff --git a/drivers/base/platform.c b/drivers/base/platform.c > index f80aaaf9f610..b7d7987fda97 100644 > --- a/drivers/base/platform.c > +++ b/drivers/base/platform.c > @@ -711,6 +711,66 @@ err_out: > } > EXPORT_SYMBOL_GPL(__platform_create_bundle); > > +/** > + * platform_register_drivers - register an array of platform drivers > + * @drivers: an array of drivers to register > + * @count: the number of drivers to register > + * > + * Registers platform drivers specified by an array. On failure to register a > + * driver, all previously registered drivers will be unregistered. Callers of > + * this API should use platform_unregister_drivers() to unregister drivers in > + * the reverse order. > + * > + * Returns: 0 on success or a negative error code on failure. > + */ > +int platform_register_drivers(struct platform_driver * const *drivers, > + unsigned int count) > +{ > + unsigned int i; > + int err; > + > + for (i = 0; i < count; i++) { > + pr_debug("registering platform driver %ps\n", drivers[i]); > + > + err = platform_driver_register(drivers[i]); > + if (err < 0) { > + pr_err("failed to register platform driver %ps: %d\n", > + drivers[i], err); > + goto error; > + } > + } > + > + return 0; > + > +error: > + while (i--) { > + pr_debug("unregistering platform driver %ps\n", drivers[i]); > + platform_driver_unregister(drivers[i]); > + } This will call platform_driver_unregister() on the driver that failed, but not the first driver. You should probably make i an int, and use while (--i >= 0). BR, Jani. > + > + return err; > +} > +EXPORT_SYMBOL_GPL(platform_register_drivers); > + > +/** > + * platform_unregister_drivers - unregister an array of platform drivers > + * @drivers: an array of drivers to unregister > + * @count: the number of drivers to unregister > + * > + * Unegisters platform drivers specified by an array. This is typically used > + * to complement an earlier call to platform_register_drivers(). Drivers are > + * unregistered in the reverse order in which they were registered. > + */ > +void platform_unregister_drivers(struct platform_driver * const *drivers, > + unsigned int count) > +{ > + while (count--) { > + pr_debug("unregistering platform driver %ps\n", drivers[count]); > + platform_driver_unregister(drivers[count]); > + } > +} > +EXPORT_SYMBOL_GPL(platform_unregister_drivers); > + > /* modalias support enables more hands-off userspace setup: > * (a) environment variable lets new-style hotplug events work once system is > * fully running: "modprobe $MODALIAS" > diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h > index bba08f44cc97..0c9f16bfdd99 100644 > --- a/include/linux/platform_device.h > +++ b/include/linux/platform_device.h > @@ -270,6 +270,11 @@ extern struct platform_device *__platform_create_bundle( > struct resource *res, unsigned int n_res, > const void *data, size_t size, struct module *module); > > +int platform_register_drivers(struct platform_driver * const *drivers, > + unsigned int count); > +void platform_unregister_drivers(struct platform_driver * const *drivers, > + unsigned int count); > + > /* early platform driver interface */ > struct early_platform_driver { > const char *class_str; > -- > 2.5.0 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel -- Jani Nikula, Intel Open Source Technology Center