From mboxrd@z Thu Jan 1 00:00:00 1970 From: Patrice CHOTARD Subject: Re: [PATCH v2 04/10] video: add support of panel OTM8009A Date: Tue, 13 Mar 2018 08:52:09 +0000 Message-ID: <897d61dc-cf79-d603-00f4-84bdfd809bdc@st.com> References: <1520005451-23217-1-git-send-email-yannick.fertre@st.com> <1520005451-23217-5-git-send-email-yannick.fertre@st.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1520005451-23217-5-git-send-email-yannick.fertre@st.com> Content-Language: en-US Content-ID: <214933FBF1DE804F89B9646E1CBF8F6F@st.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" To: Yannick FERTRE , Vikas MANOCHA , Benjamin Gaignard , Philippe CORNU , Patrick DELAUNAY , Christophe KERELLO , Archit Taneja , Andrzej Hajda , Laurent Pinchart , David Airlie , Brian Norris , Bhumika Goyal , Gustavo Padovan , Maarten Lankhorst , Sean Paul , Albert Aribaud , Simon Glass , Anatolij Gustschin , Thierry Reding Cc: "u-boot@lists.denx.de" , "linux-kernel@vger.kernel.org" , "dri-devel@lists.freedesktop.org" List-Id: dri-devel@lists.freedesktop.org SGkgWWFubmljaw0KDQpPbiAwMy8wMi8yMDE4IDA0OjQ0IFBNLCB5YW5uaWNrIGZlcnRyZSB3cm90 ZToNCj4gU3VwcG9ydCBmb3IgT3Jpc2UgVGVjaCBvdG04MDA5YSA0ODBwIGRzaSAyZGwgdmlkZW8g bW9kZSBwYW5lbC4NCj4gDQo+IFNpZ25lZC1vZmYtYnk6IHlhbm5pY2sgZmVydHJlIDx5YW5uaWNr LmZlcnRyZUBzdC5jb20+DQo+IC0tLQ0KPiAgIGRyaXZlcnMvdmlkZW8vS2NvbmZpZyAgICAgICAg ICAgICAgfCAgIDggKw0KPiAgIGRyaXZlcnMvdmlkZW8vTWFrZWZpbGUgICAgICAgICAgICAgfCAg IDEgKw0KPiAgIGRyaXZlcnMvdmlkZW8vb3Jpc2V0ZWNoX290bTgwMDlhLmMgfCAzMjkgKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKw0KPiAgIDMgZmlsZXMgY2hhbmdlZCwgMzM4 IGluc2VydGlvbnMoKykNCj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy92aWRlby9vcmlz ZXRlY2hfb3RtODAwOWEuYw0KPiANCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vS2NvbmZp ZyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZw0KPiBpbmRleCAxOTgxMjk4Li5iNWZjNTM1IDEwMDY0 NA0KPiAtLS0gYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcNCj4gKysrIGIvZHJpdmVycy92aWRlby9L Y29uZmlnDQo+IEBAIC0zMjAsNiArMzIwLDE0IEBAIGNvbmZpZyBWSURFT19MQ0RfQU5YOTgwNA0K PiAgIAlmcm9tIGEgcGFyYWxsZWwgTENEIGludGVyZmFjZSBhbmQgdHJhbnNsYXRlIGl0IG9uIHRo ZSBmeSBpbnRvIGEgRFANCj4gICAJaW50ZXJmYWNlIGZvciBkcml2aW5nIGVEUCBURlQgZGlzcGxh eXMuIEl0IHVzZXMgSTJDIGZvciBjb25maWd1cmF0aW9uLg0KPiAgIA0KPiArY29uZmlnIFZJREVP X0xDRF9PUklTRVRFQ0hfT1RNODAwOUENCj4gKwlib29sICJPVE04MDA5QSBEU0kgTENEIHBhbmVs IHN1cHBvcnQiDQo+ICsJZGVwZW5kcyBvbiBETV9WSURFTw0KPiArCXNlbGVjdCBWSURFT19NSVBJ X0RTSQ0KPiArCWRlZmF1bHQgbg0KPiArCS0tLWhlbHAtLS0NCj4gKwlTdXBwb3J0IGZvciBPcmlz ZSBUZWNoIG90bTgwMDlhIDQ4MHAgZHNpIDJkbCB2aWRlbyBtb2RlIHBhbmVsLg0KPiArDQo+ICAg Y29uZmlnIFZJREVPX0xDRF9TU0QyODI4DQo+ICAgCWJvb2wgIlNTRDI4MjggYnJpZGdlIGNoaXAi DQo+ICAgCWRlZmF1bHQgbg0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9NYWtlZmlsZSBi L2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUNCj4gaW5kZXggNmY0MmNjYS4uNjUwMDJhZiAxMDA2NDQN Cj4gLS0tIGEvZHJpdmVycy92aWRlby9NYWtlZmlsZQ0KPiArKysgYi9kcml2ZXJzL3ZpZGVvL01h a2VmaWxlDQo+IEBAIC0zNyw2ICszNyw3IEBAIG9iai0kKENPTkZJR19WSURFT19DT1JFQk9PVCkg Kz0gY29yZWJvb3Qubw0KPiAgIG9iai0kKENPTkZJR19WSURFT19EQThYWCkgKz0gZGE4eHgtZmIu byB2aWRlb21vZGVzLm8NCj4gICBvYmotJChDT05GSUdfVklERU9fTENEX0FOWDk4MDQpICs9IGFu eDk4MDQubw0KPiAgIG9iai0kKENPTkZJR19WSURFT19MQ0RfSElUQUNISV9UWDE4RDQyVk0pICs9 IGhpdGFjaGlfdHgxOGQ0MnZtX2xjZC5vDQo+ICtvYmotJChDT05GSUdfVklERU9fTENEX09SSVNF VEVDSF9PVE04MDA5QSkgKz0gb3Jpc2V0ZWNoX290bTgwMDlhLm8NCj4gICBvYmotJChDT05GSUdf VklERU9fTENEX1NTRDI4MjgpICs9IHNzZDI4Mjgubw0KPiAgIG9iai0kKENPTkZJR19WSURFT19N Qjg2Mnh4KSArPSBtYjg2Mnh4Lm8gdmlkZW9tb2Rlcy5vDQo+ICAgb2JqLSQoQ09ORklHX1ZJREVP X01YMykgKz0gbXgzZmIubyB2aWRlb21vZGVzLm8NCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlk ZW8vb3Jpc2V0ZWNoX290bTgwMDlhLmMgYi9kcml2ZXJzL3ZpZGVvL29yaXNldGVjaF9vdG04MDA5 YS5jDQo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+IGluZGV4IDAwMDAwMDAuLjc5ZjJkYTgNCj4g LS0tIC9kZXYvbnVsbA0KPiArKysgYi9kcml2ZXJzL3ZpZGVvL29yaXNldGVjaF9vdG04MDA5YS5j DQo+IEBAIC0wLDAgKzEsMzI5IEBADQo+ICsvKg0KPiArICogQ29weXJpZ2h0IChDKSAyMDE4IFNU TWljcm9lbGVjdHJvbmljcyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQNCj4gKyAqIEF1dGhvcihzKTog WWFubmljayBGZXJ0cmUgPHlhbm5pY2suZmVydHJlQHN0LmNvbT4gZm9yIFNUTWljcm9lbGVjdHJv bmljcy4NCj4gKyAqCSAgICAgIFBoaWxpcHBlIENvcm51IDxwaGlsaXBwZS5jb3JudUBzdC5jb20+ IGZvciBTVE1pY3JvZWxlY3Ryb25pY3MuDQo+ICsgKg0KPiArICogVGhpcyBvdG04MDA5YSBwYW5l bCBkcml2ZXIgaXMgYmFzZWQgb24gdGhlIHBhbmVsIGRyaXZlciBmcm9tDQo+ICsgKiBkcml2ZXJz L2dwdS9kcm0vcGFuZWwvcGFuZWwtb3Jpc2V0ZWNoLW90bTgwMDlhLmMgKGtlcm5lbCBsaW51eCkN Cj4gKyAqDQo+ICsgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMA0KPiArICovDQo+ ICsjaW5jbHVkZSA8YXNtL2dwaW8uaD4NCj4gKyNpbmNsdWRlIDxiYWNrbGlnaHQuaD4NCj4gKyNp bmNsdWRlIDxjb21tb24uaD4NCj4gKyNpbmNsdWRlIDxkbS5oPg0KPiArI2luY2x1ZGUgPHBhbmVs Lmg+DQo+ICsjaW5jbHVkZSA8cG93ZXIvcmVndWxhdG9yLmg+DQo+ICsjaW5jbHVkZSA8bWlwaV9k aXNwbGF5Lmg+DQo+ICsNCj4gK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOw0KPiArDQo+ICsjZGVm aW5lIERSVl9OQU1FICJvcmlzZXRlY2hfb3RtODAwOWEiDQo+ICsNCj4gKyNkZWZpbmUgT1RNODAw OUFfQkFDS0xJR0hUX0RFRkFVTFQJMjQwDQo+ICsjZGVmaW5lIE9UTTgwMDlBX0JBQ0tMSUdIVF9N QVgJCTI1NQ0KPiArDQo+ICsvKiBNYW51ZmFjdHVyZXIgQ29tbWFuZCBTZXQgKi8NCj4gKyNkZWZp bmUgTUNTX0FEUlNGVAkweDAwMDAJLyogQWRkcmVzcyBTaGlmdCBGdW5jdGlvbiAqLw0KPiArI2Rl ZmluZSBNQ1NfUEFOU0VUCTB4QjNBNgkvKiBQYW5lbCBUeXBlIFNldHRpbmcgKi8NCj4gKyNkZWZp bmUgTUNTX1NEX0NUUkwJMHhDMEEyCS8qIFNvdXJjZSBEcml2ZXIgVGltaW5nIFNldHRpbmcgKi8N Cj4gKyNkZWZpbmUgTUNTX1BfRFJWX00JMHhDMEI0CS8qIFBhbmVsIERyaXZpbmcgTW9kZSAqLw0K PiArI2RlZmluZSBNQ1NfT1NDX0FESgkweEMxODEJLyogT3NjaWxsYXRvciBBZGp1c3RtZW50IGZv ciBJZGxlL05vcm1hbCBtb2RlICovDQo+ICsjZGVmaW5lIE1DU19SR0JfVklEX1NFVAkweEMxQTEJ LyogUkdCIFZpZGVvIE1vZGUgU2V0dGluZyAqLw0KPiArI2RlZmluZSBNQ1NfU0RfUENIX0NUUkwJ MHhDNDgwCS8qIFNvdXJjZSBEcml2ZXIgUHJlY2hhcmdlIENvbnRyb2wgKi8NCj4gKyNkZWZpbmUg TUNTX05PX0RPQzEJMHhDNDhBCS8qIENvbW1hbmQgbm90IGRvY3VtZW50ZWQgKi8NCj4gKyNkZWZp bmUgTUNTX1BXUl9DVFJMMQkweEM1ODAJLyogUG93ZXIgQ29udHJvbCBTZXR0aW5nIDEgKi8NCj4g KyNkZWZpbmUgTUNTX1BXUl9DVFJMMgkweEM1OTAJLyogUG93ZXIgQ29udHJvbCBTZXR0aW5nIDIg Zm9yIE5vcm1hbCBNb2RlICovDQo+ICsjZGVmaW5lIE1DU19QV1JfQ1RSTDQJMHhDNUIwCS8qIFBv d2VyIENvbnRyb2wgU2V0dGluZyA0IGZvciBEQyBWb2x0YWdlICovDQo+ICsjZGVmaW5lIE1DU19Q QU5DVFJMU0VUMQkweENCODAJLyogUGFuZWwgQ29udHJvbCBTZXR0aW5nIDEgKi8NCj4gKyNkZWZp bmUgTUNTX1BBTkNUUkxTRVQyCTB4Q0I5MAkvKiBQYW5lbCBDb250cm9sIFNldHRpbmcgMiAqLw0K PiArI2RlZmluZSBNQ1NfUEFOQ1RSTFNFVDMJMHhDQkEwCS8qIFBhbmVsIENvbnRyb2wgU2V0dGlu ZyAzICovDQo+ICsjZGVmaW5lIE1DU19QQU5DVFJMU0VUNAkweENCQjAJLyogUGFuZWwgQ29udHJv bCBTZXR0aW5nIDQgKi8NCj4gKyNkZWZpbmUgTUNTX1BBTkNUUkxTRVQ1CTB4Q0JDMAkvKiBQYW5l bCBDb250cm9sIFNldHRpbmcgNSAqLw0KPiArI2RlZmluZSBNQ1NfUEFOQ1RSTFNFVDYJMHhDQkQw CS8qIFBhbmVsIENvbnRyb2wgU2V0dGluZyA2ICovDQo+ICsjZGVmaW5lIE1DU19QQU5DVFJMU0VU NwkweENCRTAJLyogUGFuZWwgQ29udHJvbCBTZXR0aW5nIDcgKi8NCj4gKyNkZWZpbmUgTUNTX1BB TkNUUkxTRVQ4CTB4Q0JGMAkvKiBQYW5lbCBDb250cm9sIFNldHRpbmcgOCAqLw0KPiArI2RlZmlu ZSBNQ1NfUEFOVTJEMQkweENDODAJLyogUGFuZWwgVTJEIFNldHRpbmcgMSAqLw0KPiArI2RlZmlu ZSBNQ1NfUEFOVTJEMgkweENDOTAJLyogUGFuZWwgVTJEIFNldHRpbmcgMiAqLw0KPiArI2RlZmlu ZSBNQ1NfUEFOVTJEMwkweENDQTAJLyogUGFuZWwgVTJEIFNldHRpbmcgMyAqLw0KPiArI2RlZmlu ZSBNQ1NfUEFORDJVMQkweENDQjAJLyogUGFuZWwgRDJVIFNldHRpbmcgMSAqLw0KPiArI2RlZmlu ZSBNQ1NfUEFORDJVMgkweENDQzAJLyogUGFuZWwgRDJVIFNldHRpbmcgMiAqLw0KPiArI2RlZmlu ZSBNQ1NfUEFORDJVMwkweENDRDAJLyogUGFuZWwgRDJVIFNldHRpbmcgMyAqLw0KPiArI2RlZmlu ZSBNQ1NfR09BVlNUCTB4Q0U4MAkvKiBHT0EgVlNUIFNldHRpbmcgKi8NCj4gKyNkZWZpbmUgTUNT X0dPQUNMS0ExCTB4Q0VBMAkvKiBHT0EgQ0xLQTEgU2V0dGluZyAqLw0KPiArI2RlZmluZSBNQ1Nf R09BQ0xLQTMJMHhDRUIwCS8qIEdPQSBDTEtBMyBTZXR0aW5nICovDQo+ICsjZGVmaW5lIE1DU19H T0FFQ0xLCTB4Q0ZDMAkvKiBHT0EgRUNMSyBTZXR0aW5nICovDQo+ICsjZGVmaW5lIE1DU19OT19E T0MyCTB4Q0ZEMAkvKiBDb21tYW5kIG5vdCBkb2N1bWVudGVkICovDQo+ICsjZGVmaW5lIE1DU19H VkREU0VUCTB4RDgwMAkvKiBHVkREL05HVkREICovDQo+ICsjZGVmaW5lIE1DU19WQ09NREMJMHhE OTAwCS8qIFZDT00gVm9sdGFnZSBTZXR0aW5nICovDQo+ICsjZGVmaW5lIE1DU19HTUNUMl8yUAkw eEUxMDAJLyogR2FtbWEgQ29ycmVjdGlvbiAyLjIrIFNldHRpbmcgKi8NCj4gKyNkZWZpbmUgTUNT X0dNQ1QyXzJOCTB4RTIwMAkvKiBHYW1tYSBDb3JyZWN0aW9uIDIuMi0gU2V0dGluZyAqLw0KPiAr I2RlZmluZSBNQ1NfTk9fRE9DMwkweEY1QjYJLyogQ29tbWFuZCBub3QgZG9jdW1lbnRlZCAqLw0K PiArI2RlZmluZSBNQ1NfQ01EMl9FTkExCTB4RkYwMAkvKiBFbmFibGUgQWNjZXNzIENvbW1hbmQy ICJDTUQyIiAqLw0KPiArI2RlZmluZSBNQ1NfQ01EMl9FTkEyCTB4RkY4MAkvKiBFbmFibGUgQWNj ZXNzIE9yaXNlIENvbW1hbmQyICovDQo+ICsNCj4gK3N0cnVjdCBvdG04MDA5YV9wYW5lbF9wcml2 IHsNCj4gKwlzdHJ1Y3QgdWRldmljZSAqcmVnOw0KPiArCXN0cnVjdCBncGlvX2Rlc2MgcmVzZXQ7 DQo+ICt9Ow0KPiArDQo+ICtzdGF0aWMgdm9pZCBvdG04MDA5YV9kY3Nfd3JpdGVfYnVmKHN0cnVj dCB1ZGV2aWNlICpkZXYsIGNvbnN0IHZvaWQgKmRhdGEsDQo+ICsJCQkJICAgc2l6ZV90IGxlbikN Cj4gK3sNCj4gKwlzdHJ1Y3QgbWlwaV9kc2lfcGFuZWxfcGxhdCAqcGxhdCA9IGRldl9nZXRfcGxh dGRhdGEoZGV2KTsNCj4gKwlzdHJ1Y3QgbWlwaV9kc2lfZGV2aWNlICpkZXZpY2UgPSBwbGF0LT5k ZXZpY2U7DQo+ICsNCj4gKwlpZiAobWlwaV9kc2lfZGNzX3dyaXRlX2J1ZmZlcihkZXZpY2UsIGRh dGEsIGxlbikgPCAwKQ0KPiArCQlwcl9lcnIoIm1pcGkgZHNpIGRjcyB3cml0ZSBidWZmZXIgZmFp bGVkXG4iKTsNCg0KDQpkZXZfZXJyKCkNCg0KPiArfQ0KPiArDQo+ICsjZGVmaW5lIGRjc193cml0 ZV9zZXEoZGV2LCBzZXEuLi4pCQkJCVwNCj4gKyh7CQkJCQkJCQlcDQo+ICsJc3RhdGljIGNvbnN0 IHU4IGRbXSA9IHsgc2VxIH07CQkJCVwNCj4gKwlvdG04MDA5YV9kY3Nfd3JpdGVfYnVmKGRldiwg ZCwgQVJSQVlfU0laRShkKSk7CQlcDQo+ICt9KQ0KPiArDQo+ICsjZGVmaW5lIGRjc193cml0ZV9j bWRfYXQoZGV2LCBjbWQsIHNlcS4uLikJCVwNCj4gKyh7CQkJCQkJCVwNCj4gKwlzdGF0aWMgY29u c3QgdTE2IGMgPSBjbWQ7CQkJXA0KPiArCXN0cnVjdCB1ZGV2aWNlICpkZXZpY2UgPSBkZXY7CQkJ XA0KPiArCWRjc193cml0ZV9zZXEoZGV2aWNlLCBNQ1NfQURSU0ZULCAoYykgJiAweEZGKTsJXA0K PiArCWRjc193cml0ZV9zZXEoZGV2aWNlLCAoYykgPj4gOCwgc2VxKTsJCVwNCj4gK30pDQo+ICsN Cj4gK3N0YXRpYyBpbnQgb3RtODAwOWFfaW5pdF9zZXF1ZW5jZShzdHJ1Y3QgdWRldmljZSAqZGV2 KQ0KPiArew0KPiArCXN0cnVjdCBtaXBpX2RzaV9wYW5lbF9wbGF0ICpwbGF0ID0gZGV2X2dldF9w bGF0ZGF0YShkZXYpOw0KPiArCXN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRldmljZSA9IHBsYXQt PmRldmljZTsNCj4gKwlpbnQgcmV0Ow0KPiArDQo+ICsJLyogRW50ZXIgQ01EMiAqLw0KPiArCWRj c193cml0ZV9jbWRfYXQoZGV2LCBNQ1NfQ01EMl9FTkExLCAweDgwLCAweDA5LCAweDAxKTsNCj4g Kw0KPiArCS8qIEVudGVyIE9yaXNlIENvbW1hbmQyICovDQo+ICsJZGNzX3dyaXRlX2NtZF9hdChk ZXYsIE1DU19DTUQyX0VOQTIsIDB4ODAsIDB4MDkpOw0KPiArDQo+ICsJZGNzX3dyaXRlX2NtZF9h dChkZXYsIE1DU19TRF9QQ0hfQ1RSTCwgMHgzMCk7DQo+ICsJbWRlbGF5KDEwKTsNCj4gKw0KPiAr CWRjc193cml0ZV9jbWRfYXQoZGV2LCBNQ1NfTk9fRE9DMSwgMHg0MCk7DQo+ICsJbWRlbGF5KDEw KTsNCj4gKw0KPiArCWRjc193cml0ZV9jbWRfYXQoZGV2LCBNQ1NfUFdSX0NUUkw0ICsgMSwgMHhB OSk7DQo+ICsJZGNzX3dyaXRlX2NtZF9hdChkZXYsIE1DU19QV1JfQ1RSTDIgKyAxLCAweDM0KTsN Cj4gKwlkY3Nfd3JpdGVfY21kX2F0KGRldiwgTUNTX1BfRFJWX00sIDB4NTApOw0KPiArCWRjc193 cml0ZV9jbWRfYXQoZGV2LCBNQ1NfVkNPTURDLCAweDRFKTsNCj4gKwlkY3Nfd3JpdGVfY21kX2F0 KGRldiwgTUNTX09TQ19BREosIDB4NjYpOyAvKiA2NUh6ICovDQo+ICsJZGNzX3dyaXRlX2NtZF9h dChkZXYsIE1DU19QV1JfQ1RSTDIgKyAyLCAweDAxKTsNCj4gKwlkY3Nfd3JpdGVfY21kX2F0KGRl diwgTUNTX1BXUl9DVFJMMiArIDUsIDB4MzQpOw0KPiArCWRjc193cml0ZV9jbWRfYXQoZGV2LCBN Q1NfUFdSX0NUUkwyICsgNCwgMHgzMyk7DQo+ICsJZGNzX3dyaXRlX2NtZF9hdChkZXYsIE1DU19H VkREU0VULCAweDc5LCAweDc5KTsNCj4gKwlkY3Nfd3JpdGVfY21kX2F0KGRldiwgTUNTX1NEX0NU UkwgKyAxLCAweDFCKTsNCj4gKwlkY3Nfd3JpdGVfY21kX2F0KGRldiwgTUNTX1BXUl9DVFJMMSAr IDIsIDB4ODMpOw0KPiArCWRjc193cml0ZV9jbWRfYXQoZGV2LCBNQ1NfU0RfUENIX0NUUkwgKyAx LCAweDgzKTsNCj4gKwlkY3Nfd3JpdGVfY21kX2F0KGRldiwgTUNTX1JHQl9WSURfU0VULCAweDBF KTsNCj4gKwlkY3Nfd3JpdGVfY21kX2F0KGRldiwgTUNTX1BBTlNFVCwgMHgwMCwgMHgwMSk7DQo+ ICsNCj4gKwlkY3Nfd3JpdGVfY21kX2F0KGRldiwgTUNTX0dPQVZTVCwgMHg4NSwgMHgwMSwgMHgw MCwgMHg4NCwgMHgwMSwgMHgwMCk7DQo+ICsJZGNzX3dyaXRlX2NtZF9hdChkZXYsIE1DU19HT0FD TEtBMSwgMHgxOCwgMHgwNCwgMHgwMywgMHgzOSwgMHgwMCwgMHgwMCwNCj4gKwkJCSAweDAwLCAw eDE4LCAweDAzLCAweDAzLCAweDNBLCAweDAwLCAweDAwLCAweDAwKTsNCj4gKwlkY3Nfd3JpdGVf Y21kX2F0KGRldiwgTUNTX0dPQUNMS0EzLCAweDE4LCAweDAyLCAweDAzLCAweDNCLCAweDAwLCAw eDAwLA0KPiArCQkJIDB4MDAsIDB4MTgsIDB4MDEsIDB4MDMsIDB4M0MsIDB4MDAsIDB4MDAsIDB4 MDApOw0KPiArCWRjc193cml0ZV9jbWRfYXQoZGV2LCBNQ1NfR09BRUNMSywgMHgwMSwgMHgwMSwg MHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwNCj4gKwkJCSAweDAxLCAweDAyLCAweDAwLCAweDAwKTsN Cj4gKw0KPiArCWRjc193cml0ZV9jbWRfYXQoZGV2LCBNQ1NfTk9fRE9DMiwgMHgwMCk7DQo+ICsN Cj4gKwlkY3Nfd3JpdGVfY21kX2F0KGRldiwgTUNTX1BBTkNUUkxTRVQxLCAwLCAwLCAwLCAwLCAw LCAwLCAwLCAwLCAwLCAwKTsNCj4gKwlkY3Nfd3JpdGVfY21kX2F0KGRldiwgTUNTX1BBTkNUUkxT RVQyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KPiArCQkJIDAsIDAsIDAsIDAsIDAp Ow0KPiArCWRjc193cml0ZV9jbWRfYXQoZGV2LCBNQ1NfUEFOQ1RSTFNFVDMsIDAsIDAsIDAsIDAs IDAsIDAsIDAsIDAsIDAsIDAsDQo+ICsJCQkgMCwgMCwgMCwgMCwgMCk7DQo+ICsJZGNzX3dyaXRl X2NtZF9hdChkZXYsIE1DU19QQU5DVFJMU0VUNCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwg MCk7DQo+ICsJZGNzX3dyaXRlX2NtZF9hdChkZXYsIE1DU19QQU5DVFJMU0VUNSwgMCwgNCwgNCwg NCwgNCwgNCwgMCwgMCwgMCwgMCwNCj4gKwkJCSAwLCAwLCAwLCAwLCAwKTsNCj4gKwlkY3Nfd3Jp dGVfY21kX2F0KGRldiwgTUNTX1BBTkNUUkxTRVQ2LCAwLCAwLCAwLCAwLCAwLCAwLCA0LCA0LCA0 LCA0LA0KPiArCQkJIDQsIDAsIDAsIDAsIDApOw0KPiArCWRjc193cml0ZV9jbWRfYXQoZGV2LCBN Q1NfUEFOQ1RSTFNFVDcsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApOw0KPiArCWRjc193 cml0ZV9jbWRfYXQoZGV2LCBNQ1NfUEFOQ1RSTFNFVDgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYs IDB4RkYsDQo+ICsJCQkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRik7DQo+ICsNCj4gKwlk Y3Nfd3JpdGVfY21kX2F0KGRldiwgTUNTX1BBTlUyRDEsIDB4MDAsIDB4MjYsIDB4MDksIDB4MEIs IDB4MDEsIDB4MjUsDQo+ICsJCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCk7DQo+ICsJZGNzX3dy aXRlX2NtZF9hdChkZXYsIE1DU19QQU5VMkQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAw LCAweDAwLA0KPiArCQkJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjYsIDB4MEEs IDB4MEMsIDB4MDIpOw0KPiArCWRjc193cml0ZV9jbWRfYXQoZGV2LCBNQ1NfUEFOVTJEMywgMHgy NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCj4gKwkJCSAweDAwLCAweDAwLCAweDAw LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwKTsNCj4gKwlkY3Nfd3JpdGVfY21k X2F0KGRldiwgTUNTX1BBTkQyVTEsIDB4MDAsIDB4MjUsIDB4MEMsIDB4MEEsIDB4MDIsIDB4MjYs DQo+ICsJCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCk7DQo+ICsJZGNzX3dyaXRlX2NtZF9hdChk ZXYsIE1DU19QQU5EMlUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KPiAr CQkJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MEIsIDB4MDksIDB4MDEp Ow0KPiArCWRjc193cml0ZV9jbWRfYXQoZGV2LCBNQ1NfUEFORDJVMywgMHgyNiwgMHgwMCwgMHgw MCwgMHgwMCwgMHgwMCwgMHgwMCwNCj4gKwkJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAw LCAweDAwLCAweDAwLCAweDAwLCAweDAwKTsNCj4gKw0KPiArCWRjc193cml0ZV9jbWRfYXQoZGV2 LCBNQ1NfUFdSX0NUUkwxICsgMSwgMHg2Nik7DQo+ICsNCj4gKwlkY3Nfd3JpdGVfY21kX2F0KGRl diwgTUNTX05PX0RPQzMsIDB4MDYpOw0KPiArDQo+ICsJZGNzX3dyaXRlX2NtZF9hdChkZXYsIE1D U19HTUNUMl8yUCwgMHgwMCwgMHgwOSwgMHgwRiwgMHgwRSwgMHgwNywgMHgxMCwNCj4gKwkJCSAw eDBCLCAweDBBLCAweDA0LCAweDA3LCAweDBCLCAweDA4LCAweDBGLCAweDEwLCAweDBBLA0KPiAr CQkJIDB4MDEpOw0KPiArCWRjc193cml0ZV9jbWRfYXQoZGV2LCBNQ1NfR01DVDJfMk4sIDB4MDAs IDB4MDksIDB4MEYsIDB4MEUsIDB4MDcsIDB4MTAsDQo+ICsJCQkgMHgwQiwgMHgwQSwgMHgwNCwg MHgwNywgMHgwQiwgMHgwOCwgMHgwRiwgMHgxMCwgMHgwQSwNCj4gKwkJCSAweDAxKTsNCj4gKw0K PiArCS8qIEV4aXQgQ01EMiAqLw0KPiArCWRjc193cml0ZV9jbWRfYXQoZGV2LCBNQ1NfQ01EMl9F TkExLCAweEZGLCAweEZGLCAweEZGKTsNCj4gKw0KPiArCXJldCA9ICBtaXBpX2RzaV9kY3Nfbm9w KGRldmljZSk7DQo+ICsJaWYgKHJldCkNCj4gKwkJcmV0dXJuIHJldDsNCj4gKw0KPiArCXJldCA9 IG1pcGlfZHNpX2Rjc19leGl0X3NsZWVwX21vZGUoZGV2aWNlKTsNCj4gKwlpZiAocmV0KQ0KPiAr CQlyZXR1cm4gcmV0Ow0KPiArDQo+ICsJLyogV2FpdCBmb3Igc2xlZXAgb3V0IGV4aXQgKi8NCj4g KwltZGVsYXkoMTIwKTsNCj4gKw0KPiArCS8qIERlZmF1bHQgcG9ydHJhaXQgNDgweDgwMCByZ2Iy NCAqLw0KPiArCWRjc193cml0ZV9zZXEoZGV2LCBNSVBJX0RDU19TRVRfQUREUkVTU19NT0RFLCAw eDAwKTsNCj4gKw0KPiArCXJldCA9ICBtaXBpX2RzaV9kY3Nfc2V0X2NvbHVtbl9hZGRyZXNzKGRl dmljZSwgMCwgNDc5KTsNCj4gKwlpZiAocmV0KQ0KPiArCQlyZXR1cm4gcmV0Ow0KPiArDQo+ICsJ cmV0ID0gIG1pcGlfZHNpX2Rjc19zZXRfcGFnZV9hZGRyZXNzKGRldmljZSwgMCwgNzk5KTsNCj4g KwlpZiAocmV0KQ0KPiArCQlyZXR1cm4gcmV0Ow0KPiArDQo+ICsJLyogU2VlIG90bTgwMDlhIGRy aXZlciBkb2N1bWVudGF0aW9uIGZvciBwaXhlbCBmb3JtYXQgZGVzY3JpcHRpb25zICovDQo+ICsJ cmV0ID0gIG1pcGlfZHNpX2Rjc19zZXRfcGl4ZWxfZm9ybWF0KGRldmljZSwgTUlQSV9EQ1NfUElY RUxfRk1UXzI0QklUIHwNCj4gKwkJCQkJICAgICBNSVBJX0RDU19QSVhFTF9GTVRfMjRCSVQgPDwg NCk7DQo+ICsJaWYgKHJldCkNCj4gKwkJcmV0dXJuIHJldDsNCj4gKw0KPiArCS8qIERpc2FibGUg Q0FCQyBmZWF0dXJlICovDQo+ICsJZGNzX3dyaXRlX3NlcShkZXYsIE1JUElfRENTX1dSSVRFX1BP V0VSX1NBVkUsIDB4MDApOw0KPiArDQo+ICsJcmV0ID0gbWlwaV9kc2lfZGNzX3NldF9kaXNwbGF5 X29uKGRldmljZSk7DQo+ICsJaWYgKHJldCkNCj4gKwkJcmV0dXJuIHJldDsNCj4gKw0KPiArCXJl dCA9IG1pcGlfZHNpX2Rjc19ub3AoZGV2aWNlKTsNCj4gKwlpZiAocmV0KQ0KPiArCQlyZXR1cm4g cmV0Ow0KPiArDQo+ICsJLyogU2VuZCBDb21tYW5kIEdSQU0gbWVtb3J5IHdyaXRlIChubyBwYXJh bWV0ZXJzKSAqLw0KPiArCWRjc193cml0ZV9zZXEoZGV2LCBNSVBJX0RDU19XUklURV9NRU1PUllf U1RBUlQpOw0KPiArDQo+ICsJcmV0dXJuIDA7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBpbnQgb3Rt ODAwOWFfcGFuZWxfZW5hYmxlX2JhY2tsaWdodChzdHJ1Y3QgdWRldmljZSAqZGV2KQ0KPiArew0K PiArCXN0cnVjdCBtaXBpX2RzaV9wYW5lbF9wbGF0ICpwbGF0ID0gZGV2X2dldF9wbGF0ZGF0YShk ZXYpOw0KPiArCXN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRldmljZSA9IHBsYXQtPmRldmljZTsN Cj4gKwlpbnQgcmV0Ow0KPiArDQo+ICsJZGV2aWNlLT5sYW5lcyA9IDI7DQo+ICsJZGV2aWNlLT5m b3JtYXQgPSBNSVBJX0RTSV9GTVRfUkdCODg4Ow0KPiArCWRldmljZS0+bW9kZV9mbGFncyA9IE1J UElfRFNJX01PREVfVklERU8gfA0KPiArCQkJICAgICBNSVBJX0RTSV9NT0RFX1ZJREVPX0JVUlNU IHwNCj4gKwkJCSAgICAgTUlQSV9EU0lfTU9ERV9MUE07DQo+ICsNCj4gKwlyZXQgPSBtaXBpX2Rz aV9hdHRhY2goZGV2aWNlKTsNCj4gKwlpZiAocmV0IDwgMCkNCj4gKwkJcmV0dXJuIHJldDsNCj4g Kw0KPiArCXByX2luZm8oIiVzOiBpbml0aWFsaXplIHBhbmVsXG4iLCBfX2Z1bmNfXyk7DQoNCklz IGl0IHVzZWZ1bCB0byBwcmludCB0aGlzIGVhY2ggdGltZSB0aGUgYmFja2xpZ3RoIGlzIGVuYWJs ZWQgPw0KDQo+ICsJcmV0ID0gb3RtODAwOWFfaW5pdF9zZXF1ZW5jZShkZXYpOw0KPiArCWlmIChy ZXQpDQo+ICsJCXJldHVybiByZXQ7DQo+ICsNCj4gKwkvKg0KPiArCSAqIFBvd2VyIG9uIHRoZSBi YWNrbGlnaHQgd2l0aCB0aGUgcmVxdWVzdGVkIGJyaWdodG5lc3MNCj4gKwkgKiBOb3RlIFdlIGNh biBub3QgdXNlIG1pcGlfZHNpX2Rjc19zZXRfZGlzcGxheV9icmlnaHRuZXNzKCkNCj4gKwkgKiBh cyBvdG04MDA5YSBkcml2ZXIgc3VwcG9ydCBvbmx5IDgtYml0IGJyaWdodG5lc3MgKDEgcGFyYW0p Lg0KPiArCSAqLw0KPiArCXByX2luZm8oIiVzOiBzdGFydCwgYmFja2xpZ2h0XG4iLCBfX2Z1bmNf Xyk7DQoNCmRpdHRvDQoNCj4gKw0KPiArCWRjc193cml0ZV9zZXEoZGV2LCBNSVBJX0RDU19TRVRf RElTUExBWV9CUklHSFRORVNTLA0KPiArCQkgICAgICBPVE04MDA5QV9CQUNLTElHSFRfREVGQVVM VCk7DQo+ICsNCj4gKwkvKiBVcGRhdGUgQnJpZ2h0bmVzcyBDb250cm9sICYgQmFja2xpZ2h0ICov DQo+ICsJZGNzX3dyaXRlX3NlcShkZXYsIE1JUElfRENTX1dSSVRFX0NPTlRST0xfRElTUExBWSwg MHgyNCk7DQo+ICsNCj4gKwkvKiAgbmVlZCB0byB3YWl0IGEgZmV3IHRpbWUgYmVmb3JlIHNldCB0 aGUgRFNJIGJyaWRnZSBpbiB2aWRlbyBtb2RlICovDQo+ICsJbWRlbGF5KDEwKTsNCj4gKw0KPiAr CXJldHVybiAwOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW50IG90bTgwMDlhX3BhbmVsX29mZGF0 YV90b19wbGF0ZGF0YShzdHJ1Y3QgdWRldmljZSAqZGV2KQ0KPiArew0KPiArCXN0cnVjdCBvdG04 MDA5YV9wYW5lbF9wcml2ICpwcml2ID0gZGV2X2dldF9wcml2KGRldik7DQo+ICsJaW50IHJldDsN Cj4gKw0KPiArCWlmIChJU19FTkFCTEVEKENPTkZJR19ETV9SRUdVTEFUT1IpKSB7DQo+ICsJCXJl dCA9IHVjbGFzc19nZXRfZGV2aWNlX2J5X3BoYW5kbGUoVUNMQVNTX1JFR1VMQVRPUiwgZGV2LA0K PiArCQkJCQkJICAgInBvd2VyLXN1cHBseSIsICZwcml2LT5yZWcpOw0KPiArCQlpZiAocmV0KSB7 DQo+ICsJCQlwcl9lcnIoIiVzOiBXYXJuaW5nOiBjYW5ub3QgZ2V0IHBvd2VyIHN1cHBseVxuIiwN Cj4gKwkJCSAgICAgICBfX2Z1bmNfXyk7DQoNCmRldl9lcnIoKQ0KDQo+ICsJCQlpZiAocmV0ICE9 IC1FTk9FTlQpDQo+ICsJCQkJcmV0dXJuIHJldDsNCj4gKwkJfQ0KPiArCX0NCj4gKw0KPiArCXJl dCA9IGdwaW9fcmVxdWVzdF9ieV9uYW1lKGRldiwgInJlc2V0LWdwaW9zIiwgMCwgJnByaXYtPnJl c2V0LA0KPiArCQkJCSAgIEdQSU9EX0lTX09VVCk7DQo+ICsJaWYgKHJldCkgew0KPiArCQlwcl9l cnIoIiVzOiBXYXJuaW5nOiBjYW5ub3QgZ2V0IHJlc2V0IEdQSU9cbiIsIF9fZnVuY19fKTsNCg0K ZGl0dG8NCg0KPiArCQlpZiAocmV0ICE9IC1FTk9FTlQpDQo+ICsJCQlyZXR1cm4gcmV0Ow0KPiAr CX0NCj4gKw0KPiArCS8qIHJlc2V0IHBhbmVsIG11c3QgYmUgZG9uZSBiZWZvcmUgcHJvYmUgKi8N Cj4gKwlkbV9ncGlvX3NldF92YWx1ZSgmcHJpdi0+cmVzZXQsIHRydWUpOw0KPiArDQo+ICsJcmV0 dXJuIDA7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBpbnQgb3RtODAwOWFfcGFuZWxfcHJvYmUoc3Ry dWN0IHVkZXZpY2UgKmRldikNCj4gK3sNCj4gKwlzdHJ1Y3Qgb3RtODAwOWFfcGFuZWxfcHJpdiAq cHJpdiA9IGRldl9nZXRfcHJpdihkZXYpOw0KPiArCWludCByZXQ7DQo+ICsNCj4gKwlpZiAoSVNf RU5BQkxFRChDT05GSUdfRE1fUkVHVUxBVE9SKSAmJiBwcml2LT5yZWcpIHsNCj4gKwkJcHJfZXJy KCIlczogRW5hYmxlIHJlZ3VsYXRvciAnJXMnXG4iLCBfX2Z1bmNfXywNCj4gKwkJICAgICAgIHBy aXYtPnJlZy0+bmFtZSk7DQoNCmRlYnVnKCkgPw0KDQo+ICsJCXJldCA9IHJlZ3VsYXRvcl9zZXRf ZW5hYmxlKHByaXYtPnJlZywgdHJ1ZSk7DQo+ICsJCWlmIChyZXQpDQo+ICsJCQlyZXR1cm4gcmV0 Ow0KPiArCX0NCj4gKw0KPiArCWRtX2dwaW9fc2V0X3ZhbHVlKCZwcml2LT5yZXNldCwgZmFsc2Up Ow0KPiArDQo+ICsJcmV0dXJuIDA7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg cGFuZWxfb3BzIG90bTgwMDlhX3BhbmVsX29wcyA9IHsNCj4gKwkuZW5hYmxlX2JhY2tsaWdodCA9 IG90bTgwMDlhX3BhbmVsX2VuYWJsZV9iYWNrbGlnaHQsDQo+ICt9Ow0KPiArDQo+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IHVkZXZpY2VfaWQgb3RtODAwOWFfcGFuZWxfaWRzW10gPSB7DQo+ICsJeyAu Y29tcGF0aWJsZSA9ICJvcmlzZXRlY2gsb3RtODAwOWEiIH0sDQo+ICsJeyB9DQo+ICt9Ow0KPiAr DQo+ICtVX0JPT1RfRFJJVkVSKG90bTgwMDlhX3BhbmVsKSA9IHsNCj4gKwkubmFtZQkJCSAgPSAi b3RtODAwOWFfcGFuZWwiLA0KPiArCS5pZAkJCSAgPSBVQ0xBU1NfUEFORUwsDQo+ICsJLm9mX21h dGNoCQkgID0gb3RtODAwOWFfcGFuZWxfaWRzLA0KPiArCS5vcHMJCQkgID0gJm90bTgwMDlhX3Bh bmVsX29wcywNCj4gKwkub2ZkYXRhX3RvX3BsYXRkYXRhCSAgPSBvdG04MDA5YV9wYW5lbF9vZmRh dGFfdG9fcGxhdGRhdGEsDQo+ICsJLnByb2JlCQkJICA9IG90bTgwMDlhX3BhbmVsX3Byb2JlLA0K PiArCS5wbGF0ZGF0YV9hdXRvX2FsbG9jX3NpemUgPSBzaXplb2Yoc3RydWN0IG1pcGlfZHNpX3Bh bmVsX3BsYXQpLA0KPiArCS5wcml2X2F1dG9fYWxsb2Nfc2l6ZQk9IHNpemVvZihzdHJ1Y3Qgb3Rt ODAwOWFfcGFuZWxfcHJpdiksDQo+ICt9Ow0KPiAKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KVS1Cb290IG1haWxpbmcgbGlzdApVLUJvb3RAbGlzdHMuZGVu eC5kZQpodHRwczovL2xpc3RzLmRlbnguZGUvbGlzdGluZm8vdS1ib290Cg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752599AbeCMIxd (ORCPT ); Tue, 13 Mar 2018 04:53:33 -0400 Received: from mx07-00178001.pphosted.com ([62.209.51.94]:31938 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751965AbeCMIxb (ORCPT ); Tue, 13 Mar 2018 04:53:31 -0400 From: Patrice CHOTARD To: Yannick FERTRE , Vikas MANOCHA , Benjamin Gaignard , Philippe CORNU , Patrick DELAUNAY , Christophe KERELLO , Archit Taneja , Andrzej Hajda , Laurent Pinchart , David Airlie , Brian Norris , Bhumika Goyal , Gustavo Padovan , "Maarten Lankhorst" , Sean Paul , Albert Aribaud , "Simon Glass" , Anatolij Gustschin , Thierry Reding CC: "u-boot@lists.denx.de" , "dri-devel@lists.freedesktop.org" , "linux-kernel@vger.kernel.org" Subject: Re: [PATCH v2 04/10] video: add support of panel OTM8009A Thread-Topic: [PATCH v2 04/10] video: add support of panel OTM8009A Thread-Index: AQHTsj1UEhBKslk8wUCZ5OMTyP65vKPN298A Date: Tue, 13 Mar 2018 08:52:09 +0000 Message-ID: <897d61dc-cf79-d603-00f4-84bdfd809bdc@st.com> References: <1520005451-23217-1-git-send-email-yannick.fertre@st.com> <1520005451-23217-5-git-send-email-yannick.fertre@st.com> In-Reply-To: <1520005451-23217-5-git-send-email-yannick.fertre@st.com> Accept-Language: fr-FR, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: user-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 x-ms-exchange-messagesentrepresentingtype: 1 x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [10.75.127.47] Content-Type: text/plain; charset="utf-8" Content-ID: <214933FBF1DE804F89B9646E1CBF8F6F@st.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2018-03-13_04:,, signatures=0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from base64 to 8bit by mail.home.local id w2D8reJR031336 Hi Yannick On 03/02/2018 04:44 PM, yannick fertre wrote: > Support for Orise Tech otm8009a 480p dsi 2dl video mode panel. > > Signed-off-by: yannick fertre > --- > drivers/video/Kconfig | 8 + > drivers/video/Makefile | 1 + > drivers/video/orisetech_otm8009a.c | 329 +++++++++++++++++++++++++++++++++++++ > 3 files changed, 338 insertions(+) > create mode 100644 drivers/video/orisetech_otm8009a.c > > diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig > index 1981298..b5fc535 100644 > --- a/drivers/video/Kconfig > +++ b/drivers/video/Kconfig > @@ -320,6 +320,14 @@ config VIDEO_LCD_ANX9804 > from a parallel LCD interface and translate it on the fy into a DP > interface for driving eDP TFT displays. It uses I2C for configuration. > > +config VIDEO_LCD_ORISETECH_OTM8009A > + bool "OTM8009A DSI LCD panel support" > + depends on DM_VIDEO > + select VIDEO_MIPI_DSI > + default n > + ---help--- > + Support for Orise Tech otm8009a 480p dsi 2dl video mode panel. > + > config VIDEO_LCD_SSD2828 > bool "SSD2828 bridge chip" > default n > diff --git a/drivers/video/Makefile b/drivers/video/Makefile > index 6f42cca..65002af 100644 > --- a/drivers/video/Makefile > +++ b/drivers/video/Makefile > @@ -37,6 +37,7 @@ obj-$(CONFIG_VIDEO_COREBOOT) += coreboot.o > obj-$(CONFIG_VIDEO_DA8XX) += da8xx-fb.o videomodes.o > obj-$(CONFIG_VIDEO_LCD_ANX9804) += anx9804.o > obj-$(CONFIG_VIDEO_LCD_HITACHI_TX18D42VM) += hitachi_tx18d42vm_lcd.o > +obj-$(CONFIG_VIDEO_LCD_ORISETECH_OTM8009A) += orisetech_otm8009a.o > obj-$(CONFIG_VIDEO_LCD_SSD2828) += ssd2828.o > obj-$(CONFIG_VIDEO_MB862xx) += mb862xx.o videomodes.o > obj-$(CONFIG_VIDEO_MX3) += mx3fb.o videomodes.o > diff --git a/drivers/video/orisetech_otm8009a.c b/drivers/video/orisetech_otm8009a.c > new file mode 100644 > index 0000000..79f2da8 > --- /dev/null > +++ b/drivers/video/orisetech_otm8009a.c > @@ -0,0 +1,329 @@ > +/* > + * Copyright (C) 2018 STMicroelectronics - All Rights Reserved > + * Author(s): Yannick Fertre for STMicroelectronics. > + * Philippe Cornu for STMicroelectronics. > + * > + * This otm8009a panel driver is based on the panel driver from > + * drivers/gpu/drm/panel/panel-orisetech-otm8009a.c (kernel linux) > + * > + * SPDX-License-Identifier: GPL-2.0 > + */ > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +DECLARE_GLOBAL_DATA_PTR; > + > +#define DRV_NAME "orisetech_otm8009a" > + > +#define OTM8009A_BACKLIGHT_DEFAULT 240 > +#define OTM8009A_BACKLIGHT_MAX 255 > + > +/* Manufacturer Command Set */ > +#define MCS_ADRSFT 0x0000 /* Address Shift Function */ > +#define MCS_PANSET 0xB3A6 /* Panel Type Setting */ > +#define MCS_SD_CTRL 0xC0A2 /* Source Driver Timing Setting */ > +#define MCS_P_DRV_M 0xC0B4 /* Panel Driving Mode */ > +#define MCS_OSC_ADJ 0xC181 /* Oscillator Adjustment for Idle/Normal mode */ > +#define MCS_RGB_VID_SET 0xC1A1 /* RGB Video Mode Setting */ > +#define MCS_SD_PCH_CTRL 0xC480 /* Source Driver Precharge Control */ > +#define MCS_NO_DOC1 0xC48A /* Command not documented */ > +#define MCS_PWR_CTRL1 0xC580 /* Power Control Setting 1 */ > +#define MCS_PWR_CTRL2 0xC590 /* Power Control Setting 2 for Normal Mode */ > +#define MCS_PWR_CTRL4 0xC5B0 /* Power Control Setting 4 for DC Voltage */ > +#define MCS_PANCTRLSET1 0xCB80 /* Panel Control Setting 1 */ > +#define MCS_PANCTRLSET2 0xCB90 /* Panel Control Setting 2 */ > +#define MCS_PANCTRLSET3 0xCBA0 /* Panel Control Setting 3 */ > +#define MCS_PANCTRLSET4 0xCBB0 /* Panel Control Setting 4 */ > +#define MCS_PANCTRLSET5 0xCBC0 /* Panel Control Setting 5 */ > +#define MCS_PANCTRLSET6 0xCBD0 /* Panel Control Setting 6 */ > +#define MCS_PANCTRLSET7 0xCBE0 /* Panel Control Setting 7 */ > +#define MCS_PANCTRLSET8 0xCBF0 /* Panel Control Setting 8 */ > +#define MCS_PANU2D1 0xCC80 /* Panel U2D Setting 1 */ > +#define MCS_PANU2D2 0xCC90 /* Panel U2D Setting 2 */ > +#define MCS_PANU2D3 0xCCA0 /* Panel U2D Setting 3 */ > +#define MCS_PAND2U1 0xCCB0 /* Panel D2U Setting 1 */ > +#define MCS_PAND2U2 0xCCC0 /* Panel D2U Setting 2 */ > +#define MCS_PAND2U3 0xCCD0 /* Panel D2U Setting 3 */ > +#define MCS_GOAVST 0xCE80 /* GOA VST Setting */ > +#define MCS_GOACLKA1 0xCEA0 /* GOA CLKA1 Setting */ > +#define MCS_GOACLKA3 0xCEB0 /* GOA CLKA3 Setting */ > +#define MCS_GOAECLK 0xCFC0 /* GOA ECLK Setting */ > +#define MCS_NO_DOC2 0xCFD0 /* Command not documented */ > +#define MCS_GVDDSET 0xD800 /* GVDD/NGVDD */ > +#define MCS_VCOMDC 0xD900 /* VCOM Voltage Setting */ > +#define MCS_GMCT2_2P 0xE100 /* Gamma Correction 2.2+ Setting */ > +#define MCS_GMCT2_2N 0xE200 /* Gamma Correction 2.2- Setting */ > +#define MCS_NO_DOC3 0xF5B6 /* Command not documented */ > +#define MCS_CMD2_ENA1 0xFF00 /* Enable Access Command2 "CMD2" */ > +#define MCS_CMD2_ENA2 0xFF80 /* Enable Access Orise Command2 */ > + > +struct otm8009a_panel_priv { > + struct udevice *reg; > + struct gpio_desc reset; > +}; > + > +static void otm8009a_dcs_write_buf(struct udevice *dev, const void *data, > + size_t len) > +{ > + struct mipi_dsi_panel_plat *plat = dev_get_platdata(dev); > + struct mipi_dsi_device *device = plat->device; > + > + if (mipi_dsi_dcs_write_buffer(device, data, len) < 0) > + pr_err("mipi dsi dcs write buffer failed\n"); dev_err() > +} > + > +#define dcs_write_seq(dev, seq...) \ > +({ \ > + static const u8 d[] = { seq }; \ > + otm8009a_dcs_write_buf(dev, d, ARRAY_SIZE(d)); \ > +}) > + > +#define dcs_write_cmd_at(dev, cmd, seq...) \ > +({ \ > + static const u16 c = cmd; \ > + struct udevice *device = dev; \ > + dcs_write_seq(device, MCS_ADRSFT, (c) & 0xFF); \ > + dcs_write_seq(device, (c) >> 8, seq); \ > +}) > + > +static int otm8009a_init_sequence(struct udevice *dev) > +{ > + struct mipi_dsi_panel_plat *plat = dev_get_platdata(dev); > + struct mipi_dsi_device *device = plat->device; > + int ret; > + > + /* Enter CMD2 */ > + dcs_write_cmd_at(dev, MCS_CMD2_ENA1, 0x80, 0x09, 0x01); > + > + /* Enter Orise Command2 */ > + dcs_write_cmd_at(dev, MCS_CMD2_ENA2, 0x80, 0x09); > + > + dcs_write_cmd_at(dev, MCS_SD_PCH_CTRL, 0x30); > + mdelay(10); > + > + dcs_write_cmd_at(dev, MCS_NO_DOC1, 0x40); > + mdelay(10); > + > + dcs_write_cmd_at(dev, MCS_PWR_CTRL4 + 1, 0xA9); > + dcs_write_cmd_at(dev, MCS_PWR_CTRL2 + 1, 0x34); > + dcs_write_cmd_at(dev, MCS_P_DRV_M, 0x50); > + dcs_write_cmd_at(dev, MCS_VCOMDC, 0x4E); > + dcs_write_cmd_at(dev, MCS_OSC_ADJ, 0x66); /* 65Hz */ > + dcs_write_cmd_at(dev, MCS_PWR_CTRL2 + 2, 0x01); > + dcs_write_cmd_at(dev, MCS_PWR_CTRL2 + 5, 0x34); > + dcs_write_cmd_at(dev, MCS_PWR_CTRL2 + 4, 0x33); > + dcs_write_cmd_at(dev, MCS_GVDDSET, 0x79, 0x79); > + dcs_write_cmd_at(dev, MCS_SD_CTRL + 1, 0x1B); > + dcs_write_cmd_at(dev, MCS_PWR_CTRL1 + 2, 0x83); > + dcs_write_cmd_at(dev, MCS_SD_PCH_CTRL + 1, 0x83); > + dcs_write_cmd_at(dev, MCS_RGB_VID_SET, 0x0E); > + dcs_write_cmd_at(dev, MCS_PANSET, 0x00, 0x01); > + > + dcs_write_cmd_at(dev, MCS_GOAVST, 0x85, 0x01, 0x00, 0x84, 0x01, 0x00); > + dcs_write_cmd_at(dev, MCS_GOACLKA1, 0x18, 0x04, 0x03, 0x39, 0x00, 0x00, > + 0x00, 0x18, 0x03, 0x03, 0x3A, 0x00, 0x00, 0x00); > + dcs_write_cmd_at(dev, MCS_GOACLKA3, 0x18, 0x02, 0x03, 0x3B, 0x00, 0x00, > + 0x00, 0x18, 0x01, 0x03, 0x3C, 0x00, 0x00, 0x00); > + dcs_write_cmd_at(dev, MCS_GOAECLK, 0x01, 0x01, 0x20, 0x20, 0x00, 0x00, > + 0x01, 0x02, 0x00, 0x00); > + > + dcs_write_cmd_at(dev, MCS_NO_DOC2, 0x00); > + > + dcs_write_cmd_at(dev, MCS_PANCTRLSET1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); > + dcs_write_cmd_at(dev, MCS_PANCTRLSET2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > + 0, 0, 0, 0, 0); > + dcs_write_cmd_at(dev, MCS_PANCTRLSET3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > + 0, 0, 0, 0, 0); > + dcs_write_cmd_at(dev, MCS_PANCTRLSET4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); > + dcs_write_cmd_at(dev, MCS_PANCTRLSET5, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, > + 0, 0, 0, 0, 0); > + dcs_write_cmd_at(dev, MCS_PANCTRLSET6, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, > + 4, 0, 0, 0, 0); > + dcs_write_cmd_at(dev, MCS_PANCTRLSET7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); > + dcs_write_cmd_at(dev, MCS_PANCTRLSET8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, > + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF); > + > + dcs_write_cmd_at(dev, MCS_PANU2D1, 0x00, 0x26, 0x09, 0x0B, 0x01, 0x25, > + 0x00, 0x00, 0x00, 0x00); > + dcs_write_cmd_at(dev, MCS_PANU2D2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0A, 0x0C, 0x02); > + dcs_write_cmd_at(dev, MCS_PANU2D3, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); > + dcs_write_cmd_at(dev, MCS_PAND2U1, 0x00, 0x25, 0x0C, 0x0A, 0x02, 0x26, > + 0x00, 0x00, 0x00, 0x00); > + dcs_write_cmd_at(dev, MCS_PAND2U2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x0B, 0x09, 0x01); > + dcs_write_cmd_at(dev, MCS_PAND2U3, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); > + > + dcs_write_cmd_at(dev, MCS_PWR_CTRL1 + 1, 0x66); > + > + dcs_write_cmd_at(dev, MCS_NO_DOC3, 0x06); > + > + dcs_write_cmd_at(dev, MCS_GMCT2_2P, 0x00, 0x09, 0x0F, 0x0E, 0x07, 0x10, > + 0x0B, 0x0A, 0x04, 0x07, 0x0B, 0x08, 0x0F, 0x10, 0x0A, > + 0x01); > + dcs_write_cmd_at(dev, MCS_GMCT2_2N, 0x00, 0x09, 0x0F, 0x0E, 0x07, 0x10, > + 0x0B, 0x0A, 0x04, 0x07, 0x0B, 0x08, 0x0F, 0x10, 0x0A, > + 0x01); > + > + /* Exit CMD2 */ > + dcs_write_cmd_at(dev, MCS_CMD2_ENA1, 0xFF, 0xFF, 0xFF); > + > + ret = mipi_dsi_dcs_nop(device); > + if (ret) > + return ret; > + > + ret = mipi_dsi_dcs_exit_sleep_mode(device); > + if (ret) > + return ret; > + > + /* Wait for sleep out exit */ > + mdelay(120); > + > + /* Default portrait 480x800 rgb24 */ > + dcs_write_seq(dev, MIPI_DCS_SET_ADDRESS_MODE, 0x00); > + > + ret = mipi_dsi_dcs_set_column_address(device, 0, 479); > + if (ret) > + return ret; > + > + ret = mipi_dsi_dcs_set_page_address(device, 0, 799); > + if (ret) > + return ret; > + > + /* See otm8009a driver documentation for pixel format descriptions */ > + ret = mipi_dsi_dcs_set_pixel_format(device, MIPI_DCS_PIXEL_FMT_24BIT | > + MIPI_DCS_PIXEL_FMT_24BIT << 4); > + if (ret) > + return ret; > + > + /* Disable CABC feature */ > + dcs_write_seq(dev, MIPI_DCS_WRITE_POWER_SAVE, 0x00); > + > + ret = mipi_dsi_dcs_set_display_on(device); > + if (ret) > + return ret; > + > + ret = mipi_dsi_dcs_nop(device); > + if (ret) > + return ret; > + > + /* Send Command GRAM memory write (no parameters) */ > + dcs_write_seq(dev, MIPI_DCS_WRITE_MEMORY_START); > + > + return 0; > +} > + > +static int otm8009a_panel_enable_backlight(struct udevice *dev) > +{ > + struct mipi_dsi_panel_plat *plat = dev_get_platdata(dev); > + struct mipi_dsi_device *device = plat->device; > + int ret; > + > + device->lanes = 2; > + device->format = MIPI_DSI_FMT_RGB888; > + device->mode_flags = MIPI_DSI_MODE_VIDEO | > + MIPI_DSI_MODE_VIDEO_BURST | > + MIPI_DSI_MODE_LPM; > + > + ret = mipi_dsi_attach(device); > + if (ret < 0) > + return ret; > + > + pr_info("%s: initialize panel\n", __func__); Is it useful to print this each time the backligth is enabled ? > + ret = otm8009a_init_sequence(dev); > + if (ret) > + return ret; > + > + /* > + * Power on the backlight with the requested brightness > + * Note We can not use mipi_dsi_dcs_set_display_brightness() > + * as otm8009a driver support only 8-bit brightness (1 param). > + */ > + pr_info("%s: start, backlight\n", __func__); ditto > + > + dcs_write_seq(dev, MIPI_DCS_SET_DISPLAY_BRIGHTNESS, > + OTM8009A_BACKLIGHT_DEFAULT); > + > + /* Update Brightness Control & Backlight */ > + dcs_write_seq(dev, MIPI_DCS_WRITE_CONTROL_DISPLAY, 0x24); > + > + /* need to wait a few time before set the DSI bridge in video mode */ > + mdelay(10); > + > + return 0; > +} > + > +static int otm8009a_panel_ofdata_to_platdata(struct udevice *dev) > +{ > + struct otm8009a_panel_priv *priv = dev_get_priv(dev); > + int ret; > + > + if (IS_ENABLED(CONFIG_DM_REGULATOR)) { > + ret = uclass_get_device_by_phandle(UCLASS_REGULATOR, dev, > + "power-supply", &priv->reg); > + if (ret) { > + pr_err("%s: Warning: cannot get power supply\n", > + __func__); dev_err() > + if (ret != -ENOENT) > + return ret; > + } > + } > + > + ret = gpio_request_by_name(dev, "reset-gpios", 0, &priv->reset, > + GPIOD_IS_OUT); > + if (ret) { > + pr_err("%s: Warning: cannot get reset GPIO\n", __func__); ditto > + if (ret != -ENOENT) > + return ret; > + } > + > + /* reset panel must be done before probe */ > + dm_gpio_set_value(&priv->reset, true); > + > + return 0; > +} > + > +static int otm8009a_panel_probe(struct udevice *dev) > +{ > + struct otm8009a_panel_priv *priv = dev_get_priv(dev); > + int ret; > + > + if (IS_ENABLED(CONFIG_DM_REGULATOR) && priv->reg) { > + pr_err("%s: Enable regulator '%s'\n", __func__, > + priv->reg->name); debug() ? > + ret = regulator_set_enable(priv->reg, true); > + if (ret) > + return ret; > + } > + > + dm_gpio_set_value(&priv->reset, false); > + > + return 0; > +} > + > +static const struct panel_ops otm8009a_panel_ops = { > + .enable_backlight = otm8009a_panel_enable_backlight, > +}; > + > +static const struct udevice_id otm8009a_panel_ids[] = { > + { .compatible = "orisetech,otm8009a" }, > + { } > +}; > + > +U_BOOT_DRIVER(otm8009a_panel) = { > + .name = "otm8009a_panel", > + .id = UCLASS_PANEL, > + .of_match = otm8009a_panel_ids, > + .ops = &otm8009a_panel_ops, > + .ofdata_to_platdata = otm8009a_panel_ofdata_to_platdata, > + .probe = otm8009a_panel_probe, > + .platdata_auto_alloc_size = sizeof(struct mipi_dsi_panel_plat), > + .priv_auto_alloc_size = sizeof(struct otm8009a_panel_priv), > +}; > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Patrice CHOTARD Date: Tue, 13 Mar 2018 08:52:09 +0000 Subject: [U-Boot] [PATCH v2 04/10] video: add support of panel OTM8009A In-Reply-To: <1520005451-23217-5-git-send-email-yannick.fertre@st.com> References: <1520005451-23217-1-git-send-email-yannick.fertre@st.com> <1520005451-23217-5-git-send-email-yannick.fertre@st.com> Message-ID: <897d61dc-cf79-d603-00f4-84bdfd809bdc@st.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi Yannick On 03/02/2018 04:44 PM, yannick fertre wrote: > Support for Orise Tech otm8009a 480p dsi 2dl video mode panel. > > Signed-off-by: yannick fertre > --- > drivers/video/Kconfig | 8 + > drivers/video/Makefile | 1 + > drivers/video/orisetech_otm8009a.c | 329 +++++++++++++++++++++++++++++++++++++ > 3 files changed, 338 insertions(+) > create mode 100644 drivers/video/orisetech_otm8009a.c > > diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig > index 1981298..b5fc535 100644 > --- a/drivers/video/Kconfig > +++ b/drivers/video/Kconfig > @@ -320,6 +320,14 @@ config VIDEO_LCD_ANX9804 > from a parallel LCD interface and translate it on the fy into a DP > interface for driving eDP TFT displays. It uses I2C for configuration. > > +config VIDEO_LCD_ORISETECH_OTM8009A > + bool "OTM8009A DSI LCD panel support" > + depends on DM_VIDEO > + select VIDEO_MIPI_DSI > + default n > + ---help--- > + Support for Orise Tech otm8009a 480p dsi 2dl video mode panel. > + > config VIDEO_LCD_SSD2828 > bool "SSD2828 bridge chip" > default n > diff --git a/drivers/video/Makefile b/drivers/video/Makefile > index 6f42cca..65002af 100644 > --- a/drivers/video/Makefile > +++ b/drivers/video/Makefile > @@ -37,6 +37,7 @@ obj-$(CONFIG_VIDEO_COREBOOT) += coreboot.o > obj-$(CONFIG_VIDEO_DA8XX) += da8xx-fb.o videomodes.o > obj-$(CONFIG_VIDEO_LCD_ANX9804) += anx9804.o > obj-$(CONFIG_VIDEO_LCD_HITACHI_TX18D42VM) += hitachi_tx18d42vm_lcd.o > +obj-$(CONFIG_VIDEO_LCD_ORISETECH_OTM8009A) += orisetech_otm8009a.o > obj-$(CONFIG_VIDEO_LCD_SSD2828) += ssd2828.o > obj-$(CONFIG_VIDEO_MB862xx) += mb862xx.o videomodes.o > obj-$(CONFIG_VIDEO_MX3) += mx3fb.o videomodes.o > diff --git a/drivers/video/orisetech_otm8009a.c b/drivers/video/orisetech_otm8009a.c > new file mode 100644 > index 0000000..79f2da8 > --- /dev/null > +++ b/drivers/video/orisetech_otm8009a.c > @@ -0,0 +1,329 @@ > +/* > + * Copyright (C) 2018 STMicroelectronics - All Rights Reserved > + * Author(s): Yannick Fertre for STMicroelectronics. > + * Philippe Cornu for STMicroelectronics. > + * > + * This otm8009a panel driver is based on the panel driver from > + * drivers/gpu/drm/panel/panel-orisetech-otm8009a.c (kernel linux) > + * > + * SPDX-License-Identifier: GPL-2.0 > + */ > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +DECLARE_GLOBAL_DATA_PTR; > + > +#define DRV_NAME "orisetech_otm8009a" > + > +#define OTM8009A_BACKLIGHT_DEFAULT 240 > +#define OTM8009A_BACKLIGHT_MAX 255 > + > +/* Manufacturer Command Set */ > +#define MCS_ADRSFT 0x0000 /* Address Shift Function */ > +#define MCS_PANSET 0xB3A6 /* Panel Type Setting */ > +#define MCS_SD_CTRL 0xC0A2 /* Source Driver Timing Setting */ > +#define MCS_P_DRV_M 0xC0B4 /* Panel Driving Mode */ > +#define MCS_OSC_ADJ 0xC181 /* Oscillator Adjustment for Idle/Normal mode */ > +#define MCS_RGB_VID_SET 0xC1A1 /* RGB Video Mode Setting */ > +#define MCS_SD_PCH_CTRL 0xC480 /* Source Driver Precharge Control */ > +#define MCS_NO_DOC1 0xC48A /* Command not documented */ > +#define MCS_PWR_CTRL1 0xC580 /* Power Control Setting 1 */ > +#define MCS_PWR_CTRL2 0xC590 /* Power Control Setting 2 for Normal Mode */ > +#define MCS_PWR_CTRL4 0xC5B0 /* Power Control Setting 4 for DC Voltage */ > +#define MCS_PANCTRLSET1 0xCB80 /* Panel Control Setting 1 */ > +#define MCS_PANCTRLSET2 0xCB90 /* Panel Control Setting 2 */ > +#define MCS_PANCTRLSET3 0xCBA0 /* Panel Control Setting 3 */ > +#define MCS_PANCTRLSET4 0xCBB0 /* Panel Control Setting 4 */ > +#define MCS_PANCTRLSET5 0xCBC0 /* Panel Control Setting 5 */ > +#define MCS_PANCTRLSET6 0xCBD0 /* Panel Control Setting 6 */ > +#define MCS_PANCTRLSET7 0xCBE0 /* Panel Control Setting 7 */ > +#define MCS_PANCTRLSET8 0xCBF0 /* Panel Control Setting 8 */ > +#define MCS_PANU2D1 0xCC80 /* Panel U2D Setting 1 */ > +#define MCS_PANU2D2 0xCC90 /* Panel U2D Setting 2 */ > +#define MCS_PANU2D3 0xCCA0 /* Panel U2D Setting 3 */ > +#define MCS_PAND2U1 0xCCB0 /* Panel D2U Setting 1 */ > +#define MCS_PAND2U2 0xCCC0 /* Panel D2U Setting 2 */ > +#define MCS_PAND2U3 0xCCD0 /* Panel D2U Setting 3 */ > +#define MCS_GOAVST 0xCE80 /* GOA VST Setting */ > +#define MCS_GOACLKA1 0xCEA0 /* GOA CLKA1 Setting */ > +#define MCS_GOACLKA3 0xCEB0 /* GOA CLKA3 Setting */ > +#define MCS_GOAECLK 0xCFC0 /* GOA ECLK Setting */ > +#define MCS_NO_DOC2 0xCFD0 /* Command not documented */ > +#define MCS_GVDDSET 0xD800 /* GVDD/NGVDD */ > +#define MCS_VCOMDC 0xD900 /* VCOM Voltage Setting */ > +#define MCS_GMCT2_2P 0xE100 /* Gamma Correction 2.2+ Setting */ > +#define MCS_GMCT2_2N 0xE200 /* Gamma Correction 2.2- Setting */ > +#define MCS_NO_DOC3 0xF5B6 /* Command not documented */ > +#define MCS_CMD2_ENA1 0xFF00 /* Enable Access Command2 "CMD2" */ > +#define MCS_CMD2_ENA2 0xFF80 /* Enable Access Orise Command2 */ > + > +struct otm8009a_panel_priv { > + struct udevice *reg; > + struct gpio_desc reset; > +}; > + > +static void otm8009a_dcs_write_buf(struct udevice *dev, const void *data, > + size_t len) > +{ > + struct mipi_dsi_panel_plat *plat = dev_get_platdata(dev); > + struct mipi_dsi_device *device = plat->device; > + > + if (mipi_dsi_dcs_write_buffer(device, data, len) < 0) > + pr_err("mipi dsi dcs write buffer failed\n"); dev_err() > +} > + > +#define dcs_write_seq(dev, seq...) \ > +({ \ > + static const u8 d[] = { seq }; \ > + otm8009a_dcs_write_buf(dev, d, ARRAY_SIZE(d)); \ > +}) > + > +#define dcs_write_cmd_at(dev, cmd, seq...) \ > +({ \ > + static const u16 c = cmd; \ > + struct udevice *device = dev; \ > + dcs_write_seq(device, MCS_ADRSFT, (c) & 0xFF); \ > + dcs_write_seq(device, (c) >> 8, seq); \ > +}) > + > +static int otm8009a_init_sequence(struct udevice *dev) > +{ > + struct mipi_dsi_panel_plat *plat = dev_get_platdata(dev); > + struct mipi_dsi_device *device = plat->device; > + int ret; > + > + /* Enter CMD2 */ > + dcs_write_cmd_at(dev, MCS_CMD2_ENA1, 0x80, 0x09, 0x01); > + > + /* Enter Orise Command2 */ > + dcs_write_cmd_at(dev, MCS_CMD2_ENA2, 0x80, 0x09); > + > + dcs_write_cmd_at(dev, MCS_SD_PCH_CTRL, 0x30); > + mdelay(10); > + > + dcs_write_cmd_at(dev, MCS_NO_DOC1, 0x40); > + mdelay(10); > + > + dcs_write_cmd_at(dev, MCS_PWR_CTRL4 + 1, 0xA9); > + dcs_write_cmd_at(dev, MCS_PWR_CTRL2 + 1, 0x34); > + dcs_write_cmd_at(dev, MCS_P_DRV_M, 0x50); > + dcs_write_cmd_at(dev, MCS_VCOMDC, 0x4E); > + dcs_write_cmd_at(dev, MCS_OSC_ADJ, 0x66); /* 65Hz */ > + dcs_write_cmd_at(dev, MCS_PWR_CTRL2 + 2, 0x01); > + dcs_write_cmd_at(dev, MCS_PWR_CTRL2 + 5, 0x34); > + dcs_write_cmd_at(dev, MCS_PWR_CTRL2 + 4, 0x33); > + dcs_write_cmd_at(dev, MCS_GVDDSET, 0x79, 0x79); > + dcs_write_cmd_at(dev, MCS_SD_CTRL + 1, 0x1B); > + dcs_write_cmd_at(dev, MCS_PWR_CTRL1 + 2, 0x83); > + dcs_write_cmd_at(dev, MCS_SD_PCH_CTRL + 1, 0x83); > + dcs_write_cmd_at(dev, MCS_RGB_VID_SET, 0x0E); > + dcs_write_cmd_at(dev, MCS_PANSET, 0x00, 0x01); > + > + dcs_write_cmd_at(dev, MCS_GOAVST, 0x85, 0x01, 0x00, 0x84, 0x01, 0x00); > + dcs_write_cmd_at(dev, MCS_GOACLKA1, 0x18, 0x04, 0x03, 0x39, 0x00, 0x00, > + 0x00, 0x18, 0x03, 0x03, 0x3A, 0x00, 0x00, 0x00); > + dcs_write_cmd_at(dev, MCS_GOACLKA3, 0x18, 0x02, 0x03, 0x3B, 0x00, 0x00, > + 0x00, 0x18, 0x01, 0x03, 0x3C, 0x00, 0x00, 0x00); > + dcs_write_cmd_at(dev, MCS_GOAECLK, 0x01, 0x01, 0x20, 0x20, 0x00, 0x00, > + 0x01, 0x02, 0x00, 0x00); > + > + dcs_write_cmd_at(dev, MCS_NO_DOC2, 0x00); > + > + dcs_write_cmd_at(dev, MCS_PANCTRLSET1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); > + dcs_write_cmd_at(dev, MCS_PANCTRLSET2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > + 0, 0, 0, 0, 0); > + dcs_write_cmd_at(dev, MCS_PANCTRLSET3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > + 0, 0, 0, 0, 0); > + dcs_write_cmd_at(dev, MCS_PANCTRLSET4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); > + dcs_write_cmd_at(dev, MCS_PANCTRLSET5, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, > + 0, 0, 0, 0, 0); > + dcs_write_cmd_at(dev, MCS_PANCTRLSET6, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, > + 4, 0, 0, 0, 0); > + dcs_write_cmd_at(dev, MCS_PANCTRLSET7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); > + dcs_write_cmd_at(dev, MCS_PANCTRLSET8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, > + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF); > + > + dcs_write_cmd_at(dev, MCS_PANU2D1, 0x00, 0x26, 0x09, 0x0B, 0x01, 0x25, > + 0x00, 0x00, 0x00, 0x00); > + dcs_write_cmd_at(dev, MCS_PANU2D2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0A, 0x0C, 0x02); > + dcs_write_cmd_at(dev, MCS_PANU2D3, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); > + dcs_write_cmd_at(dev, MCS_PAND2U1, 0x00, 0x25, 0x0C, 0x0A, 0x02, 0x26, > + 0x00, 0x00, 0x00, 0x00); > + dcs_write_cmd_at(dev, MCS_PAND2U2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x0B, 0x09, 0x01); > + dcs_write_cmd_at(dev, MCS_PAND2U3, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); > + > + dcs_write_cmd_at(dev, MCS_PWR_CTRL1 + 1, 0x66); > + > + dcs_write_cmd_at(dev, MCS_NO_DOC3, 0x06); > + > + dcs_write_cmd_at(dev, MCS_GMCT2_2P, 0x00, 0x09, 0x0F, 0x0E, 0x07, 0x10, > + 0x0B, 0x0A, 0x04, 0x07, 0x0B, 0x08, 0x0F, 0x10, 0x0A, > + 0x01); > + dcs_write_cmd_at(dev, MCS_GMCT2_2N, 0x00, 0x09, 0x0F, 0x0E, 0x07, 0x10, > + 0x0B, 0x0A, 0x04, 0x07, 0x0B, 0x08, 0x0F, 0x10, 0x0A, > + 0x01); > + > + /* Exit CMD2 */ > + dcs_write_cmd_at(dev, MCS_CMD2_ENA1, 0xFF, 0xFF, 0xFF); > + > + ret = mipi_dsi_dcs_nop(device); > + if (ret) > + return ret; > + > + ret = mipi_dsi_dcs_exit_sleep_mode(device); > + if (ret) > + return ret; > + > + /* Wait for sleep out exit */ > + mdelay(120); > + > + /* Default portrait 480x800 rgb24 */ > + dcs_write_seq(dev, MIPI_DCS_SET_ADDRESS_MODE, 0x00); > + > + ret = mipi_dsi_dcs_set_column_address(device, 0, 479); > + if (ret) > + return ret; > + > + ret = mipi_dsi_dcs_set_page_address(device, 0, 799); > + if (ret) > + return ret; > + > + /* See otm8009a driver documentation for pixel format descriptions */ > + ret = mipi_dsi_dcs_set_pixel_format(device, MIPI_DCS_PIXEL_FMT_24BIT | > + MIPI_DCS_PIXEL_FMT_24BIT << 4); > + if (ret) > + return ret; > + > + /* Disable CABC feature */ > + dcs_write_seq(dev, MIPI_DCS_WRITE_POWER_SAVE, 0x00); > + > + ret = mipi_dsi_dcs_set_display_on(device); > + if (ret) > + return ret; > + > + ret = mipi_dsi_dcs_nop(device); > + if (ret) > + return ret; > + > + /* Send Command GRAM memory write (no parameters) */ > + dcs_write_seq(dev, MIPI_DCS_WRITE_MEMORY_START); > + > + return 0; > +} > + > +static int otm8009a_panel_enable_backlight(struct udevice *dev) > +{ > + struct mipi_dsi_panel_plat *plat = dev_get_platdata(dev); > + struct mipi_dsi_device *device = plat->device; > + int ret; > + > + device->lanes = 2; > + device->format = MIPI_DSI_FMT_RGB888; > + device->mode_flags = MIPI_DSI_MODE_VIDEO | > + MIPI_DSI_MODE_VIDEO_BURST | > + MIPI_DSI_MODE_LPM; > + > + ret = mipi_dsi_attach(device); > + if (ret < 0) > + return ret; > + > + pr_info("%s: initialize panel\n", __func__); Is it useful to print this each time the backligth is enabled ? > + ret = otm8009a_init_sequence(dev); > + if (ret) > + return ret; > + > + /* > + * Power on the backlight with the requested brightness > + * Note We can not use mipi_dsi_dcs_set_display_brightness() > + * as otm8009a driver support only 8-bit brightness (1 param). > + */ > + pr_info("%s: start, backlight\n", __func__); ditto > + > + dcs_write_seq(dev, MIPI_DCS_SET_DISPLAY_BRIGHTNESS, > + OTM8009A_BACKLIGHT_DEFAULT); > + > + /* Update Brightness Control & Backlight */ > + dcs_write_seq(dev, MIPI_DCS_WRITE_CONTROL_DISPLAY, 0x24); > + > + /* need to wait a few time before set the DSI bridge in video mode */ > + mdelay(10); > + > + return 0; > +} > + > +static int otm8009a_panel_ofdata_to_platdata(struct udevice *dev) > +{ > + struct otm8009a_panel_priv *priv = dev_get_priv(dev); > + int ret; > + > + if (IS_ENABLED(CONFIG_DM_REGULATOR)) { > + ret = uclass_get_device_by_phandle(UCLASS_REGULATOR, dev, > + "power-supply", &priv->reg); > + if (ret) { > + pr_err("%s: Warning: cannot get power supply\n", > + __func__); dev_err() > + if (ret != -ENOENT) > + return ret; > + } > + } > + > + ret = gpio_request_by_name(dev, "reset-gpios", 0, &priv->reset, > + GPIOD_IS_OUT); > + if (ret) { > + pr_err("%s: Warning: cannot get reset GPIO\n", __func__); ditto > + if (ret != -ENOENT) > + return ret; > + } > + > + /* reset panel must be done before probe */ > + dm_gpio_set_value(&priv->reset, true); > + > + return 0; > +} > + > +static int otm8009a_panel_probe(struct udevice *dev) > +{ > + struct otm8009a_panel_priv *priv = dev_get_priv(dev); > + int ret; > + > + if (IS_ENABLED(CONFIG_DM_REGULATOR) && priv->reg) { > + pr_err("%s: Enable regulator '%s'\n", __func__, > + priv->reg->name); debug() ? > + ret = regulator_set_enable(priv->reg, true); > + if (ret) > + return ret; > + } > + > + dm_gpio_set_value(&priv->reset, false); > + > + return 0; > +} > + > +static const struct panel_ops otm8009a_panel_ops = { > + .enable_backlight = otm8009a_panel_enable_backlight, > +}; > + > +static const struct udevice_id otm8009a_panel_ids[] = { > + { .compatible = "orisetech,otm8009a" }, > + { } > +}; > + > +U_BOOT_DRIVER(otm8009a_panel) = { > + .name = "otm8009a_panel", > + .id = UCLASS_PANEL, > + .of_match = otm8009a_panel_ids, > + .ops = &otm8009a_panel_ops, > + .ofdata_to_platdata = otm8009a_panel_ofdata_to_platdata, > + .probe = otm8009a_panel_probe, > + .platdata_auto_alloc_size = sizeof(struct mipi_dsi_panel_plat), > + .priv_auto_alloc_size = sizeof(struct otm8009a_panel_priv), > +}; >