From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jagan Teki Subject: [PATCH v4 2/2] drm/panel: Add Feiyang FY07024DI26A30-D MIPI-DSI LCD panel Date: Fri, 25 Jan 2019 00:13:13 +0530 Message-ID: <20190124184313.30193-2-jagan@amarulasolutions.com> References: <20190124184313.30193-1-jagan@amarulasolutions.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-pf1-x443.google.com (mail-pf1-x443.google.com [IPv6:2607:f8b0:4864:20::443]) by gabe.freedesktop.org (Postfix) with ESMTPS id AA0776E37C for ; Thu, 24 Jan 2019 18:43:46 +0000 (UTC) Received: by mail-pf1-x443.google.com with SMTP id z9so3435858pfi.2 for ; Thu, 24 Jan 2019 10:43:46 -0800 (PST) In-Reply-To: <20190124184313.30193-1-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: Thierry Reding , David Airlie , Daniel Vetter , Sam Ravnborg Cc: Michael Trimarchi , linux-amarula@amarulasolutions.com, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Jagan Teki List-Id: dri-devel@lists.freedesktop.org RmVpeWFuZyBGWTA3MDI0REkyNkEzMC1EIGlzIDEwMjR4NjAwLCA0LWxhbmUgTUlQSS1EU0kgTENE IHBhbmVsLgoKQWRkIHBhbmVsIGRyaXZlciBmb3IgaXQuCgpTaWduZWQtb2ZmLWJ5OiBKYWdhbiBU ZWtpIDxqYWdhbkBhbWFydWxhc29sdXRpb25zLmNvbT4KLS0tCkNoYW5nZXMgZm9yIHY1OgotIHJl YmFzZSBvbiBtYXN0ZXIKLSBhZGp1c3QgdGhlIGhwb3JjaCB2YWx1ZXMgdG8gc2F0aXNmeSB0aGUg cmVmcmVzaApDaGFuZ2VzIGZvciB2NDoKLSB1c2Ugc2ltcGxlIHN0cnVjdHVyZSBmb3IgY29tbWFu ZCBpbml0Ci0gdXBkYXRlIHByb3BlciBjb21tZW50cyBvbiBwb3dlciwgcmVzZXQgZGVsYXkgc2Vx dW5jZQotIGZpeCB0byB1c2Ugc2V0X2Rpc3BsYXlfb2ZmIGluIGRpc2FibGUgZnVuY3Rpb24KLSBt b3ZlIG1vZGUgdHlwZSB0byBzdHJ1Y3R1cmUKLSBkcm9wIHJlZnJlcyByYXRlIHZhbHVlLCBsZXQg ZHJtIGNvbXB1dGUKQ2hhbmdlcyBmb3IgdjI6Ci0gbmV3IHBhdGNoLCBkZXJpdmVkIGZyb20gYW5v dGhlciBkc2kgc2VyaWVzCgogTUFJTlRBSU5FUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICA2ICsKIGRyaXZlcnMvZ3B1L2RybS9wYW5lbC9LY29uZmlnICAgICAgICAgICAg ICAgICB8ICAgOSArCiBkcml2ZXJzL2dwdS9kcm0vcGFuZWwvTWFrZWZpbGUgICAgICAgICAgICAg ICAgfCAgIDEgKwogLi4uL2RybS9wYW5lbC9wYW5lbC1mZWl5YW5nLWZ5MDcwMjRkaTI2YTMwZC5j IHwgMjg2ICsrKysrKysrKysrKysrKysrKwogNCBmaWxlcyBjaGFuZ2VkLCAzMDIgaW5zZXJ0aW9u cygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9wYW5lbC9wYW5lbC1mZWl5 YW5nLWZ5MDcwMjRkaTI2YTMwZC5jCgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJ TkVSUwppbmRleCBlM2Y3ODViYWQ2OGIuLjVjODU5MWViNTg0MCAxMDA2NDQKLS0tIGEvTUFJTlRB SU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTQ4MzEsNiArNDgzMSwxMiBAQCBUOglnaXQgZ2l0 Oi8vYW5vbmdpdC5mcmVlZGVza3RvcC5vcmcvZHJtL2RybS1taXNjCiBTOglNYWludGFpbmVkCiBG Oglkcml2ZXJzL2dwdS9kcm0vdHZlMjAwLwogCitEUk0gRFJJVkVSIEZPUiBGRUlZQU5HIEZZMDcw MjRESTI2QTMwLUQgTUlQSS1EU0kgTENEIFBBTkVMUworTToJSmFnYW4gVGVraSA8amFnYW5AYW1h cnVsYXNvbHV0aW9ucy5jb20+CitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL2dwdS9kcm0vcGFu ZWwvcGFuZWwtZmVpeWFuZy1meTA3MDI0ZGkyNmEzMGQuYworRjoJRG9jdW1lbnRhdGlvbi9kZXZp Y2V0cmVlL2JpbmRpbmdzL2Rpc3BsYXkvcGFuZWwvZmVpeWFuZyxmeTA3MDI0ZGkyNmEzMGQudHh0 CisKIERSTSBEUklWRVIgRk9SIElMSVRFSyBJTEk5MjI1IFBBTkVMUwogTToJRGF2aWQgTGVjaG5l ciA8ZGF2aWRAbGVjaG5vbG9neS5jb20+CiBTOglNYWludGFpbmVkCmRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vcGFuZWwvS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9LY29uZmln CmluZGV4IDE1MWRkZjcyMGI4My4uNTMwNGRiN2I3YjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dw dS9kcm0vcGFuZWwvS2NvbmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vcGFuZWwvS2NvbmZpZwpA QCAtNDcsNiArNDcsMTUgQEAgY29uZmlnIERSTV9QQU5FTF9TSU1QTEUKIAkgIHRoYXQgaXQgY2Fu IGJlIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9mZiB3aGVuIHRoZSBwYW5lbCBnb2VzIGludG8gYQog CSAgbG93IHBvd2VyIHN0YXRlLgogCitjb25maWcgRFJNX1BBTkVMX0ZFSVlBTkdfRlkwNzAyNERJ MjZBMzBECisJdHJpc3RhdGUgIkZlaXlhbmcgRlkwNzAyNERJMjZBMzAtRCBNSVBJLURTSSBMQ0Qg cGFuZWwiCisJZGVwZW5kcyBvbiBPRgorCWRlcGVuZHMgb24gRFJNX01JUElfRFNJCisJZGVwZW5k cyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQg dG8gZW5hYmxlIHN1cHBvcnQgZm9yIHBhbmVscyBiYXNlZCBvbiB0aGUKKwkgIEZlaXlhbmcgRlkw NzAyNERJMjZBMzAtRCBNSVBJLURTSSBpbnRlcmZhY2UuCisKIGNvbmZpZyBEUk1fUEFORUxfSUxJ VEVLX0lMOTMyMgogCXRyaXN0YXRlICJJbGl0ZWsgSUxJOTMyMiAzMjB4MjQwIFFWR0EgcGFuZWxz IgogCWRlcGVuZHMgb24gT0YgJiYgU1BJCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcGFu ZWwvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vcGFuZWwvTWFrZWZpbGUKaW5kZXggNTRkYjA5 MjFmMzI5Li5jODhkYWNmOWQ0MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9N YWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vcGFuZWwvTWFrZWZpbGUKQEAgLTMsNiArMyw3 IEBAIG9iai0kKENPTkZJR19EUk1fUEFORUxfQVJNX1ZFUlNBVElMRSkgKz0gcGFuZWwtYXJtLXZl cnNhdGlsZS5vCiBvYmotJChDT05GSUdfRFJNX1BBTkVMX0JBTkFOQVBJX1MwNzBXVjIwX0lDTjYy MTEpICs9IHBhbmVsLWJhbmFuYXBpLXMwNzB3djIwLWljbjYyMTEubwogb2JqLSQoQ09ORklHX0RS TV9QQU5FTF9MVkRTKSArPSBwYW5lbC1sdmRzLm8KIG9iai0kKENPTkZJR19EUk1fUEFORUxfU0lN UExFKSArPSBwYW5lbC1zaW1wbGUubworb2JqLSQoQ09ORklHX0RSTV9QQU5FTF9GRUlZQU5HX0ZZ MDcwMjRESTI2QTMwRCkgKz0gcGFuZWwtZmVpeWFuZy1meTA3MDI0ZGkyNmEzMGQubwogb2JqLSQo Q09ORklHX0RSTV9QQU5FTF9JTElURUtfSUw5MzIyKSArPSBwYW5lbC1pbGl0ZWstaWxpOTMyMi5v CiBvYmotJChDT05GSUdfRFJNX1BBTkVMX0lMSVRFS19JTEk5ODgxQykgKz0gcGFuZWwtaWxpdGVr LWlsaTk4ODFjLm8KIG9iai0kKENPTkZJR19EUk1fUEFORUxfSU5OT0xVWF9QMDc5WkNBKSArPSBw YW5lbC1pbm5vbHV4LXAwNzl6Y2EubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3BhbmVs L3BhbmVsLWZlaXlhbmctZnkwNzAyNGRpMjZhMzBkLmMgYi9kcml2ZXJzL2dwdS9kcm0vcGFuZWwv cGFuZWwtZmVpeWFuZy1meTA3MDI0ZGkyNmEzMGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwMDAuLmY2NTU2NDdhZWFkZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMv Z3B1L2RybS9wYW5lbC9wYW5lbC1mZWl5YW5nLWZ5MDcwMjRkaTI2YTMwZC5jCkBAIC0wLDAgKzEs Mjg2IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCsKKy8qCisgKiBDb3B5 cmlnaHQgKEMpIDIwMTggQW1hcnVsYSBTb2x1dGlvbnMKKyAqIEF1dGhvcjogSmFnYW4gVGVraSA8 amFnYW5AYW1hcnVsYXNvbHV0aW9ucy5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JhY2ts aWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxl Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9ncGlv L2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisKKyNp bmNsdWRlIDxkcm0vZHJtUC5oPgorI2luY2x1ZGUgPGRybS9kcm1fbWlwaV9kc2kuaD4KKyNpbmNs dWRlIDxkcm0vZHJtX3BhbmVsLmg+CisKKyNkZWZpbmUgRkVJWUFOR19JTklUX0NNRF9MRU4JMgor CitzdHJ1Y3QgZmVpeWFuZyB7CisJc3RydWN0IGRybV9wYW5lbAlwYW5lbDsKKwlzdHJ1Y3QgbWlw aV9kc2lfZGV2aWNlCSpkc2k7CisKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZQkqYmFja2xpZ2h0 OworCXN0cnVjdCByZWd1bGF0b3IJKmR2ZGQ7CisJc3RydWN0IHJlZ3VsYXRvcgkqYXZkZDsKKwlz dHJ1Y3QgZ3Bpb19kZXNjCSpyZXNldDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZlaXlh bmcgKnBhbmVsX3RvX2ZlaXlhbmcoc3RydWN0IGRybV9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJu IGNvbnRhaW5lcl9vZihwYW5lbCwgc3RydWN0IGZlaXlhbmcsIHBhbmVsKTsKK30KKworc3RydWN0 IGZlaXlhbmdfaW5pdF9jbWQgeworCXU4IGRhdGFbRkVJWUFOR19JTklUX0NNRF9MRU5dOworfTsK Kworc3RhdGljIGNvbnN0IHN0cnVjdCBmZWl5YW5nX2luaXRfY21kIGZlaXlhbmdfaW5pdF9jbWRz W10gPSB7CisJeyAuZGF0YSA9IHsgMHg4MCwgMHg1OCB9IH0sCisJeyAuZGF0YSA9IHsgMHg4MSwg MHg0NyB9IH0sCisJeyAuZGF0YSA9IHsgMHg4MiwgMHhENCB9IH0sCisJeyAuZGF0YSA9IHsgMHg4 MywgMHg4OCB9IH0sCisJeyAuZGF0YSA9IHsgMHg4NCwgMHhBOSB9IH0sCisJeyAuZGF0YSA9IHsg MHg4NSwgMHhDMyB9IH0sCisJeyAuZGF0YSA9IHsgMHg4NiwgMHg4MiB9IH0sCit9OworCitzdGF0 aWMgaW50IGZlaXlhbmdfcHJlcGFyZShzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCkKK3sKKwlzdHJ1 Y3QgZmVpeWFuZyAqY3R4ID0gcGFuZWxfdG9fZmVpeWFuZyhwYW5lbCk7CisJc3RydWN0IG1pcGlf ZHNpX2RldmljZSAqZHNpID0gY3R4LT5kc2k7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldDsK KworCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoY3R4LT5kdmRkKTsKKwlpZiAocmV0KQorCQlyZXR1 cm4gcmV0OworCisJLyogVDEgKGR2ZGQgc3RhcnQgKyBkdmRkIHJpc2UpIDAgPCBUMSA8PSAxMG1z ICovCisJbXNsZWVwKDEwKTsKKworCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoY3R4LT5hdmRkKTsK KwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogVDMgKGR2ZGQgcmlzZSArIGF2ZGQgc3Rh cnQgKyBhdmRkIHJpc2UpIFQzID49IDIwbXMgKi8KKwltc2xlZXAoMjApOworCisJZ3Bpb2Rfc2V0 X3ZhbHVlKGN0eC0+cmVzZXQsIDEpOworCW1zbGVlcCg1MCk7CisKKwlncGlvZF9zZXRfdmFsdWUo Y3R4LT5yZXNldCwgMCk7CisJLyogVDUgKyBUNiAoYXZkZCByaXNlICsgdmlkZW8gJiBsb2dpYyBz aWduYWwgcmlzZSkKKwkgKiBUNSA+PSAxMG1zLCAwIDwgVDYgPD0gMTBtcworCSAqLworCW1zbGVl cCgyMCk7CisKKwlncGlvZF9zZXRfdmFsdWUoY3R4LT5yZXNldCwgMSk7CisKKwkvKiBUMTIgKHZp ZGVvICYgbG9naWMgc2lnbmFsIHJpc2UgKyBiYWNrbGlnaHQgcmlzZSkgVDEyID49IDIwMG1zICov CisJbXNsZWVwKDIwMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmZWl5YW5nX2lu aXRfY21kcyk7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgZmVpeWFuZ19pbml0X2NtZCAqY21kID0K KwkJCQkJCSZmZWl5YW5nX2luaXRfY21kc1tpXTsKKworCQlyZXQgPSBtaXBpX2RzaV9kY3Nfd3Jp dGVfYnVmZmVyKGRzaSwgY21kLT5kYXRhLAorCQkJCQkJRkVJWUFOR19JTklUX0NNRF9MRU4pOwor CQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBpbnQgZmVpeWFuZ19lbmFibGUoc3RydWN0IGRybV9wYW5lbCAqcGFuZWwpCit7CisJc3Ry dWN0IGZlaXlhbmcgKmN0eCA9IHBhbmVsX3RvX2ZlaXlhbmcocGFuZWwpOworCisJLyogVDEyICh2 aWRlbyAmIGxvZ2ljIHNpZ25hbCByaXNlICsgYmFja2xpZ2h0IHJpc2UpIFQxMiA+PSAyMDBtcyAq LworCW1zbGVlcCgyMDApOworCisJbWlwaV9kc2lfZGNzX3NldF9kaXNwbGF5X29uKGN0eC0+ZHNp KTsKKwliYWNrbGlnaHRfZW5hYmxlKGN0eC0+YmFja2xpZ2h0KTsKKworCXJldHVybiAwOworfQor CitzdGF0aWMgaW50IGZlaXlhbmdfZGlzYWJsZShzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCkKK3sK KwlzdHJ1Y3QgZmVpeWFuZyAqY3R4ID0gcGFuZWxfdG9fZmVpeWFuZyhwYW5lbCk7CisKKwliYWNr bGlnaHRfZGlzYWJsZShjdHgtPmJhY2tsaWdodCk7CisJcmV0dXJuIG1pcGlfZHNpX2Rjc19zZXRf ZGlzcGxheV9vZmYoY3R4LT5kc2kpOworfQorCitzdGF0aWMgaW50IGZlaXlhbmdfdW5wcmVwYXJl KHN0cnVjdCBkcm1fcGFuZWwgKnBhbmVsKQoreworCXN0cnVjdCBmZWl5YW5nICpjdHggPSBwYW5l bF90b19mZWl5YW5nKHBhbmVsKTsKKwlpbnQgcmV0OworCisJcmV0ID0gbWlwaV9kc2lfZGNzX3Nl dF9kaXNwbGF5X29mZihjdHgtPmRzaSk7CisJaWYgKHJldCA8IDApCisJCURSTV9ERVZfRVJST1Io cGFuZWwtPmRldiwgImZhaWxlZCB0byBzZXQgZGlzcGxheSBvZmY6ICVkXG4iLAorCQkJICAgICAg cmV0KTsKKworCXJldCA9IG1pcGlfZHNpX2Rjc19lbnRlcl9zbGVlcF9tb2RlKGN0eC0+ZHNpKTsK KwlpZiAocmV0IDwgMCkKKwkJRFJNX0RFVl9FUlJPUihwYW5lbC0+ZGV2LCAiZmFpbGVkIHRvIGVu dGVyIHNsZWVwIG1vZGU6ICVkXG4iLAorCQkJICAgICAgcmV0KTsKKworCS8qIFQxMyAoYmFja2xp Z2h0IGZhbGwgKyB2aWRlbyAmIGxvZ2ljIHNpZ25hbCBmYWxsKSBUMTMgPj0gMjAwbXMgKi8KKwlt c2xlZXAoMjAwKTsKKworCWdwaW9kX3NldF92YWx1ZShjdHgtPnJlc2V0LCAwKTsKKworCXJlZ3Vs YXRvcl9kaXNhYmxlKGN0eC0+YXZkZCk7CisKKwkvKiBUMTEgKGR2ZGQgcmlzZSB0byBmYWxsKSAw IDwgVDExIDw9IDEwbXMgICovCisJbXNsZWVwKDEwKTsKKworCXJlZ3VsYXRvcl9kaXNhYmxlKGN0 eC0+ZHZkZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZGlz cGxheV9tb2RlIGZlaXlhbmdfZGVmYXVsdF9tb2RlID0geworCS5jbG9jayA9IDU1MDAwLAorCisJ LmhkaXNwbGF5ID0gMTAyNCwKKwkuaHN5bmNfc3RhcnQgPSAxMDI0ICsgMzEwLAorCS5oc3luY19l bmQgPSAxMDI0ICsgMzEwICsgMjAsCisJLmh0b3RhbCA9IDEwMjQgKyAzMTAgKyAyMCArIDkwLAor CisJLnZkaXNwbGF5ID0gNjAwLAorCS52c3luY19zdGFydCA9IDYwMCArIDEyLAorCS52c3luY19l bmQgPSA2MDAgKyAxMiArIDIsCisJLnZ0b3RhbCA9IDYwMCArIDEyICsgMiArIDIxLAorCisJLnR5 cGUgPSBEUk1fTU9ERV9UWVBFX0RSSVZFUiB8IERSTV9NT0RFX1RZUEVfUFJFRkVSUkVELAorfTsK Kworc3RhdGljIGludCBmZWl5YW5nX2dldF9tb2RlcyhzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCkK K3sKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gcGFuZWwtPmNvbm5lY3RvcjsK KwlzdHJ1Y3QgZmVpeWFuZyAqY3R4ID0gcGFuZWxfdG9fZmVpeWFuZyhwYW5lbCk7CisJc3RydWN0 IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7CisKKwltb2RlID0gZHJtX21vZGVfZHVwbGljYXRlKHBh bmVsLT5kcm0sICZmZWl5YW5nX2RlZmF1bHRfbW9kZSk7CisJaWYgKCFtb2RlKSB7CisJCURSTV9E RVZfRVJST1IoJmN0eC0+ZHNpLT5kZXYsICJmYWlsZWQgdG8gYWRkIG1vZGUgJXV4JXV4QCV1XG4i LAorCQkJICAgICAgZmVpeWFuZ19kZWZhdWx0X21vZGUuaGRpc3BsYXksCisJCQkgICAgICBmZWl5 YW5nX2RlZmF1bHRfbW9kZS52ZGlzcGxheSwKKwkJCSAgICAgIGZlaXlhbmdfZGVmYXVsdF9tb2Rl LnZyZWZyZXNoKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZHJtX21vZGVfc2V0X25hbWUo bW9kZSk7CisKKwlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbW9kZSk7CisKKwlyZXR1 cm4gMTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fcGFuZWxfZnVuY3MgZmVpeWFuZ19m dW5jcyA9IHsKKwkuZGlzYWJsZSA9IGZlaXlhbmdfZGlzYWJsZSwKKwkudW5wcmVwYXJlID0gZmVp eWFuZ191bnByZXBhcmUsCisJLnByZXBhcmUgPSBmZWl5YW5nX3ByZXBhcmUsCisJLmVuYWJsZSA9 IGZlaXlhbmdfZW5hYmxlLAorCS5nZXRfbW9kZXMgPSBmZWl5YW5nX2dldF9tb2RlcywKK307CisK K3N0YXRpYyBpbnQgZmVpeWFuZ19kc2lfcHJvYmUoc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZHNp KQoreworCXN0cnVjdCBmZWl5YW5nICpjdHg7CisJaW50IHJldDsKKworCWN0eCA9IGRldm1fa3ph bGxvYygmZHNpLT5kZXYsIHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHgpCisJ CXJldHVybiAtRU5PTUVNOworCW1pcGlfZHNpX3NldF9kcnZkYXRhKGRzaSwgY3R4KTsKKwljdHgt PmRzaSA9IGRzaTsKKworCWRybV9wYW5lbF9pbml0KCZjdHgtPnBhbmVsKTsKKwljdHgtPnBhbmVs LmRldiA9ICZkc2ktPmRldjsKKwljdHgtPnBhbmVsLmZ1bmNzID0gJmZlaXlhbmdfZnVuY3M7CisK KwljdHgtPmR2ZGQgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoJmRzaS0+ZGV2LCAiZHZkZCIpOworCWlm IChJU19FUlIoY3R4LT5kdmRkKSkgeworCQlEUk1fREVWX0VSUk9SKCZkc2ktPmRldiwgIkNvdWxk bid0IGdldCBkdmRkIHJlZ3VsYXRvclxuIik7CisJCXJldHVybiBQVFJfRVJSKGN0eC0+ZHZkZCk7 CisJfQorCisJY3R4LT5hdmRkID0gZGV2bV9yZWd1bGF0b3JfZ2V0KCZkc2ktPmRldiwgImF2ZGQi KTsKKwlpZiAoSVNfRVJSKGN0eC0+YXZkZCkpIHsKKwkJRFJNX0RFVl9FUlJPUigmZHNpLT5kZXYs ICJDb3VsZG4ndCBnZXQgYXZkZCByZWd1bGF0b3JcbiIpOworCQlyZXR1cm4gUFRSX0VSUihjdHgt PmF2ZGQpOworCX0KKworCWN0eC0+cmVzZXQgPSBkZXZtX2dwaW9kX2dldCgmZHNpLT5kZXYsICJy ZXNldCIsIEdQSU9EX09VVF9MT1cpOworCWlmIChJU19FUlIoY3R4LT5yZXNldCkpIHsKKwkJRFJN X0RFVl9FUlJPUigmZHNpLT5kZXYsICJDb3VsZG4ndCBnZXQgb3VyIHJlc2V0IEdQSU9cbiIpOwor CQlyZXR1cm4gUFRSX0VSUihjdHgtPnJlc2V0KTsKKwl9CisKKwljdHgtPmJhY2tsaWdodCA9IGRl dm1fb2ZfZmluZF9iYWNrbGlnaHQoJmRzaS0+ZGV2KTsKKwlpZiAoSVNfRVJSKGN0eC0+YmFja2xp Z2h0KSkKKwkJcmV0dXJuIFBUUl9FUlIoY3R4LT5iYWNrbGlnaHQpOworCisJcmV0ID0gZHJtX3Bh bmVsX2FkZCgmY3R4LT5wYW5lbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gcHV0X2JhY2tsaWdo dDsKKworCWRzaS0+bW9kZV9mbGFncyA9IE1JUElfRFNJX01PREVfVklERU9fQlVSU1Q7CisJZHNp LT5mb3JtYXQgPSBNSVBJX0RTSV9GTVRfUkdCODg4OworCWRzaS0+bGFuZXMgPSA0OworCisJcmV0 ID0gbWlwaV9kc2lfYXR0YWNoKGRzaSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gcGFuZWxfcmVt b3ZlOworCisJcmV0dXJuIHJldDsKKworcGFuZWxfcmVtb3ZlOgorCWRybV9wYW5lbF9yZW1vdmUo JmN0eC0+cGFuZWwpOworcHV0X2JhY2tsaWdodDoKKwlpZiAoY3R4LT5iYWNrbGlnaHQpCisJCXB1 dF9kZXZpY2UoJmN0eC0+YmFja2xpZ2h0LT5kZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3Rh dGljIGludCBmZWl5YW5nX2RzaV9yZW1vdmUoc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZHNpKQor eworCXN0cnVjdCBmZWl5YW5nICpjdHggPSBtaXBpX2RzaV9nZXRfZHJ2ZGF0YShkc2kpOworCisJ bWlwaV9kc2lfZGV0YWNoKGRzaSk7CisJZHJtX3BhbmVsX3JlbW92ZSgmY3R4LT5wYW5lbCk7CisK KwlpZiAoY3R4LT5iYWNrbGlnaHQpCisJCXB1dF9kZXZpY2UoJmN0eC0+YmFja2xpZ2h0LT5kZXYp OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZl aXlhbmdfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZlaXlhbmcsZnkwNzAyNGRp MjZhMzBkIiwgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBmZWl5YW5nX29m X21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBtaXBpX2RzaV9kcml2ZXIgZmVpeWFuZ19kcml2ZXIg PSB7CisJLnByb2JlID0gZmVpeWFuZ19kc2lfcHJvYmUsCisJLnJlbW92ZSA9IGZlaXlhbmdfZHNp X3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJmZWl5YW5nLWZ5MDcwMjRkaTI2YTMw ZCIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGZlaXlhbmdfb2ZfbWF0Y2gsCisJfSwKK307Cittb2R1 bGVfbWlwaV9kc2lfZHJpdmVyKGZlaXlhbmdfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSmFn YW4gVGVraSA8amFnYW5AYW1hcnVsYXNvbHV0aW9ucy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJ T04oIkZlaXlhbmcgRlkwNzAyNERJMjZBMzAtRCBNSVBJLURTSSBMQ0QgcGFuZWwiKTsKK01PRFVM RV9MSUNFTlNFKCJHUEwiKTsKLS0gCjIuMTguMC4zMjEuZ2ZmYzZmYTBlMwoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlz dApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0 b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg== 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=-14.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_PASS,USER_AGENT_GIT 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 C51AAC282C3 for ; Thu, 24 Jan 2019 18:43:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7A148218A2 for ; Thu, 24 Jan 2019 18:43:49 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=amarulasolutions.com header.i=@amarulasolutions.com header.b="F/j8l7IA" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728390AbfAXSnr (ORCPT ); Thu, 24 Jan 2019 13:43:47 -0500 Received: from mail-pf1-f195.google.com ([209.85.210.195]:38905 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725936AbfAXSnr (ORCPT ); Thu, 24 Jan 2019 13:43:47 -0500 Received: by mail-pf1-f195.google.com with SMTP id q1so3425205pfi.5 for ; Thu, 24 Jan 2019 10:43:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=YhPqf7vewe+57R+yWfb90ZEm/oyhfm1AaXJNRhIKn0E=; b=F/j8l7IAQXFH7N9DPiJ393q6gUrnV7tBkd+jtDBKeIkW9h3maymdTcni1tenstHvtx WfcapHac8K0kIN7Fzq8TLUC5fD+ZvfQvjqMrs0zUjqXuOitwj7Sd0oQ5d4qGAMGjdBcY 23ZXFv3V5KXmpRfFaxpTXfl29W183Il4xwUFA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=YhPqf7vewe+57R+yWfb90ZEm/oyhfm1AaXJNRhIKn0E=; b=UghSipnRZucs45P5B1mfFdI1uoDWV9eRN+rU8knl0UdodDLo51Bx5ze92K7zFstT/t Beyp0IV2i/E6wefP4ZrLuEyzL+wnD3LnyKGeCCeruhDFGtp+Yrpqjxo65tOrDX3s5PBu 3c7JQFX60hih0EykVjBTwk2BpJfd0SnUk5Q37buIq71oPVXHdxR0xLHthHX+8NHLZmNS o9RX6Kc+6RgQ/ZTJCWYmi6WtS+Ave4bocvfEzWWWN+0zo/qDqbZkrw1xKJj6hTFH//hP +vFY3p8crOmVt2/LRJX2gKUbNUVZXWbWPoWyu+JKmufOlrO+QP3skUsdnb1JAmZUD5Ac tmkA== X-Gm-Message-State: AJcUukfM1iXJxneFRmLnF1xD11Cj8TWBieJR2e5Br/TTB4DWZfScT2hc iBCWUI95AZ+kO5IrqCVXHDGdMw== X-Google-Smtp-Source: ALg8bN6kSXBfglPA6QBNgk+8hcVfJdLQ76qrzAXChwcOuLyUf9EfClQrECTq3o2sFpDI75lduL/umw== X-Received: by 2002:a63:5f50:: with SMTP id t77mr6999192pgb.76.1548355426096; Thu, 24 Jan 2019 10:43:46 -0800 (PST) Received: from localhost.localdomain ([115.97.179.75]) by smtp.gmail.com with ESMTPSA id p2sm28404907pfb.28.2019.01.24.10.43.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 24 Jan 2019 10:43:45 -0800 (PST) From: Jagan Teki To: Thierry Reding , David Airlie , Daniel Vetter , Sam Ravnborg Cc: Michael Trimarchi , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-amarula@amarulasolutions.com, Jagan Teki Subject: [PATCH v4 2/2] drm/panel: Add Feiyang FY07024DI26A30-D MIPI-DSI LCD panel Date: Fri, 25 Jan 2019 00:13:13 +0530 Message-Id: <20190124184313.30193-2-jagan@amarulasolutions.com> X-Mailer: git-send-email 2.18.0.321.gffc6fa0e3 In-Reply-To: <20190124184313.30193-1-jagan@amarulasolutions.com> References: <20190124184313.30193-1-jagan@amarulasolutions.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Feiyang FY07024DI26A30-D is 1024x600, 4-lane MIPI-DSI LCD panel. Add panel driver for it. Signed-off-by: Jagan Teki --- Changes for v5: - rebase on master - adjust the hporch values to satisfy the refresh Changes for v4: - use simple structure for command init - update proper comments on power, reset delay sequnce - fix to use set_display_off in disable function - move mode type to structure - drop refres rate value, let drm compute Changes for v2: - new patch, derived from another dsi series MAINTAINERS | 6 + drivers/gpu/drm/panel/Kconfig | 9 + drivers/gpu/drm/panel/Makefile | 1 + .../drm/panel/panel-feiyang-fy07024di26a30d.c | 286 ++++++++++++++++++ 4 files changed, 302 insertions(+) create mode 100644 drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c diff --git a/MAINTAINERS b/MAINTAINERS index e3f785bad68b..5c8591eb5840 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -4831,6 +4831,12 @@ T: git git://anongit.freedesktop.org/drm/drm-misc S: Maintained F: drivers/gpu/drm/tve200/ +DRM DRIVER FOR FEIYANG FY07024DI26A30-D MIPI-DSI LCD PANELS +M: Jagan Teki +S: Maintained +F: drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c +F: Documentation/devicetree/bindings/display/panel/feiyang,fy07024di26a30d.txt + DRM DRIVER FOR ILITEK ILI9225 PANELS M: David Lechner S: Maintained diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig index 151ddf720b83..5304db7b7b55 100644 --- a/drivers/gpu/drm/panel/Kconfig +++ b/drivers/gpu/drm/panel/Kconfig @@ -47,6 +47,15 @@ config DRM_PANEL_SIMPLE that it can be automatically turned off when the panel goes into a low power state. +config DRM_PANEL_FEIYANG_FY07024DI26A30D + tristate "Feiyang FY07024DI26A30-D MIPI-DSI LCD panel" + depends on OF + depends on DRM_MIPI_DSI + depends on BACKLIGHT_CLASS_DEVICE + help + Say Y if you want to enable support for panels based on the + Feiyang FY07024DI26A30-D MIPI-DSI interface. + config DRM_PANEL_ILITEK_IL9322 tristate "Ilitek ILI9322 320x240 QVGA panels" depends on OF && SPI diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile index 54db0921f329..c88dacf9d439 100644 --- a/drivers/gpu/drm/panel/Makefile +++ b/drivers/gpu/drm/panel/Makefile @@ -3,6 +3,7 @@ obj-$(CONFIG_DRM_PANEL_ARM_VERSATILE) += panel-arm-versatile.o obj-$(CONFIG_DRM_PANEL_BANANAPI_S070WV20_ICN6211) += panel-bananapi-s070wv20-icn6211.o obj-$(CONFIG_DRM_PANEL_LVDS) += panel-lvds.o obj-$(CONFIG_DRM_PANEL_SIMPLE) += panel-simple.o +obj-$(CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D) += panel-feiyang-fy07024di26a30d.o obj-$(CONFIG_DRM_PANEL_ILITEK_IL9322) += panel-ilitek-ili9322.o obj-$(CONFIG_DRM_PANEL_ILITEK_ILI9881C) += panel-ilitek-ili9881c.o obj-$(CONFIG_DRM_PANEL_INNOLUX_P079ZCA) += panel-innolux-p079zca.o diff --git a/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c new file mode 100644 index 000000000000..f655647aeade --- /dev/null +++ b/drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c @@ -0,0 +1,286 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2018 Amarula Solutions + * Author: Jagan Teki + */ + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#define FEIYANG_INIT_CMD_LEN 2 + +struct feiyang { + struct drm_panel panel; + struct mipi_dsi_device *dsi; + + struct backlight_device *backlight; + struct regulator *dvdd; + struct regulator *avdd; + struct gpio_desc *reset; +}; + +static inline struct feiyang *panel_to_feiyang(struct drm_panel *panel) +{ + return container_of(panel, struct feiyang, panel); +} + +struct feiyang_init_cmd { + u8 data[FEIYANG_INIT_CMD_LEN]; +}; + +static const struct feiyang_init_cmd feiyang_init_cmds[] = { + { .data = { 0x80, 0x58 } }, + { .data = { 0x81, 0x47 } }, + { .data = { 0x82, 0xD4 } }, + { .data = { 0x83, 0x88 } }, + { .data = { 0x84, 0xA9 } }, + { .data = { 0x85, 0xC3 } }, + { .data = { 0x86, 0x82 } }, +}; + +static int feiyang_prepare(struct drm_panel *panel) +{ + struct feiyang *ctx = panel_to_feiyang(panel); + struct mipi_dsi_device *dsi = ctx->dsi; + unsigned int i; + int ret; + + ret = regulator_enable(ctx->dvdd); + if (ret) + return ret; + + /* T1 (dvdd start + dvdd rise) 0 < T1 <= 10ms */ + msleep(10); + + ret = regulator_enable(ctx->avdd); + if (ret) + return ret; + + /* T3 (dvdd rise + avdd start + avdd rise) T3 >= 20ms */ + msleep(20); + + gpiod_set_value(ctx->reset, 1); + msleep(50); + + gpiod_set_value(ctx->reset, 0); + /* T5 + T6 (avdd rise + video & logic signal rise) + * T5 >= 10ms, 0 < T6 <= 10ms + */ + msleep(20); + + gpiod_set_value(ctx->reset, 1); + + /* T12 (video & logic signal rise + backlight rise) T12 >= 200ms */ + msleep(200); + + for (i = 0; i < ARRAY_SIZE(feiyang_init_cmds); i++) { + const struct feiyang_init_cmd *cmd = + &feiyang_init_cmds[i]; + + ret = mipi_dsi_dcs_write_buffer(dsi, cmd->data, + FEIYANG_INIT_CMD_LEN); + if (ret < 0) + return ret; + } + + return 0; +} + +static int feiyang_enable(struct drm_panel *panel) +{ + struct feiyang *ctx = panel_to_feiyang(panel); + + /* T12 (video & logic signal rise + backlight rise) T12 >= 200ms */ + msleep(200); + + mipi_dsi_dcs_set_display_on(ctx->dsi); + backlight_enable(ctx->backlight); + + return 0; +} + +static int feiyang_disable(struct drm_panel *panel) +{ + struct feiyang *ctx = panel_to_feiyang(panel); + + backlight_disable(ctx->backlight); + return mipi_dsi_dcs_set_display_off(ctx->dsi); +} + +static int feiyang_unprepare(struct drm_panel *panel) +{ + struct feiyang *ctx = panel_to_feiyang(panel); + int ret; + + ret = mipi_dsi_dcs_set_display_off(ctx->dsi); + if (ret < 0) + DRM_DEV_ERROR(panel->dev, "failed to set display off: %d\n", + ret); + + ret = mipi_dsi_dcs_enter_sleep_mode(ctx->dsi); + if (ret < 0) + DRM_DEV_ERROR(panel->dev, "failed to enter sleep mode: %d\n", + ret); + + /* T13 (backlight fall + video & logic signal fall) T13 >= 200ms */ + msleep(200); + + gpiod_set_value(ctx->reset, 0); + + regulator_disable(ctx->avdd); + + /* T11 (dvdd rise to fall) 0 < T11 <= 10ms */ + msleep(10); + + regulator_disable(ctx->dvdd); + + return 0; +} + +static const struct drm_display_mode feiyang_default_mode = { + .clock = 55000, + + .hdisplay = 1024, + .hsync_start = 1024 + 310, + .hsync_end = 1024 + 310 + 20, + .htotal = 1024 + 310 + 20 + 90, + + .vdisplay = 600, + .vsync_start = 600 + 12, + .vsync_end = 600 + 12 + 2, + .vtotal = 600 + 12 + 2 + 21, + + .type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED, +}; + +static int feiyang_get_modes(struct drm_panel *panel) +{ + struct drm_connector *connector = panel->connector; + struct feiyang *ctx = panel_to_feiyang(panel); + struct drm_display_mode *mode; + + mode = drm_mode_duplicate(panel->drm, &feiyang_default_mode); + if (!mode) { + DRM_DEV_ERROR(&ctx->dsi->dev, "failed to add mode %ux%ux@%u\n", + feiyang_default_mode.hdisplay, + feiyang_default_mode.vdisplay, + feiyang_default_mode.vrefresh); + return -ENOMEM; + } + + drm_mode_set_name(mode); + + drm_mode_probed_add(connector, mode); + + return 1; +} + +static const struct drm_panel_funcs feiyang_funcs = { + .disable = feiyang_disable, + .unprepare = feiyang_unprepare, + .prepare = feiyang_prepare, + .enable = feiyang_enable, + .get_modes = feiyang_get_modes, +}; + +static int feiyang_dsi_probe(struct mipi_dsi_device *dsi) +{ + struct feiyang *ctx; + int ret; + + ctx = devm_kzalloc(&dsi->dev, sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return -ENOMEM; + mipi_dsi_set_drvdata(dsi, ctx); + ctx->dsi = dsi; + + drm_panel_init(&ctx->panel); + ctx->panel.dev = &dsi->dev; + ctx->panel.funcs = &feiyang_funcs; + + ctx->dvdd = devm_regulator_get(&dsi->dev, "dvdd"); + if (IS_ERR(ctx->dvdd)) { + DRM_DEV_ERROR(&dsi->dev, "Couldn't get dvdd regulator\n"); + return PTR_ERR(ctx->dvdd); + } + + ctx->avdd = devm_regulator_get(&dsi->dev, "avdd"); + if (IS_ERR(ctx->avdd)) { + DRM_DEV_ERROR(&dsi->dev, "Couldn't get avdd regulator\n"); + return PTR_ERR(ctx->avdd); + } + + ctx->reset = devm_gpiod_get(&dsi->dev, "reset", GPIOD_OUT_LOW); + if (IS_ERR(ctx->reset)) { + DRM_DEV_ERROR(&dsi->dev, "Couldn't get our reset GPIO\n"); + return PTR_ERR(ctx->reset); + } + + ctx->backlight = devm_of_find_backlight(&dsi->dev); + if (IS_ERR(ctx->backlight)) + return PTR_ERR(ctx->backlight); + + ret = drm_panel_add(&ctx->panel); + if (ret < 0) + goto put_backlight; + + dsi->mode_flags = MIPI_DSI_MODE_VIDEO_BURST; + dsi->format = MIPI_DSI_FMT_RGB888; + dsi->lanes = 4; + + ret = mipi_dsi_attach(dsi); + if (ret < 0) + goto panel_remove; + + return ret; + +panel_remove: + drm_panel_remove(&ctx->panel); +put_backlight: + if (ctx->backlight) + put_device(&ctx->backlight->dev); + + return ret; +} + +static int feiyang_dsi_remove(struct mipi_dsi_device *dsi) +{ + struct feiyang *ctx = mipi_dsi_get_drvdata(dsi); + + mipi_dsi_detach(dsi); + drm_panel_remove(&ctx->panel); + + if (ctx->backlight) + put_device(&ctx->backlight->dev); + + return 0; +} + +static const struct of_device_id feiyang_of_match[] = { + { .compatible = "feiyang,fy07024di26a30d", }, + { } +}; +MODULE_DEVICE_TABLE(of, feiyang_of_match); + +static struct mipi_dsi_driver feiyang_driver = { + .probe = feiyang_dsi_probe, + .remove = feiyang_dsi_remove, + .driver = { + .name = "feiyang-fy07024di26a30d", + .of_match_table = feiyang_of_match, + }, +}; +module_mipi_dsi_driver(feiyang_driver); + +MODULE_AUTHOR("Jagan Teki "); +MODULE_DESCRIPTION("Feiyang FY07024DI26A30-D MIPI-DSI LCD panel"); +MODULE_LICENSE("GPL"); -- 2.18.0.321.gffc6fa0e3