From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sam Ravnborg Subject: Re: [PATCH V7 2/2] drm/panel: Add Sitronix ST7701 panel driver Date: Fri, 11 Jan 2019 22:19:31 +0100 Message-ID: <20190111211931.GA29735@ravnborg.org> References: <20190111124714.19566-1-jagan@amarulasolutions.com> <20190111124714.19566-2-jagan@amarulasolutions.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from asavdk3.altibox.net (asavdk3.altibox.net [109.247.116.14]) by gabe.freedesktop.org (Postfix) with ESMTPS id 35B656E23D for ; Fri, 11 Jan 2019 21:19:36 +0000 (UTC) Content-Disposition: inline In-Reply-To: <20190111124714.19566-2-jagan@amarulasolutions.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Jagan Teki Cc: David Airlie , linux-amarula@amarulasolutions.com, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Thierry Reding , Michael Trimarchi , Sean Paul List-Id: dri-devel@lists.freedesktop.org SGkgSmFnYW4uCgpHYXZlIHRoaXMgYW5vdGhlciBtb3JlIGRldGFpbGVkIHJlYWQgLSB0cmlnZ2Vy ZWQgc29tZSBhZGRpdGlvbmFsIGNvbW1lbnRzLgpEZXBpdGUgdGhlIGNvbW1lbnRzIGl0IGxvb2tz IGdvb2QsIGFuZCB0aGlzIGlzIGFsbCBtb3JlIG9yCmxlc3MgY29zbWV0aWMgaW1wcm92ZW1lbnRz LgoKCVNhbQoKPiArc3RydWN0IHN0NzcwMV9wYW5lbF9kZXNjIHsKPiArCWNvbnN0IHN0cnVjdCBk cm1fZGlzcGxheV9tb2RlICptb2RlOwo+ICsJdW5zaWduZWQgaW50IGxhbmVzOwo+ICsJdW5zaWdu ZWQgbG9uZyBmbGFnczsKPiArCWVudW0gbWlwaV9kc2lfcGl4ZWxfZm9ybWF0IGZvcm1hdDsKPiAr CWNvbnN0IGNoYXIgKmNvbnN0ICpzdXBwbHlfbmFtZXM7Cj4gKwl1bnNpZ25lZCBpbnQgbnVtX3N1 cHBsaWVzOwo+ICsJdW5zaWduZWQgaW50IHBhbmVsX3NsZWVwX2RlbGF5Owo+ICt9Owo+ICsKPiAr c3RydWN0IHN0NzcwMSB7Cj4gKwlzdHJ1Y3QgZHJtX3BhbmVsIHBhbmVsOwo+ICsJc3RydWN0IG1p cGlfZHNpX2RldmljZSAqZHNpOwo+ICsJY29uc3Qgc3RydWN0IHN0NzcwMV9wYW5lbF9kZXNjICpk ZXNjOwo+ICsKPiArCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiYWNrbGlnaHQ7Cj4gKwlzdHJ1 Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqc3VwcGxpZXM7Cj4gKwl1bnNpZ25lZCBpbnQgbnVtX3N1 cHBsaWVzOwpJIGNhbm5vdCBzZWUgdGhhdCBudW1fc3VwcGxpZXMgaW4gdGhpcyBzdHJ1Y3QgYXJl IHVzZWQ/CgoKPiArCXN0cnVjdCBncGlvX2Rlc2MgKnJlc2V0Owo+ICsJdW5zaWduZWQgaW50IHNs ZWVwX2RlbGF5Owo+ICt9Owo+ICsKPiArc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3Q3NzAxICpwYW5l bF90b19zdDc3MDEoc3RydWN0IGRybV9wYW5lbCAqcGFuZWwpCj4gK3sKPiArCXJldHVybiBjb250 YWluZXJfb2YocGFuZWwsIHN0cnVjdCBzdDc3MDEsIHBhbmVsKTsKPiArfQo+ICsKPiArc3RhdGlj IGlubGluZSBpbnQgc3Q3NzAxX2RzaV93cml0ZShzdHJ1Y3Qgc3Q3NzAxICpzdDc3MDEsIGNvbnN0 IHZvaWQgKnNlcSwKPiArCQkJCSAgIHNpemVfdCBsZW4pCj4gK3sKPiArCXJldHVybiBtaXBpX2Rz aV9kY3Nfd3JpdGVfYnVmZmVyKHN0NzcwMS0+ZHNpLCBzZXEsIGxlbik7Cj4gK30KPiArCgoKPiAr c3RhdGljIGludCBzdDc3MDFfcHJlcGFyZShzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCkKPiArewo+ ICsJc3RydWN0IHN0NzcwMSAqc3Q3NzAxID0gcGFuZWxfdG9fc3Q3NzAxKHBhbmVsKTsKPiArCWlu dCByZXQ7Cj4gKwo+ICsJZ3Bpb2Rfc2V0X3ZhbHVlKHN0NzcwMS0+cmVzZXQsIDApOwo+ICsJbXNs ZWVwKDIwKTsKPiArCj4gKwlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoc3Q3NzAxLT5kZXNj LT5udW1fc3VwcGxpZXMsCj4gKwkJCQkgICAgc3Q3NzAxLT5zdXBwbGllcyk7Cj4gKwlpZiAocmV0 IDwgMCkKPiArCQlyZXR1cm4gcmV0Owo+ICsJbXNsZWVwKDIwKTsKPiArCj4gKwlncGlvZF9zZXRf dmFsdWUoc3Q3NzAxLT5yZXNldCwgMSk7Cj4gKwltc2xlZXAoMjApOwo+ICsKPiArCWdwaW9kX3Nl dF92YWx1ZShzdDc3MDEtPnJlc2V0LCAwKTsKPiArCW1zbGVlcCgzMCk7Cj4gKwo+ICsJZ3Bpb2Rf c2V0X3ZhbHVlKHN0NzcwMS0+cmVzZXQsIDEpOwo+ICsJbXNsZWVwKDE1MCk7Cj4gKwo+ICsJc3Q3 NzAxX2luaXRfc2VxdWVuY2Uoc3Q3NzAxKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKCj4g K3N0YXRpYyBpbnQgc3Q3NzAxX3VucHJlcGFyZShzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCkKPiAr ewo+ICsJc3RydWN0IHN0NzcwMSAqc3Q3NzAxID0gcGFuZWxfdG9fc3Q3NzAxKHBhbmVsKTsKPiAr Cj4gKwlTVDc3MDFfRFNJKHN0NzcwMSwgTUlQSV9EQ1NfRVhJVF9TTEVFUF9NT0RFLCAweDAwKTsK PiArCj4gKwltc2xlZXAoc3Q3NzAxLT5zbGVlcF9kZWxheSk7Cj4gKwo+ICsJZ3Bpb2Rfc2V0X3Zh bHVlKHN0NzcwMS0+cmVzZXQsIDApOwo+ICsKPiArCWdwaW9kX3NldF92YWx1ZShzdDc3MDEtPnJl c2V0LCAxKTsKPiArCj4gKwlncGlvZF9zZXRfdmFsdWUoc3Q3NzAxLT5yZXNldCwgMCk7Ck5vIHRp bWluZyBjb25zdHJhaW5zIGhlcmU/IEluIHByZXBhcmUgdGhlcmUgYXJlIHNsZWVwcyBpbnRlcm1p eGVkLgoKPiArCj4gKwlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKHN0NzcwMS0+ZGVzYy0+bnVtX3N1 cHBsaWVzLCBzdDc3MDEtPnN1cHBsaWVzKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiAr c3RhdGljIGludCBzdDc3MDFfZ2V0X21vZGVzKHN0cnVjdCBkcm1fcGFuZWwgKnBhbmVsKQo+ICt7 Cj4gKwlzdHJ1Y3Qgc3Q3NzAxICpzdDc3MDEgPSBwYW5lbF90b19zdDc3MDEocGFuZWwpOwo+ICsJ Y29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmRlc2NfbW9kZSA9IHN0NzcwMS0+ZGVzYy0+ bW9kZTsKPiArCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOwo+ICsKPiArCW1vZGUgPSBk cm1fbW9kZV9kdXBsaWNhdGUocGFuZWwtPmRybSwgZGVzY19tb2RlKTsKPiArCWlmICghbW9kZSkg ewo+ICsJCWRldl9lcnIoJnN0NzcwMS0+ZHNpLT5kZXYsICJmYWlsZWQgdG8gYWRkIG1vZGUgJXV4 JXV4QCV1XG4iLAo+ICsJCQlkZXNjX21vZGUtPmhkaXNwbGF5LCBkZXNjX21vZGUtPnZkaXNwbGF5 LAo+ICsJCQlkZXNjX21vZGUtPnZyZWZyZXNoKTsKVXNlIHNvbWV0aGluZyBsaWtlOgoJCURSTV9E RVZfRVJST1Ioc3Q3NzAxLT5kZXYsICJmYWlsZWQgdG8gYWRkIG1vZGUiIERSTV9NT0RFX0ZNVCAi LAoJCQkgICAgICBEUk1fTU9ERV9BUkcoZGVzY19tb2RlKSk7Cgo+ICsJCXJldHVybiAtRU5PTUVN Owo+ICsJfQo+ICsKPiArCWRybV9tb2RlX3NldF9uYW1lKG1vZGUpOwo+ICsJZHJtX21vZGVfcHJv YmVkX2FkZChwYW5lbC0+Y29ubmVjdG9yLCBtb2RlKTsKPiArCj4gKwlwYW5lbC0+Y29ubmVjdG9y LT5kaXNwbGF5X2luZm8ud2lkdGhfbW0gPSBkZXNjX21vZGUtPndpZHRoX21tOwo+ICsJcGFuZWwt PmNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLmhlaWdodF9tbSA9IGRlc2NfbW9kZS0+aGVpZ2h0X21t Owo+ICsKPiArCXJldHVybiAxOwo+ICt9Cj4gKwoKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBzdDc3 MDFfcGFuZWxfZGVzYyB0czg1NTBiX2Rlc2MgPSB7Cj4gKwkubW9kZSA9ICZ0czg1NTBiX21vZGUs Cj4gKwkubGFuZXMgPSAyLAo+ICsJLmZsYWdzID0gTUlQSV9EU0lfTU9ERV9WSURFTywKPiArCS5m b3JtYXQgPSBNSVBJX0RTSV9GTVRfUkdCODg4LAo+ICsJLnN1cHBseV9uYW1lcyA9IHRzODU1MGJf c3VwcGx5X25hbWVzLAo+ICsJLm51bV9zdXBwbGllcyA9IEFSUkFZX1NJWkUodHM4NTUwYl9zdXBw bHlfbmFtZXMpLAo+ICsJLnBhbmVsX3NsZWVwX2RlbGF5ID0gODAsIC8qIHBhbmVsIG5lZWQgZXh0 cmEgODBtcyBmb3Igc2xlZXAgb3V0IGNtZCAqLwpJbiB0aGUgb25seSBwbGFjZSB0aGlzIGlzIHVz ZWQgdGhlcmUgaXMgYWRkZWQgMTIwIG1zIHRvby4KTG9va3MgaW5jb25zaXN0ZW50IC0gZG8gd2Ug aGF2ZSB0aGUgc2FtZSBkZWxheSB0d2ljZT8KCgo+ICsKPiArc3RhdGljIGludCBzdDc3MDFfZHNp X3Byb2JlKHN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRzaSkKPiArewo+ICsJY29uc3Qgc3RydWN0 IHN0NzcwMV9wYW5lbF9kZXNjICpkZXNjOwo+ICsJc3RydWN0IGRldmljZV9ub2RlICpucDsKPiAr CXN0cnVjdCBzdDc3MDEgKnN0NzcwMTsKPiArCWludCByZXQsIGk7Cj4gKwo+ICsJc3Q3NzAxID0g ZGV2bV9remFsbG9jKCZkc2ktPmRldiwgc2l6ZW9mKCpzdDc3MDEpLCBHRlBfS0VSTkVMKTsKPiAr CWlmICghc3Q3NzAxKQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsKPiArCWRlc2MgPSBvZl9kZXZp Y2VfZ2V0X21hdGNoX2RhdGEoJmRzaS0+ZGV2KTsKPiArCWRzaS0+bW9kZV9mbGFncyA9IGRlc2Mt PmZsYWdzOwo+ICsJZHNpLT5mb3JtYXQgPSBkZXNjLT5mb3JtYXQ7Cj4gKwlkc2ktPmxhbmVzID0g ZGVzYy0+bGFuZXM7Cj4gKwo+ICsJc3Q3NzAxLT5zdXBwbGllcyA9IGRldm1fa2NhbGxvYygmZHNp LT5kZXYsIGRlc2MtPm51bV9zdXBwbGllcywKPiArCQkJCQlzaXplb2YoKnN0NzcwMS0+c3VwcGxp ZXMpLAo+ICsJCQkJCUdGUF9LRVJORUwpOwo+ICsJaWYgKCFzdDc3MDEtPnN1cHBsaWVzKQo+ICsJ CXJldHVybiAtRU5PTUVNOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBkZXNjLT5udW1fc3VwcGxp ZXM7IGkrKykKPiArCQlzdDc3MDEtPnN1cHBsaWVzW2ldLnN1cHBseSA9IGRlc2MtPnN1cHBseV9u YW1lc1tpXTsKPiArCj4gKwlyZXQgPSBkZXZtX3JlZ3VsYXRvcl9idWxrX2dldCgmZHNpLT5kZXYs IGRlc2MtPm51bV9zdXBwbGllcywKPiArCQkJCSAgICAgIHN0NzcwMS0+c3VwcGxpZXMpOwo+ICsJ aWYgKHJldCA8IDApCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwlzdDc3MDEtPnJlc2V0ID0gZGV2 bV9ncGlvZF9nZXQoJmRzaS0+ZGV2LCAicmVzZXQiLCBHUElPRF9PVVRfTE9XKTsKPiArCWlmIChJ U19FUlIoc3Q3NzAxLT5yZXNldCkpIHsKPiArCQlkZXZfZXJyKCZkc2ktPmRldiwgIkNvdWxkbid0 IGdldCBvdXIgcmVzZXQgR1BJT1xuIik7Cj4gKwkJcmV0dXJuIFBUUl9FUlIoc3Q3NzAxLT5yZXNl dCk7Cj4gKwl9Cj4gKwo+ICsJbnAgPSBvZl9wYXJzZV9waGFuZGxlKGRzaS0+ZGV2Lm9mX25vZGUs ICJiYWNrbGlnaHQiLCAwKTsKPiArCWlmIChucCkgewo+ICsJCXN0NzcwMS0+YmFja2xpZ2h0ID0g b2ZfZmluZF9iYWNrbGlnaHRfYnlfbm9kZShucCk7Cj4gKwkJb2Zfbm9kZV9wdXQobnApOwo+ICsK PiArCQlpZiAoIXN0NzcwMS0+YmFja2xpZ2h0KQo+ICsJCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsK PiArCX0KVGhpcyBpcyBhIHNpbXBsZXIgdmFyaWFudCBvZiB0aGUgYWJvdmU6CglzdDc3MDEtPmJh Y2tsaWdodCA9IGRldm1fb2ZfZmluZF9iYWNrbGlnaHQoZHNpLT5kZXYpOwoJaWYgKElTX0VSUihz dDc3MDEtPmJhY2tsaWdodCkpCgkJcmV0dXJuIFBUUl9FUlIoc3Q3NzAxLT5iYWNrbGlnaHQpOwoK U3VnZ2VzdGVkIGJ5IE5vcmFsZiBpbiBhbm90aGVyIHRocmVhZCBmb3IgYSBzaW1pbGFyIGRyaXZl ci4KCgo+ICsKPiArCWRybV9wYW5lbF9pbml0KCZzdDc3MDEtPnBhbmVsKTsKPiArCj4gKwkvKiBX ZSBuZWVkIHRvIHdhaXQgMTIwbXMgYWZ0ZXIgYSBzbGVlcCBvdXQgY29tbWFuZCAqLwo+ICsJc3Q3 NzAxLT5zbGVlcF9kZWxheSA9IDEyMCArIGRlc2MtPnBhbmVsX3NsZWVwX2RlbGF5OwpUaGlzIGlz IHRoZSBvdGhlciBwbGFjZSB3aGVyZSB3ZSBhZGQgMTIwIHRvIHRoZSBwcmV2aW91cyA4MCAtIGlu IHRvdGFsIDIwMCBtcy4KCj4gKwlzdDc3MDEtPnBhbmVsLmZ1bmNzID0gJnN0NzcwMV9mdW5jczsK PiArCXN0NzcwMS0+cGFuZWwuZGV2ID0gJmRzaS0+ZGV2Owo+ICsKPiArCXJldCA9IGRybV9wYW5l bF9hZGQoJnN0NzcwMS0+cGFuZWwpOwo+ICsJaWYgKHJldCA8IDApCj4gKwkJcmV0dXJuIHJldDsK PiArCj4gKwltaXBpX2RzaV9zZXRfZHJ2ZGF0YShkc2ksIHN0NzcwMSk7Cj4gKwlzdDc3MDEtPmRz aSA9IGRzaTsKCj4gKwlzdDc3MDEtPmRlc2MgPSBkZXNjOwpUaGlzIGFzc2lnbm1lbnQgY291bGQg Y29tZSBlYXJsaWVyLCBzbyB3ZSBkbyBub3QgaGF2ZSBpdCB1bmFzc2lnbmVkIHdoZW4gY2FsbGlu ZwpvdGhlciBmdW5jdGlvbnMuIEFzIGl0IGlzIG5vdyBpdCB3b3JrcyBzbyB5b3UgY2FuIHNhZmVs eSBpZ25vcmUgdGhpcyBjb21tZW50LgoKPiArCj4gKwlyZXR1cm4gbWlwaV9kc2lfYXR0YWNoKGRz aSk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgc3Q3NzAxX2RzaV9yZW1vdmUoc3RydWN0IG1pcGlf ZHNpX2RldmljZSAqZHNpKQo+ICt7Cj4gKwlzdHJ1Y3Qgc3Q3NzAxICpzdDc3MDEgPSBtaXBpX2Rz aV9nZXRfZHJ2ZGF0YShkc2kpOwo+ICsKPiArCW1pcGlfZHNpX2RldGFjaChkc2kpOwo+ICsJZHJt X3BhbmVsX3JlbW92ZSgmc3Q3NzAxLT5wYW5lbCk7Cj4gKwo+ICsJaWYgKHN0NzcwMS0+YmFja2xp Z2h0KQo+ICsJCXB1dF9kZXZpY2UoJnN0NzcwMS0+YmFja2xpZ2h0LT5kZXYpOwoKVXNlOgoJYmFj a2xpZ2h0X3B1dChzdDc3MDEtPmJhY2tsaWdodCk7CgoKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxA bGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxt YW4vbGlzdGluZm8vZHJpLWRldmVsCg== 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=-2.5 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_PASS,USER_AGENT_MUTT 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 50205C43387 for ; Fri, 11 Jan 2019 21:19:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1A81221783 for ; Fri, 11 Jan 2019 21:19:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725772AbfAKVTk (ORCPT ); Fri, 11 Jan 2019 16:19:40 -0500 Received: from asavdk3.altibox.net ([109.247.116.14]:52966 "EHLO asavdk3.altibox.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725308AbfAKVTj (ORCPT ); Fri, 11 Jan 2019 16:19:39 -0500 Received: from ravnborg.org (unknown [158.248.194.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by asavdk3.altibox.net (Postfix) with ESMTPS id 7AA4820020; Fri, 11 Jan 2019 22:19:33 +0100 (CET) Date: Fri, 11 Jan 2019 22:19:31 +0100 From: Sam Ravnborg To: Jagan Teki Cc: Thierry Reding , David Airlie , Sean Paul , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Michael Trimarchi , linux-amarula@amarulasolutions.com Subject: Re: [PATCH V7 2/2] drm/panel: Add Sitronix ST7701 panel driver Message-ID: <20190111211931.GA29735@ravnborg.org> References: <20190111124714.19566-1-jagan@amarulasolutions.com> <20190111124714.19566-2-jagan@amarulasolutions.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190111124714.19566-2-jagan@amarulasolutions.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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=kj9zAlcOel0A:10 a=k1dyMpTxz__Fw_ammmUA:9 a=J2CCd2KcDSp0Zr6i:21 a=KSCQr6G_N1XjhTh8:21 a=CjuIK1q_8ugA:10 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Jagan. Gave this another more detailed read - triggered some additional comments. Depite the comments it looks good, and this is all more or less cosmetic improvements. Sam > +struct st7701_panel_desc { > + const struct drm_display_mode *mode; > + unsigned int lanes; > + unsigned long flags; > + enum mipi_dsi_pixel_format format; > + const char *const *supply_names; > + unsigned int num_supplies; > + unsigned int panel_sleep_delay; > +}; > + > +struct st7701 { > + struct drm_panel panel; > + struct mipi_dsi_device *dsi; > + const struct st7701_panel_desc *desc; > + > + struct backlight_device *backlight; > + struct regulator_bulk_data *supplies; > + unsigned int num_supplies; I cannot see that num_supplies in this struct are used? > + struct gpio_desc *reset; > + unsigned int sleep_delay; > +}; > + > +static inline struct st7701 *panel_to_st7701(struct drm_panel *panel) > +{ > + return container_of(panel, struct st7701, panel); > +} > + > +static inline int st7701_dsi_write(struct st7701 *st7701, const void *seq, > + size_t len) > +{ > + return mipi_dsi_dcs_write_buffer(st7701->dsi, seq, len); > +} > + > +static int st7701_prepare(struct drm_panel *panel) > +{ > + struct st7701 *st7701 = panel_to_st7701(panel); > + int ret; > + > + gpiod_set_value(st7701->reset, 0); > + msleep(20); > + > + ret = regulator_bulk_enable(st7701->desc->num_supplies, > + st7701->supplies); > + if (ret < 0) > + return ret; > + msleep(20); > + > + gpiod_set_value(st7701->reset, 1); > + msleep(20); > + > + gpiod_set_value(st7701->reset, 0); > + msleep(30); > + > + gpiod_set_value(st7701->reset, 1); > + msleep(150); > + > + st7701_init_sequence(st7701); > + > + return 0; > +} > + > +static int st7701_unprepare(struct drm_panel *panel) > +{ > + struct st7701 *st7701 = panel_to_st7701(panel); > + > + ST7701_DSI(st7701, MIPI_DCS_EXIT_SLEEP_MODE, 0x00); > + > + msleep(st7701->sleep_delay); > + > + gpiod_set_value(st7701->reset, 0); > + > + gpiod_set_value(st7701->reset, 1); > + > + gpiod_set_value(st7701->reset, 0); No timing constrains here? In prepare there are sleeps intermixed. > + > + regulator_bulk_disable(st7701->desc->num_supplies, st7701->supplies); > + > + return 0; > +} > + > +static int st7701_get_modes(struct drm_panel *panel) > +{ > + struct st7701 *st7701 = panel_to_st7701(panel); > + const struct drm_display_mode *desc_mode = st7701->desc->mode; > + struct drm_display_mode *mode; > + > + mode = drm_mode_duplicate(panel->drm, desc_mode); > + if (!mode) { > + dev_err(&st7701->dsi->dev, "failed to add mode %ux%ux@%u\n", > + desc_mode->hdisplay, desc_mode->vdisplay, > + desc_mode->vrefresh); Use something like: DRM_DEV_ERROR(st7701->dev, "failed to add mode" DRM_MODE_FMT ", DRM_MODE_ARG(desc_mode)); > + return -ENOMEM; > + } > + > + drm_mode_set_name(mode); > + drm_mode_probed_add(panel->connector, mode); > + > + panel->connector->display_info.width_mm = desc_mode->width_mm; > + panel->connector->display_info.height_mm = desc_mode->height_mm; > + > + return 1; > +} > + > +static const struct st7701_panel_desc ts8550b_desc = { > + .mode = &ts8550b_mode, > + .lanes = 2, > + .flags = MIPI_DSI_MODE_VIDEO, > + .format = MIPI_DSI_FMT_RGB888, > + .supply_names = ts8550b_supply_names, > + .num_supplies = ARRAY_SIZE(ts8550b_supply_names), > + .panel_sleep_delay = 80, /* panel need extra 80ms for sleep out cmd */ In the only place this is used there is added 120 ms too. Looks inconsistent - do we have the same delay twice? > + > +static int st7701_dsi_probe(struct mipi_dsi_device *dsi) > +{ > + const struct st7701_panel_desc *desc; > + struct device_node *np; > + struct st7701 *st7701; > + int ret, i; > + > + st7701 = devm_kzalloc(&dsi->dev, sizeof(*st7701), GFP_KERNEL); > + if (!st7701) > + return -ENOMEM; > + > + desc = of_device_get_match_data(&dsi->dev); > + dsi->mode_flags = desc->flags; > + dsi->format = desc->format; > + dsi->lanes = desc->lanes; > + > + st7701->supplies = devm_kcalloc(&dsi->dev, desc->num_supplies, > + sizeof(*st7701->supplies), > + GFP_KERNEL); > + if (!st7701->supplies) > + return -ENOMEM; > + > + for (i = 0; i < desc->num_supplies; i++) > + st7701->supplies[i].supply = desc->supply_names[i]; > + > + ret = devm_regulator_bulk_get(&dsi->dev, desc->num_supplies, > + st7701->supplies); > + if (ret < 0) > + return ret; > + > + st7701->reset = devm_gpiod_get(&dsi->dev, "reset", GPIOD_OUT_LOW); > + if (IS_ERR(st7701->reset)) { > + dev_err(&dsi->dev, "Couldn't get our reset GPIO\n"); > + return PTR_ERR(st7701->reset); > + } > + > + np = of_parse_phandle(dsi->dev.of_node, "backlight", 0); > + if (np) { > + st7701->backlight = of_find_backlight_by_node(np); > + of_node_put(np); > + > + if (!st7701->backlight) > + return -EPROBE_DEFER; > + } This is a simpler variant of the above: st7701->backlight = devm_of_find_backlight(dsi->dev); if (IS_ERR(st7701->backlight)) return PTR_ERR(st7701->backlight); Suggested by Noralf in another thread for a similar driver. > + > + drm_panel_init(&st7701->panel); > + > + /* We need to wait 120ms after a sleep out command */ > + st7701->sleep_delay = 120 + desc->panel_sleep_delay; This is the other place where we add 120 to the previous 80 - in total 200 ms. > + st7701->panel.funcs = &st7701_funcs; > + st7701->panel.dev = &dsi->dev; > + > + ret = drm_panel_add(&st7701->panel); > + if (ret < 0) > + return ret; > + > + mipi_dsi_set_drvdata(dsi, st7701); > + st7701->dsi = dsi; > + st7701->desc = desc; This assignment could come earlier, so we do not have it unassigned when calling other functions. As it is now it works so you can safely ignore this comment. > + > + return mipi_dsi_attach(dsi); > +} > + > +static int st7701_dsi_remove(struct mipi_dsi_device *dsi) > +{ > + struct st7701 *st7701 = mipi_dsi_get_drvdata(dsi); > + > + mipi_dsi_detach(dsi); > + drm_panel_remove(&st7701->panel); > + > + if (st7701->backlight) > + put_device(&st7701->backlight->dev); Use: backlight_put(st7701->backlight);