From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bibby Hsieh Subject: Re: [PATCH 3/4] drm/mediatek: fix the wrong pixel clock when resolution is 4K Date: Mon, 25 Jul 2016 14:24:05 +0800 Message-ID: <1469427845.26205.17.camel@mtksdaap41> References: <1468987385-37353-1-git-send-email-bibby.hsieh@mediatek.com> <1468987385-37353-4-git-send-email-bibby.hsieh@mediatek.com> <1469001443.11841.59.camel@mtksdaap41> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1469001443.11841.59.camel@mtksdaap41> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: CK Hu Cc: Junzhi Zhao , linux-kernel@vger.kernel.org, Sascha Hauer , Daniel Vetter , Cawa Cheng , dri-devel@lists.freedesktop.org, Mao Huang , linux-mediatek@lists.infradead.org, Matthias Brugger , Yingjoe Chen , linux-arm-kernel@lists.infradead.org List-Id: linux-mediatek@lists.infradead.org SGksIENLLAoKVGhhbmtzIGZvciB5b3VyIGNvbW1lbnRzLgoKT24gV2VkLCAyMDE2LTA3LTIwIGF0 IDE1OjU3ICswODAwLCBDSyBIdSB3cm90ZToKPiBIaSwgQmliYnk6Cj4gCj4gU29tZSBjb21tZW50 cyBpbmxpbmUuCj4gCj4gT24gV2VkLCAyMDE2LTA3LTIwIGF0IDEyOjAzICswODAwLCBCaWJieSBI c2llaCB3cm90ZToKPiA+IEZyb206IEp1bnpoaSBaaGFvIDxqdW56aGkuemhhb0BtZWRpYXRlay5j b20+Cj4gPiAKPiA+IFBpeGVsIGNsb2NrIHNob3VsZCBiZSAyOTdNSHogd2hlbiByZXNvbHV0aW9u IGlzIDRLLgo+ID4gCj4gPiBTaWduZWQtb2ZmLWJ5OiBKdW56aGkgWmhhbyA8anVuemhpLnpoYW9A bWVkaWF0ZWsuY29tPgo+ID4gU2lnbmVkLW9mZi1ieTogQmliYnkgSHNpZWggPGJpYmJ5LmhzaWVo QG1lZGlhdGVrLmNvbT4KPiA+IC0tLQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtf ZHBpLmMgfCAgMTg0ICsrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLQo+ID4gIDEg ZmlsZSBjaGFuZ2VkLCAxMzEgaW5zZXJ0aW9ucygrKSwgNTMgZGVsZXRpb25zKC0pCj4gPiAKPiA+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RwaS5jIGIvZHJpdmVy cy9ncHUvZHJtL21lZGlhdGVrL210a19kcGkuYwo+ID4gaW5kZXggZDA1Y2E3OS4uYzBmMDRkMiAx MDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHBpLmMKPiA+ICsr KyBiL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHBpLmMKPiA+IEBAIC02MCwxNCArNjAs MzUgQEAgZW51bSBtdGtfZHBpX291dF9jb2xvcl9mb3JtYXQgewo+ID4gIAlNVEtfRFBJX0NPTE9S X0ZPUk1BVF9ZQ0JDUl80MjJfRlVMTAo+ID4gIH07Cj4gPiAgCj4gPiArZW51bSBtdGtfZHBpX2Ns a19pZCB7Cj4gPiArCU1US19EUElfQ0xLX0RQSV9FTkdJTkUsCj4gPiArCU1US19EUElfQ0xLX0RQ SV9QSVhFTCwKPiA+ICsJTVRLX0RQSV9DTEtfVFZEX1BMTCwKPiA+ICsJTVRLX0RQSV9DTEtfVFZE UExMX01VWCwKPiA+ICsJTVRLX0RQSV9DTEtfVFZEUExMX0QyLAo+ID4gKwlNVEtfRFBJX0NMS19U VkRQTExfRDQsCj4gPiArCU1US19EUElfQ0xLX1RWRFBMTF9EOCwKPiA+ICsJTVRLX0RQSV9DTEtf VFZEUExMX0QxNiwKPiA+ICsJTVRLX0RQSV9DTEtfQ09VTlQsCj4gPiArfTsKPiA+ICsKPiA+ICtz dGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG10a19kcGlfY2xrX25hbWVzW01US19EUElfQ0xLX0NP VU5UXSA9IHsKPiA+ICsJW01US19EUElfQ0xLX0RQSV9FTkdJTkVdID0gImVuZ2luZSIsCj4gPiAr CVtNVEtfRFBJX0NMS19EUElfUElYRUxdID0gInBpeGVsIiwKPiA+ICsJW01US19EUElfQ0xLX1RW RF9QTExdID0gInBsbCIsCj4gPiArCVtNVEtfRFBJX0NMS19UVkRQTExfTVVYXSA9ICJ0dmRwbGxf bXV4IiwKPiA+ICsJW01US19EUElfQ0xLX1RWRFBMTF9EMl0gPSAidHZkcGxsX2QyIiwKPiA+ICsJ W01US19EUElfQ0xLX1RWRFBMTF9ENF0gPSAidHZkcGxsX2Q0IiwKPiA+ICsJW01US19EUElfQ0xL X1RWRFBMTF9EOF0gPSAidHZkcGxsX2Q4IiwKPiA+ICsJW01US19EUElfQ0xLX1RWRFBMTF9EMTZd ID0gInR2ZHBsbF9kMTYiLAo+ID4gK307Cj4gPiArCj4gPiAgc3RydWN0IG10a19kcGkgewo+ID4g IAlzdHJ1Y3QgbXRrX2RkcF9jb21wIGRkcF9jb21wOwo+ID4gIAlzdHJ1Y3QgZHJtX2VuY29kZXIg ZW5jb2RlcjsKPiA+ICAJdm9pZCBfX2lvbWVtICpyZWdzOwo+ID4gIAlzdHJ1Y3QgZGV2aWNlICpk ZXY7Cj4gPiAtCXN0cnVjdCBjbGsgKmVuZ2luZV9jbGs7Cj4gPiAtCXN0cnVjdCBjbGsgKnBpeGVs X2NsazsKPiA+IC0Jc3RydWN0IGNsayAqdHZkX2NsazsKPiA+ICsJc3RydWN0IGNsayAqY2xrW01U S19EUElfQ0xLX0NPVU5UXTsKPiA+ICAJaW50IGlycTsKPiA+ICAJc3RydWN0IGRybV9kaXNwbGF5 X21vZGUgbW9kZTsKPiA+ICAJZW51bSBtdGtfZHBpX291dF9jb2xvcl9mb3JtYXQgY29sb3JfZm9y bWF0Owo+ID4gQEAgLTc2LDYgKzk3LDcgQEAgc3RydWN0IG10a19kcGkgewo+ID4gIAllbnVtIG10 a19kcGlfb3V0X2NoYW5uZWxfc3dhcCBjaGFubmVsX3N3YXA7Cj4gPiAgCWJvb2wgcG93ZXJfc3Rh Owo+ID4gIAl1OCBwb3dlcl9jdGw7Cj4gPiArCXZvaWQgKmRhdGE7Cj4gPiAgfTsKPiA+ICAKPiA+ ICBzdGF0aWMgaW5saW5lIHN0cnVjdCBtdGtfZHBpICptdGtfZHBpX2Zyb21fZW5jb2RlcihzdHJ1 Y3QgZHJtX2VuY29kZXIgKmUpCj4gPiBAQCAtMTE0LDYgKzEzNiwxMSBAQCBzdHJ1Y3QgbXRrX2Rw aV95Y19saW1pdCB7Cj4gPiAgCXUxNiBjX2JvdHRvbTsKPiA+ICB9Owo+ID4gIAo+ID4gK3N0cnVj dCBtdGtfZHBpX2NvbmYgewo+ID4gKwlpbnQgKCpwYXJzZV9jbGtfZnJvbV9kdCkoc3RydWN0IG10 a19kcGkgKmRwaSwgc3RydWN0IGRldmljZV9ub2RlICpucCk7Cj4gPiArCWludCAoKmNsa19jb25m aWcpKHN0cnVjdCBtdGtfZHBpICpkcGksIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsK PiA+ICt9Owo+ID4gKwo+ID4gIHN0YXRpYyB2b2lkIG10a19kcGlfbWFzayhzdHJ1Y3QgbXRrX2Rw aSAqZHBpLCB1MzIgb2Zmc2V0LCB1MzIgdmFsLCB1MzIgbWFzaykKPiA+ICB7Cj4gPiAgCXUzMiB0 bXAgPSByZWFkbChkcGktPnJlZ3MgKyBvZmZzZXQpICYgfm1hc2s7Cj4gPiBAQCAtMzc3LDggKzQw NCw4IEBAIHN0YXRpYyB2b2lkIG10a19kcGlfcG93ZXJfb2ZmKHN0cnVjdCBtdGtfZHBpICpkcGks IGVudW0gbXRrX2RwaV9wb3dlcl9jdGwgcGN0bCkKPiA+ICAJCXJldHVybjsKPiA+ICAKPiA+ICAJ bXRrX2RwaV9kaXNhYmxlKGRwaSk7Cj4gPiAtCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcGktPnBp eGVsX2Nsayk7Cj4gPiAtCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcGktPmVuZ2luZV9jbGspOwo+ ID4gKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZHBpLT5jbGtbTVRLX0RQSV9DTEtfRFBJX1BJWEVM XSk7Cj4gPiArCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcGktPmNsa1tNVEtfRFBJX0NMS19EUElf RU5HSU5FXSk7Cj4gPiAgCWRwaS0+cG93ZXJfc3RhID0gZmFsc2U7Cj4gPiAgfQo+ID4gIAo+ID4g QEAgLTM5NSwxMyArNDIyLDEzIEBAIHN0YXRpYyBpbnQgbXRrX2RwaV9wb3dlcl9vbihzdHJ1Y3Qg bXRrX2RwaSAqZHBpLCBlbnVtIG10a19kcGlfcG93ZXJfY3RsIHBjdGwpCj4gPiAgCWlmIChkcGkt PnBvd2VyX3N0YSkKPiA+ICAJCXJldHVybiAwOwo+ID4gIAo+ID4gLQlyZXQgPSBjbGtfcHJlcGFy ZV9lbmFibGUoZHBpLT5lbmdpbmVfY2xrKTsKPiA+ICsJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxl KGRwaS0+Y2xrW01US19EUElfQ0xLX0RQSV9FTkdJTkVdKTsKPiA+ICAJaWYgKHJldCkgewo+ID4g IAkJZGV2X2VycihkcGktPmRldiwgIkZhaWxlZCB0byBlbmFibGUgZW5naW5lIGNsb2NrOiAlZFxu IiwgcmV0KTsKPiA+ICAJCWdvdG8gZXJyX2VuZzsKPiA+ICAJfQo+ID4gIAo+ID4gLQlyZXQgPSBj bGtfcHJlcGFyZV9lbmFibGUoZHBpLT5waXhlbF9jbGspOwo+ID4gKwlyZXQgPSBjbGtfcHJlcGFy ZV9lbmFibGUoZHBpLT5jbGtbTVRLX0RQSV9DTEtfRFBJX1BJWEVMXSk7Cj4gPiAgCWlmIChyZXQp IHsKPiA+ICAJCWRldl9lcnIoZHBpLT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIHBpeGVsIGNsb2Nr OiAlZFxuIiwgcmV0KTsKPiA+ICAJCWdvdG8gZXJyX3BpeGVsOwo+ID4gQEAgLTQxMiw3ICs0Mzks NyBAQCBzdGF0aWMgaW50IG10a19kcGlfcG93ZXJfb24oc3RydWN0IG10a19kcGkgKmRwaSwgZW51 bSBtdGtfZHBpX3Bvd2VyX2N0bCBwY3RsKQo+ID4gIAlyZXR1cm4gMDsKPiA+ICAKPiA+ICBlcnJf cGl4ZWw6Cj4gPiAtCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcGktPmVuZ2luZV9jbGspOwo+ID4g KwljbGtfZGlzYWJsZV91bnByZXBhcmUoZHBpLT5jbGtbTVRLX0RQSV9DTEtfRFBJX0VOR0lORV0p Owo+ID4gIGVycl9lbmc6Cj4gPiAgCWRwaS0+cG93ZXJfY3RsICY9IH5wY3RsOwo+ID4gIAlyZXR1 cm4gcmV0Owo+ID4gQEAgLTQyOCwzNCArNDU1LDE2IEBAIHN0YXRpYyBpbnQgbXRrX2RwaV9zZXRf ZGlzcGxheV9tb2RlKHN0cnVjdCBtdGtfZHBpICpkcGksCj4gPiAgCXN0cnVjdCBtdGtfZHBpX3N5 bmNfcGFyYW0gdnN5bmNfbGV2ZW4gPSB7IDAgfTsKPiA+ICAJc3RydWN0IG10a19kcGlfc3luY19w YXJhbSB2c3luY19yb2RkID0geyAwIH07Cj4gPiAgCXN0cnVjdCBtdGtfZHBpX3N5bmNfcGFyYW0g dnN5bmNfcmV2ZW4gPSB7IDAgfTsKPiA+IC0JdW5zaWduZWQgbG9uZyBwaXhfcmF0ZTsKPiA+IC0J dW5zaWduZWQgbG9uZyBwbGxfcmF0ZTsKPiA+IC0JdW5zaWduZWQgaW50IGZhY3RvcjsKPiA+ICsJ c3RydWN0IG10a19kcGlfY29uZiAqY29uZjsKPiA+ICsJaW50IHJldDsKPiA+ICAKPiA+ICAJaWYg KCFkcGkpIHsKPiA+ICAJCWRldl9lcnIoZHBpLT5kZXYsICJpbnZhbGlkIGFyZ3VtZW50XG4iKTsK PiA+ICAJCXJldHVybiAtRUlOVkFMOwo+ID4gIAl9Cj4gPiAgCj4gPiAtCXBpeF9yYXRlID0gMTAw MFVMICogbW9kZS0+Y2xvY2s7Cj4gPiAtCWlmIChtb2RlLT5jbG9jayA8PSA3NDAwMCkKPiA+IC0J CWZhY3RvciA9IDggKiAzOwo+ID4gLQllbHNlCj4gPiAtCQlmYWN0b3IgPSA0ICogMzsKPiA+IC0J cGxsX3JhdGUgPSBwaXhfcmF0ZSAqIGZhY3RvcjsKPiA+IC0KPiA+IC0JZGV2X2RiZyhkcGktPmRl diwgIldhbnQgUExMICVsdSBIeiwgcGl4ZWwgY2xvY2sgJWx1IEh6XG4iLAo+ID4gLQkJcGxsX3Jh dGUsIHBpeF9yYXRlKTsKPiA+IC0KPiA+IC0JY2xrX3NldF9yYXRlKGRwaS0+dHZkX2NsaywgcGxs X3JhdGUpOwo+ID4gLQlwbGxfcmF0ZSA9IGNsa19nZXRfcmF0ZShkcGktPnR2ZF9jbGspOwo+ID4g LQo+ID4gLQlwaXhfcmF0ZSA9IHBsbF9yYXRlIC8gZmFjdG9yOwo+ID4gLQljbGtfc2V0X3JhdGUo ZHBpLT5waXhlbF9jbGssIHBpeF9yYXRlKTsKPiA+IC0JcGl4X3JhdGUgPSBjbGtfZ2V0X3JhdGUo ZHBpLT5waXhlbF9jbGspOwo+ID4gLQo+ID4gLQlkZXZfZGJnKGRwaS0+ZGV2LCAiR290ICBQTEwg JWx1IEh6LCBwaXhlbCBjbG9jayAlbHUgSHpcbiIsCj4gPiAtCQlwbGxfcmF0ZSwgcGl4X3JhdGUp Owo+ID4gKwljb25mID0gKHN0cnVjdCBtdGtfZHBpX2NvbmYgKilkcGktPmRhdGE7Cj4gPiArCXJl dCA9IGNvbmYtPmNsa19jb25maWcoZHBpLCBtb2RlKTsKPiAKPiBOb3RoaW5nIHRvIGRvIHdpdGgg cmV0dXJuIGVycm9yPwo+IApPaywgSSB3aWxsIGZpeCB0aGF0Lgo+ID4gIAo+ID4gIAlsaW1pdC5j X2JvdHRvbSA9IDB4MDAxMDsKPiA+ICAJbGltaXQuY190b3AgPSAweDBGRTA7Cj4gPiBAQCAtNjU2 LDIwICs2NjUsMTA5IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tcG9uZW50X29wcyBtdGtfZHBp X2NvbXBvbmVudF9vcHMgPSB7Cj4gPiAgCS51bmJpbmQgPSBtdGtfZHBpX3VuYmluZCwKPiA+ICB9 Owo+ID4gIAo+ID4gK3N0YXRpYyBpbnQgbXQ4MTczX3BhcnNlX2Nsa19mcm9tX2R0KHN0cnVjdCBt dGtfZHBpICpkcGksIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCj4gPiArewo+ID4gKwlpbnQgaTsK PiA+ICsKPiA+ICsJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXRrX2RwaV9jbGtfbmFtZXMp OyBpKyspIHsKPiA+ICsJCWRwaS0+Y2xrW2ldID0gb2ZfY2xrX2dldF9ieV9uYW1lKG5wLAo+ID4g KwkJCQkJCSAgbXRrX2RwaV9jbGtfbmFtZXNbaV0pOwo+ID4gKwkJaWYgKElTX0VSUihkcGktPmNs a1tpXSkpCj4gPiArCQkJcmV0dXJuIFBUUl9FUlIoZHBpLT5jbGtbaV0pOwo+ID4gKwl9Cj4gPiAr CXJldHVybiAwOwo+ID4gK30KPiAKPiBJIHRoaW5rIHBhcnNpbmcgZGV2aWNlIHRyZWUgaXMgYSBw dXJlIFNXIGJlaGF2aW9yLiBXb3VsZCB0aGlzIHZhcnkgZm9yCj4gZGlmZmVyZW50IE1USyBzb2M/ Cj4gClllcwo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ4MTczX2Nsa19jb25maWcoc3RydWN0IG10 a19kcGkgKmRwaSwgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCj4gPiArewo+ID4gKwl1 bnNpZ25lZCBsb25nIHBpeF9yYXRlOwo+ID4gKwl1bnNpZ25lZCBsb25nIHBsbF9yYXRlOwo+ID4g Kwl1bnNpZ25lZCBpbnQgZmFjdG9yOwo+ID4gKwlzdHJ1Y3QgY2xrICpwYXJlbnQ7Cj4gPiArCWlu dCByZXQ7Cj4gPiArCj4gPiArCWlmIChtb2RlLT5jbG9jayA8PSAyNzAwMCkgewo+ID4gKwkJZmFj dG9yID0gMTYgKiAzOwo+ID4gKwkJcGFyZW50ID0gZHBpLT5jbGtbTVRLX0RQSV9DTEtfVFZEUExM X0QxNl07Cj4gPiArCX0gZWxzZSBpZiAobW9kZS0+Y2xvY2sgPD0gNzQyNTApIHsKPiA+ICsJCWZh Y3RvciA9IDggKiAzOwo+ID4gKwkJcGFyZW50ID0gZHBpLT5jbGtbTVRLX0RQSV9DTEtfVFZEUExM X0Q4XTsKPiA+ICsJfSBlbHNlIGlmIChtb2RlLT5jbG9jayA8PSAxNjcwMDApIHsKPiA+ICsJCWZh Y3RvciA9IDQgKiAzOwo+ID4gKwkJcGFyZW50ID0gZHBpLT5jbGtbTVRLX0RQSV9DTEtfVFZEUExM X0Q0XTsKPiA+ICsJfSBlbHNlIHsKPiA+ICsJCWZhY3RvciA9IDIgKiAzOwo+ID4gKwkJcGFyZW50 ID0gZHBpLT5jbGtbTVRLX0RQSV9DTEtfVFZEUExMX0QyXTsKPiA+ICsJfQo+ID4gKwo+ID4gKwlw aXhfcmF0ZSA9IDEwMDBVTCAqIG1vZGUtPmNsb2NrOwo+ID4gKwlwbGxfcmF0ZSA9IHBpeF9yYXRl ICogZmFjdG9yOwo+ID4gKwo+ID4gKwlkZXZfZGJnKGRwaS0+ZGV2LCAiV2FudCBQTEwgJWx1IEh6 LCBwaXhlbCBjbG9jayAlbHUgSHpcbiIsCj4gPiArCQlwbGxfcmF0ZSwgcGl4X3JhdGUpOwo+ID4g Kwo+ID4gKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZHBpLT5jbGtbTVRLX0RQSV9DTEtfVFZE UExMX01VWF0pOwo+ID4gKwlpZiAocmV0KSB7Cj4gPiArCQlkZXZfZXJyKGRwaS0+ZGV2LCAidHZk cGxsX211eCBlbmFibGUgZmFpbFxuIik7Cj4gPiArCQlyZXR1cm4gcmV0Owo+ID4gKwl9Cj4gPiAr Cj4gPiArCXJldCA9IGNsa19zZXRfcGFyZW50KGRwaS0+Y2xrW01US19EUElfQ0xLX1RWRFBMTF9N VVhdLCBwYXJlbnQpOwo+ID4gKwlpZiAocmV0KSB7Cj4gPiArCQlkZXZfZXJyKGRwaS0+ZGV2LCAi dHZkcGxsX211eCBzZXQgcGFyZW50IGZhaWxcbiIpOwo+IAo+IEJlZm9yZSByZXR1cm4sIHlvdSBt YXkgdW5kbyBzb21ldGhpbmcuCkkgdGhpbmsgd2UgY2FuIHJlbW92ZSB0aGlzIGZ1bmN0aW9uIGF0 IHRoZSBuZXcgdmVyc2lvbiwgYmVjYXVzZSB3ZSBtYWtlCnNvbWUgY2hhbmdlcyBoZXJlIGFjY29y ZGluZyBQaGlsaXBwJyBjb21tZW50cy4KPiAKPiA+ICsJCXJldHVybiByZXQ7Cj4gPiArCX0KPiA+ ICsJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRwaS0+Y2xrW01US19EUElfQ0xLX1RWRFBMTF9NVVhd KTsKPiA+ICsKPiA+ICsJcmV0ID0gY2xrX3NldF9yYXRlKGRwaS0+Y2xrW01US19EUElfQ0xLX1RW RF9QTExdLCBwbGxfcmF0ZSk7Cj4gPiArCWlmIChyZXQpIHsKPiA+ICsJCWRldl9lcnIoZHBpLT5k ZXYsICJkcGkgcGxsX3JhdGUgc2V0IHJhdGUgZmFpbFxuIik7Cj4gPiArCQlyZXR1cm4gcmV0Owo+ ID4gKwl9Cj4gPiArCXBsbF9yYXRlID0gY2xrX2dldF9yYXRlKGRwaS0+Y2xrW01US19EUElfQ0xL X1RWRF9QTExdKTsKPiA+ICsJcGl4X3JhdGUgPSBjbGtfZ2V0X3JhdGUoZHBpLT5jbGtbTVRLX0RQ SV9DTEtfRFBJX1BJWEVMXSk7Cj4gPiArCj4gPiArCWRldl9kYmcoZHBpLT5kZXYsICJHb3QgIFBM TCAlbHUgSHosIHBpeGVsIGNsb2NrICVsdSBIelxuIiwKPiA+ICsJCXBsbF9yYXRlLCBwaXhfcmF0 ZSk7Cj4gPiArCj4gPiArCXJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgY29uc3Qg c3RydWN0IG10a19kcGlfY29uZiBtdDgxNzNfY29uZiA9IHsKPiA+ICsJLnBhcnNlX2Nsa19mcm9t X2R0ID0gbXQ4MTczX3BhcnNlX2Nsa19mcm9tX2R0LAo+ID4gKwkuY2xrX2NvbmZpZyA9IG10ODE3 M19jbGtfY29uZmlnLAo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9k ZXZpY2VfaWQgbXRrX2RwaV9vZl9pZHNbXSA9IHsKPiA+ICsJeyAuY29tcGF0aWJsZSA9ICJtZWRp YXRlayxtdDgxNzMtZHBpIiwKPiA+ICsJCS5kYXRhID0gJm10ODE3M19jb25mLAo+ID4gKwl9LAo+ ID4gKwl7fQo+ID4gK307Cj4gPiArCj4gPiAgc3RhdGljIGludCBtdGtfZHBpX3Byb2JlKHN0cnVj dCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiAgewo+ID4gIAlzdHJ1Y3QgZGV2aWNlICpkZXYg PSAmcGRldi0+ZGV2Owo+ID4gIAlzdHJ1Y3QgbXRrX2RwaSAqZHBpOwo+ID4gIAlzdHJ1Y3QgcmVz b3VyY2UgKm1lbTsKPiA+ICsJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsK PiA+ICAJc3RydWN0IGRldmljZV9ub2RlICplcCwgKmJyaWRnZV9ub2RlID0gTlVMTDsKPiA+ICAJ aW50IGNvbXBfaWQ7Cj4gPiArCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwo+ID4g KwlzdHJ1Y3QgbXRrX2RwaV9jb25mICpjb25mOwo+ID4gIAlpbnQgcmV0Owo+ID4gIAo+ID4gKwlt YXRjaCA9IG9mX21hdGNoX25vZGUobXRrX2RwaV9vZl9pZHMsIGRldi0+b2Zfbm9kZSk7Cj4gPiAr CWlmICghbWF0Y2gpCj4gPiArCQlyZXR1cm4gLUVOT0RFVjsKPiA+ICsKPiA+ICAJZHBpID0gZGV2 bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkcGkpLCBHRlBfS0VSTkVMKTsKPiA+ICAJaWYgKCFkcGkp Cj4gPiAgCQlyZXR1cm4gLUVOT01FTTsKPiA+ICAKPiA+ICAJZHBpLT5kZXYgPSBkZXY7Cj4gPiAr CWRwaS0+ZGF0YSA9ICh2b2lkICopbWF0Y2gtPmRhdGE7Cj4gPiArCWNvbmYgPSAoc3RydWN0IG10 a19kcGlfY29uZiAqKW1hdGNoLT5kYXRhOwo+ID4gIAo+ID4gIAltZW0gPSBwbGF0Zm9ybV9nZXRf cmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwo+ID4gIAlkcGktPnJlZ3MgPSBkZXZt X2lvcmVtYXBfcmVzb3VyY2UoZGV2LCBtZW0pOwo+ID4gQEAgLTY3OSwyNCArNzc3LDkgQEAgc3Rh dGljIGludCBtdGtfZHBpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiAg CQlyZXR1cm4gcmV0Owo+ID4gIAl9Cj4gPiAgCj4gPiAtCWRwaS0+ZW5naW5lX2NsayA9IGRldm1f Y2xrX2dldChkZXYsICJlbmdpbmUiKTsKPiA+IC0JaWYgKElTX0VSUihkcGktPmVuZ2luZV9jbGsp KSB7Cj4gPiAtCQlyZXQgPSBQVFJfRVJSKGRwaS0+ZW5naW5lX2Nsayk7Cj4gPiAtCQlkZXZfZXJy KGRldiwgIkZhaWxlZCB0byBnZXQgZW5naW5lIGNsb2NrOiAlZFxuIiwgcmV0KTsKPiA+IC0JCXJl dHVybiByZXQ7Cj4gPiAtCX0KPiA+IC0KPiA+IC0JZHBpLT5waXhlbF9jbGsgPSBkZXZtX2Nsa19n ZXQoZGV2LCAicGl4ZWwiKTsKPiA+IC0JaWYgKElTX0VSUihkcGktPnBpeGVsX2NsaykpIHsKPiA+ IC0JCXJldCA9IFBUUl9FUlIoZHBpLT5waXhlbF9jbGspOwo+ID4gLQkJZGV2X2VycihkZXYsICJG YWlsZWQgdG8gZ2V0IHBpeGVsIGNsb2NrOiAlZFxuIiwgcmV0KTsKPiA+IC0JCXJldHVybiByZXQ7 Cj4gPiAtCX0KPiA+IC0KPiA+IC0JZHBpLT50dmRfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgInBs bCIpOwo+ID4gLQlpZiAoSVNfRVJSKGRwaS0+dHZkX2NsaykpIHsKPiA+IC0JCXJldCA9IFBUUl9F UlIoZHBpLT50dmRfY2xrKTsKPiA+IC0JCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCB0dmRw bGwgY2xvY2s6ICVkXG4iLCByZXQpOwo+ID4gKwlyZXQgPSBjb25mLT5wYXJzZV9jbGtfZnJvbV9k dChkcGksIG5wKTsKPiA+ICsJaWYgKHJldCkgewo+ID4gKwkJZGV2X2VycihkZXYsICJwYXJzZSB0 dmQgZGl2IGNsayBmYWlsZWQhIik7Cj4gPiAgCQlyZXR1cm4gcmV0Owo+ID4gIAl9Cj4gPiAgCj4g PiBAQCAtNzU0LDExICs4MzcsNiBAQCBzdGF0aWMgaW50IG10a19kcGlfcmVtb3ZlKHN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiAgCXJldHVybiAwOwo+ID4gIH0KPiA+ICAKPiA+IC1z dGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtdGtfZHBpX29mX2lkc1tdID0gewo+ID4g LQl7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10ODE3My1kcGkiLCB9LAo+ID4gLQl7fQo+ID4g LX07Cj4gPiAtCj4gPiAgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtdGtfZHBpX2RyaXZlciA9IHsK PiA+ICAJLnByb2JlID0gbXRrX2RwaV9wcm9iZSwKPiA+ICAJLnJlbW92ZSA9IG10a19kcGlfcmVt b3ZlLAo+IAo+IFJlZ2FyZHMsCj4gQ0sKPiAKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0 cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9s aXN0aW5mby9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: bibby.hsieh@mediatek.com (Bibby Hsieh) Date: Mon, 25 Jul 2016 14:24:05 +0800 Subject: [PATCH 3/4] drm/mediatek: fix the wrong pixel clock when resolution is 4K In-Reply-To: <1469001443.11841.59.camel@mtksdaap41> References: <1468987385-37353-1-git-send-email-bibby.hsieh@mediatek.com> <1468987385-37353-4-git-send-email-bibby.hsieh@mediatek.com> <1469001443.11841.59.camel@mtksdaap41> Message-ID: <1469427845.26205.17.camel@mtksdaap41> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi, CK, Thanks for your comments. On Wed, 2016-07-20 at 15:57 +0800, CK Hu wrote: > Hi, Bibby: > > Some comments inline. > > On Wed, 2016-07-20 at 12:03 +0800, Bibby Hsieh wrote: > > From: Junzhi Zhao > > > > Pixel clock should be 297MHz when resolution is 4K. > > > > Signed-off-by: Junzhi Zhao > > Signed-off-by: Bibby Hsieh > > --- > > drivers/gpu/drm/mediatek/mtk_dpi.c | 184 +++++++++++++++++++++++++----------- > > 1 file changed, 131 insertions(+), 53 deletions(-) > > > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c > > index d05ca79..c0f04d2 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > > @@ -60,14 +60,35 @@ enum mtk_dpi_out_color_format { > > MTK_DPI_COLOR_FORMAT_YCBCR_422_FULL > > }; > > > > +enum mtk_dpi_clk_id { > > + MTK_DPI_CLK_DPI_ENGINE, > > + MTK_DPI_CLK_DPI_PIXEL, > > + MTK_DPI_CLK_TVD_PLL, > > + MTK_DPI_CLK_TVDPLL_MUX, > > + MTK_DPI_CLK_TVDPLL_D2, > > + MTK_DPI_CLK_TVDPLL_D4, > > + MTK_DPI_CLK_TVDPLL_D8, > > + MTK_DPI_CLK_TVDPLL_D16, > > + MTK_DPI_CLK_COUNT, > > +}; > > + > > +static const char * const mtk_dpi_clk_names[MTK_DPI_CLK_COUNT] = { > > + [MTK_DPI_CLK_DPI_ENGINE] = "engine", > > + [MTK_DPI_CLK_DPI_PIXEL] = "pixel", > > + [MTK_DPI_CLK_TVD_PLL] = "pll", > > + [MTK_DPI_CLK_TVDPLL_MUX] = "tvdpll_mux", > > + [MTK_DPI_CLK_TVDPLL_D2] = "tvdpll_d2", > > + [MTK_DPI_CLK_TVDPLL_D4] = "tvdpll_d4", > > + [MTK_DPI_CLK_TVDPLL_D8] = "tvdpll_d8", > > + [MTK_DPI_CLK_TVDPLL_D16] = "tvdpll_d16", > > +}; > > + > > struct mtk_dpi { > > struct mtk_ddp_comp ddp_comp; > > struct drm_encoder encoder; > > void __iomem *regs; > > struct device *dev; > > - struct clk *engine_clk; > > - struct clk *pixel_clk; > > - struct clk *tvd_clk; > > + struct clk *clk[MTK_DPI_CLK_COUNT]; > > int irq; > > struct drm_display_mode mode; > > enum mtk_dpi_out_color_format color_format; > > @@ -76,6 +97,7 @@ struct mtk_dpi { > > enum mtk_dpi_out_channel_swap channel_swap; > > bool power_sta; > > u8 power_ctl; > > + void *data; > > }; > > > > static inline struct mtk_dpi *mtk_dpi_from_encoder(struct drm_encoder *e) > > @@ -114,6 +136,11 @@ struct mtk_dpi_yc_limit { > > u16 c_bottom; > > }; > > > > +struct mtk_dpi_conf { > > + int (*parse_clk_from_dt)(struct mtk_dpi *dpi, struct device_node *np); > > + int (*clk_config)(struct mtk_dpi *dpi, struct drm_display_mode *mode); > > +}; > > + > > static void mtk_dpi_mask(struct mtk_dpi *dpi, u32 offset, u32 val, u32 mask) > > { > > u32 tmp = readl(dpi->regs + offset) & ~mask; > > @@ -377,8 +404,8 @@ static void mtk_dpi_power_off(struct mtk_dpi *dpi, enum mtk_dpi_power_ctl pctl) > > return; > > > > mtk_dpi_disable(dpi); > > - clk_disable_unprepare(dpi->pixel_clk); > > - clk_disable_unprepare(dpi->engine_clk); > > + clk_disable_unprepare(dpi->clk[MTK_DPI_CLK_DPI_PIXEL]); > > + clk_disable_unprepare(dpi->clk[MTK_DPI_CLK_DPI_ENGINE]); > > dpi->power_sta = false; > > } > > > > @@ -395,13 +422,13 @@ static int mtk_dpi_power_on(struct mtk_dpi *dpi, enum mtk_dpi_power_ctl pctl) > > if (dpi->power_sta) > > return 0; > > > > - ret = clk_prepare_enable(dpi->engine_clk); > > + ret = clk_prepare_enable(dpi->clk[MTK_DPI_CLK_DPI_ENGINE]); > > if (ret) { > > dev_err(dpi->dev, "Failed to enable engine clock: %d\n", ret); > > goto err_eng; > > } > > > > - ret = clk_prepare_enable(dpi->pixel_clk); > > + ret = clk_prepare_enable(dpi->clk[MTK_DPI_CLK_DPI_PIXEL]); > > if (ret) { > > dev_err(dpi->dev, "Failed to enable pixel clock: %d\n", ret); > > goto err_pixel; > > @@ -412,7 +439,7 @@ static int mtk_dpi_power_on(struct mtk_dpi *dpi, enum mtk_dpi_power_ctl pctl) > > return 0; > > > > err_pixel: > > - clk_disable_unprepare(dpi->engine_clk); > > + clk_disable_unprepare(dpi->clk[MTK_DPI_CLK_DPI_ENGINE]); > > err_eng: > > dpi->power_ctl &= ~pctl; > > return ret; > > @@ -428,34 +455,16 @@ static int mtk_dpi_set_display_mode(struct mtk_dpi *dpi, > > struct mtk_dpi_sync_param vsync_leven = { 0 }; > > struct mtk_dpi_sync_param vsync_rodd = { 0 }; > > struct mtk_dpi_sync_param vsync_reven = { 0 }; > > - unsigned long pix_rate; > > - unsigned long pll_rate; > > - unsigned int factor; > > + struct mtk_dpi_conf *conf; > > + int ret; > > > > if (!dpi) { > > dev_err(dpi->dev, "invalid argument\n"); > > return -EINVAL; > > } > > > > - pix_rate = 1000UL * mode->clock; > > - if (mode->clock <= 74000) > > - factor = 8 * 3; > > - else > > - factor = 4 * 3; > > - pll_rate = pix_rate * factor; > > - > > - dev_dbg(dpi->dev, "Want PLL %lu Hz, pixel clock %lu Hz\n", > > - pll_rate, pix_rate); > > - > > - clk_set_rate(dpi->tvd_clk, pll_rate); > > - pll_rate = clk_get_rate(dpi->tvd_clk); > > - > > - pix_rate = pll_rate / factor; > > - clk_set_rate(dpi->pixel_clk, pix_rate); > > - pix_rate = clk_get_rate(dpi->pixel_clk); > > - > > - dev_dbg(dpi->dev, "Got PLL %lu Hz, pixel clock %lu Hz\n", > > - pll_rate, pix_rate); > > + conf = (struct mtk_dpi_conf *)dpi->data; > > + ret = conf->clk_config(dpi, mode); > > Nothing to do with return error? > Ok, I will fix that. > > > > limit.c_bottom = 0x0010; > > limit.c_top = 0x0FE0; > > @@ -656,20 +665,109 @@ static const struct component_ops mtk_dpi_component_ops = { > > .unbind = mtk_dpi_unbind, > > }; > > > > +static int mt8173_parse_clk_from_dt(struct mtk_dpi *dpi, struct device_node *np) > > +{ > > + int i; > > + > > + for (i = 0; i < ARRAY_SIZE(mtk_dpi_clk_names); i++) { > > + dpi->clk[i] = of_clk_get_by_name(np, > > + mtk_dpi_clk_names[i]); > > + if (IS_ERR(dpi->clk[i])) > > + return PTR_ERR(dpi->clk[i]); > > + } > > + return 0; > > +} > > I think parsing device tree is a pure SW behavior. Would this vary for > different MTK soc? > Yes > > + > > +static int mt8173_clk_config(struct mtk_dpi *dpi, struct drm_display_mode *mode) > > +{ > > + unsigned long pix_rate; > > + unsigned long pll_rate; > > + unsigned int factor; > > + struct clk *parent; > > + int ret; > > + > > + if (mode->clock <= 27000) { > > + factor = 16 * 3; > > + parent = dpi->clk[MTK_DPI_CLK_TVDPLL_D16]; > > + } else if (mode->clock <= 74250) { > > + factor = 8 * 3; > > + parent = dpi->clk[MTK_DPI_CLK_TVDPLL_D8]; > > + } else if (mode->clock <= 167000) { > > + factor = 4 * 3; > > + parent = dpi->clk[MTK_DPI_CLK_TVDPLL_D4]; > > + } else { > > + factor = 2 * 3; > > + parent = dpi->clk[MTK_DPI_CLK_TVDPLL_D2]; > > + } > > + > > + pix_rate = 1000UL * mode->clock; > > + pll_rate = pix_rate * factor; > > + > > + dev_dbg(dpi->dev, "Want PLL %lu Hz, pixel clock %lu Hz\n", > > + pll_rate, pix_rate); > > + > > + ret = clk_prepare_enable(dpi->clk[MTK_DPI_CLK_TVDPLL_MUX]); > > + if (ret) { > > + dev_err(dpi->dev, "tvdpll_mux enable fail\n"); > > + return ret; > > + } > > + > > + ret = clk_set_parent(dpi->clk[MTK_DPI_CLK_TVDPLL_MUX], parent); > > + if (ret) { > > + dev_err(dpi->dev, "tvdpll_mux set parent fail\n"); > > Before return, you may undo something. I think we can remove this function at the new version, because we make some changes here according Philipp' comments. > > > + return ret; > > + } > > + clk_disable_unprepare(dpi->clk[MTK_DPI_CLK_TVDPLL_MUX]); > > + > > + ret = clk_set_rate(dpi->clk[MTK_DPI_CLK_TVD_PLL], pll_rate); > > + if (ret) { > > + dev_err(dpi->dev, "dpi pll_rate set rate fail\n"); > > + return ret; > > + } > > + pll_rate = clk_get_rate(dpi->clk[MTK_DPI_CLK_TVD_PLL]); > > + pix_rate = clk_get_rate(dpi->clk[MTK_DPI_CLK_DPI_PIXEL]); > > + > > + dev_dbg(dpi->dev, "Got PLL %lu Hz, pixel clock %lu Hz\n", > > + pll_rate, pix_rate); > > + > > + return 0; > > +} > > + > > +static const struct mtk_dpi_conf mt8173_conf = { > > + .parse_clk_from_dt = mt8173_parse_clk_from_dt, > > + .clk_config = mt8173_clk_config, > > +}; > > + > > +static const struct of_device_id mtk_dpi_of_ids[] = { > > + { .compatible = "mediatek,mt8173-dpi", > > + .data = &mt8173_conf, > > + }, > > + {} > > +}; > > + > > static int mtk_dpi_probe(struct platform_device *pdev) > > { > > struct device *dev = &pdev->dev; > > struct mtk_dpi *dpi; > > struct resource *mem; > > + struct device_node *np = dev->of_node; > > struct device_node *ep, *bridge_node = NULL; > > int comp_id; > > + const struct of_device_id *match; > > + struct mtk_dpi_conf *conf; > > int ret; > > > > + match = of_match_node(mtk_dpi_of_ids, dev->of_node); > > + if (!match) > > + return -ENODEV; > > + > > dpi = devm_kzalloc(dev, sizeof(*dpi), GFP_KERNEL); > > if (!dpi) > > return -ENOMEM; > > > > dpi->dev = dev; > > + dpi->data = (void *)match->data; > > + conf = (struct mtk_dpi_conf *)match->data; > > > > mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > dpi->regs = devm_ioremap_resource(dev, mem); > > @@ -679,24 +777,9 @@ static int mtk_dpi_probe(struct platform_device *pdev) > > return ret; > > } > > > > - dpi->engine_clk = devm_clk_get(dev, "engine"); > > - if (IS_ERR(dpi->engine_clk)) { > > - ret = PTR_ERR(dpi->engine_clk); > > - dev_err(dev, "Failed to get engine clock: %d\n", ret); > > - return ret; > > - } > > - > > - dpi->pixel_clk = devm_clk_get(dev, "pixel"); > > - if (IS_ERR(dpi->pixel_clk)) { > > - ret = PTR_ERR(dpi->pixel_clk); > > - dev_err(dev, "Failed to get pixel clock: %d\n", ret); > > - return ret; > > - } > > - > > - dpi->tvd_clk = devm_clk_get(dev, "pll"); > > - if (IS_ERR(dpi->tvd_clk)) { > > - ret = PTR_ERR(dpi->tvd_clk); > > - dev_err(dev, "Failed to get tvdpll clock: %d\n", ret); > > + ret = conf->parse_clk_from_dt(dpi, np); > > + if (ret) { > > + dev_err(dev, "parse tvd div clk failed!"); > > return ret; > > } > > > > @@ -754,11 +837,6 @@ static int mtk_dpi_remove(struct platform_device *pdev) > > return 0; > > } > > > > -static const struct of_device_id mtk_dpi_of_ids[] = { > > - { .compatible = "mediatek,mt8173-dpi", }, > > - {} > > -}; > > - > > struct platform_driver mtk_dpi_driver = { > > .probe = mtk_dpi_probe, > > .remove = mtk_dpi_remove, > > Regards, > CK > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751982AbcGYGYR (ORCPT ); Mon, 25 Jul 2016 02:24:17 -0400 Received: from mailgw01.mediatek.com ([210.61.82.183]:12298 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1750898AbcGYGYM (ORCPT ); Mon, 25 Jul 2016 02:24:12 -0400 Message-ID: <1469427845.26205.17.camel@mtksdaap41> Subject: Re: [PATCH 3/4] drm/mediatek: fix the wrong pixel clock when resolution is 4K From: Bibby Hsieh To: CK Hu CC: David Airlie , Matthias Brugger , Daniel Vetter , , , Yingjoe Chen , Cawa Cheng , Daniel Kurtz , "Philipp Zabel" , YT Shen , "Thierry Reding" , Mao Huang , , , "Sascha Hauer" , Junzhi Zhao Date: Mon, 25 Jul 2016 14:24:05 +0800 In-Reply-To: <1469001443.11841.59.camel@mtksdaap41> References: <1468987385-37353-1-git-send-email-bibby.hsieh@mediatek.com> <1468987385-37353-4-git-send-email-bibby.hsieh@mediatek.com> <1469001443.11841.59.camel@mtksdaap41> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit MIME-Version: 1.0 X-MTK: N Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, CK, Thanks for your comments. On Wed, 2016-07-20 at 15:57 +0800, CK Hu wrote: > Hi, Bibby: > > Some comments inline. > > On Wed, 2016-07-20 at 12:03 +0800, Bibby Hsieh wrote: > > From: Junzhi Zhao > > > > Pixel clock should be 297MHz when resolution is 4K. > > > > Signed-off-by: Junzhi Zhao > > Signed-off-by: Bibby Hsieh > > --- > > drivers/gpu/drm/mediatek/mtk_dpi.c | 184 +++++++++++++++++++++++++----------- > > 1 file changed, 131 insertions(+), 53 deletions(-) > > > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c > > index d05ca79..c0f04d2 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > > @@ -60,14 +60,35 @@ enum mtk_dpi_out_color_format { > > MTK_DPI_COLOR_FORMAT_YCBCR_422_FULL > > }; > > > > +enum mtk_dpi_clk_id { > > + MTK_DPI_CLK_DPI_ENGINE, > > + MTK_DPI_CLK_DPI_PIXEL, > > + MTK_DPI_CLK_TVD_PLL, > > + MTK_DPI_CLK_TVDPLL_MUX, > > + MTK_DPI_CLK_TVDPLL_D2, > > + MTK_DPI_CLK_TVDPLL_D4, > > + MTK_DPI_CLK_TVDPLL_D8, > > + MTK_DPI_CLK_TVDPLL_D16, > > + MTK_DPI_CLK_COUNT, > > +}; > > + > > +static const char * const mtk_dpi_clk_names[MTK_DPI_CLK_COUNT] = { > > + [MTK_DPI_CLK_DPI_ENGINE] = "engine", > > + [MTK_DPI_CLK_DPI_PIXEL] = "pixel", > > + [MTK_DPI_CLK_TVD_PLL] = "pll", > > + [MTK_DPI_CLK_TVDPLL_MUX] = "tvdpll_mux", > > + [MTK_DPI_CLK_TVDPLL_D2] = "tvdpll_d2", > > + [MTK_DPI_CLK_TVDPLL_D4] = "tvdpll_d4", > > + [MTK_DPI_CLK_TVDPLL_D8] = "tvdpll_d8", > > + [MTK_DPI_CLK_TVDPLL_D16] = "tvdpll_d16", > > +}; > > + > > struct mtk_dpi { > > struct mtk_ddp_comp ddp_comp; > > struct drm_encoder encoder; > > void __iomem *regs; > > struct device *dev; > > - struct clk *engine_clk; > > - struct clk *pixel_clk; > > - struct clk *tvd_clk; > > + struct clk *clk[MTK_DPI_CLK_COUNT]; > > int irq; > > struct drm_display_mode mode; > > enum mtk_dpi_out_color_format color_format; > > @@ -76,6 +97,7 @@ struct mtk_dpi { > > enum mtk_dpi_out_channel_swap channel_swap; > > bool power_sta; > > u8 power_ctl; > > + void *data; > > }; > > > > static inline struct mtk_dpi *mtk_dpi_from_encoder(struct drm_encoder *e) > > @@ -114,6 +136,11 @@ struct mtk_dpi_yc_limit { > > u16 c_bottom; > > }; > > > > +struct mtk_dpi_conf { > > + int (*parse_clk_from_dt)(struct mtk_dpi *dpi, struct device_node *np); > > + int (*clk_config)(struct mtk_dpi *dpi, struct drm_display_mode *mode); > > +}; > > + > > static void mtk_dpi_mask(struct mtk_dpi *dpi, u32 offset, u32 val, u32 mask) > > { > > u32 tmp = readl(dpi->regs + offset) & ~mask; > > @@ -377,8 +404,8 @@ static void mtk_dpi_power_off(struct mtk_dpi *dpi, enum mtk_dpi_power_ctl pctl) > > return; > > > > mtk_dpi_disable(dpi); > > - clk_disable_unprepare(dpi->pixel_clk); > > - clk_disable_unprepare(dpi->engine_clk); > > + clk_disable_unprepare(dpi->clk[MTK_DPI_CLK_DPI_PIXEL]); > > + clk_disable_unprepare(dpi->clk[MTK_DPI_CLK_DPI_ENGINE]); > > dpi->power_sta = false; > > } > > > > @@ -395,13 +422,13 @@ static int mtk_dpi_power_on(struct mtk_dpi *dpi, enum mtk_dpi_power_ctl pctl) > > if (dpi->power_sta) > > return 0; > > > > - ret = clk_prepare_enable(dpi->engine_clk); > > + ret = clk_prepare_enable(dpi->clk[MTK_DPI_CLK_DPI_ENGINE]); > > if (ret) { > > dev_err(dpi->dev, "Failed to enable engine clock: %d\n", ret); > > goto err_eng; > > } > > > > - ret = clk_prepare_enable(dpi->pixel_clk); > > + ret = clk_prepare_enable(dpi->clk[MTK_DPI_CLK_DPI_PIXEL]); > > if (ret) { > > dev_err(dpi->dev, "Failed to enable pixel clock: %d\n", ret); > > goto err_pixel; > > @@ -412,7 +439,7 @@ static int mtk_dpi_power_on(struct mtk_dpi *dpi, enum mtk_dpi_power_ctl pctl) > > return 0; > > > > err_pixel: > > - clk_disable_unprepare(dpi->engine_clk); > > + clk_disable_unprepare(dpi->clk[MTK_DPI_CLK_DPI_ENGINE]); > > err_eng: > > dpi->power_ctl &= ~pctl; > > return ret; > > @@ -428,34 +455,16 @@ static int mtk_dpi_set_display_mode(struct mtk_dpi *dpi, > > struct mtk_dpi_sync_param vsync_leven = { 0 }; > > struct mtk_dpi_sync_param vsync_rodd = { 0 }; > > struct mtk_dpi_sync_param vsync_reven = { 0 }; > > - unsigned long pix_rate; > > - unsigned long pll_rate; > > - unsigned int factor; > > + struct mtk_dpi_conf *conf; > > + int ret; > > > > if (!dpi) { > > dev_err(dpi->dev, "invalid argument\n"); > > return -EINVAL; > > } > > > > - pix_rate = 1000UL * mode->clock; > > - if (mode->clock <= 74000) > > - factor = 8 * 3; > > - else > > - factor = 4 * 3; > > - pll_rate = pix_rate * factor; > > - > > - dev_dbg(dpi->dev, "Want PLL %lu Hz, pixel clock %lu Hz\n", > > - pll_rate, pix_rate); > > - > > - clk_set_rate(dpi->tvd_clk, pll_rate); > > - pll_rate = clk_get_rate(dpi->tvd_clk); > > - > > - pix_rate = pll_rate / factor; > > - clk_set_rate(dpi->pixel_clk, pix_rate); > > - pix_rate = clk_get_rate(dpi->pixel_clk); > > - > > - dev_dbg(dpi->dev, "Got PLL %lu Hz, pixel clock %lu Hz\n", > > - pll_rate, pix_rate); > > + conf = (struct mtk_dpi_conf *)dpi->data; > > + ret = conf->clk_config(dpi, mode); > > Nothing to do with return error? > Ok, I will fix that. > > > > limit.c_bottom = 0x0010; > > limit.c_top = 0x0FE0; > > @@ -656,20 +665,109 @@ static const struct component_ops mtk_dpi_component_ops = { > > .unbind = mtk_dpi_unbind, > > }; > > > > +static int mt8173_parse_clk_from_dt(struct mtk_dpi *dpi, struct device_node *np) > > +{ > > + int i; > > + > > + for (i = 0; i < ARRAY_SIZE(mtk_dpi_clk_names); i++) { > > + dpi->clk[i] = of_clk_get_by_name(np, > > + mtk_dpi_clk_names[i]); > > + if (IS_ERR(dpi->clk[i])) > > + return PTR_ERR(dpi->clk[i]); > > + } > > + return 0; > > +} > > I think parsing device tree is a pure SW behavior. Would this vary for > different MTK soc? > Yes > > + > > +static int mt8173_clk_config(struct mtk_dpi *dpi, struct drm_display_mode *mode) > > +{ > > + unsigned long pix_rate; > > + unsigned long pll_rate; > > + unsigned int factor; > > + struct clk *parent; > > + int ret; > > + > > + if (mode->clock <= 27000) { > > + factor = 16 * 3; > > + parent = dpi->clk[MTK_DPI_CLK_TVDPLL_D16]; > > + } else if (mode->clock <= 74250) { > > + factor = 8 * 3; > > + parent = dpi->clk[MTK_DPI_CLK_TVDPLL_D8]; > > + } else if (mode->clock <= 167000) { > > + factor = 4 * 3; > > + parent = dpi->clk[MTK_DPI_CLK_TVDPLL_D4]; > > + } else { > > + factor = 2 * 3; > > + parent = dpi->clk[MTK_DPI_CLK_TVDPLL_D2]; > > + } > > + > > + pix_rate = 1000UL * mode->clock; > > + pll_rate = pix_rate * factor; > > + > > + dev_dbg(dpi->dev, "Want PLL %lu Hz, pixel clock %lu Hz\n", > > + pll_rate, pix_rate); > > + > > + ret = clk_prepare_enable(dpi->clk[MTK_DPI_CLK_TVDPLL_MUX]); > > + if (ret) { > > + dev_err(dpi->dev, "tvdpll_mux enable fail\n"); > > + return ret; > > + } > > + > > + ret = clk_set_parent(dpi->clk[MTK_DPI_CLK_TVDPLL_MUX], parent); > > + if (ret) { > > + dev_err(dpi->dev, "tvdpll_mux set parent fail\n"); > > Before return, you may undo something. I think we can remove this function at the new version, because we make some changes here according Philipp' comments. > > > + return ret; > > + } > > + clk_disable_unprepare(dpi->clk[MTK_DPI_CLK_TVDPLL_MUX]); > > + > > + ret = clk_set_rate(dpi->clk[MTK_DPI_CLK_TVD_PLL], pll_rate); > > + if (ret) { > > + dev_err(dpi->dev, "dpi pll_rate set rate fail\n"); > > + return ret; > > + } > > + pll_rate = clk_get_rate(dpi->clk[MTK_DPI_CLK_TVD_PLL]); > > + pix_rate = clk_get_rate(dpi->clk[MTK_DPI_CLK_DPI_PIXEL]); > > + > > + dev_dbg(dpi->dev, "Got PLL %lu Hz, pixel clock %lu Hz\n", > > + pll_rate, pix_rate); > > + > > + return 0; > > +} > > + > > +static const struct mtk_dpi_conf mt8173_conf = { > > + .parse_clk_from_dt = mt8173_parse_clk_from_dt, > > + .clk_config = mt8173_clk_config, > > +}; > > + > > +static const struct of_device_id mtk_dpi_of_ids[] = { > > + { .compatible = "mediatek,mt8173-dpi", > > + .data = &mt8173_conf, > > + }, > > + {} > > +}; > > + > > static int mtk_dpi_probe(struct platform_device *pdev) > > { > > struct device *dev = &pdev->dev; > > struct mtk_dpi *dpi; > > struct resource *mem; > > + struct device_node *np = dev->of_node; > > struct device_node *ep, *bridge_node = NULL; > > int comp_id; > > + const struct of_device_id *match; > > + struct mtk_dpi_conf *conf; > > int ret; > > > > + match = of_match_node(mtk_dpi_of_ids, dev->of_node); > > + if (!match) > > + return -ENODEV; > > + > > dpi = devm_kzalloc(dev, sizeof(*dpi), GFP_KERNEL); > > if (!dpi) > > return -ENOMEM; > > > > dpi->dev = dev; > > + dpi->data = (void *)match->data; > > + conf = (struct mtk_dpi_conf *)match->data; > > > > mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > dpi->regs = devm_ioremap_resource(dev, mem); > > @@ -679,24 +777,9 @@ static int mtk_dpi_probe(struct platform_device *pdev) > > return ret; > > } > > > > - dpi->engine_clk = devm_clk_get(dev, "engine"); > > - if (IS_ERR(dpi->engine_clk)) { > > - ret = PTR_ERR(dpi->engine_clk); > > - dev_err(dev, "Failed to get engine clock: %d\n", ret); > > - return ret; > > - } > > - > > - dpi->pixel_clk = devm_clk_get(dev, "pixel"); > > - if (IS_ERR(dpi->pixel_clk)) { > > - ret = PTR_ERR(dpi->pixel_clk); > > - dev_err(dev, "Failed to get pixel clock: %d\n", ret); > > - return ret; > > - } > > - > > - dpi->tvd_clk = devm_clk_get(dev, "pll"); > > - if (IS_ERR(dpi->tvd_clk)) { > > - ret = PTR_ERR(dpi->tvd_clk); > > - dev_err(dev, "Failed to get tvdpll clock: %d\n", ret); > > + ret = conf->parse_clk_from_dt(dpi, np); > > + if (ret) { > > + dev_err(dev, "parse tvd div clk failed!"); > > return ret; > > } > > > > @@ -754,11 +837,6 @@ static int mtk_dpi_remove(struct platform_device *pdev) > > return 0; > > } > > > > -static const struct of_device_id mtk_dpi_of_ids[] = { > > - { .compatible = "mediatek,mt8173-dpi", }, > > - {} > > -}; > > - > > struct platform_driver mtk_dpi_driver = { > > .probe = mtk_dpi_probe, > > .remove = mtk_dpi_remove, > > Regards, > CK >