From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yakir Yang Subject: Re: [PATCH v4 05/16] drm: bridge: analogix/dp: dynamic parse sync_pol & interlace & colorimetry Date: Sun, 06 Sep 2015 10:00:41 +0800 Message-ID: <55EB9E49.90000@rock-chips.com> References: <1441086371-24838-1-git-send-email-ykk@rock-chips.com> <1441086934-25107-1-git-send-email-ykk@rock-chips.com> <55E7FF17.20402@samsung.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <55E7FF17.20402-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+glpar-linux-rockchip=m.gmane.org-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org To: Krzysztof Kozlowski , Heiko Stuebner , Thierry Reding , Jingoo Han , Inki Dae , joe-6d6DIl74uiNBDgjK7y7TUQ@public.gmane.org, Kukjin Kim , Mark Yao Cc: David Airlie , dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Andrzej Hajda , Gustavo Padovan , architt-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, seanpaul-F7+t8E8rja9Wk0Htik3J/w@public.gmane.org, djkurtz-F7+t8E8rja9Wk0Htik3J/w@public.gmane.org, Kishon Vijay Abraham I , linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org, Russell King , devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Pawel Moll , Ian Campbell , Rob Herring , dianders-F7+t8E8rja9Wk0Htik3J/w@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Kyungmin Park , Kumar Gala , ajaynumb-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org, Andy Yan List-Id: linux-rockchip.vger.kernel.org SGkgS3J6eXN6dG9mLAoK5ZyoIDA5LzAzLzIwMTUgMDQ6MDQgUE0sIEtyenlzenRvZiBLb3psb3dz a2kg5YaZ6YGTOgo+IE9uIDAxLjA5LjIwMTUgMTQ6NTUsIFlha2lyIFlhbmcgd3JvdGU6Cj4+IEJv dGggaHN5bmMvdnN5bmMgcG9sYXJpdHkgYW5kIGludGVybGFjZSBtb2RlIGNhbiBiZSBwYXJzZWQg ZnJvbQo+PiBkcm0gZGlzcGxheSBtb2RlLCBhbmQgZHluYW1pY19yYW5nZSBhbmQgeWNiY3JfY29l ZmYgY2FuIGJlIGp1ZGdlCj4+IGJ5IHRoZSB2aWRlbyBjb2RlLCBzYW1lIHRvIGNvbG9yIHNwYWNl IGFuZCBjb2xvciBkZXB0aCBjYW4gYmUKPj4gcGFyc2VkIGZyb20gRURJRC4KPj4KPj4gQnV0IHBy ZXN1bWFibHkgRXh5bm9zIHN0aWxsIHJlbGFpZXMgb24gdGhlIERUIHByb3BlcnRpZXMsIHNvIHRh a2UKPiBzL3JlbGFpZXMvcmVsaWVzLwo+Cj4+IGdvb2QgdXNlIG9mIG1vZGVfZml4dXAoKSBpbiB0 byBhY2hpZXZlIHRoZSBjb21wYXRpYmlsaXR5IGhhY2tzLgo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBZ YWtpciBZYW5nIDx5a2tAcm9jay1jaGlwcy5jb20+Cj4+IC0tLQo+PiBDaGFuZ2VzIGluIHY0Ogo+ PiAtIFRha2UgS3J6eXN6dG9mIHN1Z2dlc3QsIHByb3ZpZGUgYmFja3dvcmQgY29tcGF0aWJpbGl0 eSB3aXRoIHNhbXN1bmcuCj4+IC0gVGFrZSBUaGllcnJ5IHN1Z2dlc3QsIGFkZCAiY29sb3ItZGVw dGgiIGFuZCAiY29sb3Itc3BhY2UiIGR5bmFtaWMgcGFyc2VkLgo+Pgo+PiBDaGFuZ2VzIGluIHYz Ogo+PiAtIFRha2UgVGhpZXJyeSBSZWRpbmcgc3VnZ2VzdCwgZHluYW1pYyBwYXJzZSB2aWRlbyB0 aW1pbmcgaW5mbyBmcm9tCj4+ICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIGFuZCBzdHJ1Y3Qg ZHJtX2Rpc3BsYXlfaW5mby4KPj4KPj4gQ2hhbmdlcyBpbiB2MjogTm9uZQo+Pgo+PiAgIGRyaXZl cnMvZ3B1L2RybS9icmlkZ2UvYW5hbG9naXgvYW5hbG9naXhfZHBfY29yZS5jIHwgMTQxICsrKysr KysrKysrKystLS0tLS0tLQo+PiAgIGRyaXZlcnMvZ3B1L2RybS9icmlkZ2UvYW5hbG9naXgvYW5h bG9naXhfZHBfY29yZS5oIHwgICAyICstCj4+ICAgZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hbmFs b2dpeC9hbmFsb2dpeF9kcF9yZWcuYyAgfCAgMTQgKy0KPj4gICBkcml2ZXJzL2dwdS9kcm0vZXh5 bm9zL2V4eW5vc19kcC5jICAgICAgICAgICAgICAgICB8ICA1OCArKysrKysrKy0KPj4gICA0IGZp bGVzIGNoYW5nZWQsIDE1MSBpbnNlcnRpb25zKCspLCA2NCBkZWxldGlvbnMoLSkKPj4KPj4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvYW5hbG9naXgvYW5hbG9naXhfZHBfY29y ZS5jIGIvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hbmFsb2dpeC9hbmFsb2dpeF9kcF9jb3JlLmMK Pj4gaW5kZXggNzE5NjA5Ny4uZjBkYjkyZSAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJt L2JyaWRnZS9hbmFsb2dpeC9hbmFsb2dpeF9kcF9jb3JlLmMKPj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL2JyaWRnZS9hbmFsb2dpeC9hbmFsb2dpeF9kcF9jb3JlLmMKPj4gQEAgLTg5Nyw4ICs4OTcs OCBAQCBzdGF0aWMgdm9pZCBhbmFsb2dpeF9kcF9jb21taXQoc3RydWN0IGFuYWxvZ2l4X2RwX2Rl dmljZSAqZHApCj4+ICAgCQlyZXR1cm47Cj4+ICAgCX0KPj4gICAKPj4gLQlyZXQgPSBhbmFsb2dp eF9kcF9zZXRfbGlua190cmFpbihkcCwgZHAtPnZpZGVvX2luZm8tPmxhbmVfY291bnQsCj4+IC0J CQkJCSBkcC0+dmlkZW9faW5mby0+bGlua19yYXRlKTsKPj4gKwlyZXQgPSBhbmFsb2dpeF9kcF9z ZXRfbGlua190cmFpbihkcCwgZHAtPnZpZGVvX2luZm8ubGFuZV9jb3VudCwKPj4gKwkJCQkJIGRw LT52aWRlb19pbmZvLmxpbmtfcmF0ZSk7Cj4+ICAgCWlmIChyZXQpIHsKPj4gICAJCWRldl9lcnIo ZHAtPmRldiwgInVuYWJsZSB0byBkbyBsaW5rIHRyYWluXG4iKTsKPj4gICAJCXJldHVybjsKPj4g QEAgLTEwODEsNiArMTA4MSw4MiBAQCBzdGF0aWMgdm9pZCBhbmFsb2dpeF9kcF9icmlkZ2VfZGlz YWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+PiAgIAlkcC0+ZHBtc19tb2RlID0gRFJN X01PREVfRFBNU19PRkY7Cj4+ICAgfQo+PiAgIAo+PiArc3RhdGljIHZvaWQgYW5hbG9naXhfZHBf YnJpZGdlX21vZGVfc2V0KHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UsCj4+ICsJCQkJCXN0cnVj dCBkcm1fZGlzcGxheV9tb2RlICpvcmlnX21vZGUsCj4+ICsJCQkJCXN0cnVjdCBkcm1fZGlzcGxh eV9tb2RlICptb2RlKQo+PiArewo+PiArCXN0cnVjdCBhbmFsb2dpeF9kcF9kZXZpY2UgKmRwID0g YnJpZGdlLT5kcml2ZXJfcHJpdmF0ZTsKPj4gKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfaW5mbyAqZGlz cGxheV9pbmZvID0gJmRwLT5jb25uZWN0b3IuZGlzcGxheV9pbmZvOwo+PiArCXN0cnVjdCB2aWRl b19pbmZvICp2aWRlb19pbmZvID0gJmRwLT52aWRlb19pbmZvOwo+PiArCXN0cnVjdCBkZXZpY2Vf bm9kZSAqZHBfbm9kZSA9IGRwLT5kZXYtPm9mX25vZGU7Cj4+ICsJaW50IHZpYzsKPj4gKwo+PiAr CS8qIGludGVybGFjZXMgJiBoc3luYyBwb2wgJiB2c3luYyBwb2wgKi8KPj4gKwl2aWRlb19pbmZv LT5pbnRlcmxhY2VkID0gISEobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSk7 Cj4+ICsJdmlkZW9faW5mby0+dl9zeW5jX3BvbGFyaXR5ID0gISEobW9kZS0+ZmxhZ3MgJiBEUk1f TU9ERV9GTEFHX05WU1lOQyk7Cj4+ICsJdmlkZW9faW5mby0+aF9zeW5jX3BvbGFyaXR5ID0gISEo bW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX05IU1lOQyk7Cj4+ICsKPj4gKwkvKiBkeW5hbWlj X3JhbmdlICYgY29sb3JpbWV0cnkgKi8KPj4gKwl2aWMgPSBkcm1fbWF0Y2hfY2VhX21vZGUobW9k ZSk7Cj4+ICsJaWYgKCh2aWMgPT0gNikgfHwgKHZpYyA9PSA3KSB8fCAodmljID09IDIxKSB8fCAo dmljID09IDIyKSB8fAo+PiArCSAgICAodmljID09IDIpIHx8ICh2aWMgPT0gMykgfHwgKHZpYyA9 PSAxNykgfHwgKHZpYyA9PSAxOCkpIHsKPj4gKwkJdmlkZW9faW5mby0+ZHluYW1pY19yYW5nZSA9 IENFQTsKPj4gKwkJdmlkZW9faW5mby0+eWNiY3JfY29lZmYgPSBDT0xPUl9ZQ0JDUjYwMTsKPj4g Kwl9IGVsc2UgaWYgKHZpYykgewo+PiArCQl2aWRlb19pbmZvLT5keW5hbWljX3JhbmdlID0gQ0VB Owo+PiArCQl2aWRlb19pbmZvLT55Y2Jjcl9jb2VmZiA9IENPTE9SX1lDQkNSNzA5Owo+PiArCX0g ZWxzZSB7Cj4+ICsJCXZpZGVvX2luZm8tPmR5bmFtaWNfcmFuZ2UgPSBWRVNBOwo+PiArCQl2aWRl b19pbmZvLT55Y2Jjcl9jb2VmZiA9IENPTE9SX1lDQkNSNzA5Owo+PiArCX0KPj4gKwo+PiArCXN3 aXRjaCAoZGlzcGxheV9pbmZvLT5icGMpIHsKPj4gKwljYXNlIDEyOgo+PiArCQl2aWRlb19pbmZv LT5jb2xvcl9kZXB0aCA9IENPTE9SXzEyOwo+PiArCQlicmVhazsKPj4gKwljYXNlIDEwOgo+PiAr CQl2aWRlb19pbmZvLT5jb2xvcl9kZXB0aCA9IENPTE9SXzEwOwo+PiArCQlicmVhazsKPj4gKwlj YXNlIDg6Cj4+ICsJCXZpZGVvX2luZm8tPmNvbG9yX2RlcHRoID0gQ09MT1JfODsKPj4gKwkJYnJl YWs7Cj4+ICsJY2FzZSA2Ogo+PiArCQl2aWRlb19pbmZvLT5jb2xvcl9kZXB0aCA9IENPTE9SXzY7 Cj4+ICsJCWJyZWFrOwo+PiArCWRlZmF1bHQ6Cj4+ICsJCXZpZGVvX2luZm8tPmNvbG9yX2RlcHRo ID0gQ09MT1JfODsKPj4gKwkJYnJlYWs7Cj4+ICsJfQo+PiArCj4+ICsJaWYgKGRpc3BsYXlfaW5m by0+Y29sb3JfZm9ybWF0cyB8IERSTV9DT0xPUl9GT1JNQVRfWUNSQ0I0NDQpCj4+ICsJCXZpZGVv X2luZm8tPmNvbG9yX3NwYWNlID0gQ09MT1JfWUNCQ1I0NDQ7Cj4+ICsJZWxzZSBpZiAoZGlzcGxh eV9pbmZvLT5jb2xvcl9mb3JtYXRzIHwgRFJNX0NPTE9SX0ZPUk1BVF9ZQ1JDQjQyMikKPj4gKwkJ dmlkZW9faW5mby0+Y29sb3Jfc3BhY2UgPSBDT0xPUl9ZQ0JDUjQyMjsKPj4gKwllbHNlIGlmIChk aXNwbGF5X2luZm8tPmNvbG9yX2Zvcm1hdHMgfCBEUk1fQ09MT1JfRk9STUFUX1JHQjQ0NCkKPj4g KwkJdmlkZW9faW5mby0+Y29sb3Jfc3BhY2UgPSBDT0xPUl9SR0I7Cj4+ICsJZWxzZQo+PiArCQl2 aWRlb19pbmZvLT5jb2xvcl9zcGFjZSA9IENPTE9SX1JHQjsKPj4gKwo+PiArCS8qCj4+ICsJICog Tk9URTogdGhvc2UgcHJvcGVydHkgcGFyc2VpbmcgY29kZSBpcyB1c2VkIGZvcgo+IHMvcGFyc2Vp bmcvcGFyc2luZy8KPgo+IEJUVywgeW91IGNhbiBlYXNpbHkgaW50ZWdyYXRlIHNwZWxsLWNoZWNr IHRvIHZpbS4uLiBJdCBpcyBub3QgdGhhdCBJCj4gc2VhcmNoIGZvciBzdWNoIG1pc3NwZWxsaW5n cyAtIHRoZXkgYXJlIGhpZ2hsaWdodGVkLi4uCgpXb3csIHRoYW5rcyBmb3IgeW91ciByZW1pbmQs IEkgaGF2ZSBzZXQgdGhlIHNwZWxsLWNoZWNrIG5vdy4gIDopCgo+Cj4+ICsJICogcHJvdmlkaW5n IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIHNhbXN1bmcgcGxhdGZvcm0uCj4+ICsJICovCj4+ ICsJb2ZfcHJvcGVydHlfcmVhZF91MzIoZHBfbm9kZSwgInNhbXN1bmcsY29sb3Itc3BhY2UiLAo+ PiArCQkJICAgICAmdmlkZW9faW5mby0+Y29sb3Jfc3BhY2UpOwo+PiArCW9mX3Byb3BlcnR5X3Jl YWRfdTMyKGRwX25vZGUsICJzYW1zdW5nLGR5bmFtaWMtcmFuZ2UiLAo+PiArCQkJICAgICAmdmlk ZW9faW5mby0+ZHluYW1pY19yYW5nZSk7Cj4+ICsJb2ZfcHJvcGVydHlfcmVhZF91MzIoZHBfbm9k ZSwgInNhbXN1bmcseWNiY3ItY29lZmYiLAo+PiArCQkJICAgICAmdmlkZW9faW5mby0+eWNiY3Jf Y29lZmYpOwo+PiArCW9mX3Byb3BlcnR5X3JlYWRfdTMyKGRwX25vZGUsICJzYW1zdW5nLGNvbG9y LWRlcHRoIiwKPj4gKwkJCSAgICAgJnZpZGVvX2luZm8tPmNvbG9yX2RlcHRoKTsKPj4gKwlvZl9w cm9wZXJ0eV9yZWFkX3UzMihkcF9ub2RlLCAiaHN5bmMtYWN0aXZlLWhpZ2giLAo+PiArCQkJICAg ICAodW5zaWduZWQgaW50ICopJnZpZGVvX2luZm8tPmhfc3luY19wb2xhcml0eSk7Cj4+ICsJb2Zf cHJvcGVydHlfcmVhZF91MzIoZHBfbm9kZSwgInZzeW5jLWFjdGl2ZS1oaWdoIiwKPj4gKwkJCSAg ICAgKHVuc2lnbmVkIGludCAqKSZ2aWRlb19pbmZvLT52X3N5bmNfcG9sYXJpdHkpOwo+PiArCW9m X3Byb3BlcnR5X3JlYWRfdTMyKGRwX25vZGUsICJpbnRlcmxhY2VkIiwKPj4gKwkJCSAgICAgKHVu c2lnbmVkIGludCAqKSZ2aWRlb19pbmZvLT5pbnRlcmxhY2VkKTsKPiBZb3UgbWFkZSBhc3N1bXB0 aW9uIHRoYXQgdGhlIHNpemVvZihib29sKSBpcyBhbHdheXMgZXF1YWwgdG8KPiBzaXplb2YodTMy KS4uLiBUaGVuIHlvdSBjYXN0IGl0IHRvIHBvaW50ZXIgdG8gdW5zaWduZWQgaW50IGJ1dCBmdW5j dGlvbgo+IHdhbnRzIHBvaW50ZXIgdG8gdTMyLiBKdXN0IGZvciByZWFkaW5nIGJvb2xlYW4gcHJv cGVydHkuIFRoZXJlJ3MgZWFzaWVyCj4gd2F5IC0gb2ZfcHJvcGVydHlfcmVhZF9ib29sLiBJdCBy ZXR1cm5zIGJvb2wuCgpUaGFua3MsIGRvbmUuCgo+Cj4+ICt9Cj4+ICsKPj4gICBzdGF0aWMgdm9p ZCBhbmFsb2dpeF9kcF9icmlkZ2Vfbm9wKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpCj4+ICAg ewo+PiAgIAkvKiBkbyBub3RoaW5nICovCj4+IEBAIC0xMDkxLDYgKzExNjcsNyBAQCBzdGF0aWMg Y29uc3Qgc3RydWN0IGRybV9icmlkZ2VfZnVuY3MgYW5hbG9naXhfZHBfYnJpZGdlX2Z1bmNzID0g ewo+PiAgIAkuZGlzYWJsZSA9IGFuYWxvZ2l4X2RwX2JyaWRnZV9kaXNhYmxlLAo+PiAgIAkucHJl X2VuYWJsZSA9IGFuYWxvZ2l4X2RwX2JyaWRnZV9ub3AsCj4+ICAgCS5wb3N0X2Rpc2FibGUgPSBh bmFsb2dpeF9kcF9icmlkZ2Vfbm9wLAo+PiArCS5tb2RlX3NldCA9IGFuYWxvZ2l4X2RwX2JyaWRn ZV9tb2RlX3NldCwKPj4gICAJLmF0dGFjaCA9IGFuYWxvZ2l4X2RwX2JyaWRnZV9hdHRhY2gsCj4+ ICAgfTsKPj4gICAKPj4gQEAgLTExMjEsNjIgKzExOTgsMjQgQEAgc3RhdGljIGludCBhbmFsb2dp eF9kcF9jcmVhdGVfYnJpZGdlKHN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2LAo+PiAgIAlyZXR1 cm4gMDsKPj4gICB9Cj4+ICAgCj4+IC1zdGF0aWMgc3RydWN0IHZpZGVvX2luZm8gKmFuYWxvZ2l4 X2RwX2R0X3BhcnNlX3BkYXRhKHN0cnVjdCBkZXZpY2UgKmRldikKPj4gK3N0YXRpYyBpbnQgYW5h bG9naXhfZHBfZHRfcGFyc2VfcGRhdGEoc3RydWN0IGFuYWxvZ2l4X2RwX2RldmljZSAqZHApCj4+ ICAgewo+PiAtCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHBfbm9kZSA9IGRldi0+b2Zfbm9kZTsKPj4g LQlzdHJ1Y3QgdmlkZW9faW5mbyAqZHBfdmlkZW9fY29uZmlnOwo+PiAtCj4+IC0JZHBfdmlkZW9f Y29uZmlnID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkcF92aWRlb19jb25maWcpLAo+PiAt CQkJCSAgICAgICBHRlBfS0VSTkVMKTsKPj4gLQlpZiAoIWRwX3ZpZGVvX2NvbmZpZykKPj4gLQkJ cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cj4+IC0KPj4gLQlkcF92aWRlb19jb25maWctPmhfc3lu Y19wb2xhcml0eSA9Cj4+IC0JCW9mX3Byb3BlcnR5X3JlYWRfYm9vbChkcF9ub2RlLCAiaHN5bmMt YWN0aXZlLWhpZ2giKTsKPj4gLQo+PiAtCWRwX3ZpZGVvX2NvbmZpZy0+dl9zeW5jX3BvbGFyaXR5 ID0KPj4gLQkJb2ZfcHJvcGVydHlfcmVhZF9ib29sKGRwX25vZGUsICJ2c3luYy1hY3RpdmUtaGln aCIpOwo+PiAtCj4+IC0JZHBfdmlkZW9fY29uZmlnLT5pbnRlcmxhY2VkID0KPj4gLQkJb2ZfcHJv cGVydHlfcmVhZF9ib29sKGRwX25vZGUsICJpbnRlcmxhY2VkIik7Cj4+IC0KPj4gLQlpZiAob2Zf cHJvcGVydHlfcmVhZF91MzIoZHBfbm9kZSwgInNhbXN1bmcsY29sb3Itc3BhY2UiLAo+PiAtCQkJ CSAmZHBfdmlkZW9fY29uZmlnLT5jb2xvcl9zcGFjZSkpIHsKPj4gLQkJZGV2X2VycihkZXYsICJm YWlsZWQgdG8gZ2V0IGNvbG9yLXNwYWNlXG4iKTsKPj4gLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZB TCk7Cj4+IC0JfQo+PiAtCj4+IC0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKGRwX25vZGUsICJz YW1zdW5nLGR5bmFtaWMtcmFuZ2UiLAo+PiAtCQkJCSAmZHBfdmlkZW9fY29uZmlnLT5keW5hbWlj X3JhbmdlKSkgewo+PiAtCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgZHluYW1pYy1yYW5n ZVxuIik7Cj4+IC0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwo+PiAtCX0KPj4gLQo+PiAtCWlm IChvZl9wcm9wZXJ0eV9yZWFkX3UzMihkcF9ub2RlLCAic2Ftc3VuZyx5Y2Jjci1jb2VmZiIsCj4+ IC0JCQkJICZkcF92aWRlb19jb25maWctPnljYmNyX2NvZWZmKSkgewo+PiAtCQlkZXZfZXJyKGRl diwgImZhaWxlZCB0byBnZXQgeWNiY3ItY29lZmZcbiIpOwo+PiAtCQlyZXR1cm4gRVJSX1BUUigt RUlOVkFMKTsKPj4gLQl9Cj4+IC0KPj4gLQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIoZHBfbm9k ZSwgInNhbXN1bmcsY29sb3ItZGVwdGgiLAo+PiAtCQkJCSAmZHBfdmlkZW9fY29uZmlnLT5jb2xv cl9kZXB0aCkpIHsKPj4gLQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGNvbG9yLWRlcHRo XG4iKTsKPj4gLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cj4+IC0JfQo+PiArCXN0cnVjdCBk ZXZpY2Vfbm9kZSAqZHBfbm9kZSA9IGRwLT5kZXYtPm9mX25vZGU7Cj4+ICsJc3RydWN0IHZpZGVv X2luZm8gKnZpZGVvX2NvbmZpZyA9ICZkcC0+dmlkZW9faW5mbzsKPj4gICAKPj4gICAJaWYgKG9m X3Byb3BlcnR5X3JlYWRfdTMyKGRwX25vZGUsICJzYW1zdW5nLGxpbmstcmF0ZSIsCj4+IC0JCQkJ ICZkcF92aWRlb19jb25maWctPmxpbmtfcmF0ZSkpIHsKPj4gKwkJCQkgJnZpZGVvX2luZm8tPmxp bmtfcmF0ZSkpIHsKPj4gICAJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBsaW5rLXJhdGVc biIpOwo+PiAtCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKPj4gKwkJcmV0dXJuIC1FSU5WQUw7 Cj4+ICAgCX0KPj4gICAKPj4gICAJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKGRwX25vZGUsICJz YW1zdW5nLGxhbmUtY291bnQiLAo+PiAtCQkJCSAmZHBfdmlkZW9fY29uZmlnLT5sYW5lX2NvdW50 KSkgewo+PiArCQkJCSAmdmlkZW9faW5mby0+bGFuZV9jb3VudCkpIHsKPj4gICAJCWRldl9lcnIo ZGV2LCAiZmFpbGVkIHRvIGdldCBsYW5lLWNvdW50XG4iKTsKPj4gLQkJcmV0dXJuIEVSUl9QVFIo LUVJTlZBTCk7Cj4+ICsJCXJldHVybiAtRUlOVkFMOwo+PiAgIAl9Cj4+ICAgCj4+IC0JcmV0dXJu IGRwX3ZpZGVvX2NvbmZpZzsKPj4gKwlyZXR1cm4gMDsKPj4gICB9Cj4+ICAgCj4+ICAgaW50IGFu YWxvZ2l4X2RwX2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2RldmljZSAqZHJt X2RldiwKPj4gQEAgLTEyMDUsOSArMTI0NCw5IEBAIGludCBhbmFsb2dpeF9kcF9iaW5kKHN0cnVj dCBkZXZpY2UgKmRldiwgc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYsCj4+ICAgCSAqLwo+PiAg IAlkcC0+cGxhdF9kYXRhID0gcGxhdF9kYXRhOwo+PiAgIAo+PiAtCWRwLT52aWRlb19pbmZvID0g YW5hbG9naXhfZHBfZHRfcGFyc2VfcGRhdGEoJnBkZXYtPmRldik7Cj4+IC0JaWYgKElTX0VSUihk cC0+dmlkZW9faW5mbykpCj4+IC0JCXJldHVybiBQVFJfRVJSKGRwLT52aWRlb19pbmZvKTsKPj4g KwlyZXQgPSBhbmFsb2dpeF9kcF9kdF9wYXJzZV9wZGF0YShkcCk7Cj4+ICsJaWYgKHJldCkKPj4g KwkJcmV0dXJuIHJldDsKPj4gICAKPj4gICAJZHAtPnBoeSA9IGRldm1fcGh5X2dldChkcC0+ZGV2 LCAiZHAiKTsKPj4gICAJaWYgKElTX0VSUihkcC0+cGh5KSkgewo+PiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL2JyaWRnZS9hbmFsb2dpeC9hbmFsb2dpeF9kcF9jb3JlLmggYi9kcml2ZXJz L2dwdS9kcm0vYnJpZGdlL2FuYWxvZ2l4L2FuYWxvZ2l4X2RwX2NvcmUuaAo+PiBpbmRleCBmZmFi YmQwLi42ZTNkNWJjIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2FuYWxv Z2l4L2FuYWxvZ2l4X2RwX2NvcmUuaAo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2Fu YWxvZ2l4L2FuYWxvZ2l4X2RwX2NvcmUuaAo+PiBAQCAtMTU0LDcgKzE1NCw3IEBAIHN0cnVjdCBh bmFsb2dpeF9kcF9kZXZpY2Ugewo+PiAgIAl1bnNpZ25lZCBpbnQJCWlycTsKPj4gICAJdm9pZCBf X2lvbWVtCQkqcmVnX2Jhc2U7Cj4+ICAgCj4+IC0Jc3RydWN0IHZpZGVvX2luZm8JKnZpZGVvX2lu Zm87Cj4+ICsJc3RydWN0IHZpZGVvX2luZm8JdmlkZW9faW5mbzsKPj4gICAJc3RydWN0IGxpbmtf dHJhaW4JbGlua190cmFpbjsKPj4gICAJc3RydWN0IHdvcmtfc3RydWN0CWhvdHBsdWdfd29yazsK Pj4gICAJc3RydWN0IHBoeQkJKnBoeTsKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9i cmlkZ2UvYW5hbG9naXgvYW5hbG9naXhfZHBfcmVnLmMgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdl L2FuYWxvZ2l4L2FuYWxvZ2l4X2RwX3JlZy5jCj4+IGluZGV4IGI4NzlkOGMuLjZhNjQzYmUgMTAw NjQ0Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvYW5hbG9naXgvYW5hbG9naXhfZHBf cmVnLmMKPj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hbmFsb2dpeC9hbmFsb2dpeF9k cF9yZWcuYwo+PiBAQCAtMTA4NCwxNSArMTA4NCwxNSBAQCB2b2lkIGFuYWxvZ2l4X2RwX3NldF92 aWRlb19jb2xvcl9mb3JtYXQoc3RydWN0IGFuYWxvZ2l4X2RwX2RldmljZSAqZHApCj4+ICAgCXUz MiByZWc7Cj4+ICAgCj4+ICAgCS8qIENvbmZpZ3VyZSB0aGUgaW5wdXQgY29sb3IgZGVwdGgsIGNv bG9yIHNwYWNlLCBkeW5hbWljIHJhbmdlICovCj4+IC0JcmVnID0gKGRwLT52aWRlb19pbmZvLT5k eW5hbWljX3JhbmdlIDw8IElOX0RfUkFOR0VfU0hJRlQpIHwKPj4gLQkJKGRwLT52aWRlb19pbmZv LT5jb2xvcl9kZXB0aCA8PCBJTl9CUENfU0hJRlQpIHwKPj4gLQkJKGRwLT52aWRlb19pbmZvLT5j b2xvcl9zcGFjZSA8PCBJTl9DT0xPUl9GX1NISUZUKTsKPj4gKwlyZWcgPSAoZHAtPnZpZGVvX2lu Zm8uZHluYW1pY19yYW5nZSA8PCBJTl9EX1JBTkdFX1NISUZUKSB8Cj4+ICsJCShkcC0+dmlkZW9f aW5mby5jb2xvcl9kZXB0aCA8PCBJTl9CUENfU0hJRlQpIHwKPj4gKwkJKGRwLT52aWRlb19pbmZv LmNvbG9yX3NwYWNlIDw8IElOX0NPTE9SX0ZfU0hJRlQpOwo+PiAgIAl3cml0ZWwocmVnLCBkcC0+ cmVnX2Jhc2UgKyBBTkFMT0dJWF9EUF9WSURFT19DVExfMik7Cj4+ICAgCj4+ICAgCS8qIFNldCBJ bnB1dCBDb2xvciBZQ2JDciBDb2VmZmljaWVudHMgdG8gSVRVNjAxIG9yIElUVTcwOSAqLwo+PiAg IAlyZWcgPSByZWFkbChkcC0+cmVnX2Jhc2UgKyBBTkFMT0dJWF9EUF9WSURFT19DVExfMyk7Cj4+ ICAgCXJlZyAmPSB+SU5fWUNfQ09FRkZJX01BU0s7Cj4+IC0JaWYgKGRwLT52aWRlb19pbmZvLT55 Y2Jjcl9jb2VmZikKPj4gKwlpZiAoZHAtPnZpZGVvX2luZm8ueWNiY3JfY29lZmYpCj4+ICAgCQly ZWcgfD0gSU5fWUNfQ09FRkZJX0lUVTcwOTsKPj4gICAJZWxzZQo+PiAgIAkJcmVnIHw9IElOX1lD X0NPRUZGSV9JVFU2MDE7Cj4+IEBAIC0xMjI5LDE3ICsxMjI5LDE3IEBAIHZvaWQgYW5hbG9naXhf ZHBfY29uZmlnX3ZpZGVvX3NsYXZlX21vZGUoc3RydWN0IGFuYWxvZ2l4X2RwX2RldmljZSAqZHAp Cj4+ICAgCj4+ICAgCXJlZyA9IHJlYWRsKGRwLT5yZWdfYmFzZSArIEFOQUxPR0lYX0RQX1ZJREVP X0NUTF8xMCk7Cj4+ICAgCXJlZyAmPSB+SU5URVJBQ0VfU0NBTl9DRkc7Cj4+IC0JcmVnIHw9IChk cC0+dmlkZW9faW5mby0+aW50ZXJsYWNlZCA8PCAyKTsKPj4gKwlyZWcgfD0gKGRwLT52aWRlb19p bmZvLmludGVybGFjZWQgPDwgMik7Cj4+ICAgCXdyaXRlbChyZWcsIGRwLT5yZWdfYmFzZSArIEFO QUxPR0lYX0RQX1ZJREVPX0NUTF8xMCk7Cj4+ICAgCj4+ICAgCXJlZyA9IHJlYWRsKGRwLT5yZWdf YmFzZSArIEFOQUxPR0lYX0RQX1ZJREVPX0NUTF8xMCk7Cj4+ICAgCXJlZyAmPSB+VlNZTkNfUE9M QVJJVFlfQ0ZHOwo+PiAtCXJlZyB8PSAoZHAtPnZpZGVvX2luZm8tPnZfc3luY19wb2xhcml0eSA8 PCAxKTsKPj4gKwlyZWcgfD0gKGRwLT52aWRlb19pbmZvLnZfc3luY19wb2xhcml0eSA8PCAxKTsK Pj4gICAJd3JpdGVsKHJlZywgZHAtPnJlZ19iYXNlICsgQU5BTE9HSVhfRFBfVklERU9fQ1RMXzEw KTsKPj4gICAKPj4gICAJcmVnID0gcmVhZGwoZHAtPnJlZ19iYXNlICsgQU5BTE9HSVhfRFBfVklE RU9fQ1RMXzEwKTsKPj4gICAJcmVnICY9IH5IU1lOQ19QT0xBUklUWV9DRkc7Cj4+IC0JcmVnIHw9 IChkcC0+dmlkZW9faW5mby0+aF9zeW5jX3BvbGFyaXR5IDw8IDApOwo+PiArCXJlZyB8PSAoZHAt PnZpZGVvX2luZm8uaF9zeW5jX3BvbGFyaXR5IDw8IDApOwo+PiAgIAl3cml0ZWwocmVnLCBkcC0+ cmVnX2Jhc2UgKyBBTkFMT0dJWF9EUF9WSURFT19DVExfMTApOwo+PiAgIAo+PiAgIAlyZWcgPSBB VURJT19NT0RFX1NQRElGX01PREUgfCBWSURFT19NT0RFX1NMQVZFX01PREU7Cj4+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcC5jIGIvZHJpdmVycy9ncHUvZHJt L2V4eW5vcy9leHlub3NfZHAuYwo+PiBpbmRleCA3ZTFiZTcyLi42MDYwZDJjIDEwMDY0NAo+PiAt LS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcC5jCj4+ICsrKyBiL2RyaXZlcnMv Z3B1L2RybS9leHlub3MvZXh5bm9zX2RwLmMKPj4gQEAgLTI4LDggKzI4LDEzIEBACj4+ICAgCj4+ ICAgI2luY2x1ZGUgImV4eW5vc19kcm1fY3J0Yy5oIgo+PiAgIAo+PiAtI2RlZmluZSBwbGF0X2Rh dGFfdG9fZHAocGQpIFwKPj4gLQkJY29udGFpbmVyX29mKHBkLCBzdHJ1Y3QgZXh5bm9zX2RwX2Rl dmljZSwgcGxhdF9kYXRhKQo+PiArI2RlZmluZSB0b19kcChubSkJY29udGFpbmVyX29mKG5tLCBz dHJ1Y3QgZXh5bm9zX2RwX2RldmljZSwgbm0pCj4+ICsKPj4gK3N0cnVjdCB2aWRlb19pbmZvIHsK Pj4gKwlib29sIGhfc3luY19wb2xhcml0eTsKPj4gKwlib29sIHZfc3luY19wb2xhcml0eTsKPj4g Kwlib29sIGludGVybGFjZWQ7Cj4+ICt9Owo+PiAgIAo+PiAgIHN0cnVjdCBleHlub3NfZHBfZGV2 aWNlIHsKPj4gICAJc3RydWN0IGRybV9lbmNvZGVyICAgICAgICAgZW5jb2RlcjsKPj4gQEAgLTM5 LDEyICs0NCwxMyBAQCBzdHJ1Y3QgZXh5bm9zX2RwX2RldmljZSB7Cj4+ICAgCj4+ICAgCXN0cnVj dCBleHlub3NfZHJtX3BhbmVsX2luZm8gcHJpdjsKPj4gICAJc3RydWN0IGFuYWxvZ2l4X2RwX3Bs YXRfZGF0YSBwbGF0X2RhdGE7Cj4+ICsJc3RydWN0IHZpZGVvX2luZm8gICAgICAgICAgICB2aWRl b19pbmZvOwo+PiAgIH07Cj4+ICAgCj4+ICAgaW50IGV4eW5vc19kcF9jcnRjX2Nsb2NrX2VuYWJs ZShzdHJ1Y3QgYW5hbG9naXhfZHBfcGxhdF9kYXRhICpwbGF0X2RhdGEsCj4+ICAgCQkJCWJvb2wg ZW5hYmxlKQo+PiAgIHsKPj4gLQlzdHJ1Y3QgZXh5bm9zX2RwX2RldmljZSAqZHAgPSBwbGF0X2Rh dGFfdG9fZHAocGxhdF9kYXRhKTsKPj4gKwlzdHJ1Y3QgZXh5bm9zX2RwX2RldmljZSAqZHAgPSB0 b19kcChwbGF0X2RhdGEpOwo+PiAgIAlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSAmZHAt PmVuY29kZXI7Cj4+ICAgCXN0cnVjdCBleHlub3NfZHJtX2NydGMgKmNydGM7Cj4+ICAgCj4+IEBA IC03MSw3ICs3Nyw3IEBAIHN0YXRpYyBpbnQgZXh5bm9zX2RwX3Bvd2Vyb2ZmKHN0cnVjdCBhbmFs b2dpeF9kcF9wbGF0X2RhdGEgKnBsYXRfZGF0YSkKPj4gICBzdGF0aWMgaW50IGV4eW5vc19kcF9n ZXRfbW9kZXMoc3RydWN0IGFuYWxvZ2l4X2RwX3BsYXRfZGF0YSAqcGxhdF9kYXRhLAo+PiAgIAkJ CSAgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+PiAgIHsKPj4gLQlzdHJ1 Y3QgZXh5bm9zX2RwX2RldmljZSAqZHAgPSBwbGF0X2RhdGFfdG9fZHAocGxhdF9kYXRhKTsKPj4g KwlzdHJ1Y3QgZXh5bm9zX2RwX2RldmljZSAqZHAgPSB0b19kcChwbGF0X2RhdGEpOwo+PiAgIAlz dHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKPj4gICAKPj4gICAJaWYgKGRwLT5wbGF0X2Rh dGEucGFuZWwpCj4+IEBAIC05OSw3ICsxMDUsNyBAQCBzdGF0aWMgaW50IGV4eW5vc19kcF9nZXRf bW9kZXMoc3RydWN0IGFuYWxvZ2l4X2RwX3BsYXRfZGF0YSAqcGxhdF9kYXRhLAo+PiAgIHN0YXRp YyBpbnQgZXh5bm9zX2RwX2JyaWRnZV9hdHRhY2goc3RydWN0IGFuYWxvZ2l4X2RwX3BsYXRfZGF0 YSAqcGxhdF9kYXRhLAo+PiAgIAkJCQkgICBzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+PiAg IHsKPj4gLQlzdHJ1Y3QgZXh5bm9zX2RwX2RldmljZSAqZHAgPSBwbGF0X2RhdGFfdG9fZHAocGxh dF9kYXRhKTsKPj4gKwlzdHJ1Y3QgZXh5bm9zX2RwX2RldmljZSAqZHAgPSB0b19kcChwbGF0X2Rh dGEpOwo+PiAgIAlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSAmZHAtPmVuY29kZXI7Cj4+ ICAgCWludCByZXQ7Cj4+ICAgCj4+IEBAIC0xMjIsNiArMTI4LDI4IEBAIHN0YXRpYyBib29sIGV4 eW5vc19kcF9tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKPj4gICAJCQkJ IGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAo+PiAgIAkJCQkgc3RydWN0IGRy bV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCj4+ICAgewo+PiArCXN0cnVjdCBleHlub3Nf ZHBfZGV2aWNlICpkcCA9IHRvX2RwKGVuY29kZXIpOwo+PiArCWludCBmbGFncyA9IGFkanVzdGVk X21vZGUtPmZsYWdzOwo+PiArCj4+ICsJZmxhZ3MgJj0gfihEUk1fTU9ERV9GTEFHX1BIU1lOQyB8 IERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwKPj4gKwkJICAgRFJNX01PREVfRkxBR19QVlNZTkMgfCBE Uk1fTU9ERV9GTEFHX05WU1lOQyB8Cj4+ICsJCSAgIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKTsK Pj4gKwo+PiArCWlmIChkcC0+dmlkZW9faW5mby5oX3N5bmNfcG9sYXJpdHkpCj4+ICsJCWZsYWdz IHw9IERSTV9NT0RFX0ZMQUdfUEhTWU5DOwo+PiArCWVsc2UKPj4gKwkJZmxhZ3MgfD0gRFJNX01P REVfRkxBR19OSFNZTkM7Cj4+ICsKPj4gKwlpZiAoZHAtPnZpZGVvX2luZm8udl9zeW5jX3BvbGFy aXR5KQo+PiArCQlmbGFncyB8PSBEUk1fTU9ERV9GTEFHX1BWU1lOQzsKPj4gKwllbHNlCj4+ICsJ CWZsYWdzIHw9IERSTV9NT0RFX0ZMQUdfTlZTWU5DOwo+PiArCj4+ICsJaWYgKGRwLT52aWRlb19p bmZvLmludGVybGFjZWQpCj4+ICsJCWZsYWdzIHw9IERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFOwo+ PiArCj4+ICsJYWRqdXN0ZWRfbW9kZS0+ZmxhZ3MgPSBmbGFnczsKPj4gKwo+PiAgIAlyZXR1cm4g dHJ1ZTsKPj4gICB9Cj4+ICAgCj4+IEBAIC0xNjMsNiArMTkxLDIyIEBAIHN0YXRpYyBpbnQgZXh5 bm9zX2RwX2R0X3BhcnNlX3BhbmVsKHN0cnVjdCBleHlub3NfZHBfZGV2aWNlICpkcCkKPj4gICAJ cmV0dXJuIDA7Cj4+ICAgfQo+PiAgIAo+PiArc3RhdGljIGludCBleHlub3NfZHBfZHRfcGFyc2Vf dmlkZW9faW5mbyhzdHJ1Y3QgZXh5bm9zX2RwX2RldmljZSAqZHApCj4+ICt7Cj4+ICsJc3RydWN0 IGRldmljZV9ub2RlICpkcF9ub2RlID0gZHAtPmRldi0+b2Zfbm9kZTsKPj4gKwo+PiArCWRwLT52 aWRlb19pbmZvLmhfc3luY19wb2xhcml0eSA9Cj4+ICsJCW9mX3Byb3BlcnR5X3JlYWRfYm9vbChk cF9ub2RlLCAiaHN5bmMtYWN0aXZlLWhpZ2giKTsKPj4gKwo+PiArCWRwLT52aWRlb19pbmZvLnZf c3luY19wb2xhcml0eSA9Cj4+ICsJCW9mX3Byb3BlcnR5X3JlYWRfYm9vbChkcF9ub2RlLCAidnN5 bmMtYWN0aXZlLWhpZ2giKTsKPj4gKwo+PiArCWRwLT52aWRlb19pbmZvLmludGVybGFjZWQgPQo+ PiArCQlvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZHBfbm9kZSwgImludGVybGFjZWQiKTsKPj4gKwo+ PiArCXJldHVybiAwOwo+IFByb2JhYmx5IHlvdSB3YW50ZWQgdG8gZm9sbG93IHRoZSBjb252ZW50 aW9uIG9mIG90aGVyIERULXBhcnNlIGZ1bmN0aW9ucwo+IGJ1dCB0aGVyZSBpcyBubyBuZWVkLiBU aGlzIGZ1bmN0aW9uIGNhbm5vdCBmYWlsIHNvIG1heWJlIG1ha2UgaXQgdm9pZD8KPiBJdCB3b3Vs ZCBzaW1wbGlmeSBhIGJpdCB0aGUgY29kZSBpbiBleHlub3NfZHBfYmluZCgpLgoKQWN0dWFsbHks IEkgZm91bmQgYW4gbWlzdGFrZW4gaGVyZS4gSSBoYXZlIHBhcnNlZCB0aG9zZSB0d28gcHJvcGVy dHkgZm9yIAp0d2ljZSwKb25lIGlzIGhlcmUsIHRoZSBvdGhlciBpcyBhbmFsb2dpeF9kcF9jb3Jl LmMgbW9kZV9zZXQoKSBmdW5jdGlvbi4KICAgICAgICAgLyoKICAgICAgICAgICogTk9URTogdGhv c2UgcHJvcGVydHkgcGFyc2VpbmcgY29kZSBpcyB1c2VkIGZvcgogICAgICAgICAgKiBwcm92aWRp bmcgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3Igc2Ftc3VuZyBwbGF0Zm9ybS4KICAgICAgICAg ICovCiAgICAgICAgIFsuLi4uXQogICAgICAgICBvZl9wcm9wZXJ0eV9yZWFkX3UzMihkcF9ub2Rl LCAiaHN5bmMtYWN0aXZlLWhpZ2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5z aWduZWQgaW50ICopJnZpZGVvX2luZm8tPmhfc3luY19wb2xhcml0eSk7CiAgICAgICAgIG9mX3By b3BlcnR5X3JlYWRfdTMyKGRwX25vZGUsICJ2c3luYy1hY3RpdmUtaGlnaCIsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQgKikmdmlkZW9faW5mby0+dl9zeW5jX3Bv bGFyaXR5KTsKICAgICAgICAgb2ZfcHJvcGVydHlfcmVhZF91MzIoZHBfbm9kZSwgImludGVybGFj ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50ICopJnZpZGVv X2luZm8tPmludGVybGFjZWQpOwoKCkFuZCBJIHRoaW5rIGl0IHdvdWxkIGJlIGVhc3kgdG8gY29k ZSB3aGVuIEkgYWNoaWV2ZSB0aGUgYmFja3dhcmQgCmNvbXBhdGliaWxpdHkKaW4gYW5hbG9naXgg Y29yZSBkcml2ZXIuIFNvIEkgcHJlZmVyIHRoaXMgd2F5IDotKQoKQW55d2F5LCB0aGFua3MsCi0g WWFraXIKCj4gQmVzdCByZWdhcmRzLAo+IEtyenlzenRvZgo+Cj4KPgoKCgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eC1yb2NrY2hpcCBtYWlsaW5n IGxpc3QKTGludXgtcm9ja2NoaXBAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5m cmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJvY2tjaGlwCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: ykk@rock-chips.com (Yakir Yang) Date: Sun, 06 Sep 2015 10:00:41 +0800 Subject: [PATCH v4 05/16] drm: bridge: analogix/dp: dynamic parse sync_pol & interlace & colorimetry In-Reply-To: <55E7FF17.20402@samsung.com> References: <1441086371-24838-1-git-send-email-ykk@rock-chips.com> <1441086934-25107-1-git-send-email-ykk@rock-chips.com> <55E7FF17.20402@samsung.com> Message-ID: <55EB9E49.90000@rock-chips.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Krzysztof, ? 09/03/2015 04:04 PM, Krzysztof Kozlowski ??: > On 01.09.2015 14:55, Yakir Yang wrote: >> Both hsync/vsync polarity and interlace mode can be parsed from >> drm display mode, and dynamic_range and ycbcr_coeff can be judge >> by the video code, same to color space and color depth can be >> parsed from EDID. >> >> But presumably Exynos still relaies on the DT properties, so take > s/relaies/relies/ > >> good use of mode_fixup() in to achieve the compatibility hacks. >> >> Signed-off-by: Yakir Yang >> --- >> Changes in v4: >> - Take Krzysztof suggest, provide backword compatibility with samsung. >> - Take Thierry suggest, add "color-depth" and "color-space" dynamic parsed. >> >> Changes in v3: >> - Take Thierry Reding suggest, dynamic parse video timing info from >> struct drm_display_mode and struct drm_display_info. >> >> Changes in v2: None >> >> drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 141 +++++++++++++-------- >> drivers/gpu/drm/bridge/analogix/analogix_dp_core.h | 2 +- >> drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c | 14 +- >> drivers/gpu/drm/exynos/exynos_dp.c | 58 ++++++++- >> 4 files changed, 151 insertions(+), 64 deletions(-) >> >> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c >> index 7196097..f0db92e 100644 >> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c >> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c >> @@ -897,8 +897,8 @@ static void analogix_dp_commit(struct analogix_dp_device *dp) >> return; >> } >> >> - ret = analogix_dp_set_link_train(dp, dp->video_info->lane_count, >> - dp->video_info->link_rate); >> + ret = analogix_dp_set_link_train(dp, dp->video_info.lane_count, >> + dp->video_info.link_rate); >> if (ret) { >> dev_err(dp->dev, "unable to do link train\n"); >> return; >> @@ -1081,6 +1081,82 @@ static void analogix_dp_bridge_disable(struct drm_bridge *bridge) >> dp->dpms_mode = DRM_MODE_DPMS_OFF; >> } >> >> +static void analogix_dp_bridge_mode_set(struct drm_bridge *bridge, >> + struct drm_display_mode *orig_mode, >> + struct drm_display_mode *mode) >> +{ >> + struct analogix_dp_device *dp = bridge->driver_private; >> + struct drm_display_info *display_info = &dp->connector.display_info; >> + struct video_info *video_info = &dp->video_info; >> + struct device_node *dp_node = dp->dev->of_node; >> + int vic; >> + >> + /* interlaces & hsync pol & vsync pol */ >> + video_info->interlaced = !!(mode->flags & DRM_MODE_FLAG_INTERLACE); >> + video_info->v_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NVSYNC); >> + video_info->h_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NHSYNC); >> + >> + /* dynamic_range & colorimetry */ >> + vic = drm_match_cea_mode(mode); >> + if ((vic == 6) || (vic == 7) || (vic == 21) || (vic == 22) || >> + (vic == 2) || (vic == 3) || (vic == 17) || (vic == 18)) { >> + video_info->dynamic_range = CEA; >> + video_info->ycbcr_coeff = COLOR_YCBCR601; >> + } else if (vic) { >> + video_info->dynamic_range = CEA; >> + video_info->ycbcr_coeff = COLOR_YCBCR709; >> + } else { >> + video_info->dynamic_range = VESA; >> + video_info->ycbcr_coeff = COLOR_YCBCR709; >> + } >> + >> + switch (display_info->bpc) { >> + case 12: >> + video_info->color_depth = COLOR_12; >> + break; >> + case 10: >> + video_info->color_depth = COLOR_10; >> + break; >> + case 8: >> + video_info->color_depth = COLOR_8; >> + break; >> + case 6: >> + video_info->color_depth = COLOR_6; >> + break; >> + default: >> + video_info->color_depth = COLOR_8; >> + break; >> + } >> + >> + if (display_info->color_formats | DRM_COLOR_FORMAT_YCRCB444) >> + video_info->color_space = COLOR_YCBCR444; >> + else if (display_info->color_formats | DRM_COLOR_FORMAT_YCRCB422) >> + video_info->color_space = COLOR_YCBCR422; >> + else if (display_info->color_formats | DRM_COLOR_FORMAT_RGB444) >> + video_info->color_space = COLOR_RGB; >> + else >> + video_info->color_space = COLOR_RGB; >> + >> + /* >> + * NOTE: those property parseing code is used for > s/parseing/parsing/ > > BTW, you can easily integrate spell-check to vim... It is not that I > search for such misspellings - they are highlighted... Wow, thanks for your remind, I have set the spell-check now. :) > >> + * providing backward compatibility for samsung platform. >> + */ >> + of_property_read_u32(dp_node, "samsung,color-space", >> + &video_info->color_space); >> + of_property_read_u32(dp_node, "samsung,dynamic-range", >> + &video_info->dynamic_range); >> + of_property_read_u32(dp_node, "samsung,ycbcr-coeff", >> + &video_info->ycbcr_coeff); >> + of_property_read_u32(dp_node, "samsung,color-depth", >> + &video_info->color_depth); >> + of_property_read_u32(dp_node, "hsync-active-high", >> + (unsigned int *)&video_info->h_sync_polarity); >> + of_property_read_u32(dp_node, "vsync-active-high", >> + (unsigned int *)&video_info->v_sync_polarity); >> + of_property_read_u32(dp_node, "interlaced", >> + (unsigned int *)&video_info->interlaced); > You made assumption that the sizeof(bool) is always equal to > sizeof(u32)... Then you cast it to pointer to unsigned int but function > wants pointer to u32. Just for reading boolean property. There's easier > way - of_property_read_bool. It returns bool. Thanks, done. > >> +} >> + >> static void analogix_dp_bridge_nop(struct drm_bridge *bridge) >> { >> /* do nothing */ >> @@ -1091,6 +1167,7 @@ static const struct drm_bridge_funcs analogix_dp_bridge_funcs = { >> .disable = analogix_dp_bridge_disable, >> .pre_enable = analogix_dp_bridge_nop, >> .post_disable = analogix_dp_bridge_nop, >> + .mode_set = analogix_dp_bridge_mode_set, >> .attach = analogix_dp_bridge_attach, >> }; >> >> @@ -1121,62 +1198,24 @@ static int analogix_dp_create_bridge(struct drm_device *drm_dev, >> return 0; >> } >> >> -static struct video_info *analogix_dp_dt_parse_pdata(struct device *dev) >> +static int analogix_dp_dt_parse_pdata(struct analogix_dp_device *dp) >> { >> - struct device_node *dp_node = dev->of_node; >> - struct video_info *dp_video_config; >> - >> - dp_video_config = devm_kzalloc(dev, sizeof(*dp_video_config), >> - GFP_KERNEL); >> - if (!dp_video_config) >> - return ERR_PTR(-ENOMEM); >> - >> - dp_video_config->h_sync_polarity = >> - of_property_read_bool(dp_node, "hsync-active-high"); >> - >> - dp_video_config->v_sync_polarity = >> - of_property_read_bool(dp_node, "vsync-active-high"); >> - >> - dp_video_config->interlaced = >> - of_property_read_bool(dp_node, "interlaced"); >> - >> - if (of_property_read_u32(dp_node, "samsung,color-space", >> - &dp_video_config->color_space)) { >> - dev_err(dev, "failed to get color-space\n"); >> - return ERR_PTR(-EINVAL); >> - } >> - >> - if (of_property_read_u32(dp_node, "samsung,dynamic-range", >> - &dp_video_config->dynamic_range)) { >> - dev_err(dev, "failed to get dynamic-range\n"); >> - return ERR_PTR(-EINVAL); >> - } >> - >> - if (of_property_read_u32(dp_node, "samsung,ycbcr-coeff", >> - &dp_video_config->ycbcr_coeff)) { >> - dev_err(dev, "failed to get ycbcr-coeff\n"); >> - return ERR_PTR(-EINVAL); >> - } >> - >> - if (of_property_read_u32(dp_node, "samsung,color-depth", >> - &dp_video_config->color_depth)) { >> - dev_err(dev, "failed to get color-depth\n"); >> - return ERR_PTR(-EINVAL); >> - } >> + struct device_node *dp_node = dp->dev->of_node; >> + struct video_info *video_config = &dp->video_info; >> >> if (of_property_read_u32(dp_node, "samsung,link-rate", >> - &dp_video_config->link_rate)) { >> + &video_info->link_rate)) { >> dev_err(dev, "failed to get link-rate\n"); >> - return ERR_PTR(-EINVAL); >> + return -EINVAL; >> } >> >> if (of_property_read_u32(dp_node, "samsung,lane-count", >> - &dp_video_config->lane_count)) { >> + &video_info->lane_count)) { >> dev_err(dev, "failed to get lane-count\n"); >> - return ERR_PTR(-EINVAL); >> + return -EINVAL; >> } >> >> - return dp_video_config; >> + return 0; >> } >> >> int analogix_dp_bind(struct device *dev, struct drm_device *drm_dev, >> @@ -1205,9 +1244,9 @@ int analogix_dp_bind(struct device *dev, struct drm_device *drm_dev, >> */ >> dp->plat_data = plat_data; >> >> - dp->video_info = analogix_dp_dt_parse_pdata(&pdev->dev); >> - if (IS_ERR(dp->video_info)) >> - return PTR_ERR(dp->video_info); >> + ret = analogix_dp_dt_parse_pdata(dp); >> + if (ret) >> + return ret; >> >> dp->phy = devm_phy_get(dp->dev, "dp"); >> if (IS_ERR(dp->phy)) { >> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h >> index ffabbd0..6e3d5bc 100644 >> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h >> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h >> @@ -154,7 +154,7 @@ struct analogix_dp_device { >> unsigned int irq; >> void __iomem *reg_base; >> >> - struct video_info *video_info; >> + struct video_info video_info; >> struct link_train link_train; >> struct work_struct hotplug_work; >> struct phy *phy; >> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c >> index b879d8c..6a643be 100644 >> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c >> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c >> @@ -1084,15 +1084,15 @@ void analogix_dp_set_video_color_format(struct analogix_dp_device *dp) >> u32 reg; >> >> /* Configure the input color depth, color space, dynamic range */ >> - reg = (dp->video_info->dynamic_range << IN_D_RANGE_SHIFT) | >> - (dp->video_info->color_depth << IN_BPC_SHIFT) | >> - (dp->video_info->color_space << IN_COLOR_F_SHIFT); >> + reg = (dp->video_info.dynamic_range << IN_D_RANGE_SHIFT) | >> + (dp->video_info.color_depth << IN_BPC_SHIFT) | >> + (dp->video_info.color_space << IN_COLOR_F_SHIFT); >> writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_2); >> >> /* Set Input Color YCbCr Coefficients to ITU601 or ITU709 */ >> reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_3); >> reg &= ~IN_YC_COEFFI_MASK; >> - if (dp->video_info->ycbcr_coeff) >> + if (dp->video_info.ycbcr_coeff) >> reg |= IN_YC_COEFFI_ITU709; >> else >> reg |= IN_YC_COEFFI_ITU601; >> @@ -1229,17 +1229,17 @@ void analogix_dp_config_video_slave_mode(struct analogix_dp_device *dp) >> >> reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10); >> reg &= ~INTERACE_SCAN_CFG; >> - reg |= (dp->video_info->interlaced << 2); >> + reg |= (dp->video_info.interlaced << 2); >> writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10); >> >> reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10); >> reg &= ~VSYNC_POLARITY_CFG; >> - reg |= (dp->video_info->v_sync_polarity << 1); >> + reg |= (dp->video_info.v_sync_polarity << 1); >> writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10); >> >> reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10); >> reg &= ~HSYNC_POLARITY_CFG; >> - reg |= (dp->video_info->h_sync_polarity << 0); >> + reg |= (dp->video_info.h_sync_polarity << 0); >> writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10); >> >> reg = AUDIO_MODE_SPDIF_MODE | VIDEO_MODE_SLAVE_MODE; >> diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c >> index 7e1be72..6060d2c 100644 >> --- a/drivers/gpu/drm/exynos/exynos_dp.c >> +++ b/drivers/gpu/drm/exynos/exynos_dp.c >> @@ -28,8 +28,13 @@ >> >> #include "exynos_drm_crtc.h" >> >> -#define plat_data_to_dp(pd) \ >> - container_of(pd, struct exynos_dp_device, plat_data) >> +#define to_dp(nm) container_of(nm, struct exynos_dp_device, nm) >> + >> +struct video_info { >> + bool h_sync_polarity; >> + bool v_sync_polarity; >> + bool interlaced; >> +}; >> >> struct exynos_dp_device { >> struct drm_encoder encoder; >> @@ -39,12 +44,13 @@ struct exynos_dp_device { >> >> struct exynos_drm_panel_info priv; >> struct analogix_dp_plat_data plat_data; >> + struct video_info video_info; >> }; >> >> int exynos_dp_crtc_clock_enable(struct analogix_dp_plat_data *plat_data, >> bool enable) >> { >> - struct exynos_dp_device *dp = plat_data_to_dp(plat_data); >> + struct exynos_dp_device *dp = to_dp(plat_data); >> struct drm_encoder *encoder = &dp->encoder; >> struct exynos_drm_crtc *crtc; >> >> @@ -71,7 +77,7 @@ static int exynos_dp_poweroff(struct analogix_dp_plat_data *plat_data) >> static int exynos_dp_get_modes(struct analogix_dp_plat_data *plat_data, >> struct drm_connector *connector) >> { >> - struct exynos_dp_device *dp = plat_data_to_dp(plat_data); >> + struct exynos_dp_device *dp = to_dp(plat_data); >> struct drm_display_mode *mode; >> >> if (dp->plat_data.panel) >> @@ -99,7 +105,7 @@ static int exynos_dp_get_modes(struct analogix_dp_plat_data *plat_data, >> static int exynos_dp_bridge_attach(struct analogix_dp_plat_data *plat_data, >> struct drm_bridge *bridge) >> { >> - struct exynos_dp_device *dp = plat_data_to_dp(plat_data); >> + struct exynos_dp_device *dp = to_dp(plat_data); >> struct drm_encoder *encoder = &dp->encoder; >> int ret; >> >> @@ -122,6 +128,28 @@ static bool exynos_dp_mode_fixup(struct drm_encoder *encoder, >> const struct drm_display_mode *mode, >> struct drm_display_mode *adjusted_mode) >> { >> + struct exynos_dp_device *dp = to_dp(encoder); >> + int flags = adjusted_mode->flags; >> + >> + flags &= ~(DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NHSYNC | >> + DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_NVSYNC | >> + DRM_MODE_FLAG_INTERLACE); >> + >> + if (dp->video_info.h_sync_polarity) >> + flags |= DRM_MODE_FLAG_PHSYNC; >> + else >> + flags |= DRM_MODE_FLAG_NHSYNC; >> + >> + if (dp->video_info.v_sync_polarity) >> + flags |= DRM_MODE_FLAG_PVSYNC; >> + else >> + flags |= DRM_MODE_FLAG_NVSYNC; >> + >> + if (dp->video_info.interlaced) >> + flags |= DRM_MODE_FLAG_INTERLACE; >> + >> + adjusted_mode->flags = flags; >> + >> return true; >> } >> >> @@ -163,6 +191,22 @@ static int exynos_dp_dt_parse_panel(struct exynos_dp_device *dp) >> return 0; >> } >> >> +static int exynos_dp_dt_parse_video_info(struct exynos_dp_device *dp) >> +{ >> + struct device_node *dp_node = dp->dev->of_node; >> + >> + dp->video_info.h_sync_polarity = >> + of_property_read_bool(dp_node, "hsync-active-high"); >> + >> + dp->video_info.v_sync_polarity = >> + of_property_read_bool(dp_node, "vsync-active-high"); >> + >> + dp->video_info.interlaced = >> + of_property_read_bool(dp_node, "interlaced"); >> + >> + return 0; > Probably you wanted to follow the convention of other DT-parse functions > but there is no need. This function cannot fail so maybe make it void? > It would simplify a bit the code in exynos_dp_bind(). Actually, I found an mistaken here. I have parsed those two property for twice, one is here, the other is analogix_dp_core.c mode_set() function. /* * NOTE: those property parseing code is used for * providing backward compatibility for samsung platform. */ [....] of_property_read_u32(dp_node, "hsync-active-high", (unsigned int *)&video_info->h_sync_polarity); of_property_read_u32(dp_node, "vsync-active-high", (unsigned int *)&video_info->v_sync_polarity); of_property_read_u32(dp_node, "interlaced", (unsigned int *)&video_info->interlaced); And I think it would be easy to code when I achieve the backward compatibility in analogix core driver. So I prefer this way :-) Anyway, thanks, - Yakir > Best regards, > Krzysztof > > > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751348AbbIFCBM (ORCPT ); Sat, 5 Sep 2015 22:01:12 -0400 Received: from lucky1.263xmail.com ([211.157.147.130]:52560 "EHLO lucky1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750893AbbIFCBA (ORCPT ); Sat, 5 Sep 2015 22:01:00 -0400 X-263anti-spam: KSV:0; X-MAIL-GRAY: 1 X-MAIL-DELIVERY: 0 X-KSVirus-check: 0 X-ABS-CHECKED: 4 X-ADDR-CHECKED: 0 X-RL-SENDER: ykk@rock-chips.com X-FST-TO: linux-arm-kernel@lists.infradead.org X-SENDER-IP: 58.22.7.114 X-LOGIN-NAME: ykk@rock-chips.com X-UNIQUE-TAG: <10602fb66facfcdc31794cf917dac12a> X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 Message-ID: <55EB9E49.90000@rock-chips.com> Date: Sun, 06 Sep 2015 10:00:41 +0800 From: Yakir Yang User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0 MIME-Version: 1.0 To: Krzysztof Kozlowski , Heiko Stuebner , Thierry Reding , Jingoo Han , Inki Dae , joe@perches.com, Kukjin Kim , Mark Yao CC: Russell King , djkurtz@chromium.com, dianders@chromium.com, seanpaul@chromium.com, ajaynumb@gmail.com, Andrzej Hajda , Kyungmin Park , David Airlie , Gustavo Padovan , Andy Yan , Kumar Gala , Ian Campbell , Rob Herring , Pawel Moll , Kishon Vijay Abraham I , architt@codeaurora.org, robherring2@gmail.com, dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-samsung-soc@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v4 05/16] drm: bridge: analogix/dp: dynamic parse sync_pol & interlace & colorimetry References: <1441086371-24838-1-git-send-email-ykk@rock-chips.com> <1441086934-25107-1-git-send-email-ykk@rock-chips.com> <55E7FF17.20402@samsung.com> In-Reply-To: <55E7FF17.20402@samsung.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Krzysztof, 在 09/03/2015 04:04 PM, Krzysztof Kozlowski 写道: > On 01.09.2015 14:55, Yakir Yang wrote: >> Both hsync/vsync polarity and interlace mode can be parsed from >> drm display mode, and dynamic_range and ycbcr_coeff can be judge >> by the video code, same to color space and color depth can be >> parsed from EDID. >> >> But presumably Exynos still relaies on the DT properties, so take > s/relaies/relies/ > >> good use of mode_fixup() in to achieve the compatibility hacks. >> >> Signed-off-by: Yakir Yang >> --- >> Changes in v4: >> - Take Krzysztof suggest, provide backword compatibility with samsung. >> - Take Thierry suggest, add "color-depth" and "color-space" dynamic parsed. >> >> Changes in v3: >> - Take Thierry Reding suggest, dynamic parse video timing info from >> struct drm_display_mode and struct drm_display_info. >> >> Changes in v2: None >> >> drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 141 +++++++++++++-------- >> drivers/gpu/drm/bridge/analogix/analogix_dp_core.h | 2 +- >> drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c | 14 +- >> drivers/gpu/drm/exynos/exynos_dp.c | 58 ++++++++- >> 4 files changed, 151 insertions(+), 64 deletions(-) >> >> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c >> index 7196097..f0db92e 100644 >> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c >> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c >> @@ -897,8 +897,8 @@ static void analogix_dp_commit(struct analogix_dp_device *dp) >> return; >> } >> >> - ret = analogix_dp_set_link_train(dp, dp->video_info->lane_count, >> - dp->video_info->link_rate); >> + ret = analogix_dp_set_link_train(dp, dp->video_info.lane_count, >> + dp->video_info.link_rate); >> if (ret) { >> dev_err(dp->dev, "unable to do link train\n"); >> return; >> @@ -1081,6 +1081,82 @@ static void analogix_dp_bridge_disable(struct drm_bridge *bridge) >> dp->dpms_mode = DRM_MODE_DPMS_OFF; >> } >> >> +static void analogix_dp_bridge_mode_set(struct drm_bridge *bridge, >> + struct drm_display_mode *orig_mode, >> + struct drm_display_mode *mode) >> +{ >> + struct analogix_dp_device *dp = bridge->driver_private; >> + struct drm_display_info *display_info = &dp->connector.display_info; >> + struct video_info *video_info = &dp->video_info; >> + struct device_node *dp_node = dp->dev->of_node; >> + int vic; >> + >> + /* interlaces & hsync pol & vsync pol */ >> + video_info->interlaced = !!(mode->flags & DRM_MODE_FLAG_INTERLACE); >> + video_info->v_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NVSYNC); >> + video_info->h_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NHSYNC); >> + >> + /* dynamic_range & colorimetry */ >> + vic = drm_match_cea_mode(mode); >> + if ((vic == 6) || (vic == 7) || (vic == 21) || (vic == 22) || >> + (vic == 2) || (vic == 3) || (vic == 17) || (vic == 18)) { >> + video_info->dynamic_range = CEA; >> + video_info->ycbcr_coeff = COLOR_YCBCR601; >> + } else if (vic) { >> + video_info->dynamic_range = CEA; >> + video_info->ycbcr_coeff = COLOR_YCBCR709; >> + } else { >> + video_info->dynamic_range = VESA; >> + video_info->ycbcr_coeff = COLOR_YCBCR709; >> + } >> + >> + switch (display_info->bpc) { >> + case 12: >> + video_info->color_depth = COLOR_12; >> + break; >> + case 10: >> + video_info->color_depth = COLOR_10; >> + break; >> + case 8: >> + video_info->color_depth = COLOR_8; >> + break; >> + case 6: >> + video_info->color_depth = COLOR_6; >> + break; >> + default: >> + video_info->color_depth = COLOR_8; >> + break; >> + } >> + >> + if (display_info->color_formats | DRM_COLOR_FORMAT_YCRCB444) >> + video_info->color_space = COLOR_YCBCR444; >> + else if (display_info->color_formats | DRM_COLOR_FORMAT_YCRCB422) >> + video_info->color_space = COLOR_YCBCR422; >> + else if (display_info->color_formats | DRM_COLOR_FORMAT_RGB444) >> + video_info->color_space = COLOR_RGB; >> + else >> + video_info->color_space = COLOR_RGB; >> + >> + /* >> + * NOTE: those property parseing code is used for > s/parseing/parsing/ > > BTW, you can easily integrate spell-check to vim... It is not that I > search for such misspellings - they are highlighted... Wow, thanks for your remind, I have set the spell-check now. :) > >> + * providing backward compatibility for samsung platform. >> + */ >> + of_property_read_u32(dp_node, "samsung,color-space", >> + &video_info->color_space); >> + of_property_read_u32(dp_node, "samsung,dynamic-range", >> + &video_info->dynamic_range); >> + of_property_read_u32(dp_node, "samsung,ycbcr-coeff", >> + &video_info->ycbcr_coeff); >> + of_property_read_u32(dp_node, "samsung,color-depth", >> + &video_info->color_depth); >> + of_property_read_u32(dp_node, "hsync-active-high", >> + (unsigned int *)&video_info->h_sync_polarity); >> + of_property_read_u32(dp_node, "vsync-active-high", >> + (unsigned int *)&video_info->v_sync_polarity); >> + of_property_read_u32(dp_node, "interlaced", >> + (unsigned int *)&video_info->interlaced); > You made assumption that the sizeof(bool) is always equal to > sizeof(u32)... Then you cast it to pointer to unsigned int but function > wants pointer to u32. Just for reading boolean property. There's easier > way - of_property_read_bool. It returns bool. Thanks, done. > >> +} >> + >> static void analogix_dp_bridge_nop(struct drm_bridge *bridge) >> { >> /* do nothing */ >> @@ -1091,6 +1167,7 @@ static const struct drm_bridge_funcs analogix_dp_bridge_funcs = { >> .disable = analogix_dp_bridge_disable, >> .pre_enable = analogix_dp_bridge_nop, >> .post_disable = analogix_dp_bridge_nop, >> + .mode_set = analogix_dp_bridge_mode_set, >> .attach = analogix_dp_bridge_attach, >> }; >> >> @@ -1121,62 +1198,24 @@ static int analogix_dp_create_bridge(struct drm_device *drm_dev, >> return 0; >> } >> >> -static struct video_info *analogix_dp_dt_parse_pdata(struct device *dev) >> +static int analogix_dp_dt_parse_pdata(struct analogix_dp_device *dp) >> { >> - struct device_node *dp_node = dev->of_node; >> - struct video_info *dp_video_config; >> - >> - dp_video_config = devm_kzalloc(dev, sizeof(*dp_video_config), >> - GFP_KERNEL); >> - if (!dp_video_config) >> - return ERR_PTR(-ENOMEM); >> - >> - dp_video_config->h_sync_polarity = >> - of_property_read_bool(dp_node, "hsync-active-high"); >> - >> - dp_video_config->v_sync_polarity = >> - of_property_read_bool(dp_node, "vsync-active-high"); >> - >> - dp_video_config->interlaced = >> - of_property_read_bool(dp_node, "interlaced"); >> - >> - if (of_property_read_u32(dp_node, "samsung,color-space", >> - &dp_video_config->color_space)) { >> - dev_err(dev, "failed to get color-space\n"); >> - return ERR_PTR(-EINVAL); >> - } >> - >> - if (of_property_read_u32(dp_node, "samsung,dynamic-range", >> - &dp_video_config->dynamic_range)) { >> - dev_err(dev, "failed to get dynamic-range\n"); >> - return ERR_PTR(-EINVAL); >> - } >> - >> - if (of_property_read_u32(dp_node, "samsung,ycbcr-coeff", >> - &dp_video_config->ycbcr_coeff)) { >> - dev_err(dev, "failed to get ycbcr-coeff\n"); >> - return ERR_PTR(-EINVAL); >> - } >> - >> - if (of_property_read_u32(dp_node, "samsung,color-depth", >> - &dp_video_config->color_depth)) { >> - dev_err(dev, "failed to get color-depth\n"); >> - return ERR_PTR(-EINVAL); >> - } >> + struct device_node *dp_node = dp->dev->of_node; >> + struct video_info *video_config = &dp->video_info; >> >> if (of_property_read_u32(dp_node, "samsung,link-rate", >> - &dp_video_config->link_rate)) { >> + &video_info->link_rate)) { >> dev_err(dev, "failed to get link-rate\n"); >> - return ERR_PTR(-EINVAL); >> + return -EINVAL; >> } >> >> if (of_property_read_u32(dp_node, "samsung,lane-count", >> - &dp_video_config->lane_count)) { >> + &video_info->lane_count)) { >> dev_err(dev, "failed to get lane-count\n"); >> - return ERR_PTR(-EINVAL); >> + return -EINVAL; >> } >> >> - return dp_video_config; >> + return 0; >> } >> >> int analogix_dp_bind(struct device *dev, struct drm_device *drm_dev, >> @@ -1205,9 +1244,9 @@ int analogix_dp_bind(struct device *dev, struct drm_device *drm_dev, >> */ >> dp->plat_data = plat_data; >> >> - dp->video_info = analogix_dp_dt_parse_pdata(&pdev->dev); >> - if (IS_ERR(dp->video_info)) >> - return PTR_ERR(dp->video_info); >> + ret = analogix_dp_dt_parse_pdata(dp); >> + if (ret) >> + return ret; >> >> dp->phy = devm_phy_get(dp->dev, "dp"); >> if (IS_ERR(dp->phy)) { >> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h >> index ffabbd0..6e3d5bc 100644 >> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h >> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h >> @@ -154,7 +154,7 @@ struct analogix_dp_device { >> unsigned int irq; >> void __iomem *reg_base; >> >> - struct video_info *video_info; >> + struct video_info video_info; >> struct link_train link_train; >> struct work_struct hotplug_work; >> struct phy *phy; >> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c >> index b879d8c..6a643be 100644 >> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c >> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c >> @@ -1084,15 +1084,15 @@ void analogix_dp_set_video_color_format(struct analogix_dp_device *dp) >> u32 reg; >> >> /* Configure the input color depth, color space, dynamic range */ >> - reg = (dp->video_info->dynamic_range << IN_D_RANGE_SHIFT) | >> - (dp->video_info->color_depth << IN_BPC_SHIFT) | >> - (dp->video_info->color_space << IN_COLOR_F_SHIFT); >> + reg = (dp->video_info.dynamic_range << IN_D_RANGE_SHIFT) | >> + (dp->video_info.color_depth << IN_BPC_SHIFT) | >> + (dp->video_info.color_space << IN_COLOR_F_SHIFT); >> writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_2); >> >> /* Set Input Color YCbCr Coefficients to ITU601 or ITU709 */ >> reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_3); >> reg &= ~IN_YC_COEFFI_MASK; >> - if (dp->video_info->ycbcr_coeff) >> + if (dp->video_info.ycbcr_coeff) >> reg |= IN_YC_COEFFI_ITU709; >> else >> reg |= IN_YC_COEFFI_ITU601; >> @@ -1229,17 +1229,17 @@ void analogix_dp_config_video_slave_mode(struct analogix_dp_device *dp) >> >> reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10); >> reg &= ~INTERACE_SCAN_CFG; >> - reg |= (dp->video_info->interlaced << 2); >> + reg |= (dp->video_info.interlaced << 2); >> writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10); >> >> reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10); >> reg &= ~VSYNC_POLARITY_CFG; >> - reg |= (dp->video_info->v_sync_polarity << 1); >> + reg |= (dp->video_info.v_sync_polarity << 1); >> writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10); >> >> reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10); >> reg &= ~HSYNC_POLARITY_CFG; >> - reg |= (dp->video_info->h_sync_polarity << 0); >> + reg |= (dp->video_info.h_sync_polarity << 0); >> writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10); >> >> reg = AUDIO_MODE_SPDIF_MODE | VIDEO_MODE_SLAVE_MODE; >> diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c >> index 7e1be72..6060d2c 100644 >> --- a/drivers/gpu/drm/exynos/exynos_dp.c >> +++ b/drivers/gpu/drm/exynos/exynos_dp.c >> @@ -28,8 +28,13 @@ >> >> #include "exynos_drm_crtc.h" >> >> -#define plat_data_to_dp(pd) \ >> - container_of(pd, struct exynos_dp_device, plat_data) >> +#define to_dp(nm) container_of(nm, struct exynos_dp_device, nm) >> + >> +struct video_info { >> + bool h_sync_polarity; >> + bool v_sync_polarity; >> + bool interlaced; >> +}; >> >> struct exynos_dp_device { >> struct drm_encoder encoder; >> @@ -39,12 +44,13 @@ struct exynos_dp_device { >> >> struct exynos_drm_panel_info priv; >> struct analogix_dp_plat_data plat_data; >> + struct video_info video_info; >> }; >> >> int exynos_dp_crtc_clock_enable(struct analogix_dp_plat_data *plat_data, >> bool enable) >> { >> - struct exynos_dp_device *dp = plat_data_to_dp(plat_data); >> + struct exynos_dp_device *dp = to_dp(plat_data); >> struct drm_encoder *encoder = &dp->encoder; >> struct exynos_drm_crtc *crtc; >> >> @@ -71,7 +77,7 @@ static int exynos_dp_poweroff(struct analogix_dp_plat_data *plat_data) >> static int exynos_dp_get_modes(struct analogix_dp_plat_data *plat_data, >> struct drm_connector *connector) >> { >> - struct exynos_dp_device *dp = plat_data_to_dp(plat_data); >> + struct exynos_dp_device *dp = to_dp(plat_data); >> struct drm_display_mode *mode; >> >> if (dp->plat_data.panel) >> @@ -99,7 +105,7 @@ static int exynos_dp_get_modes(struct analogix_dp_plat_data *plat_data, >> static int exynos_dp_bridge_attach(struct analogix_dp_plat_data *plat_data, >> struct drm_bridge *bridge) >> { >> - struct exynos_dp_device *dp = plat_data_to_dp(plat_data); >> + struct exynos_dp_device *dp = to_dp(plat_data); >> struct drm_encoder *encoder = &dp->encoder; >> int ret; >> >> @@ -122,6 +128,28 @@ static bool exynos_dp_mode_fixup(struct drm_encoder *encoder, >> const struct drm_display_mode *mode, >> struct drm_display_mode *adjusted_mode) >> { >> + struct exynos_dp_device *dp = to_dp(encoder); >> + int flags = adjusted_mode->flags; >> + >> + flags &= ~(DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NHSYNC | >> + DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_NVSYNC | >> + DRM_MODE_FLAG_INTERLACE); >> + >> + if (dp->video_info.h_sync_polarity) >> + flags |= DRM_MODE_FLAG_PHSYNC; >> + else >> + flags |= DRM_MODE_FLAG_NHSYNC; >> + >> + if (dp->video_info.v_sync_polarity) >> + flags |= DRM_MODE_FLAG_PVSYNC; >> + else >> + flags |= DRM_MODE_FLAG_NVSYNC; >> + >> + if (dp->video_info.interlaced) >> + flags |= DRM_MODE_FLAG_INTERLACE; >> + >> + adjusted_mode->flags = flags; >> + >> return true; >> } >> >> @@ -163,6 +191,22 @@ static int exynos_dp_dt_parse_panel(struct exynos_dp_device *dp) >> return 0; >> } >> >> +static int exynos_dp_dt_parse_video_info(struct exynos_dp_device *dp) >> +{ >> + struct device_node *dp_node = dp->dev->of_node; >> + >> + dp->video_info.h_sync_polarity = >> + of_property_read_bool(dp_node, "hsync-active-high"); >> + >> + dp->video_info.v_sync_polarity = >> + of_property_read_bool(dp_node, "vsync-active-high"); >> + >> + dp->video_info.interlaced = >> + of_property_read_bool(dp_node, "interlaced"); >> + >> + return 0; > Probably you wanted to follow the convention of other DT-parse functions > but there is no need. This function cannot fail so maybe make it void? > It would simplify a bit the code in exynos_dp_bind(). Actually, I found an mistaken here. I have parsed those two property for twice, one is here, the other is analogix_dp_core.c mode_set() function. /* * NOTE: those property parseing code is used for * providing backward compatibility for samsung platform. */ [....] of_property_read_u32(dp_node, "hsync-active-high", (unsigned int *)&video_info->h_sync_polarity); of_property_read_u32(dp_node, "vsync-active-high", (unsigned int *)&video_info->v_sync_polarity); of_property_read_u32(dp_node, "interlaced", (unsigned int *)&video_info->interlaced); And I think it would be easy to code when I achieve the backward compatibility in analogix core driver. So I prefer this way :-) Anyway, thanks, - Yakir > Best regards, > Krzysztof > > >