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