From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mark yao Subject: Re: [PATCH 1/3] drm/rockchip: inno_hdmi: add audio support Date: Thu, 4 Aug 2016 10:01:27 +0800 Message-ID: <57A2A1F7.2080405@rock-chips.com> References: <1465997312-17777-1-git-send-email-ykk@rock-chips.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1465997312-17777-1-git-send-email-ykk@rock-chips.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Yakir Yang , Heiko Stuebner Cc: Mark Rutland , devicetree@vger.kernel.org, Zheng Yang , Pawel Moll , Ian Campbell , Ken Mixte , Russell King , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, Rob Herring , Kumar Gala , Thierry Reding , linux-arm-kernel@lists.infradead.org, Ben Chan List-Id: linux-rockchip.vger.kernel.org SGkgWWFraXIKCkFmdGVyIGFwcGx5IHlvdXIgcGF0Y2gsIEkgZ290IGZvbGxvd2luZyB3YXJuaW5n IG1lc3NnZToKCmRyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9pbm5vX2hkbWkuYzo4MTg6Mjogd2Fy bmluZzogaW5pdGlhbGl6YXRpb24gZnJvbSAKaW5jb21wYXRpYmxlIHBvaW50ZXIgdHlwZSBbZW5h YmxlZCBieSBkZWZhdWx0XQpkcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvaW5ub19oZG1pLmM6ODE4 OjI6IHdhcm5pbmc6IChuZWFyIAppbml0aWFsaXphdGlvbiBmb3IgJ2F1ZGlvX2NvZGVjX29wcy5o d19wYXJhbXMnKSBbZW5hYmxlZCBieSBkZWZhdWx0XQpkcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAv aW5ub19oZG1pLmM6ODE5OjI6IHdhcm5pbmc6IGluaXRpYWxpemF0aW9uIGZyb20gCmluY29tcGF0 aWJsZSBwb2ludGVyIHR5cGUgW2VuYWJsZWQgYnkgZGVmYXVsdF0KZHJpdmVycy9ncHUvZHJtL3Jv Y2tjaGlwL2lubm9faGRtaS5jOjgxOToyOiB3YXJuaW5nOiAobmVhciAKaW5pdGlhbGl6YXRpb24g Zm9yICdhdWRpb19jb2RlY19vcHMuYXVkaW9fc2h1dGRvd24nKSBbZW5hYmxlZCBieSBkZWZhdWx0 XQpkcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvaW5ub19oZG1pLmM6ODIwOjI6IHdhcm5pbmc6IGlu aXRpYWxpemF0aW9uIGZyb20gCmluY29tcGF0aWJsZSBwb2ludGVyIHR5cGUgW2VuYWJsZWQgYnkg ZGVmYXVsdF0KZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2lubm9faGRtaS5jOjgyMDoyOiB3YXJu aW5nOiAobmVhciAKaW5pdGlhbGl6YXRpb24gZm9yICdhdWRpb19jb2RlY19vcHMuZGlnaXRhbF9t dXRlJykgW2VuYWJsZWQgYnkgZGVmYXVsdF0KZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2lubm9f aGRtaS5jOjgyMToyOiB3YXJuaW5nOiBpbml0aWFsaXphdGlvbiBmcm9tIAppbmNvbXBhdGlibGUg cG9pbnRlciB0eXBlIFtlbmFibGVkIGJ5IGRlZmF1bHRdCmRyaXZlcnMvZ3B1L2RybS9yb2NrY2hp cC9pbm5vX2hkbWkuYzo4MjE6Mjogd2FybmluZzogKG5lYXIgCmluaXRpYWxpemF0aW9uIGZvciAn YXVkaW9fY29kZWNfb3BzLmdldF9lbGQnKSBbZW5hYmxlZCBieSBkZWZhdWx0XQoKc2luY2UgdGhl IGNvbW1pdCAiZWZjOTE5NCBBU29DOiBoZG1pLWNvZGVjOiBjYWxsYmFjayBmdW5jdGlvbiB3aWxs IGJlIApjYWxsZWQgd2l0aCBwcml2YXRlIGRhdGEiLAp0aGUgaGRtaV9jb2RlY19vcHMgaGFkIHNv bWUgY2hhbmdlcy4KQ2FuIHlvdSByZWJhc2UgeW91ciBwYXRjaCB0byB0aGUgbmV3ZXN0IGtlcm5l bD8KClRoYW5rcy4KT24gMjAxNuW5tDA25pyIMTXml6UgMjE6MjgsIFlha2lyIFlhbmcgd3JvdGU6 Cj4gVXNpbmcgdGhlIGNvbW1vbiBoZG1pLWNvZGVjIGRyaXZlciB0byBzdXBwb3J0IGhkbWkgYXVk aW8gZnVuY3Rpb24uCj4KPiBTaWduZWQtb2ZmLWJ5OiBZYWtpciBZYW5nIDx5a2tAcm9jay1jaGlw cy5jb20+Cj4gLS0tCj4gICBkcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvaW5ub19oZG1pLmMgfCAy MzcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KPiAgIGRyaXZlcnMvZ3B1L2Ry bS9yb2NrY2hpcC9pbm5vX2hkbWkuaCB8ICAgMiArCj4gICAyIGZpbGVzIGNoYW5nZWQsIDIzNyBp bnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQo+Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS9yb2NrY2hpcC9pbm5vX2hkbWkuYyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9pbm5v X2hkbWkuYwo+IGluZGV4IGY4YjRmZWIuLmMzMWRjMDcgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9n cHUvZHJtL3JvY2tjaGlwL2lubm9faGRtaS5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tj aGlwL2lubm9faGRtaS5jCj4gQEAgLTI5LDYgKzI5LDggQEAKPiAgICNpbmNsdWRlIDxkcm0vZHJt X2NydGNfaGVscGVyLmg+Cj4gICAjaW5jbHVkZSA8ZHJtL2RybV9lZGlkLmg+Cj4gICAKPiArI2lu Y2x1ZGUgPHNvdW5kL2hkbWktY29kZWMuaD4KPiArCj4gICAjaW5jbHVkZSAicm9ja2NoaXBfZHJt X2Rydi5oIgo+ICAgI2luY2x1ZGUgInJvY2tjaGlwX2RybV92b3AuaCIKPiAgIAo+IEBAIC0zNiw2 ICszOCwxMiBAQAo+ICAgCj4gICAjZGVmaW5lIHRvX2lubm9faGRtaSh4KQljb250YWluZXJfb2Yo eCwgc3RydWN0IGlubm9faGRtaSwgeCkKPiAgIAo+ICtzdHJ1Y3QgYXVkaW9faW5mbyB7Cj4gKwlp bnQgc2FtcGxlX3JhdGU7Cj4gKwlpbnQgY2hhbm5lbHM7Cj4gKwlpbnQgc2FtcGxlX3dpZHRoOwo+ ICt9Owo+ICsKPiAgIHN0cnVjdCBoZG1pX2RhdGFfaW5mbyB7Cj4gICAJaW50IHZpYzsKPiAgIAli b29sIHNpbmtfaXNfaGRtaTsKPiBAQCAtNzEsNiArNzksOSBAQCBzdHJ1Y3QgaW5ub19oZG1pIHsK PiAgIAo+ICAgCXVuc2lnbmVkIGludCB0bWRzX3JhdGU7Cj4gICAKPiArCXN0cnVjdCBwbGF0Zm9y bV9kZXZpY2UgKmF1ZGlvX3BkZXY7Cj4gKwlib29sIGF1ZGlvX2VuYWJsZTsKPiArCj4gICAJc3Ry dWN0IGhkbWlfZGF0YV9pbmZvCWhkbWlfZGF0YTsKPiAgIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9k ZSBwcmV2aW91c19tb2RlOwo+ICAgfTsKPiBAQCAtMzA2LDYgKzMxNyw1NyBAQCBzdGF0aWMgaW50 IGlubm9faGRtaV9jb25maWdfdmlkZW9fYXZpKHN0cnVjdCBpbm5vX2hkbWkgKmhkbWksCj4gICAJ cmV0dXJuIGlubm9faGRtaV91cGxvYWRfZnJhbWUoaGRtaSwgcmMsICZmcmFtZSwgSU5GT0ZSQU1F X0FWSSwgMCwgMCwgMCk7Cj4gICB9Cj4gICAKPiArc3RhdGljIGludCBpbm5vX2hkbWlfY29uZmln X2F1ZGlvX2FhaShzdHJ1Y3QgaW5ub19oZG1pICpoZG1pLAo+ICsJCQkJICAgICAgc3RydWN0IGF1 ZGlvX2luZm8gKmF1ZGlvKQo+ICt7Cj4gKwlzdHJ1Y3QgaGRtaV9hdWRpb19pbmZvZnJhbWUgKmZh dWRpbzsKPiArCXVuaW9uIGhkbWlfaW5mb2ZyYW1lIGZyYW1lOwo+ICsJaW50IHJjOwo+ICsKPiAr CXJjID0gaGRtaV9hdWRpb19pbmZvZnJhbWVfaW5pdCgmZnJhbWUuYXVkaW8pOwo+ICsJZmF1ZGlv ID0gKHN0cnVjdCBoZG1pX2F1ZGlvX2luZm9mcmFtZSAqKSZmcmFtZTsKPiArCj4gKwlmYXVkaW8t PmNoYW5uZWxzID0gYXVkaW8tPmNoYW5uZWxzOwo+ICsKPiArCXN3aXRjaCAoYXVkaW8tPnNhbXBs ZV93aWR0aCkgewo+ICsJY2FzZSAxNjoKPiArCQlmYXVkaW8tPnNhbXBsZV9zaXplID0gSERNSV9B VURJT19TQU1QTEVfU0laRV8xNjsKPiArCQlicmVhazsKPiArCWNhc2UgMjA6Cj4gKwkJZmF1ZGlv LT5zYW1wbGVfc2l6ZSA9IEhETUlfQVVESU9fU0FNUExFX1NJWkVfMjA7Cj4gKwkJYnJlYWs7Cj4g KwljYXNlIDI0Ogo+ICsJCWZhdWRpby0+c2FtcGxlX3NpemUgPSBIRE1JX0FVRElPX1NBTVBMRV9T SVpFXzI0Owo+ICsJCWJyZWFrOwo+ICsJfQo+ICsKPiArCXN3aXRjaCAoYXVkaW8tPnNhbXBsZV9y YXRlKSB7Cj4gKwljYXNlIDMyMDAwOgo+ICsJCWZhdWRpby0+c2FtcGxlX2ZyZXF1ZW5jeSA9IEhE TUlfQVVESU9fU0FNUExFX0ZSRVFVRU5DWV8zMjAwMDsKPiArCQlicmVhazsKPiArCWNhc2UgNDQx MDA6Cj4gKwkJZmF1ZGlvLT5zYW1wbGVfZnJlcXVlbmN5ID0gSERNSV9BVURJT19TQU1QTEVfRlJF UVVFTkNZXzQ0MTAwOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSA0ODAwMDoKPiArCQlmYXVkaW8tPnNh bXBsZV9mcmVxdWVuY3kgPSBIRE1JX0FVRElPX1NBTVBMRV9GUkVRVUVOQ1lfNDgwMDA7Cj4gKwkJ YnJlYWs7Cj4gKwljYXNlIDg4MjAwOgo+ICsJCWZhdWRpby0+c2FtcGxlX2ZyZXF1ZW5jeSA9IEhE TUlfQVVESU9fU0FNUExFX0ZSRVFVRU5DWV84ODIwMDsKPiArCQlicmVhazsKPiArCWNhc2UgOTYw MDA6Cj4gKwkJZmF1ZGlvLT5zYW1wbGVfZnJlcXVlbmN5ID0gSERNSV9BVURJT19TQU1QTEVfRlJF UVVFTkNZXzk2MDAwOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSAxNzY0MDA6Cj4gKwkJZmF1ZGlvLT5z YW1wbGVfZnJlcXVlbmN5ID0gSERNSV9BVURJT19TQU1QTEVfRlJFUVVFTkNZXzE3NjQwMDsKPiAr CQlicmVhazsKPiArCWNhc2UgMTkyMDAwOgo+ICsJCWZhdWRpby0+c2FtcGxlX2ZyZXF1ZW5jeSA9 IEhETUlfQVVESU9fU0FNUExFX0ZSRVFVRU5DWV8xOTIwMDA7Cj4gKwkJYnJlYWs7Cj4gKwl9Cj4g Kwo+ICsJcmV0dXJuIGlubm9faGRtaV91cGxvYWRfZnJhbWUoaGRtaSwgcmMsICZmcmFtZSwgSU5G T0ZSQU1FX0FBSSwgMCwgMCwgMCk7Cj4gK30KPiArCj4gICBzdGF0aWMgaW50IGlubm9faGRtaV9j b25maWdfdmlkZW9fY3NjKHN0cnVjdCBpbm5vX2hkbWkgKmhkbWkpCj4gICB7Cj4gICAJc3RydWN0 IGhkbWlfZGF0YV9pbmZvICpkYXRhID0gJmhkbWktPmhkbWlfZGF0YTsKPiBAQCAtNDc4LDggKzU0 MCw5IEBAIHN0YXRpYyBpbnQgaW5ub19oZG1pX3NldHVwKHN0cnVjdCBpbm5vX2hkbWkgKmhkbWks Cj4gICAJaW5ub19oZG1pX2kyY19pbml0KGhkbWkpOwo+ICAgCj4gICAJLyogVW5tdXRlIHZpZGVv IGFuZCBhdWRpbyBvdXRwdXQgKi8KPiAtCWhkbWlfbW9kYihoZG1pLCBIRE1JX0FWX01VVEUsIG1f QVVESU9fTVVURSB8IG1fVklERU9fQkxBQ0ssCj4gLQkJICB2X0FVRElPX01VVEUoMCkgfCB2X1ZJ REVPX01VVEUoMCkpOwo+ICsJaGRtaV9tb2RiKGhkbWksIEhETUlfQVZfTVVURSwgbV9WSURFT19C TEFDSywgdl9WSURFT19NVVRFKDApKTsKPiArCWlmIChoZG1pLT5hdWRpb19lbmFibGUpCj4gKwkJ aGRtaV9tb2RiKGhkbWksIEhETUlfQVZfTVVURSwgbV9BVURJT19NVVRFLCB2X0FVRElPX01VVEUo MCkpOwo+ICAgCj4gICAJcmV0dXJuIDA7Cj4gICB9Cj4gQEAgLTYxNiw2ICs2NzksMTc0IEBAIHN0 YXRpYyBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgaW5ub19oZG1pX2Nvbm5lY3Rv cl9oZWxwZXJfZnVuY3MgPSB7Cj4gICAJLmJlc3RfZW5jb2RlciA9IGlubm9faGRtaV9jb25uZWN0 b3JfYmVzdF9lbmNvZGVyLAo+ICAgfTsKPiAgIAo+ICtpbnQgaW5ub19oZG1pX2F1ZGlvX2NvbmZp Z19zZXQoc3RydWN0IGlubm9faGRtaSAqaGRtaSwgc3RydWN0IGF1ZGlvX2luZm8gKmF1ZGlvKQo+ ICt7Cj4gKwlpbnQgcmF0ZSwgTiwgY2hhbm5lbDsKPiArCj4gKwlpZiAoYXVkaW8tPmNoYW5uZWxz IDwgMykKPiArCQljaGFubmVsID0gSTJTX0NIQU5ORUxfMV8yOwo+ICsJZWxzZSBpZiAoYXVkaW8t PmNoYW5uZWxzIDwgNSkKPiArCQljaGFubmVsID0gSTJTX0NIQU5ORUxfM180Owo+ICsJZWxzZSBp ZiAoYXVkaW8tPmNoYW5uZWxzIDwgNykKPiArCQljaGFubmVsID0gSTJTX0NIQU5ORUxfNV82Owo+ ICsJZWxzZQo+ICsJCWNoYW5uZWwgPSBJMlNfQ0hBTk5FTF83Xzg7Cj4gKwo+ICsJc3dpdGNoIChh dWRpby0+c2FtcGxlX3JhdGUpIHsKPiArCWNhc2UgMzIwMDA6Cj4gKwkJcmF0ZSA9IEFVRElPXzMy SzsKPiArCQlOID0gTl8zMks7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIDQ0MTAwOgo+ICsJCXJhdGUg PSBBVURJT180NDFLOwo+ICsJCU4gPSBOXzQ0MUs7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIDQ4MDAw Ogo+ICsJCXJhdGUgPSBBVURJT180OEs7Cj4gKwkJTiA9IE5fNDhLOwo+ICsJCWJyZWFrOwo+ICsJ Y2FzZSA4ODIwMDoKPiArCQlyYXRlID0gQVVESU9fODgySzsKPiArCQlOID0gTl84ODJLOwo+ICsJ CWJyZWFrOwo+ICsJY2FzZSA5NjAwMDoKPiArCQlyYXRlID0gQVVESU9fOTZLOwo+ICsJCU4gPSBO Xzk2SzsKPiArCQlicmVhazsKPiArCWNhc2UgMTc2NDAwOgo+ICsJCXJhdGUgPSBBVURJT18xNzY0 SzsKPiArCQlOID0gTl8xNzY0SzsKPiArCQlicmVhazsKPiArCWNhc2UgMTkyMDAwOgo+ICsJCXJh dGUgPSBBVURJT18xOTJLOwo+ICsJCU4gPSBOXzE5Mks7Cj4gKwkJYnJlYWs7Cj4gKwlkZWZhdWx0 Ogo+ICsJCWRldl9lcnIoaGRtaS0+ZGV2LCAiWyVzXSBub3Qgc3VwcG9ydCBzdWNoIHNhbXBsZSBy YXRlICVkXG4iLAo+ICsJCQlfX2Z1bmNfXywgYXVkaW8tPnNhbXBsZV9yYXRlKTsKPiArCQlyZXR1 cm4gLUVOT0VOVDsKPiArCX0KPiArCj4gKwkvKiBzZXRfYXVkaW8gc291cmNlIEkyUyAqLwo+ICsJ aGRtaV93cml0ZWIoaGRtaSwgSERNSV9BVURJT19DVFJMMSwgMHgwMSk7Cj4gKwloZG1pX3dyaXRl YihoZG1pLCBBVURJT19TQU1QTEVfUkFURSwgcmF0ZSk7Cj4gKwloZG1pX3dyaXRlYihoZG1pLCBB VURJT19JMlNfTU9ERSwgdl9JMlNfTU9ERShJMlNfU1RBTkRBUkQpIHwKPiArCQkgICAgdl9JMlNf Q0hBTk5FTChjaGFubmVsKSk7Cj4gKwo+ICsJaGRtaV93cml0ZWIoaGRtaSwgQVVESU9fSTJTX01B UCwgMHgwMCk7Cj4gKwloZG1pX3dyaXRlYihoZG1pLCBBVURJT19JMlNfU1dBUFNfU1BESUYsIDAp Owo+ICsKPiArCS8qIFNldCBOIHZhbHVlICovCj4gKwloZG1pX3dyaXRlYihoZG1pLCBBVURJT19O X0gsIChOID4+IDE2KSAmIDB4MEYpOwo+ICsJaGRtaV93cml0ZWIoaGRtaSwgQVVESU9fTl9NLCAo TiA+PiA4KSAmIDB4RkYpOwo+ICsJaGRtaV93cml0ZWIoaGRtaSwgQVVESU9fTl9MLCBOICYgMHhG Rik7Cj4gKwo+ICsJLypTZXQgaGRtaSBubHBjbSBtb2RlIHRvIHN1cHBvcnQgaGRtaSBiaXRzdHJl YW0qLwo+ICsJaGRtaV93cml0ZWIoaGRtaSwgSERNSV9BVURJT19DSEFOTkVMX1NUQVRVUywgdl9B VURJT19TVEFUVVNfTkxQQ00oMCkpOwo+ICsKPiArCXJldHVybiBpbm5vX2hkbWlfY29uZmlnX2F1 ZGlvX2FhaShoZG1pLCBhdWRpbyk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgaW5ub19oZG1pX2F1 ZGlvX2h3X3BhcmFtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gKwkJCQkgICAgIHN0cnVjdCBoZG1p X2NvZGVjX2RhaWZtdCAqZGFpZm10LAo+ICsJCQkJICAgICBzdHJ1Y3QgaGRtaV9jb2RlY19wYXJh bXMgKnBhcmFtcykKPiArewo+ICsJc3RydWN0IGlubm9faGRtaSAqaGRtaSA9IGRldl9nZXRfZHJ2 ZGF0YShkZXYpOwo+ICsJc3RydWN0IGF1ZGlvX2luZm8gYXVkaW8gPSB7Cj4gKwkJLnNhbXBsZV93 aWR0aCA9IHBhcmFtcy0+c2FtcGxlX3dpZHRoLAo+ICsJCS5zYW1wbGVfcmF0ZSA9IHBhcmFtcy0+ c2FtcGxlX3JhdGUsCj4gKwkJLmNoYW5uZWxzID0gcGFyYW1zLT5jaGFubmVscywKPiArCX07Cj4g Kwo+ICsJaWYgKCFoZG1pLT5oZG1pX2RhdGEuc2lua19oYXNfYXVkaW8pIHsKPiArCQlkZXZfZXJy KGhkbWktPmRldiwgIlNpbmsgZG8gbm90IHN1cHBvcnQgYXVkaW8hXG4iKTsKPiArCQlyZXR1cm4g LUVOT0RFVjsKPiArCX0KPiArCj4gKwlpZiAoIWhkbWktPmVuY29kZXIuY3J0YykKPiArCQlyZXR1 cm4gLUVOT0RFVjsKPiArCj4gKwlzd2l0Y2ggKGRhaWZtdC0+Zm10KSB7Cj4gKwljYXNlIEhETUlf STJTOgo+ICsJCWJyZWFrOwo+ICsJZGVmYXVsdDoKPiArCQlkZXZfZXJyKGRldiwgIiVzOiBJbnZh bGlkIGZvcm1hdCAlZFxuIiwgX19mdW5jX18sIGRhaWZtdC0+Zm10KTsKPiArCQlyZXR1cm4gLUVJ TlZBTDsKPiArCX0KPiArCj4gKwlyZXR1cm4gaW5ub19oZG1pX2F1ZGlvX2NvbmZpZ19zZXQoaGRt aSwgJmF1ZGlvKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaW5ub19oZG1pX2F1ZGlvX3NodXRk b3duKHN0cnVjdCBkZXZpY2UgKmRldikKPiArewo+ICsJLyogZG8gbm90aGluZyAqLwo+ICt9Cj4g Kwo+ICtzdGF0aWMgaW50IGlubm9faGRtaV9hdWRpb19kaWdpdGFsX211dGUoc3RydWN0IGRldmlj ZSAqZGV2LCBib29sIG11dGUpCj4gK3sKPiArCXN0cnVjdCBpbm5vX2hkbWkgKmhkbWkgPSBkZXZf Z2V0X2RydmRhdGEoZGV2KTsKPiArCj4gKwlpZiAoIWhkbWktPmhkbWlfZGF0YS5zaW5rX2hhc19h dWRpbykgewo+ICsJCWRldl9lcnIoaGRtaS0+ZGV2LCAiU2luayBkbyBub3Qgc3VwcG9ydCBhdWRp byFcbiIpOwo+ICsJCXJldHVybiAtRU5PREVWOwo+ICsJfQo+ICsKPiArCWhkbWktPmF1ZGlvX2Vu YWJsZSA9ICFtdXRlOwo+ICsKPiArCWlmIChtdXRlKQo+ICsJCWhkbWlfbW9kYihoZG1pLCBIRE1J X0FWX01VVEUsIG1fQVVESU9fTVVURSB8IG1fQVVESU9fUEQsCj4gKwkJCSAgdl9BVURJT19NVVRF KDEpIHwgdl9BVURJT19QRCgxKSk7Cj4gKwllbHNlCj4gKwkJaGRtaV9tb2RiKGhkbWksIEhETUlf QVZfTVVURSwgbV9BVURJT19NVVRFIHwgbV9BVURJT19QRCwKPiArCQkJICB2X0FVRElPX01VVEUo MCkgfCB2X0FVRElPX1BEKDApKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGlj IGludCBpbm5vX2hkbWlfYXVkaW9fZ2V0X2VsZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVpbnQ4X3Qg KmJ1Ziwgc2l6ZV90IGxlbikKPiArewo+ICsJc3RydWN0IGlubm9faGRtaSAqaGRtaSA9IGRldl9n ZXRfZHJ2ZGF0YShkZXYpOwo+ICsJc3RydWN0IGRybV9tb2RlX2NvbmZpZyAqY29uZmlnID0gJmhk bWktPmVuY29kZXIuZGV2LT5tb2RlX2NvbmZpZzsKPiArCXN0cnVjdCBkcm1fY29ubmVjdG9yICpj b25uZWN0b3I7Cj4gKwlpbnQgcmV0ID0gLUVOT0RFVjsKPiArCj4gKwltdXRleF9sb2NrKCZjb25m aWctPm11dGV4KTsKPiArCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmY29uZmlnLT5j b25uZWN0b3JfbGlzdCwgaGVhZCkgewo+ICsJCWlmICgmaGRtaS0+ZW5jb2RlciA9PSBjb25uZWN0 b3ItPmVuY29kZXIpIHsKPiArCQkJbWVtY3B5KGJ1ZiwgY29ubmVjdG9yLT5lbGQsCj4gKwkJCSAg ICAgICBtaW4oc2l6ZW9mKGNvbm5lY3Rvci0+ZWxkKSwgbGVuKSk7Cj4gKwkJCXJldCA9IDA7Cj4g KwkJfQo+ICsJfQo+ICsJbXV0ZXhfdW5sb2NrKCZjb25maWctPm11dGV4KTsKPiArCj4gKwlyZXR1 cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGhkbWlfY29kZWNfb3BzIGF1 ZGlvX2NvZGVjX29wcyA9IHsKPiArCS5od19wYXJhbXMgPSBpbm5vX2hkbWlfYXVkaW9faHdfcGFy YW1zLAo+ICsJLmF1ZGlvX3NodXRkb3duID0gaW5ub19oZG1pX2F1ZGlvX3NodXRkb3duLAo+ICsJ LmRpZ2l0YWxfbXV0ZSA9IGlubm9faGRtaV9hdWRpb19kaWdpdGFsX211dGUsCj4gKwkuZ2V0X2Vs ZCA9IGlubm9faGRtaV9hdWRpb19nZXRfZWxkLAo+ICt9Owo+ICsKPiArc3RhdGljIGludCBpbm5v X2hkbWlfYXVkaW9fY29kZWNfaW5pdChzdHJ1Y3QgaW5ub19oZG1pICpoZG1pLAo+ICsJCQkJICAg ICAgc3RydWN0IGRldmljZSAqZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgaGRtaV9jb2RlY19wZGF0YSBj b2RlY19kYXRhID0gewo+ICsJCS5pMnMgPSAxLAo+ICsJCS5vcHMgPSAmYXVkaW9fY29kZWNfb3Bz LAo+ICsJCS5tYXhfaTJzX2NoYW5uZWxzID0gOCwKPiArCX07Cj4gKwo+ICsJaGRtaS0+YXVkaW9f ZW5hYmxlID0gZmFsc2U7Cj4gKwloZG1pLT5hdWRpb19wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3Jl Z2lzdGVyX2RhdGEoCj4gKwkJCQlkZXYsIEhETUlfQ09ERUNfRFJWX05BTUUsIFBMQVRGT1JNX0RF VklEX05PTkUsCj4gKwkJCQkmY29kZWNfZGF0YSwgc2l6ZW9mKGNvZGVjX2RhdGEpKTsKPiArCj4g KwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGhkbWktPmF1ZGlvX3BkZXYpOwo+ICt9Cj4gKwo+ICAg c3RhdGljIGludCBpbm5vX2hkbWlfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRybSwgc3Ry dWN0IGlubm9faGRtaSAqaGRtaSkKPiAgIHsKPiAgIAlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29k ZXIgPSAmaGRtaS0+ZW5jb2RlcjsKPiBAQCAtNjQ1LDYgKzg3Niw4IEBAIHN0YXRpYyBpbnQgaW5u b19oZG1pX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sIHN0cnVjdCBpbm5vX2hkbWkg KmhkbWkpCj4gICAKPiAgIAlkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIoJmhkbWkt PmNvbm5lY3RvciwgZW5jb2Rlcik7Cj4gICAKPiArCWlubm9faGRtaV9hdWRpb19jb2RlY19pbml0 KGhkbWksIGRldik7Cj4gKwo+ICAgCXJldHVybiAwOwo+ICAgfQo+ICAgCj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9pbm5vX2hkbWkuaCBiL2RyaXZlcnMvZ3B1L2RybS9y b2NrY2hpcC9pbm5vX2hkbWkuaAo+IGluZGV4IGFhN2M0MTUuLjhiMjMwMzcgMTAwNjQ0Cj4gLS0t IGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2lubm9faGRtaS5oCj4gKysrIGIvZHJpdmVycy9n cHUvZHJtL3JvY2tjaGlwL2lubm9faGRtaS5oCj4gQEAgLTEwNCwxMSArMTA0LDEzIEBAIGVudW0g ewo+ICAgI2RlZmluZSBIRE1JX0FWX01VVEUJCQkweDA1Cj4gICAjZGVmaW5lIG1fQVZNVVRFX0NM RUFSCQkJKDEgPDwgNykKPiAgICNkZWZpbmUgbV9BVk1VVEVfRU5BQkxFCQkJKDEgPDwgNikKPiAr I2RlZmluZSBtX0FVRElPX1BECQkJKDEgPDwgMikKPiAgICNkZWZpbmUgbV9BVURJT19NVVRFCQkJ KDEgPDwgMSkKPiAgICNkZWZpbmUgbV9WSURFT19CTEFDSwkJCSgxIDw8IDApCj4gICAjZGVmaW5l IHZfQVZNVVRFX0NMRUFSKG4pCQkobiA8PCA3KQo+ICAgI2RlZmluZSB2X0FWTVVURV9FTkFCTEUo bikJCShuIDw8IDYpCj4gICAjZGVmaW5lIHZfQVVESU9fTVVURShuKQkJCShuIDw8IDEpCj4gKyNk ZWZpbmUgdl9BVURJT19QRChuKQkJCShuIDw8IDIpCj4gICAjZGVmaW5lIHZfVklERU9fTVVURShu KQkJCShuIDw8IDApCj4gICAKPiAgICNkZWZpbmUgSERNSV9WSURFT19USU1JTkdfQ1RMCQkweDA4 CgoKLS0gCu+8rWFyayBZYW8KCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVz a3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9k cmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: mark.yao@rock-chips.com (Mark yao) Date: Thu, 4 Aug 2016 10:01:27 +0800 Subject: [PATCH 1/3] drm/rockchip: inno_hdmi: add audio support In-Reply-To: <1465997312-17777-1-git-send-email-ykk@rock-chips.com> References: <1465997312-17777-1-git-send-email-ykk@rock-chips.com> Message-ID: <57A2A1F7.2080405@rock-chips.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Yakir After apply your patch, I got following warning messge: drivers/gpu/drm/rockchip/inno_hdmi.c:818:2: warning: initialization from incompatible pointer type [enabled by default] drivers/gpu/drm/rockchip/inno_hdmi.c:818:2: warning: (near initialization for 'audio_codec_ops.hw_params') [enabled by default] drivers/gpu/drm/rockchip/inno_hdmi.c:819:2: warning: initialization from incompatible pointer type [enabled by default] drivers/gpu/drm/rockchip/inno_hdmi.c:819:2: warning: (near initialization for 'audio_codec_ops.audio_shutdown') [enabled by default] drivers/gpu/drm/rockchip/inno_hdmi.c:820:2: warning: initialization from incompatible pointer type [enabled by default] drivers/gpu/drm/rockchip/inno_hdmi.c:820:2: warning: (near initialization for 'audio_codec_ops.digital_mute') [enabled by default] drivers/gpu/drm/rockchip/inno_hdmi.c:821:2: warning: initialization from incompatible pointer type [enabled by default] drivers/gpu/drm/rockchip/inno_hdmi.c:821:2: warning: (near initialization for 'audio_codec_ops.get_eld') [enabled by default] since the commit "efc9194 ASoC: hdmi-codec: callback function will be called with private data", the hdmi_codec_ops had some changes. Can you rebase your patch to the newest kernel? Thanks. On 2016?06?15? 21:28, Yakir Yang wrote: > Using the common hdmi-codec driver to support hdmi audio function. > > Signed-off-by: Yakir Yang > --- > drivers/gpu/drm/rockchip/inno_hdmi.c | 237 ++++++++++++++++++++++++++++++++++- > drivers/gpu/drm/rockchip/inno_hdmi.h | 2 + > 2 files changed, 237 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/rockchip/inno_hdmi.c b/drivers/gpu/drm/rockchip/inno_hdmi.c > index f8b4feb..c31dc07 100644 > --- a/drivers/gpu/drm/rockchip/inno_hdmi.c > +++ b/drivers/gpu/drm/rockchip/inno_hdmi.c > @@ -29,6 +29,8 @@ > #include > #include > > +#include > + > #include "rockchip_drm_drv.h" > #include "rockchip_drm_vop.h" > > @@ -36,6 +38,12 @@ > > #define to_inno_hdmi(x) container_of(x, struct inno_hdmi, x) > > +struct audio_info { > + int sample_rate; > + int channels; > + int sample_width; > +}; > + > struct hdmi_data_info { > int vic; > bool sink_is_hdmi; > @@ -71,6 +79,9 @@ struct inno_hdmi { > > unsigned int tmds_rate; > > + struct platform_device *audio_pdev; > + bool audio_enable; > + > struct hdmi_data_info hdmi_data; > struct drm_display_mode previous_mode; > }; > @@ -306,6 +317,57 @@ static int inno_hdmi_config_video_avi(struct inno_hdmi *hdmi, > return inno_hdmi_upload_frame(hdmi, rc, &frame, INFOFRAME_AVI, 0, 0, 0); > } > > +static int inno_hdmi_config_audio_aai(struct inno_hdmi *hdmi, > + struct audio_info *audio) > +{ > + struct hdmi_audio_infoframe *faudio; > + union hdmi_infoframe frame; > + int rc; > + > + rc = hdmi_audio_infoframe_init(&frame.audio); > + faudio = (struct hdmi_audio_infoframe *)&frame; > + > + faudio->channels = audio->channels; > + > + switch (audio->sample_width) { > + case 16: > + faudio->sample_size = HDMI_AUDIO_SAMPLE_SIZE_16; > + break; > + case 20: > + faudio->sample_size = HDMI_AUDIO_SAMPLE_SIZE_20; > + break; > + case 24: > + faudio->sample_size = HDMI_AUDIO_SAMPLE_SIZE_24; > + break; > + } > + > + switch (audio->sample_rate) { > + case 32000: > + faudio->sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_32000; > + break; > + case 44100: > + faudio->sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_44100; > + break; > + case 48000: > + faudio->sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_48000; > + break; > + case 88200: > + faudio->sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_88200; > + break; > + case 96000: > + faudio->sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_96000; > + break; > + case 176400: > + faudio->sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_176400; > + break; > + case 192000: > + faudio->sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_192000; > + break; > + } > + > + return inno_hdmi_upload_frame(hdmi, rc, &frame, INFOFRAME_AAI, 0, 0, 0); > +} > + > static int inno_hdmi_config_video_csc(struct inno_hdmi *hdmi) > { > struct hdmi_data_info *data = &hdmi->hdmi_data; > @@ -478,8 +540,9 @@ static int inno_hdmi_setup(struct inno_hdmi *hdmi, > inno_hdmi_i2c_init(hdmi); > > /* Unmute video and audio output */ > - hdmi_modb(hdmi, HDMI_AV_MUTE, m_AUDIO_MUTE | m_VIDEO_BLACK, > - v_AUDIO_MUTE(0) | v_VIDEO_MUTE(0)); > + hdmi_modb(hdmi, HDMI_AV_MUTE, m_VIDEO_BLACK, v_VIDEO_MUTE(0)); > + if (hdmi->audio_enable) > + hdmi_modb(hdmi, HDMI_AV_MUTE, m_AUDIO_MUTE, v_AUDIO_MUTE(0)); > > return 0; > } > @@ -616,6 +679,174 @@ static struct drm_connector_helper_funcs inno_hdmi_connector_helper_funcs = { > .best_encoder = inno_hdmi_connector_best_encoder, > }; > > +int inno_hdmi_audio_config_set(struct inno_hdmi *hdmi, struct audio_info *audio) > +{ > + int rate, N, channel; > + > + if (audio->channels < 3) > + channel = I2S_CHANNEL_1_2; > + else if (audio->channels < 5) > + channel = I2S_CHANNEL_3_4; > + else if (audio->channels < 7) > + channel = I2S_CHANNEL_5_6; > + else > + channel = I2S_CHANNEL_7_8; > + > + switch (audio->sample_rate) { > + case 32000: > + rate = AUDIO_32K; > + N = N_32K; > + break; > + case 44100: > + rate = AUDIO_441K; > + N = N_441K; > + break; > + case 48000: > + rate = AUDIO_48K; > + N = N_48K; > + break; > + case 88200: > + rate = AUDIO_882K; > + N = N_882K; > + break; > + case 96000: > + rate = AUDIO_96K; > + N = N_96K; > + break; > + case 176400: > + rate = AUDIO_1764K; > + N = N_1764K; > + break; > + case 192000: > + rate = AUDIO_192K; > + N = N_192K; > + break; > + default: > + dev_err(hdmi->dev, "[%s] not support such sample rate %d\n", > + __func__, audio->sample_rate); > + return -ENOENT; > + } > + > + /* set_audio source I2S */ > + hdmi_writeb(hdmi, HDMI_AUDIO_CTRL1, 0x01); > + hdmi_writeb(hdmi, AUDIO_SAMPLE_RATE, rate); > + hdmi_writeb(hdmi, AUDIO_I2S_MODE, v_I2S_MODE(I2S_STANDARD) | > + v_I2S_CHANNEL(channel)); > + > + hdmi_writeb(hdmi, AUDIO_I2S_MAP, 0x00); > + hdmi_writeb(hdmi, AUDIO_I2S_SWAPS_SPDIF, 0); > + > + /* Set N value */ > + hdmi_writeb(hdmi, AUDIO_N_H, (N >> 16) & 0x0F); > + hdmi_writeb(hdmi, AUDIO_N_M, (N >> 8) & 0xFF); > + hdmi_writeb(hdmi, AUDIO_N_L, N & 0xFF); > + > + /*Set hdmi nlpcm mode to support hdmi bitstream*/ > + hdmi_writeb(hdmi, HDMI_AUDIO_CHANNEL_STATUS, v_AUDIO_STATUS_NLPCM(0)); > + > + return inno_hdmi_config_audio_aai(hdmi, audio); > +} > + > +static int inno_hdmi_audio_hw_params(struct device *dev, > + struct hdmi_codec_daifmt *daifmt, > + struct hdmi_codec_params *params) > +{ > + struct inno_hdmi *hdmi = dev_get_drvdata(dev); > + struct audio_info audio = { > + .sample_width = params->sample_width, > + .sample_rate = params->sample_rate, > + .channels = params->channels, > + }; > + > + if (!hdmi->hdmi_data.sink_has_audio) { > + dev_err(hdmi->dev, "Sink do not support audio!\n"); > + return -ENODEV; > + } > + > + if (!hdmi->encoder.crtc) > + return -ENODEV; > + > + switch (daifmt->fmt) { > + case HDMI_I2S: > + break; > + default: > + dev_err(dev, "%s: Invalid format %d\n", __func__, daifmt->fmt); > + return -EINVAL; > + } > + > + return inno_hdmi_audio_config_set(hdmi, &audio); > +} > + > +static void inno_hdmi_audio_shutdown(struct device *dev) > +{ > + /* do nothing */ > +} > + > +static int inno_hdmi_audio_digital_mute(struct device *dev, bool mute) > +{ > + struct inno_hdmi *hdmi = dev_get_drvdata(dev); > + > + if (!hdmi->hdmi_data.sink_has_audio) { > + dev_err(hdmi->dev, "Sink do not support audio!\n"); > + return -ENODEV; > + } > + > + hdmi->audio_enable = !mute; > + > + if (mute) > + hdmi_modb(hdmi, HDMI_AV_MUTE, m_AUDIO_MUTE | m_AUDIO_PD, > + v_AUDIO_MUTE(1) | v_AUDIO_PD(1)); > + else > + hdmi_modb(hdmi, HDMI_AV_MUTE, m_AUDIO_MUTE | m_AUDIO_PD, > + v_AUDIO_MUTE(0) | v_AUDIO_PD(0)); > + > + return 0; > +} > + > +static int inno_hdmi_audio_get_eld(struct device *dev, uint8_t *buf, size_t len) > +{ > + struct inno_hdmi *hdmi = dev_get_drvdata(dev); > + struct drm_mode_config *config = &hdmi->encoder.dev->mode_config; > + struct drm_connector *connector; > + int ret = -ENODEV; > + > + mutex_lock(&config->mutex); > + list_for_each_entry(connector, &config->connector_list, head) { > + if (&hdmi->encoder == connector->encoder) { > + memcpy(buf, connector->eld, > + min(sizeof(connector->eld), len)); > + ret = 0; > + } > + } > + mutex_unlock(&config->mutex); > + > + return ret; > +} > + > +static const struct hdmi_codec_ops audio_codec_ops = { > + .hw_params = inno_hdmi_audio_hw_params, > + .audio_shutdown = inno_hdmi_audio_shutdown, > + .digital_mute = inno_hdmi_audio_digital_mute, > + .get_eld = inno_hdmi_audio_get_eld, > +}; > + > +static int inno_hdmi_audio_codec_init(struct inno_hdmi *hdmi, > + struct device *dev) > +{ > + struct hdmi_codec_pdata codec_data = { > + .i2s = 1, > + .ops = &audio_codec_ops, > + .max_i2s_channels = 8, > + }; > + > + hdmi->audio_enable = false; > + hdmi->audio_pdev = platform_device_register_data( > + dev, HDMI_CODEC_DRV_NAME, PLATFORM_DEVID_NONE, > + &codec_data, sizeof(codec_data)); > + > + return PTR_ERR_OR_ZERO(hdmi->audio_pdev); > +} > + > static int inno_hdmi_register(struct drm_device *drm, struct inno_hdmi *hdmi) > { > struct drm_encoder *encoder = &hdmi->encoder; > @@ -645,6 +876,8 @@ static int inno_hdmi_register(struct drm_device *drm, struct inno_hdmi *hdmi) > > drm_mode_connector_attach_encoder(&hdmi->connector, encoder); > > + inno_hdmi_audio_codec_init(hdmi, dev); > + > return 0; > } > > diff --git a/drivers/gpu/drm/rockchip/inno_hdmi.h b/drivers/gpu/drm/rockchip/inno_hdmi.h > index aa7c415..8b23037 100644 > --- a/drivers/gpu/drm/rockchip/inno_hdmi.h > +++ b/drivers/gpu/drm/rockchip/inno_hdmi.h > @@ -104,11 +104,13 @@ enum { > #define HDMI_AV_MUTE 0x05 > #define m_AVMUTE_CLEAR (1 << 7) > #define m_AVMUTE_ENABLE (1 << 6) > +#define m_AUDIO_PD (1 << 2) > #define m_AUDIO_MUTE (1 << 1) > #define m_VIDEO_BLACK (1 << 0) > #define v_AVMUTE_CLEAR(n) (n << 7) > #define v_AVMUTE_ENABLE(n) (n << 6) > #define v_AUDIO_MUTE(n) (n << 1) > +#define v_AUDIO_PD(n) (n << 2) > #define v_VIDEO_MUTE(n) (n << 0) > > #define HDMI_VIDEO_TIMING_CTL 0x08 -- ?ark Yao From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753780AbcHDCKM (ORCPT ); Wed, 3 Aug 2016 22:10:12 -0400 Received: from regular1.263xmail.com ([211.150.99.131]:36482 "EHLO regular1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752165AbcHDCKK (ORCPT ); Wed, 3 Aug 2016 22:10:10 -0400 X-263anti-spam: KSV:0; X-MAIL-GRAY: 0 X-MAIL-DELIVERY: 1 X-KSVirus-check: 0 X-ABS-CHECKED: 4 X-ADDR-CHECKED: 0 X-RL-SENDER: mark.yao@rock-chips.com X-FST-TO: linux-arm-kernel@lists.infradead.org X-SENDER-IP: 58.22.7.114 X-LOGIN-NAME: mark.yao@rock-chips.com X-UNIQUE-TAG: <195cc0d32838100ff4d7207888d64075> X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 Subject: Re: [PATCH 1/3] drm/rockchip: inno_hdmi: add audio support To: Yakir Yang , Heiko Stuebner References: <1465997312-17777-1-git-send-email-ykk@rock-chips.com> Cc: Russell King , David Airlie , Thierry Reding , Rob Herring , Ken Mixte , Ben Chan , Zheng Yang , Kumar Gala , Ian Campbell , Pawel Moll , Mark Rutland , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org From: Mark yao Message-ID: <57A2A1F7.2080405@rock-chips.com> Date: Thu, 4 Aug 2016 10:01:27 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 In-Reply-To: <1465997312-17777-1-git-send-email-ykk@rock-chips.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Yakir After apply your patch, I got following warning messge: drivers/gpu/drm/rockchip/inno_hdmi.c:818:2: warning: initialization from incompatible pointer type [enabled by default] drivers/gpu/drm/rockchip/inno_hdmi.c:818:2: warning: (near initialization for 'audio_codec_ops.hw_params') [enabled by default] drivers/gpu/drm/rockchip/inno_hdmi.c:819:2: warning: initialization from incompatible pointer type [enabled by default] drivers/gpu/drm/rockchip/inno_hdmi.c:819:2: warning: (near initialization for 'audio_codec_ops.audio_shutdown') [enabled by default] drivers/gpu/drm/rockchip/inno_hdmi.c:820:2: warning: initialization from incompatible pointer type [enabled by default] drivers/gpu/drm/rockchip/inno_hdmi.c:820:2: warning: (near initialization for 'audio_codec_ops.digital_mute') [enabled by default] drivers/gpu/drm/rockchip/inno_hdmi.c:821:2: warning: initialization from incompatible pointer type [enabled by default] drivers/gpu/drm/rockchip/inno_hdmi.c:821:2: warning: (near initialization for 'audio_codec_ops.get_eld') [enabled by default] since the commit "efc9194 ASoC: hdmi-codec: callback function will be called with private data", the hdmi_codec_ops had some changes. Can you rebase your patch to the newest kernel? Thanks. On 2016年06月15日 21:28, Yakir Yang wrote: > Using the common hdmi-codec driver to support hdmi audio function. > > Signed-off-by: Yakir Yang > --- > drivers/gpu/drm/rockchip/inno_hdmi.c | 237 ++++++++++++++++++++++++++++++++++- > drivers/gpu/drm/rockchip/inno_hdmi.h | 2 + > 2 files changed, 237 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/rockchip/inno_hdmi.c b/drivers/gpu/drm/rockchip/inno_hdmi.c > index f8b4feb..c31dc07 100644 > --- a/drivers/gpu/drm/rockchip/inno_hdmi.c > +++ b/drivers/gpu/drm/rockchip/inno_hdmi.c > @@ -29,6 +29,8 @@ > #include > #include > > +#include > + > #include "rockchip_drm_drv.h" > #include "rockchip_drm_vop.h" > > @@ -36,6 +38,12 @@ > > #define to_inno_hdmi(x) container_of(x, struct inno_hdmi, x) > > +struct audio_info { > + int sample_rate; > + int channels; > + int sample_width; > +}; > + > struct hdmi_data_info { > int vic; > bool sink_is_hdmi; > @@ -71,6 +79,9 @@ struct inno_hdmi { > > unsigned int tmds_rate; > > + struct platform_device *audio_pdev; > + bool audio_enable; > + > struct hdmi_data_info hdmi_data; > struct drm_display_mode previous_mode; > }; > @@ -306,6 +317,57 @@ static int inno_hdmi_config_video_avi(struct inno_hdmi *hdmi, > return inno_hdmi_upload_frame(hdmi, rc, &frame, INFOFRAME_AVI, 0, 0, 0); > } > > +static int inno_hdmi_config_audio_aai(struct inno_hdmi *hdmi, > + struct audio_info *audio) > +{ > + struct hdmi_audio_infoframe *faudio; > + union hdmi_infoframe frame; > + int rc; > + > + rc = hdmi_audio_infoframe_init(&frame.audio); > + faudio = (struct hdmi_audio_infoframe *)&frame; > + > + faudio->channels = audio->channels; > + > + switch (audio->sample_width) { > + case 16: > + faudio->sample_size = HDMI_AUDIO_SAMPLE_SIZE_16; > + break; > + case 20: > + faudio->sample_size = HDMI_AUDIO_SAMPLE_SIZE_20; > + break; > + case 24: > + faudio->sample_size = HDMI_AUDIO_SAMPLE_SIZE_24; > + break; > + } > + > + switch (audio->sample_rate) { > + case 32000: > + faudio->sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_32000; > + break; > + case 44100: > + faudio->sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_44100; > + break; > + case 48000: > + faudio->sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_48000; > + break; > + case 88200: > + faudio->sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_88200; > + break; > + case 96000: > + faudio->sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_96000; > + break; > + case 176400: > + faudio->sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_176400; > + break; > + case 192000: > + faudio->sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_192000; > + break; > + } > + > + return inno_hdmi_upload_frame(hdmi, rc, &frame, INFOFRAME_AAI, 0, 0, 0); > +} > + > static int inno_hdmi_config_video_csc(struct inno_hdmi *hdmi) > { > struct hdmi_data_info *data = &hdmi->hdmi_data; > @@ -478,8 +540,9 @@ static int inno_hdmi_setup(struct inno_hdmi *hdmi, > inno_hdmi_i2c_init(hdmi); > > /* Unmute video and audio output */ > - hdmi_modb(hdmi, HDMI_AV_MUTE, m_AUDIO_MUTE | m_VIDEO_BLACK, > - v_AUDIO_MUTE(0) | v_VIDEO_MUTE(0)); > + hdmi_modb(hdmi, HDMI_AV_MUTE, m_VIDEO_BLACK, v_VIDEO_MUTE(0)); > + if (hdmi->audio_enable) > + hdmi_modb(hdmi, HDMI_AV_MUTE, m_AUDIO_MUTE, v_AUDIO_MUTE(0)); > > return 0; > } > @@ -616,6 +679,174 @@ static struct drm_connector_helper_funcs inno_hdmi_connector_helper_funcs = { > .best_encoder = inno_hdmi_connector_best_encoder, > }; > > +int inno_hdmi_audio_config_set(struct inno_hdmi *hdmi, struct audio_info *audio) > +{ > + int rate, N, channel; > + > + if (audio->channels < 3) > + channel = I2S_CHANNEL_1_2; > + else if (audio->channels < 5) > + channel = I2S_CHANNEL_3_4; > + else if (audio->channels < 7) > + channel = I2S_CHANNEL_5_6; > + else > + channel = I2S_CHANNEL_7_8; > + > + switch (audio->sample_rate) { > + case 32000: > + rate = AUDIO_32K; > + N = N_32K; > + break; > + case 44100: > + rate = AUDIO_441K; > + N = N_441K; > + break; > + case 48000: > + rate = AUDIO_48K; > + N = N_48K; > + break; > + case 88200: > + rate = AUDIO_882K; > + N = N_882K; > + break; > + case 96000: > + rate = AUDIO_96K; > + N = N_96K; > + break; > + case 176400: > + rate = AUDIO_1764K; > + N = N_1764K; > + break; > + case 192000: > + rate = AUDIO_192K; > + N = N_192K; > + break; > + default: > + dev_err(hdmi->dev, "[%s] not support such sample rate %d\n", > + __func__, audio->sample_rate); > + return -ENOENT; > + } > + > + /* set_audio source I2S */ > + hdmi_writeb(hdmi, HDMI_AUDIO_CTRL1, 0x01); > + hdmi_writeb(hdmi, AUDIO_SAMPLE_RATE, rate); > + hdmi_writeb(hdmi, AUDIO_I2S_MODE, v_I2S_MODE(I2S_STANDARD) | > + v_I2S_CHANNEL(channel)); > + > + hdmi_writeb(hdmi, AUDIO_I2S_MAP, 0x00); > + hdmi_writeb(hdmi, AUDIO_I2S_SWAPS_SPDIF, 0); > + > + /* Set N value */ > + hdmi_writeb(hdmi, AUDIO_N_H, (N >> 16) & 0x0F); > + hdmi_writeb(hdmi, AUDIO_N_M, (N >> 8) & 0xFF); > + hdmi_writeb(hdmi, AUDIO_N_L, N & 0xFF); > + > + /*Set hdmi nlpcm mode to support hdmi bitstream*/ > + hdmi_writeb(hdmi, HDMI_AUDIO_CHANNEL_STATUS, v_AUDIO_STATUS_NLPCM(0)); > + > + return inno_hdmi_config_audio_aai(hdmi, audio); > +} > + > +static int inno_hdmi_audio_hw_params(struct device *dev, > + struct hdmi_codec_daifmt *daifmt, > + struct hdmi_codec_params *params) > +{ > + struct inno_hdmi *hdmi = dev_get_drvdata(dev); > + struct audio_info audio = { > + .sample_width = params->sample_width, > + .sample_rate = params->sample_rate, > + .channels = params->channels, > + }; > + > + if (!hdmi->hdmi_data.sink_has_audio) { > + dev_err(hdmi->dev, "Sink do not support audio!\n"); > + return -ENODEV; > + } > + > + if (!hdmi->encoder.crtc) > + return -ENODEV; > + > + switch (daifmt->fmt) { > + case HDMI_I2S: > + break; > + default: > + dev_err(dev, "%s: Invalid format %d\n", __func__, daifmt->fmt); > + return -EINVAL; > + } > + > + return inno_hdmi_audio_config_set(hdmi, &audio); > +} > + > +static void inno_hdmi_audio_shutdown(struct device *dev) > +{ > + /* do nothing */ > +} > + > +static int inno_hdmi_audio_digital_mute(struct device *dev, bool mute) > +{ > + struct inno_hdmi *hdmi = dev_get_drvdata(dev); > + > + if (!hdmi->hdmi_data.sink_has_audio) { > + dev_err(hdmi->dev, "Sink do not support audio!\n"); > + return -ENODEV; > + } > + > + hdmi->audio_enable = !mute; > + > + if (mute) > + hdmi_modb(hdmi, HDMI_AV_MUTE, m_AUDIO_MUTE | m_AUDIO_PD, > + v_AUDIO_MUTE(1) | v_AUDIO_PD(1)); > + else > + hdmi_modb(hdmi, HDMI_AV_MUTE, m_AUDIO_MUTE | m_AUDIO_PD, > + v_AUDIO_MUTE(0) | v_AUDIO_PD(0)); > + > + return 0; > +} > + > +static int inno_hdmi_audio_get_eld(struct device *dev, uint8_t *buf, size_t len) > +{ > + struct inno_hdmi *hdmi = dev_get_drvdata(dev); > + struct drm_mode_config *config = &hdmi->encoder.dev->mode_config; > + struct drm_connector *connector; > + int ret = -ENODEV; > + > + mutex_lock(&config->mutex); > + list_for_each_entry(connector, &config->connector_list, head) { > + if (&hdmi->encoder == connector->encoder) { > + memcpy(buf, connector->eld, > + min(sizeof(connector->eld), len)); > + ret = 0; > + } > + } > + mutex_unlock(&config->mutex); > + > + return ret; > +} > + > +static const struct hdmi_codec_ops audio_codec_ops = { > + .hw_params = inno_hdmi_audio_hw_params, > + .audio_shutdown = inno_hdmi_audio_shutdown, > + .digital_mute = inno_hdmi_audio_digital_mute, > + .get_eld = inno_hdmi_audio_get_eld, > +}; > + > +static int inno_hdmi_audio_codec_init(struct inno_hdmi *hdmi, > + struct device *dev) > +{ > + struct hdmi_codec_pdata codec_data = { > + .i2s = 1, > + .ops = &audio_codec_ops, > + .max_i2s_channels = 8, > + }; > + > + hdmi->audio_enable = false; > + hdmi->audio_pdev = platform_device_register_data( > + dev, HDMI_CODEC_DRV_NAME, PLATFORM_DEVID_NONE, > + &codec_data, sizeof(codec_data)); > + > + return PTR_ERR_OR_ZERO(hdmi->audio_pdev); > +} > + > static int inno_hdmi_register(struct drm_device *drm, struct inno_hdmi *hdmi) > { > struct drm_encoder *encoder = &hdmi->encoder; > @@ -645,6 +876,8 @@ static int inno_hdmi_register(struct drm_device *drm, struct inno_hdmi *hdmi) > > drm_mode_connector_attach_encoder(&hdmi->connector, encoder); > > + inno_hdmi_audio_codec_init(hdmi, dev); > + > return 0; > } > > diff --git a/drivers/gpu/drm/rockchip/inno_hdmi.h b/drivers/gpu/drm/rockchip/inno_hdmi.h > index aa7c415..8b23037 100644 > --- a/drivers/gpu/drm/rockchip/inno_hdmi.h > +++ b/drivers/gpu/drm/rockchip/inno_hdmi.h > @@ -104,11 +104,13 @@ enum { > #define HDMI_AV_MUTE 0x05 > #define m_AVMUTE_CLEAR (1 << 7) > #define m_AVMUTE_ENABLE (1 << 6) > +#define m_AUDIO_PD (1 << 2) > #define m_AUDIO_MUTE (1 << 1) > #define m_VIDEO_BLACK (1 << 0) > #define v_AVMUTE_CLEAR(n) (n << 7) > #define v_AVMUTE_ENABLE(n) (n << 6) > #define v_AUDIO_MUTE(n) (n << 1) > +#define v_AUDIO_PD(n) (n << 2) > #define v_VIDEO_MUTE(n) (n << 0) > > #define HDMI_VIDEO_TIMING_CTL 0x08 -- Mark Yao