From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH 1/2] drm/bridge: Refactor out the panel wrapper from the lvds-encoder bridge. Date: Wed, 03 May 2017 12:32:11 +0300 Message-ID: <21970543.rOK40RzAVr@avalon> References: <20170427163601.7313-1-eric@anholt.net> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from galahad.ideasonboard.com (galahad.ideasonboard.com [IPv6:2001:4b98:dc2:45:216:3eff:febb:480d]) by gabe.freedesktop.org (Postfix) with ESMTPS id E9EB689B96 for ; Wed, 3 May 2017 09:30:57 +0000 (UTC) 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: Archit Taneja Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Yannick Fertre , Thierry Reding List-Id: dri-devel@lists.freedesktop.org SGkgQXJjaGl0LAoKT24gV2VkbmVzZGF5IDAzIE1heSAyMDE3IDE0OjUzOjAwIEFyY2hpdCBUYW5l amEgd3JvdGU6Cj4gT24gMDQvMjcvMjAxNyAxMDowNiBQTSwgRXJpYyBBbmhvbHQgd3JvdGU6Cj4g PiBNYW55IERSTSBkcml2ZXJzIGhhdmUgY29tbW9uIGNvZGUgdG8gbWFrZSBhIHN0dWIgY29ubmVj dG9yCj4gPiBpbXBsZW1lbnRhdGlvbiB0aGF0IHdyYXBzIGEgZHJtX3BhbmVsLiAgQnkgd3JhcHBp bmcgdGhlIHBhbmVsIGluIGEgRFJNCj4gPiBicmlkZ2UsIGFsbCBvZiB0aGUgY29ubmVjdG9yIGNv ZGUgKGluY2x1ZGluZyBjYWxscyBkdXJpbmcgZW5jb2Rlcgo+ID4gZW5hYmxlL2Rpc2FibGUpIGdv ZXMgYXdheS4KPiA+IAo+ID4gU2lnbmVkLW9mZi1ieTogRXJpYyBBbmhvbHQgPGVyaWNAYW5ob2x0 Lm5ldD4KPiA+IC0tLQo+ID4gCj4gPiAgRG9jdW1lbnRhdGlvbi9ncHUvZHJtLWttcy1oZWxwZXJz LnJzdCB8ICAgMyArCj4gPiAgZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9LY29uZmlnICAgICAgICB8 ICAxMSArLQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9icmlkZ2UvTWFrZWZpbGUgICAgICAgfCAgIDEg Kwo+ID4gIGRyaXZlcnMvZ3B1L2RybS9icmlkZ2UvbHZkcy1lbmNvZGVyLmMgfCAxNTggKysrKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9icmlkZ2UvcGFuZWwu YyAgICAgICAgfCAxODggKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKPiA+ICBpbmNsdWRl L2RybS9kcm1fYnJpZGdlLmggICAgICAgICAgICAgIHwgICA4ICsrCj4gPiAgNiBmaWxlcyBjaGFu Z2VkLCAyMjggaW5zZXJ0aW9ucygrKSwgMTQxIGRlbGV0aW9ucygtKQo+ID4gIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL3BhbmVsLmMKPiA+IAo+ID4gZGlmZiAtLWdp dCBhL0RvY3VtZW50YXRpb24vZ3B1L2RybS1rbXMtaGVscGVycy5yc3QKPiA+IGIvRG9jdW1lbnRh dGlvbi9ncHUvZHJtLWttcy1oZWxwZXJzLnJzdCBpbmRleCBjMDc1YWFkZDcwNzguLjYwZWIzYjQx NzAyYgo+ID4gMTAwNjQ0Cj4gPiAtLS0gYS9Eb2N1bWVudGF0aW9uL2dwdS9kcm0ta21zLWhlbHBl cnMucnN0Cj4gPiArKysgYi9Eb2N1bWVudGF0aW9uL2dwdS9kcm0ta21zLWhlbHBlcnMucnN0Cj4g PiBAQCAtMTQzLDYgKzE0Myw5IEBAIEJyaWRnZSBIZWxwZXIgUmVmZXJlbmNlCj4gPiAgLi4ga2Vy bmVsLWRvYzo6IGRyaXZlcnMvZ3B1L2RybS9kcm1fYnJpZGdlLmMKPiA+ICAgICA6ZXhwb3J0Ogo+ ID4gCj4gPiArLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvZ3B1L2RybS9icmlkZ2UvcGFuZWwuYwo+ ID4gKyAgIDpleHBvcnQ6Cj4gPiArCj4gPiAgLi4gX2RybV9wYW5lbF9oZWxwZXI6Cj4gPiAgUGFu ZWwgSGVscGVyIFJlZmVyZW5jZQo+ID4gCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJt L2JyaWRnZS9LY29uZmlnCj4gPiBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvS2NvbmZpZyBpbmRl eCBmNjk2OGQzYjRiNDEuLmM0ZGFjYTM4NzQzYyAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1 L2RybS9icmlkZ2UvS2NvbmZpZwo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9LY29u ZmlnCj4gPiBAQCAtNCw2ICs0LDE0IEBAIGNvbmZpZyBEUk1fQlJJREdFCj4gPiAgCWhlbHAKPiA+ ICAJICBCcmlkZ2UgcmVnaXN0cmF0aW9uIGFuZCBsb29rdXAgZnJhbWV3b3JrLgo+ID4gCj4gPiAr Y29uZmlnIERSTV9QQU5FTF9CUklER0UKPiA+ICsJZGVmX2Jvb2wgeQo+ID4gKwlkZXBlbmRzIG9u IERSTV9CUklER0UKPiA+ICsJc2VsZWN0IERSTV9LTVNfSEVMUEVSCj4gPiArCXNlbGVjdCBEUk1f UEFORUwKPiA+ICsJaGVscAo+ID4gKwkgIERSTSBicmlkZ2Ugd3JhcHBlciBvZiBEUk0gcGFuZWxz Cj4gPiArCj4gPiAgbWVudSAiRGlzcGxheSBJbnRlcmZhY2UgQnJpZGdlcyIKPiA+ICAJZGVwZW5k cyBvbiBEUk0gJiYgRFJNX0JSSURHRQo+ID4gCj4gPiBAQCAtMjcsOCArMzUsNyBAQCBjb25maWcg RFJNX0RVTUJfVkdBX0RBQwo+ID4gIGNvbmZpZyBEUk1fTFZEU19FTkNPREVSCj4gPiAgCXRyaXN0 YXRlICJUcmFuc3BhcmVudCBwYXJhbGxlbCB0byBMVkRTIGVuY29kZXIgc3VwcG9ydCIKPiA+ICAJ ZGVwZW5kcyBvbiBPRgo+ID4gLQlzZWxlY3QgRFJNX0tNU19IRUxQRVIKPiA+IC0Jc2VsZWN0IERS TV9QQU5FTAo+ID4gKwlzZWxlY3QgRFJNX1BBTkVMX0JSSURHRQo+ID4gIAloZWxwCj4gPiAgCSAg U3VwcG9ydCBmb3IgdHJhbnNwYXJlbnQgcGFyYWxsZWwgdG8gTFZEUyBlbmNvZGVycyB0aGF0IGRv bid0IHJlcXVpcmUKPiA+ICAJICBhbnkgY29uZmlndXJhdGlvbi4KPiA+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vYnJpZGdlL01ha2VmaWxlCj4gPiBiL2RyaXZlcnMvZ3B1L2RybS9icmlk Z2UvTWFrZWZpbGUgaW5kZXggM2ZlMjIyNmVlMmYyLi40MGE0Mzc1MGFkNTUgMTAwNjQ0Cj4gPiAt LS0gYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL01ha2VmaWxlCj4gPiArKysgYi9kcml2ZXJzL2dw dS9kcm0vYnJpZGdlL01ha2VmaWxlCj4gPiBAQCAtNSw2ICs1LDcgQEAgb2JqLSQoQ09ORklHX0RS TV9EVU1CX1ZHQV9EQUMpICs9IGR1bWItdmdhLWRhYy5vCj4gPiAgb2JqLSQoQ09ORklHX0RSTV9M VkRTX0VOQ09ERVIpICs9IGx2ZHMtZW5jb2Rlci5vCj4gPiAgb2JqLSQoQ09ORklHX0RSTV9NRUdB Q0hJUFNfU1REUFhYWFhfR0VfQjg1MFYzX0ZXKSArPQo+ID4gIG1lZ2FjaGlwcy1zdGRweHh4eC1n ZS1iODUwdjMtZncubyBvYmotJChDT05GSUdfRFJNX05YUF9QVE4zNDYwKSArPQo+ID4gIG54cC1w dG4zNDYwLm8KPiA+ICtvYmotJChDT05GSUdfRFJNX1BBTkVMX0JSSURHRSkgKz0gcGFuZWwubwo+ ID4gIG9iai0kKENPTkZJR19EUk1fUEFSQURFX1BTODYyMikgKz0gcGFyYWRlLXBzODYyMi5vCj4g PiAgb2JqLSQoQ09ORklHX0RSTV9TSUxfU0lJODYyMCkgKz0gc2lsLXNpaTg2MjAubwo+ID4gIG9i ai0kKENPTkZJR19EUk1fU0lJOTAyWCkgKz0gc2lpOTAyeC5vCj4gPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL2JyaWRnZS9sdmRzLWVuY29kZXIuYwo+ID4gYi9kcml2ZXJzL2dwdS9kcm0v YnJpZGdlL2x2ZHMtZW5jb2Rlci5jIGluZGV4IGYxZjY3YTI3OTQyNi4uMDRlMTUwNGM0ZDhmCj4g PiAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvbHZkcy1lbmNvZGVyLmMK PiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvbHZkcy1lbmNvZGVyLmMKPiA+IEBAIC04 LDE0NCArOCwxOCBAQAo+ID4gICAqLwo+ID4gIAo+ID4gICNpbmNsdWRlIDxkcm0vZHJtUC5oPgo+ ID4gLSNpbmNsdWRlIDxkcm0vZHJtX2F0b21pY19oZWxwZXIuaD4KPiA+IC0jaW5jbHVkZSA8ZHJt L2RybV9jb25uZWN0b3IuaD4KPiA+IC0jaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlci5oPgo+ ID4gLSNpbmNsdWRlIDxkcm0vZHJtX2VuY29kZXIuaD4KPiA+IC0jaW5jbHVkZSA8ZHJtL2RybV9t b2Rlc2V0X2hlbHBlcl92dGFibGVzLmg+Cj4gPiArI2luY2x1ZGUgPGRybS9kcm1fYnJpZGdlLmg+ Cj4gPiAgI2luY2x1ZGUgPGRybS9kcm1fcGFuZWwuaD4KPiA+ICAKPiA+ICAjaW5jbHVkZSA8bGlu dXgvb2ZfZ3JhcGguaD4KPiA+IAo+ID4gLXN0cnVjdCBsdmRzX2VuY29kZXIgewo+ID4gLQlzdHJ1 Y3QgZGV2aWNlICpkZXY7Cj4gPiAtCj4gPiAtCXN0cnVjdCBkcm1fYnJpZGdlIGJyaWRnZTsKPiA+ IC0Jc3RydWN0IGRybV9jb25uZWN0b3IgY29ubmVjdG9yOwo+ID4gLQlzdHJ1Y3QgZHJtX3BhbmVs ICpwYW5lbDsKPiA+IC19Owo+ID4gLQo+ID4gLXN0YXRpYyBpbmxpbmUgc3RydWN0IGx2ZHNfZW5j b2RlciAqCj4gPiAtZHJtX2JyaWRnZV90b19sdmRzX2VuY29kZXIoc3RydWN0IGRybV9icmlkZ2Ug KmJyaWRnZSkKPiA+IC17Cj4gPiAtCXJldHVybiBjb250YWluZXJfb2YoYnJpZGdlLCBzdHJ1Y3Qg bHZkc19lbmNvZGVyLCBicmlkZ2UpOwo+ID4gLX0KPiA+IC0KPiA+IC1zdGF0aWMgaW5saW5lIHN0 cnVjdCBsdmRzX2VuY29kZXIgKgo+ID4gLWRybV9jb25uZWN0b3JfdG9fbHZkc19lbmNvZGVyKHN0 cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCj4gPiAtewo+ID4gLQlyZXR1cm4gY29udGFp bmVyX29mKGNvbm5lY3Rvciwgc3RydWN0IGx2ZHNfZW5jb2RlciwgY29ubmVjdG9yKTsKPiA+IC19 Cj4gPiAtCj4gPiAtc3RhdGljIGludCBsdmRzX2Nvbm5lY3Rvcl9nZXRfbW9kZXMoc3RydWN0IGRy bV9jb25uZWN0b3IgKmNvbm5lY3RvcikKPiA+IC17Cj4gPiAtCXN0cnVjdCBsdmRzX2VuY29kZXIg Kmx2ZHMgPSBkcm1fY29ubmVjdG9yX3RvX2x2ZHNfZW5jb2Rlcihjb25uZWN0b3IpOwo+ID4gLQo+ ID4gLQlyZXR1cm4gZHJtX3BhbmVsX2dldF9tb2RlcyhsdmRzLT5wYW5lbCk7Cj4gPiAtfQo+ID4g LQo+ID4gLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MKPiA+ IGx2ZHNfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsgLQkuZ2V0X21vZGVzID0gbHZkc19jb25u ZWN0b3JfZ2V0X21vZGVzLAo+ID4gLX07Cj4gPiAtCj4gPiAtc3RhdGljIGNvbnN0IHN0cnVjdCBk cm1fY29ubmVjdG9yX2Z1bmNzIGx2ZHNfY29ubmVjdG9yX2Z1bmNzID0gewo+ID4gLQkuZHBtcyA9 IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9kcG1zLAo+ID4gLQkucmVzZXQgPSBkcm1fYXRv bWljX2hlbHBlcl9jb25uZWN0b3JfcmVzZXQsCj4gPiAtCS5maWxsX21vZGVzID0gZHJtX2hlbHBl cl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzLAo+ID4gLQkuZGVzdHJveSA9IGRybV9jb25u ZWN0b3JfY2xlYW51cCwKPiA+IC0JLmF0b21pY19kdXBsaWNhdGVfc3RhdGUgPSBkcm1fYXRvbWlj X2hlbHBlcl9jb25uZWN0b3JfZHVwbGljYXRlX3N0YXRlLAo+ID4gLQkuYXRvbWljX2Rlc3Ryb3lf c3RhdGUgPSBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfZGVzdHJveV9zdGF0ZSwKPiA+IC19 Owo+ID4gLQo+ID4gLXN0YXRpYyBpbnQgbHZkc19lbmNvZGVyX2F0dGFjaChzdHJ1Y3QgZHJtX2Jy aWRnZSAqYnJpZGdlKQo+ID4gLXsKPiA+IC0Jc3RydWN0IGx2ZHNfZW5jb2RlciAqbHZkcyA9IGRy bV9icmlkZ2VfdG9fbHZkc19lbmNvZGVyKGJyaWRnZSk7Cj4gPiAtCXN0cnVjdCBkcm1fY29ubmVj dG9yICpjb25uZWN0b3IgPSAmbHZkcy0+Y29ubmVjdG9yOwo+ID4gLQlpbnQgcmV0Owo+ID4gLQo+ ID4gLQlpZiAoIWJyaWRnZS0+ZW5jb2Rlcikgewo+ID4gLQkJRFJNX0VSUk9SKCJNaXNzaW5nIGVu Y29kZXJcbiIpOwo+ID4gLQkJcmV0dXJuIC1FTk9ERVY7Cj4gPiAtCX0KPiA+IC0KPiA+IC0JZHJt X2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKGNvbm5lY3RvciwgJmx2ZHNfY29ubmVjdG9yX2hlbHBlcl9m dW5jcyk7Cj4gPiAtCj4gPiAtCXJldCA9IGRybV9jb25uZWN0b3JfaW5pdChicmlkZ2UtPmRldiwg Y29ubmVjdG9yLCAKJmx2ZHNfY29ubmVjdG9yX2Z1bmNzLAo+ID4gLQkJCQkgRFJNX01PREVfQ09O TkVDVE9SX0xWRFMpOwo+ID4gLQlpZiAocmV0KSB7Cj4gPiAtCQlEUk1fRVJST1IoIkZhaWxlZCB0 byBpbml0aWFsaXplIGNvbm5lY3RvclxuIik7Cj4gPiAtCQlyZXR1cm4gcmV0Owo+ID4gLQl9Cj4g PiAtCj4gPiAtCWRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2RlcigmbHZkcy0+Y29ubmVj dG9yLCBicmlkZ2UtPmVuY29kZXIpOwo+ID4gLQo+ID4gLQlyZXQgPSBkcm1fcGFuZWxfYXR0YWNo KGx2ZHMtPnBhbmVsLCAmbHZkcy0+Y29ubmVjdG9yKTsKPiA+IC0JaWYgKHJldCA8IDApCj4gPiAt CQlyZXR1cm4gcmV0Owo+ID4gLQo+ID4gLQlyZXR1cm4gMDsKPiA+IC19Cj4gPiAtCj4gPiAtc3Rh dGljIHZvaWQgbHZkc19lbmNvZGVyX2RldGFjaChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ ID4gLXsKPiA+IC0Jc3RydWN0IGx2ZHNfZW5jb2RlciAqbHZkcyA9IGRybV9icmlkZ2VfdG9fbHZk c19lbmNvZGVyKGJyaWRnZSk7Cj4gPiAtCj4gPiAtCWRybV9wYW5lbF9kZXRhY2gobHZkcy0+cGFu ZWwpOwo+ID4gLX0KPiA+IC0KPiA+IC1zdGF0aWMgdm9pZCBsdmRzX2VuY29kZXJfcHJlX2VuYWJs ZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ID4gLXsKPiA+IC0Jc3RydWN0IGx2ZHNfZW5j b2RlciAqbHZkcyA9IGRybV9icmlkZ2VfdG9fbHZkc19lbmNvZGVyKGJyaWRnZSk7Cj4gPiAtCj4g PiAtCWRybV9wYW5lbF9wcmVwYXJlKGx2ZHMtPnBhbmVsKTsKPiA+IC19Cj4gPiAtCj4gPiAtc3Rh dGljIHZvaWQgbHZkc19lbmNvZGVyX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ ID4gLXsKPiA+IC0Jc3RydWN0IGx2ZHNfZW5jb2RlciAqbHZkcyA9IGRybV9icmlkZ2VfdG9fbHZk c19lbmNvZGVyKGJyaWRnZSk7Cj4gPiAtCj4gPiAtCWRybV9wYW5lbF9lbmFibGUobHZkcy0+cGFu ZWwpOwo+ID4gLX0KPiA+IC0KPiA+IC1zdGF0aWMgdm9pZCBsdmRzX2VuY29kZXJfZGlzYWJsZShz dHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ID4gLXsKPiA+IC0Jc3RydWN0IGx2ZHNfZW5jb2Rl ciAqbHZkcyA9IGRybV9icmlkZ2VfdG9fbHZkc19lbmNvZGVyKGJyaWRnZSk7Cj4gPiAtCj4gPiAt CWRybV9wYW5lbF9kaXNhYmxlKGx2ZHMtPnBhbmVsKTsKPiA+IC19Cj4gPiAtCj4gPiAtc3RhdGlj IHZvaWQgbHZkc19lbmNvZGVyX3Bvc3RfZGlzYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdl KQo+ID4gLXsKPiA+IC0Jc3RydWN0IGx2ZHNfZW5jb2RlciAqbHZkcyA9IGRybV9icmlkZ2VfdG9f bHZkc19lbmNvZGVyKGJyaWRnZSk7Cj4gPiAtCj4gPiAtCWRybV9wYW5lbF91bnByZXBhcmUobHZk cy0+cGFuZWwpOwo+ID4gLX0KPiA+IC0KPiA+IC1zdGF0aWMgY29uc3Qgc3RydWN0IGRybV9icmlk Z2VfZnVuY3MgbHZkc19lbmNvZGVyX2JyaWRnZV9mdW5jcyA9IHsKPiA+IC0JLmF0dGFjaCA9IGx2 ZHNfZW5jb2Rlcl9hdHRhY2gsCj4gPiAtCS5kZXRhY2ggPSBsdmRzX2VuY29kZXJfZGV0YWNoLAo+ ID4gLQkucHJlX2VuYWJsZSA9IGx2ZHNfZW5jb2Rlcl9wcmVfZW5hYmxlLAo+ID4gLQkuZW5hYmxl ID0gbHZkc19lbmNvZGVyX2VuYWJsZSwKPiA+IC0JLmRpc2FibGUgPSBsdmRzX2VuY29kZXJfZGlz YWJsZSwKPiA+IC0JLnBvc3RfZGlzYWJsZSA9IGx2ZHNfZW5jb2Rlcl9wb3N0X2Rpc2FibGUsCj4g PiAtfTsKPiA+IC0KPiA+IAo+ID4gIHN0YXRpYyBpbnQgbHZkc19lbmNvZGVyX3Byb2JlKHN0cnVj dCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiAgewo+ID4gCj4gPiAtCXN0cnVjdCBsdmRzX2Vu Y29kZXIgKmx2ZHM7Cj4gPiAKPiA+ICAJc3RydWN0IGRldmljZV9ub2RlICpwb3J0Owo+ID4gIAlz dHJ1Y3QgZGV2aWNlX25vZGUgKmVuZHBvaW50Owo+ID4gCj4gPiAtCXN0cnVjdCBkZXZpY2Vfbm9k ZSAqcGFuZWw7Cj4gPiAtCj4gPiAtCWx2ZHMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6 ZW9mKCpsdmRzKSwgR0ZQX0tFUk5FTCk7Cj4gPiAtCWlmICghbHZkcykKPiA+IC0JCXJldHVybiAt RU5PTUVNOwo+ID4gLQo+ID4gLQlsdmRzLT5kZXYgPSAmcGRldi0+ZGV2Owo+ID4gLQlwbGF0Zm9y bV9zZXRfZHJ2ZGF0YShwZGV2LCBsdmRzKTsKPiA+IC0KPiA+IC0JbHZkcy0+YnJpZGdlLmZ1bmNz ID0gJmx2ZHNfZW5jb2Rlcl9icmlkZ2VfZnVuY3M7Cj4gPiAtCWx2ZHMtPmJyaWRnZS5vZl9ub2Rl ID0gcGRldi0+ZGV2Lm9mX25vZGU7Cj4gPiArCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFuZWxfbm9k ZTsKPiA+ICsJc3RydWN0IGRybV9wYW5lbCAqcGFuZWw7Cj4gPiArCXN0cnVjdCBkcm1fYnJpZGdl ICpicmlkZ2U7Cj4gPiAKPiA+ICAJLyogTG9jYXRlIHRoZSBwYW5lbCBEVCBub2RlLiAqLwo+ID4g IAlwb3J0ID0gb2ZfZ3JhcGhfZ2V0X3BvcnRfYnlfaWQocGRldi0+ZGV2Lm9mX25vZGUsIDEpOwo+ ID4gCj4gPiBAQCAtMTYxLDI5ICszNSwzNSBAQCBzdGF0aWMgaW50IGx2ZHNfZW5jb2Rlcl9wcm9i ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCj4gPiAqcGRldik+IAo+ID4gIAkJcmV0dXJuIC1FTlhJ TzsKPiA+ICAJCj4gPiAgCX0KPiA+IAo+ID4gLQlwYW5lbCA9IG9mX2dyYXBoX2dldF9yZW1vdGVf cG9ydF9wYXJlbnQoZW5kcG9pbnQpOwo+ID4gKwlwYW5lbF9ub2RlID0gb2ZfZ3JhcGhfZ2V0X3Jl bW90ZV9wb3J0X3BhcmVudChlbmRwb2ludCk7Cj4gPiAKPiA+ICAJb2Zfbm9kZV9wdXQoZW5kcG9p bnQpOwo+ID4gCj4gPiAtCWlmICghcGFuZWwpIHsKPiA+ICsJaWYgKCFwYW5lbF9ub2RlKSB7Cj4g PiAKPiA+ICAJCWRldl9kYmcoJnBkZXYtPmRldiwgIm5vIHJlbW90ZSBlbmRwb2ludCBmb3IgcG9y dCAxXG4iKTsKPiA+ICAJCXJldHVybiAtRU5YSU87Cj4gPiAgCQo+ID4gIAl9Cj4gPiAKPiA+IC0J bHZkcy0+cGFuZWwgPSBvZl9kcm1fZmluZF9wYW5lbChwYW5lbCk7Cj4gPiAtCW9mX25vZGVfcHV0 KHBhbmVsKTsKPiA+IC0JaWYgKCFsdmRzLT5wYW5lbCkgewo+ID4gKwlwYW5lbCA9IG9mX2RybV9m aW5kX3BhbmVsKHBhbmVsX25vZGUpOwo+ID4gKwlvZl9ub2RlX3B1dChwYW5lbF9ub2RlKTsKPiA+ ICsJaWYgKCFwYW5lbCkgewo+ID4gCj4gPiAgCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJwYW5lbCBu b3QgZm91bmQsIGRlZmVycmluZyBwcm9iZVxuIik7Cj4gPiAgCQlyZXR1cm4gLUVQUk9CRV9ERUZF UjsKPiA+ICAJCj4gPiAgCX0KPiA+IAo+ID4gLQkvKiBSZWdpc3RlciB0aGUgYnJpZGdlLiAqLwo+ ID4gLQlyZXR1cm4gZHJtX2JyaWRnZV9hZGQoJmx2ZHMtPmJyaWRnZSk7Cj4gPiArCWJyaWRnZSA9 IGRybV9wYW5lbF9icmlkZ2VfYWRkKCZwZGV2LT5kZXYsIHBhbmVsLAo+ID4gKwkJCQkgICAgICBE Uk1fTU9ERV9DT05ORUNUT1JfTFZEUyk7Cj4gPiArCWlmIChJU19FUlIoYnJpZGdlKSkKPiA+ICsJ CXJldHVybiBQVFJfRVJSKGJyaWRnZSk7Cj4gPiArCj4gPiArCXBsYXRmb3JtX3NldF9kcnZkYXRh KHBkZXYsIGJyaWRnZSk7Cj4gPiArCj4gPiArCXJldHVybiAwOwo+ID4gCj4gPiAgfQo+ID4gIAo+ ID4gIHN0YXRpYyBpbnQgbHZkc19lbmNvZGVyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNl ICpwZGV2KQo+ID4gIHsKPiA+IAo+ID4gLQlzdHJ1Y3QgbHZkc19lbmNvZGVyICplbmNvZGVyID0g cGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Cj4gPiArCXN0cnVjdCBkcm1fYnJpZGdlICpicmlk Z2UgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKPiA+IAo+ID4gLQlkcm1fYnJpZGdlX3Jl bW92ZSgmZW5jb2Rlci0+YnJpZGdlKTsKPiA+ICsJZHJtX2JyaWRnZV9yZW1vdmUoYnJpZGdlKTsK PiA+IAo+ID4gIAlyZXR1cm4gMDsKPiA+ICAKPiA+ICB9Cj4gPiAKPiA+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vYnJpZGdlL3BhbmVsLmMKPiA+IGIvZHJpdmVycy9ncHUvZHJtL2JyaWRn ZS9wYW5lbC5jIG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLjIw ODEyNDU0NTVjNgo+ID4gLS0tIC9kZXYvbnVsbAo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2Jy aWRnZS9wYW5lbC5jCj4gPiBAQCAtMCwwICsxLDE4OCBAQAo+ID4gKy8qCj4gPiArICogQ29weXJp Z2h0IChDKSAyMDE2IExhdXJlbnQgUGluY2hhcnQKPiA+IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFz b25ib2FyZC5jb20+Cj4gPiArICogQ29weXJpZ2h0IChDKSAyMDE3IEJyb2FkY29tCj4gPiArICoK PiA+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1 dGUgaXQgYW5kL29yCj4gPiArICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKPiA+ICsgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgo+ID4gKyAqIHRoZSBMaWNl bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgo+ID4gKyAqLwo+ID4g Kwo+ID4gKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgo+ID4gKyNpbmNsdWRlIDxkcm0vZHJtX3BhbmVs Lmg+Cj4gPiArI2luY2x1ZGUgPGRybS9kcm1fYXRvbWljX2hlbHBlci5oPgo+ID4gKyNpbmNsdWRl IDxkcm0vZHJtX2Nvbm5lY3Rvci5oPgo+ID4gKyNpbmNsdWRlIDxkcm0vZHJtX2NydGNfaGVscGVy Lmg+Cj4gPiArI2luY2x1ZGUgPGRybS9kcm1fZW5jb2Rlci5oPgo+ID4gKyNpbmNsdWRlIDxkcm0v ZHJtX21vZGVzZXRfaGVscGVyX3Z0YWJsZXMuaD4KPiA+ICsjaW5jbHVkZSA8ZHJtL2RybV9wYW5l bC5oPgo+ID4gKwo+ID4gK3N0cnVjdCBwYW5lbF9icmlkZ2Ugewo+ID4gKwlzdHJ1Y3QgZHJtX2Jy aWRnZSBicmlkZ2U7Cj4gPiArCXN0cnVjdCBkZXZpY2UgKmRldjsKPiA+ICsJc3RydWN0IGRybV9j b25uZWN0b3IgY29ubmVjdG9yOwo+ID4gKwlzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbDsKPiA+ICsJ dTMyIGNvbm5lY3Rvcl90eXBlOwo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljIGlubGluZSBzdHJ1 Y3QgcGFuZWxfYnJpZGdlICoKPiA+ICtkcm1fYnJpZGdlX3RvX3BhbmVsX2JyaWRnZShzdHJ1Y3Qg ZHJtX2JyaWRnZSAqYnJpZGdlKQo+ID4gK3sKPiA+ICsJcmV0dXJuIGNvbnRhaW5lcl9vZihicmlk Z2UsIHN0cnVjdCBwYW5lbF9icmlkZ2UsIGJyaWRnZSk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRp YyBpbmxpbmUgc3RydWN0IHBhbmVsX2JyaWRnZSAqCj4gPiArZHJtX2Nvbm5lY3Rvcl90b19wYW5l bF9icmlkZ2Uoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKPiA+ICt7Cj4gPiArCXJl dHVybiBjb250YWluZXJfb2YoY29ubmVjdG9yLCBzdHJ1Y3QgcGFuZWxfYnJpZGdlLCBjb25uZWN0 b3IpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IHBhbmVsX2JyaWRnZV9jb25uZWN0b3Jf Z2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yCj4gPiAqY29ubmVjdG9yKSArewo+ID4gKwlz dHJ1Y3QgcGFuZWxfYnJpZGdlICpwYW5lbF9icmlkZ2UgPQo+ID4gKwkJZHJtX2Nvbm5lY3Rvcl90 b19wYW5lbF9icmlkZ2UoY29ubmVjdG9yKTsKPiA+ICsKPiA+ICsJcmV0dXJuIGRybV9wYW5lbF9n ZXRfbW9kZXMocGFuZWxfYnJpZGdlLT5wYW5lbCk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBj b25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MKPiA+IHBhbmVsX2JyaWRnZV9j b25uZWN0b3JfaGVscGVyX2Z1bmNzID0geyArCS5nZXRfbW9kZXMgPQo+ID4gcGFuZWxfYnJpZGdl X2Nvbm5lY3Rvcl9nZXRfbW9kZXMsCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgY29uc3Qgc3Ry dWN0IGRybV9jb25uZWN0b3JfZnVuY3MgcGFuZWxfYnJpZGdlX2Nvbm5lY3Rvcl9mdW5jcyA9IHsK PiA+ICsJLmRwbXMgPSBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfZHBtcywKPiA+ICsJLnJl c2V0ID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX3Jlc2V0LAo+ID4gKwkuZmlsbF9tb2Rl cyA9IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcywKPiA+ICsJLmRlc3Ry b3kgPSBkcm1fY29ubmVjdG9yX2NsZWFudXAsCj4gPiArCS5hdG9taWNfZHVwbGljYXRlX3N0YXRl ID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2R1cGxpY2F0ZV9zdGF0ZSwKPiA+ICsJLmF0 b21pY19kZXN0cm95X3N0YXRlID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2Rlc3Ryb3lf c3RhdGUsCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgaW50IHBhbmVsX2JyaWRnZV9hdHRhY2go c3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKPiA+ICt7Cj4gPiArCXN0cnVjdCBwYW5lbF9icmlk Z2UgKnBhbmVsX2JyaWRnZSA9IApkcm1fYnJpZGdlX3RvX3BhbmVsX2JyaWRnZShicmlkZ2UpOwo+ ID4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gJnBhbmVsX2JyaWRnZS0+Y29u bmVjdG9yOwo+ID4gKwlpbnQgcmV0Owo+ID4gKwo+ID4gKwlpZiAoIWJyaWRnZS0+ZW5jb2Rlcikg ewo+ID4gKwkJRFJNX0VSUk9SKCJNaXNzaW5nIGVuY29kZXJcbiIpOwo+ID4gKwkJcmV0dXJuIC1F Tk9ERVY7Cj4gPiArCX0KPiA+ICsKPiA+ICsJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKGNvbm5l Y3RvciwKPiA+ICsJCQkJICZwYW5lbF9icmlkZ2VfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7Cj4g PiArCj4gPiArCXJldCA9IGRybV9jb25uZWN0b3JfaW5pdChicmlkZ2UtPmRldiwgY29ubmVjdG9y LAo+ID4gKwkJCQkgJnBhbmVsX2JyaWRnZV9jb25uZWN0b3JfZnVuY3MsCj4gPiArCQkJCSBwYW5l bF9icmlkZ2UtPmNvbm5lY3Rvcl90eXBlKTsKPiA+ICsJaWYgKHJldCkgewo+ID4gKwkJRFJNX0VS Uk9SKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb25uZWN0b3JcbiIpOwo+ID4gKwkJcmV0dXJuIHJl dDsKPiA+ICsJfQo+ID4gKwo+ID4gKwlkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIo JnBhbmVsX2JyaWRnZS0+Y29ubmVjdG9yLAo+ID4gKwkJCQkJICBicmlkZ2UtPmVuY29kZXIpOwo+ ID4gKwo+ID4gKwlyZXQgPSBkcm1fcGFuZWxfYXR0YWNoKHBhbmVsX2JyaWRnZS0+cGFuZWwsICZw YW5lbF9icmlkZ2UtPmNvbm5lY3Rvcik7Cj4gPiArCWlmIChyZXQgPCAwKQo+ID4gKwkJcmV0dXJu IHJldDsKPiA+ICsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lk IHBhbmVsX2JyaWRnZV9kZXRhY2goc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKPiA+ICt7Cj4g PiArCXN0cnVjdCBwYW5lbF9icmlkZ2UgKnBhbmVsX2JyaWRnZSA9IApkcm1fYnJpZGdlX3RvX3Bh bmVsX2JyaWRnZShicmlkZ2UpOwo+ID4gKwo+ID4gKwlkcm1fcGFuZWxfZGV0YWNoKHBhbmVsX2Jy aWRnZS0+cGFuZWwpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBwYW5lbF9icmlkZ2Vf cHJlX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ID4gK3sKPiA+ICsJc3RydWN0 IHBhbmVsX2JyaWRnZSAqcGFuZWxfYnJpZGdlID0gCmRybV9icmlkZ2VfdG9fcGFuZWxfYnJpZGdl KGJyaWRnZSk7Cj4gPiArCj4gPiArCWRybV9wYW5lbF9wcmVwYXJlKHBhbmVsX2JyaWRnZS0+cGFu ZWwpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBwYW5lbF9icmlkZ2VfZW5hYmxlKHN0 cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpCj4gPiArewo+ID4gKwlzdHJ1Y3QgcGFuZWxfYnJpZGdl ICpwYW5lbF9icmlkZ2UgPSAKZHJtX2JyaWRnZV90b19wYW5lbF9icmlkZ2UoYnJpZGdlKTsKPiA+ ICsKPiA+ICsJZHJtX3BhbmVsX2VuYWJsZShwYW5lbF9icmlkZ2UtPnBhbmVsKTsKPiA+ICt9Cj4g PiArCj4gPiArc3RhdGljIHZvaWQgcGFuZWxfYnJpZGdlX2Rpc2FibGUoc3RydWN0IGRybV9icmlk Z2UgKmJyaWRnZSkKPiA+ICt7Cj4gPiArCXN0cnVjdCBwYW5lbF9icmlkZ2UgKnBhbmVsX2JyaWRn ZSA9IApkcm1fYnJpZGdlX3RvX3BhbmVsX2JyaWRnZShicmlkZ2UpOwo+ID4gKwo+ID4gKwlkcm1f cGFuZWxfZGlzYWJsZShwYW5lbF9icmlkZ2UtPnBhbmVsKTsKPiA+ICt9Cj4gPiArCj4gPiArc3Rh dGljIHZvaWQgcGFuZWxfYnJpZGdlX3Bvc3RfZGlzYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJp ZGdlKQo+ID4gK3sKPiA+ICsJc3RydWN0IHBhbmVsX2JyaWRnZSAqcGFuZWxfYnJpZGdlID0gCmRy bV9icmlkZ2VfdG9fcGFuZWxfYnJpZGdlKGJyaWRnZSk7Cj4gPiArCj4gPiArCWRybV9wYW5lbF91 bnByZXBhcmUocGFuZWxfYnJpZGdlLT5wYW5lbCk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBj b25zdCBzdHJ1Y3QgZHJtX2JyaWRnZV9mdW5jcyBwYW5lbF9icmlkZ2VfYnJpZGdlX2Z1bmNzID0g ewo+ID4gKwkuYXR0YWNoID0gcGFuZWxfYnJpZGdlX2F0dGFjaCwKPiA+ICsJLmRldGFjaCA9IHBh bmVsX2JyaWRnZV9kZXRhY2gsCj4gPiArCS5wcmVfZW5hYmxlID0gcGFuZWxfYnJpZGdlX3ByZV9l bmFibGUsCj4gPiArCS5lbmFibGUgPSBwYW5lbF9icmlkZ2VfZW5hYmxlLAo+ID4gKwkuZGlzYWJs ZSA9IHBhbmVsX2JyaWRnZV9kaXNhYmxlLAo+ID4gKwkucG9zdF9kaXNhYmxlID0gcGFuZWxfYnJp ZGdlX3Bvc3RfZGlzYWJsZSwKPiA+ICt9Owo+ID4gKwo+ID4gKy8qKgo+ID4gKyAqIGRybV9wYW5l bF9icmlkZ2VfYWRkIC0gQ3JlYXRlcyBhIGRybV9icmlkZ2UgYW5kIGRybV9jb25uZWN0b3IgdGhh dAo+ID4gKyAqIGp1c3QgY2FsbCB0aGUgYXBwcm9wcmlhdGUgZnVuY3Rpb25zIGZyb20gZHJtX3Bh bmVsLgo+ID4gKyAqCj4gPiArICogQGRldjogVGhlIHN0cnVjdCBkZXZpY2Ugb2YgdGhlIHBhbmVs IGRldmljZS4gIFRoaXMgaXMgdXNlZCBmb3IKPiA+ICsgKiByZWdpc3RlcmluZyB0aGUgZHJtX2Jy aWRnZS4KPiA+ICsgKiBAcGFuZWw6IFRoZSBkcm1fcGFuZWwgYmVpbmcgd3JhcHBlZC4gIE11c3Qg YmUgbm9uLU5VTEwuCj4gPiArICogQGNvbm5lY3Rvcl90eXBlOiBUaGUgRFJNX01PREVfQ09OTkVD VE9SXyogZm9yIHRoZSBjb25uZWN0b3IgdG8gYmUKPiA+ICsgKiBjcmVhdGVkLgo+ID4gKyAqCj4g PiArICogRm9yIGRyaXZlcnMgY29udmVydGluZyBmcm9tIGRpcmVjdGx5IHVzaW5nIGRybV9wYW5l bDogVGhlIGV4cGVjdGVkCj4gPiArICogdXNhZ2UgcGF0dGVybiBpcyB0aGF0IGR1cmluZyBlaXRo ZXIgZW5jb2RlciBtb2R1bGUgcHJvYmUgb3IgRFNJCj4gPiArICogaG9zdCBhdHRhY2gsIGEgZHJt X3BhbmVsIHdpbGwgYmUgbG9va2VkIHVwIHRocm91Z2gKPiA+ICsgKiBkcm1fb2ZfZmluZF9wYW5l bF9vcl9icmlkZ2UoKS4gIGRybV9wYW5lbF9icmlkZ2VfYWRkKCkgaXMgdXNlZCB0bwo+ID4gKyAq IHdyYXAgdGhhdCBwYW5lbCBpbiB0aGUgbmV3IGJyaWRnZSwgYW5kIHRoZSByZXN1bHQgY2FuIHRo ZW4gYmUKPiA+ICsgKiBwYXNzZWQgdG8gZHJtX2JyaWRnZV9hdHRhY2goKS4gIFRoZSBkcm1fcGFu ZWxfcHJlcGFyZSgpIGFuZCByZWxhdGVkCj4gPiArICogZnVuY3Rpb25zIGNhbiBiZSBkcm9wcGVk IGZyb20gdGhlIGVuY29kZXIgZHJpdmVyICh0aGV5J3JlIG5vdwo+ID4gKyAqIGNhbGxlZCBieSB0 aGUgS01TIGhlbHBlcnMgYmVmb3JlIGNhbGxpbmcgaW50byB0aGUgZW5jb2RlciksIGFsb25nCj4g PiArICogd2l0aCBjb25uZWN0b3IgY3JlYXRpb24uCj4gCj4gK3BhbmVsL2JyaWRnZSByZXZpZXdl cnMuCgpUaGFuayB5b3UgZm9yIHRoYXQuCgo+IFRoaXMgZG9lcyBtYWtlIHRoaW5ncyBtdWNoIGNs ZWFuZXIsIGJ1dCBpdCBzZWVtcyBhIGJpdCBzdHJhbmdlIHRvIGNyZWF0ZQo+IGEgZHJtX2JyaWRn ZSB3aGVuIHRoZXJlIGlzbid0IHJlYWxseSBhIEhXIGJyaWRnZSBpbiB0aGUgZGlzcGxheSBjaGFp biAoaS5lLAo+IHdoZW4gdGhlIERTSSBlbmNvZGVyIGlzIGRpcmVjdGx5IGNvbm5lY3RlZCB0byBh IERTSSBwYW5lbCkuCgpJIGFncmVlIHdpdGggeW91LiBJIGRvbid0IHRoaW5rIHRoaXMgaXMgYSBn b29kIGlkZWEsIGFuZCB3aGF0IEknZCBsaWtlIHRvIHNlZSAKaXMgYSByZWZhY3RvcmluZyBvZiB0 aGUgcGFuZWwgYW5kIGJyaWRnZSBvcHMgdGhhdCB3b3VsZCBtYWtlIHRoZW0gbW9yZSBhbGlrZSwg CmFsbG93aW5nIHRvIGhhbmRsZSBicmlkZ2VzIGFuZCBwYW5lbHMgdGhyb3VnaCBhIGNvbW1vbiBp bnRlcmZhY2UuCgpBbm90aGVyIHJlYXNvbiB0byBnbyBpbiB0aGF0IGRpcmVjdGlvbiBpcyB0aGF0 LCBpZiB3ZSBjcmVhdGUgYW4gb2JqZWN0IHRoYXQgCmNhbiBleHBvc2UgYm90aCBlbmNvZGVyLXJl bGF0ZWQgYW5kIGNvbm5lY3Rvci1yZWxhdGVkIG9wZXJhdGlvbnMgKGJyaWRnZXMgCmJlaW5nIGdl YXJlZCB0b3dhcmRzIHRoZSBmb3JtZXIgYW5kIHBhbmVsIHRoZSBsYXR0ZXIgYXQgdGhlIG1vbWVu dCksIHRoZW4gCndlJ2xsIGJlIGFibGUgdG8gaGFuZGxlIGNvbm5lY3RvciBjcmVhdGlvbiBpbiBh IG11Y2ggZWFzaWVyIGJldHRlciB3YXkuIEFzIApJJ3ZlIGV4cGxhaW5lZCBiZWZvcmUsIGJyaWRn ZXMgc2hvdWxkIG5vdCBjcmVhdGUgY29ubmVjdG9ycywgYXMgdGhleSBoYXZlIG5vIAppZGVhIHdo ZXRoZXIgdGhleSdyZSBjaGFpbmVkIHRvIGFub3RoZXIgYnJpZGdlIG9yIG91dHB1dCBkaXJlY3Rs eSB0byBhIApjb25uZWN0b3IuCgo+IFRoZXJlIGFyZSBrbXMgZHJpdmVycyB0aGF0IHVzZSBkcm1f cGFuZWwsIGJ1dCBkb24ndCBoYXZlIHNpbXBsZSBzdHViCj4gY29ubmVjdG9ycyB0aGF0IHdyYXAg YXJvdW5kIGEgZHJtX3BhbmVsLiBUaGV5IGhhdmUgbW9yZSBjb21wbGljYXRlZAo+IGNvbm5lY3Rv ciBvcHMsIGFuZCBtYXkgY2FsbCBkcm1fcGFuZWxfcHJlcGFyZSgpIGFuZCByZWxhdGVkIGZ1bmN0 aW9ucyBhIGJpdAo+IGRpZmZlcmVudGx5LiBXZSB3b24ndCBiZSBhYmxlIHRvIHVzZSBkcm1fcGFu ZWxfYnJpZGdlIGZvciB0aG9zZSBkcml2ZXJzLgo+IAo+IEZvciBtc20sIHdlIGNoZWNrIHdoZXRo ZXIgdGhlIERTSSBlbmNvZGVyIGlzIGNvbm5lY3RlZCBkaXJlY3RseSB0byBhIHBhbmVsCj4gb3Ig YW4gZXh0ZXJuYWwgYnJpZGdlLiBJZiBpdCdzIGNvbm5lY3RlZCB0byBhbiBleHRlcm5hbCBicmlk Z2UsIHdlIHNraXAgdGhlCj4gY3JlYXRpb24gb2YgdGhlIHN0dWIgY29ubmVjdG9yLCBhbmQgcmVs eSBvbiB0aGUgZXh0ZXJuYWwgYnJpZGdlIGRyaXZlciB0bwo+IGNyZWF0ZSB0aGUgY29ubmVjdG9y Ogo+IAo+IGh0dHA6Ly9seHIuZnJlZS1lbGVjdHJvbnMuY29tL3NvdXJjZS9kcml2ZXJzL2dwdS9k cm0vbXNtL2RzaS9kc2kuYyNMMjI3Cj4gCj4gVGhlIG1zbSBzb2x1dGlvbiBpc24ndCB2ZXJ5IG5l YXQsIGJ1dCBpdCBhdm9pZHMgdGhlIG5lZWQgdG8gY3JlYXRlIGFub3RoZXIKPiBicmlkZ2UgdG8g Z2x1ZSB0aGluZ3MgdG9nZXRoZXIuCj4gCj4gQXJjaGl0Cj4gCj4gPiArICovCj4gPiArc3RydWN0 IGRybV9icmlkZ2UgKmRybV9wYW5lbF9icmlkZ2VfYWRkKHN0cnVjdCBkZXZpY2UgKmRldiwKPiA+ ICsJCQkJCXN0cnVjdCBkcm1fcGFuZWwgKnBhbmVsLAo+ID4gKwkJCQkJdTMyIGNvbm5lY3Rvcl90 eXBlKQo+ID4gK3sKPiA+ICsJc3RydWN0IHBhbmVsX2JyaWRnZSAqcGFuZWxfYnJpZGdlID0KPiA+ ICsJCWRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcGFuZWxfYnJpZGdlKSwgR0ZQX0tFUk5FTCk7 Cj4gPiArCWludCByZXQ7dGVncmFfb3V0cHV0X2Nvbm5lY3Rvcl9kZXRlY3QsCj4gPiArCj4gPiAr CWlmICghZGV2IHx8ICFwYW5lbCkKPiA+ICsJCXJldHVybiBFUlJfUFRSKEVJTlZBTCk7Cj4gPiAr Cj4gPiArCXBhbmVsX2JyaWRnZS0+ZGV2ID0gZGV2Owo+ID4gKwlwYW5lbF9icmlkZ2UtPmNvbm5l Y3Rvcl90eXBlID0gY29ubmVjdG9yX3R5cGU7Cj4gPiArCXBhbmVsX2JyaWRnZS0+cGFuZWwgPSBw YW5lbDsKPiA+ICsKPiA+ICsJcGFuZWxfYnJpZGdlLT5icmlkZ2UuZnVuY3MgPSAmcGFuZWxfYnJp ZGdlX2JyaWRnZV9mdW5jczsKPiA+ICsJcGFuZWxfYnJpZGdlLT5icmlkZ2Uub2Zfbm9kZSA9IGRl di0+b2Zfbm9kZTsKPiA+ICsKPiA+ICsJcmV0ID0gZHJtX2JyaWRnZV9hZGQoJnBhbmVsX2JyaWRn ZS0+YnJpZGdlKTsKPiA+ICsJaWYgKHJldCkKPiA+ICsJCXJldHVybiBFUlJfUFRSKHJldCk7Cj4g PiArCj4gPiArCXJldHVybiAmcGFuZWxfYnJpZGdlLT5icmlkZ2U7Cj4gPiArfQo+ID4gK0VYUE9S VF9TWU1CT0woZHJtX3BhbmVsX2JyaWRnZV9hZGQpOwo+ID4gKwo+ID4gK3ZvaWQgZHJtX3BhbmVs X2JyaWRnZV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2JyaWRnZQo+ID4g KmJyaWRnZSkgK3sKPiA+ICsJZHJtX2JyaWRnZV9yZW1vdmUoYnJpZGdlKTsKPiA+ICsJZGV2bV9r ZnJlZShkZXYsIGJyaWRnZSk7Cj4gPiArfQo+ID4gK0VYUE9SVF9TWU1CT0woZHJtX3BhbmVsX2Jy aWRnZV9yZW1vdmUpOwo+ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9icmlkZ2UuaCBi L2luY2x1ZGUvZHJtL2RybV9icmlkZ2UuaAo+ID4gaW5kZXggZmRkODJmY2JmMTY4Li5lMDg1NjNl ZTA1NDYgMTAwNjQ0Cj4gPiAtLS0gYS9pbmNsdWRlL2RybS9kcm1fYnJpZGdlLmgKPiA+ICsrKyBi L2luY2x1ZGUvZHJtL2RybV9icmlkZ2UuaAo+ID4gQEAgLTI5LDYgKzI5LDcgQEAKPiA+ICAjaW5j bHVkZSA8ZHJtL2RybV9tb2Rlcy5oPgo+ID4gIAo+ID4gIHN0cnVjdCBkcm1fYnJpZGdlOwo+ID4g K3N0cnVjdCBkcm1fcGFuZWw7Cj4gPiAKPiA+ICAvKioKPiA+ICAgKiBzdHJ1Y3QgZHJtX2JyaWRn ZV9mdW5jcyAtIGRybV9icmlkZ2UgY29udHJvbCBmdW5jdGlvbnMKPiA+IEBAIC0yMjEsNCArMjIy LDExIEBAIHZvaWQgZHJtX2JyaWRnZV9tb2RlX3NldChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdl LAo+ID4gIHZvaWQgZHJtX2JyaWRnZV9wcmVfZW5hYmxlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlk Z2UpOwo+ID4gIHZvaWQgZHJtX2JyaWRnZV9lbmFibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRn ZSk7Cj4gPiAKPiA+ICsjaWZkZWYgQ09ORklHX0RSTV9QQU5FTAo+ID4gK3N0cnVjdCBkcm1fYnJp ZGdlICpkcm1fcGFuZWxfYnJpZGdlX2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gPiArCQkJCQlz dHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCwKPiA+ICsJCQkJCXUzMiBjb25uZWN0b3JfdHlwZSk7Cj4g PiArdm9pZCBkcm1fcGFuZWxfYnJpZGdlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVj dCBkcm1fYnJpZGdlCj4gPiAqYnJpZGdlKTsKPiA+ICsjZW5kaWYKPiA+ICsKPiA+ICAjZW5kaWYK Ci0tIApSZWdhcmRzLAoKTGF1cmVudCBQaW5jaGFydAoKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxA bGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxt YW4vbGlzdGluZm8vZHJpLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752835AbdECJbH (ORCPT ); Wed, 3 May 2017 05:31:07 -0400 Received: from galahad.ideasonboard.com ([185.26.127.97]:48173 "EHLO galahad.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751661AbdECJa6 (ORCPT ); Wed, 3 May 2017 05:30:58 -0400 From: Laurent Pinchart To: Archit Taneja Cc: Eric Anholt , dri-devel@lists.freedesktop.org, Yannick Fertre , linux-kernel@vger.kernel.org, Thierry Reding , Andrzej Hajda Subject: Re: [PATCH 1/2] drm/bridge: Refactor out the panel wrapper from the lvds-encoder bridge. Date: Wed, 03 May 2017 12:32:11 +0300 Message-ID: <21970543.rOK40RzAVr@avalon> User-Agent: KMail/4.14.10 (Linux/4.9.16-gentoo; KDE/4.14.29; x86_64; ; ) In-Reply-To: References: <20170427163601.7313-1-eric@anholt.net> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Archit, On Wednesday 03 May 2017 14:53:00 Archit Taneja wrote: > On 04/27/2017 10:06 PM, Eric Anholt wrote: > > Many DRM drivers have common code to make a stub connector > > implementation that wraps a drm_panel. By wrapping the panel in a DRM > > bridge, all of the connector code (including calls during encoder > > enable/disable) goes away. > > > > Signed-off-by: Eric Anholt > > --- > > > > Documentation/gpu/drm-kms-helpers.rst | 3 + > > drivers/gpu/drm/bridge/Kconfig | 11 +- > > drivers/gpu/drm/bridge/Makefile | 1 + > > drivers/gpu/drm/bridge/lvds-encoder.c | 158 ++++------------------------ > > drivers/gpu/drm/bridge/panel.c | 188 +++++++++++++++++++++++++++++ > > include/drm/drm_bridge.h | 8 ++ > > 6 files changed, 228 insertions(+), 141 deletions(-) > > create mode 100644 drivers/gpu/drm/bridge/panel.c > > > > diff --git a/Documentation/gpu/drm-kms-helpers.rst > > b/Documentation/gpu/drm-kms-helpers.rst index c075aadd7078..60eb3b41702b > > 100644 > > --- a/Documentation/gpu/drm-kms-helpers.rst > > +++ b/Documentation/gpu/drm-kms-helpers.rst > > @@ -143,6 +143,9 @@ Bridge Helper Reference > > .. kernel-doc:: drivers/gpu/drm/drm_bridge.c > > :export: > > > > +.. kernel-doc:: drivers/gpu/drm/bridge/panel.c > > + :export: > > + > > .. _drm_panel_helper: > > Panel Helper Reference > > > > diff --git a/drivers/gpu/drm/bridge/Kconfig > > b/drivers/gpu/drm/bridge/Kconfig index f6968d3b4b41..c4daca38743c 100644 > > --- a/drivers/gpu/drm/bridge/Kconfig > > +++ b/drivers/gpu/drm/bridge/Kconfig > > @@ -4,6 +4,14 @@ config DRM_BRIDGE > > help > > Bridge registration and lookup framework. > > > > +config DRM_PANEL_BRIDGE > > + def_bool y > > + depends on DRM_BRIDGE > > + select DRM_KMS_HELPER > > + select DRM_PANEL > > + help > > + DRM bridge wrapper of DRM panels > > + > > menu "Display Interface Bridges" > > depends on DRM && DRM_BRIDGE > > > > @@ -27,8 +35,7 @@ config DRM_DUMB_VGA_DAC > > config DRM_LVDS_ENCODER > > tristate "Transparent parallel to LVDS encoder support" > > depends on OF > > - select DRM_KMS_HELPER > > - select DRM_PANEL > > + select DRM_PANEL_BRIDGE > > help > > Support for transparent parallel to LVDS encoders that don't require > > any configuration. > > diff --git a/drivers/gpu/drm/bridge/Makefile > > b/drivers/gpu/drm/bridge/Makefile index 3fe2226ee2f2..40a43750ad55 100644 > > --- a/drivers/gpu/drm/bridge/Makefile > > +++ b/drivers/gpu/drm/bridge/Makefile > > @@ -5,6 +5,7 @@ obj-$(CONFIG_DRM_DUMB_VGA_DAC) += dumb-vga-dac.o > > obj-$(CONFIG_DRM_LVDS_ENCODER) += lvds-encoder.o > > obj-$(CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW) += > > megachips-stdpxxxx-ge-b850v3-fw.o obj-$(CONFIG_DRM_NXP_PTN3460) += > > nxp-ptn3460.o > > +obj-$(CONFIG_DRM_PANEL_BRIDGE) += panel.o > > obj-$(CONFIG_DRM_PARADE_PS8622) += parade-ps8622.o > > obj-$(CONFIG_DRM_SIL_SII8620) += sil-sii8620.o > > obj-$(CONFIG_DRM_SII902X) += sii902x.o > > diff --git a/drivers/gpu/drm/bridge/lvds-encoder.c > > b/drivers/gpu/drm/bridge/lvds-encoder.c index f1f67a279426..04e1504c4d8f > > 100644 > > --- a/drivers/gpu/drm/bridge/lvds-encoder.c > > +++ b/drivers/gpu/drm/bridge/lvds-encoder.c > > @@ -8,144 +8,18 @@ > > */ > > > > #include > > -#include > > -#include > > -#include > > -#include > > -#include > > +#include > > #include > > > > #include > > > > -struct lvds_encoder { > > - struct device *dev; > > - > > - struct drm_bridge bridge; > > - struct drm_connector connector; > > - struct drm_panel *panel; > > -}; > > - > > -static inline struct lvds_encoder * > > -drm_bridge_to_lvds_encoder(struct drm_bridge *bridge) > > -{ > > - return container_of(bridge, struct lvds_encoder, bridge); > > -} > > - > > -static inline struct lvds_encoder * > > -drm_connector_to_lvds_encoder(struct drm_connector *connector) > > -{ > > - return container_of(connector, struct lvds_encoder, connector); > > -} > > - > > -static int lvds_connector_get_modes(struct drm_connector *connector) > > -{ > > - struct lvds_encoder *lvds = drm_connector_to_lvds_encoder(connector); > > - > > - return drm_panel_get_modes(lvds->panel); > > -} > > - > > -static const struct drm_connector_helper_funcs > > lvds_connector_helper_funcs = { - .get_modes = lvds_connector_get_modes, > > -}; > > - > > -static const struct drm_connector_funcs lvds_connector_funcs = { > > - .dpms = drm_atomic_helper_connector_dpms, > > - .reset = drm_atomic_helper_connector_reset, > > - .fill_modes = drm_helper_probe_single_connector_modes, > > - .destroy = drm_connector_cleanup, > > - .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, > > - .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, > > -}; > > - > > -static int lvds_encoder_attach(struct drm_bridge *bridge) > > -{ > > - struct lvds_encoder *lvds = drm_bridge_to_lvds_encoder(bridge); > > - struct drm_connector *connector = &lvds->connector; > > - int ret; > > - > > - if (!bridge->encoder) { > > - DRM_ERROR("Missing encoder\n"); > > - return -ENODEV; > > - } > > - > > - drm_connector_helper_add(connector, &lvds_connector_helper_funcs); > > - > > - ret = drm_connector_init(bridge->dev, connector, &lvds_connector_funcs, > > - DRM_MODE_CONNECTOR_LVDS); > > - if (ret) { > > - DRM_ERROR("Failed to initialize connector\n"); > > - return ret; > > - } > > - > > - drm_mode_connector_attach_encoder(&lvds->connector, bridge->encoder); > > - > > - ret = drm_panel_attach(lvds->panel, &lvds->connector); > > - if (ret < 0) > > - return ret; > > - > > - return 0; > > -} > > - > > -static void lvds_encoder_detach(struct drm_bridge *bridge) > > -{ > > - struct lvds_encoder *lvds = drm_bridge_to_lvds_encoder(bridge); > > - > > - drm_panel_detach(lvds->panel); > > -} > > - > > -static void lvds_encoder_pre_enable(struct drm_bridge *bridge) > > -{ > > - struct lvds_encoder *lvds = drm_bridge_to_lvds_encoder(bridge); > > - > > - drm_panel_prepare(lvds->panel); > > -} > > - > > -static void lvds_encoder_enable(struct drm_bridge *bridge) > > -{ > > - struct lvds_encoder *lvds = drm_bridge_to_lvds_encoder(bridge); > > - > > - drm_panel_enable(lvds->panel); > > -} > > - > > -static void lvds_encoder_disable(struct drm_bridge *bridge) > > -{ > > - struct lvds_encoder *lvds = drm_bridge_to_lvds_encoder(bridge); > > - > > - drm_panel_disable(lvds->panel); > > -} > > - > > -static void lvds_encoder_post_disable(struct drm_bridge *bridge) > > -{ > > - struct lvds_encoder *lvds = drm_bridge_to_lvds_encoder(bridge); > > - > > - drm_panel_unprepare(lvds->panel); > > -} > > - > > -static const struct drm_bridge_funcs lvds_encoder_bridge_funcs = { > > - .attach = lvds_encoder_attach, > > - .detach = lvds_encoder_detach, > > - .pre_enable = lvds_encoder_pre_enable, > > - .enable = lvds_encoder_enable, > > - .disable = lvds_encoder_disable, > > - .post_disable = lvds_encoder_post_disable, > > -}; > > - > > > > static int lvds_encoder_probe(struct platform_device *pdev) > > { > > > > - struct lvds_encoder *lvds; > > > > struct device_node *port; > > struct device_node *endpoint; > > > > - struct device_node *panel; > > - > > - lvds = devm_kzalloc(&pdev->dev, sizeof(*lvds), GFP_KERNEL); > > - if (!lvds) > > - return -ENOMEM; > > - > > - lvds->dev = &pdev->dev; > > - platform_set_drvdata(pdev, lvds); > > - > > - lvds->bridge.funcs = &lvds_encoder_bridge_funcs; > > - lvds->bridge.of_node = pdev->dev.of_node; > > + struct device_node *panel_node; > > + struct drm_panel *panel; > > + struct drm_bridge *bridge; > > > > /* Locate the panel DT node. */ > > port = of_graph_get_port_by_id(pdev->dev.of_node, 1); > > > > @@ -161,29 +35,35 @@ static int lvds_encoder_probe(struct platform_device > > *pdev)> > > return -ENXIO; > > > > } > > > > - panel = of_graph_get_remote_port_parent(endpoint); > > + panel_node = of_graph_get_remote_port_parent(endpoint); > > > > of_node_put(endpoint); > > > > - if (!panel) { > > + if (!panel_node) { > > > > dev_dbg(&pdev->dev, "no remote endpoint for port 1\n"); > > return -ENXIO; > > > > } > > > > - lvds->panel = of_drm_find_panel(panel); > > - of_node_put(panel); > > - if (!lvds->panel) { > > + panel = of_drm_find_panel(panel_node); > > + of_node_put(panel_node); > > + if (!panel) { > > > > dev_dbg(&pdev->dev, "panel not found, deferring probe\n"); > > return -EPROBE_DEFER; > > > > } > > > > - /* Register the bridge. */ > > - return drm_bridge_add(&lvds->bridge); > > + bridge = drm_panel_bridge_add(&pdev->dev, panel, > > + DRM_MODE_CONNECTOR_LVDS); > > + if (IS_ERR(bridge)) > > + return PTR_ERR(bridge); > > + > > + platform_set_drvdata(pdev, bridge); > > + > > + return 0; > > > > } > > > > static int lvds_encoder_remove(struct platform_device *pdev) > > { > > > > - struct lvds_encoder *encoder = platform_get_drvdata(pdev); > > + struct drm_bridge *bridge = platform_get_drvdata(pdev); > > > > - drm_bridge_remove(&encoder->bridge); > > + drm_bridge_remove(bridge); > > > > return 0; > > > > } > > > > diff --git a/drivers/gpu/drm/bridge/panel.c > > b/drivers/gpu/drm/bridge/panel.c new file mode 100644 > > index 000000000000..2081245455c6 > > --- /dev/null > > +++ b/drivers/gpu/drm/bridge/panel.c > > @@ -0,0 +1,188 @@ > > +/* > > + * Copyright (C) 2016 Laurent Pinchart > > > > + * Copyright (C) 2017 Broadcom > > + * > > + * This program is free software; you can redistribute it and/or > > + * modify it under the terms of the GNU General Public License as > > + * published by the Free Software Foundation; either version 2 of > > + * the License, or (at your option) any later version. > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +struct panel_bridge { > > + struct drm_bridge bridge; > > + struct device *dev; > > + struct drm_connector connector; > > + struct drm_panel *panel; > > + u32 connector_type; > > +}; > > + > > +static inline struct panel_bridge * > > +drm_bridge_to_panel_bridge(struct drm_bridge *bridge) > > +{ > > + return container_of(bridge, struct panel_bridge, bridge); > > +} > > + > > +static inline struct panel_bridge * > > +drm_connector_to_panel_bridge(struct drm_connector *connector) > > +{ > > + return container_of(connector, struct panel_bridge, connector); > > +} > > + > > +static int panel_bridge_connector_get_modes(struct drm_connector > > *connector) +{ > > + struct panel_bridge *panel_bridge = > > + drm_connector_to_panel_bridge(connector); > > + > > + return drm_panel_get_modes(panel_bridge->panel); > > +} > > + > > +static const struct drm_connector_helper_funcs > > panel_bridge_connector_helper_funcs = { + .get_modes = > > panel_bridge_connector_get_modes, > > +}; > > + > > +static const struct drm_connector_funcs panel_bridge_connector_funcs = { > > + .dpms = drm_atomic_helper_connector_dpms, > > + .reset = drm_atomic_helper_connector_reset, > > + .fill_modes = drm_helper_probe_single_connector_modes, > > + .destroy = drm_connector_cleanup, > > + .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, > > + .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, > > +}; > > + > > +static int panel_bridge_attach(struct drm_bridge *bridge) > > +{ > > + struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); > > + struct drm_connector *connector = &panel_bridge->connector; > > + int ret; > > + > > + if (!bridge->encoder) { > > + DRM_ERROR("Missing encoder\n"); > > + return -ENODEV; > > + } > > + > > + drm_connector_helper_add(connector, > > + &panel_bridge_connector_helper_funcs); > > + > > + ret = drm_connector_init(bridge->dev, connector, > > + &panel_bridge_connector_funcs, > > + panel_bridge->connector_type); > > + if (ret) { > > + DRM_ERROR("Failed to initialize connector\n"); > > + return ret; > > + } > > + > > + drm_mode_connector_attach_encoder(&panel_bridge->connector, > > + bridge->encoder); > > + > > + ret = drm_panel_attach(panel_bridge->panel, &panel_bridge->connector); > > + if (ret < 0) > > + return ret; > > + > > + return 0; > > +} > > + > > +static void panel_bridge_detach(struct drm_bridge *bridge) > > +{ > > + struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); > > + > > + drm_panel_detach(panel_bridge->panel); > > +} > > + > > +static void panel_bridge_pre_enable(struct drm_bridge *bridge) > > +{ > > + struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); > > + > > + drm_panel_prepare(panel_bridge->panel); > > +} > > + > > +static void panel_bridge_enable(struct drm_bridge *bridge) > > +{ > > + struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); > > + > > + drm_panel_enable(panel_bridge->panel); > > +} > > + > > +static void panel_bridge_disable(struct drm_bridge *bridge) > > +{ > > + struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); > > + > > + drm_panel_disable(panel_bridge->panel); > > +} > > + > > +static void panel_bridge_post_disable(struct drm_bridge *bridge) > > +{ > > + struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); > > + > > + drm_panel_unprepare(panel_bridge->panel); > > +} > > + > > +static const struct drm_bridge_funcs panel_bridge_bridge_funcs = { > > + .attach = panel_bridge_attach, > > + .detach = panel_bridge_detach, > > + .pre_enable = panel_bridge_pre_enable, > > + .enable = panel_bridge_enable, > > + .disable = panel_bridge_disable, > > + .post_disable = panel_bridge_post_disable, > > +}; > > + > > +/** > > + * drm_panel_bridge_add - Creates a drm_bridge and drm_connector that > > + * just call the appropriate functions from drm_panel. > > + * > > + * @dev: The struct device of the panel device. This is used for > > + * registering the drm_bridge. > > + * @panel: The drm_panel being wrapped. Must be non-NULL. > > + * @connector_type: The DRM_MODE_CONNECTOR_* for the connector to be > > + * created. > > + * > > + * For drivers converting from directly using drm_panel: The expected > > + * usage pattern is that during either encoder module probe or DSI > > + * host attach, a drm_panel will be looked up through > > + * drm_of_find_panel_or_bridge(). drm_panel_bridge_add() is used to > > + * wrap that panel in the new bridge, and the result can then be > > + * passed to drm_bridge_attach(). The drm_panel_prepare() and related > > + * functions can be dropped from the encoder driver (they're now > > + * called by the KMS helpers before calling into the encoder), along > > + * with connector creation. > > +panel/bridge reviewers. Thank you for that. > This does make things much cleaner, but it seems a bit strange to create > a drm_bridge when there isn't really a HW bridge in the display chain (i.e, > when the DSI encoder is directly connected to a DSI panel). I agree with you. I don't think this is a good idea, and what I'd like to see is a refactoring of the panel and bridge ops that would make them more alike, allowing to handle bridges and panels through a common interface. Another reason to go in that direction is that, if we create an object that can expose both encoder-related and connector-related operations (bridges being geared towards the former and panel the latter at the moment), then we'll be able to handle connector creation in a much easier better way. As I've explained before, bridges should not create connectors, as they have no idea whether they're chained to another bridge or output directly to a connector. > There are kms drivers that use drm_panel, but don't have simple stub > connectors that wrap around a drm_panel. They have more complicated > connector ops, and may call drm_panel_prepare() and related functions a bit > differently. We won't be able to use drm_panel_bridge for those drivers. > > For msm, we check whether the DSI encoder is connected directly to a panel > or an external bridge. If it's connected to an external bridge, we skip the > creation of the stub connector, and rely on the external bridge driver to > create the connector: > > http://lxr.free-electrons.com/source/drivers/gpu/drm/msm/dsi/dsi.c#L227 > > The msm solution isn't very neat, but it avoids the need to create another > bridge to glue things together. > > Archit > > > + */ > > +struct drm_bridge *drm_panel_bridge_add(struct device *dev, > > + struct drm_panel *panel, > > + u32 connector_type) > > +{ > > + struct panel_bridge *panel_bridge = > > + devm_kzalloc(dev, sizeof(*panel_bridge), GFP_KERNEL); > > + int ret;tegra_output_connector_detect, > > + > > + if (!dev || !panel) > > + return ERR_PTR(EINVAL); > > + > > + panel_bridge->dev = dev; > > + panel_bridge->connector_type = connector_type; > > + panel_bridge->panel = panel; > > + > > + panel_bridge->bridge.funcs = &panel_bridge_bridge_funcs; > > + panel_bridge->bridge.of_node = dev->of_node; > > + > > + ret = drm_bridge_add(&panel_bridge->bridge); > > + if (ret) > > + return ERR_PTR(ret); > > + > > + return &panel_bridge->bridge; > > +} > > +EXPORT_SYMBOL(drm_panel_bridge_add); > > + > > +void drm_panel_bridge_remove(struct device *dev, struct drm_bridge > > *bridge) +{ > > + drm_bridge_remove(bridge); > > + devm_kfree(dev, bridge); > > +} > > +EXPORT_SYMBOL(drm_panel_bridge_remove); > > diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h > > index fdd82fcbf168..e08563ee0546 100644 > > --- a/include/drm/drm_bridge.h > > +++ b/include/drm/drm_bridge.h > > @@ -29,6 +29,7 @@ > > #include > > > > struct drm_bridge; > > +struct drm_panel; > > > > /** > > * struct drm_bridge_funcs - drm_bridge control functions > > @@ -221,4 +222,11 @@ void drm_bridge_mode_set(struct drm_bridge *bridge, > > void drm_bridge_pre_enable(struct drm_bridge *bridge); > > void drm_bridge_enable(struct drm_bridge *bridge); > > > > +#ifdef CONFIG_DRM_PANEL > > +struct drm_bridge *drm_panel_bridge_add(struct device *dev, > > + struct drm_panel *panel, > > + u32 connector_type); > > +void drm_panel_bridge_remove(struct device *dev, struct drm_bridge > > *bridge); > > +#endif > > + > > #endif -- Regards, Laurent Pinchart