From mboxrd@z Thu Jan 1 00:00:00 1970 From: Inki Dae Subject: Re: [PATCH v3] drm: exynos: Add driver for HDMI audio interface Date: Mon, 16 Oct 2017 07:48:22 +0900 Message-ID: <59E3E5B6.9050300@samsung.com> References: <1506435469-10591-1-git-send-email-s.nawrocki@samsung.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-reply-to: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Sylwester Nawrocki Cc: linux-samsung-soc@vger.kernel.org, b.zolnierkie@samsung.com, jcsing.lee@samsung.com, sw0312.kim@samsung.com, krzk@kernel.org, dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org List-Id: linux-samsung-soc@vger.kernel.org CgoyMDE364WEIDEw7JuUIDEy7J28IDE4OjUx7JeQIFN5bHdlc3RlciBOYXdyb2NraSDsnbQo6rCA KSDsk7Qg6riAOgo+IE9uIDA5LzI2LzIwMTcgMDQ6MTcgUE0sIFN5bHdlc3RlciBOYXdyb2NraSB3 cm90ZToKPj4gVGhlIGhkbWktY29kZWMgaW50ZXJmYWNlIGFkZGVkIGluIHRoaXMgcGF0Y2ggaXMg cmVxdWlyZWQgdG8gcHJvcGVybHkKPj4gc3VwcG9ydCBIRE1JIGF1ZGlvLiBDdXJyZW50bHkgdGhl IGF1ZGlvIHBhcnQgb2YgdGhlIFNvQyBpbnRlcm5hbAo+PiBIRE1JIHRyYW5zbWl0dGVyIGlzIGNv bmZpZ3VyZWQgd2l0aCBmaXhlZCB2YWx1ZXMsIHdoaWNoIG1ha2VzIEhETUkKPj4gYXVkaW8gd29y a2luZyBieSBjaGFuY2UsIG9ubHkgb24gYm9hcmRzIGhhdmluZyBhbiBleHRlcm5hbCBhdWRpbwo+ PiBjb2RlYyBjb25uZWN0ZWQgaW4gcGFyYWxsZWwgd2l0aCB0aGUgSERNSSBhdWRpbyB0cmFuc21p dHRlcidzIGlucHV0Cj4+IEkyUyBpbnRlcmZhY2UuCj4+Cj4+IFNpZ25lZC1vZmYtYnk6IFN5bHdl c3RlciBOYXdyb2NraSA8cy5uYXdyb2NraUBzYW1zdW5nLmNvbT4KPj4gUmV2aWV3ZWQtYnk6IEFu ZHJ6ZWogSGFqZGEgPGEuaGFqZGFAc2Ftc3VuZy5jb20+Cj4gCj4gQW55IGNvbW1lbnRzIG9uIHRo aXMgcGF0Y2g/CgpJIHdpbGwgcmV2aWV3IHRoaXMgcGF0Y2ggaW5jbHVkaW5nIG90aGVyIHBhdGNo IHNlcmllcyB3aGljaCBzaG91bGQgZ28gdG8gLW5leHQgYXQgZW5kIG9mIHRoaXMgd2Vlay4KClRo YW5rcywKSW5raSBEYWUKCj4gCj4gVGhhbmtzLAo+IFN5bHdlc3Rlcgo+IAo+PiAtLS0KPj4gVGVz dGVkIG9uIE9kcm9pZCBYVTMgYW5kIE9kcm9pZCBYVTQgd2l0aCBVYnVudHUgMTQuMDQuCj4+Cj4+ IENoYW5nZXMgc2luY2UgdjI6Cj4+ICAtIHU4IHJlcGxhY2VkIHdpdGggYm9vbCB0eXBlLAo+PiAg LSB0aGUgIEhETUkgY29kZWMgaWVjLnN0YXR1cyBkYXRhIHVzZWQgZGlyZWN0bHkgZm9yIHNldHRp bmcgdXAKPj4gICAgdGhlIEhETUkgY29udHJvbGxlciByZWdpc3RlcnMgcmF0aGVyIHRoYW4gdXNp bmcgaGFyZCBjb2RlZAo+PiAgICBjb25zdGFudHMsCj4+ICAtIGNvbnN0YW50cyB1c2VkIGZvciBj b25maWd1cmluZyB0aGUgSERNSV9BVUlfQ09OIHJlZ2lzdGVyCj4+ICAgIGluc3RlYWQgb2YgcGxh aW4gbnVtYmVycywKPj4gIC0gaWYvSVNfRVJSL3JldHVybiByZXBsYWNlZCB3aXRoIFBUUl9FUlJf T1JfWkVSTygpLgo+Pgo+PiBDaGFuZ2VzIHNpbmNlIHYxOgo+PiAgLSByZWJhc2VkIG9udG8gdjQu MTQtcmMxIGFuZCBhZGFwdGVkIGxvY2tpbmcKPj4KPj4gQ2hhbmdlcyBzaW5jZSBSRkMgdmVyc2lv bjoKPj4gIC0gZml4ZWQgaGRtaS1jb2RlYyBsb2NraW5nIGlzc3VlCj4+ICAtIGFkZGVkIGEgY29t bWVudCBkb2N1bWVudGluZyBzdHJ1Y3QgaGRtaV9jb250ZXg6Om11dGV4Cj4+IC0tLQo+PiAgZHJp dmVycy9ncHUvZHJtL2V4eW5vcy9LY29uZmlnICAgICAgIHwgICAxICsKPj4gIGRyaXZlcnMvZ3B1 L2RybS9leHlub3MvZXh5bm9zX2hkbWkuYyB8IDI1MyArKysrKysrKysrKysrKysrKysrKysrKysr Ky0tLS0tLS0tLQo+PiAgZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9yZWdzLWhkbWkuaCAgIHwgICA4 ICstCj4+ICAzIGZpbGVzIGNoYW5nZWQsIDE5NyBpbnNlcnRpb25zKCspLCA2NSBkZWxldGlvbnMo LSkKPj4KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvS2NvbmZpZyBiL2Ry aXZlcnMvZ3B1L2RybS9leHlub3MvS2NvbmZpZwo+PiBpbmRleCAzMDVkYzNkLi41YTdjOWQ4IDEw MDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL0tjb25maWcKPj4gKysrIGIvZHJp dmVycy9ncHUvZHJtL2V4eW5vcy9LY29uZmlnCj4+IEBAIC0zLDYgKzMsNyBAQCBjb25maWcgRFJN X0VYWU5PUwo+PiAgCWRlcGVuZHMgb24gT0YgJiYgRFJNICYmIChBUkNIX1MzQzY0WFggfHwgQVJD SF9FWFlOT1MgfHwgQVJDSF9NVUxUSVBMQVRGT1JNKQo+PiAgCXNlbGVjdCBEUk1fS01TX0hFTFBF Ugo+PiAgCXNlbGVjdCBWSURFT01PREVfSEVMUEVSUwo+PiArCXNlbGVjdCBTTkRfU09DX0hETUlf Q09ERUMgaWYgU05EX1NPQwo+PiAgCWhlbHAKPj4gIAkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5 b3UgaGF2ZSBhIFNhbXN1bmcgU29DIEVYWU5PUyBjaGlwc2V0Lgo+PiAgCSAgSWYgTSBpcyBzZWxl Y3RlZCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGV4eW5vc2RybS4KPj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2hkbWkuYyBiL2RyaXZlcnMvZ3B1L2RybS9l eHlub3MvZXh5bm9zX2hkbWkuYwo+PiBpbmRleCAyMTRmYTVlLi5kMmIzODlhIDEwMDY0NAo+PiAt LS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19oZG1pLmMKPj4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL2V4eW5vcy9leHlub3NfaGRtaS5jCj4+IEBAIC00MCw3ICs0MCw3IEBACj4+ICAj aW5jbHVkZSA8bGludXgvY29tcG9uZW50Lmg+Cj4+ICAjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nv bi5oPgo+PiAgI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgo+PiAtCj4+ICsjaW5jbHVkZSA8c291 bmQvaGRtaS1jb2RlYy5oPgo+PiAgI2luY2x1ZGUgPGRybS9leHlub3NfZHJtLmg+Cj4+Cj4+ICAj aW5jbHVkZSA8bWVkaWEvY2VjLW5vdGlmaWVyLmg+Cj4+IEBAIC0xMTEsMTIgKzExMSwxOCBAQCBz dHJ1Y3QgaGRtaV9kcml2ZXJfZGF0YSB7Cj4+ICAJc3RydWN0IHN0cmluZ19hcnJheV9zcGVjIGNs a19tdXhlczsKPj4gIH07Cj4+Cj4+ICtzdHJ1Y3QgaGRtaV9hdWRpbyB7Cj4+ICsJc3RydWN0IHBs YXRmb3JtX2RldmljZQkJKnBkZXY7Cj4+ICsJc3RydWN0IGhkbWlfYXVkaW9faW5mb2ZyYW1lCWlu Zm9mcmFtZTsKPj4gKwlzdHJ1Y3QgaGRtaV9jb2RlY19wYXJhbXMJcGFyYW1zOwo+PiArCWJvb2wJ CQkJZW5hYmxlOwo+PiArfTsKPj4gKwo+PiAgc3RydWN0IGhkbWlfY29udGV4dCB7Cj4+ICAJc3Ry dWN0IGRybV9lbmNvZGVyCQllbmNvZGVyOwo+PiAgCXN0cnVjdCBkZXZpY2UJCQkqZGV2Owo+PiAg CXN0cnVjdCBkcm1fZGV2aWNlCQkqZHJtX2RldjsKPj4gIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvcgkJ Y29ubmVjdG9yOwo+PiAtCWJvb2wJCQkJcG93ZXJlZDsKPj4gIAlib29sCQkJCWR2aV9tb2RlOwo+ PiAgCXN0cnVjdCBkZWxheWVkX3dvcmsJCWhvdHBsdWdfd29yazsKPj4gIAlzdHJ1Y3QgZHJtX2Rp c3BsYXlfbW9kZQkJY3VycmVudF9tb2RlOwo+PiBAQCAtMTM3LDYgKzE0MywxMSBAQCBzdHJ1Y3Qg aGRtaV9jb250ZXh0IHsKPj4gIAlzdHJ1Y3QgcmVndWxhdG9yCQkqcmVnX2hkbWlfZW47Cj4+ICAJ c3RydWN0IGV4eW5vc19kcm1fY2xrCQlwaHlfY2xrOwo+PiAgCXN0cnVjdCBkcm1fYnJpZGdlCQkq YnJpZGdlOwo+PiArCj4+ICsJLyogbXV0ZXggcHJvdGVjdGluZyBzdWJzZXF1ZW50IGZpZWxkcyBi ZWxvdyAqLwo+PiArCXN0cnVjdCBtdXRleAkJCW11dGV4Owo+PiArCXN0cnVjdCBoZG1pX2F1ZGlv CQlhdWRpbzsKPj4gKwlib29sCQkJCXBvd2VyZWQ7Cj4+ICB9Owo+Pgo+PiAgc3RhdGljIGlubGlu ZSBzdHJ1Y3QgaGRtaV9jb250ZXh0ICplbmNvZGVyX3RvX2hkbWkoc3RydWN0IGRybV9lbmNvZGVy ICplKQo+PiBAQCAtNzY4LDYgKzc3OSwyMiBAQCBzdGF0aWMgaW50IGhkbWlfY2xrX3NldF9wYXJl bnRzKHN0cnVjdCBoZG1pX2NvbnRleHQgKmhkYXRhLCBib29sIHRvX3BoeSkKPj4gIAlyZXR1cm4g cmV0Owo+PiAgfQo+Pgo+PiArc3RhdGljIGludCBoZG1pX2F1ZGlvX2luZm9mcmFtZV9hcHBseShz dHJ1Y3QgaGRtaV9jb250ZXh0ICpoZGF0YSkKPj4gK3sKPj4gKwlzdHJ1Y3QgaGRtaV9hdWRpb19p bmZvZnJhbWUgKmluZm9mcmFtZSA9ICZoZGF0YS0+YXVkaW8uaW5mb2ZyYW1lOwo+PiArCXU4IGJ1 ZltIRE1JX0lORk9GUkFNRV9TSVpFKEFVRElPKV07Cj4+ICsJaW50IGxlbjsKPj4gKwo+PiArCWxl biA9IGhkbWlfYXVkaW9faW5mb2ZyYW1lX3BhY2soaW5mb2ZyYW1lLCBidWYsIHNpemVvZihidWYp KTsKPj4gKwlpZiAobGVuIDwgMCkKPj4gKwkJcmV0dXJuIGxlbjsKPj4gKwo+PiArCWhkbWlfcmVn X3dyaXRlYihoZGF0YSwgSERNSV9BVUlfQ09OLCBIRE1JX0FVSV9DT05fRVZFUllfVlNZTkMpOwo+ PiArCWhkbWlfcmVnX3dyaXRlX2J1ZihoZGF0YSwgSERNSV9BVUlfSEVBREVSMCwgYnVmLCBsZW4p Owo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gIHN0YXRpYyB2b2lkIGhkbWlfcmVn X2luZm9mcmFtZXMoc3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGEpCj4+ICB7Cj4+ICAJdW5pb24g aGRtaV9pbmZvZnJhbWUgZnJtOwo+PiBAQCAtODA1LDE1ICs4MzIsNyBAQCBzdGF0aWMgdm9pZCBo ZG1pX3JlZ19pbmZvZnJhbWVzKHN0cnVjdCBoZG1pX2NvbnRleHQgKmhkYXRhKQo+PiAgCQloZG1p X3JlZ193cml0ZV9idWYoaGRhdGEsIEhETUlfVlNJX0RBVEEoMCksIGJ1ZiArIDMsIHJldCAtIDMp Owo+PiAgCX0KPj4KPj4gLQlyZXQgPSBoZG1pX2F1ZGlvX2luZm9mcmFtZV9pbml0KCZmcm0uYXVk aW8pOwo+PiAtCWlmICghcmV0KSB7Cj4+IC0JCWZybS5hdWRpby5jaGFubmVscyA9IDI7Cj4+IC0J CXJldCA9IGhkbWlfYXVkaW9faW5mb2ZyYW1lX3BhY2soJmZybS5hdWRpbywgYnVmLCBzaXplb2Yo YnVmKSk7Cj4+IC0JfQo+PiAtCWlmIChyZXQgPiAwKSB7Cj4+IC0JCWhkbWlfcmVnX3dyaXRlYiho ZGF0YSwgSERNSV9BVUlfQ09OLCBIRE1JX0FVSV9DT05fRVZFUllfVlNZTkMpOwo+PiAtCQloZG1p X3JlZ193cml0ZV9idWYoaGRhdGEsIEhETUlfQVVJX0hFQURFUjAsIGJ1ZiwgcmV0KTsKPj4gLQl9 Cj4+ICsJaGRtaV9hdWRpb19pbmZvZnJhbWVfYXBwbHkoaGRhdGEpOwo+PiAgfQo+Pgo+PiAgc3Rh dGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgaGRtaV9kZXRlY3Qoc3RydWN0IGRybV9jb25u ZWN0b3IgKmNvbm5lY3RvciwKPj4gQEAgLTk5NSwyMyArMTAxNCwxOCBAQCBzdGF0aWMgdm9pZCBo ZG1pX3JlZ19hY3Ioc3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGEsIHUzMiBmcmVxKQo+PiAgCWhk bWlfcmVnX3dyaXRlYihoZGF0YSwgSERNSV9BQ1JfQ09OLCA0KTsKPj4gIH0KPj4KPj4gLXN0YXRp YyB2b2lkIGhkbWlfYXVkaW9faW5pdChzdHJ1Y3QgaGRtaV9jb250ZXh0ICpoZGF0YSkKPj4gK3N0 YXRpYyB2b2lkIGhkbWlfYXVkaW9fY29uZmlnKHN0cnVjdCBoZG1pX2NvbnRleHQgKmhkYXRhKQo+ PiAgewo+PiAtCXUzMiBzYW1wbGVfcmF0ZSwgYml0c19wZXJfc2FtcGxlOwo+PiAtCXUzMiBkYXRh X251bSwgYml0X2NoLCBzYW1wbGVfZnJxOwo+PiAtCXUzMiB2YWw7Cj4+IC0KPj4gLQlzYW1wbGVf cmF0ZSA9IDQ0MTAwOwo+PiAtCWJpdHNfcGVyX3NhbXBsZSA9IDE2Owo+PiArCXUzMiBiaXRfY2gg PSAxOwo+PiArCXUzMiBkYXRhX251bSwgdmFsOwo+PiArCWludCBpOwo+Pgo+PiAtCXN3aXRjaCAo Yml0c19wZXJfc2FtcGxlKSB7Cj4+ICsJc3dpdGNoIChoZGF0YS0+YXVkaW8ucGFyYW1zLnNhbXBs ZV93aWR0aCkgewo+PiAgCWNhc2UgMjA6Cj4+ICAJCWRhdGFfbnVtID0gMjsKPj4gLQkJYml0X2No ID0gMTsKPj4gIAkJYnJlYWs7Cj4+ICAJY2FzZSAyNDoKPj4gIAkJZGF0YV9udW0gPSAzOwo+PiAt CQliaXRfY2ggPSAxOwo+PiAgCQlicmVhazsKPj4gIAlkZWZhdWx0Ogo+PiAgCQlkYXRhX251bSA9 IDE7Cj4+IEBAIC0xMDE5LDcgKzEwMzMsNyBAQCBzdGF0aWMgdm9pZCBoZG1pX2F1ZGlvX2luaXQo c3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGEpCj4+ICAJCWJyZWFrOwo+PiAgCX0KPj4KPj4gLQlo ZG1pX3JlZ19hY3IoaGRhdGEsIHNhbXBsZV9yYXRlKTsKPj4gKwloZG1pX3JlZ19hY3IoaGRhdGEs IGhkYXRhLT5hdWRpby5wYXJhbXMuc2FtcGxlX3JhdGUpOwo+Pgo+PiAgCWhkbWlfcmVnX3dyaXRl YihoZGF0YSwgSERNSV9JMlNfTVVYX0NPTiwgSERNSV9JMlNfSU5fRElTQUJMRQo+PiAgCQkJCXwg SERNSV9JMlNfQVVEX0kyUyB8IEhETUlfSTJTX0NVVl9JMlNfRU5BQkxFCj4+IEBAIC0xMDI5LDEy ICsxMDQzLDYgQEAgc3RhdGljIHZvaWQgaGRtaV9hdWRpb19pbml0KHN0cnVjdCBoZG1pX2NvbnRl eHQgKmhkYXRhKQo+PiAgCQkJfCBIRE1JX0kyU19DSDFfRU4gfCBIRE1JX0kyU19DSDJfRU4pOwo+ Pgo+PiAgCWhkbWlfcmVnX3dyaXRlYihoZGF0YSwgSERNSV9JMlNfTVVYX0NVViwgSERNSV9JMlNf Q1VWX1JMX0VOKTsKPj4gLQo+PiAtCXNhbXBsZV9mcnEgPSAoc2FtcGxlX3JhdGUgPT0gNDQxMDAp ID8gMCA6Cj4+IC0JCQkoc2FtcGxlX3JhdGUgPT0gNDgwMDApID8gMiA6Cj4+IC0JCQkoc2FtcGxl X3JhdGUgPT0gMzIwMDApID8gMyA6Cj4+IC0JCQkoc2FtcGxlX3JhdGUgPT0gOTYwMDApID8gMHhh IDogMHgwOwo+PiAtCj4+ICAJaGRtaV9yZWdfd3JpdGViKGhkYXRhLCBIRE1JX0kyU19DTEtfQ09O LCBIRE1JX0kyU19DTEtfRElTKTsKPj4gIAloZG1pX3JlZ193cml0ZWIoaGRhdGEsIEhETUlfSTJT X0NMS19DT04sIEhETUlfSTJTX0NMS19FTik7Cj4+Cj4+IEBAIC0xMDU4LDMxICsxMDY2LDI0IEBA IHN0YXRpYyB2b2lkIGhkbWlfYXVkaW9faW5pdChzdHJ1Y3QgaGRtaV9jb250ZXh0ICpoZGF0YSkK Pj4gIAkJCXwgSERNSV9JMlNfU0VUX1NEQVRBX0JJVChkYXRhX251bSkKPj4gIAkJCXwgSERNSV9J MlNfQkFTSUNfRk9STUFUKTsKPj4KPj4gLQkvKiBDb25maWd1cmUgcmVnaXN0ZXIgcmVsYXRlZCB0 byBDVVYgaW5mb3JtYXRpb24gKi8KPj4gLQloZG1pX3JlZ193cml0ZWIoaGRhdGEsIEhETUlfSTJT X0NIX1NUXzAsIEhETUlfSTJTX0NIX1NUQVRVU19NT0RFXzAKPj4gLQkJCXwgSERNSV9JMlNfMkFV RF9DSF9XSVRIT1VUX1BSRUVNUEgKPj4gLQkJCXwgSERNSV9JMlNfQ09QWVJJR0hUCj4+IC0JCQl8 IEhETUlfSTJTX0xJTkVBUl9QQ00KPj4gLQkJCXwgSERNSV9JMlNfQ09OU1VNRVJfRk9STUFUKTsK Pj4gLQloZG1pX3JlZ193cml0ZWIoaGRhdGEsIEhETUlfSTJTX0NIX1NUXzEsIEhETUlfSTJTX0NE X1BMQVlFUik7Cj4+IC0JaGRtaV9yZWdfd3JpdGViKGhkYXRhLCBIRE1JX0kyU19DSF9TVF8yLCBI RE1JX0kyU19TRVRfU09VUkNFX05VTSgwKSk7Cj4+IC0JaGRtaV9yZWdfd3JpdGViKGhkYXRhLCBI RE1JX0kyU19DSF9TVF8zLCBIRE1JX0kyU19DTEtfQUNDVVJfTEVWRUxfMgo+PiAtCQkJfCBIRE1J X0kyU19TRVRfU01QX0ZSRVEoc2FtcGxlX2ZycSkpOwo+PiAtCWhkbWlfcmVnX3dyaXRlYihoZGF0 YSwgSERNSV9JMlNfQ0hfU1RfNCwKPj4gLQkJCUhETUlfSTJTX09SR19TTVBfRlJFUV80NF8xCj4+ IC0JCQl8IEhETUlfSTJTX1dPUkRfTEVOX01BWDI0XzI0QklUUwo+PiAtCQkJfCBIRE1JX0kyU19X T1JEX0xFTl9NQVhfMjRCSVRTKTsKPj4gKwkvKiBDb25maWd1cmUgcmVnaXN0ZXJzIHJlbGF0ZWQg dG8gQ1VWIGluZm9ybWF0aW9uICovCj4+ICsJZm9yIChpID0gMDsgaSA8IEhETUlfSTJTX0NIX1NU X01BWE5VTTsgaSsrKQo+PiArCQloZG1pX3JlZ193cml0ZWIoaGRhdGEsIEhETUlfSTJTX0NIX1NU KGkpLAo+PiArCQkJCWhkYXRhLT5hdWRpby5wYXJhbXMuaWVjLnN0YXR1c1tpXSk7Cj4+Cj4+ICAJ aGRtaV9yZWdfd3JpdGViKGhkYXRhLCBIRE1JX0kyU19DSF9TVF9DT04sIEhETUlfSTJTX0NIX1NU QVRVU19SRUxPQUQpOwo+PiAgfQo+Pgo+PiAtc3RhdGljIHZvaWQgaGRtaV9hdWRpb19jb250cm9s KHN0cnVjdCBoZG1pX2NvbnRleHQgKmhkYXRhLCBib29sIG9ub2ZmKQo+PiArc3RhdGljIHZvaWQg aGRtaV9hdWRpb19jb250cm9sKHN0cnVjdCBoZG1pX2NvbnRleHQgKmhkYXRhKQo+PiAgewo+PiAr CWJvb2wgZW5hYmxlID0gaGRhdGEtPmF1ZGlvLmVuYWJsZTsKPj4gKwo+PiAgCWlmIChoZGF0YS0+ ZHZpX21vZGUpCj4+ICAJCXJldHVybjsKPj4KPj4gLQloZG1pX3JlZ193cml0ZWIoaGRhdGEsIEhE TUlfQVVJX0NPTiwgb25vZmYgPyAyIDogMCk7Cj4+IC0JaGRtaV9yZWdfd3JpdGVtYXNrKGhkYXRh LCBIRE1JX0NPTl8wLCBvbm9mZiA/Cj4+ICsJaGRtaV9yZWdfd3JpdGViKGhkYXRhLCBIRE1JX0FV SV9DT04sIGVuYWJsZSA/Cj4+ICsJCQlIRE1JX0FWSV9DT05fRVZFUllfVlNZTkMgOiBIRE1JX0FV SV9DT05fTk9fVFJBTik7Cj4+ICsJaGRtaV9yZWdfd3JpdGVtYXNrKGhkYXRhLCBIRE1JX0NPTl8w LCBlbmFibGUgPwo+PiAgCQkJSERNSV9BU1BfRU4gOiBIRE1JX0FTUF9ESVMsIEhETUlfQVNQX01B U0spOwo+PiAgfQo+Pgo+PiBAQCAtMTM5OCwxMyArMTM5OSwxNCBAQCBzdGF0aWMgdm9pZCBoZG1p cGh5X2NvbmZfYXBwbHkoc3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGEpCj4+ICAJaGRtaXBoeV93 YWl0X2Zvcl9wbGwoaGRhdGEpOwo+PiAgfQo+Pgo+PiArLyogU2hvdWxkIGJlIGNhbGxlZCB3aXRo IGhkYXRhLT5tdXRleCBtdXRleCBoZWxkICovCj4+ICBzdGF0aWMgdm9pZCBoZG1pX2NvbmZfYXBw bHkoc3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGEpCj4+ICB7Cj4+ICAJaGRtaV9zdGFydChoZGF0 YSwgZmFsc2UpOwo+PiAgCWhkbWlfY29uZl9pbml0KGhkYXRhKTsKPj4gLQloZG1pX2F1ZGlvX2lu aXQoaGRhdGEpOwo+PiArCWhkbWlfYXVkaW9fY29uZmlnKGhkYXRhKTsKPj4gIAloZG1pX21vZGVf YXBwbHkoaGRhdGEpOwo+PiAtCWhkbWlfYXVkaW9fY29udHJvbChoZGF0YSwgdHJ1ZSk7Cj4+ICsJ aGRtaV9hdWRpb19jb250cm9sKGhkYXRhKTsKPj4gIH0KPj4KPj4gIHN0YXRpYyB2b2lkIGhkbWlf bW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAo+PiBAQCAtMTQzMSw2ICsxNDMz LDcgQEAgc3RhdGljIHZvaWQgaGRtaV9zZXRfcmVmY2xrKHN0cnVjdCBoZG1pX2NvbnRleHQgKmhk YXRhLCBib29sIG9uKQo+PiAgCQkJICAgU1lTUkVHX0hETUlfUkVGQ0xLX0lOVF9DTEssIG9uID8g fjAgOiAwKTsKPj4gIH0KPj4KPj4gKy8qIFNob3VsZCBiZSBjYWxsZWQgd2l0aCBoZGF0YS0+bXV0 ZXggbXV0ZXggaGVsZC4gKi8KPj4gIHN0YXRpYyB2b2lkIGhkbWlwaHlfZW5hYmxlKHN0cnVjdCBo ZG1pX2NvbnRleHQgKmhkYXRhKQo+PiAgewo+PiAgCWlmIChoZGF0YS0+cG93ZXJlZCkKPj4gQEAg LTE0NTMsNiArMTQ1Niw3IEBAIHN0YXRpYyB2b2lkIGhkbWlwaHlfZW5hYmxlKHN0cnVjdCBoZG1p X2NvbnRleHQgKmhkYXRhKQo+PiAgCWhkYXRhLT5wb3dlcmVkID0gdHJ1ZTsKPj4gIH0KPj4KPj4g Ky8qIFNob3VsZCBiZSBjYWxsZWQgd2l0aCBoZGF0YS0+bXV0ZXggbXV0ZXggaGVsZC4gKi8KPj4g IHN0YXRpYyB2b2lkIGhkbWlwaHlfZGlzYWJsZShzdHJ1Y3QgaGRtaV9jb250ZXh0ICpoZGF0YSkK Pj4gIHsKPj4gIAlpZiAoIWhkYXRhLT5wb3dlcmVkKQo+PiBAQCAtMTQ3OCwyOCArMTQ4MiwzOCBA QCBzdGF0aWMgdm9pZCBoZG1pX2VuYWJsZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCj4+ ICB7Cj4+ICAJc3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGEgPSBlbmNvZGVyX3RvX2hkbWkoZW5j b2Rlcik7Cj4+Cj4+ICsJbXV0ZXhfbG9jaygmaGRhdGEtPm11dGV4KTsKPj4gKwo+PiAgCWhkbWlw aHlfZW5hYmxlKGhkYXRhKTsKPj4gIAloZG1pX2NvbmZfYXBwbHkoaGRhdGEpOwo+PiArCj4+ICsJ bXV0ZXhfdW5sb2NrKCZoZGF0YS0+bXV0ZXgpOwo+PiAgfQo+Pgo+PiAgc3RhdGljIHZvaWQgaGRt aV9kaXNhYmxlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKPj4gIHsKPj4gIAlzdHJ1Y3Qg aGRtaV9jb250ZXh0ICpoZGF0YSA9IGVuY29kZXJfdG9faGRtaShlbmNvZGVyKTsKPj4KPj4gLQlp ZiAoIWhkYXRhLT5wb3dlcmVkKQo+PiArCW11dGV4X2xvY2soJmhkYXRhLT5tdXRleCk7Cj4+ICsK Pj4gKwlpZiAoaGRhdGEtPnBvd2VyZWQpIHsKPj4gKwkJLyoKPj4gKwkJICogVGhlIFNGUnMgb2Yg VlAgYW5kIE1peGVyIGFyZSB1cGRhdGVkIGJ5IFZlcnRpY2FsIFN5bmMgb2YKPj4gKwkJICogVGlt aW5nIGdlbmVyYXRvciB3aGljaCBpcyBhIHBhcnQgb2YgSERNSSBzbyB0aGUgc2VxdWVuY2UKPj4g KwkJICogdG8gZGlzYWJsZSBUViBTdWJzeXN0ZW0gc2hvdWxkIGJlIGFzIGZvbGxvd2luZywKPj4g KwkJICoJVlAgLT4gTWl4ZXIgLT4gSERNSQo+PiArCQkgKgo+PiArCQkgKiBUbyBhY2hpZXZlIHN1 Y2ggc2VxdWVuY2UgSERNSSBpcyBkaXNhYmxlZCB0b2dldGhlciB3aXRoCj4+ICsJCSAqIEhETUkg UEhZLCB2aWEgcGlwZSBjbG9jayBjYWxsYmFjay4KPj4gKwkJICovCj4+ICsJCW11dGV4X3VubG9j aygmaGRhdGEtPm11dGV4KTsKPj4gKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaGRhdGEtPmhvdHBs dWdfd29yayk7Cj4+ICsJCWNlY19ub3RpZmllcl9zZXRfcGh5c19hZGRyKGhkYXRhLT5ub3RpZmll ciwKPj4gKwkJCQkJICAgQ0VDX1BIWVNfQUREUl9JTlZBTElEKTsKPj4gIAkJcmV0dXJuOwo+PiAr CX0KPj4KPj4gLQkvKgo+PiAtCSAqIFRoZSBTRlJzIG9mIFZQIGFuZCBNaXhlciBhcmUgdXBkYXRl ZCBieSBWZXJ0aWNhbCBTeW5jIG9mCj4+IC0JICogVGltaW5nIGdlbmVyYXRvciB3aGljaCBpcyBh IHBhcnQgb2YgSERNSSBzbyB0aGUgc2VxdWVuY2UKPj4gLQkgKiB0byBkaXNhYmxlIFRWIFN1YnN5 c3RlbSBzaG91bGQgYmUgYXMgZm9sbG93aW5nLAo+PiAtCSAqCVZQIC0+IE1peGVyIC0+IEhETUkK Pj4gLQkgKgo+PiAtCSAqIFRvIGFjaGlldmUgc3VjaCBzZXF1ZW5jZSBIRE1JIGlzIGRpc2FibGVk IHRvZ2V0aGVyIHdpdGggSERNSSBQSFksIHZpYQo+PiAtCSAqIHBpcGUgY2xvY2sgY2FsbGJhY2su Cj4+IC0JICovCj4+IC0JY2FuY2VsX2RlbGF5ZWRfd29yaygmaGRhdGEtPmhvdHBsdWdfd29yayk7 Cj4+IC0JY2VjX25vdGlmaWVyX3NldF9waHlzX2FkZHIoaGRhdGEtPm5vdGlmaWVyLCBDRUNfUEhZ U19BRERSX0lOVkFMSUQpOwo+PiArCW11dGV4X3VubG9jaygmaGRhdGEtPm11dGV4KTsKPj4gIH0K Pj4KPj4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIGV4eW5v c19oZG1pX2VuY29kZXJfaGVscGVyX2Z1bmNzID0gewo+PiBAQCAtMTUxMyw2ICsxNTI3LDEwNCBA QCBzdGF0aWMgdm9pZCBoZG1pX2Rpc2FibGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQo+ PiAgCS5kZXN0cm95ID0gZHJtX2VuY29kZXJfY2xlYW51cCwKPj4gIH07Cj4+Cj4+ICtzdGF0aWMg dm9pZCBoZG1pX2F1ZGlvX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkK Pj4gK3sKPj4gKwlzdHJ1Y3QgaGRtaV9jb250ZXh0ICpoZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShk ZXYpOwo+PiArCj4+ICsJbXV0ZXhfbG9jaygmaGRhdGEtPm11dGV4KTsKPj4gKwo+PiArCWhkYXRh LT5hdWRpby5lbmFibGUgPSBmYWxzZTsKPj4gKwo+PiArCWlmIChoZGF0YS0+cG93ZXJlZCkKPj4g KwkJaGRtaV9hdWRpb19jb250cm9sKGhkYXRhKTsKPj4gKwo+PiArCW11dGV4X3VubG9jaygmaGRh dGEtPm11dGV4KTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBoZG1pX2F1ZGlvX2h3X3BhcmFt cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCj4+ICsJCQkJc3RydWN0IGhkbWlfY29k ZWNfZGFpZm10ICpkYWlmbXQsCj4+ICsJCQkJc3RydWN0IGhkbWlfY29kZWNfcGFyYW1zICpwYXJh bXMpCj4+ICt7Cj4+ICsJc3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGEgPSBkZXZfZ2V0X2RydmRh dGEoZGV2KTsKPj4gKwo+PiArCWlmIChkYWlmbXQtPmZtdCAhPSBIRE1JX0kyUyB8fCBkYWlmbXQt PmJpdF9jbGtfaW52IHx8Cj4+ICsJICAgIGRhaWZtdC0+ZnJhbWVfY2xrX2ludiB8fCBkYWlmbXQt PmJpdF9jbGtfbWFzdGVyIHx8Cj4+ICsJICAgIGRhaWZtdC0+ZnJhbWVfY2xrX21hc3Rlcikgewo+ PiArCQlkZXZfZXJyKGRldiwgIiVzOiBCYWQgZmxhZ3MgJWQgJWQgJWQgJWRcbiIsIF9fZnVuY19f LAo+PiArCQkJZGFpZm10LT5iaXRfY2xrX2ludiwgZGFpZm10LT5mcmFtZV9jbGtfaW52LAo+PiAr CQkJZGFpZm10LT5iaXRfY2xrX21hc3RlciwKPj4gKwkJCWRhaWZtdC0+ZnJhbWVfY2xrX21hc3Rl cik7Cj4+ICsJCXJldHVybiAtRUlOVkFMOwo+PiArCX0KPj4gKwo+PiArCW11dGV4X2xvY2soJmhk YXRhLT5tdXRleCk7Cj4+ICsKPj4gKwloZGF0YS0+YXVkaW8ucGFyYW1zID0gKnBhcmFtczsKPj4g Kwo+PiArCWlmIChoZGF0YS0+cG93ZXJlZCkgewo+PiArCQloZG1pX2F1ZGlvX2NvbmZpZyhoZGF0 YSk7Cj4+ICsJCWhkbWlfYXVkaW9faW5mb2ZyYW1lX2FwcGx5KGhkYXRhKTsKPj4gKwl9Cj4+ICsK Pj4gKwltdXRleF91bmxvY2soJmhkYXRhLT5tdXRleCk7Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4g K30KPj4gKwo+PiArc3RhdGljIGludCBoZG1pX2F1ZGlvX2RpZ2l0YWxfbXV0ZShzdHJ1Y3QgZGV2 aWNlICpkZXYsIHZvaWQgKmRhdGEsIGJvb2wgbXV0ZSkKPj4gK3sKPj4gKwlzdHJ1Y3QgaGRtaV9j b250ZXh0ICpoZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+PiArCj4+ICsJbXV0ZXhfbG9j aygmaGRhdGEtPm11dGV4KTsKPj4gKwo+PiArCWhkYXRhLT5hdWRpby5lbmFibGUgPSAhbXV0ZTsK Pj4gKwo+PiArCWlmIChoZGF0YS0+cG93ZXJlZCkKPj4gKwkJaGRtaV9hdWRpb19jb250cm9sKGhk YXRhKTsKPj4gKwo+PiArCW11dGV4X3VubG9jaygmaGRhdGEtPm11dGV4KTsKPj4gKwo+PiArCXJl dHVybiAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IGhkbWlfYXVkaW9fZ2V0X2VsZChzdHJ1 Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsIHVpbnQ4X3QgKmJ1ZiwKPj4gKwkJCSAgICAgIHNp emVfdCBsZW4pCj4+ICt7Cj4+ICsJc3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGEgPSBkZXZfZ2V0 X2RydmRhdGEoZGV2KTsKPj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gJmhk YXRhLT5jb25uZWN0b3I7Cj4+ICsKPj4gKwltZW1jcHkoYnVmLCBjb25uZWN0b3ItPmVsZCwgbWlu KHNpemVvZihjb25uZWN0b3ItPmVsZCksIGxlbikpOwo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICt9 Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRtaV9jb2RlY19vcHMgYXVkaW9fY29kZWNf b3BzID0gewo+PiArCS5od19wYXJhbXMgPSBoZG1pX2F1ZGlvX2h3X3BhcmFtcywKPj4gKwkuYXVk aW9fc2h1dGRvd24gPSBoZG1pX2F1ZGlvX3NodXRkb3duLAo+PiArCS5kaWdpdGFsX211dGUgPSBo ZG1pX2F1ZGlvX2RpZ2l0YWxfbXV0ZSwKPj4gKwkuZ2V0X2VsZCA9IGhkbWlfYXVkaW9fZ2V0X2Vs ZCwKPj4gK307Cj4+ICsKPj4gK3N0YXRpYyBpbnQgaGRtaV9yZWdpc3Rlcl9hdWRpb19kZXZpY2Uo c3RydWN0IGhkbWlfY29udGV4dCAqaGRhdGEpCj4+ICt7Cj4+ICsJc3RydWN0IGhkbWlfY29kZWNf cGRhdGEgY29kZWNfZGF0YSA9IHsKPj4gKwkJLm9wcyA9ICZhdWRpb19jb2RlY19vcHMsCj4+ICsJ CS5tYXhfaTJzX2NoYW5uZWxzID0gNiwKPj4gKwkJLmkycyA9IDEsCj4+ICsJfTsKPj4gKwo+PiAr CWhkYXRhLT5hdWRpby5wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2RhdGEoCj4+ICsJ CWhkYXRhLT5kZXYsIEhETUlfQ09ERUNfRFJWX05BTUUsIFBMQVRGT1JNX0RFVklEX0FVVE8sCj4+ ICsJCSZjb2RlY19kYXRhLCBzaXplb2YoY29kZWNfZGF0YSkpOwo+PiArCj4+ICsJcmV0dXJuIFBU Ul9FUlJfT1JfWkVSTyhoZGF0YS0+YXVkaW8ucGRldik7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2 b2lkIGhkbWlfdW5yZWdpc3Rlcl9hdWRpb19kZXZpY2Uoc3RydWN0IGhkbWlfY29udGV4dCAqaGRh dGEpCj4+ICt7Cj4+ICsJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoaGRhdGEtPmF1ZGlvLnBk ZXYpOwo+PiArfQo+PiArCj4+ICBzdGF0aWMgdm9pZCBoZG1pX2hvdHBsdWdfd29ya19mdW5jKHN0 cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPj4gIHsKPj4gIAlzdHJ1Y3QgaGRtaV9jb250ZXh0ICpo ZGF0YTsKPj4gQEAgLTE1ODgsMTEgKzE3MDAsMTQgQEAgc3RhdGljIHZvaWQgaGRtaXBoeV9jbGtf ZW5hYmxlKHN0cnVjdCBleHlub3NfZHJtX2NsayAqY2xrLCBib29sIGVuYWJsZSkKPj4gIHsKPj4g IAlzdHJ1Y3QgaGRtaV9jb250ZXh0ICpoZGF0YSA9IGNvbnRhaW5lcl9vZihjbGssIHN0cnVjdCBo ZG1pX2NvbnRleHQsCj4+ICAJCQkJCQkgIHBoeV9jbGspOwo+PiArCW11dGV4X2xvY2soJmhkYXRh LT5tdXRleCk7Cj4+Cj4+ICAJaWYgKGVuYWJsZSkKPj4gIAkJaGRtaXBoeV9lbmFibGUoaGRhdGEp Owo+PiAgCWVsc2UKPj4gIAkJaGRtaXBoeV9kaXNhYmxlKGhkYXRhKTsKPj4gKwo+PiArCW11dGV4 X3VubG9jaygmaGRhdGEtPm11dGV4KTsKPj4gIH0KPj4KPj4gIHN0YXRpYyBpbnQgaGRtaV9icmlk Z2VfaW5pdChzdHJ1Y3QgaGRtaV9jb250ZXh0ICpoZGF0YSkKPj4gQEAgLTE2OTcsNiArMTgxMiw3 IEBAIHN0YXRpYyBpbnQgaGRtaV9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmlj ZSAqbWFzdGVyLCB2b2lkICpkYXRhKQo+PiAgCXN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2ID0g ZGF0YTsKPj4gIAlzdHJ1Y3QgaGRtaV9jb250ZXh0ICpoZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShk ZXYpOwo+PiAgCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9ICZoZGF0YS0+ZW5jb2RlcjsK Pj4gKwlzdHJ1Y3QgaGRtaV9hdWRpb19pbmZvZnJhbWUgKmF1ZGlvX2luZm9mcmFtZSA9ICZoZGF0 YS0+YXVkaW8uaW5mb2ZyYW1lOwo+PiAgCXN0cnVjdCBleHlub3NfZHJtX2NydGMgKmNydGM7Cj4+ ICAJaW50IHJldDsKPj4KPj4gQEAgLTE3MDQsNiArMTgyMCwxMiBAQCBzdGF0aWMgaW50IGhkbWlf YmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0 YSkKPj4KPj4gIAloZGF0YS0+cGh5X2Nsay5lbmFibGUgPSBoZG1pcGh5X2Nsa19lbmFibGU7Cj4+ Cj4+ICsJaGRtaV9hdWRpb19pbmZvZnJhbWVfaW5pdChhdWRpb19pbmZvZnJhbWUpOwo+PiArCWF1 ZGlvX2luZm9mcmFtZS0+Y29kaW5nX3R5cGUgPSBIRE1JX0FVRElPX0NPRElOR19UWVBFX1NUUkVB TTsKPj4gKwlhdWRpb19pbmZvZnJhbWUtPnNhbXBsZV9zaXplID0gSERNSV9BVURJT19TQU1QTEVf U0laRV9TVFJFQU07Cj4+ICsJYXVkaW9faW5mb2ZyYW1lLT5zYW1wbGVfZnJlcXVlbmN5ID0gSERN SV9BVURJT19TQU1QTEVfRlJFUVVFTkNZX1NUUkVBTTsKPj4gKwlhdWRpb19pbmZvZnJhbWUtPmNo YW5uZWxzID0gMjsKPj4gKwo+PiAgCWRybV9lbmNvZGVyX2luaXQoZHJtX2RldiwgZW5jb2Rlciwg JmV4eW5vc19oZG1pX2VuY29kZXJfZnVuY3MsCj4+ICAJCQkgRFJNX01PREVfRU5DT0RFUl9UTURT LCBOVUxMKTsKPj4KPj4gQEAgLTE4MTgsNiArMTk0MCw4IEBAIHN0YXRpYyBpbnQgaGRtaV9wcm9i ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+Pgo+PiAgCWhkYXRhLT5kZXYgPSBkZXY7 Cj4+Cj4+ICsJbXV0ZXhfaW5pdCgmaGRhdGEtPm11dGV4KTsKPj4gKwo+PiAgCXJldCA9IGhkbWlf cmVzb3VyY2VzX2luaXQoaGRhdGEpOwo+PiAgCWlmIChyZXQpIHsKPj4gIAkJaWYgKHJldCAhPSAt RVBST0JFX0RFRkVSKQo+PiBAQCAtMTg3NywxMiArMjAwMSwxOSBAQCBzdGF0aWMgaW50IGhkbWlf cHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPj4KPj4gIAlwbV9ydW50aW1lX2Vu YWJsZShkZXYpOwo+Pgo+PiAtCXJldCA9IGNvbXBvbmVudF9hZGQoJnBkZXYtPmRldiwgJmhkbWlf Y29tcG9uZW50X29wcyk7Cj4+ICsJcmV0ID0gaGRtaV9yZWdpc3Rlcl9hdWRpb19kZXZpY2UoaGRh dGEpOwo+PiAgCWlmIChyZXQpCj4+ICAJCWdvdG8gZXJyX25vdGlmaWVyX3B1dDsKPj4KPj4gKwly ZXQgPSBjb21wb25lbnRfYWRkKCZwZGV2LT5kZXYsICZoZG1pX2NvbXBvbmVudF9vcHMpOwo+PiAr CWlmIChyZXQpCj4+ICsJCWdvdG8gZXJyX3VucmVnaXN0ZXJfYXVkaW87Cj4+ICsKPj4gIAlyZXR1 cm4gcmV0Owo+Pgo+PiArZXJyX3VucmVnaXN0ZXJfYXVkaW86Cj4+ICsJaGRtaV91bnJlZ2lzdGVy X2F1ZGlvX2RldmljZShoZGF0YSk7Cj4+ICsKPj4gIGVycl9ub3RpZmllcl9wdXQ6Cj4+ICAJY2Vj X25vdGlmaWVyX3B1dChoZGF0YS0+bm90aWZpZXIpOwo+PiAgCXBtX3J1bnRpbWVfZGlzYWJsZShk ZXYpOwo+PiBAQCAtMTkyMSw2ICsyMDUyLDggQEAgc3RhdGljIGludCBoZG1pX3JlbW92ZShzdHJ1 Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+Pgo+PiAgCXB1dF9kZXZpY2UoJmhkYXRhLT5kZGNf YWRwdC0+ZGV2KTsKPj4KPj4gKwltdXRleF9kZXN0cm95KCZoZGF0YS0+bXV0ZXgpOwo+PiArCj4+ ICAJcmV0dXJuIDA7Cj4+ICB9Cj4+Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5 bm9zL3JlZ3MtaGRtaS5oIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9yZWdzLWhkbWkuaAo+PiBp bmRleCBhMDUwN2RjLi5kODQzYjFmIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5 bm9zL3JlZ3MtaGRtaS5oCj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvcmVncy1oZG1p LmgKPj4gQEAgLTQxOSwxMSArNDE5LDkgQEAKPj4gICNkZWZpbmUgSERNSV9JMlNfRFNEX0NPTgkJ SERNSV9JMlNfQkFTRSgweDAxYykKPj4gICNkZWZpbmUgSERNSV9JMlNfTVVYX0NPTgkJSERNSV9J MlNfQkFTRSgweDAyMCkKPj4gICNkZWZpbmUgSERNSV9JMlNfQ0hfU1RfQ09OCQlIRE1JX0kyU19C QVNFKDB4MDI0KQo+PiAtI2RlZmluZSBIRE1JX0kyU19DSF9TVF8wCQlIRE1JX0kyU19CQVNFKDB4 MDI4KQo+PiAtI2RlZmluZSBIRE1JX0kyU19DSF9TVF8xCQlIRE1JX0kyU19CQVNFKDB4MDJjKQo+ PiAtI2RlZmluZSBIRE1JX0kyU19DSF9TVF8yCQlIRE1JX0kyU19CQVNFKDB4MDMwKQo+PiAtI2Rl ZmluZSBIRE1JX0kyU19DSF9TVF8zCQlIRE1JX0kyU19CQVNFKDB4MDM0KQo+PiAtI2RlZmluZSBI RE1JX0kyU19DSF9TVF80CQlIRE1JX0kyU19CQVNFKDB4MDM4KQo+PiArLyogbiBtdXN0IGJlIHdp dGhpbmcgcmFuZ2UgMC4uLihIRE1JX0kyU19DSF9TVF9NQVhOVU0gLSAxKSAqLwo+PiArI2RlZmlu ZSBIRE1JX0kyU19DSF9TVF9NQVhOVU0JCTUKPj4gKyNkZWZpbmUgSERNSV9JMlNfQ0hfU1QobikJ CUhETUlfSTJTX0JBU0UoMHgwMjggKyA0ICogKG4pKQo+PiAgI2RlZmluZSBIRE1JX0kyU19DSF9T VF9TSF8wCQlIRE1JX0kyU19CQVNFKDB4MDNjKQo+PiAgI2RlZmluZSBIRE1JX0kyU19DSF9TVF9T SF8xCQlIRE1JX0kyU19CQVNFKDB4MDQwKQo+PiAgI2RlZmluZSBIRE1JX0kyU19DSF9TVF9TSF8y CQlIRE1JX0kyU19CQVNFKDB4MDQ0KQo+PiAtLQo+PiAxLjkuMQo+IAo+IAo+IApfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBs aXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVz a3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: inki.dae@samsung.com (Inki Dae) Date: Mon, 16 Oct 2017 07:48:22 +0900 Subject: [PATCH v3] drm: exynos: Add driver for HDMI audio interface In-Reply-To: References: <1506435469-10591-1-git-send-email-s.nawrocki@samsung.com> Message-ID: <59E3E5B6.9050300@samsung.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org 2017? 10? 12? 18:51? Sylwester Nawrocki ?(?) ? ?: > On 09/26/2017 04:17 PM, Sylwester Nawrocki wrote: >> The hdmi-codec interface added in this patch is required to properly >> support HDMI audio. Currently the audio part of the SoC internal >> HDMI transmitter is configured with fixed values, which makes HDMI >> audio working by chance, only on boards having an external audio >> codec connected in parallel with the HDMI audio transmitter's input >> I2S interface. >> >> Signed-off-by: Sylwester Nawrocki >> Reviewed-by: Andrzej Hajda > > Any comments on this patch? I will review this patch including other patch series which should go to -next at end of this week. Thanks, Inki Dae > > Thanks, > Sylwester > >> --- >> Tested on Odroid XU3 and Odroid XU4 with Ubuntu 14.04. >> >> Changes since v2: >> - u8 replaced with bool type, >> - the HDMI codec iec.status data used directly for setting up >> the HDMI controller registers rather than using hard coded >> constants, >> - constants used for configuring the HDMI_AUI_CON register >> instead of plain numbers, >> - if/IS_ERR/return replaced with PTR_ERR_OR_ZERO(). >> >> Changes since v1: >> - rebased onto v4.14-rc1 and adapted locking >> >> Changes since RFC version: >> - fixed hdmi-codec locking issue >> - added a comment documenting struct hdmi_contex::mutex >> --- >> drivers/gpu/drm/exynos/Kconfig | 1 + >> drivers/gpu/drm/exynos/exynos_hdmi.c | 253 ++++++++++++++++++++++++++--------- >> drivers/gpu/drm/exynos/regs-hdmi.h | 8 +- >> 3 files changed, 197 insertions(+), 65 deletions(-) >> >> diff --git a/drivers/gpu/drm/exynos/Kconfig b/drivers/gpu/drm/exynos/Kconfig >> index 305dc3d..5a7c9d8 100644 >> --- a/drivers/gpu/drm/exynos/Kconfig >> +++ b/drivers/gpu/drm/exynos/Kconfig >> @@ -3,6 +3,7 @@ config DRM_EXYNOS >> depends on OF && DRM && (ARCH_S3C64XX || ARCH_EXYNOS || ARCH_MULTIPLATFORM) >> select DRM_KMS_HELPER >> select VIDEOMODE_HELPERS >> + select SND_SOC_HDMI_CODEC if SND_SOC >> help >> Choose this option if you have a Samsung SoC EXYNOS chipset. >> If M is selected the module will be called exynosdrm. >> diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c >> index 214fa5e..d2b389a 100644 >> --- a/drivers/gpu/drm/exynos/exynos_hdmi.c >> +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c >> @@ -40,7 +40,7 @@ >> #include >> #include >> #include >> - >> +#include >> #include >> >> #include >> @@ -111,12 +111,18 @@ struct hdmi_driver_data { >> struct string_array_spec clk_muxes; >> }; >> >> +struct hdmi_audio { >> + struct platform_device *pdev; >> + struct hdmi_audio_infoframe infoframe; >> + struct hdmi_codec_params params; >> + bool enable; >> +}; >> + >> struct hdmi_context { >> struct drm_encoder encoder; >> struct device *dev; >> struct drm_device *drm_dev; >> struct drm_connector connector; >> - bool powered; >> bool dvi_mode; >> struct delayed_work hotplug_work; >> struct drm_display_mode current_mode; >> @@ -137,6 +143,11 @@ struct hdmi_context { >> struct regulator *reg_hdmi_en; >> struct exynos_drm_clk phy_clk; >> struct drm_bridge *bridge; >> + >> + /* mutex protecting subsequent fields below */ >> + struct mutex mutex; >> + struct hdmi_audio audio; >> + bool powered; >> }; >> >> static inline struct hdmi_context *encoder_to_hdmi(struct drm_encoder *e) >> @@ -768,6 +779,22 @@ static int hdmi_clk_set_parents(struct hdmi_context *hdata, bool to_phy) >> return ret; >> } >> >> +static int hdmi_audio_infoframe_apply(struct hdmi_context *hdata) >> +{ >> + struct hdmi_audio_infoframe *infoframe = &hdata->audio.infoframe; >> + u8 buf[HDMI_INFOFRAME_SIZE(AUDIO)]; >> + int len; >> + >> + len = hdmi_audio_infoframe_pack(infoframe, buf, sizeof(buf)); >> + if (len < 0) >> + return len; >> + >> + hdmi_reg_writeb(hdata, HDMI_AUI_CON, HDMI_AUI_CON_EVERY_VSYNC); >> + hdmi_reg_write_buf(hdata, HDMI_AUI_HEADER0, buf, len); >> + >> + return 0; >> +} >> + >> static void hdmi_reg_infoframes(struct hdmi_context *hdata) >> { >> union hdmi_infoframe frm; >> @@ -805,15 +832,7 @@ static void hdmi_reg_infoframes(struct hdmi_context *hdata) >> hdmi_reg_write_buf(hdata, HDMI_VSI_DATA(0), buf + 3, ret - 3); >> } >> >> - ret = hdmi_audio_infoframe_init(&frm.audio); >> - if (!ret) { >> - frm.audio.channels = 2; >> - ret = hdmi_audio_infoframe_pack(&frm.audio, buf, sizeof(buf)); >> - } >> - if (ret > 0) { >> - hdmi_reg_writeb(hdata, HDMI_AUI_CON, HDMI_AUI_CON_EVERY_VSYNC); >> - hdmi_reg_write_buf(hdata, HDMI_AUI_HEADER0, buf, ret); >> - } >> + hdmi_audio_infoframe_apply(hdata); >> } >> >> static enum drm_connector_status hdmi_detect(struct drm_connector *connector, >> @@ -995,23 +1014,18 @@ static void hdmi_reg_acr(struct hdmi_context *hdata, u32 freq) >> hdmi_reg_writeb(hdata, HDMI_ACR_CON, 4); >> } >> >> -static void hdmi_audio_init(struct hdmi_context *hdata) >> +static void hdmi_audio_config(struct hdmi_context *hdata) >> { >> - u32 sample_rate, bits_per_sample; >> - u32 data_num, bit_ch, sample_frq; >> - u32 val; >> - >> - sample_rate = 44100; >> - bits_per_sample = 16; >> + u32 bit_ch = 1; >> + u32 data_num, val; >> + int i; >> >> - switch (bits_per_sample) { >> + switch (hdata->audio.params.sample_width) { >> case 20: >> data_num = 2; >> - bit_ch = 1; >> break; >> case 24: >> data_num = 3; >> - bit_ch = 1; >> break; >> default: >> data_num = 1; >> @@ -1019,7 +1033,7 @@ static void hdmi_audio_init(struct hdmi_context *hdata) >> break; >> } >> >> - hdmi_reg_acr(hdata, sample_rate); >> + hdmi_reg_acr(hdata, hdata->audio.params.sample_rate); >> >> hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CON, HDMI_I2S_IN_DISABLE >> | HDMI_I2S_AUD_I2S | HDMI_I2S_CUV_I2S_ENABLE >> @@ -1029,12 +1043,6 @@ static void hdmi_audio_init(struct hdmi_context *hdata) >> | HDMI_I2S_CH1_EN | HDMI_I2S_CH2_EN); >> >> hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CUV, HDMI_I2S_CUV_RL_EN); >> - >> - sample_frq = (sample_rate == 44100) ? 0 : >> - (sample_rate == 48000) ? 2 : >> - (sample_rate == 32000) ? 3 : >> - (sample_rate == 96000) ? 0xa : 0x0; >> - >> hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_DIS); >> hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_EN); >> >> @@ -1058,31 +1066,24 @@ static void hdmi_audio_init(struct hdmi_context *hdata) >> | HDMI_I2S_SET_SDATA_BIT(data_num) >> | HDMI_I2S_BASIC_FORMAT); >> >> - /* Configure register related to CUV information */ >> - hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_0, HDMI_I2S_CH_STATUS_MODE_0 >> - | HDMI_I2S_2AUD_CH_WITHOUT_PREEMPH >> - | HDMI_I2S_COPYRIGHT >> - | HDMI_I2S_LINEAR_PCM >> - | HDMI_I2S_CONSUMER_FORMAT); >> - hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_1, HDMI_I2S_CD_PLAYER); >> - hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_2, HDMI_I2S_SET_SOURCE_NUM(0)); >> - hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_3, HDMI_I2S_CLK_ACCUR_LEVEL_2 >> - | HDMI_I2S_SET_SMP_FREQ(sample_frq)); >> - hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_4, >> - HDMI_I2S_ORG_SMP_FREQ_44_1 >> - | HDMI_I2S_WORD_LEN_MAX24_24BITS >> - | HDMI_I2S_WORD_LEN_MAX_24BITS); >> + /* Configure registers related to CUV information */ >> + for (i = 0; i < HDMI_I2S_CH_ST_MAXNUM; i++) >> + hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST(i), >> + hdata->audio.params.iec.status[i]); >> >> hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_CON, HDMI_I2S_CH_STATUS_RELOAD); >> } >> >> -static void hdmi_audio_control(struct hdmi_context *hdata, bool onoff) >> +static void hdmi_audio_control(struct hdmi_context *hdata) >> { >> + bool enable = hdata->audio.enable; >> + >> if (hdata->dvi_mode) >> return; >> >> - hdmi_reg_writeb(hdata, HDMI_AUI_CON, onoff ? 2 : 0); >> - hdmi_reg_writemask(hdata, HDMI_CON_0, onoff ? >> + hdmi_reg_writeb(hdata, HDMI_AUI_CON, enable ? >> + HDMI_AVI_CON_EVERY_VSYNC : HDMI_AUI_CON_NO_TRAN); >> + hdmi_reg_writemask(hdata, HDMI_CON_0, enable ? >> HDMI_ASP_EN : HDMI_ASP_DIS, HDMI_ASP_MASK); >> } >> >> @@ -1398,13 +1399,14 @@ static void hdmiphy_conf_apply(struct hdmi_context *hdata) >> hdmiphy_wait_for_pll(hdata); >> } >> >> +/* Should be called with hdata->mutex mutex held */ >> static void hdmi_conf_apply(struct hdmi_context *hdata) >> { >> hdmi_start(hdata, false); >> hdmi_conf_init(hdata); >> - hdmi_audio_init(hdata); >> + hdmi_audio_config(hdata); >> hdmi_mode_apply(hdata); >> - hdmi_audio_control(hdata, true); >> + hdmi_audio_control(hdata); >> } >> >> static void hdmi_mode_set(struct drm_encoder *encoder, >> @@ -1431,6 +1433,7 @@ static void hdmi_set_refclk(struct hdmi_context *hdata, bool on) >> SYSREG_HDMI_REFCLK_INT_CLK, on ? ~0 : 0); >> } >> >> +/* Should be called with hdata->mutex mutex held. */ >> static void hdmiphy_enable(struct hdmi_context *hdata) >> { >> if (hdata->powered) >> @@ -1453,6 +1456,7 @@ static void hdmiphy_enable(struct hdmi_context *hdata) >> hdata->powered = true; >> } >> >> +/* Should be called with hdata->mutex mutex held. */ >> static void hdmiphy_disable(struct hdmi_context *hdata) >> { >> if (!hdata->powered) >> @@ -1478,28 +1482,38 @@ static void hdmi_enable(struct drm_encoder *encoder) >> { >> struct hdmi_context *hdata = encoder_to_hdmi(encoder); >> >> + mutex_lock(&hdata->mutex); >> + >> hdmiphy_enable(hdata); >> hdmi_conf_apply(hdata); >> + >> + mutex_unlock(&hdata->mutex); >> } >> >> static void hdmi_disable(struct drm_encoder *encoder) >> { >> struct hdmi_context *hdata = encoder_to_hdmi(encoder); >> >> - if (!hdata->powered) >> + mutex_lock(&hdata->mutex); >> + >> + if (hdata->powered) { >> + /* >> + * The SFRs of VP and Mixer are updated by Vertical Sync of >> + * Timing generator which is a part of HDMI so the sequence >> + * to disable TV Subsystem should be as following, >> + * VP -> Mixer -> HDMI >> + * >> + * To achieve such sequence HDMI is disabled together with >> + * HDMI PHY, via pipe clock callback. >> + */ >> + mutex_unlock(&hdata->mutex); >> + cancel_delayed_work(&hdata->hotplug_work); >> + cec_notifier_set_phys_addr(hdata->notifier, >> + CEC_PHYS_ADDR_INVALID); >> return; >> + } >> >> - /* >> - * The SFRs of VP and Mixer are updated by Vertical Sync of >> - * Timing generator which is a part of HDMI so the sequence >> - * to disable TV Subsystem should be as following, >> - * VP -> Mixer -> HDMI >> - * >> - * To achieve such sequence HDMI is disabled together with HDMI PHY, via >> - * pipe clock callback. >> - */ >> - cancel_delayed_work(&hdata->hotplug_work); >> - cec_notifier_set_phys_addr(hdata->notifier, CEC_PHYS_ADDR_INVALID); >> + mutex_unlock(&hdata->mutex); >> } >> >> static const struct drm_encoder_helper_funcs exynos_hdmi_encoder_helper_funcs = { >> @@ -1513,6 +1527,104 @@ static void hdmi_disable(struct drm_encoder *encoder) >> .destroy = drm_encoder_cleanup, >> }; >> >> +static void hdmi_audio_shutdown(struct device *dev, void *data) >> +{ >> + struct hdmi_context *hdata = dev_get_drvdata(dev); >> + >> + mutex_lock(&hdata->mutex); >> + >> + hdata->audio.enable = false; >> + >> + if (hdata->powered) >> + hdmi_audio_control(hdata); >> + >> + mutex_unlock(&hdata->mutex); >> +} >> + >> +static int hdmi_audio_hw_params(struct device *dev, void *data, >> + struct hdmi_codec_daifmt *daifmt, >> + struct hdmi_codec_params *params) >> +{ >> + struct hdmi_context *hdata = dev_get_drvdata(dev); >> + >> + if (daifmt->fmt != HDMI_I2S || daifmt->bit_clk_inv || >> + daifmt->frame_clk_inv || daifmt->bit_clk_master || >> + daifmt->frame_clk_master) { >> + dev_err(dev, "%s: Bad flags %d %d %d %d\n", __func__, >> + daifmt->bit_clk_inv, daifmt->frame_clk_inv, >> + daifmt->bit_clk_master, >> + daifmt->frame_clk_master); >> + return -EINVAL; >> + } >> + >> + mutex_lock(&hdata->mutex); >> + >> + hdata->audio.params = *params; >> + >> + if (hdata->powered) { >> + hdmi_audio_config(hdata); >> + hdmi_audio_infoframe_apply(hdata); >> + } >> + >> + mutex_unlock(&hdata->mutex); >> + >> + return 0; >> +} >> + >> +static int hdmi_audio_digital_mute(struct device *dev, void *data, bool mute) >> +{ >> + struct hdmi_context *hdata = dev_get_drvdata(dev); >> + >> + mutex_lock(&hdata->mutex); >> + >> + hdata->audio.enable = !mute; >> + >> + if (hdata->powered) >> + hdmi_audio_control(hdata); >> + >> + mutex_unlock(&hdata->mutex); >> + >> + return 0; >> +} >> + >> +static int hdmi_audio_get_eld(struct device *dev, void *data, uint8_t *buf, >> + size_t len) >> +{ >> + struct hdmi_context *hdata = dev_get_drvdata(dev); >> + struct drm_connector *connector = &hdata->connector; >> + >> + memcpy(buf, connector->eld, min(sizeof(connector->eld), len)); >> + >> + return 0; >> +} >> + >> +static const struct hdmi_codec_ops audio_codec_ops = { >> + .hw_params = hdmi_audio_hw_params, >> + .audio_shutdown = hdmi_audio_shutdown, >> + .digital_mute = hdmi_audio_digital_mute, >> + .get_eld = hdmi_audio_get_eld, >> +}; >> + >> +static int hdmi_register_audio_device(struct hdmi_context *hdata) >> +{ >> + struct hdmi_codec_pdata codec_data = { >> + .ops = &audio_codec_ops, >> + .max_i2s_channels = 6, >> + .i2s = 1, >> + }; >> + >> + hdata->audio.pdev = platform_device_register_data( >> + hdata->dev, HDMI_CODEC_DRV_NAME, PLATFORM_DEVID_AUTO, >> + &codec_data, sizeof(codec_data)); >> + >> + return PTR_ERR_OR_ZERO(hdata->audio.pdev); >> +} >> + >> +static void hdmi_unregister_audio_device(struct hdmi_context *hdata) >> +{ >> + platform_device_unregister(hdata->audio.pdev); >> +} >> + >> static void hdmi_hotplug_work_func(struct work_struct *work) >> { >> struct hdmi_context *hdata; >> @@ -1588,11 +1700,14 @@ static void hdmiphy_clk_enable(struct exynos_drm_clk *clk, bool enable) >> { >> struct hdmi_context *hdata = container_of(clk, struct hdmi_context, >> phy_clk); >> + mutex_lock(&hdata->mutex); >> >> if (enable) >> hdmiphy_enable(hdata); >> else >> hdmiphy_disable(hdata); >> + >> + mutex_unlock(&hdata->mutex); >> } >> >> static int hdmi_bridge_init(struct hdmi_context *hdata) >> @@ -1697,6 +1812,7 @@ static int hdmi_bind(struct device *dev, struct device *master, void *data) >> struct drm_device *drm_dev = data; >> struct hdmi_context *hdata = dev_get_drvdata(dev); >> struct drm_encoder *encoder = &hdata->encoder; >> + struct hdmi_audio_infoframe *audio_infoframe = &hdata->audio.infoframe; >> struct exynos_drm_crtc *crtc; >> int ret; >> >> @@ -1704,6 +1820,12 @@ static int hdmi_bind(struct device *dev, struct device *master, void *data) >> >> hdata->phy_clk.enable = hdmiphy_clk_enable; >> >> + hdmi_audio_infoframe_init(audio_infoframe); >> + audio_infoframe->coding_type = HDMI_AUDIO_CODING_TYPE_STREAM; >> + audio_infoframe->sample_size = HDMI_AUDIO_SAMPLE_SIZE_STREAM; >> + audio_infoframe->sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM; >> + audio_infoframe->channels = 2; >> + >> drm_encoder_init(drm_dev, encoder, &exynos_hdmi_encoder_funcs, >> DRM_MODE_ENCODER_TMDS, NULL); >> >> @@ -1818,6 +1940,8 @@ static int hdmi_probe(struct platform_device *pdev) >> >> hdata->dev = dev; >> >> + mutex_init(&hdata->mutex); >> + >> ret = hdmi_resources_init(hdata); >> if (ret) { >> if (ret != -EPROBE_DEFER) >> @@ -1877,12 +2001,19 @@ static int hdmi_probe(struct platform_device *pdev) >> >> pm_runtime_enable(dev); >> >> - ret = component_add(&pdev->dev, &hdmi_component_ops); >> + ret = hdmi_register_audio_device(hdata); >> if (ret) >> goto err_notifier_put; >> >> + ret = component_add(&pdev->dev, &hdmi_component_ops); >> + if (ret) >> + goto err_unregister_audio; >> + >> return ret; >> >> +err_unregister_audio: >> + hdmi_unregister_audio_device(hdata); >> + >> err_notifier_put: >> cec_notifier_put(hdata->notifier); >> pm_runtime_disable(dev); >> @@ -1921,6 +2052,8 @@ static int hdmi_remove(struct platform_device *pdev) >> >> put_device(&hdata->ddc_adpt->dev); >> >> + mutex_destroy(&hdata->mutex); >> + >> return 0; >> } >> >> diff --git a/drivers/gpu/drm/exynos/regs-hdmi.h b/drivers/gpu/drm/exynos/regs-hdmi.h >> index a0507dc..d843b1f 100644 >> --- a/drivers/gpu/drm/exynos/regs-hdmi.h >> +++ b/drivers/gpu/drm/exynos/regs-hdmi.h >> @@ -419,11 +419,9 @@ >> #define HDMI_I2S_DSD_CON HDMI_I2S_BASE(0x01c) >> #define HDMI_I2S_MUX_CON HDMI_I2S_BASE(0x020) >> #define HDMI_I2S_CH_ST_CON HDMI_I2S_BASE(0x024) >> -#define HDMI_I2S_CH_ST_0 HDMI_I2S_BASE(0x028) >> -#define HDMI_I2S_CH_ST_1 HDMI_I2S_BASE(0x02c) >> -#define HDMI_I2S_CH_ST_2 HDMI_I2S_BASE(0x030) >> -#define HDMI_I2S_CH_ST_3 HDMI_I2S_BASE(0x034) >> -#define HDMI_I2S_CH_ST_4 HDMI_I2S_BASE(0x038) >> +/* n must be withing range 0...(HDMI_I2S_CH_ST_MAXNUM - 1) */ >> +#define HDMI_I2S_CH_ST_MAXNUM 5 >> +#define HDMI_I2S_CH_ST(n) HDMI_I2S_BASE(0x028 + 4 * (n)) >> #define HDMI_I2S_CH_ST_SH_0 HDMI_I2S_BASE(0x03c) >> #define HDMI_I2S_CH_ST_SH_1 HDMI_I2S_BASE(0x040) >> #define HDMI_I2S_CH_ST_SH_2 HDMI_I2S_BASE(0x044) >> -- >> 1.9.1 > > >