From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ajay kumar Subject: Re: [PATCH V8 03/14] drm/bridge: make bridge registration independent of drm flow Date: Mon, 8 Dec 2014 15:54:45 +0530 Message-ID: References: <1416045309-13359-1-git-send-email-ajaykumar.rs@samsung.com> <1416045309-13359-4-git-send-email-ajaykumar.rs@samsung.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Daniel Vetter Cc: "devicetree@vger.kernel.org" , "linux-samsung-soc@vger.kernel.org" , Sean Paul , Daniel Vetter , "dri-devel@lists.freedesktop.org" , Kukjin Kim , Pannaga Bhushan Reddy Patel , Prashanth G , Ajay Kumar , "linux-arm-kernel@lists.infradead.org" List-Id: devicetree@vger.kernel.org T24gVHVlLCBEZWMgMiwgMjAxNCBhdCAxMTozMSBBTSwgQWpheSBrdW1hciA8YWpheW51bWJAZ21h aWwuY29tPiB3cm90ZToKPiBPbiBTYXQsIE5vdiAxNSwgMjAxNCBhdCAzOjI0IFBNLCBBamF5IEt1 bWFyIDxhamF5a3VtYXIucnNAc2Ftc3VuZy5jb20+IHdyb3RlOgo+PiBDdXJyZW50bHksIHRoaXJk IHBhcnR5IGJyaWRnZSBkcml2ZXJzKHB0bjM0NjApIGFyZSBkZXBlbmRlbnQKPj4gb24gdGhlIGNv cnJlc3BvbmRpbmcgZW5jb2RlciBkcml2ZXIgaW5pdCwgc2luY2UgYnJpZGdlIGRyaXZlcgo+PiBu ZWVkcyBhIGRybV9kZXZpY2UgcG9pbnRlciB0byBmaW5pc2ggZHJtIGluaXRpYWxpemF0aW9ucy4K Pj4gVGhlIGVuY29kZXIgZHJpdmVyIHBhc3NlcyB0aGUgZHJtX2RldmljZSBwb2ludGVyIHRvIHRo ZQo+PiBicmlkZ2UgZHJpdmVyLiBCZWNhdXNlIG9mIHRoaXMgZGVwZW5kZW5jeSwgdGhpcmQgcGFy dHkgZHJpdmVycwo+PiBsaWtlIHB0bjM0NjAgZG9lc24ndCBhZGhlcmUgdG8gdGhlIGRyaXZlciBt b2RlbC4KPj4KPj4gSW4gdGhpcyBwYXRjaCwgd2UgcmVmcmFtZSB0aGUgYnJpZGdlIHJlZ2lzdHJh dGlvbiBmcmFtZXdvcmsKPj4gc28gdGhhdCBicmlkZ2UgaW5pdGlhbGl6YXRpb24gaXMgc3BsaXQg aW50byAyIHN0ZXBzLCBhbmQKPj4gYnJpZGdlIHJlZ2lzdHJhdGlvbiBoYXBwZW5zIGluZGVwZW5k ZW50IG9mIGRybSBmbG93Ogo+PiAtLVN0ZXAgMTogZ2F0aGVyIGFsbCB0aGUgYnJpZGdlIHNldHRp bmdzIGluZGVwZW5kZW50IG9mIGRybSBhbmQKPj4gICAgICAgICAgIGFkZCB0aGUgYnJpZGdlIG9u dG8gYSBnbG9iYWwgbGlzdCBvZiBicmlkZ2VzLgo+PiAtLVN0ZXAgMjogd2hlbiB0aGUgZW5jb2Rl ciBkcml2ZXIgaXMgcHJvYmVkLCBjYWxsIGRybV9icmlkZ2VfYXR0YWNoCj4+ICAgICAgICAgICBm b3IgdGhlIGNvcnJlc3BvbmRpbmcgYnJpZGdlIHNvIHRoYXQgdGhlIGJyaWRnZSByZWNlaXZlcwo+ PiAgICAgICAgICAgZHJtX2RldmljZSBwb2ludGVyIGFuZCBjb250aW51ZXMgd2l0aCBjb25uZWN0 b3IgYW5kIG90aGVyCj4+ICAgICAgICAgICBkcm0gaW5pdGlhbGl6YXRpb25zLgo+Pgo+PiBUaGUg b2xkIHNldCBvZiBicmlkZ2UgaGVscGVycyBhcmUgcmVtb3ZlZCwgYW5kIGEgc2V0IG9mIG5ldyBo ZWxwZXJzCj4+IGFyZSBhZGRlZCB0byBhY2NvbXBsaXNoIHRoZSAyIHN0ZXAgaW5pdGlhbGl6YXRp b24uCj4+Cj4+IFRoZSBicmlkZ2UgZGV2aWNlcyByZWdpc3RlciB0aGVtc2VsdmVzIG9udG8gZ2xv YmFsIGxpc3Qgb2YgYnJpZGdlcwo+PiB3aGVuIHRoZXkgZ2V0IHByb2JlZCBieSBjYWxsaW5nICJk cm1fYnJpZGdlX2FkZCIuCj4+Cj4+IFRoZSBwYXJlbnQgZW5jb2RlciBkcml2ZXIgd2FpdHMgdGls bCB0aGUgYnJpZGdlIGlzIGF2YWlsYWJsZQo+PiBpbiB0aGUgbG9va3VwIHRhYmxlKGJ5IGNhbGxp bmcgIm9mX2RybV9maW5kX2JyaWRnZSIpIGFuZCB0aGVuCj4+IGNvbnRpbnVlcyB3aXRoIGl0cyBp bml0aWFsaXphdGlvbi4KPj4KPj4gVGhlIGVuY29kZXIgZHJpdmVyIHNob3VsZCBhbHNvIGNhbGwg ImRybV9icmlkZ2VfYXR0YWNoIiB0byBwYXNzCj4+IG9uIHRoZSBkcm1fZGV2aWNlIHRvIHRoZSBi cmlkZ2Ugb2JqZWN0Lgo+Pgo+PiBkcm1fYnJpZGdlX2F0dGFjaCBpbnR1cm4gY2FsbHMgImJyaWRn ZS0+ZnVuY3MtPmF0dGFjaCIgc28gdGhhdAo+PiBicmlkZ2UgY2FuIGNvbnRpbnVlIHdpdGggZHJt IHJlbGF0ZWQgaW5pdGlhbGl6YXRpb25zLgo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBBamF5IEt1bWFy IDxhamF5a3VtYXIucnNAc2Ftc3VuZy5jb20+Cj4+IC0tLQo+PiAgZHJpdmVycy9ncHUvZHJtL01h a2VmaWxlICAgICAgICAgICAgICAgfCAgICAyICstCj4+ICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdl L3B0bjM0NjAuYyAgICAgICB8ICAgMjcgKysrKystLS0tLQo+PiAgZHJpdmVycy9ncHUvZHJtL2Ry bV9icmlkZ2UuYyAgICAgICAgICAgfCAgIDkxICsrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrCj4+ICBkcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYyAgICAgICAgICAgICB8ICAgNjUgLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KPj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pLmMg ICAgICAgIHwgICAgNyArLS0KPj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pLmggICAg ICAgIHwgICAgMSArCj4+ICBkcml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaV9icmlkZ2UuYyB8 ICAgIDcgKystCj4+ICBkcml2ZXJzL2dwdS9kcm0vc3RpL3N0aV9oZGEuYyAgICAgICAgICB8ICAg MTAgKy0tLQo+PiAgZHJpdmVycy9ncHUvZHJtL3N0aS9zdGlfaGRtaS5jICAgICAgICAgfCAgIDEw ICstLS0KPj4gIGluY2x1ZGUvZHJtL2JyaWRnZS9wdG4zNDYwLmggICAgICAgICAgIHwgICAgOCAr KysKPj4gIGluY2x1ZGUvZHJtL2RybV9jcnRjLmggICAgICAgICAgICAgICAgIHwgICAyNiArKysr LS0tLS0KPj4gIDExIGZpbGVzIGNoYW5nZWQsIDEzNiBpbnNlcnRpb25zKCspLCAxMTggZGVsZXRp b25zKC0pCj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2RybV9icmlkZ2Uu Ywo+Pgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlIGIvZHJpdmVycy9n cHUvZHJtL01ha2VmaWxlCj4+IGluZGV4IDkyOTJhNzYuLjAwZjk3YTUgMTAwNjQ0Cj4+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vTWFrZWZp bGUKPj4gQEAgLTE0LDcgKzE0LDcgQEAgZHJtLXkgICAgICAgOj0gICAgICAgIGRybV9hdXRoLm8g ZHJtX2J1ZnMubyBkcm1fY2FjaGUubyBcCj4+ICAgICAgICAgICAgICAgICBkcm1faW5mby5vIGRy bV9kZWJ1Z2ZzLm8gZHJtX2VuY29kZXJfc2xhdmUubyBcCj4+ICAgICAgICAgICAgICAgICBkcm1f dHJhY2VfcG9pbnRzLm8gZHJtX2dsb2JhbC5vIGRybV9wcmltZS5vIFwKPj4gICAgICAgICAgICAg ICAgIGRybV9yZWN0Lm8gZHJtX3ZtYV9tYW5hZ2VyLm8gZHJtX2ZsaXBfd29yay5vIFwKPj4gLSAg ICAgICAgICAgICAgIGRybV9tb2Rlc2V0X2xvY2subwo+PiArICAgICAgICAgICAgICAgZHJtX21v ZGVzZXRfbG9jay5vIGRybV9icmlkZ2Uubwo+Pgo+PiAgZHJtLSQoQ09ORklHX0NPTVBBVCkgKz0g ZHJtX2lvYzMyLm8KPj4gIGRybS0kKENPTkZJR19EUk1fR0VNX0NNQV9IRUxQRVIpICs9IGRybV9n ZW1fY21hX2hlbHBlci5vCj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL3B0 bjM0NjAuYyBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvcHRuMzQ2MC5jCj4+IGluZGV4IGEyZGRj OGQuLjRhODE4YzEgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvcHRuMzQ2 MC5jCj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvcHRuMzQ2MC5jCj4+IEBAIC0xNzYs MjQgKzE3NiwxMSBAQCBzdGF0aWMgdm9pZCBwdG4zNDYwX3Bvc3RfZGlzYWJsZShzdHJ1Y3QgZHJt X2JyaWRnZSAqYnJpZGdlKQo+PiAgewo+PiAgfQo+Pgo+PiAtc3RhdGljIHZvaWQgcHRuMzQ2MF9i cmlkZ2VfZGVzdHJveShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+PiAtewo+PiAtICAgICAg IHN0cnVjdCBwdG4zNDYwX2JyaWRnZSAqcHRuX2JyaWRnZSA9IGJyaWRnZV90b19wdG4zNDYwKGJy aWRnZSk7Cj4+IC0KPj4gLSAgICAgICBkcm1fYnJpZGdlX2NsZWFudXAoYnJpZGdlKTsKPj4gLSAg ICAgICBpZiAoZ3Bpb19pc192YWxpZChwdG5fYnJpZGdlLT5ncGlvX3BkX24pKQo+PiAtICAgICAg ICAgICAgICAgZ3Bpb19mcmVlKHB0bl9icmlkZ2UtPmdwaW9fcGRfbik7Cj4+IC0gICAgICAgaWYg KGdwaW9faXNfdmFsaWQocHRuX2JyaWRnZS0+Z3Bpb19yc3RfbikpCj4+IC0gICAgICAgICAgICAg ICBncGlvX2ZyZWUocHRuX2JyaWRnZS0+Z3Bpb19yc3Rfbik7Cj4+IC0gICAgICAgLyogTm90aGlu ZyBlbHNlIHRvIGZyZWUsIHdlJ3ZlIGdvdCBkZXZtIGFsbG9jYXRlZCBtZW1vcnkgKi8KPj4gLX0K Pj4gLQo+PiAgc3RhdGljIHN0cnVjdCBkcm1fYnJpZGdlX2Z1bmNzIHB0bjM0NjBfYnJpZGdlX2Z1 bmNzID0gewo+PiAgICAgICAgIC5wcmVfZW5hYmxlID0gcHRuMzQ2MF9wcmVfZW5hYmxlLAo+PiAg ICAgICAgIC5lbmFibGUgPSBwdG4zNDYwX2VuYWJsZSwKPj4gICAgICAgICAuZGlzYWJsZSA9IHB0 bjM0NjBfZGlzYWJsZSwKPj4gICAgICAgICAucG9zdF9kaXNhYmxlID0gcHRuMzQ2MF9wb3N0X2Rp c2FibGUsCj4+IC0gICAgICAgLmRlc3Ryb3kgPSBwdG4zNDYwX2JyaWRnZV9kZXN0cm95LAo+PiAg fTsKPj4KPj4gIHN0YXRpYyBpbnQgcHRuMzQ2MF9nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0 b3IgKmNvbm5lY3RvcikKPj4gQEAgLTMxNCw3ICszMDEsNyBAQCBpbnQgcHRuMzQ2MF9pbml0KHN0 cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKPj4gICAg ICAgICB9Cj4+Cj4+ICAgICAgICAgcHRuX2JyaWRnZS0+YnJpZGdlLmZ1bmNzID0gJnB0bjM0NjBf YnJpZGdlX2Z1bmNzOwo+PiAtICAgICAgIHJldCA9IGRybV9icmlkZ2VfaW5pdChkZXYsICZwdG5f YnJpZGdlLT5icmlkZ2UpOwo+PiArICAgICAgIHJldCA9IGRybV9icmlkZ2VfYXR0YWNoKGRldiwg JnB0bl9icmlkZ2UtPmJyaWRnZSk7Cj4+ICAgICAgICAgaWYgKHJldCkgewo+PiAgICAgICAgICAg ICAgICAgRFJNX0VSUk9SKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBicmlkZ2Ugd2l0aCBkcm1cbiIp Owo+PiAgICAgICAgICAgICAgICAgZ290byBlcnI7Cj4+IEBAIC0zNDMsMyArMzMwLDE1IEBAIGVy cjoKPj4gICAgICAgICByZXR1cm4gcmV0Owo+PiAgfQo+PiAgRVhQT1JUX1NZTUJPTChwdG4zNDYw X2luaXQpOwo+PiArCj4+ICt2b2lkIHB0bjM0NjBfZGVzdHJveShzdHJ1Y3QgZHJtX2JyaWRnZSAq YnJpZGdlKQo+PiArewo+PiArICAgICAgIHN0cnVjdCBwdG4zNDYwX2JyaWRnZSAqcHRuX2JyaWRn ZSA9IGJyaWRnZS0+ZHJpdmVyX3ByaXZhdGU7Cj4+ICsKPj4gKyAgICAgICBpZiAoZ3Bpb19pc192 YWxpZChwdG5fYnJpZGdlLT5ncGlvX3BkX24pKQo+PiArICAgICAgICAgICAgICAgZ3Bpb19mcmVl KHB0bl9icmlkZ2UtPmdwaW9fcGRfbik7Cj4+ICsgICAgICAgaWYgKGdwaW9faXNfdmFsaWQocHRu X2JyaWRnZS0+Z3Bpb19yc3RfbikpCj4+ICsgICAgICAgICAgICAgICBncGlvX2ZyZWUocHRuX2Jy aWRnZS0+Z3Bpb19yc3Rfbik7Cj4+ICsgICAgICAgLyogTm90aGluZyBlbHNlIHRvIGZyZWUsIHdl J3ZlIGdvdCBkZXZtIGFsbG9jYXRlZCBtZW1vcnkgKi8KPj4gK30KPj4gK0VYUE9SVF9TWU1CT0wo cHRuMzQ2MF9kZXN0cm95KTsKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnJp ZGdlLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2JyaWRnZS5jCj4+IG5ldyBmaWxlIG1vZGUgMTAw NjQ0Cj4+IGluZGV4IDAwMDAwMDAuLmQxMTg3ZTUKPj4gLS0tIC9kZXYvbnVsbAo+PiArKysgYi9k cml2ZXJzL2dwdS9kcm0vZHJtX2JyaWRnZS5jCj4+IEBAIC0wLDAgKzEsOTEgQEAKPj4gKy8qCj4+ ICsgKiBDb3B5cmlnaHQgKGMpIDIwMTQgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZAo+PiAr ICoKPj4gKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0 byBhbnkgcGVyc29uIG9idGFpbmluZyBhCj4+ICsgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5k IGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAo+PiArICog dG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdp dGhvdXQgbGltaXRhdGlvbgo+PiArICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwg bWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAo+PiArICogYW5kL29yIHNl bGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20g dGhlCj4+ICsgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhl IGZvbGxvd2luZyBjb25kaXRpb25zOgo+PiArICoKPj4gKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQg bm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCj4+ICsgKiBu ZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFu dGlhbCBwb3J0aW9ucwo+PiArICogb2YgdGhlIFNvZnR3YXJlLgo+PiArICoKPj4gKyAqIFRIRSBT T0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5E LCBFWFBSRVNTIE9SCj4+ICsgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRP IFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPj4gKyAqIEZJVE5FU1MgRk9SIEEg UEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFM TAo+PiArICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBB TlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPj4gKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBB TiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCj4+ICsgKiBG Uk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNF IE9SIE9USEVSCj4+ICsgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCj4+ICsgKi8KPj4gKwo+ PiArI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ PiArCj4+ICsjaW5jbHVkZSA8ZHJtL2RybV9jcnRjLmg+Cj4+ICsKPj4gKyNpbmNsdWRlICJkcm0v ZHJtUC5oIgo+PiArCj4+ICtzdGF0aWMgREVGSU5FX01VVEVYKGJyaWRnZV9sb2NrKTsKPj4gK3N0 YXRpYyBMSVNUX0hFQUQoYnJpZGdlX2xpc3QpOwo+PiArCj4+ICtpbnQgZHJtX2JyaWRnZV9hZGQo c3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKPj4gK3sKPj4gKyAgICAgICBtdXRleF9sb2NrKCZi cmlkZ2VfbG9jayk7Cj4+ICsgICAgICAgbGlzdF9hZGRfdGFpbCgmYnJpZGdlLT5saXN0LCAmYnJp ZGdlX2xpc3QpOwo+PiArICAgICAgIG11dGV4X3VubG9jaygmYnJpZGdlX2xvY2spOwo+PiArCj4+ ICsgICAgICAgcmV0dXJuIDA7Cj4+ICt9Cj4+ICtFWFBPUlRfU1lNQk9MKGRybV9icmlkZ2VfYWRk KTsKPj4gKwo+PiArdm9pZCBkcm1fYnJpZGdlX3JlbW92ZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJp ZGdlKQo+PiArewo+PiArICAgICAgIG11dGV4X2xvY2soJmJyaWRnZV9sb2NrKTsKPj4gKyAgICAg ICBsaXN0X2RlbF9pbml0KCZicmlkZ2UtPmxpc3QpOwo+PiArICAgICAgIG11dGV4X3VubG9jaygm YnJpZGdlX2xvY2spOwo+PiArfQo+PiArRVhQT1JUX1NZTUJPTChkcm1fYnJpZGdlX3JlbW92ZSk7 Cj4+ICsKPj4gK2V4dGVybiBpbnQgZHJtX2JyaWRnZV9hdHRhY2goc3RydWN0IGRybV9kZXZpY2Ug KmRldiwgc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKPj4gK3sKPj4gKyAgICAgICBpZiAoIWRl diB8fCAhYnJpZGdlKQo+PiArICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4+ICsKPj4g KyAgICAgICBpZiAoYnJpZGdlLT5kZXYpCj4+ICsgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZ Owo+PiArCj4+ICsgICAgICAgYnJpZGdlLT5kZXYgPSBkZXY7Cj4+ICsKPj4gKyAgICAgICBpZiAo YnJpZGdlLT5mdW5jcy0+YXR0YWNoKQo+PiArICAgICAgICAgICAgICAgcmV0dXJuIGJyaWRnZS0+ ZnVuY3MtPmF0dGFjaChicmlkZ2UpOwo+PiArCj4+ICsgICAgICAgcmV0dXJuIDA7Cj4+ICt9Cj4+ ICtFWFBPUlRfU1lNQk9MKGRybV9icmlkZ2VfYXR0YWNoKTsKPj4gKwo+PiArI2lmZGVmIENPTkZJ R19PRgo+PiArc3RydWN0IGRybV9icmlkZ2UgKm9mX2RybV9maW5kX2JyaWRnZShzdHJ1Y3QgZGV2 aWNlX25vZGUgKm5wKQo+PiArewo+PiArICAgICAgIHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2U7 Cj4+ICsKPj4gKyAgICAgICBtdXRleF9sb2NrKCZicmlkZ2VfbG9jayk7Cj4+ICsKPj4gKyAgICAg ICBsaXN0X2Zvcl9lYWNoX2VudHJ5KGJyaWRnZSwgJmJyaWRnZV9saXN0LCBsaXN0KSB7Cj4+ICsg ICAgICAgICAgICAgICBpZiAoYnJpZGdlLT5vZl9ub2RlID09IG5wKSB7Cj4+ICsgICAgICAgICAg ICAgICAgICAgICAgIG11dGV4X3VubG9jaygmYnJpZGdlX2xvY2spOwo+PiArICAgICAgICAgICAg ICAgICAgICAgICByZXR1cm4gYnJpZGdlOwo+PiArICAgICAgICAgICAgICAgfQo+PiArICAgICAg IH0KPj4gKwo+PiArICAgICAgIG11dGV4X3VubG9jaygmYnJpZGdlX2xvY2spOwo+PiArICAgICAg IHJldHVybiBOVUxMOwo+PiArfQo+PiArRVhQT1JUX1NZTUJPTChvZl9kcm1fZmluZF9icmlkZ2Up Owo+PiArI2VuZGlmCj4+ICsKPj4gK01PRFVMRV9BVVRIT1IoIkFqYXkgS3VtYXIgPGFqYXlrdW1h ci5yc0BzYW1zdW5nLmNvbT4iKTsKPj4gK01PRFVMRV9ERVNDUklQVElPTigiRFJNIGJyaWRnZSBp bmZyYXN0cnVjdHVyZSIpOwo+PiArTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCBy aWdodHMiKTsKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jIGIvZHJp dmVycy9ncHUvZHJtL2RybV9jcnRjLmMKPj4gaW5kZXggNDA4YzA1My4uMzlkNjEwMCAxMDA2NDQK Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMKPj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL2RybV9jcnRjLmMKPj4gQEAgLTEwMDgsNTYgKzEwMDgsNiBAQCB2b2lkIGRybV9jb25uZWN0 b3JfdW5wbHVnX2FsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQo+PiAgRVhQT1JUX1NZTUJPTChk cm1fY29ubmVjdG9yX3VucGx1Z19hbGwpOwo+Pgo+PiAgLyoqCj4+IC0gKiBkcm1fYnJpZGdlX2lu aXQgLSBpbml0aWFsaXplIGEgZHJtIHRyYW5zY29kZXIvYnJpZGdlCj4+IC0gKiBAZGV2OiBkcm0g ZGV2aWNlCj4+IC0gKiBAYnJpZGdlOiB0cmFuc2NvZGVyL2JyaWRnZSB0byBzZXQgdXAKPj4gLSAq Cj4+IC0gKiBJbml0aWFsaXNlcyBhIHByZWFsbG9jYXRlZCBicmlkZ2UuIEJyaWRnZXMgc2hvdWxk IGJlCj4+IC0gKiBzdWJjbGFzc2VkIGFzIHBhcnQgb2YgZHJpdmVyIGNvbm5lY3RvciBvYmplY3Rz Lgo+PiAtICoKPj4gLSAqIFJldHVybnM6Cj4+IC0gKiBaZXJvIG9uIHN1Y2Nlc3MsIGVycm9yIGNv ZGUgb24gZmFpbHVyZS4KPj4gLSAqLwo+PiAtaW50IGRybV9icmlkZ2VfaW5pdChzdHJ1Y3QgZHJt X2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+PiAtewo+PiAtICAgICAg IGludCByZXQ7Cj4+IC0KPj4gLSAgICAgICBkcm1fbW9kZXNldF9sb2NrX2FsbChkZXYpOwo+PiAt Cj4+IC0gICAgICAgcmV0ID0gZHJtX21vZGVfb2JqZWN0X2dldChkZXYsICZicmlkZ2UtPmJhc2Us IERSTV9NT0RFX09CSkVDVF9CUklER0UpOwo+PiAtICAgICAgIGlmIChyZXQpCj4+IC0gICAgICAg ICAgICAgICBnb3RvIG91dDsKPj4gLQo+PiAtICAgICAgIGJyaWRnZS0+ZGV2ID0gZGV2Owo+PiAt Cj4+IC0gICAgICAgbGlzdF9hZGRfdGFpbCgmYnJpZGdlLT5oZWFkLCAmZGV2LT5tb2RlX2NvbmZp Zy5icmlkZ2VfbGlzdCk7Cj4+IC0gICAgICAgZGV2LT5tb2RlX2NvbmZpZy5udW1fYnJpZGdlKys7 Cj4+IC0KPj4gLSBvdXQ6Cj4+IC0gICAgICAgZHJtX21vZGVzZXRfdW5sb2NrX2FsbChkZXYpOwo+ PiAtICAgICAgIHJldHVybiByZXQ7Cj4+IC19Cj4+IC1FWFBPUlRfU1lNQk9MKGRybV9icmlkZ2Vf aW5pdCk7Cj4+IC0KPj4gLS8qKgo+PiAtICogZHJtX2JyaWRnZV9jbGVhbnVwIC0gY2xlYW5zIHVw IGFuIGluaXRpYWxpc2VkIGJyaWRnZQo+PiAtICogQGJyaWRnZTogYnJpZGdlIHRvIGNsZWFudXAK Pj4gLSAqCj4+IC0gKiBDbGVhbnMgdXAgdGhlIGJyaWRnZSBidXQgZG9lc24ndCBmcmVlIHRoZSBv YmplY3QuCj4+IC0gKi8KPj4gLXZvaWQgZHJtX2JyaWRnZV9jbGVhbnVwKHN0cnVjdCBkcm1fYnJp ZGdlICpicmlkZ2UpCj4+IC17Cj4+IC0gICAgICAgc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGJy aWRnZS0+ZGV2Owo+PiAtCj4+IC0gICAgICAgZHJtX21vZGVzZXRfbG9ja19hbGwoZGV2KTsKPj4g LSAgICAgICBkcm1fbW9kZV9vYmplY3RfcHV0KGRldiwgJmJyaWRnZS0+YmFzZSk7Cj4+IC0gICAg ICAgbGlzdF9kZWwoJmJyaWRnZS0+aGVhZCk7Cj4+IC0gICAgICAgZGV2LT5tb2RlX2NvbmZpZy5u dW1fYnJpZGdlLS07Cj4+IC0gICAgICAgZHJtX21vZGVzZXRfdW5sb2NrX2FsbChkZXYpOwo+PiAt fQo+PiAtRVhQT1JUX1NZTUJPTChkcm1fYnJpZGdlX2NsZWFudXApOwo+PiAtCj4+IC0vKioKPj4g ICAqIGRybV9lbmNvZGVyX2luaXQgLSBJbml0IGEgcHJlYWxsb2NhdGVkIGVuY29kZXIKPj4gICAq IEBkZXY6IGRybSBkZXZpY2UKPj4gICAqIEBlbmNvZGVyOiB0aGUgZW5jb2RlciB0byBpbml0Cj4+ IEBAIC0xNTM5LDcgKzE0ODksNiBAQCBzdGF0aWMgaW50IGRybV9tb2RlX2dyb3VwX2luaXQoc3Ry dWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9tb2RlX2dyb3VwICpncgo+PiAgICAgICAg IHRvdGFsX29iamVjdHMgKz0gZGV2LT5tb2RlX2NvbmZpZy5udW1fY3J0YzsKPj4gICAgICAgICB0 b3RhbF9vYmplY3RzICs9IGRldi0+bW9kZV9jb25maWcubnVtX2Nvbm5lY3RvcjsKPj4gICAgICAg ICB0b3RhbF9vYmplY3RzICs9IGRldi0+bW9kZV9jb25maWcubnVtX2VuY29kZXI7Cj4+IC0gICAg ICAgdG90YWxfb2JqZWN0cyArPSBkZXYtPm1vZGVfY29uZmlnLm51bV9icmlkZ2U7Cj4+Cj4+ICAg ICAgICAgZ3JvdXAtPmlkX2xpc3QgPSBremFsbG9jKHRvdGFsX29iamVjdHMgKiBzaXplb2YodWlu dDMyX3QpLCBHRlBfS0VSTkVMKTsKPj4gICAgICAgICBpZiAoIWdyb3VwLT5pZF9saXN0KQo+PiBA QCAtMTU0OCw3ICsxNDk3LDYgQEAgc3RhdGljIGludCBkcm1fbW9kZV9ncm91cF9pbml0KHN0cnVj dCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fbW9kZV9ncm91cCAqZ3IKPj4gICAgICAgICBn cm91cC0+bnVtX2NydGNzID0gMDsKPj4gICAgICAgICBncm91cC0+bnVtX2Nvbm5lY3RvcnMgPSAw Owo+PiAgICAgICAgIGdyb3VwLT5udW1fZW5jb2RlcnMgPSAwOwo+PiAtICAgICAgIGdyb3VwLT5u dW1fYnJpZGdlcyA9IDA7Cj4+ICAgICAgICAgcmV0dXJuIDA7Cj4+ICB9Cj4+Cj4+IEBAIC0xNTY4 LDcgKzE1MTYsNiBAQCBpbnQgZHJtX21vZGVfZ3JvdXBfaW5pdF9sZWdhY3lfZ3JvdXAoc3RydWN0 IGRybV9kZXZpY2UgKmRldiwKPj4gICAgICAgICBzdHJ1Y3QgZHJtX2NydGMgKmNydGM7Cj4+ICAg ICAgICAgc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwo+PiAgICAgICAgIHN0cnVjdCBkcm1f Y29ubmVjdG9yICpjb25uZWN0b3I7Cj4+IC0gICAgICAgc3RydWN0IGRybV9icmlkZ2UgKmJyaWRn ZTsKPj4gICAgICAgICBpbnQgcmV0Owo+Pgo+PiAgICAgICAgIGlmICgocmV0ID0gZHJtX21vZGVf Z3JvdXBfaW5pdChkZXYsIGdyb3VwKSkpCj4+IEBAIC0xNTg1LDExICsxNTMyLDYgQEAgaW50IGRy bV9tb2RlX2dyb3VwX2luaXRfbGVnYWN5X2dyb3VwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCj4+ ICAgICAgICAgICAgICAgICBncm91cC0+aWRfbGlzdFtncm91cC0+bnVtX2NydGNzICsgZ3JvdXAt Pm51bV9lbmNvZGVycyArCj4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC0+ bnVtX2Nvbm5lY3RvcnMrK10gPSBjb25uZWN0b3ItPmJhc2UuaWQ7Cj4+Cj4+IC0gICAgICAgbGlz dF9mb3JfZWFjaF9lbnRyeShicmlkZ2UsICZkZXYtPm1vZGVfY29uZmlnLmJyaWRnZV9saXN0LCBo ZWFkKQo+PiAtICAgICAgICAgICAgICAgZ3JvdXAtPmlkX2xpc3RbZ3JvdXAtPm51bV9jcnRjcyAr IGdyb3VwLT5udW1fZW5jb2RlcnMgKwo+PiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Z3JvdXAtPm51bV9jb25uZWN0b3JzICsgZ3JvdXAtPm51bV9icmlkZ2VzKytdID0KPj4gLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyaWRnZS0+YmFzZS5pZDsKPj4gLQo+ PiAgICAgICAgIHJldHVybiAwOwo+PiAgfQo+PiAgRVhQT1JUX1NZTUJPTChkcm1fbW9kZV9ncm91 cF9pbml0X2xlZ2FjeV9ncm91cCk7Cj4+IEBAIC01MDg4LDcgKzUwMzAsNiBAQCB2b2lkIGRybV9t b2RlX2NvbmZpZ19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCj4+ICAgICAgICAgSU5JVF9M SVNUX0hFQUQoJmRldi0+bW9kZV9jb25maWcuZmJfbGlzdCk7Cj4+ICAgICAgICAgSU5JVF9MSVNU X0hFQUQoJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0KTsKPj4gICAgICAgICBJTklUX0xJU1Rf SEVBRCgmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCk7Cj4+IC0gICAgICAgSU5JVF9M SVNUX0hFQUQoJmRldi0+bW9kZV9jb25maWcuYnJpZGdlX2xpc3QpOwo+PiAgICAgICAgIElOSVRf TElTVF9IRUFEKCZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCk7Cj4+ICAgICAgICAgSU5J VF9MSVNUX0hFQUQoJmRldi0+bW9kZV9jb25maWcucHJvcGVydHlfbGlzdCk7Cj4+ICAgICAgICAg SU5JVF9MSVNUX0hFQUQoJmRldi0+bW9kZV9jb25maWcucHJvcGVydHlfYmxvYl9saXN0KTsKPj4g QEAgLTUxMjgsNyArNTA2OSw2IEBAIHZvaWQgZHJtX21vZGVfY29uZmlnX2NsZWFudXAoc3RydWN0 IGRybV9kZXZpY2UgKmRldikKPj4gICAgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVj dG9yLCAqb3Q7Cj4+ICAgICAgICAgc3RydWN0IGRybV9jcnRjICpjcnRjLCAqY3Q7Cj4+ICAgICAg ICAgc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCAqZW5jdDsKPj4gLSAgICAgICBzdHJ1Y3Qg ZHJtX2JyaWRnZSAqYnJpZGdlLCAqYnJ0Owo+PiAgICAgICAgIHN0cnVjdCBkcm1fZnJhbWVidWZm ZXIgKmZiLCAqZmJ0Owo+PiAgICAgICAgIHN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LCAq cHQ7Cj4+ICAgICAgICAgc3RydWN0IGRybV9wcm9wZXJ0eV9ibG9iICpibG9iLCAqYnQ7Cj4+IEBA IC01MTM5LDExICs1MDc5LDYgQEAgdm9pZCBkcm1fbW9kZV9jb25maWdfY2xlYW51cChzdHJ1Y3Qg ZHJtX2RldmljZSAqZGV2KQo+PiAgICAgICAgICAgICAgICAgZW5jb2Rlci0+ZnVuY3MtPmRlc3Ry b3koZW5jb2Rlcik7Cj4+ICAgICAgICAgfQo+Pgo+PiAtICAgICAgIGxpc3RfZm9yX2VhY2hfZW50 cnlfc2FmZShicmlkZ2UsIGJydCwKPj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg JmRldi0+bW9kZV9jb25maWcuYnJpZGdlX2xpc3QsIGhlYWQpIHsKPj4gLSAgICAgICAgICAgICAg IGJyaWRnZS0+ZnVuY3MtPmRlc3Ryb3koYnJpZGdlKTsKPj4gLSAgICAgICB9Cj4+IC0KPj4gICAg ICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY29ubmVjdG9yLCBvdCwKPj4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3Qs IGhlYWQpIHsKPj4gICAgICAgICAgICAgICAgIGNvbm5lY3Rvci0+ZnVuY3MtPmRlc3Ryb3koY29u bmVjdG9yKTsKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pLmMg Yi9kcml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaS5jCj4+IGluZGV4IDlkMDBkY2IuLmU0ZjI0 OWIgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pLmMKPj4gKysr IGIvZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL2hkbWkuYwo+PiBAQCAtNjUsNiArNjUsOSBAQCB2 b2lkIGhkbWlfZGVzdHJveShzdHJ1Y3Qga3JlZiAqa3JlZikKPj4gICAgICAgICBpZiAoaGRtaS0+ aTJjKQo+PiAgICAgICAgICAgICAgICAgaGRtaV9pMmNfZGVzdHJveShoZG1pLT5pMmMpOwo+Pgo+ PiArICAgICAgIGlmIChoZG1pLT5icmlkZ2UpCj4+ICsgICAgICAgICAgICAgICBoZG1pX2JyaWRn ZV9kZXN0cm95KGhkbWktPmJyaWRnZSk7Cj4+ICsKPj4gICAgICAgICBwbGF0Zm9ybV9zZXRfZHJ2 ZGF0YShoZG1pLT5wZGV2LCBOVUxMKTsKPj4gIH0KPj4KPj4gQEAgLTIzNCw5ICsyMzcsNyBAQCBz dHJ1Y3QgaGRtaSAqaGRtaV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1f ZW5jb2RlciAqZW5jb2RlcikKPj4KPj4gIGZhaWw6Cj4+ICAgICAgICAgaWYgKGhkbWkpIHsKPj4g LSAgICAgICAgICAgICAgIC8qIGJyaWRnZS9jb25uZWN0b3IgYXJlIG5vcm1hbGx5IGRlc3Ryb3ll ZCBieSBkcm06ICovCj4+IC0gICAgICAgICAgICAgICBpZiAoaGRtaS0+YnJpZGdlKQo+PiAtICAg ICAgICAgICAgICAgICAgICAgICBoZG1pLT5icmlkZ2UtPmZ1bmNzLT5kZXN0cm95KGhkbWktPmJy aWRnZSk7Cj4+ICsgICAgICAgICAgICAgICAvKiBicmlkZ2UgaXMgbm9ybWFsbHkgZGVzdHJveWVk IGJ5IGRybTogKi8KPj4gICAgICAgICAgICAgICAgIGlmIChoZG1pLT5jb25uZWN0b3IpCj4+ICAg ICAgICAgICAgICAgICAgICAgICAgIGhkbWktPmNvbm5lY3Rvci0+ZnVuY3MtPmRlc3Ryb3koaGRt aS0+Y29ubmVjdG9yKTsKPj4gICAgICAgICAgICAgICAgIGhkbWlfZGVzdHJveSgmaGRtaS0+cmVm Y291bnQpOwo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL2hkbWkuaCBi L2RyaXZlcnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pLmgKPj4gaW5kZXggYjk4MTk5NS4uZDJjZjdm NCAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9oZG1pL2hkbWkuaAo+PiArKysg Yi9kcml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaS5oCj4+IEBAIC0xNjMsNiArMTYzLDcgQEAg dm9pZCBoZG1pX2F1ZGlvX3NldF9zYW1wbGVfcmF0ZShzdHJ1Y3QgaGRtaSAqaGRtaSwgaW50IHJh dGUpOwo+PiAgICovCj4+Cj4+ICBzdHJ1Y3QgZHJtX2JyaWRnZSAqaGRtaV9icmlkZ2VfaW5pdChz dHJ1Y3QgaGRtaSAqaGRtaSk7Cj4+ICt2b2lkIGhkbWlfYnJpZGdlX2Rlc3Ryb3koc3RydWN0IGRy bV9icmlkZ2UgKmJyaWRnZSk7Cj4+Cj4+ICAvKgo+PiAgICogaGRtaSBjb25uZWN0b3I6Cj4+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2hkbWkvaGRtaV9icmlkZ2UuYyBiL2RyaXZl cnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pX2JyaWRnZS5jCj4+IGluZGV4IDAzMDk1MzkuLjI2NjU3 YTAgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pX2JyaWRnZS5j Cj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pX2JyaWRnZS5jCj4+IEBAIC0y MywxMSArMjMsMTEgQEAgc3RydWN0IGhkbWlfYnJpZGdlIHsKPj4gIH07Cj4+ICAjZGVmaW5lIHRv X2hkbWlfYnJpZGdlKHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgaGRtaV9icmlkZ2UsIGJhc2Up Cj4+Cj4+IC1zdGF0aWMgdm9pZCBoZG1pX2JyaWRnZV9kZXN0cm95KHN0cnVjdCBkcm1fYnJpZGdl ICpicmlkZ2UpCj4+ICt2b2lkIGhkbWlfYnJpZGdlX2Rlc3Ryb3koc3RydWN0IGRybV9icmlkZ2Ug KmJyaWRnZSkKPj4gIHsKPj4gICAgICAgICBzdHJ1Y3QgaGRtaV9icmlkZ2UgKmhkbWlfYnJpZGdl ID0gdG9faGRtaV9icmlkZ2UoYnJpZGdlKTsKPj4gKwo+PiAgICAgICAgIGhkbWlfdW5yZWZlcmVu Y2UoaGRtaV9icmlkZ2UtPmhkbWkpOwo+PiAtICAgICAgIGRybV9icmlkZ2VfY2xlYW51cChicmlk Z2UpOwo+PiAgICAgICAgIGtmcmVlKGhkbWlfYnJpZGdlKTsKPj4gIH0KPj4KPj4gQEAgLTIwMSw3 ICsyMDEsNiBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9icmlkZ2VfZnVuY3MgaGRtaV9icmlk Z2VfZnVuY3MgPSB7Cj4+ICAgICAgICAgICAgICAgICAuZGlzYWJsZSA9IGhkbWlfYnJpZGdlX2Rp c2FibGUsCj4+ICAgICAgICAgICAgICAgICAucG9zdF9kaXNhYmxlID0gaGRtaV9icmlkZ2VfcG9z dF9kaXNhYmxlLAo+PiAgICAgICAgICAgICAgICAgLm1vZGVfc2V0ID0gaGRtaV9icmlkZ2VfbW9k ZV9zZXQsCj4+IC0gICAgICAgICAgICAgICAuZGVzdHJveSA9IGhkbWlfYnJpZGdlX2Rlc3Ryb3ks Cj4+ICB9Owo+Pgo+Pgo+PiBAQCAtMjIzLDcgKzIyMiw3IEBAIHN0cnVjdCBkcm1fYnJpZGdlICpo ZG1pX2JyaWRnZV9pbml0KHN0cnVjdCBoZG1pICpoZG1pKQo+PiAgICAgICAgIGJyaWRnZSA9ICZo ZG1pX2JyaWRnZS0+YmFzZTsKPj4gICAgICAgICBicmlkZ2UtPmZ1bmNzID0gJmhkbWlfYnJpZGdl X2Z1bmNzOwo+Pgo+PiAtICAgICAgIGRybV9icmlkZ2VfaW5pdChoZG1pLT5kZXYsIGJyaWRnZSk7 Cj4+ICsgICAgICAgZHJtX2JyaWRnZV9hdHRhY2goaGRtaS0+ZGV2LCBicmlkZ2UpOwo+Pgo+PiAg ICAgICAgIHJldHVybiBicmlkZ2U7Cj4+Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v c3RpL3N0aV9oZGEuYyBiL2RyaXZlcnMvZ3B1L2RybS9zdGkvc3RpX2hkYS5jCj4+IGluZGV4IDZj ZjE0NWQuLmE5YmJiMDggMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9zdGkvc3RpX2hk YS5jCj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9zdGkvc3RpX2hkYS5jCj4+IEBAIC01MDgsMTkg KzUwOCwxMiBAQCBzdGF0aWMgdm9pZCBzdGlfaGRhX2JyaWRnZV9ub3BlKHN0cnVjdCBkcm1fYnJp ZGdlICpicmlkZ2UpCj4+ICAgICAgICAgLyogZG8gbm90aGluZyAqLwo+PiAgfQo+Pgo+PiAtc3Rh dGljIHZvaWQgc3RpX2hkYV9icmlnZGVfZGVzdHJveShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdl KQo+PiAtewo+PiAtICAgICAgIGRybV9icmlkZ2VfY2xlYW51cChicmlkZ2UpOwo+PiAtICAgICAg IGtmcmVlKGJyaWRnZSk7Cj4+IC19Cj4+IC0KPj4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Jy aWRnZV9mdW5jcyBzdGlfaGRhX2JyaWRnZV9mdW5jcyA9IHsKPj4gICAgICAgICAucHJlX2VuYWJs ZSA9IHN0aV9oZGFfcHJlX2VuYWJsZSwKPj4gICAgICAgICAuZW5hYmxlID0gc3RpX2hkYV9icmlk Z2Vfbm9wZSwKPj4gICAgICAgICAuZGlzYWJsZSA9IHN0aV9oZGFfZGlzYWJsZSwKPj4gICAgICAg ICAucG9zdF9kaXNhYmxlID0gc3RpX2hkYV9icmlkZ2Vfbm9wZSwKPj4gICAgICAgICAubW9kZV9z ZXQgPSBzdGlfaGRhX3NldF9tb2RlLAo+PiAtICAgICAgIC5kZXN0cm95ID0gc3RpX2hkYV9icmln ZGVfZGVzdHJveSwKPj4gIH07Cj4+Cj4+ICBzdGF0aWMgaW50IHN0aV9oZGFfY29ubmVjdG9yX2dl dF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+PiBAQCAtNjY1LDcgKzY1 OCw3IEBAIHN0YXRpYyBpbnQgc3RpX2hkYV9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0 IGRldmljZSAqbWFzdGVyLCB2b2lkICpkYXRhKQo+Pgo+PiAgICAgICAgIGJyaWRnZS0+ZHJpdmVy X3ByaXZhdGUgPSBoZGE7Cj4+ICAgICAgICAgYnJpZGdlLT5mdW5jcyA9ICZzdGlfaGRhX2JyaWRn ZV9mdW5jczsKPj4gLSAgICAgICBkcm1fYnJpZGdlX2luaXQoZHJtX2RldiwgYnJpZGdlKTsKPj4g KyAgICAgICBkcm1fYnJpZGdlX2F0dGFjaChkcm1fZGV2LCBicmlkZ2UpOwo+Pgo+PiAgICAgICAg IGVuY29kZXItPmJyaWRnZSA9IGJyaWRnZTsKPj4gICAgICAgICBjb25uZWN0b3ItPmVuY29kZXIg PSBlbmNvZGVyOwo+PiBAQCAtNjk0LDcgKzY4Nyw2IEBAIHN0YXRpYyBpbnQgc3RpX2hkYV9iaW5k KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLCB2b2lkICpkYXRhKQo+ PiAgZXJyX3N5c2ZzOgo+PiAgICAgICAgIGRybV9jb25uZWN0b3JfdW5yZWdpc3Rlcihkcm1fY29u bmVjdG9yKTsKPj4gIGVycl9jb25uZWN0b3I6Cj4+IC0gICAgICAgZHJtX2JyaWRnZV9jbGVhbnVw KGJyaWRnZSk7Cj4+ICAgICAgICAgZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGRybV9jb25uZWN0b3Ip Owo+PiAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+PiAgfQo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL3N0aS9zdGlfaGRtaS5jIGIvZHJpdmVycy9ncHUvZHJtL3N0aS9zdGlfaGRtaS5j Cj4+IGluZGV4IDI4NWY3MjMuLmJmNGNkYjggMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2Ry bS9zdGkvc3RpX2hkbWkuYwo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vc3RpL3N0aV9oZG1pLmMK Pj4gQEAgLTQ2MywxOSArNDYzLDEyIEBAIHN0YXRpYyB2b2lkIHN0aV9oZG1pX2JyaWRnZV9ub3Bl KHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpCj4+ICAgICAgICAgLyogZG8gbm90aGluZyAqLwo+ PiAgfQo+Pgo+PiAtc3RhdGljIHZvaWQgc3RpX2hkbWlfYnJpZ2RlX2Rlc3Ryb3koc3RydWN0IGRy bV9icmlkZ2UgKmJyaWRnZSkKPj4gLXsKPj4gLSAgICAgICBkcm1fYnJpZGdlX2NsZWFudXAoYnJp ZGdlKTsKPj4gLSAgICAgICBrZnJlZShicmlkZ2UpOwo+PiAtfQo+PiAtCj4+ICBzdGF0aWMgY29u c3Qgc3RydWN0IGRybV9icmlkZ2VfZnVuY3Mgc3RpX2hkbWlfYnJpZGdlX2Z1bmNzID0gewo+PiAg ICAgICAgIC5wcmVfZW5hYmxlID0gc3RpX2hkbWlfcHJlX2VuYWJsZSwKPj4gICAgICAgICAuZW5h YmxlID0gc3RpX2hkbWlfYnJpZGdlX25vcGUsCj4+ICAgICAgICAgLmRpc2FibGUgPSBzdGlfaGRt aV9kaXNhYmxlLAo+PiAgICAgICAgIC5wb3N0X2Rpc2FibGUgPSBzdGlfaGRtaV9icmlkZ2Vfbm9w ZSwKPj4gICAgICAgICAubW9kZV9zZXQgPSBzdGlfaGRtaV9zZXRfbW9kZSwKPj4gLSAgICAgICAu ZGVzdHJveSA9IHN0aV9oZG1pX2JyaWdkZV9kZXN0cm95LAo+PiAgfTsKPj4KPj4gIHN0YXRpYyBp bnQgc3RpX2hkbWlfY29ubmVjdG9yX2dldF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29u bmVjdG9yKQo+PiBAQCAtNjI5LDcgKzYyMiw3IEBAIHN0YXRpYyBpbnQgc3RpX2hkbWlfYmluZChz dHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0YSkKPj4K Pj4gICAgICAgICBicmlkZ2UtPmRyaXZlcl9wcml2YXRlID0gaGRtaTsKPj4gICAgICAgICBicmlk Z2UtPmZ1bmNzID0gJnN0aV9oZG1pX2JyaWRnZV9mdW5jczsKPj4gLSAgICAgICBkcm1fYnJpZGdl X2luaXQoZHJtX2RldiwgYnJpZGdlKTsKPj4gKyAgICAgICBkcm1fYnJpZGdlX2F0dGFjaChkcm1f ZGV2LCBicmlkZ2UpOwo+Pgo+PiAgICAgICAgIGVuY29kZXItPmJyaWRnZSA9IGJyaWRnZTsKPj4g ICAgICAgICBjb25uZWN0b3ItPmVuY29kZXIgPSBlbmNvZGVyOwo+PiBAQCAtNjYxLDcgKzY1NCw2 IEBAIHN0YXRpYyBpbnQgc3RpX2hkbWlfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBk ZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0YSkKPj4gIGVycl9zeXNmczoKPj4gICAgICAgICBkcm1f Y29ubmVjdG9yX3VucmVnaXN0ZXIoZHJtX2Nvbm5lY3Rvcik7Cj4+ICBlcnJfY29ubmVjdG9yOgo+ PiAtICAgICAgIGRybV9icmlkZ2VfY2xlYW51cChicmlkZ2UpOwo+PiAgICAgICAgIGRybV9jb25u ZWN0b3JfY2xlYW51cChkcm1fY29ubmVjdG9yKTsKPj4gICAgICAgICByZXR1cm4gLUVJTlZBTDsK Pj4gIH0KPj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2JyaWRnZS9wdG4zNDYwLmggYi9pbmNs dWRlL2RybS9icmlkZ2UvcHRuMzQ2MC5oCj4+IGluZGV4IGZmNjIzNDQuLmIxMWY4ZTEgMTAwNjQ0 Cj4+IC0tLSBhL2luY2x1ZGUvZHJtL2JyaWRnZS9wdG4zNDYwLmgKPj4gKysrIGIvaW5jbHVkZS9k cm0vYnJpZGdlL3B0bjM0NjAuaAo+PiBAQCAtMTUsNiArMTUsNyBAQAo+PiAgI2RlZmluZSBfRFJN X0JSSURHRV9QVE4zNDYwX0hfCj4+Cj4+ICBzdHJ1Y3QgZHJtX2RldmljZTsKPj4gK3N0cnVjdCBk cm1fYnJpZGdlOwo+PiAgc3RydWN0IGRybV9lbmNvZGVyOwo+PiAgc3RydWN0IGkyY19jbGllbnQ7 Cj4+ICBzdHJ1Y3QgZGV2aWNlX25vZGU7Cj4+IEBAIC0yMyw2ICsyNCw5IEBAIHN0cnVjdCBkZXZp Y2Vfbm9kZTsKPj4KPj4gIGludCBwdG4zNDYwX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwg c3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAo+PiAgICAgICAgICAgICAgICAgc3RydWN0IGky Y19jbGllbnQgKmNsaWVudCwgc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKPj4gKwo+PiArdm9p ZCBwdG4zNDYwX2Rlc3Ryb3koc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSk7Cj4+ICsKPj4gICNl bHNlCj4+Cj4+ICBzdGF0aWMgaW5saW5lIGludCBwdG4zNDYwX2luaXQoc3RydWN0IGRybV9kZXZp Y2UgKmRldiwKPj4gQEAgLTMyLDYgKzM2LDEwIEBAIHN0YXRpYyBpbmxpbmUgaW50IHB0bjM0NjBf aW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAo+PiAgICAgICAgIHJldHVybiAwOwo+PiAgfQo+ Pgo+PiArc3RhdGljIGlubGluZSB2b2lkIHB0bjM0NjBfZGVzdHJveShzdHJ1Y3QgZHJtX2JyaWRn ZSAqYnJpZGdlKQo+PiArewo+PiArfQo+PiArCj4+ICAjZW5kaWYKPj4KPj4gICNlbmRpZgo+PiBk aWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2NydGMuaCBiL2luY2x1ZGUvZHJtL2RybV9jcnRj LmgKPj4gaW5kZXggNWEzYmNlMTcuLmRhMmJlYWYgMTAwNjQ0Cj4+IC0tLSBhL2luY2x1ZGUvZHJt L2RybV9jcnRjLmgKPj4gKysrIGIvaW5jbHVkZS9kcm0vZHJtX2NydGMuaAo+PiBAQCAtNjMzLDE1 ICs2MzMsMTYgQEAgc3RydWN0IGRybV9wbGFuZSB7Cj4+Cj4+ICAvKioKPj4gICAqIGRybV9icmlk Z2VfZnVuY3MgLSBkcm1fYnJpZGdlIGNvbnRyb2wgZnVuY3Rpb25zCj4+ICsgKiBAYXR0YWNoOiBD YWxsZWQgZHVyaW5nIGRybV9icmlkZ2VfYXR0YWNoCj4+ICAgKiBAbW9kZV9maXh1cDogVHJ5IHRv IGZpeHVwIChvciByZWplY3QgZW50aXJlbHkpIHByb3Bvc2VkIG1vZGUgZm9yIHRoaXMgYnJpZGdl Cj4+ICAgKiBAZGlzYWJsZTogQ2FsbGVkIHJpZ2h0IGJlZm9yZSBlbmNvZGVyIHByZXBhcmUsIGRp c2FibGVzIHRoZSBicmlkZ2UKPj4gICAqIEBwb3N0X2Rpc2FibGU6IENhbGxlZCByaWdodCBhZnRl ciBlbmNvZGVyIHByZXBhcmUsIGZvciBsb2Nrc3RlcHBlZCBkaXNhYmxlCj4+ICAgKiBAbW9kZV9z ZXQ6IFNldCB0aGlzIG1vZGUgdG8gdGhlIGJyaWRnZQo+PiAgICogQHByZV9lbmFibGU6IENhbGxl ZCByaWdodCBiZWZvcmUgZW5jb2RlciBjb21taXQsIGZvciBsb2Nrc3RlcHBlZCBjb21taXQKPj4g ICAqIEBlbmFibGU6IENhbGxlZCByaWdodCBhZnRlciBlbmNvZGVyIGNvbW1pdCwgZW5hYmxlcyB0 aGUgYnJpZGdlCj4+IC0gKiBAZGVzdHJveTogbWFrZSBvYmplY3QgZ28gYXdheQo+PiAgICovCj4+ ICBzdHJ1Y3QgZHJtX2JyaWRnZV9mdW5jcyB7Cj4+ICsgICAgICAgaW50ICgqYXR0YWNoKShzdHJ1 Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKTsKPj4gICAgICAgICBib29sICgqbW9kZV9maXh1cCkoc3Ry dWN0IGRybV9icmlkZ2UgKmJyaWRnZSwKPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u c3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCj4+ICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKTsKPj4gQEAgLTY1 MiwyMiArNjUzLDI0IEBAIHN0cnVjdCBkcm1fYnJpZGdlX2Z1bmNzIHsKPj4gICAgICAgICAgICAg ICAgICAgICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKTsKPj4g ICAgICAgICB2b2lkICgqcHJlX2VuYWJsZSkoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSk7Cj4+ ICAgICAgICAgdm9pZCAoKmVuYWJsZSkoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSk7Cj4+IC0g ICAgICAgdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpOwo+PiAgfTsK Pj4KPj4gIC8qKgo+PiAgICogZHJtX2JyaWRnZSAtIGNlbnRyYWwgRFJNIGJyaWRnZSBjb250cm9s IHN0cnVjdHVyZQo+PiAgICogQGRldjogRFJNIGRldmljZSB0aGlzIGJyaWRnZSBiZWxvbmdzIHRv Cj4+IC0gKiBAaGVhZDogbGlzdCBtYW5hZ2VtZW50Cj4+ICsgKiBAb2Zfbm9kZTogZGV2aWNlIG5v ZGUgcG9pbnRlciB0byB0aGUgYnJpZGdlCj4+ICsgKiBAbGlzdDogdG8ga2VlcCB0cmFjayBvZiBh bGwgYWRkZWQgYnJpZGdlcwo+PiAgICogQGJhc2U6IGJhc2UgbW9kZSBvYmplY3QKPj4gICAqIEBm dW5jczogY29udHJvbCBmdW5jdGlvbnMKPj4gICAqIEBkcml2ZXJfcHJpdmF0ZTogcG9pbnRlciB0 byB0aGUgYnJpZGdlIGRyaXZlcidzIGludGVybmFsIGNvbnRleHQKPj4gICAqLwo+PiAgc3RydWN0 IGRybV9icmlkZ2Ugewo+PiAgICAgICAgIHN0cnVjdCBkcm1fZGV2aWNlICpkZXY7Cj4+IC0gICAg ICAgc3RydWN0IGxpc3RfaGVhZCBoZWFkOwo+PiAtCj4+IC0gICAgICAgc3RydWN0IGRybV9tb2Rl X29iamVjdCBiYXNlOwo+PiArICAgICAgIHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKPj4g KyNpZmRlZiBDT05GSUdfT0YKPj4gKyAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7 Cj4+ICsjZW5kaWYKPj4gKyAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cj4+Cj4+ICAgICAg ICAgY29uc3Qgc3RydWN0IGRybV9icmlkZ2VfZnVuY3MgKmZ1bmNzOwo+PiAgICAgICAgIHZvaWQg KmRyaXZlcl9wcml2YXRlOwo+PiBAQCAtNzMzLDcgKzczNiw2IEBAIHN0cnVjdCBkcm1fbW9kZV9n cm91cCB7Cj4+ICAgICAgICAgdWludDMyX3QgbnVtX2NydGNzOwo+PiAgICAgICAgIHVpbnQzMl90 IG51bV9lbmNvZGVyczsKPj4gICAgICAgICB1aW50MzJfdCBudW1fY29ubmVjdG9yczsKPj4gLSAg ICAgICB1aW50MzJfdCBudW1fYnJpZGdlczsKPj4KPj4gICAgICAgICAvKiBsaXN0IG9mIG9iamVj dCBJRHMgZm9yIHRoaXMgZ3JvdXAgKi8KPj4gICAgICAgICB1aW50MzJfdCAqaWRfbGlzdDsKPj4g QEAgLTc0OCw4ICs3NTAsNiBAQCBzdHJ1Y3QgZHJtX21vZGVfZ3JvdXAgewo+PiAgICogQGZiX2xp c3Q6IGxpc3Qgb2YgZnJhbWVidWZmZXJzIGF2YWlsYWJsZQo+PiAgICogQG51bV9jb25uZWN0b3I6 IG51bWJlciBvZiBjb25uZWN0b3JzIG9uIHRoaXMgZGV2aWNlCj4+ICAgKiBAY29ubmVjdG9yX2xp c3Q6IGxpc3Qgb2YgY29ubmVjdG9yIG9iamVjdHMKPj4gLSAqIEBudW1fYnJpZGdlOiBudW1iZXIg b2YgYnJpZGdlcyBvbiB0aGlzIGRldmljZQo+PiAtICogQGJyaWRnZV9saXN0OiBsaXN0IG9mIGJy aWRnZSBvYmplY3RzCj4+ICAgKiBAbnVtX2VuY29kZXI6IG51bWJlciBvZiBlbmNvZGVycyBvbiB0 aGlzIGRldmljZQo+PiAgICogQGVuY29kZXJfbGlzdDogbGlzdCBvZiBlbmNvZGVyIG9iamVjdHMK Pj4gICAqIEBudW1fY3J0YzogbnVtYmVyIG9mIENSVENzIG9uIHRoaXMgZGV2aWNlCj4+IEBAIC03 ODksOCArNzg5LDYgQEAgc3RydWN0IGRybV9tb2RlX2NvbmZpZyB7Cj4+Cj4+ICAgICAgICAgaW50 IG51bV9jb25uZWN0b3I7Cj4+ICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBjb25uZWN0b3JfbGlz dDsKPj4gLSAgICAgICBpbnQgbnVtX2JyaWRnZTsKPj4gLSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFk IGJyaWRnZV9saXN0Owo+PiAgICAgICAgIGludCBudW1fZW5jb2RlcjsKPj4gICAgICAgICBzdHJ1 Y3QgbGlzdF9oZWFkIGVuY29kZXJfbGlzdDsKPj4KPj4gQEAgLTkxMiw4ICs5MTAsMTAgQEAgZXh0 ZXJuIHVuc2lnbmVkIGludCBkcm1fY29ubmVjdG9yX2luZGV4KHN0cnVjdCBkcm1fY29ubmVjdG9y ICpjb25uZWN0b3IpOwo+PiAgLyogaGVscGVyIHRvIHVucGx1ZyBhbGwgY29ubmVjdG9ycyBmcm9t IHN5c2ZzIGZvciBkZXZpY2UgKi8KPj4gIGV4dGVybiB2b2lkIGRybV9jb25uZWN0b3JfdW5wbHVn X2FsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKPj4KPj4gLWV4dGVybiBpbnQgZHJtX2JyaWRn ZV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2Up Owo+PiAtZXh0ZXJuIHZvaWQgZHJtX2JyaWRnZV9jbGVhbnVwKHN0cnVjdCBkcm1fYnJpZGdlICpi cmlkZ2UpOwo+PiArZXh0ZXJuIGludCBkcm1fYnJpZGdlX2FkZChzdHJ1Y3QgZHJtX2JyaWRnZSAq YnJpZGdlKTsKPj4gK2V4dGVybiB2b2lkIGRybV9icmlkZ2VfcmVtb3ZlKHN0cnVjdCBkcm1fYnJp ZGdlICpicmlkZ2UpOwo+PiArZXh0ZXJuIHN0cnVjdCBkcm1fYnJpZGdlICpvZl9kcm1fZmluZF9i cmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpucCk7Cj4+ICtleHRlcm4gaW50IGRybV9icmlkZ2Vf YXR0YWNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2Up Owo+Pgo+PiAgZXh0ZXJuIGludCBkcm1fZW5jb2Rlcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpk ZXYsCj4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2VuY29kZXIgKmVu Y29kZXIsCj4+IC0tCj4+IDEuNy45LjUKPj4KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMu ZnJlZWRlc2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0 aW5mby9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: ajaynumb@gmail.com (Ajay kumar) Date: Mon, 8 Dec 2014 15:54:45 +0530 Subject: [PATCH V8 03/14] drm/bridge: make bridge registration independent of drm flow In-Reply-To: References: <1416045309-13359-1-git-send-email-ajaykumar.rs@samsung.com> <1416045309-13359-4-git-send-email-ajaykumar.rs@samsung.com> Message-ID: To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Tue, Dec 2, 2014 at 11:31 AM, Ajay kumar wrote: > On Sat, Nov 15, 2014 at 3:24 PM, Ajay Kumar wrote: >> Currently, third party bridge drivers(ptn3460) are dependent >> on the corresponding encoder driver init, since bridge driver >> needs a drm_device pointer to finish drm initializations. >> The encoder driver passes the drm_device pointer to the >> bridge driver. Because of this dependency, third party drivers >> like ptn3460 doesn't adhere to the driver model. >> >> In this patch, we reframe the bridge registration framework >> so that bridge initialization is split into 2 steps, and >> bridge registration happens independent of drm flow: >> --Step 1: gather all the bridge settings independent of drm and >> add the bridge onto a global list of bridges. >> --Step 2: when the encoder driver is probed, call drm_bridge_attach >> for the corresponding bridge so that the bridge receives >> drm_device pointer and continues with connector and other >> drm initializations. >> >> The old set of bridge helpers are removed, and a set of new helpers >> are added to accomplish the 2 step initialization. >> >> The bridge devices register themselves onto global list of bridges >> when they get probed by calling "drm_bridge_add". >> >> The parent encoder driver waits till the bridge is available >> in the lookup table(by calling "of_drm_find_bridge") and then >> continues with its initialization. >> >> The encoder driver should also call "drm_bridge_attach" to pass >> on the drm_device to the bridge object. >> >> drm_bridge_attach inturn calls "bridge->funcs->attach" so that >> bridge can continue with drm related initializations. >> >> Signed-off-by: Ajay Kumar >> --- >> drivers/gpu/drm/Makefile | 2 +- >> drivers/gpu/drm/bridge/ptn3460.c | 27 +++++----- >> drivers/gpu/drm/drm_bridge.c | 91 ++++++++++++++++++++++++++++++++ >> drivers/gpu/drm/drm_crtc.c | 65 ----------------------- >> drivers/gpu/drm/msm/hdmi/hdmi.c | 7 +-- >> drivers/gpu/drm/msm/hdmi/hdmi.h | 1 + >> drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 7 ++- >> drivers/gpu/drm/sti/sti_hda.c | 10 +--- >> drivers/gpu/drm/sti/sti_hdmi.c | 10 +--- >> include/drm/bridge/ptn3460.h | 8 +++ >> include/drm/drm_crtc.h | 26 ++++----- >> 11 files changed, 136 insertions(+), 118 deletions(-) >> create mode 100644 drivers/gpu/drm/drm_bridge.c >> >> diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile >> index 9292a76..00f97a5 100644 >> --- a/drivers/gpu/drm/Makefile >> +++ b/drivers/gpu/drm/Makefile >> @@ -14,7 +14,7 @@ drm-y := drm_auth.o drm_bufs.o drm_cache.o \ >> drm_info.o drm_debugfs.o drm_encoder_slave.o \ >> drm_trace_points.o drm_global.o drm_prime.o \ >> drm_rect.o drm_vma_manager.o drm_flip_work.o \ >> - drm_modeset_lock.o >> + drm_modeset_lock.o drm_bridge.o >> >> drm-$(CONFIG_COMPAT) += drm_ioc32.o >> drm-$(CONFIG_DRM_GEM_CMA_HELPER) += drm_gem_cma_helper.o >> diff --git a/drivers/gpu/drm/bridge/ptn3460.c b/drivers/gpu/drm/bridge/ptn3460.c >> index a2ddc8d..4a818c1 100644 >> --- a/drivers/gpu/drm/bridge/ptn3460.c >> +++ b/drivers/gpu/drm/bridge/ptn3460.c >> @@ -176,24 +176,11 @@ static void ptn3460_post_disable(struct drm_bridge *bridge) >> { >> } >> >> -static void ptn3460_bridge_destroy(struct drm_bridge *bridge) >> -{ >> - struct ptn3460_bridge *ptn_bridge = bridge_to_ptn3460(bridge); >> - >> - drm_bridge_cleanup(bridge); >> - if (gpio_is_valid(ptn_bridge->gpio_pd_n)) >> - gpio_free(ptn_bridge->gpio_pd_n); >> - if (gpio_is_valid(ptn_bridge->gpio_rst_n)) >> - gpio_free(ptn_bridge->gpio_rst_n); >> - /* Nothing else to free, we've got devm allocated memory */ >> -} >> - >> static struct drm_bridge_funcs ptn3460_bridge_funcs = { >> .pre_enable = ptn3460_pre_enable, >> .enable = ptn3460_enable, >> .disable = ptn3460_disable, >> .post_disable = ptn3460_post_disable, >> - .destroy = ptn3460_bridge_destroy, >> }; >> >> static int ptn3460_get_modes(struct drm_connector *connector) >> @@ -314,7 +301,7 @@ int ptn3460_init(struct drm_device *dev, struct drm_encoder *encoder, >> } >> >> ptn_bridge->bridge.funcs = &ptn3460_bridge_funcs; >> - ret = drm_bridge_init(dev, &ptn_bridge->bridge); >> + ret = drm_bridge_attach(dev, &ptn_bridge->bridge); >> if (ret) { >> DRM_ERROR("Failed to initialize bridge with drm\n"); >> goto err; >> @@ -343,3 +330,15 @@ err: >> return ret; >> } >> EXPORT_SYMBOL(ptn3460_init); >> + >> +void ptn3460_destroy(struct drm_bridge *bridge) >> +{ >> + struct ptn3460_bridge *ptn_bridge = bridge->driver_private; >> + >> + if (gpio_is_valid(ptn_bridge->gpio_pd_n)) >> + gpio_free(ptn_bridge->gpio_pd_n); >> + if (gpio_is_valid(ptn_bridge->gpio_rst_n)) >> + gpio_free(ptn_bridge->gpio_rst_n); >> + /* Nothing else to free, we've got devm allocated memory */ >> +} >> +EXPORT_SYMBOL(ptn3460_destroy); >> diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c >> new file mode 100644 >> index 0000000..d1187e5 >> --- /dev/null >> +++ b/drivers/gpu/drm/drm_bridge.c >> @@ -0,0 +1,91 @@ >> +/* >> + * Copyright (c) 2014 Samsung Electronics Co., Ltd >> + * >> + * Permission is hereby granted, free of charge, to any person obtaining a >> + * copy of this software and associated documentation files (the "Software"), >> + * to deal in the Software without restriction, including without limitation >> + * the rights to use, copy, modify, merge, publish, distribute, sub license, >> + * and/or sell copies of the Software, and to permit persons to whom the >> + * Software is furnished to do so, subject to the following conditions: >> + * >> + * The above copyright notice and this permission notice (including the >> + * next paragraph) shall be included in all copies or substantial portions >> + * of the Software. >> + * >> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR >> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, >> + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL >> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER >> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING >> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER >> + * DEALINGS IN THE SOFTWARE. >> + */ >> + >> +#include >> +#include >> + >> +#include >> + >> +#include "drm/drmP.h" >> + >> +static DEFINE_MUTEX(bridge_lock); >> +static LIST_HEAD(bridge_list); >> + >> +int drm_bridge_add(struct drm_bridge *bridge) >> +{ >> + mutex_lock(&bridge_lock); >> + list_add_tail(&bridge->list, &bridge_list); >> + mutex_unlock(&bridge_lock); >> + >> + return 0; >> +} >> +EXPORT_SYMBOL(drm_bridge_add); >> + >> +void drm_bridge_remove(struct drm_bridge *bridge) >> +{ >> + mutex_lock(&bridge_lock); >> + list_del_init(&bridge->list); >> + mutex_unlock(&bridge_lock); >> +} >> +EXPORT_SYMBOL(drm_bridge_remove); >> + >> +extern int drm_bridge_attach(struct drm_device *dev, struct drm_bridge *bridge) >> +{ >> + if (!dev || !bridge) >> + return -EINVAL; >> + >> + if (bridge->dev) >> + return -EBUSY; >> + >> + bridge->dev = dev; >> + >> + if (bridge->funcs->attach) >> + return bridge->funcs->attach(bridge); >> + >> + return 0; >> +} >> +EXPORT_SYMBOL(drm_bridge_attach); >> + >> +#ifdef CONFIG_OF >> +struct drm_bridge *of_drm_find_bridge(struct device_node *np) >> +{ >> + struct drm_bridge *bridge; >> + >> + mutex_lock(&bridge_lock); >> + >> + list_for_each_entry(bridge, &bridge_list, list) { >> + if (bridge->of_node == np) { >> + mutex_unlock(&bridge_lock); >> + return bridge; >> + } >> + } >> + >> + mutex_unlock(&bridge_lock); >> + return NULL; >> +} >> +EXPORT_SYMBOL(of_drm_find_bridge); >> +#endif >> + >> +MODULE_AUTHOR("Ajay Kumar "); >> +MODULE_DESCRIPTION("DRM bridge infrastructure"); >> +MODULE_LICENSE("GPL and additional rights"); >> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c >> index 408c053..39d6100 100644 >> --- a/drivers/gpu/drm/drm_crtc.c >> +++ b/drivers/gpu/drm/drm_crtc.c >> @@ -1008,56 +1008,6 @@ void drm_connector_unplug_all(struct drm_device *dev) >> EXPORT_SYMBOL(drm_connector_unplug_all); >> >> /** >> - * drm_bridge_init - initialize a drm transcoder/bridge >> - * @dev: drm device >> - * @bridge: transcoder/bridge to set up >> - * >> - * Initialises a preallocated bridge. Bridges should be >> - * subclassed as part of driver connector objects. >> - * >> - * Returns: >> - * Zero on success, error code on failure. >> - */ >> -int drm_bridge_init(struct drm_device *dev, struct drm_bridge *bridge) >> -{ >> - int ret; >> - >> - drm_modeset_lock_all(dev); >> - >> - ret = drm_mode_object_get(dev, &bridge->base, DRM_MODE_OBJECT_BRIDGE); >> - if (ret) >> - goto out; >> - >> - bridge->dev = dev; >> - >> - list_add_tail(&bridge->head, &dev->mode_config.bridge_list); >> - dev->mode_config.num_bridge++; >> - >> - out: >> - drm_modeset_unlock_all(dev); >> - return ret; >> -} >> -EXPORT_SYMBOL(drm_bridge_init); >> - >> -/** >> - * drm_bridge_cleanup - cleans up an initialised bridge >> - * @bridge: bridge to cleanup >> - * >> - * Cleans up the bridge but doesn't free the object. >> - */ >> -void drm_bridge_cleanup(struct drm_bridge *bridge) >> -{ >> - struct drm_device *dev = bridge->dev; >> - >> - drm_modeset_lock_all(dev); >> - drm_mode_object_put(dev, &bridge->base); >> - list_del(&bridge->head); >> - dev->mode_config.num_bridge--; >> - drm_modeset_unlock_all(dev); >> -} >> -EXPORT_SYMBOL(drm_bridge_cleanup); >> - >> -/** >> * drm_encoder_init - Init a preallocated encoder >> * @dev: drm device >> * @encoder: the encoder to init >> @@ -1539,7 +1489,6 @@ static int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *gr >> total_objects += dev->mode_config.num_crtc; >> total_objects += dev->mode_config.num_connector; >> total_objects += dev->mode_config.num_encoder; >> - total_objects += dev->mode_config.num_bridge; >> >> group->id_list = kzalloc(total_objects * sizeof(uint32_t), GFP_KERNEL); >> if (!group->id_list) >> @@ -1548,7 +1497,6 @@ static int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *gr >> group->num_crtcs = 0; >> group->num_connectors = 0; >> group->num_encoders = 0; >> - group->num_bridges = 0; >> return 0; >> } >> >> @@ -1568,7 +1516,6 @@ int drm_mode_group_init_legacy_group(struct drm_device *dev, >> struct drm_crtc *crtc; >> struct drm_encoder *encoder; >> struct drm_connector *connector; >> - struct drm_bridge *bridge; >> int ret; >> >> if ((ret = drm_mode_group_init(dev, group))) >> @@ -1585,11 +1532,6 @@ int drm_mode_group_init_legacy_group(struct drm_device *dev, >> group->id_list[group->num_crtcs + group->num_encoders + >> group->num_connectors++] = connector->base.id; >> >> - list_for_each_entry(bridge, &dev->mode_config.bridge_list, head) >> - group->id_list[group->num_crtcs + group->num_encoders + >> - group->num_connectors + group->num_bridges++] = >> - bridge->base.id; >> - >> return 0; >> } >> EXPORT_SYMBOL(drm_mode_group_init_legacy_group); >> @@ -5088,7 +5030,6 @@ void drm_mode_config_init(struct drm_device *dev) >> INIT_LIST_HEAD(&dev->mode_config.fb_list); >> INIT_LIST_HEAD(&dev->mode_config.crtc_list); >> INIT_LIST_HEAD(&dev->mode_config.connector_list); >> - INIT_LIST_HEAD(&dev->mode_config.bridge_list); >> INIT_LIST_HEAD(&dev->mode_config.encoder_list); >> INIT_LIST_HEAD(&dev->mode_config.property_list); >> INIT_LIST_HEAD(&dev->mode_config.property_blob_list); >> @@ -5128,7 +5069,6 @@ void drm_mode_config_cleanup(struct drm_device *dev) >> struct drm_connector *connector, *ot; >> struct drm_crtc *crtc, *ct; >> struct drm_encoder *encoder, *enct; >> - struct drm_bridge *bridge, *brt; >> struct drm_framebuffer *fb, *fbt; >> struct drm_property *property, *pt; >> struct drm_property_blob *blob, *bt; >> @@ -5139,11 +5079,6 @@ void drm_mode_config_cleanup(struct drm_device *dev) >> encoder->funcs->destroy(encoder); >> } >> >> - list_for_each_entry_safe(bridge, brt, >> - &dev->mode_config.bridge_list, head) { >> - bridge->funcs->destroy(bridge); >> - } >> - >> list_for_each_entry_safe(connector, ot, >> &dev->mode_config.connector_list, head) { >> connector->funcs->destroy(connector); >> diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.c b/drivers/gpu/drm/msm/hdmi/hdmi.c >> index 9d00dcb..e4f249b 100644 >> --- a/drivers/gpu/drm/msm/hdmi/hdmi.c >> +++ b/drivers/gpu/drm/msm/hdmi/hdmi.c >> @@ -65,6 +65,9 @@ void hdmi_destroy(struct kref *kref) >> if (hdmi->i2c) >> hdmi_i2c_destroy(hdmi->i2c); >> >> + if (hdmi->bridge) >> + hdmi_bridge_destroy(hdmi->bridge); >> + >> platform_set_drvdata(hdmi->pdev, NULL); >> } >> >> @@ -234,9 +237,7 @@ struct hdmi *hdmi_init(struct drm_device *dev, struct drm_encoder *encoder) >> >> fail: >> if (hdmi) { >> - /* bridge/connector are normally destroyed by drm: */ >> - if (hdmi->bridge) >> - hdmi->bridge->funcs->destroy(hdmi->bridge); >> + /* bridge is normally destroyed by drm: */ >> if (hdmi->connector) >> hdmi->connector->funcs->destroy(hdmi->connector); >> hdmi_destroy(&hdmi->refcount); >> diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.h b/drivers/gpu/drm/msm/hdmi/hdmi.h >> index b981995..d2cf7f4 100644 >> --- a/drivers/gpu/drm/msm/hdmi/hdmi.h >> +++ b/drivers/gpu/drm/msm/hdmi/hdmi.h >> @@ -163,6 +163,7 @@ void hdmi_audio_set_sample_rate(struct hdmi *hdmi, int rate); >> */ >> >> struct drm_bridge *hdmi_bridge_init(struct hdmi *hdmi); >> +void hdmi_bridge_destroy(struct drm_bridge *bridge); >> >> /* >> * hdmi connector: >> diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c >> index 0309539..26657a0 100644 >> --- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c >> +++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c >> @@ -23,11 +23,11 @@ struct hdmi_bridge { >> }; >> #define to_hdmi_bridge(x) container_of(x, struct hdmi_bridge, base) >> >> -static void hdmi_bridge_destroy(struct drm_bridge *bridge) >> +void hdmi_bridge_destroy(struct drm_bridge *bridge) >> { >> struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge); >> + >> hdmi_unreference(hdmi_bridge->hdmi); >> - drm_bridge_cleanup(bridge); >> kfree(hdmi_bridge); >> } >> >> @@ -201,7 +201,6 @@ static const struct drm_bridge_funcs hdmi_bridge_funcs = { >> .disable = hdmi_bridge_disable, >> .post_disable = hdmi_bridge_post_disable, >> .mode_set = hdmi_bridge_mode_set, >> - .destroy = hdmi_bridge_destroy, >> }; >> >> >> @@ -223,7 +222,7 @@ struct drm_bridge *hdmi_bridge_init(struct hdmi *hdmi) >> bridge = &hdmi_bridge->base; >> bridge->funcs = &hdmi_bridge_funcs; >> >> - drm_bridge_init(hdmi->dev, bridge); >> + drm_bridge_attach(hdmi->dev, bridge); >> >> return bridge; >> >> diff --git a/drivers/gpu/drm/sti/sti_hda.c b/drivers/gpu/drm/sti/sti_hda.c >> index 6cf145d..a9bbb08 100644 >> --- a/drivers/gpu/drm/sti/sti_hda.c >> +++ b/drivers/gpu/drm/sti/sti_hda.c >> @@ -508,19 +508,12 @@ static void sti_hda_bridge_nope(struct drm_bridge *bridge) >> /* do nothing */ >> } >> >> -static void sti_hda_brigde_destroy(struct drm_bridge *bridge) >> -{ >> - drm_bridge_cleanup(bridge); >> - kfree(bridge); >> -} >> - >> static const struct drm_bridge_funcs sti_hda_bridge_funcs = { >> .pre_enable = sti_hda_pre_enable, >> .enable = sti_hda_bridge_nope, >> .disable = sti_hda_disable, >> .post_disable = sti_hda_bridge_nope, >> .mode_set = sti_hda_set_mode, >> - .destroy = sti_hda_brigde_destroy, >> }; >> >> static int sti_hda_connector_get_modes(struct drm_connector *connector) >> @@ -665,7 +658,7 @@ static int sti_hda_bind(struct device *dev, struct device *master, void *data) >> >> bridge->driver_private = hda; >> bridge->funcs = &sti_hda_bridge_funcs; >> - drm_bridge_init(drm_dev, bridge); >> + drm_bridge_attach(drm_dev, bridge); >> >> encoder->bridge = bridge; >> connector->encoder = encoder; >> @@ -694,7 +687,6 @@ static int sti_hda_bind(struct device *dev, struct device *master, void *data) >> err_sysfs: >> drm_connector_unregister(drm_connector); >> err_connector: >> - drm_bridge_cleanup(bridge); >> drm_connector_cleanup(drm_connector); >> return -EINVAL; >> } >> diff --git a/drivers/gpu/drm/sti/sti_hdmi.c b/drivers/gpu/drm/sti/sti_hdmi.c >> index 285f723..bf4cdb8 100644 >> --- a/drivers/gpu/drm/sti/sti_hdmi.c >> +++ b/drivers/gpu/drm/sti/sti_hdmi.c >> @@ -463,19 +463,12 @@ static void sti_hdmi_bridge_nope(struct drm_bridge *bridge) >> /* do nothing */ >> } >> >> -static void sti_hdmi_brigde_destroy(struct drm_bridge *bridge) >> -{ >> - drm_bridge_cleanup(bridge); >> - kfree(bridge); >> -} >> - >> static const struct drm_bridge_funcs sti_hdmi_bridge_funcs = { >> .pre_enable = sti_hdmi_pre_enable, >> .enable = sti_hdmi_bridge_nope, >> .disable = sti_hdmi_disable, >> .post_disable = sti_hdmi_bridge_nope, >> .mode_set = sti_hdmi_set_mode, >> - .destroy = sti_hdmi_brigde_destroy, >> }; >> >> static int sti_hdmi_connector_get_modes(struct drm_connector *connector) >> @@ -629,7 +622,7 @@ static int sti_hdmi_bind(struct device *dev, struct device *master, void *data) >> >> bridge->driver_private = hdmi; >> bridge->funcs = &sti_hdmi_bridge_funcs; >> - drm_bridge_init(drm_dev, bridge); >> + drm_bridge_attach(drm_dev, bridge); >> >> encoder->bridge = bridge; >> connector->encoder = encoder; >> @@ -661,7 +654,6 @@ static int sti_hdmi_bind(struct device *dev, struct device *master, void *data) >> err_sysfs: >> drm_connector_unregister(drm_connector); >> err_connector: >> - drm_bridge_cleanup(bridge); >> drm_connector_cleanup(drm_connector); >> return -EINVAL; >> } >> diff --git a/include/drm/bridge/ptn3460.h b/include/drm/bridge/ptn3460.h >> index ff62344..b11f8e1 100644 >> --- a/include/drm/bridge/ptn3460.h >> +++ b/include/drm/bridge/ptn3460.h >> @@ -15,6 +15,7 @@ >> #define _DRM_BRIDGE_PTN3460_H_ >> >> struct drm_device; >> +struct drm_bridge; >> struct drm_encoder; >> struct i2c_client; >> struct device_node; >> @@ -23,6 +24,9 @@ struct device_node; >> >> int ptn3460_init(struct drm_device *dev, struct drm_encoder *encoder, >> struct i2c_client *client, struct device_node *node); >> + >> +void ptn3460_destroy(struct drm_bridge *bridge); >> + >> #else >> >> static inline int ptn3460_init(struct drm_device *dev, >> @@ -32,6 +36,10 @@ static inline int ptn3460_init(struct drm_device *dev, >> return 0; >> } >> >> +static inline void ptn3460_destroy(struct drm_bridge *bridge) >> +{ >> +} >> + >> #endif >> >> #endif >> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h >> index 5a3bce17..da2beaf 100644 >> --- a/include/drm/drm_crtc.h >> +++ b/include/drm/drm_crtc.h >> @@ -633,15 +633,16 @@ struct drm_plane { >> >> /** >> * drm_bridge_funcs - drm_bridge control functions >> + * @attach: Called during drm_bridge_attach >> * @mode_fixup: Try to fixup (or reject entirely) proposed mode for this bridge >> * @disable: Called right before encoder prepare, disables the bridge >> * @post_disable: Called right after encoder prepare, for lockstepped disable >> * @mode_set: Set this mode to the bridge >> * @pre_enable: Called right before encoder commit, for lockstepped commit >> * @enable: Called right after encoder commit, enables the bridge >> - * @destroy: make object go away >> */ >> struct drm_bridge_funcs { >> + int (*attach)(struct drm_bridge *bridge); >> bool (*mode_fixup)(struct drm_bridge *bridge, >> const struct drm_display_mode *mode, >> struct drm_display_mode *adjusted_mode); >> @@ -652,22 +653,24 @@ struct drm_bridge_funcs { >> struct drm_display_mode *adjusted_mode); >> void (*pre_enable)(struct drm_bridge *bridge); >> void (*enable)(struct drm_bridge *bridge); >> - void (*destroy)(struct drm_bridge *bridge); >> }; >> >> /** >> * drm_bridge - central DRM bridge control structure >> * @dev: DRM device this bridge belongs to >> - * @head: list management >> + * @of_node: device node pointer to the bridge >> + * @list: to keep track of all added bridges >> * @base: base mode object >> * @funcs: control functions >> * @driver_private: pointer to the bridge driver's internal context >> */ >> struct drm_bridge { >> struct drm_device *dev; >> - struct list_head head; >> - >> - struct drm_mode_object base; >> + struct drm_encoder *encoder; >> +#ifdef CONFIG_OF >> + struct device_node *of_node; >> +#endif >> + struct list_head list; >> >> const struct drm_bridge_funcs *funcs; >> void *driver_private; >> @@ -733,7 +736,6 @@ struct drm_mode_group { >> uint32_t num_crtcs; >> uint32_t num_encoders; >> uint32_t num_connectors; >> - uint32_t num_bridges; >> >> /* list of object IDs for this group */ >> uint32_t *id_list; >> @@ -748,8 +750,6 @@ struct drm_mode_group { >> * @fb_list: list of framebuffers available >> * @num_connector: number of connectors on this device >> * @connector_list: list of connector objects >> - * @num_bridge: number of bridges on this device >> - * @bridge_list: list of bridge objects >> * @num_encoder: number of encoders on this device >> * @encoder_list: list of encoder objects >> * @num_crtc: number of CRTCs on this device >> @@ -789,8 +789,6 @@ struct drm_mode_config { >> >> int num_connector; >> struct list_head connector_list; >> - int num_bridge; >> - struct list_head bridge_list; >> int num_encoder; >> struct list_head encoder_list; >> >> @@ -912,8 +910,10 @@ extern unsigned int drm_connector_index(struct drm_connector *connector); >> /* helper to unplug all connectors from sysfs for device */ >> extern void drm_connector_unplug_all(struct drm_device *dev); >> >> -extern int drm_bridge_init(struct drm_device *dev, struct drm_bridge *bridge); >> -extern void drm_bridge_cleanup(struct drm_bridge *bridge); >> +extern int drm_bridge_add(struct drm_bridge *bridge); >> +extern void drm_bridge_remove(struct drm_bridge *bridge); >> +extern struct drm_bridge *of_drm_find_bridge(struct device_node *np); >> +extern int drm_bridge_attach(struct drm_device *dev, struct drm_bridge *bridge); >> >> extern int drm_encoder_init(struct drm_device *dev, >> struct drm_encoder *encoder, >> -- >> 1.7.9.5 >>