From mboxrd@z Thu Jan 1 00:00:00 1970 From: Inki Dae Subject: Re: [PATCH v8 2/3] drm/panel: Add support for S6E3HA2 panel driver on TM2 board Date: Tue, 31 Jan 2017 09:01:07 +0900 Message-ID: <588FD3C3.7080508@samsung.com> References: <1484116439-7275-1-git-send-email-hoegeun.kwon@samsung.com> <1484116439-7275-3-git-send-email-hoegeun.kwon@samsung.com> <08c5d94b-c76f-af14-c08f-478e26a34a7c@samsung.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-reply-to: <08c5d94b-c76f-af14-c08f-478e26a34a7c@samsung.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Hoegeun Kwon , thierry.reding@gmail.com Cc: linux-samsung-soc@vger.kernel.org, cw00.choi@samsung.com, andi.shyti@samsung.com, devicetree@vger.kernel.org, Donghwa Lee , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, jh80.chung@samsung.com, kgene@kernel.org, Krzysztof Kozlowski , Hyungwon Hwang List-Id: linux-samsung-soc@vger.kernel.org CgoyMDE364WEIDAx7JuUIDI07J28IDEwOjUw7JeQIEhvZWdldW4gS3dvbiDsnbQo6rCAKSDsk7Qg 6riAOgo+IERlYXIgVGhpZXJyeSwKPiAKPiBDb3VsZCB5b3UgcGxlYXNlIHJldmlldyB0aGlzIHBh dGNoPwoKVGhpZXJyeSwgSSB0aGluayB0aGlzIHBhdGNoIGhhcyBiZWVuIHJldmlld2VkIGVub3Vn aCBidXQgbm8gY29tbWVudCBmcm9tIHlvdS4gU2VlbXMgeW91IGFyZSBidXN5LiBJIHdpbGwgcGlj ayB1cCB0aGlzLgoKVGhhbmtzLgoKPiAKPiBCZXN0IFJlZ2FyZHMsCj4gSG9lZ2V1biBLd29uCj4g Cj4gT24gMDEvMTEvMjAxNyAwMzozMyBQTSwgSG9lZ2V1biBLd29uIHdyb3RlOgo+PiBUaGlzIHBh dGNoIGFkZCBzdXBwb3J0IGZvciBNSVBJLURTSSBiYXNlZCBTNkUzSEEyIEFNT0xFRCBwYW5lbAo+ PiBkcml2ZXIuIFRoaXMgcGFuZWwgaGFzIDE0NDB4MjU2MCByZXNvbHV0aW9uIGluIDUuNy1pbmNo IHBoeXNpY2FsCj4+IHBhbmVsIGluIHRoZSBUTTIgZGV2aWNlLgo+Pgo+PiBTaWduZWQtb2ZmLWJ5 OiBEb25naHdhIExlZSA8ZGgwOS5sZWVAc2Ftc3VuZy5jb20+Cj4+IFNpZ25lZC1vZmYtYnk6IEh5 dW5nd29uIEh3YW5nIDxodW1hbi5od2FuZ0BzYW1zdW5nLmNvbT4KPj4gU2lnbmVkLW9mZi1ieTog SG9lZ2V1biBLd29uIDxob2VnZXVuLmt3b25Ac2Ftc3VuZy5jb20+Cj4+IFRlc3RlZC1ieTogQ2hh bndvbyBDaG9pIDxjdzAwLmNob2lAc2Ftc3VuZy5jb20+Cj4+IFJldmlld2VkLWJ5OiBBbmRyemVq IEhhamRhIDxhLmhhamRhQHNhbXN1bmcuY29tPgo+PiAtLS0KPj4gICBkcml2ZXJzL2dwdS9kcm0v cGFuZWwvS2NvbmZpZyAgICAgICAgICAgICAgICAgfCAgIDYgKwo+PiAgIGRyaXZlcnMvZ3B1L2Ry bS9wYW5lbC9NYWtlZmlsZSAgICAgICAgICAgICAgICB8ICAgMSArCj4+ICAgZHJpdmVycy9ncHUv ZHJtL3BhbmVsL3BhbmVsLXNhbXN1bmctczZlM2hhMi5jIHwgNzU0ICsrKysrKysrKysrKysrKysr KysrKysrKysrCj4+ICAgMyBmaWxlcyBjaGFuZ2VkLCA3NjEgaW5zZXJ0aW9ucygrKQo+PiAgIGNy ZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vcGFuZWwvcGFuZWwtc2Ftc3VuZy1zNmUz aGEyLmMKPj4KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9LY29uZmlnIGIv ZHJpdmVycy9ncHUvZHJtL3BhbmVsL0tjb25maWcKPj4gaW5kZXggNjJhYmE5Ny4uZDkxM2M4MyAx MDA2NDQKPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3BhbmVsL0tjb25maWcKPj4gKysrIGIvZHJp dmVycy9ncHUvZHJtL3BhbmVsL0tjb25maWcKPj4gQEAgLTUyLDYgKzUyLDEyIEBAIGNvbmZpZyBE Uk1fUEFORUxfUEFOQVNPTklDX1ZWWDEwRjAzNE4wMAo+PiAgICAgICAgIFdVWEdBICgxOTIweDEy MDApIE5vdmF0ZWsgTlQxMzk3LWJhc2VkIERTSSBwYW5lbCBhcyBmb3VuZCBpbiBzb21lCj4+ICAg ICAgICAgWHBlcmlhIFoyIHRhYmxldHMKPj4gICArY29uZmlnIERSTV9QQU5FTF9TQU1TVU5HX1M2 RTNIQTIKPj4gKyAgICB0cmlzdGF0ZSAiU2Ftc3VuZyBTNkUzSEEyIERTSSB2aWRlbyBtb2RlIHBh bmVsIgo+PiArICAgIGRlcGVuZHMgb24gT0YKPj4gKyAgICBkZXBlbmRzIG9uIERSTV9NSVBJX0RT SQo+PiArICAgIHNlbGVjdCBWSURFT01PREVfSEVMUEVSUwo+PiArCj4+ICAgY29uZmlnIERSTV9Q QU5FTF9TQU1TVU5HX1M2RThBQTAKPj4gICAgICAgdHJpc3RhdGUgIlNhbXN1bmcgUzZFOEFBMCBE U0kgdmlkZW8gbW9kZSBwYW5lbCIKPj4gICAgICAgZGVwZW5kcyBvbiBPRgo+PiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL3BhbmVsL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL3BhbmVs L01ha2VmaWxlCj4+IGluZGV4IGE1YzdlYzAuLjFkNDgzYjAgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZl cnMvZ3B1L2RybS9wYW5lbC9NYWtlZmlsZQo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vcGFuZWwv TWFrZWZpbGUKPj4gQEAgLTMsNiArMyw3IEBAIG9iai0kKENPTkZJR19EUk1fUEFORUxfSkRJX0xU MDcwTUUwNTAwMCkgKz0gcGFuZWwtamRpLWx0MDcwbWUwNTAwMC5vCj4+ICAgb2JqLSQoQ09ORklH X0RSTV9QQU5FTF9MR19MRzQ1NzMpICs9IHBhbmVsLWxnLWxnNDU3My5vCj4+ICAgb2JqLSQoQ09O RklHX0RSTV9QQU5FTF9QQU5BU09OSUNfVlZYMTBGMDM0TjAwKSArPSBwYW5lbC1wYW5hc29uaWMt dnZ4MTBmMDM0bjAwLm8KPj4gICBvYmotJChDT05GSUdfRFJNX1BBTkVMX1NBTVNVTkdfTEQ5MDQw KSArPSBwYW5lbC1zYW1zdW5nLWxkOTA0MC5vCj4+ICtvYmotJChDT05GSUdfRFJNX1BBTkVMX1NB TVNVTkdfUzZFM0hBMikgKz0gcGFuZWwtc2Ftc3VuZy1zNmUzaGEyLm8KPj4gICBvYmotJChDT05G SUdfRFJNX1BBTkVMX1NBTVNVTkdfUzZFOEFBMCkgKz0gcGFuZWwtc2Ftc3VuZy1zNmU4YWEwLm8K Pj4gICBvYmotJChDT05GSUdfRFJNX1BBTkVMX1NIQVJQX0xRMTAxUjFTWDAxKSArPSBwYW5lbC1z aGFycC1scTEwMXIxc3gwMS5vCj4+ICAgb2JqLSQoQ09ORklHX0RSTV9QQU5FTF9TSEFSUF9MUzA0 M1QxTEUwMSkgKz0gcGFuZWwtc2hhcnAtbHMwNDN0MWxlMDEubwo+PiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL3BhbmVsL3BhbmVsLXNhbXN1bmctczZlM2hhMi5jIGIvZHJpdmVycy9ncHUv ZHJtL3BhbmVsL3BhbmVsLXNhbXN1bmctczZlM2hhMi5jCj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0 Cj4+IGluZGV4IDAwMDAwMDAuLjBiOWM2ZjQKPj4gLS0tIC9kZXYvbnVsbAo+PiArKysgYi9kcml2 ZXJzL2dwdS9kcm0vcGFuZWwvcGFuZWwtc2Ftc3VuZy1zNmUzaGEyLmMKPj4gQEAgLTAsMCArMSw3 NTQgQEAKPj4gKy8qCj4+ICsgKiBNSVBJLURTSSBiYXNlZCBzNmUzaGEyIEFNT0xFRCA1LjcgaW5j aCBwYW5lbCBkcml2ZXIuCj4+ICsgKgo+PiArICogQ29weXJpZ2h0IChjKSAyMDE2IFNhbXN1bmcg RWxlY3Ryb25pY3MgQ28uLCBMdGQuCj4+ICsgKiBEb25naHdhIExlZSA8ZGgwOS5sZWVAc2Ftc3Vu Zy5jb20+Cj4+ICsgKiBIeXVuZ3dvbiBId2FuZyA8aHVtYW4uaHdhbmdAc2Ftc3VuZy5jb20+Cj4+ ICsgKiBIb2VnZXVuIEt3b24gPGhvZWdldW4ua3dvbkBzYW1zdW5nLmNvbT4KPj4gKyAqCj4+ICsg KiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg YW5kL29yIG1vZGlmeQo+PiArICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKPj4gKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgo+PiArICovCj4+ICsKPj4gKyNpbmNsdWRlIDxkcm0vZHJt UC5oPgo+PiArI2luY2x1ZGUgPGRybS9kcm1fbWlwaV9kc2kuaD4KPj4gKyNpbmNsdWRlIDxkcm0v ZHJtX3BhbmVsLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+Cj4+ICsjaW5jbHVk ZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9j b25zdW1lci5oPgo+PiArCj4+ICsjZGVmaW5lIFM2RTNIQTJfTUlOX0JSSUdIVE5FU1MgICAgICAg IDAKPj4gKyNkZWZpbmUgUzZFM0hBMl9NQVhfQlJJR0hUTkVTUyAgICAgICAgMTAwCj4+ICsjZGVm aW5lIFM2RTNIQTJfREVGQVVMVF9CUklHSFRORVNTICAgIDgwCj4+ICsKPj4gKyNkZWZpbmUgUzZF M0hBMl9OVU1fR0FNTUFfU1RFUFMgICAgICAgIDQ2Cj4+ICsjZGVmaW5lIFM2RTNIQTJfR0FNTUFf Q01EX0NOVCAgICAgICAgMzUKPj4gKyNkZWZpbmUgUzZFM0hBMl9WSU5UX1NUQVRVU19NQVggICAg ICAgIDEwCj4+ICsKPj4gK3N0YXRpYyBjb25zdCB1OCBnYW1tYV90YmxbUzZFM0hBMl9OVU1fR0FN TUFfU1RFUFNdW1M2RTNIQTJfR0FNTUFfQ01EX0NOVF0gPSB7Cj4+ICsgICAgeyAweDAwLCAweGI4 LCAweDAwLCAweGMzLCAweDAwLCAweGIxLCAweDg5LCAweDg3LCAweDg3LCAweDgyLCAweDgzLAo+ PiArICAgICAgMHg4NSwgMHg4OCwgMHg4YiwgMHg4YiwgMHg4NCwgMHg4OCwgMHg4MiwgMHg4Miwg MHg4OSwgMHg4NiwgMHg4YywKPj4gKyAgICAgIDB4OTQsIDB4ODQsIDB4YjEsIDB4YWYsIDB4OGUs IDB4Y2YsIDB4YWQsIDB4YzksIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAw IH0sCj4+ICsgICAgeyAweDAwLCAweGI4LCAweDAwLCAweGMzLCAweDAwLCAweGIxLCAweDg5LCAw eDg3LCAweDg3LCAweDg0LCAweDg0LAo+PiArICAgICAgMHg4NSwgMHg4NywgMHg4YiwgMHg4YSwg MHg4NCwgMHg4OCwgMHg4MiwgMHg4MiwgMHg4OSwgMHg4NiwgMHg4YSwKPj4gKyAgICAgIDB4OTMs IDB4ODQsIDB4YjAsIDB4YWUsIDB4OGUsIDB4YzksIDB4YTgsIDB4YzUsIDB4MDAsIDB4MDAsIDB4 MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGI4LCAweDAwLCAw eGMzLCAweDAwLCAweGIxLCAweDg5LCAweDg3LCAweDg3LCAweDgzLCAweDgzLAo+PiArICAgICAg MHg4NSwgMHg4NiwgMHg4YSwgMHg4YSwgMHg4NCwgMHg4OCwgMHg4MSwgMHg4NCwgMHg4YSwgMHg4 OCwgMHg4YSwKPj4gKyAgICAgIDB4OTEsIDB4ODQsIDB4YjEsIDB4YWUsIDB4OGIsIDB4ZDUsIDB4 YjIsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsg ICAgeyAweDAwLCAweGI4LCAweDAwLCAweGMzLCAweDAwLCAweGIxLCAweDg5LCAweDg3LCAweDg3 LCAweDgzLCAweDgzLAo+PiArICAgICAgMHg4NSwgMHg4NiwgMHg4YSwgMHg4YSwgMHg4NCwgMHg4 NywgMHg4MSwgMHg4NCwgMHg4YSwgMHg4NywgMHg4YSwKPj4gKyAgICAgIDB4OTEsIDB4ODUsIDB4 YWUsIDB4YWMsIDB4OGEsIDB4YzMsIDB4YTMsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsg ICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGI4LCAweDAwLCAweGMzLCAweDAw LCAweGIxLCAweDg4LCAweDg2LCAweDg3LCAweDg1LCAweDg1LAo+PiArICAgICAgMHg4NiwgMHg4 NSwgMHg4OCwgMHg4OSwgMHg4NCwgMHg4OSwgMHg4MiwgMHg4NCwgMHg4NywgMHg4NSwgMHg4YiwK Pj4gKyAgICAgIDB4OTEsIDB4ODgsIDB4YWQsIDB4YWIsIDB4OGEsIDB4YjcsIDB4OWIsIDB4YjYs IDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAw LCAweGI4LCAweDAwLCAweGMzLCAweDAwLCAweGIxLCAweDg5LCAweDg3LCAweDg3LCAweDgzLCAw eDgzLAo+PiArICAgICAgMHg4NSwgMHg4NiwgMHg4OSwgMHg4YSwgMHg4NCwgMHg4OSwgMHg4Mywg MHg4MywgMHg4NiwgMHg4NCwgMHg4YiwKPj4gKyAgICAgIDB4OTAsIDB4ODQsIDB4YjAsIDB4YWUs IDB4OGIsIDB4Y2UsIDB4YWQsIDB4YzgsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAw LCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGI4LCAweDAwLCAweGMzLCAweDAwLCAweGIxLCAw eDg5LCAweDg3LCAweDg3LCAweDgzLCAweDgzLAo+PiArICAgICAgMHg4NSwgMHg4NywgMHg4OSwg MHg4YSwgMHg4MywgMHg4NywgMHg4MiwgMHg4NSwgMHg4OCwgMHg4NywgMHg4OSwKPj4gKyAgICAg IDB4OGYsIDB4ODQsIDB4YWMsIDB4YWEsIDB4ODksIDB4YjEsIDB4OTgsIDB4YWYsIDB4MDAsIDB4 MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGI4LCAw eDAwLCAweGMzLCAweDAwLCAweGIxLCAweDg5LCAweDg3LCAweDg3LCAweDgzLCAweDgzLAo+PiAr ICAgICAgMHg4NSwgMHg4NiwgMHg4OCwgMHg4OSwgMHg4NCwgMHg4OCwgMHg4MywgMHg4MiwgMHg4 NSwgMHg4NCwgMHg4YywKPj4gKyAgICAgIDB4OTEsIDB4ODYsIDB4YWMsIDB4YWEsIDB4ODksIDB4 YzIsIDB4YTUsIDB4YmQsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0s Cj4+ICsgICAgeyAweDAwLCAweGI4LCAweDAwLCAweGMzLCAweDAwLCAweGIxLCAweDg4LCAweDg2 LCAweDg3LCAweDg0LCAweDg0LAo+PiArICAgICAgMHg4NSwgMHg4NywgMHg4OSwgMHg4YSwgMHg4 MywgMHg4NywgMHg4MiwgMHg4NSwgMHg4OCwgMHg4NywgMHg4OCwKPj4gKyAgICAgIDB4OGIsIDB4 ODIsIDB4YWQsIDB4YWEsIDB4OGEsIDB4YzIsIDB4YTUsIDB4YmQsIDB4MDAsIDB4MDAsIDB4MDAs Cj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGI4LCAweDAwLCAweGMz LCAweDAwLCAweGIxLCAweDg5LCAweDg3LCAweDg3LCAweDgzLCAweDgzLAo+PiArICAgICAgMHg4 NSwgMHg4NiwgMHg4NywgMHg4OSwgMHg4NCwgMHg4OCwgMHg4MywgMHg4MiwgMHg4NSwgMHg4NCwg MHg4YSwKPj4gKyAgICAgIDB4OGUsIDB4ODQsIDB4YWUsIDB4YWMsIDB4ODksIDB4ZGEsIDB4Yjcs IDB4ZDAsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAg eyAweDAwLCAweGI4LCAweDAwLCAweGMzLCAweDAwLCAweGIxLCAweDg4LCAweDg2LCAweDg3LCAw eDg0LCAweDg0LAo+PiArICAgICAgMHg4NSwgMHg4NiwgMHg4NywgMHg4OSwgMHg4NCwgMHg4OCwg MHg4MywgMHg4MCwgMHg4MywgMHg4MiwgMHg4YiwKPj4gKyAgICAgIDB4OGUsIDB4ODUsIDB4YWMs IDB4YWEsIDB4ODksIDB4YzgsIDB4YWEsIDB4YzEsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAg ICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGI4LCAweDAwLCAweGMzLCAweDAwLCAw eGIxLCAweDg4LCAweDg2LCAweDg3LCAweDg0LCAweDg0LAo+PiArICAgICAgMHg4NSwgMHg4Niwg MHg4NywgMHg4OSwgMHg4MSwgMHg4NSwgMHg4MSwgMHg4NCwgMHg4NiwgMHg4NCwgMHg4YywKPj4g KyAgICAgIDB4OGMsIDB4ODQsIDB4YTksIDB4YTgsIDB4ODcsIDB4YTMsIDB4OTIsIDB4YTEsIDB4 MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAw eGI4LCAweDAwLCAweGMzLCAweDAwLCAweGIxLCAweDg4LCAweDg2LCAweDg3LCAweDg0LCAweDg0 LAo+PiArICAgICAgMHg4NSwgMHg4NiwgMHg4NywgMHg4OSwgMHg4NCwgMHg4NiwgMHg4MywgMHg4 MCwgMHg4MywgMHg4MSwgMHg4YywKPj4gKyAgICAgIDB4OGQsIDB4ODQsIDB4YWEsIDB4YWEsIDB4 ODksIDB4Y2UsIDB4YWYsIDB4YzUsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAw eDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGI4LCAweDAwLCAweGMzLCAweDAwLCAweGIxLCAweDg4 LCAweDg2LCAweDg3LCAweDg0LCAweDg0LAo+PiArICAgICAgMHg4NSwgMHg4NiwgMHg4NywgMHg4 OSwgMHg4MSwgMHg4MywgMHg4MCwgMHg4MywgMHg4NSwgMHg4NSwgMHg4YywKPj4gKyAgICAgIDB4 OGMsIDB4ODQsIDB4YTgsIDB4YTgsIDB4ODgsIDB4YjUsIDB4OWYsIDB4YjAsIDB4MDAsIDB4MDAs IDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGI4LCAweDAw LCAweGMzLCAweDAwLCAweGIxLCAweDg4LCAweDg2LCAweDg3LCAweDg0LCAweDg0LAo+PiArICAg ICAgMHg4NiwgMHg4NiwgMHg4NywgMHg4OCwgMHg4MSwgMHg4MywgMHg4MCwgMHg4MywgMHg4NSwg MHg4NSwgMHg4YywKPj4gKyAgICAgIDB4OGIsIDB4ODQsIDB4YWIsIDB4YTgsIDB4ODYsIDB4ZDQs IDB4YjQsIDB4YzksIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ ICsgICAgeyAweDAwLCAweGI4LCAweDAwLCAweGMzLCAweDAwLCAweGIxLCAweDg4LCAweDg2LCAw eDg3LCAweDg0LCAweDg0LAo+PiArICAgICAgMHg4NiwgMHg4NiwgMHg4NywgMHg4OCwgMHg4MSwg MHg4MywgMHg4MCwgMHg4NCwgMHg4NCwgMHg4NSwgMHg4YiwKPj4gKyAgICAgIDB4OGEsIDB4ODMs IDB4YTYsIDB4YTUsIDB4ODQsIDB4YmIsIDB4YTQsIDB4YjMsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGI4LCAweDAwLCAweGMzLCAw eDAwLCAweGIxLCAweDg4LCAweDg2LCAweDg3LCAweDg0LCAweDg0LAo+PiArICAgICAgMHg4Niwg MHg4NSwgMHg4NiwgMHg4NiwgMHg4MiwgMHg4NSwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4 ZSwKPj4gKyAgICAgIDB4OGIsIDB4ODMsIDB4YTQsIDB4YTMsIDB4OGEsIDB4YTEsIDB4OTMsIDB4 OWQsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAw eDAwLCAweGI4LCAweDAwLCAweGMzLCAweDAwLCAweGIxLCAweDg4LCAweDg2LCAweDg3LCAweDgz LCAweDgzLAo+PiArICAgICAgMHg4NSwgMHg4NiwgMHg4NywgMHg4NywgMHg4MiwgMHg4NSwgMHg4 MSwgMHg4MiwgMHg4MiwgMHg4NCwgMHg4ZSwKPj4gKyAgICAgIDB4OGIsIDB4ODMsIDB4YTQsIDB4 YTIsIDB4ODYsIDB4YzEsIDB4YTksIDB4YjcsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAw eDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGI4LCAweDAwLCAweGMzLCAweDAwLCAweGIx LCAweDg4LCAweDg2LCAweDg3LCAweDgzLCAweDgzLAo+PiArICAgICAgMHg4NSwgMHg4NiwgMHg4 NywgMHg4NywgMHg4MiwgMHg4NSwgMHg4MSwgMHg4MiwgMHg4MiwgMHg4NCwgMHg4ZCwKPj4gKyAg ICAgIDB4ODksIDB4ODIsIDB4YTIsIDB4YTEsIDB4ODQsIDB4YTcsIDB4OTgsIDB4YTEsIDB4MDAs IDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGI4 LCAweDAwLCAweGMzLCAweDAwLCAweGIxLCAweDg4LCAweDg2LCAweDg3LCAweDgzLCAweDgzLAo+ PiArICAgICAgMHg4NSwgMHg4NiwgMHg4NywgMHg4NywgMHg4MiwgMHg4NSwgMHg4MSwgMHg4Mywg MHg4MywgMHg4NSwgMHg4YywKPj4gKyAgICAgIDB4ODcsIDB4N2YsIDB4YTIsIDB4OWQsIDB4ODgs IDB4OGQsIDB4ODgsIDB4OGIsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAw IH0sCj4+ICsgICAgeyAweDAwLCAweGJiLCAweDAwLCAweGM1LCAweDAwLCAweGI0LCAweDg3LCAw eDg2LCAweDg2LCAweDg0LCAweDgzLAo+PiArICAgICAgMHg4NiwgMHg4NywgMHg4NywgMHg4Nywg MHg4MCwgMHg4MiwgMHg3ZiwgMHg4NiwgMHg4NiwgMHg4OCwgMHg4YSwKPj4gKyAgICAgIDB4ODQs IDB4N2UsIDB4OWQsIDB4OWMsIDB4ODIsIDB4OGQsIDB4ODgsIDB4OGIsIDB4MDAsIDB4MDAsIDB4 MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGJkLCAweDAwLCAw eGM3LCAweDAwLCAweGI3LCAweDg3LCAweDg1LCAweDg1LCAweDg0LCAweDgzLAo+PiArICAgICAg MHg4NiwgMHg4NiwgMHg4NiwgMHg4OCwgMHg4MSwgMHg4MywgMHg4MCwgMHg4MywgMHg4NCwgMHg4 NSwgMHg4YSwKPj4gKyAgICAgIDB4ODUsIDB4N2UsIDB4OWMsIDB4OWIsIDB4ODUsIDB4ODAsIDB4 ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsg ICAgeyAweDAwLCAweGMwLCAweDAwLCAweGNhLCAweDAwLCAweGJiLCAweDg3LCAweDg2LCAweDg1 LCAweDgzLCAweDgzLAo+PiArICAgICAgMHg4NSwgMHg4NiwgMHg4NiwgMHg4OCwgMHg4MSwgMHg4 MywgMHg4MCwgMHg4NCwgMHg4NSwgMHg4NiwgMHg4OSwKPj4gKyAgICAgIDB4ODMsIDB4N2QsIDB4 OWMsIDB4OTksIDB4ODcsIDB4N2IsIDB4N2IsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsg ICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGM0LCAweDAwLCAweGNkLCAweDAw LCAweGJlLCAweDg3LCAweDg2LCAweDg1LCAweDgzLCAweDgzLAo+PiArICAgICAgMHg4NiwgMHg4 NSwgMHg4NSwgMHg4NywgMHg4MSwgMHg4MiwgMHg4MCwgMHg4MiwgMHg4MiwgMHg4MywgMHg4YSwK Pj4gKyAgICAgIDB4ODUsIDB4N2YsIDB4OWYsIDB4OWIsIDB4ODYsIDB4YjQsIDB4YTEsIDB4YWMs IDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAw LCAweGM3LCAweDAwLCAweGQwLCAweDAwLCAweGMyLCAweDg3LCAweDg1LCAweDg1LCAweDgzLCAw eDgyLAo+PiArICAgICAgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NiwgMHg4MiwgMHg4MywgMHg4MCwg MHg4MiwgMHg4MiwgMHg4NCwgMHg4NywKPj4gKyAgICAgIDB4ODYsIDB4ODAsIDB4OWUsIDB4OWEs IDB4ODcsIDB4YTcsIDB4OTgsIDB4YTEsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAw LCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGNhLCAweDAwLCAweGQyLCAweDAwLCAweGM1LCAw eDg3LCAweDg1LCAweDg0LCAweDgyLCAweDgyLAo+PiArICAgICAgMHg4NCwgMHg4NSwgMHg4NSwg MHg4NiwgMHg4MSwgMHg4MiwgMHg3ZiwgMHg4MiwgMHg4MiwgMHg4NCwgMHg4OCwKPj4gKyAgICAg IDB4ODYsIDB4ODEsIDB4OWQsIDB4OTgsIDB4ODYsIDB4OGQsIDB4ODgsIDB4OGIsIDB4MDAsIDB4 MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGNlLCAw eDAwLCAweGQ2LCAweDAwLCAweGNhLCAweDg2LCAweDg1LCAweDg0LCAweDgzLCAweDgzLAo+PiAr ICAgICAgMHg4NSwgMHg4NCwgMHg4NCwgMHg4NSwgMHg4MSwgMHg4MiwgMHg4MCwgMHg4MSwgMHg4 MSwgMHg4MiwgMHg4OSwKPj4gKyAgICAgIDB4ODYsIDB4ODEsIDB4OWMsIDB4OTcsIDB4ODYsIDB4 YTcsIDB4OTgsIDB4YTEsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0s Cj4+ICsgICAgeyAweDAwLCAweGQxLCAweDAwLCAweGQ5LCAweDAwLCAweGNlLCAweDg2LCAweDg0 LCAweDgzLCAweDgzLCAweDgyLAo+PiArICAgICAgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NiwgMHg4 MSwgMHg4MywgMHg4MSwgMHg4MiwgMHg4MiwgMHg4MywgMHg4NiwKPj4gKyAgICAgIDB4ODMsIDB4 N2YsIDB4OTksIDB4OTUsIDB4ODYsIDB4YmIsIDB4YTQsIDB4YjMsIDB4MDAsIDB4MDAsIDB4MDAs Cj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGQ0LCAweDAwLCAweGRi LCAweDAwLCAweGQxLCAweDg2LCAweDg1LCAweDgzLCAweDgzLCAweDgyLAo+PiArICAgICAgMHg4 NSwgMHg4NCwgMHg4NCwgMHg4NSwgMHg4MCwgMHg4MywgMHg4MiwgMHg4MCwgMHg4MCwgMHg4MSwg MHg4NywKPj4gKyAgICAgIDB4ODQsIDB4ODEsIDB4OTgsIDB4OTMsIDB4ODUsIDB4YWUsIDB4OWMs IDB4YTgsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAg eyAweDAwLCAweGQ4LCAweDAwLCAweGRlLCAweDAwLCAweGQ2LCAweDg2LCAweDg0LCAweDgzLCAw eDgxLCAweDgxLAo+PiArICAgICAgMHg4MywgMHg4NSwgMHg4NSwgMHg4NSwgMHg4MiwgMHg4Mywg MHg4MSwgMHg4MSwgMHg4MSwgMHg4MywgMHg4NiwKPj4gKyAgICAgIDB4ODQsIDB4ODAsIDB4OTgs IDB4OTEsIDB4ODUsIDB4N2IsIDB4N2IsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAg ICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGRjLCAweDAwLCAweGUyLCAweDAwLCAw eGRhLCAweDg1LCAweDg0LCAweDgzLCAweDgyLCAweDgyLAo+PiArICAgICAgMHg4NCwgMHg4NCwg MHg4NCwgMHg4NSwgMHg4MSwgMHg4MiwgMHg4MiwgMHg4MCwgMHg4MCwgMHg4MSwgMHg4MywKPj4g KyAgICAgIDB4ODIsIDB4N2YsIDB4OTksIDB4OTMsIDB4ODYsIDB4OTQsIDB4OGIsIDB4OTIsIDB4 MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAw eGRmLCAweDAwLCAweGU1LCAweDAwLCAweGRlLCAweDg1LCAweDg0LCAweDgyLCAweDgyLCAweDgy LAo+PiArICAgICAgMHg4NCwgMHg4MywgMHg4MywgMHg4NCwgMHg4MSwgMHg4MSwgMHg4MCwgMHg4 MywgMHg4MiwgMHg4NCwgMHg4MiwKPj4gKyAgICAgIDB4ODEsIDB4N2YsIDB4OTksIDB4OTIsIDB4 ODYsIDB4N2IsIDB4N2IsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAw eDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGU0LCAweDAwLCAweGU5LCAweDAwLCAweGUzLCAweDg0 LCAweDgzLCAweDgyLCAweDgxLCAweDgxLAo+PiArICAgICAgMHg4MiwgMHg4MywgMHg4MywgMHg4 NCwgMHg4MCwgMHg4MSwgMHg4MCwgMHg4MywgMHg4MywgMHg4NCwgMHg4MCwKPj4gKyAgICAgIDB4 ODEsIDB4N2MsIDB4OTksIDB4OTIsIDB4ODcsIDB4YTEsIDB4OTMsIDB4OWQsIDB4MDAsIDB4MDAs IDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGU0LCAweDAw LCAweGU5LCAweDAwLCAweGUzLCAweDg1LCAweDg0LCAweDgzLCAweDgxLCAweDgxLAo+PiArICAg ICAgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MywgMHg4MCwgMHg4MSwgMHg4MCwgMHg4MSwgMHg4MCwg MHg4MiwgMHg4MywKPj4gKyAgICAgIDB4ODIsIDB4ODAsIDB4OTEsIDB4OGQsIDB4ODMsIDB4OWEs IDB4OTAsIDB4OTYsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ ICsgICAgeyAweDAwLCAweGU0LCAweDAwLCAweGU5LCAweDAwLCAweGUzLCAweDg0LCAweDgzLCAw eDgyLCAweDgxLCAweDgxLAo+PiArICAgICAgMHg4MiwgMHg4MywgMHg4MywgMHg4NCwgMHg4MCwg MHg4MSwgMHg4MCwgMHg4MSwgMHg4MCwgMHg4MiwgMHg4MywKPj4gKyAgICAgIDB4ODEsIDB4N2Ys IDB4OTEsIDB4OGMsIDB4ODIsIDB4OGQsIDB4ODgsIDB4OGIsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGU0LCAweDAwLCAweGU5LCAw eDAwLCAweGUzLCAweDg0LCAweDgzLCAweDgyLCAweDgxLCAweDgxLAo+PiArICAgICAgMHg4Miwg MHg4MywgMHg4MywgMHg4MywgMHg4MiwgMHg4MiwgMHg4MSwgMHg4MSwgMHg4MCwgMHg4MiwgMHg4 MiwKPj4gKyAgICAgIDB4ODIsIDB4N2YsIDB4OTQsIDB4ODksIDB4ODQsIDB4ODAsIDB4ODAsIDB4 ODAsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAw eDAwLCAweGU0LCAweDAwLCAweGU5LCAweDAwLCAweGUzLCAweDg0LCAweDgzLCAweDgyLCAweDgx LCAweDgxLAo+PiArICAgICAgMHg4MiwgMHg4MywgMHg4MywgMHg4MywgMHg4MiwgMHg4MiwgMHg4 MSwgMHg4MSwgMHg4MCwgMHg4MiwgMHg4MywKPj4gKyAgICAgIDB4ODIsIDB4N2YsIDB4OTEsIDB4 ODUsIDB4ODEsIDB4ODAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAw eDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGU0LCAweDAwLCAweGU5LCAweDAwLCAweGUz LCAweDg0LCAweDgzLCAweDgyLCAweDgxLCAweDgxLAo+PiArICAgICAgMHg4MiwgMHg4MywgMHg4 MywgMHg4MywgMHg4MCwgMHg4MCwgMHg3ZiwgMHg4MywgMHg4MiwgMHg4NCwgMHg4MywKPj4gKyAg ICAgIDB4ODIsIDB4N2YsIDB4OTAsIDB4ODQsIDB4ODEsIDB4OWEsIDB4OTAsIDB4OTYsIDB4MDAs IDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGU0 LCAweDAwLCAweGU5LCAweDAwLCAweGUzLCAweDg0LCAweDgzLCAweDgyLCAweDgwLCAweDgwLAo+ PiArICAgICAgMHg4MiwgMHg4MywgMHg4MywgMHg4MywgMHg4MCwgMHg4MCwgMHg3ZiwgMHg4MCwg MHg4MCwgMHg4MSwgMHg4MSwKPj4gKyAgICAgIDB4ODIsIDB4ODMsIDB4N2UsIDB4ODAsIDB4N2Ms IDB4YTQsIDB4OTcsIDB4OWYsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAw IH0sCj4+ICsgICAgeyAweDAwLCAweGU5LCAweDAwLCAweGVjLCAweDAwLCAweGU4LCAweDg0LCAw eDgzLCAweDgyLCAweDgxLCAweDgxLAo+PiArICAgICAgMHg4MiwgMHg4MiwgMHg4MiwgMHg4Mywg MHg3ZiwgMHg3ZiwgMHg3ZiwgMHg4MSwgMHg4MCwgMHg4MiwgMHg4MywKPj4gKyAgICAgIDB4ODMs IDB4ODQsIDB4NzksIDB4N2MsIDB4NzksIDB4YjEsIDB4YTAsIDB4YWEsIDB4MDAsIDB4MDAsIDB4 MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGVkLCAweDAwLCAw eGYwLCAweDAwLCAweGVjLCAweDgzLCAweDgzLCAweDgyLCAweDgwLCAweDgwLAo+PiArICAgICAg MHg4MSwgMHg4MiwgMHg4MiwgMHg4MiwgMHg3ZiwgMHg3ZiwgMHg3ZSwgMHg4MSwgMHg4MSwgMHg4 MiwgMHg4MCwKPj4gKyAgICAgIDB4ODEsIDB4ODEsIDB4ODQsIDB4ODQsIDB4ODMsIDB4ODAsIDB4 ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsg ICAgeyAweDAwLCAweGYxLCAweDAwLCAweGY0LCAweDAwLCAweGYxLCAweDgzLCAweDgyLCAweDgy LCAweDgwLCAweDgwLAo+PiArICAgICAgMHg4MSwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MCwgMHg4 MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MSwgMHg3ZCwKPj4gKyAgICAgIDB4N2UsIDB4N2YsIDB4 ODQsIDB4ODQsIDB4ODMsIDB4ODAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsg ICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAwLCAweGY2LCAweDAwLCAweGY3LCAweDAw LCAweGY1LCAweDgyLCAweDgyLCAweDgxLCAweDgwLCAweDgwLAo+PiArICAgICAgMHg4MCwgMHg4 MiwgMHg4MiwgMHg4MiwgMHg4MCwgMHg4MCwgMHg4MCwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg4MiwK Pj4gKyAgICAgIDB4ODIsIDB4ODIsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAs IDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAw LCAweGZhLCAweDAwLCAweGZiLCAweDAwLCAweGZhLCAweDgxLCAweDgxLCAweDgxLCAweDgwLCAw eDgwLAo+PiArICAgICAgMHg4MCwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MCwgMHg4MCwgMHg4MCwg MHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKPj4gKyAgICAgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAs IDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAw LCAweDAwIH0sCj4+ICsgICAgeyAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAw eDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAo+PiArICAgICAgMHg4MCwgMHg4MCwgMHg4MCwg MHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKPj4gKyAgICAg IDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4 MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0sCj4+ICsgICAgeyAweDAxLCAweDAwLCAw eDAxLCAweDAwLCAweDAxLCAweDAwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAo+PiAr ICAgICAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4 MCwgMHg4MCwgMHg4MCwKPj4gKyAgICAgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4 ODAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCj4+ICsgICAgICAweDAwLCAweDAwIH0K Pj4gK307Cj4+ICsKPj4gK3Vuc2lnbmVkIGNoYXIgdmludF90YWJsZVtTNkUzSEEyX1ZJTlRfU1RB VFVTX01BWF0gPSB7Cj4+ICsgICAgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywKPj4gKyAg ICAweDFkLCAweDFlLCAweDFmLCAweDIwLCAweDIxCj4+ICt9Owo+PiArCj4+ICtzdHJ1Y3QgczZl M2hhMiB7Cj4+ICsgICAgc3RydWN0IGRldmljZSAqZGV2Owo+PiArICAgIHN0cnVjdCBkcm1fcGFu ZWwgcGFuZWw7Cj4+ICsgICAgc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsX2RldjsKPj4gKwo+ PiArICAgIHN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBsaWVzWzJdOwo+PiArICAgIHN0 cnVjdCBncGlvX2Rlc2MgKnJlc2V0X2dwaW87Cj4+ICsgICAgc3RydWN0IGdwaW9fZGVzYyAqZW5h YmxlX2dwaW87Cj4+ICsKPj4gKyAgICAvKiBUaGlzIGZpZWxkIGlzIHRlc3RlZCBieSBmdW5jdGlv bnMgZGlyZWN0bHkgYWNjZXNzaW5nIERTSSBidXMgYmVmb3JlCj4+ICsgICAgICogdHJhbnNmZXIs IHRyYW5zZmVyIGlzIHNraXBwZWQgaWYgaXQgaXMgc2V0LiBJbiBjYXNlIG9mIHRyYW5zZmVyCj4+ ICsgICAgICogZmFpbHVyZSBvciB1bmV4cGVjdGVkIHJlc3BvbnNlIHRoZSBmaWVsZCBpcyBzZXQg dG8gZXJyb3IgdmFsdWUuCj4+ICsgICAgICogU3VjaCBjb25zdHJ1Y3QgYWxsb3dzIHRvIGVsaW1p bmF0ZSBtYW55IGNoZWNrcyBpbiBoaWdoZXIgbGV2ZWwKPj4gKyAgICAgKiBmdW5jdGlvbnMuCj4+ ICsgICAgICovCj4+ICsgICAgaW50IGVycm9yOwo+PiArfTsKPj4gKwo+PiArc3RhdGljIGludCAg czZlM2hhMl9jbGVhcl9lcnJvcihzdHJ1Y3QgczZlM2hhMiAqY3R4KQo+PiArewo+PiArICAgIGlu dCByZXQgPSBjdHgtPmVycm9yOwo+PiArCj4+ICsgICAgY3R4LT5lcnJvciA9IDA7Cj4+ICsgICAg cmV0dXJuIHJldDsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgczZlM2hhMl9kY3Nfd3JpdGUo c3RydWN0IHM2ZTNoYTIgKmN0eCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikKPj4gK3sK Pj4gKyAgICBzdHJ1Y3QgbWlwaV9kc2lfZGV2aWNlICpkc2kgPSB0b19taXBpX2RzaV9kZXZpY2Uo Y3R4LT5kZXYpOwo+PiArICAgIHNzaXplX3QgcmV0Owo+PiArCj4+ICsgICAgaWYgKGN0eC0+ZXJy b3IgPCAwKQo+PiArICAgICAgICByZXR1cm47Cj4+ICsKPj4gKyAgICByZXQgPSBtaXBpX2RzaV9k Y3Nfd3JpdGVfYnVmZmVyKGRzaSwgZGF0YSwgbGVuKTsKPj4gKyAgICBpZiAocmV0IDwgMCkgewo+ PiArICAgICAgICBkZXZfZXJyKGN0eC0+ZGV2LCAiZXJyb3IgJXpkIHdyaXRpbmcgZGNzIHNlcTog JSpwaFxuIiwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCwgKGludClsZW4sIGRhdGEp Owo+PiArICAgICAgICBjdHgtPmVycm9yID0gcmV0Owo+PiArICAgIH0KPj4gK30KPj4gKwo+PiAr I2RlZmluZSBzNmUzaGEyX2Rjc193cml0ZV9zZXFfc3RhdGljKGN0eCwgc2VxLi4uKSBkbyB7ICAg IFwKPj4gKyAgICBzdGF0aWMgY29uc3QgdTggZFtdID0geyBzZXEgfTsgICAgICAgICAgICBcCj4+ ICsgICAgczZlM2hhMl9kY3Nfd3JpdGUoY3R4LCBkLCBBUlJBWV9TSVpFKGQpKTsgICAgXAo+PiAr fSB3aGlsZSAoMCkKPj4gKwo+PiArc3RhdGljIHZvaWQgczZlM2hhMl90ZXN0X2tleV9vbl9mMChz dHJ1Y3QgczZlM2hhMiAqY3R4KQo+PiArewo+PiArICAgIHM2ZTNoYTJfZGNzX3dyaXRlX3NlcV9z dGF0aWMoY3R4LCAweGYwLCAweDVhLCAweDVhKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQg czZlM2hhMl90ZXN0X2tleV9vZmZfZjAoc3RydWN0IHM2ZTNoYTIgKmN0eCkKPj4gK3sKPj4gKyAg ICBzNmUzaGEyX2Rjc193cml0ZV9zZXFfc3RhdGljKGN0eCwgMHhmMCwgMHhhNSwgMHhhNSk7Cj4+ ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHM2ZTNoYTJfdGVzdF9rZXlfb25fZmMoc3RydWN0IHM2 ZTNoYTIgKmN0eCkKPj4gK3sKPj4gKyAgICBzNmUzaGEyX2Rjc193cml0ZV9zZXFfc3RhdGljKGN0 eCwgMHhmYywgMHg1YSwgMHg1YSk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHM2ZTNoYTJf dGVzdF9rZXlfb2ZmX2ZjKHN0cnVjdCBzNmUzaGEyICpjdHgpCj4+ICt7Cj4+ICsgICAgczZlM2hh Ml9kY3Nfd3JpdGVfc2VxX3N0YXRpYyhjdHgsIDB4ZmMsIDB4YTUsIDB4YTUpOwo+PiArfQo+PiAr Cj4+ICtzdGF0aWMgdm9pZCBzNmUzaGEyX3NpbmdsZV9kc2lfc2V0KHN0cnVjdCBzNmUzaGEyICpj dHgpCj4+ICt7Cj4+ICsgICAgczZlM2hhMl9kY3Nfd3JpdGVfc2VxX3N0YXRpYyhjdHgsIDB4ZjIs IDB4NjcpOwo+PiArICAgIHM2ZTNoYTJfZGNzX3dyaXRlX3NlcV9zdGF0aWMoY3R4LCAweGY5LCAw eDA5KTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgczZlM2hhMl9mcmVxX2NhbGlicmF0aW9u KHN0cnVjdCBzNmUzaGEyICpjdHgpCj4+ICt7Cj4+ICsgICAgczZlM2hhMl9kY3Nfd3JpdGVfc2Vx X3N0YXRpYyhjdHgsIDB4ZmQsIDB4MWMpOwo+PiArICAgIHM2ZTNoYTJfZGNzX3dyaXRlX3NlcV9z dGF0aWMoY3R4LCAweGZlLCAweDIwLCAweDM5KTsKPj4gKyAgICBzNmUzaGEyX2Rjc193cml0ZV9z ZXFfc3RhdGljKGN0eCwgMHhmZSwgMHhhMCk7Cj4+ICsgICAgczZlM2hhMl9kY3Nfd3JpdGVfc2Vx X3N0YXRpYyhjdHgsIDB4ZmUsIDB4MjApOwo+PiArICAgIHM2ZTNoYTJfZGNzX3dyaXRlX3NlcV9z dGF0aWMoY3R4LCAweGNlLCAweDAzLCAweDNiLCAweDEyLCAweDYyLAo+PiArICAgICAgICAweDQw LCAweDgwLCAweGMwLCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDM5LCAweGM1KTsKPj4gK30K Pj4gKwo+PiArc3RhdGljIHZvaWQgczZlM2hhMl9hb3JfY29udHJvbChzdHJ1Y3QgczZlM2hhMiAq Y3R4KQo+PiArewo+PiArICAgIHM2ZTNoYTJfZGNzX3dyaXRlX3NlcV9zdGF0aWMoY3R4LCAweGIy LCAweDAzLCAweDEwKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgczZlM2hhMl9jYXBzX2Vs dnNzX3NldChzdHJ1Y3QgczZlM2hhMiAqY3R4KQo+PiArewo+PiArICAgIHM2ZTNoYTJfZGNzX3dy aXRlX3NlcV9zdGF0aWMoY3R4LCAweGI2LCAweDljLCAweDBhKTsKPj4gK30KPj4gKwo+PiArc3Rh dGljIHZvaWQgczZlM2hhMl9hY2xfb2ZmKHN0cnVjdCBzNmUzaGEyICpjdHgpCj4+ICt7Cj4+ICsg ICAgczZlM2hhMl9kY3Nfd3JpdGVfc2VxX3N0YXRpYyhjdHgsIDB4NTUsIDB4MDApOwo+PiArfQo+ PiArCj4+ICtzdGF0aWMgdm9pZCBzNmUzaGEyX2FjbF9vZmZfb3ByKHN0cnVjdCBzNmUzaGEyICpj dHgpCj4+ICt7Cj4+ICsgICAgczZlM2hhMl9kY3Nfd3JpdGVfc2VxX3N0YXRpYyhjdHgsIDB4YjUs IDB4NDApOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCBzNmUzaGEyX3Rlc3RfZ2xvYmFsKHN0 cnVjdCBzNmUzaGEyICpjdHgpCj4+ICt7Cj4+ICsgICAgczZlM2hhMl9kY3Nfd3JpdGVfc2VxX3N0 YXRpYyhjdHgsIDB4YjAsIDB4MDcpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCBzNmUzaGEy X3Rlc3Qoc3RydWN0IHM2ZTNoYTIgKmN0eCkKPj4gK3sKPj4gKyAgICBzNmUzaGEyX2Rjc193cml0 ZV9zZXFfc3RhdGljKGN0eCwgMHhiOCwgMHgxOSk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lk IHM2ZTNoYTJfdG91Y2hfaHN5bmNfb24xKHN0cnVjdCBzNmUzaGEyICpjdHgpCj4+ICt7Cj4+ICsg ICAgczZlM2hhMl9kY3Nfd3JpdGVfc2VxX3N0YXRpYyhjdHgsCj4+ICsgICAgICAgICAgICAweGJk LCAweDMzLCAweDExLCAweDAyLCAweDE2LCAweDAyLCAweDE2KTsKPj4gK30KPj4gKwo+PiArc3Rh dGljIHZvaWQgczZlM2hhMl9wZW50aWxlX2NvbnRyb2woc3RydWN0IHM2ZTNoYTIgKmN0eCkKPj4g K3sKPj4gKyAgICBzNmUzaGEyX2Rjc193cml0ZV9zZXFfc3RhdGljKGN0eCwgMHhjMCwgMHgwMCwg MHgwMCwgMHhkOCwgMHhkOCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHM2ZTNoYTJfcG9j X2dsb2JhbChzdHJ1Y3QgczZlM2hhMiAqY3R4KQo+PiArewo+PiArICAgIHM2ZTNoYTJfZGNzX3dy aXRlX3NlcV9zdGF0aWMoY3R4LCAweGIwLCAweDIwKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZv aWQgczZlM2hhMl9wb2Nfc2V0dGluZyhzdHJ1Y3QgczZlM2hhMiAqY3R4KQo+PiArewo+PiArICAg IHM2ZTNoYTJfZGNzX3dyaXRlX3NlcV9zdGF0aWMoY3R4LCAweGZlLCAweDA4KTsKPj4gK30KPj4g Kwo+PiArc3RhdGljIHZvaWQgczZlM2hhMl9wY2Rfc2V0X29mZihzdHJ1Y3QgczZlM2hhMiAqY3R4 KQo+PiArewo+PiArICAgIHM2ZTNoYTJfZGNzX3dyaXRlX3NlcV9zdGF0aWMoY3R4LCAweGNjLCAw eDQwLCAweDUxKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgczZlM2hhMl9lcnJfZmdfc2V0 KHN0cnVjdCBzNmUzaGEyICpjdHgpCj4+ICt7Cj4+ICsgICAgczZlM2hhMl9kY3Nfd3JpdGVfc2Vx X3N0YXRpYyhjdHgsIDB4ZWQsIDB4NDQpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCBzNmUz aGEyX2hibV9vZmYoc3RydWN0IHM2ZTNoYTIgKmN0eCkKPj4gK3sKPj4gKyAgICBzNmUzaGEyX2Rj c193cml0ZV9zZXFfc3RhdGljKGN0eCwgMHg1MywgMHgwMCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRp YyB2b2lkIHM2ZTNoYTJfdGVfc3RhcnRfc2V0dGluZyhzdHJ1Y3QgczZlM2hhMiAqY3R4KQo+PiAr ewo+PiArICAgIHM2ZTNoYTJfZGNzX3dyaXRlX3NlcV9zdGF0aWMoY3R4LCAweGI5LCAweDEwLCAw eDA5LCAweGZmLCAweDAwLCAweDA5KTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgczZlM2hh Ml9nYW1tYV91cGRhdGUoc3RydWN0IHM2ZTNoYTIgKmN0eCkKPj4gK3sKPj4gKyAgICBzNmUzaGEy X2Rjc193cml0ZV9zZXFfc3RhdGljKGN0eCwgMHhmNywgMHgwMyk7Cj4+ICsgICAgbmRlbGF5KDEw MCk7IC8qIG5lZWQgZm9yIDEwMG5zIGRlbGF5ICovCj4+ICsgICAgczZlM2hhMl9kY3Nfd3JpdGVf c2VxX3N0YXRpYyhjdHgsIDB4ZjcsIDB4MDApOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHM2 ZTNoYTJfZ2V0X2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsX2RldikKPj4g K3sKPj4gKyAgICByZXR1cm4gYmxfZGV2LT5wcm9wcy5icmlnaHRuZXNzOwo+PiArfQo+PiArCj4+ ICtzdGF0aWMgdm9pZCBzNmUzaGEyX3NldF92aW50KHN0cnVjdCBzNmUzaGEyICpjdHgpCj4+ICt7 Cj4+ICsgICAgc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsX2RldiA9IGN0eC0+YmxfZGV2Owo+ PiArICAgIHVuc2lnbmVkIGludCBicmlnaHRuZXNzID0gYmxfZGV2LT5wcm9wcy5icmlnaHRuZXNz Owo+PiArICAgIHVuc2lnbmVkIGNoYXIgZGF0YVtdID0geyAweGY0LCAweDhiLAo+PiArICAgICAg ICAgICAgdmludF90YWJsZVticmlnaHRuZXNzICogKFM2RTNIQTJfVklOVF9TVEFUVVNfTUFYIC0g MSkgLwo+PiArICAgICAgICAgICAgUzZFM0hBMl9NQVhfQlJJR0hUTkVTU10gfTsKPj4gKwo+PiAr ICAgIHM2ZTNoYTJfZGNzX3dyaXRlKGN0eCwgZGF0YSwgQVJSQVlfU0laRShkYXRhKSk7Cj4+ICt9 Cj4+ICsKPj4gK3N0YXRpYyB1bnNpZ25lZCBpbnQgczZlM2hhMl9nZXRfYnJpZ2h0bmVzc19pbmRl eCh1bnNpZ25lZCBpbnQgYnJpZ2h0bmVzcykKPj4gK3sKPj4gKyAgICByZXR1cm4gKGJyaWdodG5l c3MgKiAoUzZFM0hBMl9OVU1fR0FNTUFfU1RFUFMgLSAxKSkgLwo+PiArICAgICAgICBTNkUzSEEy X01BWF9CUklHSFRORVNTOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHM2ZTNoYTJfdXBkYXRl X2dhbW1hKHN0cnVjdCBzNmUzaGEyICpjdHgsIHVuc2lnbmVkIGludCBicmlnaHRuZXNzKQo+PiAr ewo+PiArICAgIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibF9kZXYgPSBjdHgtPmJsX2RldjsK Pj4gKyAgICB1bnNpZ25lZCBpbnQgaW5kZXggPSBzNmUzaGEyX2dldF9icmlnaHRuZXNzX2luZGV4 KGJyaWdodG5lc3MpOwo+PiArICAgIHU4IGRhdGFbUzZFM0hBMl9HQU1NQV9DTURfQ05UICsgMV0g PSB7IDB4Y2EsIH07Cj4+ICsKPj4gKyAgICBtZW1jcHkoZGF0YSArIDEsIGdhbW1hX3RibCArIGlu ZGV4LCBTNkUzSEEyX0dBTU1BX0NNRF9DTlQpOwo+PiArICAgIHM2ZTNoYTJfZGNzX3dyaXRlKGN0 eCwgZGF0YSwgQVJSQVlfU0laRShkYXRhKSk7Cj4+ICsKPj4gKyAgICBzNmUzaGEyX2dhbW1hX3Vw ZGF0ZShjdHgpOwo+PiArICAgIGJsX2Rldi0+cHJvcHMuYnJpZ2h0bmVzcyA9IGJyaWdodG5lc3M7 Cj4+ICsKPj4gKyAgICByZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBzNmUzaGEy X3NldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibF9kZXYpCj4+ICt7Cj4+ ICsgICAgc3RydWN0IHM2ZTNoYTIgKmN0eCA9IGJsX2dldF9kYXRhKGJsX2Rldik7Cj4+ICsgICAg dW5zaWduZWQgaW50IGJyaWdodG5lc3MgPSBibF9kZXYtPnByb3BzLmJyaWdodG5lc3M7Cj4+ICsK Pj4gKyAgICBpZiAoYnJpZ2h0bmVzcyA8IFM2RTNIQTJfTUlOX0JSSUdIVE5FU1MgfHwKPj4gKyAg ICAgICAgYnJpZ2h0bmVzcyA+IGJsX2Rldi0+cHJvcHMubWF4X2JyaWdodG5lc3MpIHsKPj4gKyAg ICAgICAgZGV2X2VycihjdHgtPmRldiwgIkludmFsaWQgYnJpZ2h0bmVzczogJXVcbiIsIGJyaWdo dG5lc3MpOwo+PiArICAgICAgICByZXR1cm4gLUVJTlZBTDsKPj4gKyAgICB9Cj4+ICsKPj4gKyAg ICBpZiAoYmxfZGV2LT5wcm9wcy5wb3dlciA+IEZCX0JMQU5LX05PUk1BTCkKPj4gKyAgICAgICAg cmV0dXJuIC1FUEVSTTsKPj4gKwo+PiArICAgIHM2ZTNoYTJfdGVzdF9rZXlfb25fZjAoY3R4KTsK Pj4gKyAgICBzNmUzaGEyX3VwZGF0ZV9nYW1tYShjdHgsIGJyaWdodG5lc3MpOwo+PiArICAgIHM2 ZTNoYTJfYW9yX2NvbnRyb2woY3R4KTsKPj4gKyAgICBzNmUzaGEyX3NldF92aW50KGN0eCk7Cj4+ ICsgICAgczZlM2hhMl90ZXN0X2tleV9vZmZfZjAoY3R4KTsKPj4gKwo+PiArICAgIHJldHVybiBj dHgtPmVycm9yOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9v cHMgczZlM2hhMl9ibF9vcHMgPSB7Cj4+ICsgICAgLmdldF9icmlnaHRuZXNzID0gczZlM2hhMl9n ZXRfYnJpZ2h0bmVzcywKPj4gKyAgICAudXBkYXRlX3N0YXR1cyA9IHM2ZTNoYTJfc2V0X2JyaWdo dG5lc3MsCj4+ICt9Owo+PiArCj4+ICtzdGF0aWMgaW50IHM2ZTNoYTJfcGFuZWxfaW5pdChzdHJ1 Y3QgczZlM2hhMiAqY3R4KQo+PiArewo+PiArICAgIHN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRz aSA9IHRvX21pcGlfZHNpX2RldmljZShjdHgtPmRldik7Cj4+ICsgICAgaW50IHJldDsKPj4gKwo+ PiArICAgIHJldCA9IG1pcGlfZHNpX2Rjc19leGl0X3NsZWVwX21vZGUoZHNpKTsKPj4gKyAgICBp ZiAocmV0IDwgMCkKPj4gKyAgICAgICAgcmV0dXJuIHJldDsKPj4gKyAgICB1c2xlZXBfcmFuZ2Uo NTAwMCwgNjAwMCk7Cj4+ICsKPj4gKyAgICBzNmUzaGEyX3Rlc3Rfa2V5X29uX2YwKGN0eCk7Cj4+ ICsgICAgczZlM2hhMl9zaW5nbGVfZHNpX3NldChjdHgpOwo+PiArICAgIHM2ZTNoYTJfdGVzdF9r ZXlfb25fZmMoY3R4KTsKPj4gKyAgICBzNmUzaGEyX2ZyZXFfY2FsaWJyYXRpb24oY3R4KTsKPj4g KyAgICBzNmUzaGEyX3Rlc3Rfa2V5X29mZl9mYyhjdHgpOwo+PiArICAgIHM2ZTNoYTJfdGVzdF9r ZXlfb2ZmX2YwKGN0eCk7Cj4+ICsKPj4gKyAgICByZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3Rh dGljIGludCBzNmUzaGEyX3Bvd2VyX29mZihzdHJ1Y3QgczZlM2hhMiAqY3R4KQo+PiArewo+PiAr ICAgIHJldHVybiByZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUoY3R4LT5zdXBwbGll cyksIGN0eC0+c3VwcGxpZXMpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHM2ZTNoYTJfZGlz YWJsZShzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCkKPj4gK3sKPj4gKyAgICBzdHJ1Y3QgczZlM2hh MiAqY3R4ID0gY29udGFpbmVyX29mKHBhbmVsLCBzdHJ1Y3QgczZlM2hhMiwgcGFuZWwpOwo+PiAr ICAgIHN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRzaSA9IHRvX21pcGlfZHNpX2RldmljZShjdHgt PmRldik7Cj4+ICsgICAgaW50IHJldDsKPj4gKwo+PiArICAgIHJldCA9IG1pcGlfZHNpX2Rjc19l bnRlcl9zbGVlcF9tb2RlKGRzaSk7Cj4+ICsgICAgaWYgKHJldCA8IDApCj4+ICsgICAgICAgIHJl dHVybiByZXQ7Cj4+ICsKPj4gKyAgICByZXQgPSBtaXBpX2RzaV9kY3Nfc2V0X2Rpc3BsYXlfb2Zm KGRzaSk7Cj4+ICsgICAgaWYgKHJldCA8IDApCj4+ICsgICAgICAgIHJldHVybiByZXQ7Cj4+ICsK Pj4gKyAgICBtc2xlZXAoNDApOwo+PiArICAgIGN0eC0+YmxfZGV2LT5wcm9wcy5wb3dlciA9IEZC X0JMQU5LX05PUk1BTDsKPj4gKwo+PiArICAgIHJldHVybiAwOwo+PiArfQo+PiArCj4+ICtzdGF0 aWMgaW50IHM2ZTNoYTJfdW5wcmVwYXJlKHN0cnVjdCBkcm1fcGFuZWwgKnBhbmVsKQo+PiArewo+ PiArICAgIHN0cnVjdCBzNmUzaGEyICpjdHggPSBjb250YWluZXJfb2YocGFuZWwsIHN0cnVjdCBz NmUzaGEyLCBwYW5lbCk7Cj4+ICsgICAgaW50IHJldDsKPj4gKwo+PiArICAgIHJldCA9IHM2ZTNo YTJfY2xlYXJfZXJyb3IoY3R4KTsKPj4gKyAgICBpZiAoIXJldCkKPj4gKyAgICAgICAgY3R4LT5i bF9kZXYtPnByb3BzLnBvd2VyID0gRkJfQkxBTktfUE9XRVJET1dOOwo+PiArCj4+ICsgICAgcmV0 dXJuIHM2ZTNoYTJfcG93ZXJfb2ZmKGN0eCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgczZl M2hhMl9wb3dlcl9vbihzdHJ1Y3QgczZlM2hhMiAqY3R4KQo+PiArewo+PiArICAgIGludCByZXQ7 Cj4+ICsKPj4gKyAgICByZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRShjdHgt PnN1cHBsaWVzKSwgY3R4LT5zdXBwbGllcyk7Cj4+ICsgICAgaWYgKHJldCA8IDApCj4+ICsgICAg ICAgIHJldHVybiByZXQ7Cj4+ICsKPj4gKyAgICBtc2xlZXAoMTIwKTsKPj4gKwo+PiArICAgIGdw aW9kX3NldF92YWx1ZShjdHgtPmVuYWJsZV9ncGlvLCAwKTsKPj4gKyAgICB1c2xlZXBfcmFuZ2Uo NTAwMCwgNjAwMCk7Cj4+ICsgICAgZ3Bpb2Rfc2V0X3ZhbHVlKGN0eC0+ZW5hYmxlX2dwaW8sIDEp Owo+PiArCj4+ICsgICAgZ3Bpb2Rfc2V0X3ZhbHVlKGN0eC0+cmVzZXRfZ3BpbywgMSk7Cj4+ICsg ICAgdXNsZWVwX3JhbmdlKDUwMDAsIDYwMDApOwo+PiArICAgIGdwaW9kX3NldF92YWx1ZShjdHgt PnJlc2V0X2dwaW8sIDApOwo+PiArICAgIHVzbGVlcF9yYW5nZSg1MDAwLCA2MDAwKTsKPj4gKwo+ PiArICAgIHJldHVybiAwOwo+PiArfQo+PiArc3RhdGljIGludCBzNmUzaGEyX3ByZXBhcmUoc3Ry dWN0IGRybV9wYW5lbCAqcGFuZWwpCj4+ICt7Cj4+ICsgICAgc3RydWN0IHM2ZTNoYTIgKmN0eCA9 IGNvbnRhaW5lcl9vZihwYW5lbCwgc3RydWN0IHM2ZTNoYTIsIHBhbmVsKTsKPj4gKyAgICBpbnQg cmV0Owo+PiArCj4+ICsgICAgcmV0ID0gczZlM2hhMl9wb3dlcl9vbihjdHgpOwo+PiArICAgIGlm IChyZXQgPCAwKQo+PiArICAgICAgICByZXR1cm4gcmV0Owo+PiArCj4+ICsgICAgcmV0ID0gczZl M2hhMl9wYW5lbF9pbml0KGN0eCk7Cj4+ICsgICAgaWYgKHJldCA8IDApCj4+ICsgICAgICAgIGdv dG8gZXJyOwo+PiArCj4+ICsgICAgcmV0ID0gczZlM2hhMl9jbGVhcl9lcnJvcihjdHgpOwo+PiAr ICAgIGlmIChyZXQgPCAwKQo+PiArICAgICAgICBnb3RvIGVycjsKPj4gKwo+PiArICAgIGN0eC0+ YmxfZGV2LT5wcm9wcy5wb3dlciA9IEZCX0JMQU5LX05PUk1BTDsKPj4gKwo+PiArICAgIHJldHVy biAwOwo+PiArCj4+ICtlcnI6Cj4+ICsgICAgczZlM2hhMl9wb3dlcl9vZmYoY3R4KTsKPj4gKyAg ICByZXR1cm4gcmV0Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHM2ZTNoYTJfZW5hYmxlKHN0 cnVjdCBkcm1fcGFuZWwgKnBhbmVsKQo+PiArewo+PiArICAgIHN0cnVjdCBzNmUzaGEyICpjdHgg PSBjb250YWluZXJfb2YocGFuZWwsIHN0cnVjdCBzNmUzaGEyLCBwYW5lbCk7Cj4+ICsgICAgc3Ry dWN0IG1pcGlfZHNpX2RldmljZSAqZHNpID0gdG9fbWlwaV9kc2lfZGV2aWNlKGN0eC0+ZGV2KTsK Pj4gKyAgICBpbnQgcmV0Owo+PiArCj4+ICsgICAgLyogY29tbW9uIHNldHRpbmcgKi8KPj4gKyAg ICByZXQgPSBtaXBpX2RzaV9kY3Nfc2V0X3RlYXJfb24oZHNpLCBNSVBJX0RTSV9EQ1NfVEVBUl9N T0RFX1ZCTEFOSyk7Cj4+ICsgICAgaWYgKHJldCA8IDApCj4+ICsgICAgICAgIHJldHVybiByZXQ7 Cj4+ICsKPj4gKyAgICBzNmUzaGEyX3Rlc3Rfa2V5X29uX2YwKGN0eCk7Cj4+ICsgICAgczZlM2hh Ml90ZXN0X2tleV9vbl9mYyhjdHgpOwo+PiArICAgIHM2ZTNoYTJfdG91Y2hfaHN5bmNfb24xKGN0 eCk7Cj4+ICsgICAgczZlM2hhMl9wZW50aWxlX2NvbnRyb2woY3R4KTsKPj4gKyAgICBzNmUzaGEy X3BvY19nbG9iYWwoY3R4KTsKPj4gKyAgICBzNmUzaGEyX3BvY19zZXR0aW5nKGN0eCk7Cj4+ICsg ICAgczZlM2hhMl90ZXN0X2tleV9vZmZfZmMoY3R4KTsKPj4gKwo+PiArICAgIC8qIHBjZCBzZXR0 aW5nIG9mZiBmb3IgVEIgKi8KPj4gKyAgICBzNmUzaGEyX3BjZF9zZXRfb2ZmKGN0eCk7Cj4+ICsg ICAgczZlM2hhMl9lcnJfZmdfc2V0KGN0eCk7Cj4+ICsgICAgczZlM2hhMl90ZV9zdGFydF9zZXR0 aW5nKGN0eCk7Cj4+ICsKPj4gKyAgICAvKiBicmlnaHRuZXNzIHNldHRpbmcgKi8KPj4gKyAgICBz NmUzaGEyX3NldF9icmlnaHRuZXNzKGN0eC0+YmxfZGV2KTsKPj4gKyAgICBzNmUzaGEyX2Fvcl9j b250cm9sKGN0eCk7Cj4+ICsgICAgczZlM2hhMl9jYXBzX2VsdnNzX3NldChjdHgpOwo+PiArICAg IHM2ZTNoYTJfZ2FtbWFfdXBkYXRlKGN0eCk7Cj4+ICsgICAgczZlM2hhMl9hY2xfb2ZmKGN0eCk7 Cj4+ICsgICAgczZlM2hhMl9hY2xfb2ZmX29wcihjdHgpOwo+PiArICAgIHM2ZTNoYTJfaGJtX29m ZihjdHgpOwo+PiArCj4+ICsgICAgLyogZWx2c3MgdGVtcCBjb21wZW5zYXRpb24gKi8KPj4gKyAg ICBzNmUzaGEyX3Rlc3RfZ2xvYmFsKGN0eCk7Cj4+ICsgICAgczZlM2hhMl90ZXN0KGN0eCk7Cj4+ ICsgICAgczZlM2hhMl90ZXN0X2tleV9vZmZfZjAoY3R4KTsKPj4gKwo+PiArICAgIGlmIChjdHgt PmVycm9yICE9IDApCj4+ICsgICAgICAgIHJldHVybiBjdHgtPmVycm9yOwo+PiArCj4+ICsgICAg cmV0ID0gbWlwaV9kc2lfZGNzX3NldF9kaXNwbGF5X29uKGRzaSk7Cj4+ICsgICAgaWYgKHJldCA8 IDApCj4+ICsgICAgICAgIHJldHVybiByZXQ7Cj4+ICsKPj4gKyAgICBjdHgtPmJsX2Rldi0+cHJv cHMucG93ZXIgPSBGQl9CTEFOS19VTkJMQU5LOwo+PiArCj4+ICsgICAgcmV0dXJuIDA7Cj4+ICt9 Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBkZWZhdWx0X21v ZGUgPSB7Cj4+ICsgICAgLmNsb2NrID0gMjIyMzcyLAo+PiArICAgIC5oZGlzcGxheSA9IDE0NDAs Cj4+ICsgICAgLmhzeW5jX3N0YXJ0ID0gMTQ0MCArIDEsCj4+ICsgICAgLmhzeW5jX2VuZCA9IDE0 NDAgKyAxICsgMSwKPj4gKyAgICAuaHRvdGFsID0gMTQ0MCArIDEgKyAxICsgMSwKPj4gKyAgICAu dmRpc3BsYXkgPSAyNTYwLAo+PiArICAgIC52c3luY19zdGFydCA9IDI1NjAgKyAxLAo+PiArICAg IC52c3luY19lbmQgPSAyNTYwICsgMSArIDEsCj4+ICsgICAgLnZ0b3RhbCA9IDI1NjAgKyAxICsg MSArIDE1LAo+PiArICAgIC52cmVmcmVzaCA9IDYwLAo+PiArICAgIC5mbGFncyA9IDAsCj4+ICt9 Owo+PiArCj4+ICtzdGF0aWMgaW50IHM2ZTNoYTJfZ2V0X21vZGVzKHN0cnVjdCBkcm1fcGFuZWwg KnBhbmVsKQo+PiArewo+PiArICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSBw YW5lbC0+Y29ubmVjdG9yOwo+PiArICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOwo+ PiArCj4+ICsgICAgbW9kZSA9IGRybV9tb2RlX2R1cGxpY2F0ZShwYW5lbC0+ZHJtLCAmZGVmYXVs dF9tb2RlKTsKPj4gKyAgICBpZiAoIW1vZGUpIHsKPj4gKyAgICAgICAgRFJNX0VSUk9SKCJmYWls ZWQgdG8gYWRkIG1vZGUgJXV4JXV4QCV1XG4iLAo+PiArICAgICAgICAgICAgICAgIGRlZmF1bHRf bW9kZS5oZGlzcGxheSwgZGVmYXVsdF9tb2RlLnZkaXNwbGF5LAo+PiArICAgICAgICAgICAgICAg IGRlZmF1bHRfbW9kZS52cmVmcmVzaCk7Cj4+ICsgICAgICAgIHJldHVybiAtRU5PTUVNOwo+PiAr ICAgIH0KPj4gKwo+PiArICAgIGRybV9tb2RlX3NldF9uYW1lKG1vZGUpOwo+PiArCj4+ICsgICAg bW9kZS0+dHlwZSA9IERSTV9NT0RFX1RZUEVfRFJJVkVSIHwgRFJNX01PREVfVFlQRV9QUkVGRVJS RUQ7Cj4+ICsgICAgZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG1vZGUpOwo+PiArCj4+ ICsgICAgY29ubmVjdG9yLT5kaXNwbGF5X2luZm8ud2lkdGhfbW0gPSA3MTsKPj4gKyAgICBjb25u ZWN0b3ItPmRpc3BsYXlfaW5mby5oZWlnaHRfbW0gPSAxMjU7Cj4+ICsKPj4gKyAgICByZXR1cm4g MTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fcGFuZWxfZnVuY3MgczZl M2hhMl9kcm1fZnVuY3MgPSB7Cj4+ICsgICAgLmRpc2FibGUgPSBzNmUzaGEyX2Rpc2FibGUsCj4+ ICsgICAgLnVucHJlcGFyZSA9IHM2ZTNoYTJfdW5wcmVwYXJlLAo+PiArICAgIC5wcmVwYXJlID0g czZlM2hhMl9wcmVwYXJlLAo+PiArICAgIC5lbmFibGUgPSBzNmUzaGEyX2VuYWJsZSwKPj4gKyAg ICAuZ2V0X21vZGVzID0gczZlM2hhMl9nZXRfbW9kZXMsCj4+ICt9Owo+PiArCj4+ICtzdGF0aWMg aW50IHM2ZTNoYTJfcHJvYmUoc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZHNpKQo+PiArewo+PiAr ICAgIHN0cnVjdCBkZXZpY2UgKmRldiA9ICZkc2ktPmRldjsKPj4gKyAgICBzdHJ1Y3QgczZlM2hh MiAqY3R4Owo+PiArICAgIGludCByZXQ7Cj4+ICsKPj4gKyAgICBjdHggPSBkZXZtX2t6YWxsb2Mo ZGV2LCBzaXplb2YoKmN0eCksIEdGUF9LRVJORUwpOwo+PiArICAgIGlmICghY3R4KQo+PiArICAg ICAgICByZXR1cm4gLUVOT01FTTsKPj4gKwo+PiArICAgIG1pcGlfZHNpX3NldF9kcnZkYXRhKGRz aSwgY3R4KTsKPj4gKwo+PiArICAgIGN0eC0+ZGV2ID0gZGV2Owo+PiArCj4+ICsgICAgZHNpLT5s YW5lcyA9IDQ7Cj4+ICsgICAgZHNpLT5mb3JtYXQgPSBNSVBJX0RTSV9GTVRfUkdCODg4Owo+PiAr ICAgIGRzaS0+bW9kZV9mbGFncyA9IE1JUElfRFNJX0NMT0NLX05PTl9DT05USU5VT1VTOwo+PiAr Cj4+ICsgICAgY3R4LT5zdXBwbGllc1swXS5zdXBwbHkgPSAidmRkMyI7Cj4+ICsgICAgY3R4LT5z dXBwbGllc1sxXS5zdXBwbHkgPSAidmNpIjsKPj4gKwo+PiArICAgIHJldCA9IGRldm1fcmVndWxh dG9yX2J1bGtfZ2V0KGRldiwgQVJSQVlfU0laRShjdHgtPnN1cHBsaWVzKSwKPj4gKyAgICAgICAg ICAgICAgICAgICAgICBjdHgtPnN1cHBsaWVzKTsKPj4gKyAgICBpZiAocmV0IDwgMCkgewo+PiAr ICAgICAgICBkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgcmVndWxhdG9yczogJWRcbiIsIHJl dCk7Cj4+ICsgICAgICAgIHJldHVybiByZXQ7Cj4+ICsgICAgfQo+PiArCj4+ICsgICAgY3R4LT5y ZXNldF9ncGlvID0gZGV2bV9ncGlvZF9nZXQoZGV2LCAicmVzZXQiLCBHUElPRF9PVVRfTE9XKTsK Pj4gKyAgICBpZiAoSVNfRVJSKGN0eC0+cmVzZXRfZ3BpbykpIHsKPj4gKyAgICAgICAgZGV2X2Vy cihkZXYsICJjYW5ub3QgZ2V0IHJlc2V0LWdwaW9zICVsZFxuIiwKPj4gKyAgICAgICAgICAgIFBU Ul9FUlIoY3R4LT5yZXNldF9ncGlvKSk7Cj4+ICsgICAgICAgIHJldHVybiBQVFJfRVJSKGN0eC0+ cmVzZXRfZ3Bpbyk7Cj4+ICsgICAgfQo+PiArCj4+ICsgICAgY3R4LT5lbmFibGVfZ3BpbyA9IGRl dm1fZ3Bpb2RfZ2V0KGRldiwgImVuYWJsZSIsIEdQSU9EX09VVF9ISUdIKTsKPj4gKyAgICBpZiAo SVNfRVJSKGN0eC0+ZW5hYmxlX2dwaW8pKSB7Cj4+ICsgICAgICAgIGRldl9lcnIoZGV2LCAiY2Fu bm90IGdldCBlbmFibGUtZ3Bpb3MgJWxkXG4iLAo+PiArICAgICAgICAgICAgUFRSX0VSUihjdHgt PmVuYWJsZV9ncGlvKSk7Cj4+ICsgICAgICAgIHJldHVybiBQVFJfRVJSKGN0eC0+ZW5hYmxlX2dw aW8pOwo+PiArICAgIH0KPj4gKwo+PiArICAgIGN0eC0+YmxfZGV2ID0gYmFja2xpZ2h0X2Rldmlj ZV9yZWdpc3RlcigiczZlM2hhMiIsIGRldiwgY3R4LAo+PiArICAgICAgICAgICAgICAgICAgICAg ICAgJnM2ZTNoYTJfYmxfb3BzLCBOVUxMKTsKPj4gKyAgICBpZiAoSVNfRVJSKGN0eC0+YmxfZGV2 KSkgewo+PiArICAgICAgICBkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWdpc3RlciBiYWNrbGln aHQgZGV2aWNlXG4iKTsKPj4gKyAgICAgICAgcmV0dXJuIFBUUl9FUlIoY3R4LT5ibF9kZXYpOwo+ PiArICAgIH0KPj4gKwo+PiArICAgIGN0eC0+YmxfZGV2LT5wcm9wcy5tYXhfYnJpZ2h0bmVzcyA9 IFM2RTNIQTJfTUFYX0JSSUdIVE5FU1M7Cj4+ICsgICAgY3R4LT5ibF9kZXYtPnByb3BzLmJyaWdo dG5lc3MgPSBTNkUzSEEyX0RFRkFVTFRfQlJJR0hUTkVTUzsKPj4gKyAgICBjdHgtPmJsX2Rldi0+ cHJvcHMucG93ZXIgPSBGQl9CTEFOS19QT1dFUkRPV047Cj4+ICsKPj4gKyAgICBkcm1fcGFuZWxf aW5pdCgmY3R4LT5wYW5lbCk7Cj4+ICsgICAgY3R4LT5wYW5lbC5kZXYgPSBkZXY7Cj4+ICsgICAg Y3R4LT5wYW5lbC5mdW5jcyA9ICZzNmUzaGEyX2RybV9mdW5jczsKPj4gKwo+PiArICAgIHJldCA9 IGRybV9wYW5lbF9hZGQoJmN0eC0+cGFuZWwpOwo+PiArICAgIGlmIChyZXQgPCAwKQo+PiArICAg ICAgICBnb3RvIHVucmVnaXN0ZXJfYmFja2xpZ2h0Owo+PiArCj4+ICsgICAgcmV0ID0gbWlwaV9k c2lfYXR0YWNoKGRzaSk7Cj4+ICsgICAgaWYgKHJldCA8IDApCj4+ICsgICAgICAgIGdvdG8gcmVt b3ZlX3BhbmVsOwo+PiArCj4+ICsgICAgcmV0dXJuIHJldDsKPj4gKwo+PiArcmVtb3ZlX3BhbmVs Ogo+PiArICAgIGRybV9wYW5lbF9yZW1vdmUoJmN0eC0+cGFuZWwpOwo+PiArCj4+ICt1bnJlZ2lz dGVyX2JhY2tsaWdodDoKPj4gKyAgICBiYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoY3R4LT5i bF9kZXYpOwo+PiArCj4+ICsgICAgcmV0dXJuIHJldDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGlu dCBzNmUzaGEyX3JlbW92ZShzdHJ1Y3QgbWlwaV9kc2lfZGV2aWNlICpkc2kpCj4+ICt7Cj4+ICsg ICAgc3RydWN0IHM2ZTNoYTIgKmN0eCA9IG1pcGlfZHNpX2dldF9kcnZkYXRhKGRzaSk7Cj4+ICsK Pj4gKyAgICBtaXBpX2RzaV9kZXRhY2goZHNpKTsKPj4gKyAgICBkcm1fcGFuZWxfcmVtb3ZlKCZj dHgtPnBhbmVsKTsKPj4gKyAgICBiYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoY3R4LT5ibF9k ZXYpOwo+PiArCj4+ICsgICAgcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCBz dHJ1Y3Qgb2ZfZGV2aWNlX2lkIHM2ZTNoYTJfb2ZfbWF0Y2hbXSA9IHsKPj4gKyAgICB7IC5jb21w YXRpYmxlID0gInNhbXN1bmcsczZlM2hhMiIgfSwKPj4gKyAgICB7IH0KPj4gK307Cj4+ICtNT0RV TEVfREVWSUNFX1RBQkxFKG9mLCBzNmUzaGEyX29mX21hdGNoKTsKPj4gKwo+PiArc3RhdGljIHN0 cnVjdCBtaXBpX2RzaV9kcml2ZXIgczZlM2hhMl9kcml2ZXIgPSB7Cj4+ICsgICAgLnByb2JlID0g czZlM2hhMl9wcm9iZSwKPj4gKyAgICAucmVtb3ZlID0gczZlM2hhMl9yZW1vdmUsCj4+ICsgICAg LmRyaXZlciA9IHsKPj4gKyAgICAgICAgLm5hbWUgPSAicGFuZWwtc2Ftc3VuZy1zNmUzaGEyIiwK Pj4gKyAgICAgICAgLm9mX21hdGNoX3RhYmxlID0gczZlM2hhMl9vZl9tYXRjaCwKPj4gKyAgICB9 LAo+PiArfTsKPj4gK21vZHVsZV9taXBpX2RzaV9kcml2ZXIoczZlM2hhMl9kcml2ZXIpOwo+PiAr Cj4+ICtNT0RVTEVfQVVUSE9SKCJEb25naHdhIExlZSA8ZGgwOS5sZWVAc2Ftc3VuZy5jb20+Iik7 Cj4+ICtNT0RVTEVfQVVUSE9SKCJIeXVuZ3dvbiBId2FuZyA8aHVtYW4uaHdhbmdAc2Ftc3VuZy5j b20+Iik7Cj4+ICtNT0RVTEVfQVVUSE9SKCJIb2VnZXVuIEt3b24gPGhvZWdldW4ua3dvbkBzYW1z dW5nLmNvbT4iKTsKPj4gK01PRFVMRV9ERVNDUklQVElPTigiTUlQSS1EU0kgYmFzZWQgczZlM2hh MiBBTU9MRUQgUGFuZWwgRHJpdmVyIik7Cj4+ICtNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cj4g Cj4gLS0gCj4gVG8gdW5zdWJzY3JpYmUgZnJvbSB0aGlzIGxpc3Q6IHNlbmQgdGhlIGxpbmUgInVu c3Vic2NyaWJlIGRldmljZXRyZWUiIGluCj4gdGhlIGJvZHkgb2YgYSBtZXNzYWdlIHRvIG1ham9y ZG9tb0B2Z2VyLmtlcm5lbC5vcmcKPiBNb3JlIG1ham9yZG9tbyBpbmZvIGF0ICBodHRwOi8vdmdl ci5rZXJuZWwub3JnL21ham9yZG9tby1pbmZvLmh0bWwKPiAKPiAKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmkt ZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3Jn L21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754639AbdAaABQ (ORCPT ); Mon, 30 Jan 2017 19:01:16 -0500 Received: from mailout3.samsung.com ([203.254.224.33]:33346 "EHLO mailout3.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753464AbdAaABL (ORCPT ); Mon, 30 Jan 2017 19:01:11 -0500 MIME-version: 1.0 Content-type: text/plain; charset=UTF-8 X-AuditID: b6c32a59-f79be6d0000012bb-14-588fd3c36efb Content-transfer-encoding: 8BIT Message-id: <588FD3C3.7080508@samsung.com> Date: Tue, 31 Jan 2017 09:01:07 +0900 From: Inki Dae User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 To: Hoegeun Kwon , thierry.reding@gmail.com Cc: robh@kernel.org, Krzysztof Kozlowski , airlied@linux.ie, kgene@kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-samsung-soc@vger.kernel.org, a.hajda@samsung.com, cw00.choi@samsung.com, jh80.chung@samsung.com, andi.shyti@samsung.com, Donghwa Lee , Hyungwon Hwang Subject: Re: [PATCH v8 2/3] drm/panel: Add support for S6E3HA2 panel driver on TM2 board In-reply-to: <08c5d94b-c76f-af14-c08f-478e26a34a7c@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrDJsWRmVeSWpSXmKPExsWy7bCmhu6Ry/0RBhePMlrcWneO1aL33Ekm i+1HnrFaXP/ynNVi/hGg2PXzdhZXvr5ns3i/vIvNYumMPlaLG7/aWC36H79mtjh/fgO7xeVd c9gsZpzfx2Txf88Odoufu+axOAh47Jx1l91j06pONo/t3x6wetzvPs7k0bdlFaPH501yAWxR qTYZqYkpqUUKqXnJ+SmZeem2St7B8c7xpmYGhrqGlhbmSgp5ibmptkouPgG6bpk5QHcrKZQl 5pQChQISi4uV9O1sivJLS1IVMvKLS2yVog0NjfQMDcz1jIyM9EyMY62MTIFKElIzLjybzVLw 8S9jxeR715gaGE8fZOxi5OSQEDCRmHjzMhOELSZx4d56ti5GLg4hgaWMEqsOr2eBcNqZJHpf zYTr+NrQDJVYzijxZMoVsHZeAUGJH5PvASU4OJgF5CWOXMoGCTMLaEps3b2eHaL+HqPExN1H GSHqtSRONSxlBbFZBFQlPv5sArPZgOyJK+6zgdiiAhESO+d/YwexRQRcJZYfagdbzCwwgVmi YfVOsAZhgSiJyQu/gdmcAvYSa+c+YwQpkhD4yC5x4Fcv2EUSArISmw4wQ3zgInF+ySR2CFtY 4tXxLVC2tMTfpbegersZJa739LBBOB2MEn87/7NAVBlL3H9wjxniNz6J3t9PmCAW8Ep0tAlB lHhI/JpxAxpcjhJf9rZAvd/HJPFy02KmCYzys5BCbBYixGYhhdgCRuZVjGKpBcW56anFpgWm esWJucWleel6yfm5mxjBKVcrcgfjlZlBhxgFOBiVeHgVTvVHCLEmlhVX5h5ilOBgVhLhDToP FOJNSaysSi3Kjy8qzUktPsRoCgzwicxSosn5wHyQVxJvaGJmaGJkCYTmhuZK4rwLKqwjhATS E0tSs1NTC1KLYPqYODilGhgbVJZULHBW4J95+5s630K3rUeeC95/6StzykPoql+fp7DChrKo vMk7QjVvzEv+mS8esS091utj4s6pj+0VO/RWcv29++2ZlfCtSOeT7sH5gX90Y/O5eHs6fi60 nrF15ky3zy4rDsSde/lb0XGK8eSXR0XYXDLWzil6kGg86/rKynSPZ4HTVn5QYinOSDTUYi4q TgQAUxaIxs8DAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrOIsWRmVeSWpSXmKPExsVy+t9jAd3Dl/sjDBqPKVjcWneO1aL33Ekm i+1HnrFaXP/ynNVi/hGg2PXzdhZXvr5ns3i/vIvNYumMPlaLG7/aWC36H79mtjh/fgO7xeVd c9gsZpzfx2Txf88Odoufu+axOAh47Jx1l91j06pONo/t3x6wetzvPs7k0bdlFaPH501yAWxR bjYZqYkpqUUKqXnJ+SmZeem2SqEhbroWSgp5ibmptkoRur4hQUoKZYk5pUCekQEacHAOcA9W 0rdLcMu48Gw2S8HHv4wVk+9dY2pgPH2QsYuRk0NCwETia0MzC4QtJnHh3nq2LkYuDiGBpYwS X77PBEvwCghK/Jh8D8jm4GAWkJc4cikbJMwsoC4xad4iZoj6B4wSD3ovskLUa0mcalgKZrMI qEp8/NkEZrMB2RNX3GcDmSMqECHRfaISJCwi4Cqx/FA7C8gcZoEJzBJnr0EcJywQJXFu+ltW iAV9TBJzX78AO4hTwF5i7dxnjBMYBWYhuW8Wwn2zkNy3gJF5FaNEakFyQXFSeq5RXmq5XnFi bnFpXrpecn7uJkZwJD+T3sF4eJf7IUYBDkYlHl6Ntv4IIdbEsuLK3EOMEhzMSiK8QeeBQrwp iZVVqUX58UWlOanFhxhNgR6cyCwlmpwPTDJ5JfGGJuYm5sYGFuaWliZGSuK8jbOfhQsJpCeW pGanphakFsH0MXFwSjUwTn7Puy7pgcy69V4pkpmxL9cqTHl8NHunv/93Nkf95Gv8B99K3I1m UFXJSeBpXZk38+LBUzM//1jMmL9s+Y7JkUvXC3rE/tuiYeB1ubHDIt3o6419V3WX/I+Ikal4 UbfkGoPBxIUBUuEs085H/JuywPeES4L9AreeHVFaRr6p1mETnQ7PdG1sVWIpzkg01GIuKk4E AAwXUQH6AgAA X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20170131000107epcas5p4dc523fb5257b5d023df656ce83d094ea X-Msg-Generator: CA X-Sender-IP: 203.254.230.27 X-Local-Sender: =?UTF-8?B?64yA7J246riwG1RpemVuIFBsYXRmb3JtIExhYihTL1fshLw=?= =?UTF-8?B?7YSwKRvsgrzshLHsoITsnpAbUzUo7LGF7J6EKS/ssYXsnoQ=?= X-Global-Sender: =?UTF-8?B?SW5raSBEYWUbVGl6ZW4gUGxhdGZvcm0gTGFiLhtTYW1zdW5n?= =?UTF-8?B?IEVsZWN0cm9uaWNzG1M1L1NlbmlvciBFbmdpbmVlcg==?= X-Sender-Code: =?UTF-8?B?QzEwG1NUQUYbQzEwVjgxMTE=?= CMS-TYPE: 105P DLP-Filter: Pass X-CFilter-Loop: Reflected X-HopCount: 7 X-CMS-RootMailID: 20170111063408epcas5p2e6ec091549c3ffed8462fd95d11d3c82 X-RootMTR: 20170111063408epcas5p2e6ec091549c3ffed8462fd95d11d3c82 References: <1484116439-7275-1-git-send-email-hoegeun.kwon@samsung.com> <1484116439-7275-3-git-send-email-hoegeun.kwon@samsung.com> <08c5d94b-c76f-af14-c08f-478e26a34a7c@samsung.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 2017년 01월 24일 10:50에 Hoegeun Kwon 이(가) 쓴 글: > Dear Thierry, > > Could you please review this patch? Thierry, I think this patch has been reviewed enough but no comment from you. Seems you are busy. I will pick up this. Thanks. > > Best Regards, > Hoegeun Kwon > > On 01/11/2017 03:33 PM, Hoegeun Kwon wrote: >> This patch add support for MIPI-DSI based S6E3HA2 AMOLED panel >> driver. This panel has 1440x2560 resolution in 5.7-inch physical >> panel in the TM2 device. >> >> Signed-off-by: Donghwa Lee >> Signed-off-by: Hyungwon Hwang >> Signed-off-by: Hoegeun Kwon >> Tested-by: Chanwoo Choi >> Reviewed-by: Andrzej Hajda >> --- >> drivers/gpu/drm/panel/Kconfig | 6 + >> drivers/gpu/drm/panel/Makefile | 1 + >> drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c | 754 ++++++++++++++++++++++++++ >> 3 files changed, 761 insertions(+) >> create mode 100644 drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c >> >> diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig >> index 62aba97..d913c83 100644 >> --- a/drivers/gpu/drm/panel/Kconfig >> +++ b/drivers/gpu/drm/panel/Kconfig >> @@ -52,6 +52,12 @@ config DRM_PANEL_PANASONIC_VVX10F034N00 >> WUXGA (1920x1200) Novatek NT1397-based DSI panel as found in some >> Xperia Z2 tablets >> +config DRM_PANEL_SAMSUNG_S6E3HA2 >> + tristate "Samsung S6E3HA2 DSI video mode panel" >> + depends on OF >> + depends on DRM_MIPI_DSI >> + select VIDEOMODE_HELPERS >> + >> config DRM_PANEL_SAMSUNG_S6E8AA0 >> tristate "Samsung S6E8AA0 DSI video mode panel" >> depends on OF >> diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile >> index a5c7ec0..1d483b0 100644 >> --- a/drivers/gpu/drm/panel/Makefile >> +++ b/drivers/gpu/drm/panel/Makefile >> @@ -3,6 +3,7 @@ obj-$(CONFIG_DRM_PANEL_JDI_LT070ME05000) += panel-jdi-lt070me05000.o >> obj-$(CONFIG_DRM_PANEL_LG_LG4573) += panel-lg-lg4573.o >> obj-$(CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00) += panel-panasonic-vvx10f034n00.o >> obj-$(CONFIG_DRM_PANEL_SAMSUNG_LD9040) += panel-samsung-ld9040.o >> +obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2) += panel-samsung-s6e3ha2.o >> obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0) += panel-samsung-s6e8aa0.o >> obj-$(CONFIG_DRM_PANEL_SHARP_LQ101R1SX01) += panel-sharp-lq101r1sx01.o >> obj-$(CONFIG_DRM_PANEL_SHARP_LS043T1LE01) += panel-sharp-ls043t1le01.o >> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c >> new file mode 100644 >> index 0000000..0b9c6f4 >> --- /dev/null >> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e3ha2.c >> @@ -0,0 +1,754 @@ >> +/* >> + * MIPI-DSI based s6e3ha2 AMOLED 5.7 inch panel driver. >> + * >> + * Copyright (c) 2016 Samsung Electronics Co., Ltd. >> + * Donghwa Lee >> + * Hyungwon Hwang >> + * Hoegeun Kwon >> + * >> + * This program is free software; you can redistribute it and/or modify >> + * it under the terms of the GNU General Public License version 2 as >> + * published by the Free Software Foundation. >> + */ >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +#define S6E3HA2_MIN_BRIGHTNESS 0 >> +#define S6E3HA2_MAX_BRIGHTNESS 100 >> +#define S6E3HA2_DEFAULT_BRIGHTNESS 80 >> + >> +#define S6E3HA2_NUM_GAMMA_STEPS 46 >> +#define S6E3HA2_GAMMA_CMD_CNT 35 >> +#define S6E3HA2_VINT_STATUS_MAX 10 >> + >> +static const u8 gamma_tbl[S6E3HA2_NUM_GAMMA_STEPS][S6E3HA2_GAMMA_CMD_CNT] = { >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x89, 0x87, 0x87, 0x82, 0x83, >> + 0x85, 0x88, 0x8b, 0x8b, 0x84, 0x88, 0x82, 0x82, 0x89, 0x86, 0x8c, >> + 0x94, 0x84, 0xb1, 0xaf, 0x8e, 0xcf, 0xad, 0xc9, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x89, 0x87, 0x87, 0x84, 0x84, >> + 0x85, 0x87, 0x8b, 0x8a, 0x84, 0x88, 0x82, 0x82, 0x89, 0x86, 0x8a, >> + 0x93, 0x84, 0xb0, 0xae, 0x8e, 0xc9, 0xa8, 0xc5, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x89, 0x87, 0x87, 0x83, 0x83, >> + 0x85, 0x86, 0x8a, 0x8a, 0x84, 0x88, 0x81, 0x84, 0x8a, 0x88, 0x8a, >> + 0x91, 0x84, 0xb1, 0xae, 0x8b, 0xd5, 0xb2, 0xcc, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x89, 0x87, 0x87, 0x83, 0x83, >> + 0x85, 0x86, 0x8a, 0x8a, 0x84, 0x87, 0x81, 0x84, 0x8a, 0x87, 0x8a, >> + 0x91, 0x85, 0xae, 0xac, 0x8a, 0xc3, 0xa3, 0xc0, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x88, 0x86, 0x87, 0x85, 0x85, >> + 0x86, 0x85, 0x88, 0x89, 0x84, 0x89, 0x82, 0x84, 0x87, 0x85, 0x8b, >> + 0x91, 0x88, 0xad, 0xab, 0x8a, 0xb7, 0x9b, 0xb6, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x89, 0x87, 0x87, 0x83, 0x83, >> + 0x85, 0x86, 0x89, 0x8a, 0x84, 0x89, 0x83, 0x83, 0x86, 0x84, 0x8b, >> + 0x90, 0x84, 0xb0, 0xae, 0x8b, 0xce, 0xad, 0xc8, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x89, 0x87, 0x87, 0x83, 0x83, >> + 0x85, 0x87, 0x89, 0x8a, 0x83, 0x87, 0x82, 0x85, 0x88, 0x87, 0x89, >> + 0x8f, 0x84, 0xac, 0xaa, 0x89, 0xb1, 0x98, 0xaf, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x89, 0x87, 0x87, 0x83, 0x83, >> + 0x85, 0x86, 0x88, 0x89, 0x84, 0x88, 0x83, 0x82, 0x85, 0x84, 0x8c, >> + 0x91, 0x86, 0xac, 0xaa, 0x89, 0xc2, 0xa5, 0xbd, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x88, 0x86, 0x87, 0x84, 0x84, >> + 0x85, 0x87, 0x89, 0x8a, 0x83, 0x87, 0x82, 0x85, 0x88, 0x87, 0x88, >> + 0x8b, 0x82, 0xad, 0xaa, 0x8a, 0xc2, 0xa5, 0xbd, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x89, 0x87, 0x87, 0x83, 0x83, >> + 0x85, 0x86, 0x87, 0x89, 0x84, 0x88, 0x83, 0x82, 0x85, 0x84, 0x8a, >> + 0x8e, 0x84, 0xae, 0xac, 0x89, 0xda, 0xb7, 0xd0, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x88, 0x86, 0x87, 0x84, 0x84, >> + 0x85, 0x86, 0x87, 0x89, 0x84, 0x88, 0x83, 0x80, 0x83, 0x82, 0x8b, >> + 0x8e, 0x85, 0xac, 0xaa, 0x89, 0xc8, 0xaa, 0xc1, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x88, 0x86, 0x87, 0x84, 0x84, >> + 0x85, 0x86, 0x87, 0x89, 0x81, 0x85, 0x81, 0x84, 0x86, 0x84, 0x8c, >> + 0x8c, 0x84, 0xa9, 0xa8, 0x87, 0xa3, 0x92, 0xa1, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x88, 0x86, 0x87, 0x84, 0x84, >> + 0x85, 0x86, 0x87, 0x89, 0x84, 0x86, 0x83, 0x80, 0x83, 0x81, 0x8c, >> + 0x8d, 0x84, 0xaa, 0xaa, 0x89, 0xce, 0xaf, 0xc5, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x88, 0x86, 0x87, 0x84, 0x84, >> + 0x85, 0x86, 0x87, 0x89, 0x81, 0x83, 0x80, 0x83, 0x85, 0x85, 0x8c, >> + 0x8c, 0x84, 0xa8, 0xa8, 0x88, 0xb5, 0x9f, 0xb0, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x88, 0x86, 0x87, 0x84, 0x84, >> + 0x86, 0x86, 0x87, 0x88, 0x81, 0x83, 0x80, 0x83, 0x85, 0x85, 0x8c, >> + 0x8b, 0x84, 0xab, 0xa8, 0x86, 0xd4, 0xb4, 0xc9, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x88, 0x86, 0x87, 0x84, 0x84, >> + 0x86, 0x86, 0x87, 0x88, 0x81, 0x83, 0x80, 0x84, 0x84, 0x85, 0x8b, >> + 0x8a, 0x83, 0xa6, 0xa5, 0x84, 0xbb, 0xa4, 0xb3, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x88, 0x86, 0x87, 0x84, 0x84, >> + 0x86, 0x85, 0x86, 0x86, 0x82, 0x85, 0x81, 0x82, 0x83, 0x84, 0x8e, >> + 0x8b, 0x83, 0xa4, 0xa3, 0x8a, 0xa1, 0x93, 0x9d, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x88, 0x86, 0x87, 0x83, 0x83, >> + 0x85, 0x86, 0x87, 0x87, 0x82, 0x85, 0x81, 0x82, 0x82, 0x84, 0x8e, >> + 0x8b, 0x83, 0xa4, 0xa2, 0x86, 0xc1, 0xa9, 0xb7, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x88, 0x86, 0x87, 0x83, 0x83, >> + 0x85, 0x86, 0x87, 0x87, 0x82, 0x85, 0x81, 0x82, 0x82, 0x84, 0x8d, >> + 0x89, 0x82, 0xa2, 0xa1, 0x84, 0xa7, 0x98, 0xa1, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xb8, 0x00, 0xc3, 0x00, 0xb1, 0x88, 0x86, 0x87, 0x83, 0x83, >> + 0x85, 0x86, 0x87, 0x87, 0x82, 0x85, 0x81, 0x83, 0x83, 0x85, 0x8c, >> + 0x87, 0x7f, 0xa2, 0x9d, 0x88, 0x8d, 0x88, 0x8b, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xbb, 0x00, 0xc5, 0x00, 0xb4, 0x87, 0x86, 0x86, 0x84, 0x83, >> + 0x86, 0x87, 0x87, 0x87, 0x80, 0x82, 0x7f, 0x86, 0x86, 0x88, 0x8a, >> + 0x84, 0x7e, 0x9d, 0x9c, 0x82, 0x8d, 0x88, 0x8b, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xbd, 0x00, 0xc7, 0x00, 0xb7, 0x87, 0x85, 0x85, 0x84, 0x83, >> + 0x86, 0x86, 0x86, 0x88, 0x81, 0x83, 0x80, 0x83, 0x84, 0x85, 0x8a, >> + 0x85, 0x7e, 0x9c, 0x9b, 0x85, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xc0, 0x00, 0xca, 0x00, 0xbb, 0x87, 0x86, 0x85, 0x83, 0x83, >> + 0x85, 0x86, 0x86, 0x88, 0x81, 0x83, 0x80, 0x84, 0x85, 0x86, 0x89, >> + 0x83, 0x7d, 0x9c, 0x99, 0x87, 0x7b, 0x7b, 0x7c, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xc4, 0x00, 0xcd, 0x00, 0xbe, 0x87, 0x86, 0x85, 0x83, 0x83, >> + 0x86, 0x85, 0x85, 0x87, 0x81, 0x82, 0x80, 0x82, 0x82, 0x83, 0x8a, >> + 0x85, 0x7f, 0x9f, 0x9b, 0x86, 0xb4, 0xa1, 0xac, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xc7, 0x00, 0xd0, 0x00, 0xc2, 0x87, 0x85, 0x85, 0x83, 0x82, >> + 0x85, 0x85, 0x85, 0x86, 0x82, 0x83, 0x80, 0x82, 0x82, 0x84, 0x87, >> + 0x86, 0x80, 0x9e, 0x9a, 0x87, 0xa7, 0x98, 0xa1, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xca, 0x00, 0xd2, 0x00, 0xc5, 0x87, 0x85, 0x84, 0x82, 0x82, >> + 0x84, 0x85, 0x85, 0x86, 0x81, 0x82, 0x7f, 0x82, 0x82, 0x84, 0x88, >> + 0x86, 0x81, 0x9d, 0x98, 0x86, 0x8d, 0x88, 0x8b, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xce, 0x00, 0xd6, 0x00, 0xca, 0x86, 0x85, 0x84, 0x83, 0x83, >> + 0x85, 0x84, 0x84, 0x85, 0x81, 0x82, 0x80, 0x81, 0x81, 0x82, 0x89, >> + 0x86, 0x81, 0x9c, 0x97, 0x86, 0xa7, 0x98, 0xa1, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xd1, 0x00, 0xd9, 0x00, 0xce, 0x86, 0x84, 0x83, 0x83, 0x82, >> + 0x85, 0x85, 0x85, 0x86, 0x81, 0x83, 0x81, 0x82, 0x82, 0x83, 0x86, >> + 0x83, 0x7f, 0x99, 0x95, 0x86, 0xbb, 0xa4, 0xb3, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xd4, 0x00, 0xdb, 0x00, 0xd1, 0x86, 0x85, 0x83, 0x83, 0x82, >> + 0x85, 0x84, 0x84, 0x85, 0x80, 0x83, 0x82, 0x80, 0x80, 0x81, 0x87, >> + 0x84, 0x81, 0x98, 0x93, 0x85, 0xae, 0x9c, 0xa8, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xd8, 0x00, 0xde, 0x00, 0xd6, 0x86, 0x84, 0x83, 0x81, 0x81, >> + 0x83, 0x85, 0x85, 0x85, 0x82, 0x83, 0x81, 0x81, 0x81, 0x83, 0x86, >> + 0x84, 0x80, 0x98, 0x91, 0x85, 0x7b, 0x7b, 0x7c, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xdc, 0x00, 0xe2, 0x00, 0xda, 0x85, 0x84, 0x83, 0x82, 0x82, >> + 0x84, 0x84, 0x84, 0x85, 0x81, 0x82, 0x82, 0x80, 0x80, 0x81, 0x83, >> + 0x82, 0x7f, 0x99, 0x93, 0x86, 0x94, 0x8b, 0x92, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xdf, 0x00, 0xe5, 0x00, 0xde, 0x85, 0x84, 0x82, 0x82, 0x82, >> + 0x84, 0x83, 0x83, 0x84, 0x81, 0x81, 0x80, 0x83, 0x82, 0x84, 0x82, >> + 0x81, 0x7f, 0x99, 0x92, 0x86, 0x7b, 0x7b, 0x7c, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xe4, 0x00, 0xe9, 0x00, 0xe3, 0x84, 0x83, 0x82, 0x81, 0x81, >> + 0x82, 0x83, 0x83, 0x84, 0x80, 0x81, 0x80, 0x83, 0x83, 0x84, 0x80, >> + 0x81, 0x7c, 0x99, 0x92, 0x87, 0xa1, 0x93, 0x9d, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xe4, 0x00, 0xe9, 0x00, 0xe3, 0x85, 0x84, 0x83, 0x81, 0x81, >> + 0x82, 0x82, 0x82, 0x83, 0x80, 0x81, 0x80, 0x81, 0x80, 0x82, 0x83, >> + 0x82, 0x80, 0x91, 0x8d, 0x83, 0x9a, 0x90, 0x96, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xe4, 0x00, 0xe9, 0x00, 0xe3, 0x84, 0x83, 0x82, 0x81, 0x81, >> + 0x82, 0x83, 0x83, 0x84, 0x80, 0x81, 0x80, 0x81, 0x80, 0x82, 0x83, >> + 0x81, 0x7f, 0x91, 0x8c, 0x82, 0x8d, 0x88, 0x8b, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xe4, 0x00, 0xe9, 0x00, 0xe3, 0x84, 0x83, 0x82, 0x81, 0x81, >> + 0x82, 0x83, 0x83, 0x83, 0x82, 0x82, 0x81, 0x81, 0x80, 0x82, 0x82, >> + 0x82, 0x7f, 0x94, 0x89, 0x84, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xe4, 0x00, 0xe9, 0x00, 0xe3, 0x84, 0x83, 0x82, 0x81, 0x81, >> + 0x82, 0x83, 0x83, 0x83, 0x82, 0x82, 0x81, 0x81, 0x80, 0x82, 0x83, >> + 0x82, 0x7f, 0x91, 0x85, 0x81, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xe4, 0x00, 0xe9, 0x00, 0xe3, 0x84, 0x83, 0x82, 0x81, 0x81, >> + 0x82, 0x83, 0x83, 0x83, 0x80, 0x80, 0x7f, 0x83, 0x82, 0x84, 0x83, >> + 0x82, 0x7f, 0x90, 0x84, 0x81, 0x9a, 0x90, 0x96, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xe4, 0x00, 0xe9, 0x00, 0xe3, 0x84, 0x83, 0x82, 0x80, 0x80, >> + 0x82, 0x83, 0x83, 0x83, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x81, 0x81, >> + 0x82, 0x83, 0x7e, 0x80, 0x7c, 0xa4, 0x97, 0x9f, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xe9, 0x00, 0xec, 0x00, 0xe8, 0x84, 0x83, 0x82, 0x81, 0x81, >> + 0x82, 0x82, 0x82, 0x83, 0x7f, 0x7f, 0x7f, 0x81, 0x80, 0x82, 0x83, >> + 0x83, 0x84, 0x79, 0x7c, 0x79, 0xb1, 0xa0, 0xaa, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xed, 0x00, 0xf0, 0x00, 0xec, 0x83, 0x83, 0x82, 0x80, 0x80, >> + 0x81, 0x82, 0x82, 0x82, 0x7f, 0x7f, 0x7e, 0x81, 0x81, 0x82, 0x80, >> + 0x81, 0x81, 0x84, 0x84, 0x83, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xf1, 0x00, 0xf4, 0x00, 0xf1, 0x83, 0x82, 0x82, 0x80, 0x80, >> + 0x81, 0x82, 0x82, 0x82, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x7d, >> + 0x7e, 0x7f, 0x84, 0x84, 0x83, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xf6, 0x00, 0xf7, 0x00, 0xf5, 0x82, 0x82, 0x81, 0x80, 0x80, >> + 0x80, 0x82, 0x82, 0x82, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x82, >> + 0x82, 0x82, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x00, 0xfa, 0x00, 0xfb, 0x00, 0xfa, 0x81, 0x81, 0x81, 0x80, 0x80, >> + 0x80, 0x82, 0x82, 0x82, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, >> + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, >> + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, >> + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, >> + 0x00, 0x00 }, >> + { 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, >> + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, >> + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, >> + 0x00, 0x00 } >> +}; >> + >> +unsigned char vint_table[S6E3HA2_VINT_STATUS_MAX] = { >> + 0x18, 0x19, 0x1a, 0x1b, 0x1c, >> + 0x1d, 0x1e, 0x1f, 0x20, 0x21 >> +}; >> + >> +struct s6e3ha2 { >> + struct device *dev; >> + struct drm_panel panel; >> + struct backlight_device *bl_dev; >> + >> + struct regulator_bulk_data supplies[2]; >> + struct gpio_desc *reset_gpio; >> + struct gpio_desc *enable_gpio; >> + >> + /* This field is tested by functions directly accessing DSI bus before >> + * transfer, transfer is skipped if it is set. In case of transfer >> + * failure or unexpected response the field is set to error value. >> + * Such construct allows to eliminate many checks in higher level >> + * functions. >> + */ >> + int error; >> +}; >> + >> +static int s6e3ha2_clear_error(struct s6e3ha2 *ctx) >> +{ >> + int ret = ctx->error; >> + >> + ctx->error = 0; >> + return ret; >> +} >> + >> +static void s6e3ha2_dcs_write(struct s6e3ha2 *ctx, const void *data, size_t len) >> +{ >> + struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev); >> + ssize_t ret; >> + >> + if (ctx->error < 0) >> + return; >> + >> + ret = mipi_dsi_dcs_write_buffer(dsi, data, len); >> + if (ret < 0) { >> + dev_err(ctx->dev, "error %zd writing dcs seq: %*ph\n", >> + ret, (int)len, data); >> + ctx->error = ret; >> + } >> +} >> + >> +#define s6e3ha2_dcs_write_seq_static(ctx, seq...) do { \ >> + static const u8 d[] = { seq }; \ >> + s6e3ha2_dcs_write(ctx, d, ARRAY_SIZE(d)); \ >> +} while (0) >> + >> +static void s6e3ha2_test_key_on_f0(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0xf0, 0x5a, 0x5a); >> +} >> + >> +static void s6e3ha2_test_key_off_f0(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0xf0, 0xa5, 0xa5); >> +} >> + >> +static void s6e3ha2_test_key_on_fc(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0xfc, 0x5a, 0x5a); >> +} >> + >> +static void s6e3ha2_test_key_off_fc(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0xfc, 0xa5, 0xa5); >> +} >> + >> +static void s6e3ha2_single_dsi_set(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0xf2, 0x67); >> + s6e3ha2_dcs_write_seq_static(ctx, 0xf9, 0x09); >> +} >> + >> +static void s6e3ha2_freq_calibration(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0xfd, 0x1c); >> + s6e3ha2_dcs_write_seq_static(ctx, 0xfe, 0x20, 0x39); >> + s6e3ha2_dcs_write_seq_static(ctx, 0xfe, 0xa0); >> + s6e3ha2_dcs_write_seq_static(ctx, 0xfe, 0x20); >> + s6e3ha2_dcs_write_seq_static(ctx, 0xce, 0x03, 0x3b, 0x12, 0x62, >> + 0x40, 0x80, 0xc0, 0x28, 0x28, 0x28, 0x28, 0x39, 0xc5); >> +} >> + >> +static void s6e3ha2_aor_control(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0xb2, 0x03, 0x10); >> +} >> + >> +static void s6e3ha2_caps_elvss_set(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0xb6, 0x9c, 0x0a); >> +} >> + >> +static void s6e3ha2_acl_off(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0x55, 0x00); >> +} >> + >> +static void s6e3ha2_acl_off_opr(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0xb5, 0x40); >> +} >> + >> +static void s6e3ha2_test_global(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0xb0, 0x07); >> +} >> + >> +static void s6e3ha2_test(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0xb8, 0x19); >> +} >> + >> +static void s6e3ha2_touch_hsync_on1(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, >> + 0xbd, 0x33, 0x11, 0x02, 0x16, 0x02, 0x16); >> +} >> + >> +static void s6e3ha2_pentile_control(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0xc0, 0x00, 0x00, 0xd8, 0xd8); >> +} >> + >> +static void s6e3ha2_poc_global(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0xb0, 0x20); >> +} >> + >> +static void s6e3ha2_poc_setting(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0xfe, 0x08); >> +} >> + >> +static void s6e3ha2_pcd_set_off(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0xcc, 0x40, 0x51); >> +} >> + >> +static void s6e3ha2_err_fg_set(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0xed, 0x44); >> +} >> + >> +static void s6e3ha2_hbm_off(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0x53, 0x00); >> +} >> + >> +static void s6e3ha2_te_start_setting(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0xb9, 0x10, 0x09, 0xff, 0x00, 0x09); >> +} >> + >> +static void s6e3ha2_gamma_update(struct s6e3ha2 *ctx) >> +{ >> + s6e3ha2_dcs_write_seq_static(ctx, 0xf7, 0x03); >> + ndelay(100); /* need for 100ns delay */ >> + s6e3ha2_dcs_write_seq_static(ctx, 0xf7, 0x00); >> +} >> + >> +static int s6e3ha2_get_brightness(struct backlight_device *bl_dev) >> +{ >> + return bl_dev->props.brightness; >> +} >> + >> +static void s6e3ha2_set_vint(struct s6e3ha2 *ctx) >> +{ >> + struct backlight_device *bl_dev = ctx->bl_dev; >> + unsigned int brightness = bl_dev->props.brightness; >> + unsigned char data[] = { 0xf4, 0x8b, >> + vint_table[brightness * (S6E3HA2_VINT_STATUS_MAX - 1) / >> + S6E3HA2_MAX_BRIGHTNESS] }; >> + >> + s6e3ha2_dcs_write(ctx, data, ARRAY_SIZE(data)); >> +} >> + >> +static unsigned int s6e3ha2_get_brightness_index(unsigned int brightness) >> +{ >> + return (brightness * (S6E3HA2_NUM_GAMMA_STEPS - 1)) / >> + S6E3HA2_MAX_BRIGHTNESS; >> +} >> + >> +static int s6e3ha2_update_gamma(struct s6e3ha2 *ctx, unsigned int brightness) >> +{ >> + struct backlight_device *bl_dev = ctx->bl_dev; >> + unsigned int index = s6e3ha2_get_brightness_index(brightness); >> + u8 data[S6E3HA2_GAMMA_CMD_CNT + 1] = { 0xca, }; >> + >> + memcpy(data + 1, gamma_tbl + index, S6E3HA2_GAMMA_CMD_CNT); >> + s6e3ha2_dcs_write(ctx, data, ARRAY_SIZE(data)); >> + >> + s6e3ha2_gamma_update(ctx); >> + bl_dev->props.brightness = brightness; >> + >> + return 0; >> +} >> + >> +static int s6e3ha2_set_brightness(struct backlight_device *bl_dev) >> +{ >> + struct s6e3ha2 *ctx = bl_get_data(bl_dev); >> + unsigned int brightness = bl_dev->props.brightness; >> + >> + if (brightness < S6E3HA2_MIN_BRIGHTNESS || >> + brightness > bl_dev->props.max_brightness) { >> + dev_err(ctx->dev, "Invalid brightness: %u\n", brightness); >> + return -EINVAL; >> + } >> + >> + if (bl_dev->props.power > FB_BLANK_NORMAL) >> + return -EPERM; >> + >> + s6e3ha2_test_key_on_f0(ctx); >> + s6e3ha2_update_gamma(ctx, brightness); >> + s6e3ha2_aor_control(ctx); >> + s6e3ha2_set_vint(ctx); >> + s6e3ha2_test_key_off_f0(ctx); >> + >> + return ctx->error; >> +} >> + >> +static const struct backlight_ops s6e3ha2_bl_ops = { >> + .get_brightness = s6e3ha2_get_brightness, >> + .update_status = s6e3ha2_set_brightness, >> +}; >> + >> +static int s6e3ha2_panel_init(struct s6e3ha2 *ctx) >> +{ >> + struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev); >> + int ret; >> + >> + ret = mipi_dsi_dcs_exit_sleep_mode(dsi); >> + if (ret < 0) >> + return ret; >> + usleep_range(5000, 6000); >> + >> + s6e3ha2_test_key_on_f0(ctx); >> + s6e3ha2_single_dsi_set(ctx); >> + s6e3ha2_test_key_on_fc(ctx); >> + s6e3ha2_freq_calibration(ctx); >> + s6e3ha2_test_key_off_fc(ctx); >> + s6e3ha2_test_key_off_f0(ctx); >> + >> + return 0; >> +} >> + >> +static int s6e3ha2_power_off(struct s6e3ha2 *ctx) >> +{ >> + return regulator_bulk_disable(ARRAY_SIZE(ctx->supplies), ctx->supplies); >> +} >> + >> +static int s6e3ha2_disable(struct drm_panel *panel) >> +{ >> + struct s6e3ha2 *ctx = container_of(panel, struct s6e3ha2, panel); >> + struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev); >> + int ret; >> + >> + ret = mipi_dsi_dcs_enter_sleep_mode(dsi); >> + if (ret < 0) >> + return ret; >> + >> + ret = mipi_dsi_dcs_set_display_off(dsi); >> + if (ret < 0) >> + return ret; >> + >> + msleep(40); >> + ctx->bl_dev->props.power = FB_BLANK_NORMAL; >> + >> + return 0; >> +} >> + >> +static int s6e3ha2_unprepare(struct drm_panel *panel) >> +{ >> + struct s6e3ha2 *ctx = container_of(panel, struct s6e3ha2, panel); >> + int ret; >> + >> + ret = s6e3ha2_clear_error(ctx); >> + if (!ret) >> + ctx->bl_dev->props.power = FB_BLANK_POWERDOWN; >> + >> + return s6e3ha2_power_off(ctx); >> +} >> + >> +static int s6e3ha2_power_on(struct s6e3ha2 *ctx) >> +{ >> + int ret; >> + >> + ret = regulator_bulk_enable(ARRAY_SIZE(ctx->supplies), ctx->supplies); >> + if (ret < 0) >> + return ret; >> + >> + msleep(120); >> + >> + gpiod_set_value(ctx->enable_gpio, 0); >> + usleep_range(5000, 6000); >> + gpiod_set_value(ctx->enable_gpio, 1); >> + >> + gpiod_set_value(ctx->reset_gpio, 1); >> + usleep_range(5000, 6000); >> + gpiod_set_value(ctx->reset_gpio, 0); >> + usleep_range(5000, 6000); >> + >> + return 0; >> +} >> +static int s6e3ha2_prepare(struct drm_panel *panel) >> +{ >> + struct s6e3ha2 *ctx = container_of(panel, struct s6e3ha2, panel); >> + int ret; >> + >> + ret = s6e3ha2_power_on(ctx); >> + if (ret < 0) >> + return ret; >> + >> + ret = s6e3ha2_panel_init(ctx); >> + if (ret < 0) >> + goto err; >> + >> + ret = s6e3ha2_clear_error(ctx); >> + if (ret < 0) >> + goto err; >> + >> + ctx->bl_dev->props.power = FB_BLANK_NORMAL; >> + >> + return 0; >> + >> +err: >> + s6e3ha2_power_off(ctx); >> + return ret; >> +} >> + >> +static int s6e3ha2_enable(struct drm_panel *panel) >> +{ >> + struct s6e3ha2 *ctx = container_of(panel, struct s6e3ha2, panel); >> + struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev); >> + int ret; >> + >> + /* common setting */ >> + ret = mipi_dsi_dcs_set_tear_on(dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK); >> + if (ret < 0) >> + return ret; >> + >> + s6e3ha2_test_key_on_f0(ctx); >> + s6e3ha2_test_key_on_fc(ctx); >> + s6e3ha2_touch_hsync_on1(ctx); >> + s6e3ha2_pentile_control(ctx); >> + s6e3ha2_poc_global(ctx); >> + s6e3ha2_poc_setting(ctx); >> + s6e3ha2_test_key_off_fc(ctx); >> + >> + /* pcd setting off for TB */ >> + s6e3ha2_pcd_set_off(ctx); >> + s6e3ha2_err_fg_set(ctx); >> + s6e3ha2_te_start_setting(ctx); >> + >> + /* brightness setting */ >> + s6e3ha2_set_brightness(ctx->bl_dev); >> + s6e3ha2_aor_control(ctx); >> + s6e3ha2_caps_elvss_set(ctx); >> + s6e3ha2_gamma_update(ctx); >> + s6e3ha2_acl_off(ctx); >> + s6e3ha2_acl_off_opr(ctx); >> + s6e3ha2_hbm_off(ctx); >> + >> + /* elvss temp compensation */ >> + s6e3ha2_test_global(ctx); >> + s6e3ha2_test(ctx); >> + s6e3ha2_test_key_off_f0(ctx); >> + >> + if (ctx->error != 0) >> + return ctx->error; >> + >> + ret = mipi_dsi_dcs_set_display_on(dsi); >> + if (ret < 0) >> + return ret; >> + >> + ctx->bl_dev->props.power = FB_BLANK_UNBLANK; >> + >> + return 0; >> +} >> + >> +static const struct drm_display_mode default_mode = { >> + .clock = 222372, >> + .hdisplay = 1440, >> + .hsync_start = 1440 + 1, >> + .hsync_end = 1440 + 1 + 1, >> + .htotal = 1440 + 1 + 1 + 1, >> + .vdisplay = 2560, >> + .vsync_start = 2560 + 1, >> + .vsync_end = 2560 + 1 + 1, >> + .vtotal = 2560 + 1 + 1 + 15, >> + .vrefresh = 60, >> + .flags = 0, >> +}; >> + >> +static int s6e3ha2_get_modes(struct drm_panel *panel) >> +{ >> + struct drm_connector *connector = panel->connector; >> + struct drm_display_mode *mode; >> + >> + mode = drm_mode_duplicate(panel->drm, &default_mode); >> + if (!mode) { >> + DRM_ERROR("failed to add mode %ux%ux@%u\n", >> + default_mode.hdisplay, default_mode.vdisplay, >> + default_mode.vrefresh); >> + return -ENOMEM; >> + } >> + >> + drm_mode_set_name(mode); >> + >> + mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; >> + drm_mode_probed_add(connector, mode); >> + >> + connector->display_info.width_mm = 71; >> + connector->display_info.height_mm = 125; >> + >> + return 1; >> +} >> + >> +static const struct drm_panel_funcs s6e3ha2_drm_funcs = { >> + .disable = s6e3ha2_disable, >> + .unprepare = s6e3ha2_unprepare, >> + .prepare = s6e3ha2_prepare, >> + .enable = s6e3ha2_enable, >> + .get_modes = s6e3ha2_get_modes, >> +}; >> + >> +static int s6e3ha2_probe(struct mipi_dsi_device *dsi) >> +{ >> + struct device *dev = &dsi->dev; >> + struct s6e3ha2 *ctx; >> + int ret; >> + >> + ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); >> + if (!ctx) >> + return -ENOMEM; >> + >> + mipi_dsi_set_drvdata(dsi, ctx); >> + >> + ctx->dev = dev; >> + >> + dsi->lanes = 4; >> + dsi->format = MIPI_DSI_FMT_RGB888; >> + dsi->mode_flags = MIPI_DSI_CLOCK_NON_CONTINUOUS; >> + >> + ctx->supplies[0].supply = "vdd3"; >> + ctx->supplies[1].supply = "vci"; >> + >> + ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(ctx->supplies), >> + ctx->supplies); >> + if (ret < 0) { >> + dev_err(dev, "failed to get regulators: %d\n", ret); >> + return ret; >> + } >> + >> + ctx->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); >> + if (IS_ERR(ctx->reset_gpio)) { >> + dev_err(dev, "cannot get reset-gpios %ld\n", >> + PTR_ERR(ctx->reset_gpio)); >> + return PTR_ERR(ctx->reset_gpio); >> + } >> + >> + ctx->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_HIGH); >> + if (IS_ERR(ctx->enable_gpio)) { >> + dev_err(dev, "cannot get enable-gpios %ld\n", >> + PTR_ERR(ctx->enable_gpio)); >> + return PTR_ERR(ctx->enable_gpio); >> + } >> + >> + ctx->bl_dev = backlight_device_register("s6e3ha2", dev, ctx, >> + &s6e3ha2_bl_ops, NULL); >> + if (IS_ERR(ctx->bl_dev)) { >> + dev_err(dev, "failed to register backlight device\n"); >> + return PTR_ERR(ctx->bl_dev); >> + } >> + >> + ctx->bl_dev->props.max_brightness = S6E3HA2_MAX_BRIGHTNESS; >> + ctx->bl_dev->props.brightness = S6E3HA2_DEFAULT_BRIGHTNESS; >> + ctx->bl_dev->props.power = FB_BLANK_POWERDOWN; >> + >> + drm_panel_init(&ctx->panel); >> + ctx->panel.dev = dev; >> + ctx->panel.funcs = &s6e3ha2_drm_funcs; >> + >> + ret = drm_panel_add(&ctx->panel); >> + if (ret < 0) >> + goto unregister_backlight; >> + >> + ret = mipi_dsi_attach(dsi); >> + if (ret < 0) >> + goto remove_panel; >> + >> + return ret; >> + >> +remove_panel: >> + drm_panel_remove(&ctx->panel); >> + >> +unregister_backlight: >> + backlight_device_unregister(ctx->bl_dev); >> + >> + return ret; >> +} >> + >> +static int s6e3ha2_remove(struct mipi_dsi_device *dsi) >> +{ >> + struct s6e3ha2 *ctx = mipi_dsi_get_drvdata(dsi); >> + >> + mipi_dsi_detach(dsi); >> + drm_panel_remove(&ctx->panel); >> + backlight_device_unregister(ctx->bl_dev); >> + >> + return 0; >> +} >> + >> +static const struct of_device_id s6e3ha2_of_match[] = { >> + { .compatible = "samsung,s6e3ha2" }, >> + { } >> +}; >> +MODULE_DEVICE_TABLE(of, s6e3ha2_of_match); >> + >> +static struct mipi_dsi_driver s6e3ha2_driver = { >> + .probe = s6e3ha2_probe, >> + .remove = s6e3ha2_remove, >> + .driver = { >> + .name = "panel-samsung-s6e3ha2", >> + .of_match_table = s6e3ha2_of_match, >> + }, >> +}; >> +module_mipi_dsi_driver(s6e3ha2_driver); >> + >> +MODULE_AUTHOR("Donghwa Lee "); >> +MODULE_AUTHOR("Hyungwon Hwang "); >> +MODULE_AUTHOR("Hoegeun Kwon "); >> +MODULE_DESCRIPTION("MIPI-DSI based s6e3ha2 AMOLED Panel Driver"); >> +MODULE_LICENSE("GPL v2"); > > -- > To unsubscribe from this list: send the line "unsubscribe devicetree" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > >