From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sam Ravnborg Subject: Re: [PATCH v1 14/16] drm/panel: call prepare/enable only once Date: Mon, 5 Aug 2019 18:51:17 +0200 Message-ID: <20190805165117.GA23301@ravnborg.org> References: <20190804201637.1240-1-sam@ravnborg.org> <20190804201637.1240-15-sam@ravnborg.org> <20190805105928.GI29747@pendragon.ideasonboard.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <20190805105928.GI29747@pendragon.ideasonboard.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Laurent Pinchart Cc: Neil Armstrong , David Airlie , dri-devel@lists.freedesktop.org, Thierry Reding , Marek Vasut , Laurent Pinchart , Vincent Abriou , Krzysztof Kozlowski , Jonathan Hunter , Maxime Ripard , Kukjin Kim , linux-arm-kernel@lists.infradead.org, NXP Linux Team , Pengutronix Kernel Team , Jonas Karlman , Alison Wang , Gwan-gyeong Mun , Alexios Zavras , linux-samsung-soc@vger.kernel.org, linux-tegra@vger.kernel.org, Thomas Gleixner , Sean Paul , Allison Randal List-Id: linux-samsung-soc@vger.kernel.org SGkgTGF1cmVudC4KCj4gCj4gT24gU3VuLCBBdWcgMDQsIDIwMTkgYXQgMTA6MTY6MzVQTSArMDIw MCwgU2FtIFJhdm5ib3JnIHdyb3RlOgo+ID4gTWFueSBwYW5lbCBkcml2ZXJzIGR1cGxpY2F0ZSBs b2dpYyB0byBwcmV2ZW50IHByZXBhcmUgdG8gYmUgY2FsbGVkCj4gPiBmb3IgYSBwYW5lbCB0aGF0 IGlzIGFscmVhZHkgcHJlcGFyZWQuCj4gPiBMaWtld2lzZSBmb3IgZW5hYmxlLgo+ID4gCj4gPiBJ bXBsZW1lbnQgdGhpcyBsb2dpYyBpbiBkcm1fcGFuZWwgc28gdGhlIGluZGl2aWR1YWwgZHJpdmVy cwo+ID4gbm8gbG9uZ2VyIG5lZWRzIHRoaXMuCj4gPiBBIHBhbmVsIGlzIGNvbnNpZGVyZWQgcHJl cGFyZWQvZW5hYmxlZCBvbmx5IGlmIHRoZSBwcmVwYXJlL2VuYWJsZSBjYWxsCj4gPiBzdWNjZWVk cy4KPiA+IEZvciBkaXNhYmxlL3VucHJlcGFyZSBpdCBpcyB1bmNvbmRpdGlvbmFsbHkgY29uc2lk ZXJlZAo+ID4gZGlzYWJsZWQvdW5wcmVwYXJlZC4KPiA+IAo+ID4gVGhpcyBhbGxvd3MgY2FsbHMg dG8gcHJlcGFyZS9lbmFibGUgYWdhaW4sIGV2ZW4gaWYgdGhlcmUgd2VyZQo+ID4gc29tZSBpc3N1 ZSBkaXNhYmxpbmcgYSByZWd1bGF0b3Igb3Igc2ltaWxhciBkdXJpbmcgZGlzYWJsZS91bnByZXBh cmUuCj4gCj4gSXMgdGhpcyB0aGUgcmlnaHQgcGxhY2UgdG8gaGFuZGxlIHRoaXMgPyBTaG91bGRu J3QgdGhlIHVwcGVyIGxheWVycwo+IGVuc3VyZSB0aGFuIGVuYWJsZS9kaXNhYmxlIGFuZCBwcmVw YXJlL3VucHJlcGFyZSBhcmUgY29ycmVjdHkgYmFsYW5jZWQsCj4gYW5kIG5vdCBjYWxsZWQgbXVs dGlwbGUgdGltZXMgPyBBZGRpbmcgZW5hYmxlZCBhbmQgcHJlcGFyZWQgc3RhdGUgdG8KPiBkcm1f cGFuZWwgbm90IG9ubHkgZG9lc24ndCBhbGlnbiB3ZWxsIHdpdGggYXRvbWljIHN0YXRlIGhhbmRs aW5nLCBidXQKPiBhbHNvIHdvdWxkIGhpZGUgaXNzdWVzIGluIHVwcGVyIGxheWVycyB0aGF0IHNo b3VsZCByZWFsbHkgYmUgZml4ZWQKPiB0aGVyZS4KClRoZSBtYWluIHJhdGlvbmFsZSBiZWhpbmQg c3RhcnRpbmcgb24gdGhpcyB3YXMgdGhhdCB+MTUgcGFuZWwgZHJpdmVycwphbHJlYWR5IGltcGxl bWVudHMgbG9naWMgdG8gcHJldmVudCB0aGUgcHJlcGFyZS9lbmFibGUvZGlzYWJsZS91bnByZXBh cmUKZnVuY3Rpb25zIHRvIGJlIGNhbGxlZCBvdXQgb2Ygb3JkZXIuCiQgY2QgZHJpdmVycy9ncHUv ZHJtL3BhbmVsLzsgZ2l0IGdyZXAgZW5hYmxlZCB8IGdyZXAgYm9vbCB8IHdjIC1sCgpTZXZlcmFs IG9mIHRoZSBwYW5lbCBkcml2ZXJzIGFsc28gaW1wbGVtZW50cyBhCm1pcGlfZHNpX2RyaXZlci5z aHV0ZG93bigpIG9yIHBsYXRmb3JtX2RyaXZlci5zaHV0ZG93bigpLgpUbyB0aGUgYmVzdCBvZiBt eSBrbm93bGVkZ2Ugd2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0IHRoZSB1cHBlciBsYXllcnMKaGF2 ZSBkb25lIHRoZSBwcm9wZXIgZGlzYWJsZSgpL3VucHJlcGFyZSgpIGRhbmNlIGJlZm9yZSBhIHNo dXRkb3duLgpTbyB0aGUgZmxhZ3MgZXhpc3RzIHRvIGFsbG93IHRoZSBkcml2ZXIgdG8gdW5jb25k aXRpb25hbGx5IGNhbGwKZGlzYWJsZSgpIC8gdW5wcmVwYXJlKCkgaW4gdGhlIHNodXRkb3duIG1l dGhvZHMuClNhbWUgZ29lcyBmb3IgKl9kcml2ZXIucmVtb3ZlKCkKCk9uZSBpbXByb3ZlbWVudCBj b3VsZCBiZSB0byBkZXRlY3QgaWYgdGhlIHBhbmVsIGlzIHByZXBhcmUoKSB3aGVuCnVwcGVyIGxh eWVycyBjYWxsIGVuYWJsZSgpIGFuZCB3YXJuL2Vycm9yIGluIHRoaXMgc2l0dWF0aW9uLgpXaXRo IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHRoaXMgaXMgbm90IGNoZWNrZWQgYXQgYWxsLgpM aWtld2lzZSBmb3IgdW5wcmVwYXJlKCkgKHJlcXVpcmUgaXQgd2FzIG5ldmVyIGVuYWJsZWQgb3Ig ZGlzYWJsZSgpIHdhcwpjYWxlZCBmaXJzdCkKCkkgY2xhaW0gdGhlIGNoZWNrIGV4aXN0cyBmb3Ig dGhlIGJlbmVmaXQgb2YgLnJlbW92ZSBhbmQgLnNodXRkb3duLApzbyB3ZSBjb3VsZCBhbHNvIGNo ZWNrIGlmIHByZXBhcmUoKSBvciBlbmFibGUoKSBpcyBjYWxsZWQgdHdpY2UuCgpBZGRpbmcgbG9n aWMgdG8gY2FsbCBwcmVwYXJlKCkgYXV0b21hZ2ljYWxseSB3b3VsZCBoaWRlIHByb2JlbXMgaW4g dXBwZXIKbGF5ZXJzIGFuZCB0aGlzIHdhcyBvbmx5IGJyaWVmbHkgY29uc2lkZXJlZCAtIGFuZCBk aXNjYXJkZWQgYXMgaGlkaW5nCmJ1Z3MuCgpTbyB0byBzdW0gdXA6Ci0gTW92aW5nIHRoZSBjaGVj a3MgZnJvbSBkcml2ZXJzIHRvIHRoZSBjb3JlIGlzIGEgZ29vZCB0aGluZwotIFRoZSBjb3JlIHNo YWxsIGNoZWNrIHRoYXQgYSBwYW5lbCBpcyBwcmVwYXJlZCB3aGVuIGVuYWJsZSBpcyBjYWxsZWQK ICBhbmQgZXJyb3Igb3V0IGlmIG5vdCAob3Igd2FybikuCi0gVGhlIGNvcmUgc2hhbGwgY2hlY2sg dGhhdCBhIHBhbmVsIGlzIGRpc2FibGVkIHdoZW4gdW5wcmVwYXJlIGlzIGNhbGxlZAogIGFuZCBl cnJvciBvdXQgaWYgbm90IChvciB3YXJuKS4KICBUaGUgY29yZSBzaGFsbCBjaGVjayBpZiBwcmVw YXJlKCkgYW5kIGVuYWJsZSgpIGlzIGNhbGxlZCBvdXQgb2Ygb3JkZXIuCgpUaGUgcGF0Y2ggbmVl ZHMgdG8gYmUgZXh0ZW5kZWQgdG8gY292ZXIgdGhlIGxhc3QgdGhyZWUgcG9pbnRzLgoKTGF1cmVu dCAvIEVtaWwgLyBUaGllcnJ5IC0gYWdyZWUvY29tbWVudHM/CgpOb3RlOiBEaWQgYSBxdWljayBy b3VuZCB0byBzZWUgaWYgY291bGQgc3BvdCBhbnkgd3JvbmcgdXNlIG9mCmRybV9wYW5lbF8qIGZ1 bmN0aW9ucy4KTW9zdCBsb29rZWQgZ29vZCwgYnV0IHRoZW4gSSBkaWQgbm90IGRvIGEgdGhyb3Vn aGx5IGNoZWNrLgoKYnJpZGdlL2FuYWxvZ2l4L2FuYWxvZ2l4X2RwX2NvcmUuYyBsb29rcyBmaXNo eS4KTG9va3MgbGlrZSBhbmFsb2dpeF9kcF9wcmVwYXJlX3BhbmVsKCkgaXMgYSBub3AgdGhlIHdh eSBpdCBpcyBjYWxsZWQuCkkgZGlkIG5vdCBsb29rIHRvbyBtdWNoIG9uIHRoaXMsIG1heWJlIEkg YW0gd3JvbmcuCgoJU2FtCgo+IAo+ID4gU2lnbmVkLW9mZi1ieTogU2FtIFJhdm5ib3JnIDxzYW1A cmF2bmJvcmcub3JnPgo+ID4gQ2M6IE1hYXJ0ZW4gTGFua2hvcnN0IDxtYWFydGVuLmxhbmtob3Jz dEBsaW51eC5pbnRlbC5jb20+Cj4gPiBDYzogTWF4aW1lIFJpcGFyZCA8bWF4aW1lLnJpcGFyZEBi b290bGluLmNvbT4KPiA+IENjOiBTZWFuIFBhdWwgPHNlYW5AcG9vcmx5LnJ1bj4KPiA+IENjOiBU aGllcnJ5IFJlZGluZyA8dGhpZXJyeS5yZWRpbmdAZ21haWwuY29tPgo+ID4gQ2M6IFNhbSBSYXZu Ym9yZyA8c2FtQHJhdm5ib3JnLm9yZz4KPiA+IENjOiBEYXZpZCBBaXJsaWUgPGFpcmxpZWRAbGlu dXguaWU+Cj4gPiBDYzogRGFuaWVsIFZldHRlciA8ZGFuaWVsQGZmd2xsLmNoPgo+ID4gLS0tCj4g PiAgZHJpdmVycy9ncHUvZHJtL2RybV9wYW5lbC5jIHwgNjYgKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrLS0tLS0tLQo+ID4gIGluY2x1ZGUvZHJtL2RybV9wYW5lbC5oICAgICB8IDIxICsr KysrKysrKysrKwo+ID4gIDIgZmlsZXMgY2hhbmdlZCwgNzUgaW5zZXJ0aW9ucygrKSwgMTIgZGVs ZXRpb25zKC0pCj4gPiAKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3BhbmVs LmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3BhbmVsLmMKPiA+IGluZGV4IGRhMTlkNWI0YTJmNC4u MDg1Mzc2NDA0MGRlIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9wYW5lbC5j Cj4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3BhbmVsLmMKPiA+IEBAIC02NiwxMCArNjYs MjEgQEAgRVhQT1JUX1NZTUJPTChkcm1fcGFuZWxfaW5pdCk7Cj4gPiAgICovCj4gPiAgaW50IGRy bV9wYW5lbF9wcmVwYXJlKHN0cnVjdCBkcm1fcGFuZWwgKnBhbmVsKQo+ID4gIHsKPiA+IC0JaWYg KHBhbmVsICYmIHBhbmVsLT5mdW5jcyAmJiBwYW5lbC0+ZnVuY3MtPnByZXBhcmUpCj4gPiAtCQly ZXR1cm4gcGFuZWwtPmZ1bmNzLT5wcmVwYXJlKHBhbmVsKTsKPiA+ICsJaW50IHJldCA9IC1FTk9T WVM7Cj4gPiAgCj4gPiAtCXJldHVybiBwYW5lbCA/IC1FTk9TWVMgOiAtRUlOVkFMOwo+ID4gKwlp ZiAoIXBhbmVsKQo+ID4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gPiArCj4gPiArCWlmIChwYW5lbC0+ cHJlcGFyZWQpCj4gPiArCQlyZXR1cm4gMDsKPiA+ICsKPiA+ICsJaWYgKHBhbmVsLT5mdW5jcyAm JiBwYW5lbC0+ZnVuY3MtPnByZXBhcmUpCj4gPiArCQlyZXQgPSBwYW5lbC0+ZnVuY3MtPnByZXBh cmUocGFuZWwpOwo+ID4gKwo+ID4gKwlpZiAocmV0ID49IDApCj4gPiArCQlwYW5lbC0+cHJlcGFy ZWQgPSB0cnVlOwo+ID4gKwo+ID4gKwlyZXR1cm4gcmV0Owo+ID4gIH0KPiA+ICBFWFBPUlRfU1lN Qk9MKGRybV9wYW5lbF9wcmVwYXJlKTsKPiA+ICAKPiA+IEBAIC04NSwxMCArOTYsMjEgQEAgRVhQ T1JUX1NZTUJPTChkcm1fcGFuZWxfcHJlcGFyZSk7Cj4gPiAgICovCj4gPiAgaW50IGRybV9wYW5l bF9lbmFibGUoc3RydWN0IGRybV9wYW5lbCAqcGFuZWwpCj4gPiAgewo+ID4gLQlpZiAocGFuZWwg JiYgcGFuZWwtPmZ1bmNzICYmIHBhbmVsLT5mdW5jcy0+ZW5hYmxlKQo+ID4gLQkJcmV0dXJuIHBh bmVsLT5mdW5jcy0+ZW5hYmxlKHBhbmVsKTsKPiA+ICsJaW50IHJldCA9IC1FTk9TWVM7Cj4gPiAg Cj4gPiAtCXJldHVybiBwYW5lbCA/IC1FTk9TWVMgOiAtRUlOVkFMOwo+ID4gKwlpZiAoIXBhbmVs KQo+ID4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gPiArCj4gPiArCWlmIChwYW5lbC0+ZW5hYmxlZCkK PiA+ICsJCXJldHVybiAwOwo+ID4gKwo+ID4gKwlpZiAocGFuZWwtPmZ1bmNzICYmIHBhbmVsLT5m dW5jcy0+ZW5hYmxlKQo+ID4gKwkJcmV0ID0gcGFuZWwtPmZ1bmNzLT5lbmFibGUocGFuZWwpOwo+ ID4gKwo+ID4gKwlpZiAocmV0ID49IDApCj4gPiArCQlwYW5lbC0+ZW5hYmxlZCA9IHRydWU7Cj4g PiArCj4gPiArCXJldHVybiByZXQ7Cj4gPiAgfQo+ID4gIEVYUE9SVF9TWU1CT0woZHJtX3BhbmVs X2VuYWJsZSk7Cj4gPiAgCj4gPiBAQCAtMTA0LDEwICsxMjYsMjAgQEAgRVhQT1JUX1NZTUJPTChk cm1fcGFuZWxfZW5hYmxlKTsKPiA+ICAgKi8KPiA+ICBpbnQgZHJtX3BhbmVsX2Rpc2FibGUoc3Ry dWN0IGRybV9wYW5lbCAqcGFuZWwpCj4gPiAgewo+ID4gLQlpZiAocGFuZWwgJiYgcGFuZWwtPmZ1 bmNzICYmIHBhbmVsLT5mdW5jcy0+ZGlzYWJsZSkKPiA+IC0JCXJldHVybiBwYW5lbC0+ZnVuY3Mt PmRpc2FibGUocGFuZWwpOwo+ID4gKwlpbnQgcmV0ID0gLUVOT1NZUzsKPiA+ICAKPiA+IC0JcmV0 dXJuIHBhbmVsID8gLUVOT1NZUyA6IC1FSU5WQUw7Cj4gPiArCWlmICghcGFuZWwpCj4gPiArCQly ZXR1cm4gLUVJTlZBTDsKPiA+ICsKPiA+ICsJaWYgKCFwYW5lbC0+ZW5hYmxlZCkKPiA+ICsJCXJl dHVybiAwOwo+ID4gKwo+ID4gKwlpZiAocGFuZWwtPmZ1bmNzICYmIHBhbmVsLT5mdW5jcy0+ZGlz YWJsZSkKPiA+ICsJCXJldCA9IHBhbmVsLT5mdW5jcy0+ZGlzYWJsZShwYW5lbCk7Cj4gPiArCj4g PiArCXBhbmVsLT5lbmFibGVkID0gZmFsc2U7Cj4gPiArCj4gPiArCXJldHVybiByZXQ7Cj4gPiAg fQo+ID4gIEVYUE9SVF9TWU1CT0woZHJtX3BhbmVsX2Rpc2FibGUpOwo+ID4gIAo+ID4gQEAgLTEy NCwxMCArMTU2LDIwIEBAIEVYUE9SVF9TWU1CT0woZHJtX3BhbmVsX2Rpc2FibGUpOwo+ID4gICAq Lwo+ID4gIGludCBkcm1fcGFuZWxfdW5wcmVwYXJlKHN0cnVjdCBkcm1fcGFuZWwgKnBhbmVsKQo+ ID4gIHsKPiA+IC0JaWYgKHBhbmVsICYmIHBhbmVsLT5mdW5jcyAmJiBwYW5lbC0+ZnVuY3MtPnVu cHJlcGFyZSkKPiA+IC0JCXJldHVybiBwYW5lbC0+ZnVuY3MtPnVucHJlcGFyZShwYW5lbCk7Cj4g PiArCWludCByZXQgPSAtRU5PU1lTOwo+ID4gIAo+ID4gLQlyZXR1cm4gcGFuZWwgPyAtRU5PU1lT IDogLUVJTlZBTDsKPiA+ICsJaWYgKCFwYW5lbCkKPiA+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4g Kwo+ID4gKwlpZiAoIXBhbmVsLT5wcmVwYXJlZCkKPiA+ICsJCXJldHVybiAwOwo+ID4gKwo+ID4g KwlpZiAocGFuZWwtPmZ1bmNzICYmIHBhbmVsLT5mdW5jcy0+dW5wcmVwYXJlKQo+ID4gKwkJcmV0 ID0gcGFuZWwtPmZ1bmNzLT51bnByZXBhcmUocGFuZWwpOwo+ID4gKwo+ID4gKwlwYW5lbC0+cHJl cGFyZWQgPSBmYWxzZTsKPiA+ICsKPiA+ICsJcmV0dXJuIHJldDsKPiA+ICB9Cj4gPiAgRVhQT1JU X1NZTUJPTChkcm1fcGFuZWxfdW5wcmVwYXJlKTsKPiA+ICAKPiA+IGRpZmYgLS1naXQgYS9pbmNs dWRlL2RybS9kcm1fcGFuZWwuaCBiL2luY2x1ZGUvZHJtL2RybV9wYW5lbC5oCj4gPiBpbmRleCA2 MjRiZDE1ZWNmYWIuLjc0OTM1MDBmYzliZCAxMDA2NDQKPiA+IC0tLSBhL2luY2x1ZGUvZHJtL2Ry bV9wYW5lbC5oCj4gPiArKysgYi9pbmNsdWRlL2RybS9kcm1fcGFuZWwuaAo+ID4gQEAgLTY1LDYg KzY1LDkgQEAgc3RydWN0IGRybV9wYW5lbF9mdW5jcyB7Cj4gPiAgCSAqIEBwcmVwYXJlOgo+ID4g IAkgKgo+ID4gIAkgKiBUdXJuIG9uIHBhbmVsIGFuZCBwZXJmb3JtIHNldCB1cC4KPiA+ICsJICog V2hlbiB0aGUgcGFuZWwgaXMgc3VjY2Vzc2Z1bGx5IHByZXBhcmVkIHRoZSBwcmVwYXJlKCkgZnVu Y3Rpb24KPiA+ICsJICogd2lsbCBub3QgYmUgY2FsbGVkIGFnYWluIHVudGlsIHRoZSBwYW5lbCBo YXMgYmVlbiB1bnByZXBhcmVkLgo+ID4gKwkgKgo+ID4gIAkgKi8KPiA+ICAJaW50ICgqcHJlcGFy ZSkoc3RydWN0IGRybV9wYW5lbCAqcGFuZWwpOwo+ID4gIAo+ID4gQEAgLTcyLDYgKzc1LDggQEAg c3RydWN0IGRybV9wYW5lbF9mdW5jcyB7Cj4gPiAgCSAqIEBlbmFibGU6Cj4gPiAgCSAqCj4gPiAg CSAqIEVuYWJsZSBwYW5lbCAodHVybiBvbiBiYWNrIGxpZ2h0LCBldGMuKS4KPiA+ICsJICogV2hl biB0aGUgcGFuZWwgaXMgc3VjY2Vzc2Z1bGx5IGVuYWJsZWQgdGhlIGVuYWJsZSgpIGZ1bmN0aW9u Cj4gPiArCSAqIHdpbGwgbm90IGJlIGNhbGxlZCBhZ2FpbiB1bnRpbCB0aGUgcGFuZWwgaGFzIGJl ZW4gZGlzYWJsZWQuCj4gPiAgCSAqLwo+ID4gIAlpbnQgKCplbmFibGUpKHN0cnVjdCBkcm1fcGFu ZWwgKnBhbmVsKTsKPiA+ICAKPiA+IEBAIC03OSw2ICs4NCw3IEBAIHN0cnVjdCBkcm1fcGFuZWxf ZnVuY3Mgewo+ID4gIAkgKiBAZGlzYWJsZToKPiA+ICAJICoKPiA+ICAJICogRGlzYWJsZSBwYW5l bCAodHVybiBvZmYgYmFjayBsaWdodCwgZXRjLikuCj4gPiArCSAqIElmIHRoZSBwYW5lbCBpcyBh bHJlYWR5IGRpc2FibGVkIHRoZSBkaXNhYmxlKCkgZnVuY3Rpb24gaXMgbm90IGNhbGxlZC4KPiA+ ICAJICovCj4gPiAgCWludCAoKmRpc2FibGUpKHN0cnVjdCBkcm1fcGFuZWwgKnBhbmVsKTsKPiA+ ICAKPiA+IEBAIC04Niw2ICs5Miw3IEBAIHN0cnVjdCBkcm1fcGFuZWxfZnVuY3Mgewo+ID4gIAkg KiBAdW5wcmVwYXJlOgo+ID4gIAkgKgo+ID4gIAkgKiBUdXJuIG9mZiBwYW5lbC4KPiA+ICsJICog SWYgdGhlIHBhbmVsIGlzIGFscmVhZHkgdW5wcmVwYXJlZCB0aGUgdW5wcmVwYXJlKCkgZnVuY3Rp b24gaXMgbm90IGNhbGxlZC4KPiA+ICAJICovCj4gPiAgCWludCAoKnVucHJlcGFyZSkoc3RydWN0 IGRybV9wYW5lbCAqcGFuZWwpOwo+ID4gIAo+ID4gQEAgLTE0NSw2ICsxNTIsMjAgQEAgc3RydWN0 IGRybV9wYW5lbCB7Cj4gPiAgCSAqIFBhbmVsIGVudHJ5IGluIHJlZ2lzdHJ5Lgo+ID4gIAkgKi8K PiA+ICAJc3RydWN0IGxpc3RfaGVhZCBsaXN0Owo+ID4gKwo+ID4gKwkvKioKPiA+ICsJICogQHBy ZXBhcmVkOgo+ID4gKwkgKgo+ID4gKwkgKiBTZXQgdG8gdHJ1ZSB3aGVuIHRoZSBwYW5lbCBpcyBz dWNjZXNzZnVsbHkgcHJlcGFyZWQuCj4gPiArCSAqLwo+ID4gKwlib29sIHByZXBhcmVkOwo+ID4g Kwo+ID4gKwkvKioKPiA+ICsJICogQGVuYWJsZWQ6Cj4gPiArCSAqCj4gPiArCSAqIFNldCB0byB0 cnVlIHdoZW4gdGhlIHBhbmVsIGlzIHN1Y2Nlc3NmdWxseSBlbmFibGVkLgo+ID4gKwkgKi8KPiA+ ICsJYm9vbCBlbmFibGVkOwo+ID4gIH07Cj4gPiAgCj4gPiAgdm9pZCBkcm1fcGFuZWxfaW5pdChz dHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCk7Cj4gCj4gLS0gCj4gUmVnYXJkcywKPiAKPiBMYXVyZW50 IFBpbmNoYXJ0Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f CmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpo dHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbA== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E0F99C433FF for ; Mon, 5 Aug 2019 16:51:31 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B1427206A2 for ; Mon, 5 Aug 2019 16:51:31 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="j0tcOwgM" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B1427206A2 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ravnborg.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=nySEyZEPVw+h0Zc2fgnU8EFt32ZjAen9EzI1OVrvTtI=; b=j0tcOwgM+/4IXZ aOuDfjpxA6O/F+C5EbdYgXSLLuRbEtYSt1xNrbNrS33d3B/NRFcB8MIGbj+zQRuLeVjTW5M1OUESN uaZCdHQU9SQlUZ5/fnAD+bFpJSNUQ2ZjGVNfU04bWDt7OIsTbcvqWcYXnWWP+5rmGFpFF0bxe9s1s agvxFdIQQyadUGAyc9sbOC/MBFWdUCK8UodRTerC2ASNuk/Y3TEZDXzbHDO/APjZxdYRGQKJ5R8bc +bSzun1PFRXbakP4MYjPmmN2UcV9vNcbRKsq0JRlzZ+OcVoZTlbBnFXfC25cfVIMFWnc0JzKb5yDm IKGC455TRUGaqs5AfDaQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1hugCp-0000eA-BN; Mon, 05 Aug 2019 16:51:31 +0000 Received: from asavdk3.altibox.net ([109.247.116.14]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1hugCk-0000df-Cy for linux-arm-kernel@lists.infradead.org; Mon, 05 Aug 2019 16:51:28 +0000 Received: from ravnborg.org (unknown [158.248.194.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by asavdk3.altibox.net (Postfix) with ESMTPS id C267B20043; Mon, 5 Aug 2019 18:51:18 +0200 (CEST) Date: Mon, 5 Aug 2019 18:51:17 +0200 From: Sam Ravnborg To: Laurent Pinchart Subject: Re: [PATCH v1 14/16] drm/panel: call prepare/enable only once Message-ID: <20190805165117.GA23301@ravnborg.org> References: <20190804201637.1240-1-sam@ravnborg.org> <20190804201637.1240-15-sam@ravnborg.org> <20190805105928.GI29747@pendragon.ideasonboard.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20190805105928.GI29747@pendragon.ideasonboard.com> User-Agent: Mutt/1.10.1 (2018-07-13) X-CMAE-Score: 0 X-CMAE-Analysis: v=2.3 cv=dqr19Wo4 c=1 sm=1 tr=0 a=UWs3HLbX/2nnQ3s7vZ42gw==:117 a=UWs3HLbX/2nnQ3s7vZ42gw==:17 a=jpOVt7BSZ2e4Z31A5e1TngXxSK0=:19 a=kj9zAlcOel0A:10 a=7gkXJVJtAAAA:8 a=QyXUC8HyAAAA:8 a=P-IC7800AAAA:8 a=pGLkceISAAAA:8 a=PSbSiqWQeDyjEjQUClkA:9 a=rmExfkhgAZTdbKwS:21 a=hj9UMnod6qK2XUPH:21 a=CjuIK1q_8ugA:10 a=E9Po1WZjFZOl8hwRPBS3:22 a=d3PnA9EDa4IxuAV0gXij:22 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190805_095126_796818_6DDA7C53 X-CRM114-Status: GOOD ( 36.77 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Neil Armstrong , David Airlie , Linus Walleij , dri-devel@lists.freedesktop.org, Andrzej Hajda , Thierry Reding , Benjamin Gaignard , Fabio Estevam , Marek Vasut , Laurent Pinchart , Joonyoung Shim , Vincent Abriou , Krzysztof Kozlowski , Jonathan Hunter , Maxime Ripard , Kukjin Kim , linux-arm-kernel@lists.infradead.org, Philipp Zabel , NXP Linux Team , Pengutronix Kernel Team , Jonas Karlman , Sascha Hauer , Alison Wang , Maarten Lankhorst , Gwan-gyeong Mun , Inki Dae , Alexios Zavras , linux-samsung-soc@vger.kernel.org, Stefan Agner , linux-tegra@vger.kernel.org, Thomas Gleixner , Sean Paul , Allison Randal , Jernej Skrabec , Shawn Guo , Seung-Woo Kim , Kyungmin Park , Daniel Vetter , Enrico Weigelt Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi Laurent. > > On Sun, Aug 04, 2019 at 10:16:35PM +0200, Sam Ravnborg wrote: > > Many panel drivers duplicate logic to prevent prepare to be called > > for a panel that is already prepared. > > Likewise for enable. > > > > Implement this logic in drm_panel so the individual drivers > > no longer needs this. > > A panel is considered prepared/enabled only if the prepare/enable call > > succeeds. > > For disable/unprepare it is unconditionally considered > > disabled/unprepared. > > > > This allows calls to prepare/enable again, even if there were > > some issue disabling a regulator or similar during disable/unprepare. > > Is this the right place to handle this ? Shouldn't the upper layers > ensure than enable/disable and prepare/unprepare are correcty balanced, > and not called multiple times ? Adding enabled and prepared state to > drm_panel not only doesn't align well with atomic state handling, but > also would hide issues in upper layers that should really be fixed > there. The main rationale behind starting on this was that ~15 panel drivers already implements logic to prevent the prepare/enable/disable/unprepare functions to be called out of order. $ cd drivers/gpu/drm/panel/; git grep enabled | grep bool | wc -l Several of the panel drivers also implements a mipi_dsi_driver.shutdown() or platform_driver.shutdown(). To the best of my knowledge we cannot guarantee that the upper layers have done the proper disable()/unprepare() dance before a shutdown. So the flags exists to allow the driver to unconditionally call disable() / unprepare() in the shutdown methods. Same goes for *_driver.remove() One improvement could be to detect if the panel is prepare() when upper layers call enable() and warn/error in this situation. With the current implementation this is not checked at all. Likewise for unprepare() (require it was never enabled or disable() was caled first) I claim the check exists for the benefit of .remove and .shutdown, so we could also check if prepare() or enable() is called twice. Adding logic to call prepare() automagically would hide probems in upper layers and this was only briefly considered - and discarded as hiding bugs. So to sum up: - Moving the checks from drivers to the core is a good thing - The core shall check that a panel is prepared when enable is called and error out if not (or warn). - The core shall check that a panel is disabled when unprepare is called and error out if not (or warn). The core shall check if prepare() and enable() is called out of order. The patch needs to be extended to cover the last three points. Laurent / Emil / Thierry - agree/comments? Note: Did a quick round to see if could spot any wrong use of drm_panel_* functions. Most looked good, but then I did not do a throughly check. bridge/analogix/analogix_dp_core.c looks fishy. Looks like analogix_dp_prepare_panel() is a nop the way it is called. I did not look too much on this, maybe I am wrong. Sam > > > Signed-off-by: Sam Ravnborg > > Cc: Maarten Lankhorst > > Cc: Maxime Ripard > > Cc: Sean Paul > > Cc: Thierry Reding > > Cc: Sam Ravnborg > > Cc: David Airlie > > Cc: Daniel Vetter > > --- > > drivers/gpu/drm/drm_panel.c | 66 ++++++++++++++++++++++++++++++------- > > include/drm/drm_panel.h | 21 ++++++++++++ > > 2 files changed, 75 insertions(+), 12 deletions(-) > > > > diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c > > index da19d5b4a2f4..0853764040de 100644 > > --- a/drivers/gpu/drm/drm_panel.c > > +++ b/drivers/gpu/drm/drm_panel.c > > @@ -66,10 +66,21 @@ EXPORT_SYMBOL(drm_panel_init); > > */ > > int drm_panel_prepare(struct drm_panel *panel) > > { > > - if (panel && panel->funcs && panel->funcs->prepare) > > - return panel->funcs->prepare(panel); > > + int ret = -ENOSYS; > > > > - return panel ? -ENOSYS : -EINVAL; > > + if (!panel) > > + return -EINVAL; > > + > > + if (panel->prepared) > > + return 0; > > + > > + if (panel->funcs && panel->funcs->prepare) > > + ret = panel->funcs->prepare(panel); > > + > > + if (ret >= 0) > > + panel->prepared = true; > > + > > + return ret; > > } > > EXPORT_SYMBOL(drm_panel_prepare); > > > > @@ -85,10 +96,21 @@ EXPORT_SYMBOL(drm_panel_prepare); > > */ > > int drm_panel_enable(struct drm_panel *panel) > > { > > - if (panel && panel->funcs && panel->funcs->enable) > > - return panel->funcs->enable(panel); > > + int ret = -ENOSYS; > > > > - return panel ? -ENOSYS : -EINVAL; > > + if (!panel) > > + return -EINVAL; > > + > > + if (panel->enabled) > > + return 0; > > + > > + if (panel->funcs && panel->funcs->enable) > > + ret = panel->funcs->enable(panel); > > + > > + if (ret >= 0) > > + panel->enabled = true; > > + > > + return ret; > > } > > EXPORT_SYMBOL(drm_panel_enable); > > > > @@ -104,10 +126,20 @@ EXPORT_SYMBOL(drm_panel_enable); > > */ > > int drm_panel_disable(struct drm_panel *panel) > > { > > - if (panel && panel->funcs && panel->funcs->disable) > > - return panel->funcs->disable(panel); > > + int ret = -ENOSYS; > > > > - return panel ? -ENOSYS : -EINVAL; > > + if (!panel) > > + return -EINVAL; > > + > > + if (!panel->enabled) > > + return 0; > > + > > + if (panel->funcs && panel->funcs->disable) > > + ret = panel->funcs->disable(panel); > > + > > + panel->enabled = false; > > + > > + return ret; > > } > > EXPORT_SYMBOL(drm_panel_disable); > > > > @@ -124,10 +156,20 @@ EXPORT_SYMBOL(drm_panel_disable); > > */ > > int drm_panel_unprepare(struct drm_panel *panel) > > { > > - if (panel && panel->funcs && panel->funcs->unprepare) > > - return panel->funcs->unprepare(panel); > > + int ret = -ENOSYS; > > > > - return panel ? -ENOSYS : -EINVAL; > > + if (!panel) > > + return -EINVAL; > > + > > + if (!panel->prepared) > > + return 0; > > + > > + if (panel->funcs && panel->funcs->unprepare) > > + ret = panel->funcs->unprepare(panel); > > + > > + panel->prepared = false; > > + > > + return ret; > > } > > EXPORT_SYMBOL(drm_panel_unprepare); > > > > diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h > > index 624bd15ecfab..7493500fc9bd 100644 > > --- a/include/drm/drm_panel.h > > +++ b/include/drm/drm_panel.h > > @@ -65,6 +65,9 @@ struct drm_panel_funcs { > > * @prepare: > > * > > * Turn on panel and perform set up. > > + * When the panel is successfully prepared the prepare() function > > + * will not be called again until the panel has been unprepared. > > + * > > */ > > int (*prepare)(struct drm_panel *panel); > > > > @@ -72,6 +75,8 @@ struct drm_panel_funcs { > > * @enable: > > * > > * Enable panel (turn on back light, etc.). > > + * When the panel is successfully enabled the enable() function > > + * will not be called again until the panel has been disabled. > > */ > > int (*enable)(struct drm_panel *panel); > > > > @@ -79,6 +84,7 @@ struct drm_panel_funcs { > > * @disable: > > * > > * Disable panel (turn off back light, etc.). > > + * If the panel is already disabled the disable() function is not called. > > */ > > int (*disable)(struct drm_panel *panel); > > > > @@ -86,6 +92,7 @@ struct drm_panel_funcs { > > * @unprepare: > > * > > * Turn off panel. > > + * If the panel is already unprepared the unprepare() function is not called. > > */ > > int (*unprepare)(struct drm_panel *panel); > > > > @@ -145,6 +152,20 @@ struct drm_panel { > > * Panel entry in registry. > > */ > > struct list_head list; > > + > > + /** > > + * @prepared: > > + * > > + * Set to true when the panel is successfully prepared. > > + */ > > + bool prepared; > > + > > + /** > > + * @enabled: > > + * > > + * Set to true when the panel is successfully enabled. > > + */ > > + bool enabled; > > }; > > > > void drm_panel_init(struct drm_panel *panel); > > -- > Regards, > > Laurent Pinchart _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel