From mboxrd@z Thu Jan 1 00:00:00 1970 From: Philipp Zabel Subject: [PATCH v4.5 3/4] drm/mediatek: Add gamma correction. Date: Thu, 11 Aug 2016 11:11:25 +0200 Message-ID: <1470906685.2493.34.camel@pengutronix.de> References: <1469672575-5847-1-git-send-email-bibby.hsieh@mediatek.com> <1469672575-5847-4-git-send-email-bibby.hsieh@mediatek.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1469672575-5847-4-git-send-email-bibby.hsieh@mediatek.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Bibby Hsieh Cc: linux-kernel@vger.kernel.org, Daniel Vetter , Cawa Cheng , dri-devel@lists.freedesktop.org, Mao Huang , linux-mediatek@lists.infradead.org, Sascha Hauer , Matthias Brugger , Yingjoe Chen , linux-arm-kernel@lists.infradead.org List-Id: linux-mediatek@lists.infradead.org RnJvbSAyZjNmNGRkYTc0N2MwNjE5NTk0ZDEzOTk2ZTY1NTk4YWI2NzVjNjBjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBCaWJieSBIc2llaCA8YmliYnkuaHNpZWhAbWVkaWF0ZWsuY29t PgpEYXRlOiBUaHUsIDI4IEp1bCAyMDE2IDEwOjIyOjU0ICswODAwClN1YmplY3Q6IFtQQVRDSF0g ZHJtL21lZGlhdGVrOiBBZGQgZ2FtbWEgY29ycmVjdGlvbi4KCkFkZCBnYW1tYSBzZXQgZnVuY3Rp b24gdG8gY29ycmVjdCBicmlnaHRuZXNzIHZhbHVlcy4KSXQgYXBwbGllcyBhcmJpdHJhcnkgbWFw cGluZyBjdXJ2ZSB0byBjb21wZW5zYXRlIHRoZQppbmNvcnJlY3QgdHJhbnNmZXIgZnVuY3Rpb24g b2YgdGhlIHBhbmVsLgoKU2lnbmVkLW9mZi1ieTogQmliYnkgSHNpZWggPGJpYmJ5LmhzaWVoQG1l ZGlhdGVrLmNvbT4KU2lnbmVkLW9mZi1ieTogUGhpbGlwcCBaYWJlbCA8cC56YWJlbEBwZW5ndXRy b25peC5kZT4KLS0tCkkgaGF2ZSBhcHBsaWVkIHRoaXMgcGF0Y2ggd2l0aCBvbmUgY2hhbmdlIGZy b20gdjQ6CiAtIFVzZSBkcm1fY3J0Y19lbmFibGVfY29sb3JfbWdtdCBpbnN0ZWFkIG9mIGRybV9j cnRjX2hlbHBlcl9lbmFibGVfY29sb3JfbWdtdAotLS0KIGRyaXZlcnMvZ3B1L2RybS9tZWRpYXRl ay9tdGtfZHJtX2NydGMuYyAgICAgfCAgNyArKysrKystCiBkcml2ZXJzL2dwdS9kcm0vbWVkaWF0 ZWsvbXRrX2RybV9jcnRjLmggICAgIHwgIDEgKwogZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210 a19kcm1fZGRwX2NvbXAuYyB8IDMxICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBkcml2 ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9kZHBfY29tcC5oIHwgMTAgKysrKysrKysrKwog NCBmaWxlcyBjaGFuZ2VkLCA0OCBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCgpkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fY3J0Yy5jIGIvZHJpdmVycy9n cHUvZHJtL21lZGlhdGVrL210a19kcm1fY3J0Yy5jCmluZGV4IDI0YWEzYmEuLmUzYWMyODAgMTAw NjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2NydGMuYworKysgYi9k cml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9jcnRjLmMKQEAgLTQwOSw2ICs0MDksOSBA QCBzdGF0aWMgdm9pZCBtdGtfZHJtX2NydGNfYXRvbWljX2ZsdXNoKHN0cnVjdCBkcm1fY3J0YyAq Y3J0YywKIAl9CiAJaWYgKHBlbmRpbmdfcGxhbmVzKQogCQltdGtfY3J0Yy0+cGVuZGluZ19wbGFu ZXMgPSB0cnVlOworCWlmIChjcnRjLT5zdGF0ZS0+Y29sb3JfbWdtdF9jaGFuZ2VkKQorCQlmb3Ig KGkgPSAwOyBpIDwgbXRrX2NydGMtPmRkcF9jb21wX25yOyBpKyspCisJCQltdGtfZGRwX2dhbW1h X3NldChtdGtfY3J0Yy0+ZGRwX2NvbXBbaV0sIGNydGMtPnN0YXRlKTsKIH0KIAogc3RhdGljIGNv bnN0IHN0cnVjdCBkcm1fY3J0Y19mdW5jcyBtdGtfY3J0Y19mdW5jcyA9IHsKQEAgLTQxOCw2ICs0 MjEsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jcnRjX2Z1bmNzIG10a19jcnRjX2Z1bmNz ID0gewogCS5yZXNldAkJCT0gbXRrX2RybV9jcnRjX3Jlc2V0LAogCS5hdG9taWNfZHVwbGljYXRl X3N0YXRlCT0gbXRrX2RybV9jcnRjX2R1cGxpY2F0ZV9zdGF0ZSwKIAkuYXRvbWljX2Rlc3Ryb3lf c3RhdGUJPSBtdGtfZHJtX2NydGNfZGVzdHJveV9zdGF0ZSwKKwkuZ2FtbWFfc2V0CQk9IGRybV9h dG9taWNfaGVscGVyX2xlZ2FjeV9nYW1tYV9zZXQsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0 IGRybV9jcnRjX2hlbHBlcl9mdW5jcyBtdGtfY3J0Y19oZWxwZXJfZnVuY3MgPSB7CkBAIC01Njgs NyArNTcyLDggQEAgaW50IG10a19kcm1fY3J0Y19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRy bV9kZXYsCiAJCQkJJm10a19jcnRjLT5wbGFuZXNbMV0uYmFzZSwgcGlwZSk7CiAJaWYgKHJldCA8 IDApCiAJCWdvdG8gdW5wcmVwYXJlOwotCisJZHJtX21vZGVfY3J0Y19zZXRfZ2FtbWFfc2l6ZSgm bXRrX2NydGMtPmJhc2UsIE1US19MVVRfU0laRSk7CisJZHJtX2NydGNfZW5hYmxlX2NvbG9yX21n bXQoJm10a19jcnRjLT5iYXNlLCAwLCBmYWxzZSwgTVRLX0xVVF9TSVpFKTsKIAlwcml2LT5jcnRj W3BpcGVdID0gJm10a19jcnRjLT5iYXNlOwogCXByaXYtPm51bV9waXBlcysrOwogCmRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9jcnRjLmggYi9kcml2ZXJzL2dw dS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9jcnRjLmgKaW5kZXggODFlNTU2Ni4uZDMzMjU2NCAxMDA2 NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fY3J0Yy5oCisrKyBiL2Ry aXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2NydGMuaApAQCAtMTksNiArMTksNyBAQAog I2luY2x1ZGUgIm10a19kcm1fcGxhbmUuaCIKIAogI2RlZmluZSBPVkxfTEFZRVJfTlIJNAorI2Rl ZmluZSBNVEtfTFVUX1NJWkUJNTEyCiAKIGludCBtdGtfZHJtX2NydGNfZW5hYmxlX3ZibGFuayhz dHJ1Y3QgZHJtX2RldmljZSAqZHJtLCB1bnNpZ25lZCBpbnQgcGlwZSk7CiB2b2lkIG10a19kcm1f Y3J0Y19kaXNhYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLCB1bnNpZ25lZCBpbnQg cGlwZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9kZHBf Y29tcC5jIGIvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZGRwX2NvbXAuYwppbmRl eCBiYTg5NWM4Li40MmNkNTg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsv bXRrX2RybV9kZHBfY29tcC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJt X2RkcF9jb21wLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJtdGtfZHJtX2Rydi5oIgog I2luY2x1ZGUgIm10a19kcm1fcGxhbmUuaCIKICNpbmNsdWRlICJtdGtfZHJtX2RkcF9jb21wLmgi CisjaW5jbHVkZSAibXRrX2RybV9jcnRjLmgiCiAKICNkZWZpbmUgRElTUF9PRF9FTgkJCQkweDAw MDAKICNkZWZpbmUgRElTUF9PRF9JTlRFTgkJCQkweDAwMDgKQEAgLTQyLDcgKzQzLDExIEBACiAj ZGVmaW5lIERJU1BfQUFMX1NJWkUJCQkJMHgwMDMwCiAKICNkZWZpbmUgRElTUF9HQU1NQV9FTgkJ CQkweDAwMDAKKyNkZWZpbmUgRElTUF9HQU1NQV9DRkcJCQkJMHgwMDIwCiAjZGVmaW5lIERJU1Bf R0FNTUFfU0laRQkJCQkweDAwMzAKKyNkZWZpbmUgRElTUF9HQU1NQV9MVVQJCQkJMHgwNzAwCisK KyNkZWZpbmUgTFVUXzEwQklUX01BU0sJCQkJMHgwM2ZmCiAKICNkZWZpbmUJT0RfUkVMQVlfTU9E RQkJQklUKDApCiAKQEAgLTU0LDYgKzU5LDcgQEAKICNkZWZpbmUgQUFMX0VOCQkJQklUKDApCiAK ICNkZWZpbmUgR0FNTUFfRU4JCUJJVCgwKQorI2RlZmluZSBHQU1NQV9MVVRfRU4JCUJJVCgxKQog CiBzdGF0aWMgdm9pZCBtdGtfY29sb3JfY29uZmlnKHN0cnVjdCBtdGtfZGRwX2NvbXAgKmNvbXAs IHVuc2lnbmVkIGludCB3LAogCQkJICAgICB1bnNpZ25lZCBpbnQgaCwgdW5zaWduZWQgaW50IHZy ZWZyZXNoKQpAQCAtMTE4LDEzICsxMjQsMzggQEAgc3RhdGljIHZvaWQgbXRrX2dhbW1hX3N0b3Ao c3RydWN0IG10a19kZHBfY29tcCAqY29tcCkKIAl3cml0ZWxfcmVsYXhlZCgweDAsIGNvbXAtPnJl Z3MgICsgRElTUF9HQU1NQV9FTik7CiB9CiAKK3N0YXRpYyB2b2lkIG10a19nYW1tYV9zZXQoc3Ry dWN0IG10a19kZHBfY29tcCAqY29tcCwKKwkJCSAgc3RydWN0IGRybV9jcnRjX3N0YXRlICpzdGF0 ZSkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgcmVnOworCXN0cnVjdCBkcm1fY29sb3JfbHV0ICpsdXQ7 CisJdm9pZCBfX2lvbWVtICpsdXRfYmFzZTsKKwl1MzIgd29yZDsKKworCWlmIChzdGF0ZS0+Z2Ft bWFfbHV0KSB7CisJCXJlZyA9IHJlYWRsKGNvbXAtPnJlZ3MgKyBESVNQX0dBTU1BX0NGRyk7CisJ CXJlZyA9IHJlZyB8IEdBTU1BX0xVVF9FTjsKKwkJd3JpdGVsKHJlZywgY29tcC0+cmVncyArIERJ U1BfR0FNTUFfQ0ZHKTsKKwkJbHV0X2Jhc2UgPSBjb21wLT5yZWdzICsgRElTUF9HQU1NQV9MVVQ7 CisJCWx1dCA9IChzdHJ1Y3QgZHJtX2NvbG9yX2x1dCAqKXN0YXRlLT5nYW1tYV9sdXQtPmRhdGE7 CisJCWZvciAoaSA9IDA7IGkgPCBNVEtfTFVUX1NJWkU7IGkrKykgeworCQkJd29yZCA9ICgoKGx1 dFtpXS5yZWQgPj4gNikgJiBMVVRfMTBCSVRfTUFTSykgPDwgMjApICsKKwkJCQkoKChsdXRbaV0u Z3JlZW4gPj4gNikgJiBMVVRfMTBCSVRfTUFTSykgPDwgMTApICsKKwkJCQkoKGx1dFtpXS5ibHVl ID4+IDYpICYgTFVUXzEwQklUX01BU0spOworCQkJd3JpdGVsKHdvcmQsIChsdXRfYmFzZSArIGkg KiA0KSk7CisJCX0KKwl9Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2RkcF9jb21wX2Z1 bmNzIGRkcF9hYWwgPSB7CisJLmdhbW1hX3NldCA9IG10a19nYW1tYV9zZXQsCiAJLmNvbmZpZyA9 IG10a19hYWxfY29uZmlnLAogCS5zdGFydCA9IG10a19hYWxfc3RhcnQsCiAJLnN0b3AgPSBtdGtf YWFsX3N0b3AsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG10a19kZHBfY29tcF9mdW5jcyBk ZHBfZ2FtbWEgPSB7CisJLmdhbW1hX3NldCA9IG10a19nYW1tYV9zZXQsCiAJLmNvbmZpZyA9IG10 a19nYW1tYV9jb25maWcsCiAJLnN0YXJ0ID0gbXRrX2dhbW1hX3N0YXJ0LAogCS5zdG9wID0gbXRr X2dhbW1hX3N0b3AsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2Ry bV9kZHBfY29tcC5oIGIvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZGRwX2NvbXAu aAppbmRleCA2YjEzYmE5Li5mNGI3ZTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbWVk aWF0ZWsvbXRrX2RybV9kZHBfY29tcC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9t dGtfZHJtX2RkcF9jb21wLmgKQEAgLTIxLDYgKzIxLDcgQEAgc3RydWN0IGRldmljZV9ub2RlOwog c3RydWN0IGRybV9jcnRjOwogc3RydWN0IGRybV9kZXZpY2U7CiBzdHJ1Y3QgbXRrX3BsYW5lX3N0 YXRlOworc3RydWN0IGRybV9jcnRjX3N0YXRlOwogCiBlbnVtIG10a19kZHBfY29tcF90eXBlIHsK IAlNVEtfRElTUF9PVkwsCkBAIC03Myw2ICs3NCw4IEBAIHN0cnVjdCBtdGtfZGRwX2NvbXBfZnVu Y3MgewogCXZvaWQgKCpsYXllcl9vZmYpKHN0cnVjdCBtdGtfZGRwX2NvbXAgKmNvbXAsIHVuc2ln bmVkIGludCBpZHgpOwogCXZvaWQgKCpsYXllcl9jb25maWcpKHN0cnVjdCBtdGtfZGRwX2NvbXAg KmNvbXAsIHVuc2lnbmVkIGludCBpZHgsCiAJCQkgICAgIHN0cnVjdCBtdGtfcGxhbmVfc3RhdGUg KnN0YXRlKTsKKwl2b2lkICgqZ2FtbWFfc2V0KShzdHJ1Y3QgbXRrX2RkcF9jb21wICpjb21wLAor CQkJICBzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKnN0YXRlKTsKIH07CiAKIHN0cnVjdCBtdGtfZGRw X2NvbXAgewpAQCAtMTM5LDYgKzE0MiwxMyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgbXRrX2RkcF9j b21wX2xheWVyX2NvbmZpZyhzdHJ1Y3QgbXRrX2RkcF9jb21wICpjb21wLAogCQljb21wLT5mdW5j cy0+bGF5ZXJfY29uZmlnKGNvbXAsIGlkeCwgc3RhdGUpOwogfQogCitzdGF0aWMgaW5saW5lIHZv aWQgbXRrX2RkcF9nYW1tYV9zZXQoc3RydWN0IG10a19kZHBfY29tcCAqY29tcCwKKwkJCQkgICAg IHN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqc3RhdGUpCit7CisJaWYgKGNvbXAtPmZ1bmNzICYmIGNv bXAtPmZ1bmNzLT5nYW1tYV9zZXQpCisJCWNvbXAtPmZ1bmNzLT5nYW1tYV9zZXQoY29tcCwgc3Rh dGUpOworfQorCiBpbnQgbXRrX2RkcF9jb21wX2dldF9pZChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5v ZGUsCiAJCQllbnVtIG10a19kZHBfY29tcF90eXBlIGNvbXBfdHlwZSk7CiBpbnQgbXRrX2RkcF9j b21wX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvbXBfbm9k ZSwKLS0gCjIuOC4xCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Au b3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRl dmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: p.zabel@pengutronix.de (Philipp Zabel) Date: Thu, 11 Aug 2016 11:11:25 +0200 Subject: [PATCH v4.5 3/4] drm/mediatek: Add gamma correction. In-Reply-To: <1469672575-5847-4-git-send-email-bibby.hsieh@mediatek.com> References: <1469672575-5847-1-git-send-email-bibby.hsieh@mediatek.com> <1469672575-5847-4-git-send-email-bibby.hsieh@mediatek.com> Message-ID: <1470906685.2493.34.camel@pengutronix.de> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org >>From 2f3f4dda747c0619594d13996e65598ab675c60c Mon Sep 17 00:00:00 2001 From: Bibby Hsieh Date: Thu, 28 Jul 2016 10:22:54 +0800 Subject: [PATCH] drm/mediatek: Add gamma correction. Add gamma set function to correct brightness values. It applies arbitrary mapping curve to compensate the incorrect transfer function of the panel. Signed-off-by: Bibby Hsieh Signed-off-by: Philipp Zabel --- I have applied this patch with one change from v4: - Use drm_crtc_enable_color_mgmt instead of drm_crtc_helper_enable_color_mgmt --- drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 7 ++++++- drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 1 + drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 31 +++++++++++++++++++++++++++++ drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 10 ++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c index 24aa3ba..e3ac280 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c @@ -409,6 +409,9 @@ static void mtk_drm_crtc_atomic_flush(struct drm_crtc *crtc, } if (pending_planes) mtk_crtc->pending_planes = true; + if (crtc->state->color_mgmt_changed) + for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) + mtk_ddp_gamma_set(mtk_crtc->ddp_comp[i], crtc->state); } static const struct drm_crtc_funcs mtk_crtc_funcs = { @@ -418,6 +421,7 @@ static const struct drm_crtc_funcs mtk_crtc_funcs = { .reset = mtk_drm_crtc_reset, .atomic_duplicate_state = mtk_drm_crtc_duplicate_state, .atomic_destroy_state = mtk_drm_crtc_destroy_state, + .gamma_set = drm_atomic_helper_legacy_gamma_set, }; static const struct drm_crtc_helper_funcs mtk_crtc_helper_funcs = { @@ -568,7 +572,8 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev, &mtk_crtc->planes[1].base, pipe); if (ret < 0) goto unprepare; - + drm_mode_crtc_set_gamma_size(&mtk_crtc->base, MTK_LUT_SIZE); + drm_crtc_enable_color_mgmt(&mtk_crtc->base, 0, false, MTK_LUT_SIZE); priv->crtc[pipe] = &mtk_crtc->base; priv->num_pipes++; diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h index 81e5566..d332564 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h @@ -19,6 +19,7 @@ #include "mtk_drm_plane.h" #define OVL_LAYER_NR 4 +#define MTK_LUT_SIZE 512 int mtk_drm_crtc_enable_vblank(struct drm_device *drm, unsigned int pipe); void mtk_drm_crtc_disable_vblank(struct drm_device *drm, unsigned int pipe); diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c index ba895c8..42cd587 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c @@ -24,6 +24,7 @@ #include "mtk_drm_drv.h" #include "mtk_drm_plane.h" #include "mtk_drm_ddp_comp.h" +#include "mtk_drm_crtc.h" #define DISP_OD_EN 0x0000 #define DISP_OD_INTEN 0x0008 @@ -42,7 +43,11 @@ #define DISP_AAL_SIZE 0x0030 #define DISP_GAMMA_EN 0x0000 +#define DISP_GAMMA_CFG 0x0020 #define DISP_GAMMA_SIZE 0x0030 +#define DISP_GAMMA_LUT 0x0700 + +#define LUT_10BIT_MASK 0x03ff #define OD_RELAY_MODE BIT(0) @@ -54,6 +59,7 @@ #define AAL_EN BIT(0) #define GAMMA_EN BIT(0) +#define GAMMA_LUT_EN BIT(1) static void mtk_color_config(struct mtk_ddp_comp *comp, unsigned int w, unsigned int h, unsigned int vrefresh) @@ -118,13 +124,38 @@ static void mtk_gamma_stop(struct mtk_ddp_comp *comp) writel_relaxed(0x0, comp->regs + DISP_GAMMA_EN); } +static void mtk_gamma_set(struct mtk_ddp_comp *comp, + struct drm_crtc_state *state) +{ + unsigned int i, reg; + struct drm_color_lut *lut; + void __iomem *lut_base; + u32 word; + + if (state->gamma_lut) { + reg = readl(comp->regs + DISP_GAMMA_CFG); + reg = reg | GAMMA_LUT_EN; + writel(reg, comp->regs + DISP_GAMMA_CFG); + lut_base = comp->regs + DISP_GAMMA_LUT; + lut = (struct drm_color_lut *)state->gamma_lut->data; + for (i = 0; i < MTK_LUT_SIZE; i++) { + word = (((lut[i].red >> 6) & LUT_10BIT_MASK) << 20) + + (((lut[i].green >> 6) & LUT_10BIT_MASK) << 10) + + ((lut[i].blue >> 6) & LUT_10BIT_MASK); + writel(word, (lut_base + i * 4)); + } + } +} + static const struct mtk_ddp_comp_funcs ddp_aal = { + .gamma_set = mtk_gamma_set, .config = mtk_aal_config, .start = mtk_aal_start, .stop = mtk_aal_stop, }; static const struct mtk_ddp_comp_funcs ddp_gamma = { + .gamma_set = mtk_gamma_set, .config = mtk_gamma_config, .start = mtk_gamma_start, .stop = mtk_gamma_stop, diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h index 6b13ba9..f4b7e0a 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h @@ -21,6 +21,7 @@ struct device_node; struct drm_crtc; struct drm_device; struct mtk_plane_state; +struct drm_crtc_state; enum mtk_ddp_comp_type { MTK_DISP_OVL, @@ -73,6 +74,8 @@ struct mtk_ddp_comp_funcs { void (*layer_off)(struct mtk_ddp_comp *comp, unsigned int idx); void (*layer_config)(struct mtk_ddp_comp *comp, unsigned int idx, struct mtk_plane_state *state); + void (*gamma_set)(struct mtk_ddp_comp *comp, + struct drm_crtc_state *state); }; struct mtk_ddp_comp { @@ -139,6 +142,13 @@ static inline void mtk_ddp_comp_layer_config(struct mtk_ddp_comp *comp, comp->funcs->layer_config(comp, idx, state); } +static inline void mtk_ddp_gamma_set(struct mtk_ddp_comp *comp, + struct drm_crtc_state *state) +{ + if (comp->funcs && comp->funcs->gamma_set) + comp->funcs->gamma_set(comp, state); +} + int mtk_ddp_comp_get_id(struct device_node *node, enum mtk_ddp_comp_type comp_type); int mtk_ddp_comp_init(struct device *dev, struct device_node *comp_node, -- 2.8.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932721AbcHKJL4 (ORCPT ); Thu, 11 Aug 2016 05:11:56 -0400 Received: from metis.ext.4.pengutronix.de ([92.198.50.35]:36792 "EHLO metis.ext.4.pengutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751093AbcHKJLy (ORCPT ); Thu, 11 Aug 2016 05:11:54 -0400 Message-ID: <1470906685.2493.34.camel@pengutronix.de> Subject: [PATCH v4.5 3/4] drm/mediatek: Add gamma correction. From: Philipp Zabel To: Bibby Hsieh Cc: David Airlie , Matthias Brugger , Daniel Vetter , dri-devel@lists.freedesktop.org, linux-mediatek@lists.infradead.org, Yingjoe Chen , Cawa Cheng , Daniel Kurtz , YT Shen , Thierry Reding , CK Hu , Mao Huang , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Sascha Hauer Date: Thu, 11 Aug 2016 11:11:25 +0200 In-Reply-To: <1469672575-5847-4-git-send-email-bibby.hsieh@mediatek.com> References: <1469672575-5847-1-git-send-email-bibby.hsieh@mediatek.com> <1469672575-5847-4-git-send-email-bibby.hsieh@mediatek.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.12.9-1+b1 Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-SA-Exim-Connect-IP: 2001:67c:670:100:96de:80ff:fec2:9969 X-SA-Exim-Mail-From: p.zabel@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org >>From 2f3f4dda747c0619594d13996e65598ab675c60c Mon Sep 17 00:00:00 2001 From: Bibby Hsieh Date: Thu, 28 Jul 2016 10:22:54 +0800 Subject: [PATCH] drm/mediatek: Add gamma correction. Add gamma set function to correct brightness values. It applies arbitrary mapping curve to compensate the incorrect transfer function of the panel. Signed-off-by: Bibby Hsieh Signed-off-by: Philipp Zabel --- I have applied this patch with one change from v4: - Use drm_crtc_enable_color_mgmt instead of drm_crtc_helper_enable_color_mgmt --- drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 7 ++++++- drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 1 + drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 31 +++++++++++++++++++++++++++++ drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 10 ++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c index 24aa3ba..e3ac280 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c @@ -409,6 +409,9 @@ static void mtk_drm_crtc_atomic_flush(struct drm_crtc *crtc, } if (pending_planes) mtk_crtc->pending_planes = true; + if (crtc->state->color_mgmt_changed) + for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) + mtk_ddp_gamma_set(mtk_crtc->ddp_comp[i], crtc->state); } static const struct drm_crtc_funcs mtk_crtc_funcs = { @@ -418,6 +421,7 @@ static const struct drm_crtc_funcs mtk_crtc_funcs = { .reset = mtk_drm_crtc_reset, .atomic_duplicate_state = mtk_drm_crtc_duplicate_state, .atomic_destroy_state = mtk_drm_crtc_destroy_state, + .gamma_set = drm_atomic_helper_legacy_gamma_set, }; static const struct drm_crtc_helper_funcs mtk_crtc_helper_funcs = { @@ -568,7 +572,8 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev, &mtk_crtc->planes[1].base, pipe); if (ret < 0) goto unprepare; - + drm_mode_crtc_set_gamma_size(&mtk_crtc->base, MTK_LUT_SIZE); + drm_crtc_enable_color_mgmt(&mtk_crtc->base, 0, false, MTK_LUT_SIZE); priv->crtc[pipe] = &mtk_crtc->base; priv->num_pipes++; diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h index 81e5566..d332564 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h @@ -19,6 +19,7 @@ #include "mtk_drm_plane.h" #define OVL_LAYER_NR 4 +#define MTK_LUT_SIZE 512 int mtk_drm_crtc_enable_vblank(struct drm_device *drm, unsigned int pipe); void mtk_drm_crtc_disable_vblank(struct drm_device *drm, unsigned int pipe); diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c index ba895c8..42cd587 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c @@ -24,6 +24,7 @@ #include "mtk_drm_drv.h" #include "mtk_drm_plane.h" #include "mtk_drm_ddp_comp.h" +#include "mtk_drm_crtc.h" #define DISP_OD_EN 0x0000 #define DISP_OD_INTEN 0x0008 @@ -42,7 +43,11 @@ #define DISP_AAL_SIZE 0x0030 #define DISP_GAMMA_EN 0x0000 +#define DISP_GAMMA_CFG 0x0020 #define DISP_GAMMA_SIZE 0x0030 +#define DISP_GAMMA_LUT 0x0700 + +#define LUT_10BIT_MASK 0x03ff #define OD_RELAY_MODE BIT(0) @@ -54,6 +59,7 @@ #define AAL_EN BIT(0) #define GAMMA_EN BIT(0) +#define GAMMA_LUT_EN BIT(1) static void mtk_color_config(struct mtk_ddp_comp *comp, unsigned int w, unsigned int h, unsigned int vrefresh) @@ -118,13 +124,38 @@ static void mtk_gamma_stop(struct mtk_ddp_comp *comp) writel_relaxed(0x0, comp->regs + DISP_GAMMA_EN); } +static void mtk_gamma_set(struct mtk_ddp_comp *comp, + struct drm_crtc_state *state) +{ + unsigned int i, reg; + struct drm_color_lut *lut; + void __iomem *lut_base; + u32 word; + + if (state->gamma_lut) { + reg = readl(comp->regs + DISP_GAMMA_CFG); + reg = reg | GAMMA_LUT_EN; + writel(reg, comp->regs + DISP_GAMMA_CFG); + lut_base = comp->regs + DISP_GAMMA_LUT; + lut = (struct drm_color_lut *)state->gamma_lut->data; + for (i = 0; i < MTK_LUT_SIZE; i++) { + word = (((lut[i].red >> 6) & LUT_10BIT_MASK) << 20) + + (((lut[i].green >> 6) & LUT_10BIT_MASK) << 10) + + ((lut[i].blue >> 6) & LUT_10BIT_MASK); + writel(word, (lut_base + i * 4)); + } + } +} + static const struct mtk_ddp_comp_funcs ddp_aal = { + .gamma_set = mtk_gamma_set, .config = mtk_aal_config, .start = mtk_aal_start, .stop = mtk_aal_stop, }; static const struct mtk_ddp_comp_funcs ddp_gamma = { + .gamma_set = mtk_gamma_set, .config = mtk_gamma_config, .start = mtk_gamma_start, .stop = mtk_gamma_stop, diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h index 6b13ba9..f4b7e0a 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h @@ -21,6 +21,7 @@ struct device_node; struct drm_crtc; struct drm_device; struct mtk_plane_state; +struct drm_crtc_state; enum mtk_ddp_comp_type { MTK_DISP_OVL, @@ -73,6 +74,8 @@ struct mtk_ddp_comp_funcs { void (*layer_off)(struct mtk_ddp_comp *comp, unsigned int idx); void (*layer_config)(struct mtk_ddp_comp *comp, unsigned int idx, struct mtk_plane_state *state); + void (*gamma_set)(struct mtk_ddp_comp *comp, + struct drm_crtc_state *state); }; struct mtk_ddp_comp { @@ -139,6 +142,13 @@ static inline void mtk_ddp_comp_layer_config(struct mtk_ddp_comp *comp, comp->funcs->layer_config(comp, idx, state); } +static inline void mtk_ddp_gamma_set(struct mtk_ddp_comp *comp, + struct drm_crtc_state *state) +{ + if (comp->funcs && comp->funcs->gamma_set) + comp->funcs->gamma_set(comp, state); +} + int mtk_ddp_comp_get_id(struct device_node *node, enum mtk_ddp_comp_type comp_type); int mtk_ddp_comp_init(struct device *dev, struct device_node *comp_node, -- 2.8.1