From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yakir Yang Subject: Re: [PATCH 1/3] drm/rockchip: inno_hdmi: add audio support Date: Thu, 4 Aug 2016 10:11:53 +0800 Message-ID: <57A2A469.3040308@rock-chips.com> References: <1465997312-17777-1-git-send-email-ykk@rock-chips.com> <57A2A1F7.2080405@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: <57A2A1F7.2080405@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: Mark yao , 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 TWFyaywKCgpHb3QgaXQsIHdvdWxkIHJlYmFzZSBzb29uZXN0IDotKQoKClRoYW5rcywKLSBZYWtp cgoKT24gMDgvMDQvMjAxNiAxMDowMSBBTSwgTWFyayB5YW8gd3JvdGU6Cj4gSGkgWWFraXIKPgo+ IEFmdGVyIGFwcGx5IHlvdXIgcGF0Y2gsIEkgZ290IGZvbGxvd2luZyB3YXJuaW5nIG1lc3NnZToK Pgo+IGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9pbm5vX2hkbWkuYzo4MTg6Mjogd2FybmluZzog aW5pdGlhbGl6YXRpb24gCj4gZnJvbSBpbmNvbXBhdGlibGUgcG9pbnRlciB0eXBlIFtlbmFibGVk IGJ5IGRlZmF1bHRdCj4gZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2lubm9faGRtaS5jOjgxODoy OiB3YXJuaW5nOiAobmVhciAKPiBpbml0aWFsaXphdGlvbiBmb3IgJ2F1ZGlvX2NvZGVjX29wcy5o d19wYXJhbXMnKSBbZW5hYmxlZCBieSBkZWZhdWx0XQo+IGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hp cC9pbm5vX2hkbWkuYzo4MTk6Mjogd2FybmluZzogaW5pdGlhbGl6YXRpb24gCj4gZnJvbSBpbmNv bXBhdGlibGUgcG9pbnRlciB0eXBlIFtlbmFibGVkIGJ5IGRlZmF1bHRdCj4gZHJpdmVycy9ncHUv ZHJtL3JvY2tjaGlwL2lubm9faGRtaS5jOjgxOToyOiB3YXJuaW5nOiAobmVhciAKPiBpbml0aWFs aXphdGlvbiBmb3IgJ2F1ZGlvX2NvZGVjX29wcy5hdWRpb19zaHV0ZG93bicpIFtlbmFibGVkIGJ5 IGRlZmF1bHRdCj4gZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2lubm9faGRtaS5jOjgyMDoyOiB3 YXJuaW5nOiBpbml0aWFsaXphdGlvbiAKPiBmcm9tIGluY29tcGF0aWJsZSBwb2ludGVyIHR5cGUg W2VuYWJsZWQgYnkgZGVmYXVsdF0KPiBkcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvaW5ub19oZG1p LmM6ODIwOjI6IHdhcm5pbmc6IChuZWFyIAo+IGluaXRpYWxpemF0aW9uIGZvciAnYXVkaW9fY29k ZWNfb3BzLmRpZ2l0YWxfbXV0ZScpIFtlbmFibGVkIGJ5IGRlZmF1bHRdCj4gZHJpdmVycy9ncHUv ZHJtL3JvY2tjaGlwL2lubm9faGRtaS5jOjgyMToyOiB3YXJuaW5nOiBpbml0aWFsaXphdGlvbiAK PiBmcm9tIGluY29tcGF0aWJsZSBwb2ludGVyIHR5cGUgW2VuYWJsZWQgYnkgZGVmYXVsdF0KPiBk cml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvaW5ub19oZG1pLmM6ODIxOjI6IHdhcm5pbmc6IChuZWFy IAo+IGluaXRpYWxpemF0aW9uIGZvciAnYXVkaW9fY29kZWNfb3BzLmdldF9lbGQnKSBbZW5hYmxl ZCBieSBkZWZhdWx0XQo+Cj4gc2luY2UgdGhlIGNvbW1pdCAiZWZjOTE5NCBBU29DOiBoZG1pLWNv ZGVjOiBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIAo+IGNhbGxlZCB3aXRoIHByaXZhdGUgZGF0 YSIsCj4gdGhlIGhkbWlfY29kZWNfb3BzIGhhZCBzb21lIGNoYW5nZXMuCj4gQ2FuIHlvdSByZWJh c2UgeW91ciBwYXRjaCB0byB0aGUgbmV3ZXN0IGtlcm5lbD8KPgo+IFRoYW5rcy4KPiBPbiAyMDE2 5bm0MDbmnIgxNeaXpSAyMToyOCwgWWFraXIgWWFuZyB3cm90ZToKPj4gVXNpbmcgdGhlIGNvbW1v biBoZG1pLWNvZGVjIGRyaXZlciB0byBzdXBwb3J0IGhkbWkgYXVkaW8gZnVuY3Rpb24uCj4+Cj4+ IFNpZ25lZC1vZmYtYnk6IFlha2lyIFlhbmcgPHlra0Byb2NrLWNoaXBzLmNvbT4KPj4gLS0tCj4+ ICAgZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2lubm9faGRtaS5jIHwgMjM3IAo+PiArKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrLQo+PiAgIGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hp cC9pbm5vX2hkbWkuaCB8ICAgMiArCj4+ICAgMiBmaWxlcyBjaGFuZ2VkLCAyMzcgaW5zZXJ0aW9u cygrKSwgMiBkZWxldGlvbnMoLSkKPj4KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9y b2NrY2hpcC9pbm5vX2hkbWkuYyAKPj4gYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvaW5ub19o ZG1pLmMKPj4gaW5kZXggZjhiNGZlYi4uYzMxZGMwNyAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9n cHUvZHJtL3JvY2tjaGlwL2lubm9faGRtaS5jCj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yb2Nr Y2hpcC9pbm5vX2hkbWkuYwo+PiBAQCAtMjksNiArMjksOCBAQAo+PiAgICNpbmNsdWRlIDxkcm0v ZHJtX2NydGNfaGVscGVyLmg+Cj4+ICAgI2luY2x1ZGUgPGRybS9kcm1fZWRpZC5oPgo+PiAgICsj aW5jbHVkZSA8c291bmQvaGRtaS1jb2RlYy5oPgo+PiArCj4+ICAgI2luY2x1ZGUgInJvY2tjaGlw X2RybV9kcnYuaCIKPj4gICAjaW5jbHVkZSAicm9ja2NoaXBfZHJtX3ZvcC5oIgo+PiAgIEBAIC0z Niw2ICszOCwxMiBAQAo+PiAgICAgI2RlZmluZSB0b19pbm5vX2hkbWkoeCkgICAgY29udGFpbmVy X29mKHgsIHN0cnVjdCBpbm5vX2hkbWksIHgpCj4+ICAgK3N0cnVjdCBhdWRpb19pbmZvIHsKPj4g KyAgICBpbnQgc2FtcGxlX3JhdGU7Cj4+ICsgICAgaW50IGNoYW5uZWxzOwo+PiArICAgIGludCBz YW1wbGVfd2lkdGg7Cj4+ICt9Owo+PiArCj4+ICAgc3RydWN0IGhkbWlfZGF0YV9pbmZvIHsKPj4g ICAgICAgaW50IHZpYzsKPj4gICAgICAgYm9vbCBzaW5rX2lzX2hkbWk7Cj4+IEBAIC03MSw2ICs3 OSw5IEBAIHN0cnVjdCBpbm5vX2hkbWkgewo+PiAgICAgICAgIHVuc2lnbmVkIGludCB0bWRzX3Jh dGU7Cj4+ICAgKyAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphdWRpb19wZGV2Owo+PiArICAg IGJvb2wgYXVkaW9fZW5hYmxlOwo+PiArCj4+ICAgICAgIHN0cnVjdCBoZG1pX2RhdGFfaW5mbyAg ICBoZG1pX2RhdGE7Cj4+ICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIHByZXZpb3VzX21v ZGU7Cj4+ICAgfTsKPj4gQEAgLTMwNiw2ICszMTcsNTcgQEAgc3RhdGljIGludCBpbm5vX2hkbWlf Y29uZmlnX3ZpZGVvX2F2aShzdHJ1Y3QgCj4+IGlubm9faGRtaSAqaGRtaSwKPj4gICAgICAgcmV0 dXJuIGlubm9faGRtaV91cGxvYWRfZnJhbWUoaGRtaSwgcmMsICZmcmFtZSwgSU5GT0ZSQU1FX0FW SSwgCj4+IDAsIDAsIDApOwo+PiAgIH0KPj4gICArc3RhdGljIGludCBpbm5vX2hkbWlfY29uZmln X2F1ZGlvX2FhaShzdHJ1Y3QgaW5ub19oZG1pICpoZG1pLAo+PiArICAgICAgICAgICAgICAgICAg ICAgIHN0cnVjdCBhdWRpb19pbmZvICphdWRpbykKPj4gK3sKPj4gKyAgICBzdHJ1Y3QgaGRtaV9h dWRpb19pbmZvZnJhbWUgKmZhdWRpbzsKPj4gKyAgICB1bmlvbiBoZG1pX2luZm9mcmFtZSBmcmFt ZTsKPj4gKyAgICBpbnQgcmM7Cj4+ICsKPj4gKyAgICByYyA9IGhkbWlfYXVkaW9faW5mb2ZyYW1l X2luaXQoJmZyYW1lLmF1ZGlvKTsKPj4gKyAgICBmYXVkaW8gPSAoc3RydWN0IGhkbWlfYXVkaW9f aW5mb2ZyYW1lICopJmZyYW1lOwo+PiArCj4+ICsgICAgZmF1ZGlvLT5jaGFubmVscyA9IGF1ZGlv LT5jaGFubmVsczsKPj4gKwo+PiArICAgIHN3aXRjaCAoYXVkaW8tPnNhbXBsZV93aWR0aCkgewo+ PiArICAgIGNhc2UgMTY6Cj4+ICsgICAgICAgIGZhdWRpby0+c2FtcGxlX3NpemUgPSBIRE1JX0FV RElPX1NBTVBMRV9TSVpFXzE2Owo+PiArICAgICAgICBicmVhazsKPj4gKyAgICBjYXNlIDIwOgo+ PiArICAgICAgICBmYXVkaW8tPnNhbXBsZV9zaXplID0gSERNSV9BVURJT19TQU1QTEVfU0laRV8y MDsKPj4gKyAgICAgICAgYnJlYWs7Cj4+ICsgICAgY2FzZSAyNDoKPj4gKyAgICAgICAgZmF1ZGlv LT5zYW1wbGVfc2l6ZSA9IEhETUlfQVVESU9fU0FNUExFX1NJWkVfMjQ7Cj4+ICsgICAgICAgIGJy ZWFrOwo+PiArICAgIH0KPj4gKwo+PiArICAgIHN3aXRjaCAoYXVkaW8tPnNhbXBsZV9yYXRlKSB7 Cj4+ICsgICAgY2FzZSAzMjAwMDoKPj4gKyAgICAgICAgZmF1ZGlvLT5zYW1wbGVfZnJlcXVlbmN5 ID0gSERNSV9BVURJT19TQU1QTEVfRlJFUVVFTkNZXzMyMDAwOwo+PiArICAgICAgICBicmVhazsK Pj4gKyAgICBjYXNlIDQ0MTAwOgo+PiArICAgICAgICBmYXVkaW8tPnNhbXBsZV9mcmVxdWVuY3kg PSBIRE1JX0FVRElPX1NBTVBMRV9GUkVRVUVOQ1lfNDQxMDA7Cj4+ICsgICAgICAgIGJyZWFrOwo+ PiArICAgIGNhc2UgNDgwMDA6Cj4+ICsgICAgICAgIGZhdWRpby0+c2FtcGxlX2ZyZXF1ZW5jeSA9 IEhETUlfQVVESU9fU0FNUExFX0ZSRVFVRU5DWV80ODAwMDsKPj4gKyAgICAgICAgYnJlYWs7Cj4+ ICsgICAgY2FzZSA4ODIwMDoKPj4gKyAgICAgICAgZmF1ZGlvLT5zYW1wbGVfZnJlcXVlbmN5ID0g SERNSV9BVURJT19TQU1QTEVfRlJFUVVFTkNZXzg4MjAwOwo+PiArICAgICAgICBicmVhazsKPj4g KyAgICBjYXNlIDk2MDAwOgo+PiArICAgICAgICBmYXVkaW8tPnNhbXBsZV9mcmVxdWVuY3kgPSBI RE1JX0FVRElPX1NBTVBMRV9GUkVRVUVOQ1lfOTYwMDA7Cj4+ICsgICAgICAgIGJyZWFrOwo+PiAr ICAgIGNhc2UgMTc2NDAwOgo+PiArICAgICAgICBmYXVkaW8tPnNhbXBsZV9mcmVxdWVuY3kgPSBI RE1JX0FVRElPX1NBTVBMRV9GUkVRVUVOQ1lfMTc2NDAwOwo+PiArICAgICAgICBicmVhazsKPj4g KyAgICBjYXNlIDE5MjAwMDoKPj4gKyAgICAgICAgZmF1ZGlvLT5zYW1wbGVfZnJlcXVlbmN5ID0g SERNSV9BVURJT19TQU1QTEVfRlJFUVVFTkNZXzE5MjAwMDsKPj4gKyAgICAgICAgYnJlYWs7Cj4+ ICsgICAgfQo+PiArCj4+ICsgICAgcmV0dXJuIGlubm9faGRtaV91cGxvYWRfZnJhbWUoaGRtaSwg cmMsICZmcmFtZSwgSU5GT0ZSQU1FX0FBSSwgCj4+IDAsIDAsIDApOwo+PiArfQo+PiArCj4+ICAg c3RhdGljIGludCBpbm5vX2hkbWlfY29uZmlnX3ZpZGVvX2NzYyhzdHJ1Y3QgaW5ub19oZG1pICpo ZG1pKQo+PiAgIHsKPj4gICAgICAgc3RydWN0IGhkbWlfZGF0YV9pbmZvICpkYXRhID0gJmhkbWkt PmhkbWlfZGF0YTsKPj4gQEAgLTQ3OCw4ICs1NDAsOSBAQCBzdGF0aWMgaW50IGlubm9faGRtaV9z ZXR1cChzdHJ1Y3QgaW5ub19oZG1pICpoZG1pLAo+PiAgICAgICBpbm5vX2hkbWlfaTJjX2luaXQo aGRtaSk7Cj4+ICAgICAgICAgLyogVW5tdXRlIHZpZGVvIGFuZCBhdWRpbyBvdXRwdXQgKi8KPj4g LSAgICBoZG1pX21vZGIoaGRtaSwgSERNSV9BVl9NVVRFLCBtX0FVRElPX01VVEUgfCBtX1ZJREVP X0JMQUNLLAo+PiAtICAgICAgICAgIHZfQVVESU9fTVVURSgwKSB8IHZfVklERU9fTVVURSgwKSk7 Cj4+ICsgICAgaGRtaV9tb2RiKGhkbWksIEhETUlfQVZfTVVURSwgbV9WSURFT19CTEFDSywgdl9W SURFT19NVVRFKDApKTsKPj4gKyAgICBpZiAoaGRtaS0+YXVkaW9fZW5hYmxlKQo+PiArICAgICAg ICBoZG1pX21vZGIoaGRtaSwgSERNSV9BVl9NVVRFLCBtX0FVRElPX01VVEUsIHZfQVVESU9fTVVU RSgwKSk7Cj4+ICAgICAgICAgcmV0dXJuIDA7Cj4+ICAgfQo+PiBAQCAtNjE2LDYgKzY3OSwxNzQg QEAgc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyAKPj4gaW5ub19oZG1p X2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7Cj4+ICAgICAgIC5iZXN0X2VuY29kZXIgPSBpbm5v X2hkbWlfY29ubmVjdG9yX2Jlc3RfZW5jb2RlciwKPj4gICB9Owo+PiAgICtpbnQgaW5ub19oZG1p X2F1ZGlvX2NvbmZpZ19zZXQoc3RydWN0IGlubm9faGRtaSAqaGRtaSwgc3RydWN0IAo+PiBhdWRp b19pbmZvICphdWRpbykKPj4gK3sKPj4gKyAgICBpbnQgcmF0ZSwgTiwgY2hhbm5lbDsKPj4gKwo+ PiArICAgIGlmIChhdWRpby0+Y2hhbm5lbHMgPCAzKQo+PiArICAgICAgICBjaGFubmVsID0gSTJT X0NIQU5ORUxfMV8yOwo+PiArICAgIGVsc2UgaWYgKGF1ZGlvLT5jaGFubmVscyA8IDUpCj4+ICsg ICAgICAgIGNoYW5uZWwgPSBJMlNfQ0hBTk5FTF8zXzQ7Cj4+ICsgICAgZWxzZSBpZiAoYXVkaW8t PmNoYW5uZWxzIDwgNykKPj4gKyAgICAgICAgY2hhbm5lbCA9IEkyU19DSEFOTkVMXzVfNjsKPj4g KyAgICBlbHNlCj4+ICsgICAgICAgIGNoYW5uZWwgPSBJMlNfQ0hBTk5FTF83Xzg7Cj4+ICsKPj4g KyAgICBzd2l0Y2ggKGF1ZGlvLT5zYW1wbGVfcmF0ZSkgewo+PiArICAgIGNhc2UgMzIwMDA6Cj4+ ICsgICAgICAgIHJhdGUgPSBBVURJT18zMks7Cj4+ICsgICAgICAgIE4gPSBOXzMySzsKPj4gKyAg ICAgICAgYnJlYWs7Cj4+ICsgICAgY2FzZSA0NDEwMDoKPj4gKyAgICAgICAgcmF0ZSA9IEFVRElP XzQ0MUs7Cj4+ICsgICAgICAgIE4gPSBOXzQ0MUs7Cj4+ICsgICAgICAgIGJyZWFrOwo+PiArICAg IGNhc2UgNDgwMDA6Cj4+ICsgICAgICAgIHJhdGUgPSBBVURJT180OEs7Cj4+ICsgICAgICAgIE4g PSBOXzQ4SzsKPj4gKyAgICAgICAgYnJlYWs7Cj4+ICsgICAgY2FzZSA4ODIwMDoKPj4gKyAgICAg ICAgcmF0ZSA9IEFVRElPXzg4Mks7Cj4+ICsgICAgICAgIE4gPSBOXzg4Mks7Cj4+ICsgICAgICAg IGJyZWFrOwo+PiArICAgIGNhc2UgOTYwMDA6Cj4+ICsgICAgICAgIHJhdGUgPSBBVURJT185Nks7 Cj4+ICsgICAgICAgIE4gPSBOXzk2SzsKPj4gKyAgICAgICAgYnJlYWs7Cj4+ICsgICAgY2FzZSAx NzY0MDA6Cj4+ICsgICAgICAgIHJhdGUgPSBBVURJT18xNzY0SzsKPj4gKyAgICAgICAgTiA9IE5f MTc2NEs7Cj4+ICsgICAgICAgIGJyZWFrOwo+PiArICAgIGNhc2UgMTkyMDAwOgo+PiArICAgICAg ICByYXRlID0gQVVESU9fMTkySzsKPj4gKyAgICAgICAgTiA9IE5fMTkySzsKPj4gKyAgICAgICAg YnJlYWs7Cj4+ICsgICAgZGVmYXVsdDoKPj4gKyAgICAgICAgZGV2X2VycihoZG1pLT5kZXYsICJb JXNdIG5vdCBzdXBwb3J0IHN1Y2ggc2FtcGxlIHJhdGUgJWRcbiIsCj4+ICsgICAgICAgICAgICBf X2Z1bmNfXywgYXVkaW8tPnNhbXBsZV9yYXRlKTsKPj4gKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7 Cj4+ICsgICAgfQo+PiArCj4+ICsgICAgLyogc2V0X2F1ZGlvIHNvdXJjZSBJMlMgKi8KPj4gKyAg ICBoZG1pX3dyaXRlYihoZG1pLCBIRE1JX0FVRElPX0NUUkwxLCAweDAxKTsKPj4gKyAgICBoZG1p X3dyaXRlYihoZG1pLCBBVURJT19TQU1QTEVfUkFURSwgcmF0ZSk7Cj4+ICsgICAgaGRtaV93cml0 ZWIoaGRtaSwgQVVESU9fSTJTX01PREUsIHZfSTJTX01PREUoSTJTX1NUQU5EQVJEKSB8Cj4+ICsg ICAgICAgICAgICB2X0kyU19DSEFOTkVMKGNoYW5uZWwpKTsKPj4gKwo+PiArICAgIGhkbWlfd3Jp dGViKGhkbWksIEFVRElPX0kyU19NQVAsIDB4MDApOwo+PiArICAgIGhkbWlfd3JpdGViKGhkbWks IEFVRElPX0kyU19TV0FQU19TUERJRiwgMCk7Cj4+ICsKPj4gKyAgICAvKiBTZXQgTiB2YWx1ZSAq Lwo+PiArICAgIGhkbWlfd3JpdGViKGhkbWksIEFVRElPX05fSCwgKE4gPj4gMTYpICYgMHgwRik7 Cj4+ICsgICAgaGRtaV93cml0ZWIoaGRtaSwgQVVESU9fTl9NLCAoTiA+PiA4KSAmIDB4RkYpOwo+ PiArICAgIGhkbWlfd3JpdGViKGhkbWksIEFVRElPX05fTCwgTiAmIDB4RkYpOwo+PiArCj4+ICsg ICAgLypTZXQgaGRtaSBubHBjbSBtb2RlIHRvIHN1cHBvcnQgaGRtaSBiaXRzdHJlYW0qLwo+PiAr ICAgIGhkbWlfd3JpdGViKGhkbWksIEhETUlfQVVESU9fQ0hBTk5FTF9TVEFUVVMsIAo+PiB2X0FV RElPX1NUQVRVU19OTFBDTSgwKSk7Cj4+ICsKPj4gKyAgICByZXR1cm4gaW5ub19oZG1pX2NvbmZp Z19hdWRpb19hYWkoaGRtaSwgYXVkaW8pOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IGlubm9f aGRtaV9hdWRpb19od19wYXJhbXMoc3RydWN0IGRldmljZSAqZGV2LAo+PiArICAgICAgICAgICAg ICAgICAgICAgc3RydWN0IGhkbWlfY29kZWNfZGFpZm10ICpkYWlmbXQsCj4+ICsgICAgICAgICAg ICAgICAgICAgICBzdHJ1Y3QgaGRtaV9jb2RlY19wYXJhbXMgKnBhcmFtcykKPj4gK3sKPj4gKyAg ICBzdHJ1Y3QgaW5ub19oZG1pICpoZG1pID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4+ICsgICAg c3RydWN0IGF1ZGlvX2luZm8gYXVkaW8gPSB7Cj4+ICsgICAgICAgIC5zYW1wbGVfd2lkdGggPSBw YXJhbXMtPnNhbXBsZV93aWR0aCwKPj4gKyAgICAgICAgLnNhbXBsZV9yYXRlID0gcGFyYW1zLT5z YW1wbGVfcmF0ZSwKPj4gKyAgICAgICAgLmNoYW5uZWxzID0gcGFyYW1zLT5jaGFubmVscywKPj4g KyAgICB9Owo+PiArCj4+ICsgICAgaWYgKCFoZG1pLT5oZG1pX2RhdGEuc2lua19oYXNfYXVkaW8p IHsKPj4gKyAgICAgICAgZGV2X2VycihoZG1pLT5kZXYsICJTaW5rIGRvIG5vdCBzdXBwb3J0IGF1 ZGlvIVxuIik7Cj4+ICsgICAgICAgIHJldHVybiAtRU5PREVWOwo+PiArICAgIH0KPj4gKwo+PiAr ICAgIGlmICghaGRtaS0+ZW5jb2Rlci5jcnRjKQo+PiArICAgICAgICByZXR1cm4gLUVOT0RFVjsK Pj4gKwo+PiArICAgIHN3aXRjaCAoZGFpZm10LT5mbXQpIHsKPj4gKyAgICBjYXNlIEhETUlfSTJT Ogo+PiArICAgICAgICBicmVhazsKPj4gKyAgICBkZWZhdWx0Ogo+PiArICAgICAgICBkZXZfZXJy KGRldiwgIiVzOiBJbnZhbGlkIGZvcm1hdCAlZFxuIiwgX19mdW5jX18sIGRhaWZtdC0+Zm10KTsK Pj4gKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4+ICsgICAgfQo+PiArCj4+ICsgICAgcmV0dXJu IGlubm9faGRtaV9hdWRpb19jb25maWdfc2V0KGhkbWksICZhdWRpbyk7Cj4+ICt9Cj4+ICsKPj4g K3N0YXRpYyB2b2lkIGlubm9faGRtaV9hdWRpb19zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYp Cj4+ICt7Cj4+ICsgICAgLyogZG8gbm90aGluZyAqLwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50 IGlubm9faGRtaV9hdWRpb19kaWdpdGFsX211dGUoc3RydWN0IGRldmljZSAqZGV2LCBib29sIG11 dGUpCj4+ICt7Cj4+ICsgICAgc3RydWN0IGlubm9faGRtaSAqaGRtaSA9IGRldl9nZXRfZHJ2ZGF0 YShkZXYpOwo+PiArCj4+ICsgICAgaWYgKCFoZG1pLT5oZG1pX2RhdGEuc2lua19oYXNfYXVkaW8p IHsKPj4gKyAgICAgICAgZGV2X2VycihoZG1pLT5kZXYsICJTaW5rIGRvIG5vdCBzdXBwb3J0IGF1 ZGlvIVxuIik7Cj4+ICsgICAgICAgIHJldHVybiAtRU5PREVWOwo+PiArICAgIH0KPj4gKwo+PiAr ICAgIGhkbWktPmF1ZGlvX2VuYWJsZSA9ICFtdXRlOwo+PiArCj4+ICsgICAgaWYgKG11dGUpCj4+ ICsgICAgICAgIGhkbWlfbW9kYihoZG1pLCBIRE1JX0FWX01VVEUsIG1fQVVESU9fTVVURSB8IG1f QVVESU9fUEQsCj4+ICsgICAgICAgICAgICAgIHZfQVVESU9fTVVURSgxKSB8IHZfQVVESU9fUEQo MSkpOwo+PiArICAgIGVsc2UKPj4gKyAgICAgICAgaGRtaV9tb2RiKGhkbWksIEhETUlfQVZfTVVU RSwgbV9BVURJT19NVVRFIHwgbV9BVURJT19QRCwKPj4gKyAgICAgICAgICAgICAgdl9BVURJT19N VVRFKDApIHwgdl9BVURJT19QRCgwKSk7Cj4+ICsKPj4gKyAgICByZXR1cm4gMDsKPj4gK30KPj4g Kwo+PiArc3RhdGljIGludCBpbm5vX2hkbWlfYXVkaW9fZ2V0X2VsZChzdHJ1Y3QgZGV2aWNlICpk ZXYsIHVpbnQ4X3QgKmJ1ZiwgCj4+IHNpemVfdCBsZW4pCj4+ICt7Cj4+ICsgICAgc3RydWN0IGlu bm9faGRtaSAqaGRtaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+PiArICAgIHN0cnVjdCBkcm1f bW9kZV9jb25maWcgKmNvbmZpZyA9ICZoZG1pLT5lbmNvZGVyLmRldi0+bW9kZV9jb25maWc7Cj4+ ICsgICAgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKPj4gKyAgICBpbnQgcmV0ID0g LUVOT0RFVjsKPj4gKwo+PiArICAgIG11dGV4X2xvY2soJmNvbmZpZy0+bXV0ZXgpOwo+PiArICAg IGxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmY29uZmlnLT5jb25uZWN0b3JfbGlzdCwg aGVhZCkgewo+PiArICAgICAgICBpZiAoJmhkbWktPmVuY29kZXIgPT0gY29ubmVjdG9yLT5lbmNv ZGVyKSB7Cj4+ICsgICAgICAgICAgICBtZW1jcHkoYnVmLCBjb25uZWN0b3ItPmVsZCwKPj4gKyAg ICAgICAgICAgICAgICAgICBtaW4oc2l6ZW9mKGNvbm5lY3Rvci0+ZWxkKSwgbGVuKSk7Cj4+ICsg ICAgICAgICAgICByZXQgPSAwOwo+PiArICAgICAgICB9Cj4+ICsgICAgfQo+PiArICAgIG11dGV4 X3VubG9jaygmY29uZmlnLT5tdXRleCk7Cj4+ICsKPj4gKyAgICByZXR1cm4gcmV0Owo+PiArfQo+ PiArCj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGhkbWlfY29kZWNfb3BzIGF1ZGlvX2NvZGVjX29w cyA9IHsKPj4gKyAgICAuaHdfcGFyYW1zID0gaW5ub19oZG1pX2F1ZGlvX2h3X3BhcmFtcywKPj4g KyAgICAuYXVkaW9fc2h1dGRvd24gPSBpbm5vX2hkbWlfYXVkaW9fc2h1dGRvd24sCj4+ICsgICAg LmRpZ2l0YWxfbXV0ZSA9IGlubm9faGRtaV9hdWRpb19kaWdpdGFsX211dGUsCj4+ICsgICAgLmdl dF9lbGQgPSBpbm5vX2hkbWlfYXVkaW9fZ2V0X2VsZCwKPj4gK307Cj4+ICsKPj4gK3N0YXRpYyBp bnQgaW5ub19oZG1pX2F1ZGlvX2NvZGVjX2luaXQoc3RydWN0IGlubm9faGRtaSAqaGRtaSwKPj4g KyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCj4+ICt7Cj4+ICsgICAg c3RydWN0IGhkbWlfY29kZWNfcGRhdGEgY29kZWNfZGF0YSA9IHsKPj4gKyAgICAgICAgLmkycyA9 IDEsCj4+ICsgICAgICAgIC5vcHMgPSAmYXVkaW9fY29kZWNfb3BzLAo+PiArICAgICAgICAubWF4 X2kyc19jaGFubmVscyA9IDgsCj4+ICsgICAgfTsKPj4gKwo+PiArICAgIGhkbWktPmF1ZGlvX2Vu YWJsZSA9IGZhbHNlOwo+PiArICAgIGhkbWktPmF1ZGlvX3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2Vf cmVnaXN0ZXJfZGF0YSgKPj4gKyAgICAgICAgICAgICAgICBkZXYsIEhETUlfQ09ERUNfRFJWX05B TUUsIFBMQVRGT1JNX0RFVklEX05PTkUsCj4+ICsgICAgICAgICAgICAgICAgJmNvZGVjX2RhdGEs IHNpemVvZihjb2RlY19kYXRhKSk7Cj4+ICsKPj4gKyAgICByZXR1cm4gUFRSX0VSUl9PUl9aRVJP KGhkbWktPmF1ZGlvX3BkZXYpOwo+PiArfQo+PiArCj4+ICAgc3RhdGljIGludCBpbm5vX2hkbWlf cmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRybSwgc3RydWN0IAo+PiBpbm5vX2hkbWkgKmhk bWkpCj4+ICAgewo+PiAgICAgICBzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSAmaGRtaS0+ ZW5jb2RlcjsKPj4gQEAgLTY0NSw2ICs4NzYsOCBAQCBzdGF0aWMgaW50IGlubm9faGRtaV9yZWdp c3RlcihzdHJ1Y3QgZHJtX2RldmljZSAKPj4gKmRybSwgc3RydWN0IGlubm9faGRtaSAqaGRtaSkK Pj4gZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKCZoZG1pLT5jb25uZWN0b3IsIGVu Y29kZXIpOwo+PiAgICsgICAgaW5ub19oZG1pX2F1ZGlvX2NvZGVjX2luaXQoaGRtaSwgZGV2KTsK Pj4gKwo+PiAgICAgICByZXR1cm4gMDsKPj4gICB9Cj4+ICAgZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9yb2NrY2hpcC9pbm5vX2hkbWkuaCAKPj4gYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2No aXAvaW5ub19oZG1pLmgKPj4gaW5kZXggYWE3YzQxNS4uOGIyMzAzNyAxMDA2NDQKPj4gLS0tIGEv ZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2lubm9faGRtaS5oCj4+ICsrKyBiL2RyaXZlcnMvZ3B1 L2RybS9yb2NrY2hpcC9pbm5vX2hkbWkuaAo+PiBAQCAtMTA0LDExICsxMDQsMTMgQEAgZW51bSB7 Cj4+ICAgI2RlZmluZSBIRE1JX0FWX01VVEUgICAgICAgICAgICAweDA1Cj4+ICAgI2RlZmluZSBt X0FWTVVURV9DTEVBUiAgICAgICAgICAgICgxIDw8IDcpCj4+ICAgI2RlZmluZSBtX0FWTVVURV9F TkFCTEUgICAgICAgICAgICAoMSA8PCA2KQo+PiArI2RlZmluZSBtX0FVRElPX1BEICAgICAgICAg ICAgKDEgPDwgMikKPj4gICAjZGVmaW5lIG1fQVVESU9fTVVURSAgICAgICAgICAgICgxIDw8IDEp Cj4+ICAgI2RlZmluZSBtX1ZJREVPX0JMQUNLICAgICAgICAgICAgKDEgPDwgMCkKPj4gICAjZGVm aW5lIHZfQVZNVVRFX0NMRUFSKG4pICAgICAgICAobiA8PCA3KQo+PiAgICNkZWZpbmUgdl9BVk1V VEVfRU5BQkxFKG4pICAgICAgICAobiA8PCA2KQo+PiAgICNkZWZpbmUgdl9BVURJT19NVVRFKG4p ICAgICAgICAgICAgKG4gPDwgMSkKPj4gKyNkZWZpbmUgdl9BVURJT19QRChuKSAgICAgICAgICAg IChuIDw8IDIpCj4+ICAgI2RlZmluZSB2X1ZJREVPX01VVEUobikgICAgICAgICAgICAobiA8PCAw KQo+PiAgICAgI2RlZmluZSBIRE1JX1ZJREVPX1RJTUlOR19DVEwgICAgICAgIDB4MDgKPgo+CgoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVs IG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlz dHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: ykk@rock-chips.com (Yakir Yang) Date: Thu, 4 Aug 2016 10:11:53 +0800 Subject: [PATCH 1/3] drm/rockchip: inno_hdmi: add audio support In-Reply-To: <57A2A1F7.2080405@rock-chips.com> References: <1465997312-17777-1-git-send-email-ykk@rock-chips.com> <57A2A1F7.2080405@rock-chips.com> Message-ID: <57A2A469.3040308@rock-chips.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Mark, Got it, would rebase soonest :-) Thanks, - Yakir On 08/04/2016 10:01 AM, Mark yao wrote: > 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 > > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755159AbcHDCMN (ORCPT ); Wed, 3 Aug 2016 22:12:13 -0400 Received: from lucky1.263xmail.com ([211.157.147.135]:37813 "EHLO lucky1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752141AbcHDCML (ORCPT ); Wed, 3 Aug 2016 22:12:11 -0400 X-263anti-spam: KSV:0; X-MAIL-GRAY: 1 X-MAIL-DELIVERY: 0 X-KSVirus-check: 0 X-ABS-CHECKED: 4 X-ADDR-CHECKED: 0 X-RL-SENDER: ykk@rock-chips.com X-FST-TO: linux-arm-kernel@lists.infradead.org X-SENDER-IP: 103.29.142.67 X-LOGIN-NAME: ykk@rock-chips.com X-UNIQUE-TAG: <31f305db62d6e4cdcb31de3538232cd6> X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 Subject: Re: [PATCH 1/3] drm/rockchip: inno_hdmi: add audio support To: Mark yao , Heiko Stuebner References: <1465997312-17777-1-git-send-email-ykk@rock-chips.com> <57A2A1F7.2080405@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: Yakir Yang Message-ID: <57A2A469.3040308@rock-chips.com> Date: Thu, 4 Aug 2016 10:11:53 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.8.0 MIME-Version: 1.0 In-Reply-To: <57A2A1F7.2080405@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 Mark, Got it, would rebase soonest :-) Thanks, - Yakir On 08/04/2016 10:01 AM, Mark yao wrote: > 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 > >