From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sean Paul Subject: Re: [PATCH v3] drm/rockchip: Refactor the component match logic. Date: Wed, 15 Mar 2017 09:52:34 -0400 Message-ID: <20170315135234.GD20329@art_vandelay> References: <1489573247-9628-1-git-send-email-jeffy.chen@rock-chips.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <1489573247-9628-1-git-send-email-jeffy.chen@rock-chips.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Jeffy Chen Cc: linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, Brian Norris , Douglas Anderson , dri-devel@lists.freedesktop.org, Tomasz Figa , Guenter Roeck , linux-arm-kernel@lists.infradead.org List-Id: linux-rockchip.vger.kernel.org T24gV2VkLCBNYXIgMTUsIDIwMTcgYXQgMDY6MjA6NDdQTSArMDgwMCwgSmVmZnkgQ2hlbiB3cm90 ZToKPiBDdXJyZW50bHkgd2UgYXJlIGFkZGluZyBhbGwgY29tcG9uZW50cyBmcm9tIHRoZSBkdHMs IGlmIG9uZSBvZiB0aGVpcgo+IGRyaXZlcnMgYmVlbiBkaXNhYmxlZCwgd2Ugd291bGQgbm90IGJl IGFibGUgdG8gYnJpbmcgdXAgb3RoZXJzLgo+IAo+IFJlZmFjdG9yIGNvbXBvbmVudCBtYXRjaCBs b2dpYywgZm9sbG93IGV4eW5vcyBkcm0uCj4gCj4gU2lnbmVkLW9mZi1ieTogSmVmZnkgQ2hlbiA8 amVmZnkuY2hlbkByb2NrLWNoaXBzLmNvbT4KPiBSZXZpZXdlZC1ieTogQW5kcnplaiBIYWpkYSA8 YS5oYWpkYUBzYW1zdW5nLmNvbT4KClN0aWxsIGxvb2tzIGdvb2QgdG8gbWUuIElmIE1hcmsgZG9l c24ndCBvYmplY3QgaW4gdGhlIG5leHQgMjQgaG91cnMsIEknbGwgYXBwbHkuCgpTZWFuCgo+IAo+ IC0tLQo+IAo+IENoYW5nZXMgaW4gdjM6Cj4gQWRkcmVzcyBBbmRyemVqIEhhamRhIDxhLmhhamRh QHNhbXN1bmcuY29tPidzIGNvbW1lbnRzLgo+IAo+IENoYW5nZXMgaW4gdjI6Cj4gQWRkcmVzcyBT ZWFuIFBhdWwgPHNlYW5wYXVsQGNocm9taXVtLm9yZz4ncyBjb21tZW50cy4KPiAKPiAgZHJpdmVy cy9ncHUvZHJtL3JvY2tjaGlwL0tjb25maWcgICAgICAgICAgICAgICAgfCAgMTAgKy0KPiAgZHJp dmVycy9ncHUvZHJtL3JvY2tjaGlwL01ha2VmaWxlICAgICAgICAgICAgICAgfCAgMTYgKy0tCj4g IGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9hbmFsb2dpeF9kcC1yb2NrY2hpcC5jIHwgICA5ICst Cj4gIGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9jZG4tZHAtY29yZS5jICAgICAgICAgIHwgICA4 ICstCj4gIGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9kdy1taXBpLWRzaS5jICAgICAgICAgIHwg ICA4ICstCj4gIGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9kd19oZG1pLXJvY2tjaGlwLmMgICAg IHwgIDEwICstCj4gIGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9pbm5vX2hkbWkuYyAgICAgICAg ICAgIHwgIDEwICstCj4gIGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZHJ2 LmMgICAgIHwgMTU0ICsrKysrKysrKysrKysrKystLS0tLS0tLQo+ICBkcml2ZXJzL2dwdS9kcm0v cm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Rydi5oICAgICB8ICAgNiArCj4gIGRyaXZlcnMvZ3B1L2Ry bS9yb2NrY2hpcC9yb2NrY2hpcF92b3BfcmVnLmMgICAgIHwgICA4ICstCj4gIDEwIGZpbGVzIGNo YW5nZWQsIDEzMSBpbnNlcnRpb25zKCspLCAxMDggZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL3Jv Y2tjaGlwL0tjb25maWcKPiBpbmRleCAwZTRlYjg0Li41MGM0MWMwIDEwMDY0NAo+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9LY29uZmlnCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3Jv Y2tjaGlwL0tjb25maWcKPiBAQCAtMTMsNyArMTMsNyBAQCBjb25maWcgRFJNX1JPQ0tDSElQCj4g IAkgIElQIGZvdW5kIG9uIHRoZSBTb0MuCj4gIAo+ICBjb25maWcgUk9DS0NISVBfQU5BTE9HSVhf RFAKPiAtCXRyaXN0YXRlICJSb2NrY2hpcCBzcGVjaWZpYyBleHRlbnNpb25zIGZvciBBbmFsb2dp eCBEUCBkcml2ZXIiCj4gKwlib29sICJSb2NrY2hpcCBzcGVjaWZpYyBleHRlbnNpb25zIGZvciBB bmFsb2dpeCBEUCBkcml2ZXIiCj4gIAlkZXBlbmRzIG9uIERSTV9ST0NLQ0hJUAo+ICAJc2VsZWN0 IERSTV9BTkFMT0dJWF9EUAo+ICAJaGVscAo+IEBAIC0yMiw3ICsyMiw3IEBAIGNvbmZpZyBST0NL Q0hJUF9BTkFMT0dJWF9EUAo+ICAJICBvbiBSSzMyODggYmFzZWQgU29DLCB5b3Ugc2hvdWxkIHNl bGV0IHRoaXMgb3B0aW9uLgo+ICAKPiAgY29uZmlnIFJPQ0tDSElQX0NETl9EUAo+IC0gICAgICAg IHRyaXN0YXRlICJSb2NrY2hpcCBjZG4gRFAiCj4gKyAgICAgICAgYm9vbCAiUm9ja2NoaXAgY2Ru IERQIgo+ICAgICAgICAgIGRlcGVuZHMgb24gRFJNX1JPQ0tDSElQCj4gIAlkZXBlbmRzIG9uIEVY VENPTgo+ICAJc2VsZWN0IFNORF9TT0NfSERNSV9DT0RFQyBpZiBTTkRfU09DCj4gQEAgLTMzLDcg KzMzLDcgQEAgY29uZmlnIFJPQ0tDSElQX0NETl9EUAo+ICAJICBvcHRpb24uCj4gIAo+ICBjb25m aWcgUk9DS0NISVBfRFdfSERNSQo+IC0gICAgICAgIHRyaXN0YXRlICJSb2NrY2hpcCBzcGVjaWZp YyBleHRlbnNpb25zIGZvciBTeW5vcHN5cyBEVyBIRE1JIgo+ICsgICAgICAgIGJvb2wgIlJvY2tj aGlwIHNwZWNpZmljIGV4dGVuc2lvbnMgZm9yIFN5bm9wc3lzIERXIEhETUkiCj4gICAgICAgICAg ZGVwZW5kcyBvbiBEUk1fUk9DS0NISVAKPiAgICAgICAgICBzZWxlY3QgRFJNX0RXX0hETUkKPiAg ICAgICAgICBoZWxwCj4gQEAgLTQzLDcgKzQzLDcgQEAgY29uZmlnIFJPQ0tDSElQX0RXX0hETUkK PiAgCSAgb3B0aW9uLgo+ICAKPiAgY29uZmlnIFJPQ0tDSElQX0RXX01JUElfRFNJCj4gLQl0cmlz dGF0ZSAiUm9ja2NoaXAgc3BlY2lmaWMgZXh0ZW5zaW9ucyBmb3IgU3lub3BzeXMgRFcgTUlQSSBE U0kiCj4gKwlib29sICJSb2NrY2hpcCBzcGVjaWZpYyBleHRlbnNpb25zIGZvciBTeW5vcHN5cyBE VyBNSVBJIERTSSIKPiAgCWRlcGVuZHMgb24gRFJNX1JPQ0tDSElQCj4gIAlzZWxlY3QgRFJNX01J UElfRFNJCj4gIAloZWxwCj4gQEAgLTUzLDcgKzUzLDcgQEAgY29uZmlnIFJPQ0tDSElQX0RXX01J UElfRFNJCj4gIAkgb3B0aW9uLgo+ICAKPiAgY29uZmlnIFJPQ0tDSElQX0lOTk9fSERNSQo+IC0J dHJpc3RhdGUgIlJvY2tjaGlwIHNwZWNpZmljIGV4dGVuc2lvbnMgZm9yIElubm9zaWxpY29uIEhE TUkiCj4gKwlib29sICJSb2NrY2hpcCBzcGVjaWZpYyBleHRlbnNpb25zIGZvciBJbm5vc2lsaWNv biBIRE1JIgo+ICAJZGVwZW5kcyBvbiBEUk1fUk9DS0NISVAKPiAgCWhlbHAKPiAgCSAgVGhpcyBz ZWxlY3RzIHN1cHBvcnQgZm9yIFJvY2tjaGlwIFNvQyBzcGVjaWZpYyBleHRlbnNpb25zCj4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1 L2RybS9yb2NrY2hpcC9NYWtlZmlsZQo+IGluZGV4IGM5MzFlMmEuLmZhOGRjOWQgMTAwNjQ0Cj4g LS0tIGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL01ha2VmaWxlCj4gKysrIGIvZHJpdmVycy9n cHUvZHJtL3JvY2tjaGlwL01ha2VmaWxlCj4gQEAgLTMsMTQgKzMsMTQgQEAKPiAgIyBEaXJlY3Qg UmVuZGVyaW5nIEluZnJhc3RydWN0dXJlIChEUkkpIGluIFhGcmVlODYgNC4xLjAgYW5kIGhpZ2hl ci4KPiAgCj4gIHJvY2tjaGlwZHJtLXkgOj0gcm9ja2NoaXBfZHJtX2Rydi5vIHJvY2tjaGlwX2Ry bV9mYi5vIFwKPiAtCQlyb2NrY2hpcF9kcm1fZ2VtLm8gcm9ja2NoaXBfZHJtX3Bzci5vIHJvY2tj aGlwX2RybV92b3Aubwo+ICsJCXJvY2tjaGlwX2RybV9nZW0ubyByb2NrY2hpcF9kcm1fcHNyLm8g XAo+ICsJCXJvY2tjaGlwX2RybV92b3AubyByb2NrY2hpcF92b3BfcmVnLm8KPiAgcm9ja2NoaXBk cm0tJChDT05GSUdfRFJNX0ZCREVWX0VNVUxBVElPTikgKz0gcm9ja2NoaXBfZHJtX2ZiZGV2Lm8K PiAgCj4gLW9iai0kKENPTkZJR19ST0NLQ0hJUF9BTkFMT0dJWF9EUCkgKz0gYW5hbG9naXhfZHAt cm9ja2NoaXAubwo+IC1vYmotJChDT05GSUdfUk9DS0NISVBfQ0ROX0RQKSArPSBjZG4tZHAubwo+ IC1jZG4tZHAtb2JqcyA6PSBjZG4tZHAtY29yZS5vIGNkbi1kcC1yZWcubwo+IC1vYmotJChDT05G SUdfUk9DS0NISVBfRFdfSERNSSkgKz0gZHdfaGRtaS1yb2NrY2hpcC5vCj4gLW9iai0kKENPTkZJ R19ST0NLQ0hJUF9EV19NSVBJX0RTSSkgKz0gZHctbWlwaS1kc2kubwo+IC1vYmotJChDT05GSUdf Uk9DS0NISVBfSU5OT19IRE1JKSArPSBpbm5vX2hkbWkubwo+ICtyb2NrY2hpcGRybS0kKENPTkZJ R19ST0NLQ0hJUF9BTkFMT0dJWF9EUCkgKz0gYW5hbG9naXhfZHAtcm9ja2NoaXAubwo+ICtyb2Nr Y2hpcGRybS0kKENPTkZJR19ST0NLQ0hJUF9DRE5fRFApICs9IGNkbi1kcC1jb3JlLm8gY2RuLWRw LXJlZy5vCj4gK3JvY2tjaGlwZHJtLSQoQ09ORklHX1JPQ0tDSElQX0RXX0hETUkpICs9IGR3X2hk bWktcm9ja2NoaXAubwo+ICtyb2NrY2hpcGRybS0kKENPTkZJR19ST0NLQ0hJUF9EV19NSVBJX0RT SSkgKz0gZHctbWlwaS1kc2kubwo+ICtyb2NrY2hpcGRybS0kKENPTkZJR19ST0NLQ0hJUF9JTk5P X0hETUkpICs9IGlubm9faGRtaS5vCj4gIAo+IC1vYmotJChDT05GSUdfRFJNX1JPQ0tDSElQKSAr PSByb2NrY2hpcGRybS5vIHJvY2tjaGlwX3ZvcF9yZWcubwo+ICtvYmotJChDT05GSUdfRFJNX1JP Q0tDSElQKSArPSByb2NrY2hpcGRybS5vCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9y b2NrY2hpcC9hbmFsb2dpeF9kcC1yb2NrY2hpcC5jIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlw L2FuYWxvZ2l4X2RwLXJvY2tjaGlwLmMKPiBpbmRleCA4NTQ4ZTgyLi45MWViZTVjIDEwMDY0NAo+ IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9hbmFsb2dpeF9kcC1yb2NrY2hpcC5jCj4g KysrIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2FuYWxvZ2l4X2RwLXJvY2tjaGlwLmMKPiBA QCAtNTA3LDcgKzUwNyw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJvY2tj aGlwX2RwX2R0X2lkc1tdID0gewo+ICB9Owo+ICBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCByb2Nr Y2hpcF9kcF9kdF9pZHMpOwo+ICAKPiAtc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcm9j a2NoaXBfZHBfZHJpdmVyID0gewo+ICtzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJvY2tjaGlwX2Rw X2RyaXZlciA9IHsKPiAgCS5wcm9iZSA9IHJvY2tjaGlwX2RwX3Byb2JlLAo+ICAJLnJlbW92ZSA9 IHJvY2tjaGlwX2RwX3JlbW92ZSwKPiAgCS5kcml2ZXIgPSB7Cj4gQEAgLTUxNiwxMCArNTE2LDMg QEAgc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcm9ja2NoaXBfZHBfZHJpdmVyID0gewo+ ICAJCSAgIC5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihyb2NrY2hpcF9kcF9kdF9pZHMp LAo+ICAJfSwKPiAgfTsKPiAtCj4gLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIocm9ja2NoaXBfZHBf ZHJpdmVyKTsKPiAtCj4gLU1PRFVMRV9BVVRIT1IoIllha2lyIFlhbmcgPHlra0Byb2NrLWNoaXBz LmNvbT4iKTsKPiAtTU9EVUxFX0FVVEhPUigiSmVmZiBjaGVuIDxqZWZmLmNoZW5Acm9jay1jaGlw cy5jb20+Iik7Cj4gLU1PRFVMRV9ERVNDUklQVElPTigiUm9ja2NoaXAgU3BlY2lmaWMgQW5hbG9n aXgtRFAgRHJpdmVyIEV4dGVuc2lvbiIpOwo+IC1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9jZG4tZHAtY29yZS5jIGIvZHJp dmVycy9ncHUvZHJtL3JvY2tjaGlwL2Nkbi1kcC1jb3JlLmMKPiBpbmRleCBmZDc5YTcwLi5lMTc5 NmQwIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9jZG4tZHAtY29yZS5j Cj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2Nkbi1kcC1jb3JlLmMKPiBAQCAtMTI0 Myw3ICsxMjQzLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGNkbl9kcF9wbV9v cHMgPSB7Cj4gIAkJCQljZG5fZHBfcmVzdW1lKQo+ICB9Owo+ICAKPiAtc3RhdGljIHN0cnVjdCBw bGF0Zm9ybV9kcml2ZXIgY2RuX2RwX2RyaXZlciA9IHsKPiArc3RydWN0IHBsYXRmb3JtX2RyaXZl ciBjZG5fZHBfZHJpdmVyID0gewo+ICAJLnByb2JlID0gY2RuX2RwX3Byb2JlLAo+ICAJLnJlbW92 ZSA9IGNkbl9kcF9yZW1vdmUsCj4gIAkuc2h1dGRvd24gPSBjZG5fZHBfc2h1dGRvd24sCj4gQEAg LTEyNTQsOSArMTI1NCwzIEBAIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNkbl9kcF9k cml2ZXIgPSB7Cj4gIAkJICAgLnBtID0gJmNkbl9kcF9wbV9vcHMsCj4gIAl9LAo+ICB9Owo+IC0K PiAtbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihjZG5fZHBfZHJpdmVyKTsKPiAtCj4gLU1PRFVMRV9B VVRIT1IoIkNocmlzIFpob25nIDx6eXdAcm9jay1jaGlwcy5jb20+Iik7Cj4gLU1PRFVMRV9ERVND UklQVElPTigiY2RuIERQIERyaXZlciIpOwo+IC1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9kdy1taXBpLWRzaS5jIGIvZHJp dmVycy9ncHUvZHJtL3JvY2tjaGlwL2R3LW1pcGktZHNpLmMKPiBpbmRleCBkOWFhMzgyLi42NWE0 NzRmIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9kdy1taXBpLWRzaS5j Cj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2R3LW1pcGktZHNpLmMKPiBAQCAtMTE2 NSw3ICsxMTY1LDcgQEAgc3RhdGljIGludCBkd19taXBpX2RzaV9yZW1vdmUoc3RydWN0IHBsYXRm b3JtX2RldmljZSAqcGRldikKPiAgCXJldHVybiAwOwo+ICB9Cj4gIAo+IC1zdGF0aWMgc3RydWN0 IHBsYXRmb3JtX2RyaXZlciBkd19taXBpX2RzaV9kcml2ZXIgPSB7Cj4gK3N0cnVjdCBwbGF0Zm9y bV9kcml2ZXIgZHdfbWlwaV9kc2lfZHJpdmVyID0gewo+ICAJLnByb2JlCQk9IGR3X21pcGlfZHNp X3Byb2JlLAo+ICAJLnJlbW92ZQkJPSBkd19taXBpX2RzaV9yZW1vdmUsCj4gIAkuZHJpdmVyCQk9 IHsKPiBAQCAtMTE3Myw5ICsxMTczLDMgQEAgc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIg ZHdfbWlwaV9kc2lfZHJpdmVyID0gewo+ICAJCS5uYW1lCT0gRFJJVkVSX05BTUUsCj4gIAl9LAo+ ICB9Owo+IC1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGR3X21pcGlfZHNpX2RyaXZlcik7Cj4gLQo+ IC1NT0RVTEVfREVTQ1JJUFRJT04oIlJPQ0tDSElQIE1JUEkgRFNJIGhvc3QgY29udHJvbGxlciBk cml2ZXIiKTsKPiAtTU9EVUxFX0FVVEhPUigiQ2hyaXMgWmhvbmcgPHp5d0Byb2NrLWNoaXBzLmNv bT4iKTsKPiAtTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo+IC1NT0RVTEVfQUxJQVMoInBsYXRmb3Jt OiIgRFJJVkVSX05BTUUpOwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAv ZHdfaGRtaS1yb2NrY2hpcC5jIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2R3X2hkbWktcm9j a2NoaXAuYwo+IGluZGV4IGE2ZDRhMDIuLjk3NmVhNzkgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9n cHUvZHJtL3JvY2tjaGlwL2R3X2hkbWktcm9ja2NoaXAuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9yb2NrY2hpcC9kd19oZG1pLXJvY2tjaGlwLmMKPiBAQCAtMzI2LDcgKzMyNiw3IEBAIHN0YXRp YyBpbnQgZHdfaGRtaV9yb2NrY2hpcF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRl dikKPiAgCXJldHVybiAwOwo+ICB9Cj4gIAo+IC1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZl ciBkd19oZG1pX3JvY2tjaGlwX3BsdGZtX2RyaXZlciA9IHsKPiArc3RydWN0IHBsYXRmb3JtX2Ry aXZlciBkd19oZG1pX3JvY2tjaGlwX3BsdGZtX2RyaXZlciA9IHsKPiAgCS5wcm9iZSAgPSBkd19o ZG1pX3JvY2tjaGlwX3Byb2JlLAo+ICAJLnJlbW92ZSA9IGR3X2hkbWlfcm9ja2NoaXBfcmVtb3Zl LAo+ICAJLmRyaXZlciA9IHsKPiBAQCAtMzM0LDExICszMzQsMyBAQCBzdGF0aWMgc3RydWN0IHBs YXRmb3JtX2RyaXZlciBkd19oZG1pX3JvY2tjaGlwX3BsdGZtX2RyaXZlciA9IHsKPiAgCQkub2Zf bWF0Y2hfdGFibGUgPSBkd19oZG1pX3JvY2tjaGlwX2R0X2lkcywKPiAgCX0sCj4gIH07Cj4gLQo+ IC1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGR3X2hkbWlfcm9ja2NoaXBfcGx0Zm1fZHJpdmVyKTsK PiAtCj4gLU1PRFVMRV9BVVRIT1IoIkFuZHkgWWFuIDxhbmR5LnlhbkByb2NrLWNoaXBzLmNvbT4i KTsKPiAtTU9EVUxFX0FVVEhPUigiWWFraXIgWWFuZyA8eWtrQHJvY2stY2hpcHMuY29tPiIpOwo+ IC1NT0RVTEVfREVTQ1JJUFRJT04oIlJvY2tjaGlwIFNwZWNpZmljIERXLUhETUkgRHJpdmVyIEV4 dGVuc2lvbiIpOwo+IC1NT0RVTEVfTElDRU5TRSgiR1BMIik7Cj4gLU1PRFVMRV9BTElBUygicGxh dGZvcm06ZHdoZG1pLXJvY2tjaGlwIik7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9y b2NrY2hpcC9pbm5vX2hkbWkuYyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9pbm5vX2hkbWku Ywo+IGluZGV4IDAwNjI2MGQuLjdkOWI3NWUgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJt L3JvY2tjaGlwL2lubm9faGRtaS5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2lu bm9faGRtaS5jCj4gQEAgLTkyMyw3ICs5MjMsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2Rl dmljZV9pZCBpbm5vX2hkbWlfZHRfaWRzW10gPSB7Cj4gIH07Cj4gIE1PRFVMRV9ERVZJQ0VfVEFC TEUob2YsIGlubm9faGRtaV9kdF9pZHMpOwo+ICAKPiAtc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9k cml2ZXIgaW5ub19oZG1pX2RyaXZlciA9IHsKPiArc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpbm5v X2hkbWlfZHJpdmVyID0gewo+ICAJLnByb2JlICA9IGlubm9faGRtaV9wcm9iZSwKPiAgCS5yZW1v dmUgPSBpbm5vX2hkbWlfcmVtb3ZlLAo+ICAJLmRyaXZlciA9IHsKPiBAQCAtOTMxLDExICs5MzEs MyBAQCBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpbm5vX2hkbWlfZHJpdmVyID0gewo+ ICAJCS5vZl9tYXRjaF90YWJsZSA9IGlubm9faGRtaV9kdF9pZHMsCj4gIAl9LAo+ICB9Owo+IC0K PiAtbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihpbm5vX2hkbWlfZHJpdmVyKTsKPiAtCj4gLU1PRFVM RV9BVVRIT1IoIlpoZW5nIFlhbmcgPHpoZW5neWFuZ0Byb2NrLWNoaXBzLmNvbT4iKTsKPiAtTU9E VUxFX0FVVEhPUigiWWFraXIgWWFuZyA8eWtrQHJvY2stY2hpcHMuY29tPiIpOwo+IC1NT0RVTEVf REVTQ1JJUFRJT04oIlJvY2tjaGlwIFNwZWNpZmljIElOTk8tSERNSSBEcml2ZXIiKTsKPiAtTU9E VUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwo+IC1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOmlubm9oZG1p LXJvY2tjaGlwIik7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2Nr Y2hpcF9kcm1fZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Ry di5jCj4gaW5kZXggYjM2MGU2Mi4uOWNiMjk1YiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9k cm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX2Rydi5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3Jv Y2tjaGlwL3JvY2tjaGlwX2RybV9kcnYuYwo+IEBAIC0zNTYsMzQgKzM1Niw0NCBAQCBzdGF0aWMg Y29uc3Qgc3RydWN0IGRldl9wbV9vcHMgcm9ja2NoaXBfZHJtX3BtX29wcyA9IHsKPiAgCQkJCXJv Y2tjaGlwX2RybV9zeXNfcmVzdW1lKQo+ICB9Owo+ICAKPiAtc3RhdGljIGludCBjb21wYXJlX29m KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKPiAtewo+IC0Jc3RydWN0IGRldmljZV9u b2RlICpucCA9IGRhdGE7Cj4gKyNkZWZpbmUgRFJWX1BUUihkcnYsIGNvbmQpIChJU19FTkFCTEVE KGNvbmQpID8gJmRydiA6IE5VTEwpCj4gKwo+ICtzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZl ciAqcm9ja2NoaXBfZHJtX2NvbXBfZHJ2c1tdID0gewo+ICsJJnZvcF9wbGF0Zm9ybV9kcml2ZXIs Cj4gKwlEUlZfUFRSKHJvY2tjaGlwX2RwX2RyaXZlciwgQ09ORklHX1JPQ0tDSElQX0FOQUxPR0lY X0RQKSwKPiArCURSVl9QVFIoY2RuX2RwX2RyaXZlciwgQ09ORklHX1JPQ0tDSElQX0NETl9EUCks Cj4gKwlEUlZfUFRSKGR3X2hkbWlfcm9ja2NoaXBfcGx0Zm1fZHJpdmVyLCBDT05GSUdfUk9DS0NI SVBfRFdfSERNSSksCj4gKwlEUlZfUFRSKGR3X21pcGlfZHNpX2RyaXZlciwgQ09ORklHX1JPQ0tD SElQX0RXX01JUElfRFNJKSwKPiArCURSVl9QVFIoaW5ub19oZG1pX2RyaXZlciwgQ09ORklHX1JP Q0tDSElQX0lOTk9fSERNSSksCj4gK307Cj4gIAo+IC0JcmV0dXJuIGRldi0+b2Zfbm9kZSA9PSBu cDsKPiArc3RhdGljIGludCBjb21wYXJlX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRh dGEpCj4gK3sKPiArCXJldHVybiBkZXYgPT0gKHN0cnVjdCBkZXZpY2UgKilkYXRhOwo+ICB9Cj4g IAo+IC1zdGF0aWMgdm9pZCByb2NrY2hpcF9hZGRfZW5kcG9pbnRzKHN0cnVjdCBkZXZpY2UgKmRl diwKPiAtCQkJCSAgIHN0cnVjdCBjb21wb25lbnRfbWF0Y2ggKiptYXRjaCwKPiAtCQkJCSAgIHN0 cnVjdCBkZXZpY2Vfbm9kZSAqcG9ydCkKPiArc3RhdGljIHN0cnVjdCBjb21wb25lbnRfbWF0Y2gg KnJvY2tjaGlwX2RybV9tYXRjaF9hZGQoc3RydWN0IGRldmljZSAqZGV2KQo+ICB7Cj4gLQlzdHJ1 Y3QgZGV2aWNlX25vZGUgKmVwLCAqcmVtb3RlOwo+ICsJc3RydWN0IGNvbXBvbmVudF9tYXRjaCAq bWF0Y2ggPSBOVUxMOwo+ICsJaW50IGk7Cj4gIAo+IC0JZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShw b3J0LCBlcCkgewo+IC0JCXJlbW90ZSA9IG9mX2dyYXBoX2dldF9yZW1vdGVfcG9ydF9wYXJlbnQo ZXApOwo+IC0JCWlmICghcmVtb3RlIHx8ICFvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKHJlbW90ZSkp IHsKPiAtCQkJb2Zfbm9kZV9wdXQocmVtb3RlKTsKPiAtCQkJY29udGludWU7Cj4gLQkJfSBlbHNl IGlmICghb2ZfZGV2aWNlX2lzX2F2YWlsYWJsZShyZW1vdGUtPnBhcmVudCkpIHsKPiAtCQkJZGV2 X3dhcm4oZGV2LCAicGFyZW50IGRldmljZSBvZiAlcyBpcyBub3QgYXZhaWxhYmxlXG4iLAo+IC0J CQkJIHJlbW90ZS0+ZnVsbF9uYW1lKTsKPiAtCQkJb2Zfbm9kZV9wdXQocmVtb3RlKTsKPiAtCQkJ Y29udGludWU7Cj4gLQkJfQo+ICsJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocm9ja2NoaXBf ZHJtX2NvbXBfZHJ2cyk7IGkrKykgewo+ICsJCXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKmRydiA9 IHJvY2tjaGlwX2RybV9jb21wX2RydnNbaV07Cj4gKwkJc3RydWN0IGRldmljZSAqcCA9IE5VTEws ICpkOwo+ICsKPiArCQlkbyB7Cj4gKwkJCWQgPSBidXNfZmluZF9kZXZpY2UoJnBsYXRmb3JtX2J1 c190eXBlLCBwLCAmZHJ2LT5kcml2ZXIsCj4gKwkJCQkJICAgICh2b2lkICopcGxhdGZvcm1fYnVz X3R5cGUubWF0Y2gpOwo+ICsJCQlwdXRfZGV2aWNlKHApOwo+ICsJCQlwID0gZDsKPiAgCj4gLQkJ ZHJtX29mX2NvbXBvbmVudF9tYXRjaF9hZGQoZGV2LCBtYXRjaCwgY29tcGFyZV9vZiwgcmVtb3Rl KTsKPiAtCQlvZl9ub2RlX3B1dChyZW1vdGUpOwo+ICsJCQlpZiAoIWQpCj4gKwkJCQlicmVhazsK PiArCQkJY29tcG9uZW50X21hdGNoX2FkZChkZXYsICZtYXRjaCwgY29tcGFyZV9kZXYsIGQpOwo+ ICsJCX0gd2hpbGUgKHRydWUpOwo+ICAJfQo+ICsKPiArCXJldHVybiBtYXRjaCA/OiBFUlJfUFRS KC1FTk9ERVYpOwo+ICB9Cj4gIAo+ICBzdGF0aWMgY29uc3Qgc3RydWN0IGNvbXBvbmVudF9tYXN0 ZXJfb3BzIHJvY2tjaGlwX2RybV9vcHMgPSB7Cj4gQEAgLTM5MSwyMSArNDAxLDE2IEBAIHN0YXRp YyBjb25zdCBzdHJ1Y3QgY29tcG9uZW50X21hc3Rlcl9vcHMgcm9ja2NoaXBfZHJtX29wcyA9IHsK PiAgCS51bmJpbmQgPSByb2NrY2hpcF9kcm1fdW5iaW5kLAo+ICB9Owo+ICAKPiAtc3RhdGljIGlu dCByb2NrY2hpcF9kcm1fcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRl dikKPiArc3RhdGljIGludCByb2NrY2hpcF9kcm1fcGxhdGZvcm1fb2ZfcHJvYmUoc3RydWN0IGRl dmljZSAqZGV2KQo+ICB7Cj4gLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2Owo+IC0J c3RydWN0IGNvbXBvbmVudF9tYXRjaCAqbWF0Y2ggPSBOVUxMOwo+ICAJc3RydWN0IGRldmljZV9u b2RlICpucCA9IGRldi0+b2Zfbm9kZTsKPiAgCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcG9ydDsKPiAr CWJvb2wgZm91bmQgPSBmYWxzZTsKPiAgCWludCBpOwo+ICAKPiAgCWlmICghbnApCj4gIAkJcmV0 dXJuIC1FTk9ERVY7Cj4gLQkvKgo+IC0JICogQmluZCB0aGUgY3J0YyBwb3J0cyBmaXJzdCwgc28g dGhhdAo+IC0JICogZHJtX29mX2ZpbmRfcG9zc2libGVfY3J0Y3MgY2FsbGVkIGZyb20gZW5jb2Rl ciAuYmluZCBjYWxsYmFja3MKPiAtCSAqIHdvcmtzIGFzIGV4cGVjdGVkLgo+IC0JICovCj4gKwo+ ICAJZm9yIChpID0gMDs7IGkrKykgewo+ICAJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaW9tbXU7Cj4g IAo+IEBAIC00MjksOSArNDM0LDkgQEAgc3RhdGljIGludCByb2NrY2hpcF9kcm1fcGxhdGZvcm1f cHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiAgCQkJaXNfc3VwcG9ydF9pb21t dSA9IGZhbHNlOwo+ICAJCX0KPiAgCj4gKwkJZm91bmQgPSB0cnVlOwo+ICsKPiAgCQlvZl9ub2Rl X3B1dChpb21tdSk7Cj4gLQkJZHJtX29mX2NvbXBvbmVudF9tYXRjaF9hZGQoZGV2LCAmbWF0Y2gs IGNvbXBhcmVfb2YsCj4gLQkJCQkJICAgcG9ydC0+cGFyZW50KTsKPiAgCQlvZl9ub2RlX3B1dChw b3J0KTsKPiAgCX0KPiAgCj4gQEAgLTQ0MCwyNyArNDQ1LDI3IEBAIHN0YXRpYyBpbnQgcm9ja2No aXBfZHJtX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gIAkJ cmV0dXJuIC1FTk9ERVY7Cj4gIAl9Cj4gIAo+IC0JaWYgKCFtYXRjaCkgewo+ICsJaWYgKCFmb3Vu ZCkgewo+ICAJCWRldl9lcnIoZGV2LCAiTm8gYXZhaWxhYmxlIHZvcCBmb3VuZCBmb3IgZGlzcGxh eS1zdWJzeXN0ZW0uXG4iKTsKPiAgCQlyZXR1cm4gLUVOT0RFVjsKPiAgCX0KPiAtCS8qCj4gLQkg KiBGb3IgZWFjaCBib3VuZCBjcnRjLCBiaW5kIHRoZSBlbmNvZGVycyBhdHRhY2hlZCB0byBpdHMK PiAtCSAqIHJlbW90ZSBlbmRwb2ludC4KPiAtCSAqLwo+IC0JZm9yIChpID0gMDs7IGkrKykgewo+ IC0JCXBvcnQgPSBvZl9wYXJzZV9waGFuZGxlKG5wLCAicG9ydHMiLCBpKTsKPiAtCQlpZiAoIXBv cnQpCj4gLQkJCWJyZWFrOwo+ICAKPiAtCQlpZiAoIW9mX2RldmljZV9pc19hdmFpbGFibGUocG9y dC0+cGFyZW50KSkgewo+IC0JCQlvZl9ub2RlX3B1dChwb3J0KTsKPiAtCQkJY29udGludWU7Cj4g LQkJfQo+ICsJcmV0dXJuIDA7Cj4gK30KPiAgCj4gLQkJcm9ja2NoaXBfYWRkX2VuZHBvaW50cyhk ZXYsICZtYXRjaCwgcG9ydCk7Cj4gLQkJb2Zfbm9kZV9wdXQocG9ydCk7Cj4gLQl9Cj4gK3N0YXRp YyBpbnQgcm9ja2NoaXBfZHJtX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ug KnBkZXYpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Cj4gKwlzdHJ1 Y3QgY29tcG9uZW50X21hdGNoICptYXRjaCA9IE5VTEw7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXJl dCA9IHJvY2tjaGlwX2RybV9wbGF0Zm9ybV9vZl9wcm9iZShkZXYpOwo+ICsJaWYgKHJldCkKPiAr CQlyZXR1cm4gcmV0Owo+ICsKPiArCW1hdGNoID0gcm9ja2NoaXBfZHJtX21hdGNoX2FkZChkZXYp Owo+ICsJaWYgKElTX0VSUihtYXRjaCkpCj4gKwkJcmV0dXJuIFBUUl9FUlIobWF0Y2gpOwo+ICAK PiAgCXJldHVybiBjb21wb25lbnRfbWFzdGVyX2FkZF93aXRoX21hdGNoKGRldiwgJnJvY2tjaGlw X2RybV9vcHMsIG1hdGNoKTsKPiAgfQo+IEBAIC00ODgsNyArNDkzLDYwIEBAIHN0YXRpYyBzdHJ1 Y3QgcGxhdGZvcm1fZHJpdmVyIHJvY2tjaGlwX2RybV9wbGF0Zm9ybV9kcml2ZXIgPSB7Cj4gIAl9 LAo+ICB9Owo+ICAKPiAtbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihyb2NrY2hpcF9kcm1fcGxhdGZv cm1fZHJpdmVyKTsKPiArc3RhdGljIHZvaWQgcm9ja2NoaXBfZHJtX3VucmVnaXN0ZXJfZHJpdmVy cyh2b2lkKQo+ICt7Cj4gKwlpbnQgaTsKPiArCj4gKwlmb3IgKGkgPSBBUlJBWV9TSVpFKHJvY2tj aGlwX2RybV9jb21wX2RydnMpIC0gMTsgaSA+PSAwOyBpLS0pCj4gKwkJcGxhdGZvcm1fZHJpdmVy X3VucmVnaXN0ZXIocm9ja2NoaXBfZHJtX2NvbXBfZHJ2c1tpXSk7Cj4gK30KPiArCj4gK3N0YXRp YyBpbnQgcm9ja2NoaXBfZHJtX3JlZ2lzdGVyX2RyaXZlcnModm9pZCkKPiArewo+ICsJaW50IGks IHJldDsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyb2NrY2hpcF9kcm1fY29t cF9kcnZzKTsgaSsrKSB7Cj4gKwkJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKHJvY2tj aGlwX2RybV9jb21wX2RydnNbaV0pOwo+ICsJCWlmIChyZXQpCj4gKwkJCWdvdG8gZXJyX3VucmVn Owo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICsKPiArZXJyX3VucmVnOgo+ICsJd2hpbGUgKGkt LSA+IDApCj4gKwkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIocm9ja2NoaXBfZHJtX2NvbXBf ZHJ2c1tpXSk7Cj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IF9faW5pdCBy b2NrY2hpcF9kcm1faW5pdCh2b2lkKQo+ICt7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXJldCA9IHJv Y2tjaGlwX2RybV9yZWdpc3Rlcl9kcml2ZXJzKCk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiBy ZXQ7Cj4gKwo+ICsJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZyb2NrY2hpcF9kcm1f cGxhdGZvcm1fZHJpdmVyKTsKPiArCWlmIChyZXQpCj4gKwkJZ290byBlcnJfdW5yZWdfZHJpdmVy czsKPiArCj4gKwlyZXR1cm4gMDsKPiArCj4gK2Vycl91bnJlZ19kcml2ZXJzOgo+ICsJcm9ja2No aXBfZHJtX3VucmVnaXN0ZXJfZHJpdmVycygpOwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiAr c3RhdGljIHZvaWQgX19leGl0IHJvY2tjaGlwX2RybV9maW5pKHZvaWQpCj4gK3sKPiArCXBsYXRm b3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZyb2NrY2hpcF9kcm1fcGxhdGZvcm1fZHJpdmVyKTsKPiAr Cj4gKwlyb2NrY2hpcF9kcm1fdW5yZWdpc3Rlcl9kcml2ZXJzKCk7Cj4gK30KPiArCj4gK21vZHVs ZV9pbml0KHJvY2tjaGlwX2RybV9pbml0KTsKPiArbW9kdWxlX2V4aXQocm9ja2NoaXBfZHJtX2Zp bmkpOwo+ICAKPiAgTU9EVUxFX0FVVEhPUigiTWFyayBZYW8gPG1hcmsueWFvQHJvY2stY2hpcHMu Y29tPiIpOwo+ICBNT0RVTEVfREVTQ1JJUFRJT04oIlJPQ0tDSElQIERSTSBEcml2ZXIiKTsKPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV9kcnYuaCBi L2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fZHJ2LmgKPiBpbmRleCBhZGMz OTMwLi5mNDZlMWQwIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2Nr Y2hpcF9kcm1fZHJ2LmgKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBf ZHJtX2Rydi5oCj4gQEAgLTc5LDQgKzc5LDEwIEBAIHZvaWQgcm9ja2NoaXBfZHJtX2RtYV9kZXRh Y2hfZGV2aWNlKHN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2LAo+ICBpbnQgcm9ja2NoaXBfZHJt X3dhaXRfbGluZV9mbGFnKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdW5zaWduZWQgaW50IGxpbmVf bnVtLAo+ICAJCQkJdW5zaWduZWQgaW50IG1zdGltZW91dCk7Cj4gIAo+ICtleHRlcm4gc3RydWN0 IHBsYXRmb3JtX2RyaXZlciBjZG5fZHBfZHJpdmVyOwo+ICtleHRlcm4gc3RydWN0IHBsYXRmb3Jt X2RyaXZlciBkd19oZG1pX3JvY2tjaGlwX3BsdGZtX2RyaXZlcjsKPiArZXh0ZXJuIHN0cnVjdCBw bGF0Zm9ybV9kcml2ZXIgZHdfbWlwaV9kc2lfZHJpdmVyOwo+ICtleHRlcm4gc3RydWN0IHBsYXRm b3JtX2RyaXZlciBpbm5vX2hkbWlfZHJpdmVyOwo+ICtleHRlcm4gc3RydWN0IHBsYXRmb3JtX2Ry aXZlciByb2NrY2hpcF9kcF9kcml2ZXI7Cj4gK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVy IHZvcF9wbGF0Zm9ybV9kcml2ZXI7Cj4gICNlbmRpZiAvKiBfUk9DS0NISVBfRFJNX0RSVl9IXyAq Lwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfdm9wX3Jl Zy5jIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX3ZvcF9yZWcuYwo+IGluZGV4 IDkxZmJjN2IuLjBkYTQ0NDQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlw L3JvY2tjaGlwX3ZvcF9yZWcuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2Nr Y2hpcF92b3BfcmVnLmMKPiBAQCAtNDA0LDcgKzQwNCw3IEBAIHN0YXRpYyBpbnQgdm9wX3JlbW92 ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICAJcmV0dXJuIDA7Cj4gIH0KPiAgCj4g LXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHZvcF9wbGF0Zm9ybV9kcml2ZXIgPSB7Cj4g K3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdm9wX3BsYXRmb3JtX2RyaXZlciA9IHsKPiAgCS5wcm9i ZSA9IHZvcF9wcm9iZSwKPiAgCS5yZW1vdmUgPSB2b3BfcmVtb3ZlLAo+ICAJLmRyaXZlciA9IHsK PiBAQCAtNDEyLDkgKzQxMiwzIEBAIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHZvcF9w bGF0Zm9ybV9kcml2ZXIgPSB7Cj4gIAkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHZv cF9kcml2ZXJfZHRfbWF0Y2gpLAo+ICAJfSwKPiAgfTsKPiAtCj4gLW1vZHVsZV9wbGF0Zm9ybV9k cml2ZXIodm9wX3BsYXRmb3JtX2RyaXZlcik7Cj4gLQo+IC1NT0RVTEVfQVVUSE9SKCJNYXJrIFlh byA8bWFyay55YW9Acm9jay1jaGlwcy5jb20+Iik7Cj4gLU1PRFVMRV9ERVNDUklQVElPTigiUk9D S0NISVAgVk9QIERyaXZlciIpOwo+IC1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cj4gLS0gCj4g Mi4xLjQKPiAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K ZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0 dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: seanpaul@chromium.org (Sean Paul) Date: Wed, 15 Mar 2017 09:52:34 -0400 Subject: [PATCH v3] drm/rockchip: Refactor the component match logic. In-Reply-To: <1489573247-9628-1-git-send-email-jeffy.chen@rock-chips.com> References: <1489573247-9628-1-git-send-email-jeffy.chen@rock-chips.com> Message-ID: <20170315135234.GD20329@art_vandelay> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Wed, Mar 15, 2017 at 06:20:47PM +0800, Jeffy Chen wrote: > Currently we are adding all components from the dts, if one of their > drivers been disabled, we would not be able to bring up others. > > Refactor component match logic, follow exynos drm. > > Signed-off-by: Jeffy Chen > Reviewed-by: Andrzej Hajda Still looks good to me. If Mark doesn't object in the next 24 hours, I'll apply. Sean > > --- > > Changes in v3: > Address Andrzej Hajda 's comments. > > Changes in v2: > Address Sean Paul 's comments. > > drivers/gpu/drm/rockchip/Kconfig | 10 +- > drivers/gpu/drm/rockchip/Makefile | 16 +-- > drivers/gpu/drm/rockchip/analogix_dp-rockchip.c | 9 +- > drivers/gpu/drm/rockchip/cdn-dp-core.c | 8 +- > drivers/gpu/drm/rockchip/dw-mipi-dsi.c | 8 +- > drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 10 +- > drivers/gpu/drm/rockchip/inno_hdmi.c | 10 +- > drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 154 ++++++++++++++++-------- > drivers/gpu/drm/rockchip/rockchip_drm_drv.h | 6 + > drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 8 +- > 10 files changed, 131 insertions(+), 108 deletions(-) > > diff --git a/drivers/gpu/drm/rockchip/Kconfig b/drivers/gpu/drm/rockchip/Kconfig > index 0e4eb84..50c41c0 100644 > --- a/drivers/gpu/drm/rockchip/Kconfig > +++ b/drivers/gpu/drm/rockchip/Kconfig > @@ -13,7 +13,7 @@ config DRM_ROCKCHIP > IP found on the SoC. > > config ROCKCHIP_ANALOGIX_DP > - tristate "Rockchip specific extensions for Analogix DP driver" > + bool "Rockchip specific extensions for Analogix DP driver" > depends on DRM_ROCKCHIP > select DRM_ANALOGIX_DP > help > @@ -22,7 +22,7 @@ config ROCKCHIP_ANALOGIX_DP > on RK3288 based SoC, you should selet this option. > > config ROCKCHIP_CDN_DP > - tristate "Rockchip cdn DP" > + bool "Rockchip cdn DP" > depends on DRM_ROCKCHIP > depends on EXTCON > select SND_SOC_HDMI_CODEC if SND_SOC > @@ -33,7 +33,7 @@ config ROCKCHIP_CDN_DP > option. > > config ROCKCHIP_DW_HDMI > - tristate "Rockchip specific extensions for Synopsys DW HDMI" > + bool "Rockchip specific extensions for Synopsys DW HDMI" > depends on DRM_ROCKCHIP > select DRM_DW_HDMI > help > @@ -43,7 +43,7 @@ config ROCKCHIP_DW_HDMI > option. > > config ROCKCHIP_DW_MIPI_DSI > - tristate "Rockchip specific extensions for Synopsys DW MIPI DSI" > + bool "Rockchip specific extensions for Synopsys DW MIPI DSI" > depends on DRM_ROCKCHIP > select DRM_MIPI_DSI > help > @@ -53,7 +53,7 @@ config ROCKCHIP_DW_MIPI_DSI > option. > > config ROCKCHIP_INNO_HDMI > - tristate "Rockchip specific extensions for Innosilicon HDMI" > + bool "Rockchip specific extensions for Innosilicon HDMI" > depends on DRM_ROCKCHIP > help > This selects support for Rockchip SoC specific extensions > diff --git a/drivers/gpu/drm/rockchip/Makefile b/drivers/gpu/drm/rockchip/Makefile > index c931e2a..fa8dc9d 100644 > --- a/drivers/gpu/drm/rockchip/Makefile > +++ b/drivers/gpu/drm/rockchip/Makefile > @@ -3,14 +3,14 @@ > # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher. > > rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_fb.o \ > - rockchip_drm_gem.o rockchip_drm_psr.o rockchip_drm_vop.o > + rockchip_drm_gem.o rockchip_drm_psr.o \ > + rockchip_drm_vop.o rockchip_vop_reg.o > rockchipdrm-$(CONFIG_DRM_FBDEV_EMULATION) += rockchip_drm_fbdev.o > > -obj-$(CONFIG_ROCKCHIP_ANALOGIX_DP) += analogix_dp-rockchip.o > -obj-$(CONFIG_ROCKCHIP_CDN_DP) += cdn-dp.o > -cdn-dp-objs := cdn-dp-core.o cdn-dp-reg.o > -obj-$(CONFIG_ROCKCHIP_DW_HDMI) += dw_hdmi-rockchip.o > -obj-$(CONFIG_ROCKCHIP_DW_MIPI_DSI) += dw-mipi-dsi.o > -obj-$(CONFIG_ROCKCHIP_INNO_HDMI) += inno_hdmi.o > +rockchipdrm-$(CONFIG_ROCKCHIP_ANALOGIX_DP) += analogix_dp-rockchip.o > +rockchipdrm-$(CONFIG_ROCKCHIP_CDN_DP) += cdn-dp-core.o cdn-dp-reg.o > +rockchipdrm-$(CONFIG_ROCKCHIP_DW_HDMI) += dw_hdmi-rockchip.o > +rockchipdrm-$(CONFIG_ROCKCHIP_DW_MIPI_DSI) += dw-mipi-dsi.o > +rockchipdrm-$(CONFIG_ROCKCHIP_INNO_HDMI) += inno_hdmi.o > > -obj-$(CONFIG_DRM_ROCKCHIP) += rockchipdrm.o rockchip_vop_reg.o > +obj-$(CONFIG_DRM_ROCKCHIP) += rockchipdrm.o > diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c > index 8548e82..91ebe5c 100644 > --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c > +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c > @@ -507,7 +507,7 @@ static const struct of_device_id rockchip_dp_dt_ids[] = { > }; > MODULE_DEVICE_TABLE(of, rockchip_dp_dt_ids); > > -static struct platform_driver rockchip_dp_driver = { > +struct platform_driver rockchip_dp_driver = { > .probe = rockchip_dp_probe, > .remove = rockchip_dp_remove, > .driver = { > @@ -516,10 +516,3 @@ static struct platform_driver rockchip_dp_driver = { > .of_match_table = of_match_ptr(rockchip_dp_dt_ids), > }, > }; > - > -module_platform_driver(rockchip_dp_driver); > - > -MODULE_AUTHOR("Yakir Yang "); > -MODULE_AUTHOR("Jeff chen "); > -MODULE_DESCRIPTION("Rockchip Specific Analogix-DP Driver Extension"); > -MODULE_LICENSE("GPL v2"); > diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockchip/cdn-dp-core.c > index fd79a70..e1796d0 100644 > --- a/drivers/gpu/drm/rockchip/cdn-dp-core.c > +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c > @@ -1243,7 +1243,7 @@ static const struct dev_pm_ops cdn_dp_pm_ops = { > cdn_dp_resume) > }; > > -static struct platform_driver cdn_dp_driver = { > +struct platform_driver cdn_dp_driver = { > .probe = cdn_dp_probe, > .remove = cdn_dp_remove, > .shutdown = cdn_dp_shutdown, > @@ -1254,9 +1254,3 @@ static struct platform_driver cdn_dp_driver = { > .pm = &cdn_dp_pm_ops, > }, > }; > - > -module_platform_driver(cdn_dp_driver); > - > -MODULE_AUTHOR("Chris Zhong "); > -MODULE_DESCRIPTION("cdn DP Driver"); > -MODULE_LICENSE("GPL v2"); > diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c > index d9aa382..65a474f 100644 > --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c > +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c > @@ -1165,7 +1165,7 @@ static int dw_mipi_dsi_remove(struct platform_device *pdev) > return 0; > } > > -static struct platform_driver dw_mipi_dsi_driver = { > +struct platform_driver dw_mipi_dsi_driver = { > .probe = dw_mipi_dsi_probe, > .remove = dw_mipi_dsi_remove, > .driver = { > @@ -1173,9 +1173,3 @@ static struct platform_driver dw_mipi_dsi_driver = { > .name = DRIVER_NAME, > }, > }; > -module_platform_driver(dw_mipi_dsi_driver); > - > -MODULE_DESCRIPTION("ROCKCHIP MIPI DSI host controller driver"); > -MODULE_AUTHOR("Chris Zhong "); > -MODULE_LICENSE("GPL"); > -MODULE_ALIAS("platform:" DRIVER_NAME); > diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c > index a6d4a02..976ea79 100644 > --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c > +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c > @@ -326,7 +326,7 @@ static int dw_hdmi_rockchip_remove(struct platform_device *pdev) > return 0; > } > > -static struct platform_driver dw_hdmi_rockchip_pltfm_driver = { > +struct platform_driver dw_hdmi_rockchip_pltfm_driver = { > .probe = dw_hdmi_rockchip_probe, > .remove = dw_hdmi_rockchip_remove, > .driver = { > @@ -334,11 +334,3 @@ static struct platform_driver dw_hdmi_rockchip_pltfm_driver = { > .of_match_table = dw_hdmi_rockchip_dt_ids, > }, > }; > - > -module_platform_driver(dw_hdmi_rockchip_pltfm_driver); > - > -MODULE_AUTHOR("Andy Yan "); > -MODULE_AUTHOR("Yakir Yang "); > -MODULE_DESCRIPTION("Rockchip Specific DW-HDMI Driver Extension"); > -MODULE_LICENSE("GPL"); > -MODULE_ALIAS("platform:dwhdmi-rockchip"); > diff --git a/drivers/gpu/drm/rockchip/inno_hdmi.c b/drivers/gpu/drm/rockchip/inno_hdmi.c > index 006260d..7d9b75e 100644 > --- a/drivers/gpu/drm/rockchip/inno_hdmi.c > +++ b/drivers/gpu/drm/rockchip/inno_hdmi.c > @@ -923,7 +923,7 @@ static const struct of_device_id inno_hdmi_dt_ids[] = { > }; > MODULE_DEVICE_TABLE(of, inno_hdmi_dt_ids); > > -static struct platform_driver inno_hdmi_driver = { > +struct platform_driver inno_hdmi_driver = { > .probe = inno_hdmi_probe, > .remove = inno_hdmi_remove, > .driver = { > @@ -931,11 +931,3 @@ static struct platform_driver inno_hdmi_driver = { > .of_match_table = inno_hdmi_dt_ids, > }, > }; > - > -module_platform_driver(inno_hdmi_driver); > - > -MODULE_AUTHOR("Zheng Yang "); > -MODULE_AUTHOR("Yakir Yang "); > -MODULE_DESCRIPTION("Rockchip Specific INNO-HDMI Driver"); > -MODULE_LICENSE("GPL v2"); > -MODULE_ALIAS("platform:innohdmi-rockchip"); > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > index b360e62..9cb295b 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > @@ -356,34 +356,44 @@ static const struct dev_pm_ops rockchip_drm_pm_ops = { > rockchip_drm_sys_resume) > }; > > -static int compare_of(struct device *dev, void *data) > -{ > - struct device_node *np = data; > +#define DRV_PTR(drv, cond) (IS_ENABLED(cond) ? &drv : NULL) > + > +static struct platform_driver *rockchip_drm_comp_drvs[] = { > + &vop_platform_driver, > + DRV_PTR(rockchip_dp_driver, CONFIG_ROCKCHIP_ANALOGIX_DP), > + DRV_PTR(cdn_dp_driver, CONFIG_ROCKCHIP_CDN_DP), > + DRV_PTR(dw_hdmi_rockchip_pltfm_driver, CONFIG_ROCKCHIP_DW_HDMI), > + DRV_PTR(dw_mipi_dsi_driver, CONFIG_ROCKCHIP_DW_MIPI_DSI), > + DRV_PTR(inno_hdmi_driver, CONFIG_ROCKCHIP_INNO_HDMI), > +}; > > - return dev->of_node == np; > +static int compare_dev(struct device *dev, void *data) > +{ > + return dev == (struct device *)data; > } > > -static void rockchip_add_endpoints(struct device *dev, > - struct component_match **match, > - struct device_node *port) > +static struct component_match *rockchip_drm_match_add(struct device *dev) > { > - struct device_node *ep, *remote; > + struct component_match *match = NULL; > + int i; > > - for_each_child_of_node(port, ep) { > - remote = of_graph_get_remote_port_parent(ep); > - if (!remote || !of_device_is_available(remote)) { > - of_node_put(remote); > - continue; > - } else if (!of_device_is_available(remote->parent)) { > - dev_warn(dev, "parent device of %s is not available\n", > - remote->full_name); > - of_node_put(remote); > - continue; > - } > + for (i = 0; i < ARRAY_SIZE(rockchip_drm_comp_drvs); i++) { > + struct platform_driver *drv = rockchip_drm_comp_drvs[i]; > + struct device *p = NULL, *d; > + > + do { > + d = bus_find_device(&platform_bus_type, p, &drv->driver, > + (void *)platform_bus_type.match); > + put_device(p); > + p = d; > > - drm_of_component_match_add(dev, match, compare_of, remote); > - of_node_put(remote); > + if (!d) > + break; > + component_match_add(dev, &match, compare_dev, d); > + } while (true); > } > + > + return match ?: ERR_PTR(-ENODEV); > } > > static const struct component_master_ops rockchip_drm_ops = { > @@ -391,21 +401,16 @@ static const struct component_master_ops rockchip_drm_ops = { > .unbind = rockchip_drm_unbind, > }; > > -static int rockchip_drm_platform_probe(struct platform_device *pdev) > +static int rockchip_drm_platform_of_probe(struct device *dev) > { > - struct device *dev = &pdev->dev; > - struct component_match *match = NULL; > struct device_node *np = dev->of_node; > struct device_node *port; > + bool found = false; > int i; > > if (!np) > return -ENODEV; > - /* > - * Bind the crtc ports first, so that > - * drm_of_find_possible_crtcs called from encoder .bind callbacks > - * works as expected. > - */ > + > for (i = 0;; i++) { > struct device_node *iommu; > > @@ -429,9 +434,9 @@ static int rockchip_drm_platform_probe(struct platform_device *pdev) > is_support_iommu = false; > } > > + found = true; > + > of_node_put(iommu); > - drm_of_component_match_add(dev, &match, compare_of, > - port->parent); > of_node_put(port); > } > > @@ -440,27 +445,27 @@ static int rockchip_drm_platform_probe(struct platform_device *pdev) > return -ENODEV; > } > > - if (!match) { > + if (!found) { > dev_err(dev, "No available vop found for display-subsystem.\n"); > return -ENODEV; > } > - /* > - * For each bound crtc, bind the encoders attached to its > - * remote endpoint. > - */ > - for (i = 0;; i++) { > - port = of_parse_phandle(np, "ports", i); > - if (!port) > - break; > > - if (!of_device_is_available(port->parent)) { > - of_node_put(port); > - continue; > - } > + return 0; > +} > > - rockchip_add_endpoints(dev, &match, port); > - of_node_put(port); > - } > +static int rockchip_drm_platform_probe(struct platform_device *pdev) > +{ > + struct device *dev = &pdev->dev; > + struct component_match *match = NULL; > + int ret; > + > + ret = rockchip_drm_platform_of_probe(dev); > + if (ret) > + return ret; > + > + match = rockchip_drm_match_add(dev); > + if (IS_ERR(match)) > + return PTR_ERR(match); > > return component_master_add_with_match(dev, &rockchip_drm_ops, match); > } > @@ -488,7 +493,60 @@ static struct platform_driver rockchip_drm_platform_driver = { > }, > }; > > -module_platform_driver(rockchip_drm_platform_driver); > +static void rockchip_drm_unregister_drivers(void) > +{ > + int i; > + > + for (i = ARRAY_SIZE(rockchip_drm_comp_drvs) - 1; i >= 0; i--) > + platform_driver_unregister(rockchip_drm_comp_drvs[i]); > +} > + > +static int rockchip_drm_register_drivers(void) > +{ > + int i, ret; > + > + for (i = 0; i < ARRAY_SIZE(rockchip_drm_comp_drvs); i++) { > + ret = platform_driver_register(rockchip_drm_comp_drvs[i]); > + if (ret) > + goto err_unreg; > + } > + > + return 0; > + > +err_unreg: > + while (i-- > 0) > + platform_driver_unregister(rockchip_drm_comp_drvs[i]); > + return ret; > +} > + > +static int __init rockchip_drm_init(void) > +{ > + int ret; > + > + ret = rockchip_drm_register_drivers(); > + if (ret) > + return ret; > + > + ret = platform_driver_register(&rockchip_drm_platform_driver); > + if (ret) > + goto err_unreg_drivers; > + > + return 0; > + > +err_unreg_drivers: > + rockchip_drm_unregister_drivers(); > + return ret; > +} > + > +static void __exit rockchip_drm_fini(void) > +{ > + platform_driver_unregister(&rockchip_drm_platform_driver); > + > + rockchip_drm_unregister_drivers(); > +} > + > +module_init(rockchip_drm_init); > +module_exit(rockchip_drm_fini); > > MODULE_AUTHOR("Mark Yao "); > MODULE_DESCRIPTION("ROCKCHIP DRM Driver"); > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > index adc3930..f46e1d0 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > @@ -79,4 +79,10 @@ void rockchip_drm_dma_detach_device(struct drm_device *drm_dev, > int rockchip_drm_wait_line_flag(struct drm_crtc *crtc, unsigned int line_num, > unsigned int mstimeout); > > +extern struct platform_driver cdn_dp_driver; > +extern struct platform_driver dw_hdmi_rockchip_pltfm_driver; > +extern struct platform_driver dw_mipi_dsi_driver; > +extern struct platform_driver inno_hdmi_driver; > +extern struct platform_driver rockchip_dp_driver; > +extern struct platform_driver vop_platform_driver; > #endif /* _ROCKCHIP_DRM_DRV_H_ */ > diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c > index 91fbc7b..0da4444 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c > +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c > @@ -404,7 +404,7 @@ static int vop_remove(struct platform_device *pdev) > return 0; > } > > -static struct platform_driver vop_platform_driver = { > +struct platform_driver vop_platform_driver = { > .probe = vop_probe, > .remove = vop_remove, > .driver = { > @@ -412,9 +412,3 @@ static struct platform_driver vop_platform_driver = { > .of_match_table = of_match_ptr(vop_driver_dt_match), > }, > }; > - > -module_platform_driver(vop_platform_driver); > - > -MODULE_AUTHOR("Mark Yao "); > -MODULE_DESCRIPTION("ROCKCHIP VOP Driver"); > -MODULE_LICENSE("GPL v2"); > -- > 2.1.4 > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753884AbdCONwq (ORCPT ); Wed, 15 Mar 2017 09:52:46 -0400 Received: from mail-qk0-f169.google.com ([209.85.220.169]:34902 "EHLO mail-qk0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751689AbdCONwn (ORCPT ); Wed, 15 Mar 2017 09:52:43 -0400 Date: Wed, 15 Mar 2017 09:52:34 -0400 From: Sean Paul To: Jeffy Chen Cc: Mark Yao , Andrzej Hajda , Guenter Roeck , Brian Norris , Tomasz Figa , Douglas Anderson , Sean Paul , Heiko Stuebner , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, David Airlie , linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v3] drm/rockchip: Refactor the component match logic. Message-ID: <20170315135234.GD20329@art_vandelay> References: <1489573247-9628-1-git-send-email-jeffy.chen@rock-chips.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1489573247-9628-1-git-send-email-jeffy.chen@rock-chips.com> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Mar 15, 2017 at 06:20:47PM +0800, Jeffy Chen wrote: > Currently we are adding all components from the dts, if one of their > drivers been disabled, we would not be able to bring up others. > > Refactor component match logic, follow exynos drm. > > Signed-off-by: Jeffy Chen > Reviewed-by: Andrzej Hajda Still looks good to me. If Mark doesn't object in the next 24 hours, I'll apply. Sean > > --- > > Changes in v3: > Address Andrzej Hajda 's comments. > > Changes in v2: > Address Sean Paul 's comments. > > drivers/gpu/drm/rockchip/Kconfig | 10 +- > drivers/gpu/drm/rockchip/Makefile | 16 +-- > drivers/gpu/drm/rockchip/analogix_dp-rockchip.c | 9 +- > drivers/gpu/drm/rockchip/cdn-dp-core.c | 8 +- > drivers/gpu/drm/rockchip/dw-mipi-dsi.c | 8 +- > drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 10 +- > drivers/gpu/drm/rockchip/inno_hdmi.c | 10 +- > drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 154 ++++++++++++++++-------- > drivers/gpu/drm/rockchip/rockchip_drm_drv.h | 6 + > drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 8 +- > 10 files changed, 131 insertions(+), 108 deletions(-) > > diff --git a/drivers/gpu/drm/rockchip/Kconfig b/drivers/gpu/drm/rockchip/Kconfig > index 0e4eb84..50c41c0 100644 > --- a/drivers/gpu/drm/rockchip/Kconfig > +++ b/drivers/gpu/drm/rockchip/Kconfig > @@ -13,7 +13,7 @@ config DRM_ROCKCHIP > IP found on the SoC. > > config ROCKCHIP_ANALOGIX_DP > - tristate "Rockchip specific extensions for Analogix DP driver" > + bool "Rockchip specific extensions for Analogix DP driver" > depends on DRM_ROCKCHIP > select DRM_ANALOGIX_DP > help > @@ -22,7 +22,7 @@ config ROCKCHIP_ANALOGIX_DP > on RK3288 based SoC, you should selet this option. > > config ROCKCHIP_CDN_DP > - tristate "Rockchip cdn DP" > + bool "Rockchip cdn DP" > depends on DRM_ROCKCHIP > depends on EXTCON > select SND_SOC_HDMI_CODEC if SND_SOC > @@ -33,7 +33,7 @@ config ROCKCHIP_CDN_DP > option. > > config ROCKCHIP_DW_HDMI > - tristate "Rockchip specific extensions for Synopsys DW HDMI" > + bool "Rockchip specific extensions for Synopsys DW HDMI" > depends on DRM_ROCKCHIP > select DRM_DW_HDMI > help > @@ -43,7 +43,7 @@ config ROCKCHIP_DW_HDMI > option. > > config ROCKCHIP_DW_MIPI_DSI > - tristate "Rockchip specific extensions for Synopsys DW MIPI DSI" > + bool "Rockchip specific extensions for Synopsys DW MIPI DSI" > depends on DRM_ROCKCHIP > select DRM_MIPI_DSI > help > @@ -53,7 +53,7 @@ config ROCKCHIP_DW_MIPI_DSI > option. > > config ROCKCHIP_INNO_HDMI > - tristate "Rockchip specific extensions for Innosilicon HDMI" > + bool "Rockchip specific extensions for Innosilicon HDMI" > depends on DRM_ROCKCHIP > help > This selects support for Rockchip SoC specific extensions > diff --git a/drivers/gpu/drm/rockchip/Makefile b/drivers/gpu/drm/rockchip/Makefile > index c931e2a..fa8dc9d 100644 > --- a/drivers/gpu/drm/rockchip/Makefile > +++ b/drivers/gpu/drm/rockchip/Makefile > @@ -3,14 +3,14 @@ > # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher. > > rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_fb.o \ > - rockchip_drm_gem.o rockchip_drm_psr.o rockchip_drm_vop.o > + rockchip_drm_gem.o rockchip_drm_psr.o \ > + rockchip_drm_vop.o rockchip_vop_reg.o > rockchipdrm-$(CONFIG_DRM_FBDEV_EMULATION) += rockchip_drm_fbdev.o > > -obj-$(CONFIG_ROCKCHIP_ANALOGIX_DP) += analogix_dp-rockchip.o > -obj-$(CONFIG_ROCKCHIP_CDN_DP) += cdn-dp.o > -cdn-dp-objs := cdn-dp-core.o cdn-dp-reg.o > -obj-$(CONFIG_ROCKCHIP_DW_HDMI) += dw_hdmi-rockchip.o > -obj-$(CONFIG_ROCKCHIP_DW_MIPI_DSI) += dw-mipi-dsi.o > -obj-$(CONFIG_ROCKCHIP_INNO_HDMI) += inno_hdmi.o > +rockchipdrm-$(CONFIG_ROCKCHIP_ANALOGIX_DP) += analogix_dp-rockchip.o > +rockchipdrm-$(CONFIG_ROCKCHIP_CDN_DP) += cdn-dp-core.o cdn-dp-reg.o > +rockchipdrm-$(CONFIG_ROCKCHIP_DW_HDMI) += dw_hdmi-rockchip.o > +rockchipdrm-$(CONFIG_ROCKCHIP_DW_MIPI_DSI) += dw-mipi-dsi.o > +rockchipdrm-$(CONFIG_ROCKCHIP_INNO_HDMI) += inno_hdmi.o > > -obj-$(CONFIG_DRM_ROCKCHIP) += rockchipdrm.o rockchip_vop_reg.o > +obj-$(CONFIG_DRM_ROCKCHIP) += rockchipdrm.o > diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c > index 8548e82..91ebe5c 100644 > --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c > +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c > @@ -507,7 +507,7 @@ static const struct of_device_id rockchip_dp_dt_ids[] = { > }; > MODULE_DEVICE_TABLE(of, rockchip_dp_dt_ids); > > -static struct platform_driver rockchip_dp_driver = { > +struct platform_driver rockchip_dp_driver = { > .probe = rockchip_dp_probe, > .remove = rockchip_dp_remove, > .driver = { > @@ -516,10 +516,3 @@ static struct platform_driver rockchip_dp_driver = { > .of_match_table = of_match_ptr(rockchip_dp_dt_ids), > }, > }; > - > -module_platform_driver(rockchip_dp_driver); > - > -MODULE_AUTHOR("Yakir Yang "); > -MODULE_AUTHOR("Jeff chen "); > -MODULE_DESCRIPTION("Rockchip Specific Analogix-DP Driver Extension"); > -MODULE_LICENSE("GPL v2"); > diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockchip/cdn-dp-core.c > index fd79a70..e1796d0 100644 > --- a/drivers/gpu/drm/rockchip/cdn-dp-core.c > +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c > @@ -1243,7 +1243,7 @@ static const struct dev_pm_ops cdn_dp_pm_ops = { > cdn_dp_resume) > }; > > -static struct platform_driver cdn_dp_driver = { > +struct platform_driver cdn_dp_driver = { > .probe = cdn_dp_probe, > .remove = cdn_dp_remove, > .shutdown = cdn_dp_shutdown, > @@ -1254,9 +1254,3 @@ static struct platform_driver cdn_dp_driver = { > .pm = &cdn_dp_pm_ops, > }, > }; > - > -module_platform_driver(cdn_dp_driver); > - > -MODULE_AUTHOR("Chris Zhong "); > -MODULE_DESCRIPTION("cdn DP Driver"); > -MODULE_LICENSE("GPL v2"); > diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c > index d9aa382..65a474f 100644 > --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c > +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c > @@ -1165,7 +1165,7 @@ static int dw_mipi_dsi_remove(struct platform_device *pdev) > return 0; > } > > -static struct platform_driver dw_mipi_dsi_driver = { > +struct platform_driver dw_mipi_dsi_driver = { > .probe = dw_mipi_dsi_probe, > .remove = dw_mipi_dsi_remove, > .driver = { > @@ -1173,9 +1173,3 @@ static struct platform_driver dw_mipi_dsi_driver = { > .name = DRIVER_NAME, > }, > }; > -module_platform_driver(dw_mipi_dsi_driver); > - > -MODULE_DESCRIPTION("ROCKCHIP MIPI DSI host controller driver"); > -MODULE_AUTHOR("Chris Zhong "); > -MODULE_LICENSE("GPL"); > -MODULE_ALIAS("platform:" DRIVER_NAME); > diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c > index a6d4a02..976ea79 100644 > --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c > +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c > @@ -326,7 +326,7 @@ static int dw_hdmi_rockchip_remove(struct platform_device *pdev) > return 0; > } > > -static struct platform_driver dw_hdmi_rockchip_pltfm_driver = { > +struct platform_driver dw_hdmi_rockchip_pltfm_driver = { > .probe = dw_hdmi_rockchip_probe, > .remove = dw_hdmi_rockchip_remove, > .driver = { > @@ -334,11 +334,3 @@ static struct platform_driver dw_hdmi_rockchip_pltfm_driver = { > .of_match_table = dw_hdmi_rockchip_dt_ids, > }, > }; > - > -module_platform_driver(dw_hdmi_rockchip_pltfm_driver); > - > -MODULE_AUTHOR("Andy Yan "); > -MODULE_AUTHOR("Yakir Yang "); > -MODULE_DESCRIPTION("Rockchip Specific DW-HDMI Driver Extension"); > -MODULE_LICENSE("GPL"); > -MODULE_ALIAS("platform:dwhdmi-rockchip"); > diff --git a/drivers/gpu/drm/rockchip/inno_hdmi.c b/drivers/gpu/drm/rockchip/inno_hdmi.c > index 006260d..7d9b75e 100644 > --- a/drivers/gpu/drm/rockchip/inno_hdmi.c > +++ b/drivers/gpu/drm/rockchip/inno_hdmi.c > @@ -923,7 +923,7 @@ static const struct of_device_id inno_hdmi_dt_ids[] = { > }; > MODULE_DEVICE_TABLE(of, inno_hdmi_dt_ids); > > -static struct platform_driver inno_hdmi_driver = { > +struct platform_driver inno_hdmi_driver = { > .probe = inno_hdmi_probe, > .remove = inno_hdmi_remove, > .driver = { > @@ -931,11 +931,3 @@ static struct platform_driver inno_hdmi_driver = { > .of_match_table = inno_hdmi_dt_ids, > }, > }; > - > -module_platform_driver(inno_hdmi_driver); > - > -MODULE_AUTHOR("Zheng Yang "); > -MODULE_AUTHOR("Yakir Yang "); > -MODULE_DESCRIPTION("Rockchip Specific INNO-HDMI Driver"); > -MODULE_LICENSE("GPL v2"); > -MODULE_ALIAS("platform:innohdmi-rockchip"); > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > index b360e62..9cb295b 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c > @@ -356,34 +356,44 @@ static const struct dev_pm_ops rockchip_drm_pm_ops = { > rockchip_drm_sys_resume) > }; > > -static int compare_of(struct device *dev, void *data) > -{ > - struct device_node *np = data; > +#define DRV_PTR(drv, cond) (IS_ENABLED(cond) ? &drv : NULL) > + > +static struct platform_driver *rockchip_drm_comp_drvs[] = { > + &vop_platform_driver, > + DRV_PTR(rockchip_dp_driver, CONFIG_ROCKCHIP_ANALOGIX_DP), > + DRV_PTR(cdn_dp_driver, CONFIG_ROCKCHIP_CDN_DP), > + DRV_PTR(dw_hdmi_rockchip_pltfm_driver, CONFIG_ROCKCHIP_DW_HDMI), > + DRV_PTR(dw_mipi_dsi_driver, CONFIG_ROCKCHIP_DW_MIPI_DSI), > + DRV_PTR(inno_hdmi_driver, CONFIG_ROCKCHIP_INNO_HDMI), > +}; > > - return dev->of_node == np; > +static int compare_dev(struct device *dev, void *data) > +{ > + return dev == (struct device *)data; > } > > -static void rockchip_add_endpoints(struct device *dev, > - struct component_match **match, > - struct device_node *port) > +static struct component_match *rockchip_drm_match_add(struct device *dev) > { > - struct device_node *ep, *remote; > + struct component_match *match = NULL; > + int i; > > - for_each_child_of_node(port, ep) { > - remote = of_graph_get_remote_port_parent(ep); > - if (!remote || !of_device_is_available(remote)) { > - of_node_put(remote); > - continue; > - } else if (!of_device_is_available(remote->parent)) { > - dev_warn(dev, "parent device of %s is not available\n", > - remote->full_name); > - of_node_put(remote); > - continue; > - } > + for (i = 0; i < ARRAY_SIZE(rockchip_drm_comp_drvs); i++) { > + struct platform_driver *drv = rockchip_drm_comp_drvs[i]; > + struct device *p = NULL, *d; > + > + do { > + d = bus_find_device(&platform_bus_type, p, &drv->driver, > + (void *)platform_bus_type.match); > + put_device(p); > + p = d; > > - drm_of_component_match_add(dev, match, compare_of, remote); > - of_node_put(remote); > + if (!d) > + break; > + component_match_add(dev, &match, compare_dev, d); > + } while (true); > } > + > + return match ?: ERR_PTR(-ENODEV); > } > > static const struct component_master_ops rockchip_drm_ops = { > @@ -391,21 +401,16 @@ static const struct component_master_ops rockchip_drm_ops = { > .unbind = rockchip_drm_unbind, > }; > > -static int rockchip_drm_platform_probe(struct platform_device *pdev) > +static int rockchip_drm_platform_of_probe(struct device *dev) > { > - struct device *dev = &pdev->dev; > - struct component_match *match = NULL; > struct device_node *np = dev->of_node; > struct device_node *port; > + bool found = false; > int i; > > if (!np) > return -ENODEV; > - /* > - * Bind the crtc ports first, so that > - * drm_of_find_possible_crtcs called from encoder .bind callbacks > - * works as expected. > - */ > + > for (i = 0;; i++) { > struct device_node *iommu; > > @@ -429,9 +434,9 @@ static int rockchip_drm_platform_probe(struct platform_device *pdev) > is_support_iommu = false; > } > > + found = true; > + > of_node_put(iommu); > - drm_of_component_match_add(dev, &match, compare_of, > - port->parent); > of_node_put(port); > } > > @@ -440,27 +445,27 @@ static int rockchip_drm_platform_probe(struct platform_device *pdev) > return -ENODEV; > } > > - if (!match) { > + if (!found) { > dev_err(dev, "No available vop found for display-subsystem.\n"); > return -ENODEV; > } > - /* > - * For each bound crtc, bind the encoders attached to its > - * remote endpoint. > - */ > - for (i = 0;; i++) { > - port = of_parse_phandle(np, "ports", i); > - if (!port) > - break; > > - if (!of_device_is_available(port->parent)) { > - of_node_put(port); > - continue; > - } > + return 0; > +} > > - rockchip_add_endpoints(dev, &match, port); > - of_node_put(port); > - } > +static int rockchip_drm_platform_probe(struct platform_device *pdev) > +{ > + struct device *dev = &pdev->dev; > + struct component_match *match = NULL; > + int ret; > + > + ret = rockchip_drm_platform_of_probe(dev); > + if (ret) > + return ret; > + > + match = rockchip_drm_match_add(dev); > + if (IS_ERR(match)) > + return PTR_ERR(match); > > return component_master_add_with_match(dev, &rockchip_drm_ops, match); > } > @@ -488,7 +493,60 @@ static struct platform_driver rockchip_drm_platform_driver = { > }, > }; > > -module_platform_driver(rockchip_drm_platform_driver); > +static void rockchip_drm_unregister_drivers(void) > +{ > + int i; > + > + for (i = ARRAY_SIZE(rockchip_drm_comp_drvs) - 1; i >= 0; i--) > + platform_driver_unregister(rockchip_drm_comp_drvs[i]); > +} > + > +static int rockchip_drm_register_drivers(void) > +{ > + int i, ret; > + > + for (i = 0; i < ARRAY_SIZE(rockchip_drm_comp_drvs); i++) { > + ret = platform_driver_register(rockchip_drm_comp_drvs[i]); > + if (ret) > + goto err_unreg; > + } > + > + return 0; > + > +err_unreg: > + while (i-- > 0) > + platform_driver_unregister(rockchip_drm_comp_drvs[i]); > + return ret; > +} > + > +static int __init rockchip_drm_init(void) > +{ > + int ret; > + > + ret = rockchip_drm_register_drivers(); > + if (ret) > + return ret; > + > + ret = platform_driver_register(&rockchip_drm_platform_driver); > + if (ret) > + goto err_unreg_drivers; > + > + return 0; > + > +err_unreg_drivers: > + rockchip_drm_unregister_drivers(); > + return ret; > +} > + > +static void __exit rockchip_drm_fini(void) > +{ > + platform_driver_unregister(&rockchip_drm_platform_driver); > + > + rockchip_drm_unregister_drivers(); > +} > + > +module_init(rockchip_drm_init); > +module_exit(rockchip_drm_fini); > > MODULE_AUTHOR("Mark Yao "); > MODULE_DESCRIPTION("ROCKCHIP DRM Driver"); > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > index adc3930..f46e1d0 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h > @@ -79,4 +79,10 @@ void rockchip_drm_dma_detach_device(struct drm_device *drm_dev, > int rockchip_drm_wait_line_flag(struct drm_crtc *crtc, unsigned int line_num, > unsigned int mstimeout); > > +extern struct platform_driver cdn_dp_driver; > +extern struct platform_driver dw_hdmi_rockchip_pltfm_driver; > +extern struct platform_driver dw_mipi_dsi_driver; > +extern struct platform_driver inno_hdmi_driver; > +extern struct platform_driver rockchip_dp_driver; > +extern struct platform_driver vop_platform_driver; > #endif /* _ROCKCHIP_DRM_DRV_H_ */ > diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c > index 91fbc7b..0da4444 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c > +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c > @@ -404,7 +404,7 @@ static int vop_remove(struct platform_device *pdev) > return 0; > } > > -static struct platform_driver vop_platform_driver = { > +struct platform_driver vop_platform_driver = { > .probe = vop_probe, > .remove = vop_remove, > .driver = { > @@ -412,9 +412,3 @@ static struct platform_driver vop_platform_driver = { > .of_match_table = of_match_ptr(vop_driver_dt_match), > }, > }; > - > -module_platform_driver(vop_platform_driver); > - > -MODULE_AUTHOR("Mark Yao "); > -MODULE_DESCRIPTION("ROCKCHIP VOP Driver"); > -MODULE_LICENSE("GPL v2"); > -- > 2.1.4 >