From mboxrd@z Thu Jan 1 00:00:00 1970 From: Liam Girdwood Subject: Re: [PATCH v2] NUC900/audio: add nuc900 audio driver support Date: Wed, 19 May 2010 11:55:24 +0100 Message-ID: <1274266524.3240.106.camel@odin> References: <4BF2289A.9030609@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wy0-f179.google.com (mail-wy0-f179.google.com [74.125.82.179]) by alsa0.perex.cz (Postfix) with ESMTP id ECABC24614 for ; Wed, 19 May 2010 12:55:30 +0200 (CEST) Received: by wyb32 with SMTP id 32so761624wyb.38 for ; Wed, 19 May 2010 03:55:30 -0700 (PDT) In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: alsa-devel-bounces@alsa-project.org Errors-To: alsa-devel-bounces@alsa-project.org To: Wan ZongShun Cc: alsa-devel , Mark Brown , linux-arm-kernel , zswan@marvell.com List-Id: alsa-devel@alsa-project.org T24gV2VkLCAyMDEwLTA1LTE5IGF0IDE2OjA3ICswODAwLCBXYW4gWm9uZ1NodW4gd3JvdGU6Cj4g SGkgTWFyaywKPiAKPiBIb3cgYWJvdXQgdGhpcyBwYXRjaD8KPiBDb3VsZCBpdCBiZSBtZXJnZWQg aW50byBtYWlubGluZT8KClNvbWUgbWlub3IgY29tbWVudHMgaW5saW5lLgoKPiAKPiBUaGFua3Mh Cj4gCj4g5ZyoIDIwMTDlubQ15pyIMTjml6Ug5LiL5Y2IMTo0Me+8jFdhbiBab25nU2h1biA8bWN1 b3MuY29tQGdtYWlsLmNvbT4g5YaZ6YGT77yaCj4gPiBEZWFyIE1hcmssCj4gPgo+ID4gSSBoYXZl IG1vZGlmaWVkIHNvbWUgY29kZXMgYWNjb3JkaW5nIHRvIHlvdXIgY29tbWVudHMsCj4gPiBub3cg SSBzdWJtaXQgdGhlIHBhdGNoIGFzIHYyIGFnYWluLgo+ID4KPiA+IFRoYW5rcyBhIGxvdCBmb3Ig eW91ciBoZWxwLgo+ID4KPiA+IFNpZ25lZC1vZmYtYnk6IFdhbiBab25nU2h1bjxtY3Vvcy5jb21A Z21haWwuY29tPgo+ID4gLS0tCj4gPiAgc291bmQvc29jL0tjb25maWcgICAgICAgICAgICAgICB8 ICAgIDEgKwo+ID4gIHNvdW5kL3NvYy9NYWtlZmlsZSAgICAgICAgICAgICAgfCAgICAxICsKPiA+ ICBzb3VuZC9zb2MvbnVjOTAwL0tjb25maWcgICAgICAgIHwgICAyNyArKysKPiA+ICBzb3VuZC9z b2MvbnVjOTAwL01ha2VmaWxlICAgICAgIHwgICAxMSArCj4gPiAgc291bmQvc29jL251YzkwMC9u dWM5MDAtYWM5Ny5jICB8ICA0NDMgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrCj4gPiAgc291bmQvc29jL251YzkwMC9udWM5MDAtYXVkaW8uYyB8ICAgODEgKysrKysrKwo+ ID4gIHNvdW5kL3NvYy9udWM5MDAvbnVjOTAwLWF1aWRvLmggfCAgMTIxICsrKysrKysrKysrCj4g PiAgc291bmQvc29jL251YzkwMC9udWM5MDAtcGNtLmMgICB8ICAzNTIgKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKwo+ID4gIDggZmlsZXMgY2hhbmdlZCwgMTAzNyBpbnNlcnRpb25zKCsp LCAwIGRlbGV0aW9ucygtKQo+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBzb3VuZC9zb2MvbnVjOTAw L0tjb25maWcKPiA+ICBjcmVhdGUgbW9kZSAxMDA2NDQgc291bmQvc29jL251YzkwMC9NYWtlZmls ZQo+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBzb3VuZC9zb2MvbnVjOTAwL251YzkwMC1hYzk3LmMK PiA+ICBjcmVhdGUgbW9kZSAxMDA2NDQgc291bmQvc29jL251YzkwMC9udWM5MDAtYXVkaW8uYwo+ ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBzb3VuZC9zb2MvbnVjOTAwL251YzkwMC1hdWlkby5oCj4g PiAgY3JlYXRlIG1vZGUgMTAwNjQ0IHNvdW5kL3NvYy9udWM5MDAvbnVjOTAwLXBjbS5jCj4gPgo+ ID4gZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9LY29uZmlnIGIvc291bmQvc29jL0tjb25maWcKPiA+ IGluZGV4IGIxNzQ5YmMuLjZlMDRmYzIgMTAwNjQ0Cj4gPiAtLS0gYS9zb3VuZC9zb2MvS2NvbmZp Zwo+ID4gKysrIGIvc291bmQvc29jL0tjb25maWcKPiA+IEBAIC0zMCw2ICszMCw3IEBAIHNvdXJj ZSAic291bmQvc29jL2JsYWNrZmluL0tjb25maWciCj4gPiAgc291cmNlICJzb3VuZC9zb2MvZGF2 aW5jaS9LY29uZmlnIgo+ID4gIHNvdXJjZSAic291bmQvc29jL2ZzbC9LY29uZmlnIgo+ID4gIHNv dXJjZSAic291bmQvc29jL2lteC9LY29uZmlnIgo+ID4gK3NvdXJjZSAic291bmQvc29jL251Yzkw MC9LY29uZmlnIgo+ID4gIHNvdXJjZSAic291bmQvc29jL29tYXAvS2NvbmZpZyIKPiA+ICBzb3Vy Y2UgInNvdW5kL3NvYy9weGEvS2NvbmZpZyIKPiA+ICBzb3VyY2UgInNvdW5kL3NvYy9zM2MyNHh4 L0tjb25maWciCj4gPiBkaWZmIC0tZ2l0IGEvc291bmQvc29jL01ha2VmaWxlIGIvc291bmQvc29j L01ha2VmaWxlCj4gPiBpbmRleCAxNDcwMTQxLi5jY2VjMjQxIDEwMDY0NAo+ID4gLS0tIGEvc291 bmQvc29jL01ha2VmaWxlCj4gPiArKysgYi9zb3VuZC9zb2MvTWFrZWZpbGUKPiA+IEBAIC04LDYg KzgsNyBAQCBvYmotJChDT05GSUdfU05EX1NPQykgICArPSBibGFja2Zpbi8KPiA+ICBvYmotJChD T05GSUdfU05EX1NPQykgICs9IGRhdmluY2kvCj4gPiAgb2JqLSQoQ09ORklHX1NORF9TT0MpICAr PSBmc2wvCj4gPiAgb2JqLSQoQ09ORklHX1NORF9TT0MpICAgKz0gaW14Lwo+ID4gK29iai0kKENP TkZJR19TTkRfU09DKSAgKz0gbnVjOTAwLwo+ID4gIG9iai0kKENPTkZJR19TTkRfU09DKSAgKz0g b21hcC8KPiA+ICBvYmotJChDT05GSUdfU05EX1NPQykgICs9IHB4YS8KPiA+ICBvYmotJChDT05G SUdfU05EX1NPQykgICs9IHMzYzI0eHgvCj4gPiBkaWZmIC0tZ2l0IGEvc291bmQvc29jL251Yzkw MC9LY29uZmlnIGIvc291bmQvc29jL251YzkwMC9LY29uZmlnCj4gPiBuZXcgZmlsZSBtb2RlIDEw MDY0NAo+ID4gaW5kZXggMDAwMDAwMC4uYTBlZDFjNgo+ID4gLS0tIC9kZXYvbnVsbAo+ID4gKysr IGIvc291bmQvc29jL251YzkwMC9LY29uZmlnCj4gPiBAQCAtMCwwICsxLDI3IEBACj4gPiArIyMK PiA+ICsjIyBOVUM5MDAgc2VyaWVzIEFDOTcgQVBJCj4gPiArIyMKPiA+ICtjb25maWcgU05EX1NP Q19OVUM5MDAKPiA+ICsgICAgICAgdHJpc3RhdGUgIlNvQyBBdWRpbyBmb3IgTlVDOTAwIHNlcmll cyIKPiA+ICsgICAgICAgZGVwZW5kcyBvbiBBUkNIX1c5MFg5MDAKPiA+ICsgICAgICAgaGVscAo+ ID4gKyAgICAgICAgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgQUM5NyBtb2RlIG9u IHRoZSBOVUM5MDAgU29DLgo+ID4gKwo+ID4gK2NvbmZpZyBTTkRfU09DX05VQzkwMF9BQzk3Cj4g PiArICAgICAgIHRyaXN0YXRlCj4gPiArICAgICAgIHNlbGVjdCBBQzk3X0JVUwo+ID4gKyAgICAg ICBzZWxlY3QgU05EX0FDOTdfQ09ERUMKPiA+ICsgICAgICAgc2VsZWN0IFNORF9TT0NfQUM5N19C VVMKPiA+ICsKPiA+ICsKPiA+ICsjIwo+ID4gKyMjIEJvYXJkcwo+ID4gKyMjCj4gPiArY29uZmln IFNORF9TT0NfTlVDOTAwRVZCCj4gPiArICAgICAgIHRyaXN0YXRlICJOVUM5MDAgQUM5NyBzdXBw b3J0IGZvciBkZW1vIGJvYXJkIgo+ID4gKyAgICAgICBkZXBlbmRzIG9uIFNORF9TT0NfTlVDOTAw Cj4gPiArICAgICAgIHNlbGVjdCBTTkRfU09DX05VQzkwMF9BQzk3Cj4gPiArICAgICAgIHNlbGVj dCBTTkRfU09DX0FDOTdfQ09ERUMKPiA+ICsgICAgICAgaGVscAo+ID4gKyAgICAgICAgIFNlbGVj dCB0aGlzIG9wdGlvbiB0byBlbmFibGUgYXVkaW8gKEFDOTcpIG9uIHRoZQo+ID4gKyAgICAgICAg IE5VQzkwMCBkZW1vYm9hcmQuCj4gPiBkaWZmIC0tZ2l0IGEvc291bmQvc29jL251YzkwMC9NYWtl ZmlsZSBiL3NvdW5kL3NvYy9udWM5MDAvTWFrZWZpbGUKPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0 Cj4gPiBpbmRleCAwMDAwMDAwLi43ZTQ2YzcxCj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysgYi9z b3VuZC9zb2MvbnVjOTAwL01ha2VmaWxlCj4gPiBAQCAtMCwwICsxLDExIEBACj4gPiArIyBOVUM5 MDAgc2VyaWVzIGF1ZGlvCj4gPiArc25kLXNvYy1udWM5MDAtcGNtLW9ianMgOj0gbnVjOTAwLXBj bS5vCj4gPiArc25kLXNvYy1udWM5MDAtYWM5Ny1vYmpzIDo9IG51YzkwMC1hYzk3Lm8KPiA+ICsK PiA+ICtvYmotJChDT05GSUdfU05EX1NPQ19OVUM5MDApICs9IHNuZC1zb2MtbnVjOTAwLXBjbS5v Cj4gPiArb2JqLSQoQ09ORklHX1NORF9TT0NfTlVDOTAwX0FDOTcpICs9IHNuZC1zb2MtbnVjOTAw LWFjOTcubwo+ID4gKwo+ID4gKyMgQm9hcmRzCj4gPiArc25kLXNvYy1udWM5MDAtYXVkaW8tb2Jq cyA6PSBudWM5MDAtYXVkaW8ubwo+ID4gKwo+ID4gK29iai0kKENPTkZJR19TTkRfU09DX05VQzkw MEVWQikgKz0gc25kLXNvYy1udWM5MDAtYXVkaW8ubwo+ID4gZGlmZiAtLWdpdCBhL3NvdW5kL3Nv Yy9udWM5MDAvbnVjOTAwLWFjOTcuYyBiL3NvdW5kL3NvYy9udWM5MDAvbnVjOTAwLWFjOTcuYwo+ ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+IGluZGV4IDAwMDAwMDAuLjJjMzQ1ZTIKPiA+IC0t LSAvZGV2L251bGwKPiA+ICsrKyBiL3NvdW5kL3NvYy9udWM5MDAvbnVjOTAwLWFjOTcuYwo+ID4g QEAgLTAsMCArMSw0NDMgQEAKPiA+ICsvKgo+ID4gKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEw IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbi4KPiA+ICsgKgo+ID4gKyAqIFdhbiBab25n U2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KPiA+ICsgKgo+ID4gKyAqIFRoaXMgcHJvZ3JhbSBp cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4g PiArICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBhcyBwdWJsaXNoZWQgYnkKPiA+ICsgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uO3Zl cnNpb24gMiBvZiB0aGUgTGljZW5zZS4KPiA+ICsgKgo+ID4gKyAqLwo+ID4gKwo+ID4gKyNpbmNs dWRlIDxsaW51eC9pbml0Lmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ID4gKyNp bmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgo+ID4g KyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgo+ ID4gKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+Cj4gPiArI2luY2x1ZGUgPHNvdW5kL2NvcmUu aD4KPiA+ICsjaW5jbHVkZSA8c291bmQvcGNtLmg+Cj4gPiArI2luY2x1ZGUgPHNvdW5kL2luaXR2 YWwuaD4KPiA+ICsjaW5jbHVkZSA8c291bmQvc29jLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2Rl dmljZS5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KPiA+ICsKPiA+ICsjaW5jbHVkZSA8 bWFjaC9tZnAuaD4KPiA+ICsKPiA+ICsjaW5jbHVkZSAibnVjOTAwLWF1aWRvLmgiCj4gPiArCj4g PiArc3RhdGljIERFRklORV9NVVRFWChhYzk3X211dGV4KTsKPiA+ICtzdHJ1Y3QgbnVjOTAwX2F1 ZGlvICpudWM5MDBfYWM5N19kYXRhOwo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbnVjOTAwX2NoZWNr cmVhZHkodm9pZCkKPiA+ICt7Cj4gPiArICAgICAgIHN0cnVjdCBudWM5MDBfYXVkaW8gKm51Yzkw MF9hdWRpbyA9IG51YzkwMF9hYzk3X2RhdGE7Cj4gPiArCj4gPiArICAgICAgIGlmICghKEFVRElP X1JFQUQobnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNUTF9BQ0lTMCkgJiBDT0RFQ19SRUFEWSkpCj4g PiArICAgICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKPiA+ICsKPiA+ICsgICAgICAgcmV0dXJu IDA7Cj4gPiArfQo+ID4gKwo+ID4gKy8qIEFDOTcgY29udHJvbGxlciByZWFkcyBjb2RlYyByZWdp c3RlciAqLwo+ID4gK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBudWM5MDBfYWM5N19yZWFkKHN0cnVj dCBzbmRfYWM5NyAqYWM5NywKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB1bnNpZ25lZCBzaG9ydCByZWcpCj4gPiArewo+ID4gKyAgICAgICBzdHJ1Y3QgbnVjOTAw X2F1ZGlvICpudWM5MDBfYXVkaW8gPSBudWM5MDBfYWM5N19kYXRhOwo+ID4gKyAgICAgICB1bnNp Z25lZCBsb25nIHRpbWVvdXQgPSAweDEwMDAwLCB2YWw7Cj4gPiArCj4gPiArICAgICAgIG11dGV4 X2xvY2soJmFjOTdfbXV0ZXgpOwo+ID4gKwo+ID4gKyAgICAgICB2YWwgPSBudWM5MDBfY2hlY2ty ZWFkeSgpOwo+ID4gKyAgICAgICBpZiAoISF2YWwpIHsKPiA+ICsgICAgICAgICAgICAgICBkZXZf ZXJyKG51YzkwMF9hdWRpby0+ZGV2LCAiQUM5NyBjb2RlYyBpcyBub3QgcmVhZHlcbiIpOwo+ID4g KyAgICAgICAgICAgICAgIGdvdG8gb3V0Owo+ID4gKyAgICAgICB9Cj4gPiArCj4gPiArICAgICAg IC8qIHNldCB0aGUgUl9XQiBiaXQgYW5kIHdyaXRlIHJlZ2lzdGVyIGluZGV4ICovCj4gPiArICAg ICAgIEFVRElPX1dSSVRFKG51YzkwMF9hdWRpby0+bW1pbyArIEFDVExfQUNPUzEsIFJfV0IgfCBy ZWcpOwo+ID4gKwo+ID4gKyAgICAgICAvKiBzZXQgdGhlIHZhbGlkIGZyYW1lIGJpdCBhbmQgdmFs aWQgc2xvdHMgKi8KPiA+ICsgICAgICAgdmFsID0gQVVESU9fUkVBRChudWM5MDBfYXVkaW8tPm1t aW8gKyBBQ1RMX0FDT1MwKTsKPiA+ICsgICAgICAgdmFsIHw9IChWQUxJRF9GUkFNRSB8IFNMT1Qx X1ZBTElEKTsKPiA+ICsgICAgICAgQVVESU9fV1JJVEUobnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNU TF9BQ09TMCwgdmFsKTsKPiA+ICsKPiA+ICsgICAgICAgdWRlbGF5KDEwMCk7Cj4gPiArCj4gPiAr ICAgICAgIC8qIHBvbGxpbmcgdGhlIEFDX1JfRklOSVNIICovCj4gPiArICAgICAgIHZhbCA9IEFV RElPX1JFQUQobnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNUTF9BQ0NPTik7Cj4gPiArICAgICAgIHZh bCAmPSBBQ19SX0ZJTklTSDsKPiA+ICsgICAgICAgd2hpbGUgKCF2YWwgJiYgdGltZW91dC0tKQo+ ID4gKyAgICAgICAgICAgICAgIG1kZWxheSgxKTsKPiA+ICsKPiA+ICsgICAgICAgaWYgKCF0aW1l b3V0KSB7Cj4gPiArICAgICAgICAgICAgICAgZGV2X2VycihudWM5MDBfYXVkaW8tPmRldiwgIkFD OTcgcmVhZCByZWdpc3RlciB0aW1lIG91dCAhXG4iKTsKPiA+ICsgICAgICAgICAgICAgICB2YWwg PSAtRVBFUk07Cj4gPiArICAgICAgICAgICAgICAgZ290byBvdXQ7Cj4gPiArICAgICAgIH0KPiA+ ICsKPiA+ICsgICAgICAgdmFsID0gQVVESU9fUkVBRChudWM5MDBfYXVkaW8tPm1taW8gKyBBQ1RM X0FDT1MwKSA7Cj4gPiArICAgICAgIHZhbCAmPSB+U0xPVDFfVkFMSUQ7Cj4gPiArICAgICAgIEFV RElPX1dSSVRFKG51YzkwMF9hdWRpby0+bW1pbyArIEFDVExfQUNPUzAsIHZhbCk7Cj4gPiArCj4g PiArICAgICAgIGlmIChBVURJT19SRUFEKG51YzkwMF9hdWRpby0+bW1pbyArIEFDVExfQUNJUzEp ID4+IDIgIT0gcmVnKSB7Cj4gPiArICAgICAgICAgICAgICAgZGV2X2VycihudWM5MDBfYXVkaW8t PmRldiwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJfSU5ERVggb2YgUkVH X0FDVExfQUNJUzEgbm90IG1hdGNoIVxuIik7Cj4gPiArICAgICAgIH0KPiA+ICsKPiA+ICsgICAg ICAgdWRlbGF5KDEwMCk7Cj4gPiArICAgICAgIHZhbCA9IChBVURJT19SRUFEKG51YzkwMF9hdWRp by0+bW1pbyArIEFDVExfQUNJUzIpICYgMHhGRkZGKTsKPiA+ICsKPiA+ICtvdXQ6Cj4gPiArICAg ICAgIG11dGV4X3VubG9jaygmYWM5N19tdXRleCk7Cj4gPiArICAgICAgIHJldHVybiB2YWw7Cj4g PiArfQo+ID4gKwo+ID4gKy8qIEFDOTcgY29udHJvbGxlciB3cml0ZXMgdG8gY29kZWMgcmVnaXN0 ZXIgKi8KPiA+ICtzdGF0aWMgdm9pZCBudWM5MDBfYWM5N193cml0ZShzdHJ1Y3Qgc25kX2FjOTcg KmFjOTcsIHVuc2lnbmVkIHNob3J0IHJlZywKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgdW5zaWduZWQgc2hvcnQgdmFsKQo+ID4gK3sKPiA+ICsgICAgICAgc3RydWN0IG51Yzkw MF9hdWRpbyAqbnVjOTAwX2F1ZGlvID0gbnVjOTAwX2FjOTdfZGF0YTsKPiA+ICsgICAgICAgdW5z aWduZWQgbG9uZyB0bXAsIHRpbWVvdXQgPSAweDEwMDAwOwo+ID4gKwo+ID4gKyAgICAgICBtdXRl eF9sb2NrKCZhYzk3X211dGV4KTsKPiA+ICsKPiA+ICsgICAgICAgdG1wID0gbnVjOTAwX2NoZWNr cmVhZHkoKTsKPiA+ICsgICAgICAgaWYgKCEhdG1wKQo+ID4gKyAgICAgICAgICAgICAgIGRldl9l cnIobnVjOTAwX2F1ZGlvLT5kZXYsICJBQzk3IGNvZGVjIGlzIG5vdCByZWFkeVxuIik7Cj4gPiAr Cj4gPiArICAgICAgIC8qIGNsZWFyIHRoZSBSX1dCIGJpdCBhbmQgd3JpdGUgcmVnaXN0ZXIgaW5k ZXggKi8KPiA+ICsgICAgICAgQVVESU9fV1JJVEUobnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNUTF9B Q09TMSwgcmVnKTsKPiA+ICsKPiA+ICsgICAgICAgLyogd3JpdGUgcmVnaXN0ZXIgdmFsdWUgKi8K PiA+ICsgICAgICAgQVVESU9fV1JJVEUobnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNUTF9BQ09TMiwg dmFsKTsKPiA+ICsKPiA+ICsgICAgICAgLyogc2V0IHRoZSB2YWxpZCBmcmFtZSBiaXQgYW5kIHZh bGlkIHNsb3RzICovCj4gPiArICAgICAgIHRtcCA9IEFVRElPX1JFQUQobnVjOTAwX2F1ZGlvLT5t bWlvICsgQUNUTF9BQ09TMCk7Cj4gPiArICAgICAgIHRtcCB8PSBTTE9UMV9WQUxJRCB8IFNMT1Qy X1ZBTElEIHwgVkFMSURfRlJBTUU7Cj4gPiArICAgICAgIEFVRElPX1dSSVRFKG51YzkwMF9hdWRp by0+bW1pbyArIEFDVExfQUNPUzAsIHRtcCk7Cj4gPiArCj4gPiArICAgICAgIHVkZWxheSgxMDAp Owo+ID4gKwo+ID4gKyAgICAgICAvKiBwb2xsaW5nIHRoZSBBQ19XX0ZJTklTSCAqLwo+ID4gKyAg ICAgICB0bXAgPSBBVURJT19SRUFEKG51YzkwMF9hdWRpby0+bW1pbyArIEFDVExfQUNDT04pOwo+ ID4gKyAgICAgICB0bXAgJj0gQUNfV19GSU5JU0g7Cj4gPiArICAgICAgIHdoaWxlICh0bXAgJiYg dGltZW91dC0tKQo+ID4gKyAgICAgICAgICAgICAgIG1kZWxheSgxKTsKPiA+ICsKPiA+ICsgICAg ICAgaWYgKCF0aW1lb3V0KQo+ID4gKyAgICAgICAgICAgICAgIGRldl9lcnIobnVjOTAwX2F1ZGlv LT5kZXYsICJBQzk3IHdyaXRlIHJlZ2lzdGVyIHRpbWUgb3V0ICFcbiIpOwo+ID4gKwo+ID4gKyAg ICAgICB0bXAgPSBBVURJT19SRUFEKG51YzkwMF9hdWRpby0+bW1pbyArIEFDVExfQUNPUzApOwo+ ID4gKyAgICAgICB0bXAgJj0gfihTTE9UMV9WQUxJRCB8IFNMT1QyX1ZBTElEKTsKPiA+ICsgICAg ICAgQVVESU9fV1JJVEUobnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNUTF9BQ09TMCwgdG1wKTsKPiA+ ICsKPiA+ICsgICAgICAgbXV0ZXhfdW5sb2NrKCZhYzk3X211dGV4KTsKPiA+ICsKPiA+ICt9Cj4g PiArCj4gPiArc3RhdGljIHZvaWQgbnVjOTAwX2FjOTdfd2FybV9yZXNldChzdHJ1Y3Qgc25kX2Fj OTcgKmFjOTcpCj4gPiArewo+ID4gKyAgICAgICBzdHJ1Y3QgbnVjOTAwX2F1ZGlvICpudWM5MDBf YXVkaW8gPSBudWM5MDBfYWM5N19kYXRhOwo+ID4gKyAgICAgICB1bnNpZ25lZCBsb25nIHZhbDsK PiA+ICsKPiA+ICsgICAgICAgbXV0ZXhfbG9jaygmYWM5N19tdXRleCk7Cj4gPiArCj4gPiArICAg ICAgIC8qIHdhcm0gcmVzZXQgQUMgOTcgKi8KPiA+ICsgICAgICAgdmFsID0gQVVESU9fUkVBRChu dWM5MDBfYXVkaW8tPm1taW8gKyBBQ1RMX0FDQ09OKTsKPiA+ICsgICAgICAgdmFsIHw9IEFDX1df UkVTOwo+ID4gKyAgICAgICBBVURJT19XUklURShudWM5MDBfYXVkaW8tPm1taW8gKyBBQ1RMX0FD Q09OLCB2YWwpOwo+ID4gKwo+ID4gKyAgICAgICB1ZGVsYXkoMTAwMCk7Cj4gPiArCj4gPiArICAg ICAgIHZhbCA9IG51YzkwMF9jaGVja3JlYWR5KCk7Cj4gPiArICAgICAgIGlmICghIXZhbCkKPiA+ ICsgICAgICAgICAgICAgICBkZXZfZXJyKG51YzkwMF9hdWRpby0+ZGV2LCAiQUM5NyBjb2RlYyBp cyBub3QgcmVhZHlcbiIpOwo+ID4gKwo+ID4gKyAgICAgICBtdXRleF91bmxvY2soJmFjOTdfbXV0 ZXgpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBudWM5MDBfYWM5N19jb2xkX3Jlc2V0 KHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKPiA+ICt7Cj4gPiArICAgICAgIHN0cnVjdCBudWM5MDBf YXVkaW8gKm51YzkwMF9hdWRpbyA9IG51YzkwMF9hYzk3X2RhdGE7Cj4gPiArICAgICAgIHVuc2ln bmVkIGxvbmcgdmFsOwo+ID4gKwo+ID4gKyAgICAgICBtdXRleF9sb2NrKCZhYzk3X211dGV4KTsK PiA+ICsKPiA+ICsgICAgICAgLyogcmVzZXQgQXVkaW8gQ29udHJvbGxlciAqLwo+ID4gKyAgICAg ICB2YWwgPSBBVURJT19SRUFEKG51YzkwMF9hdWRpby0+bW1pbyArIEFDVExfUkVTRVQpOwo+ID4g KyAgICAgICB2YWwgfD0gQUNUTF9SRVNFVF9CSVQ7Cj4gPiArICAgICAgIEFVRElPX1dSSVRFKG51 YzkwMF9hdWRpby0+bW1pbyArIEFDVExfUkVTRVQsIHZhbCk7Cj4gPiArCj4gPiArICAgICAgIHVk ZWxheSgxMDAwKTsKPiA+ICsKPiA+ICsgICAgICAgdmFsID0gQVVESU9fUkVBRChudWM5MDBfYXVk aW8tPm1taW8gKyBBQ1RMX1JFU0VUKTsKPiA+ICsgICAgICAgdmFsICY9ICh+QUNUTF9SRVNFVF9C SVQpOwo+ID4gKyAgICAgICBBVURJT19XUklURShudWM5MDBfYXVkaW8tPm1taW8gKyBBQ1RMX1JF U0VULCB2YWwpOwo+ID4gKwo+ID4gKyAgICAgICB1ZGVsYXkoMTAwMCk7Cj4gPiArCj4gPiArICAg ICAgIC8qIHJlc2V0IEFDLWxpbmsgaW50ZXJmYWNlICovCj4gPiArCj4gPiArICAgICAgIHZhbCA9 IEFVRElPX1JFQUQobnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNUTF9SRVNFVCk7Cj4gPiArICAgICAg IHZhbCB8PSBBQ19SRVNFVDsKPiA+ICsgICAgICAgQVVESU9fV1JJVEUobnVjOTAwX2F1ZGlvLT5t bWlvICsgQUNUTF9SRVNFVCwgdmFsKTsKPiA+ICsKPiA+ICsgICAgICAgdWRlbGF5KDEwMDApOwo+ ID4gKwo+ID4gKyAgICAgICB2YWwgPSBBVURJT19SRUFEKG51YzkwMF9hdWRpby0+bW1pbyArIEFD VExfUkVTRVQpOwo+ID4gKyAgICAgICB2YWwgJj0gfkFDX1JFU0VUOwo+ID4gKyAgICAgICBBVURJ T19XUklURShudWM5MDBfYXVkaW8tPm1taW8gKyBBQ1RMX1JFU0VULCB2YWwpOwo+ID4gKwo+ID4g KyAgICAgICB1ZGVsYXkoMTAwMCk7Cj4gPiArCj4gPiArICAgICAgIC8qIGNvbGQgcmVzZXQgQUMg OTcgKi8KPiA+ICsgICAgICAgdmFsID0gQVVESU9fUkVBRChudWM5MDBfYXVkaW8tPm1taW8gKyBB Q1RMX0FDQ09OKTsKPiA+ICsgICAgICAgdmFsIHw9IEFDX0NfUkVTOwo+ID4gKyAgICAgICBBVURJ T19XUklURShudWM5MDBfYXVkaW8tPm1taW8gKyBBQ1RMX0FDQ09OLCB2YWwpOwo+ID4gKwo+ID4g KyAgICAgICB1ZGVsYXkoMTAwMCk7Cj4gPiArCj4gPiArICAgICAgIHZhbCA9IEFVRElPX1JFQUQo bnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNUTF9BQ0NPTik7Cj4gPiArICAgICAgIHZhbCAmPSAofkFD X0NfUkVTKTsKPiA+ICsgICAgICAgQVVESU9fV1JJVEUobnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNU TF9BQ0NPTiwgdmFsKTsKPiA+ICsKPiA+ICsgICAgICAgdWRlbGF5KDEwMDApOwo+ID4gKwoKSnVz dCBjdXJpb3VzLCB0aGVzZSAxMDAwIG1pY3JvIHNlY29uZHMgZGVsYXlzIGFsbCBzZWVtIG92ZXIg c3BlYyBmb3IgdGhlCkFDOTcgaW50ZXJmYWNlLgoKPiA+ICsgICAgICAgbXV0ZXhfdW5sb2NrKCZh Yzk3X211dGV4KTsKPiA+ICsKPiA+ICt9Cj4gPiArCj4gPiArLyogQUM5NyBjb250cm9sbGVyIG9w ZXJhdGlvbnMgKi8KPiA+ICtzdHJ1Y3Qgc25kX2FjOTdfYnVzX29wcyBzb2NfYWM5N19vcHMgPSB7 Cj4gPiArICAgICAgIC5yZWFkICAgICAgICAgICA9IG51YzkwMF9hYzk3X3JlYWQsCj4gPiArICAg ICAgIC53cml0ZSAgICAgICAgICA9IG51YzkwMF9hYzk3X3dyaXRlLAo+ID4gKyAgICAgICAucmVz ZXQgICAgICAgICAgPSBudWM5MDBfYWM5N19jb2xkX3Jlc2V0LAo+ID4gKyAgICAgICAud2FybV9y ZXNldCAgICAgPSBudWM5MDBfYWM5N193YXJtX3Jlc2V0LAo+ID4gK30KPiA+ICtFWFBPUlRfU1lN Qk9MX0dQTChzb2NfYWM5N19vcHMpOwo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbnVjOTAwX2FjOTdf dHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNtZCwgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkp Cj4gPiArewo+ID4gKyAgICAgICBzdHJ1Y3QgbnVjOTAwX2F1ZGlvICpudWM5MDBfYXVkaW8gPSBu dWM5MDBfYWM5N19kYXRhOwo+ID4gKyAgICAgICBpbnQgcmV0LCBzdHlwZSA9IFNVQlNUUkVBTV9U WVBFKHN1YnN0cmVhbSk7Cj4gPiArICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsLCB0bXA7Cj4gPiAr Cj4gPiArICAgICAgIHJldCA9IDA7Cj4gPiArCj4gPiArICAgICAgIHN3aXRjaCAoY21kKSB7Cj4g PiArICAgICAgIGNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Cj4gPiArICAgICAgIGNhc2Ug U05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgo+ID4gKyAgICAgICAgICAgICAgIHZhbCA9IEFVRElP X1JFQUQobnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNUTF9SRVNFVCk7Cj4gPiArICAgICAgICAgICAg ICAgaWYgKFBDTV9UWCA9PSBzdHlwZSkgewo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgdG1w ID0gQVVESU9fUkVBRChudWM5MDBfYXVkaW8tPm1taW8gKyBBQ1RMX0FDT1MwKTsKPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgIHRtcCB8PSAoU0xPVDNfVkFMSUQgfCBTTE9UNF9WQUxJRCB8IFZB TElEX0ZSQU1FKTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1dSSVRFKG51Yzkw MF9hdWRpby0+bW1pbyArIEFDVExfQUNPUzAsIHRtcCk7Cj4gPiArCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICB0bXAgPSBBVURJT19SRUFEKG51YzkwMF9hdWRpby0+bW1pbyArIEFDVExfUFNS KTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHRtcCB8PSAoUF9ETUFfRU5EX0lSUSB8IFBf RE1BX01JRERMRV9JUlEpOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fV1JJVEUo bnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNUTF9QU1IsIHRtcCk7Cj4gPiArICAgICAgICAgICAgICAg ICAgICAgICB2YWwgfD0gQUNfUExBWTsKPiA+ICsgICAgICAgICAgICAgICB9IGVsc2Ugewo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gQVVESU9fUkVBRChudWM5MDBfYXVkaW8tPm1t aW8gKyBBQ1RMX1JTUik7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICB0bXAgfD0gKFJfRE1B X0VORF9JUlEgfCBSX0RNQV9NSURETEVfSVJRKTsKPiA+ICsKPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgIEFVRElPX1dSSVRFKG51YzkwMF9hdWRpby0+bW1pbyArIEFDVExfUlNSLCB0bXApOwo+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgdmFsIHw9IEFDX1JFQ09SRDsKPiA+ICsgICAgICAg ICAgICAgICB9Cj4gPiArCj4gPiArICAgICAgICAgICAgICAgQVVESU9fV1JJVEUobnVjOTAwX2F1 ZGlvLT5tbWlvICsgQUNUTF9SRVNFVCwgdmFsKTsKPiA+ICsKPiA+ICsgICAgICAgICAgICAgICBi cmVhazsKPiA+ICsgICAgICAgY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgo+ID4gKyAgICAg ICBjYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6Cj4gPiArICAgICAgICAgICAgICAgdmFs ID0gQVVESU9fUkVBRChudWM5MDBfYXVkaW8tPm1taW8gKyBBQ1RMX1JFU0VUKTsKPiA+ICsgICAg ICAgICAgICAgICBpZiAoUENNX1RYID09IHN0eXBlKSB7Cj4gPiArICAgICAgICAgICAgICAgICAg ICAgICB0bXAgPSBBVURJT19SRUFEKG51YzkwMF9hdWRpby0+bW1pbyArIEFDVExfQUNPUzApOwo+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgdG1wICY9IH4oU0xPVDNfVkFMSUQgfCBTTE9UNF9W QUxJRCk7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICBBVURJT19XUklURShudWM5MDBfYXVk aW8tPm1taW8gKyBBQ1RMX0FDT1MwLCB0bXApOwo+ID4gKwo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgQVVESU9fV1JJVEUobnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNUTF9QU1IsIFJFU0VUX1BS U1IpOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgdmFsICY9IH5BQ19QTEFZOwo+ID4gKyAg ICAgICAgICAgICAgIH0gZWxzZSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICBBVURJT19X UklURShudWM5MDBfYXVkaW8tPm1taW8gKyBBQ1RMX1JTUiwgUkVTRVRfUFJTUik7Cj4gPiArICAg ICAgICAgICAgICAgICAgICAgICB2YWwgJj0gfkFDX1JFQ09SRDsKPiA+ICsgICAgICAgICAgICAg ICB9Cj4gPiArCj4gPiArICAgICAgICAgICAgICAgQVVESU9fV1JJVEUobnVjOTAwX2F1ZGlvLT5t bWlvICsgQUNUTF9SRVNFVCwgdmFsKTsKPiA+ICsKPiA+ICsgICAgICAgICAgICAgICBicmVhazsK PiA+ICsgICAgICAgZGVmYXVsdDoKPiA+ICsgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOwo+ ID4gKyAgICAgICB9Cj4gPiArCj4gPiArICAgICAgIHJldHVybiByZXQ7Cj4gPiArfQo+ID4gKwo+ ID4gK3N0YXRpYyBpbnQgbnVjOTAwX2FjOTdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAq cGRldiwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qg c25kX3NvY19kYWkgKmRhaSkKPiA+ICt7Cj4gPiArICAgICAgIHN0cnVjdCBudWM5MDBfYXVkaW8g Km51YzkwMF9hdWRpbyA9IG51YzkwMF9hYzk3X2RhdGE7Cj4gPiArICAgICAgIHVuc2lnbmVkIGxv bmcgdmFsOwo+ID4gKwo+ID4gKyAgICAgICBtdXRleF9sb2NrKCZhYzk3X211dGV4KTsKPiA+ICsK PiA+ICsgICAgICAgLyogZW5hYmxlIHVuaXQgY2xvY2sgKi8KPiA+ICsgICAgICAgY2xrX2VuYWJs ZShudWM5MDBfYXVkaW8tPmNsayk7Cj4gPiArCj4gPiArICAgICAgIC8qIGVuYWJsZSBhdWRpbyBj b250cm9sbGVyIGFuZCBBQy1saW5rIGludGVyZmFjZSAqLwo+ID4gKyAgICAgICB2YWwgPSBBVURJ T19SRUFEKG51YzkwMF9hdWRpby0+bW1pbyArIEFDVExfQ09OKTsKPiA+ICsgICAgICAgdmFsIHw9 IChJSVNfQUNfUElOX1NFTCB8IEFDTElOS19FTik7Cj4gPiArICAgICAgIEFVRElPX1dSSVRFKG51 YzkwMF9hdWRpby0+bW1pbyArIEFDVExfQ09OLCB2YWwpOwo+ID4gKwo+ID4gKyAgICAgICBtdXRl eF91bmxvY2soJmFjOTdfbXV0ZXgpOwo+ID4gKwo+ID4gKyAgICAgICByZXR1cm4gMDsKPiA+ICt9 Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgbnVjOTAwX2FjOTdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9y bV9kZXZpY2UgKnBkZXYsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKPiA+ICt7Cj4gPiArICAgICAgIHN0 cnVjdCBudWM5MDBfYXVkaW8gKm51YzkwMF9hdWRpbyA9IG51YzkwMF9hYzk3X2RhdGE7Cj4gPiAr Cj4gPiArICAgICAgIGNsa19kaXNhYmxlKG51YzkwMF9hdWRpby0+Y2xrKTsKPiA+ICt9Cj4gPiAr Cj4gPiArc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgbnVjOTAwX2FjOTdfZGFpX29wcyA9 IHsKPiA+ICsgICAgICAgLnRyaWdnZXIgICAgICAgID0gbnVjOTAwX2FjOTdfdHJpZ2dlciwKPiA+ ICt9Owo+ID4gKwo+ID4gK3N0cnVjdCBzbmRfc29jX2RhaSBudWM5MDBfYWM5N19kYWkgPSB7Cj4g PiArICAgICAgIC5uYW1lICAgICAgICAgICAgICAgICAgID0gIm51YzkwMC1hYzk3IiwKPiA+ICsg ICAgICAgLnByb2JlICAgICAgICAgICAgICAgICAgPSBudWM5MDBfYWM5N19wcm9iZSwKPiA+ICsg ICAgICAgLnJlbW92ZSAgICAgICAgICAgICAgICAgPSBudWM5MDBfYWM5N19yZW1vdmUsCj4gPiAr ICAgICAgIC5hYzk3X2NvbnRyb2wgICAgICAgICAgID0gMSwKPiA+ICsgICAgICAgLnBsYXliYWNr ID0gewo+ID4gKyAgICAgICAgICAgICAgIC5yYXRlcyAgICAgICAgICA9IFNORFJWX1BDTV9SQVRF XzgwMDBfNDgwMDAsCj4gPiArICAgICAgICAgICAgICAgLmZvcm1hdHMgICAgICAgID0gU05EUlZf UENNX0ZNVEJJVF9TMTZfTEUsCj4gPiArICAgICAgICAgICAgICAgLmNoYW5uZWxzX21pbiAgID0g MSwKPiA+ICsgICAgICAgICAgICAgICAuY2hhbm5lbHNfbWF4ICAgPSAyLAo+ID4gKyAgICAgICB9 LAo+ID4gKyAgICAgICAuY2FwdHVyZSA9IHsKPiA+ICsgICAgICAgICAgICAgICAucmF0ZXMgICAg ICAgICAgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAo+ID4gKyAgICAgICAgICAgICAgIC5m b3JtYXRzICAgICAgICA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAo+ID4gKyAgICAgICAgICAg ICAgIC5jaGFubmVsc19taW4gICA9IDEsCj4gPiArICAgICAgICAgICAgICAgLmNoYW5uZWxzX21h eCAgID0gMiwKPiA+ICsgICAgICAgfSwKPiA+ICsgICAgICAgLm9wcyA9ICZudWM5MDBfYWM5N19k YWlfb3BzLAo+ID4gK30KPiA+ICtFWFBPUlRfU1lNQk9MX0dQTChudWM5MDBfYWM5N19kYWkpOwo+ ID4gKwo+ID4gK3N0YXRpYyBpbnQgX19kZXZpbml0IG51YzkwMF9hYzk3X2RydnByb2JlKHN0cnVj dCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiArewo+ID4gKyAgICAgICBzdHJ1Y3QgbnVjOTAw X2F1ZGlvICpudWM5MDBfYXVkaW87Cj4gPiArICAgICAgIGludCByZXQ7Cj4gPiArCj4gPiArICAg ICAgIGlmIChudWM5MDBfYWM5N19kYXRhKQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiAtRUJV U1k7Cj4gPiArCj4gPiArICAgICAgIG51YzkwMF9hdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVj dCBudWM5MDBfYXVkaW8pLCBHRlBfS0VSTkVMKTsKPiA+ICsgICAgICAgaWYgKCFudWM5MDBfYXVk aW8pCj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Cj4gPiArCj4gPiArICAgICAg IHNwaW5fbG9ja19pbml0KCZudWM5MDBfYXVkaW8tPmxvY2spOwo+ID4gKwo+ID4gKyAgICAgICBu dWM5MDBfYXVkaW8tPnJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNF X01FTSwgMCk7Cj4gPiArICAgICAgIGlmICghbnVjOTAwX2F1ZGlvLT5yZXMpIHsKPiA+ICsgICAg ICAgICAgICAgICByZXQgPSAtRU5PREVWOwo+ID4gKyAgICAgICAgICAgICAgIGdvdG8gb3V0MDsK PiA+ICsgICAgICAgfQo+ID4gKwo+ID4gKyAgICAgICBpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihu dWM5MDBfYXVkaW8tPnJlcy0+c3RhcnQsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICByZXNv dXJjZV9zaXplKG51YzkwMF9hdWRpby0+cmVzKSwgcGRldi0+bmFtZSkpIHsKPiA+ICsgICAgICAg ICAgICAgICByZXQgPSAtRUJVU1k7Cj4gPiArICAgICAgICAgICAgICAgZ290byBvdXQwOwo+ID4g KyAgICAgICB9Cj4gPiArCj4gPiArICAgICAgIG51YzkwMF9hdWRpby0+bW1pbyA9IGlvcmVtYXAo bnVjOTAwX2F1ZGlvLT5yZXMtPnN0YXJ0LAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHJlc291cmNlX3NpemUobnVjOTAwX2F1ZGlvLT5yZXMpKTsKPiA+ICsgICAg ICAgaWYgKCFudWM5MDBfYXVkaW8tPm1taW8pIHsKPiA+ICsgICAgICAgICAgICAgICByZXQgPSAt RU5PTUVNOwo+ID4gKyAgICAgICAgICAgICAgIGdvdG8gb3V0MTsKPiA+ICsgICAgICAgfQo+ID4g Kwo+ID4gKyAgICAgICBudWM5MDBfYXVkaW8tPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVM TCk7Cj4gPiArICAgICAgIGlmIChJU19FUlIobnVjOTAwX2F1ZGlvLT5jbGspKSB7Cj4gPiArICAg ICAgICAgICAgICAgcmV0ID0gUFRSX0VSUihudWM5MDBfYXVkaW8tPmNsayk7Cj4gPiArICAgICAg ICAgICAgICAgZ290byBvdXQyOwo+ID4gKyAgICAgICB9Cj4gPiArCj4gPiArICAgICAgIG51Yzkw MF9hdWRpby0+aXJxX251bSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Cj4gPiArICAgICAg IGlmICghbnVjOTAwX2F1ZGlvLT5pcnFfbnVtKSB7Cj4gPiArICAgICAgICAgICAgICAgcmV0ID0g LUVCVVNZOwo+ID4gKyAgICAgICAgICAgICAgIGdvdG8gb3V0MjsKPiA+ICsgICAgICAgfQo+ID4g Kwo+ID4gKyAgICAgICBudWM5MDBfYWM5N19kYXRhID0gbnVjOTAwX2F1ZGlvOwo+ID4gKwo+ID4g KyAgICAgICBudWM5MDBfYXVkaW8tPmRldiA9IG51YzkwMF9hYzk3X2RhaS5kZXYgPSAgJnBkZXYt PmRldjsKPiA+ICsKPiA+ICsgICAgICAgcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9kYWkoJm51Yzkw MF9hYzk3X2RhaSk7Cj4gPiArICAgICAgIGlmIChyZXQpCj4gPiArICAgICAgICAgICAgICAgZ290 byBvdXQzOwo+ID4gKwo+ID4gKyAgICAgICBtZnBfc2V0X2dyb3VwZyhudWM5MDBfYXVkaW8tPmRl dik7IC8qIGVuYmFsZSBhYzk3IG11bHRpZnVuY3Rpb24gcGluKi8KPiA+ICsKPiA+ICsgICAgICAg cmV0dXJuIDA7Cj4gPiArCj4gPiArb3V0MzoKPiA+ICsgICAgICAgY2xrX3B1dChudWM5MDBfYXVk aW8tPmNsayk7Cj4gPiArb3V0MjoKPiA+ICsgICAgICAgaW91bm1hcChudWM5MDBfYXVkaW8tPm1t aW8pOwo+ID4gK291dDE6Cj4gPiArICAgICAgIHJlbGVhc2VfbWVtX3JlZ2lvbihudWM5MDBfYXVk aW8tPnJlcy0+c3RhcnQsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcmVzb3VyY2Vfc2l6ZShudWM5MDBfYXVkaW8tPnJlcykpOwo+ID4gK291dDA6Cj4gPiArICAg ICAgIGtmcmVlKG51YzkwMF9hdWRpbyk7Cj4gPiArICAgICAgIHJldHVybiByZXQ7Cj4gPiArfQo+ ID4gKwo+ID4gK3N0YXRpYyBpbnQgX19kZXZleGl0IG51YzkwMF9hYzk3X2RydnJlbW92ZShzdHJ1 Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ID4gK3sKPiA+ICsKPiA+ICsgICAgICAgc25kX3Nv Y191bnJlZ2lzdGVyX2RhaSgmbnVjOTAwX2FjOTdfZGFpKTsKPiA+ICsKPiA+ICsgICAgICAgY2xr X3B1dChudWM5MDBfYWM5N19kYXRhLT5jbGspOwo+ID4gKyAgICAgICBpb3VubWFwKG51YzkwMF9h Yzk3X2RhdGEtPm1taW8pOwo+ID4gKyAgICAgICByZWxlYXNlX21lbV9yZWdpb24obnVjOTAwX2Fj OTdfZGF0YS0+cmVzLT5zdGFydCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg cmVzb3VyY2Vfc2l6ZShudWM5MDBfYWM5N19kYXRhLT5yZXMpKTsKPiA+ICsKPiA+ICsgICAgICAg bnVjOTAwX2FjOTdfZGF0YSA9IE5VTEw7Cj4gPiArCj4gPiArICAgICAgIHJldHVybiAwOwo+ID4g K30KPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBudWM5MDBfYWM5N19k cml2ZXIgPSB7Cj4gPiArICAgICAgIC5kcml2ZXIgPSB7Cj4gPiArICAgICAgICAgICAgICAgLm5h bWUgICA9ICJudWM5MDAtYXVkaW8iLAo+ID4gKyAgICAgICAgICAgICAgIC5vd25lciAgPSBUSElT X01PRFVMRSwKPiA+ICsgICAgICAgfSwKPiA+ICsgICAgICAgLnByb2JlICAgICAgICAgID0gbnVj OTAwX2FjOTdfZHJ2cHJvYmUsCj4gPiArICAgICAgIC5yZW1vdmUgICAgICAgICA9IF9fZGV2ZXhp dF9wKG51YzkwMF9hYzk3X2RydnJlbW92ZSksCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgaW50 IF9faW5pdCBudWM5MDBfYWM5N19pbml0KHZvaWQpCj4gPiArewo+ID4gKyAgICAgICByZXR1cm4g cGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZudWM5MDBfYWM5N19kcml2ZXIpOwo+ID4gK30KPiA+ ICsKPiA+ICtzdGF0aWMgdm9pZCBfX2V4aXQgbnVjOTAwX2FjOTdfZXhpdCh2b2lkKQo+ID4gK3sK PiA+ICsgICAgICAgcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm51YzkwMF9hYzk3X2RyaXZl cik7Cj4gPiArfQo+ID4gKwo+ID4gK21vZHVsZV9pbml0KG51YzkwMF9hYzk3X2luaXQpOwo+ID4g K21vZHVsZV9leGl0KG51YzkwMF9hYzk3X2V4aXQpOwo+ID4gKwo+ID4gK01PRFVMRV9BVVRIT1Io IldhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4iKTsKPiA+ICtNT0RVTEVfREVTQ1JJ UFRJT04oIk5VQzkwMCBBQzk3IFNvQyBkcml2ZXIhIik7Cj4gPiArTU9EVUxFX0xJQ0VOU0UoIkdQ TCIpOwo+ID4gK01PRFVMRV9BTElBUygicGxhdGZvcm06bnVjOTAwLWFjOTciKTsKPiA+ICsKPiA+ IGRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbnVjOTAwL251YzkwMC1hdWRpby5jIGIvc291bmQvc29j L251YzkwMC9udWM5MDAtYXVkaW8uYwo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+IGluZGV4 IDAwMDAwMDAuLmIzM2Q1YjgKPiA+IC0tLSAvZGV2L251bGwKPiA+ICsrKyBiL3NvdW5kL3NvYy9u dWM5MDAvbnVjOTAwLWF1ZGlvLmMKPiA+IEBAIC0wLDAgKzEsODEgQEAKPiA+ICsvKgo+ID4gKyAq IENvcHlyaWdodCAoYykgMjAxMCBOdXZvdG9uIHRlY2hub2xvZ3kgY29ycG9yYXRpb24uCj4gPiAr ICoKPiA+ICsgKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Cj4gPiArICoKPiA+ ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg aXQgYW5kL29yIG1vZGlmeQo+ID4gKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cj4gPiArICogdGhlIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbjt2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCj4gPiArICoKPiA+ICsg Ki8KPiA+ICsKPiA+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gPiArI2luY2x1ZGUgPGxp bnV4L21vZHVsZXBhcmFtLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Cj4gPiArI2lu Y2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9k ZXZpY2UuaD4KPiA+ICsKPiA+ICsjaW5jbHVkZSA8c291bmQvY29yZS5oPgo+ID4gKyNpbmNsdWRl IDxzb3VuZC9wY20uaD4KPiA+ICsjaW5jbHVkZSA8c291bmQvc29jLmg+Cj4gPiArI2luY2x1ZGUg PHNvdW5kL3NvYy1kYXBtLmg+Cj4gPiArCj4gPiArI2luY2x1ZGUgIi4uL2NvZGVjcy9hYzk3Lmgi Cj4gPiArI2luY2x1ZGUgIm51YzkwMC1hdWlkby5oIgo+ID4gKwo+ID4gK3N0YXRpYyBzdHJ1Y3Qg c25kX3NvY19kYWlfbGluayBudWM5MDBldmJfYWM5N19kYWkgPSB7Cj4gPiArICAgICAgIC5uYW1l ICAgICAgICAgICA9ICJBQzk3IiwKPiA+ICsgICAgICAgLnN0cmVhbV9uYW1lICAgID0gIkFDOTcg SGlGaSIsCj4gPiArICAgICAgIC5jcHVfZGFpICAgICAgICA9ICZudWM5MDBfYWM5N19kYWksCj4g PiArICAgICAgIC5jb2RlY19kYWkgICAgICA9ICZhYzk3X2RhaSwKPiA+ICt9Owo+ID4gKwo+ID4g K3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIG51YzkwMGV2Yl9hdWRpb19tYWNoaW5lID0gewo+ ID4gKyAgICAgICAubmFtZSAgICAgICAgICAgPSAiTlVDOTAwRVZCX0FDOTciLAo+ID4gKyAgICAg ICAuZGFpX2xpbmsgICAgICAgPSAmbnVjOTAwZXZiX2FjOTdfZGFpLAo+ID4gKyAgICAgICAubnVt X2xpbmtzICAgICAgPSAxLAo+ID4gKyAgICAgICAucGxhdGZvcm0gICAgICAgPSAmbnVjOTAwX3Nv Y19wbGF0Zm9ybSwKPiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kZXZp Y2UgbnVjOTAwZXZiX2FjOTdfZGV2ZGF0YSA9IHsKPiA+ICsgICAgICAgLmNhcmQgICAgICAgICAg ID0gJm51YzkwMGV2Yl9hdWRpb19tYWNoaW5lLAo+ID4gKyAgICAgICAuY29kZWNfZGV2ICAgICAg PSAmc29jX2NvZGVjX2Rldl9hYzk3LAo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljIHN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKm51YzkwMGV2Yl9hc29jX2RldjsKPiA+ICsKPiA+ICtzdGF0aWMgaW50 IF9faW5pdCBudWM5MDBldmJfYXVkaW9faW5pdCh2b2lkKQo+ID4gK3sKPiA+ICsgICAgICAgaW50 IHJldDsKPiA+ICsKPiA+ICsgICAgICAgcmV0ID0gLUVOT01FTTsKPiA+ICsgICAgICAgbnVjOTAw ZXZiX2Fzb2NfZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzb2MtYXVkaW8iLCAtMSk7Cj4g PiArICAgICAgIGlmICghbnVjOTAwZXZiX2Fzb2NfZGV2KQo+ID4gKyAgICAgICAgICAgICAgIGdv dG8gb3V0Owo+ID4gKwo+ID4gKyAgICAgICAvKiBudWM5MDAgYm9hcmQgYXVkaW8gZGV2aWNlICov Cj4gPiArICAgICAgIHBsYXRmb3JtX3NldF9kcnZkYXRhKG51YzkwMGV2Yl9hc29jX2RldiwgJm51 YzkwMGV2Yl9hYzk3X2RldmRhdGEpOwo+ID4gKwo+ID4gKyAgICAgICBudWM5MDBldmJfYWM5N19k ZXZkYXRhLmRldiA9ICZudWM5MDBldmJfYXNvY19kZXYtPmRldjsKPiA+ICsgICAgICAgcmV0ID0g cGxhdGZvcm1fZGV2aWNlX2FkZChudWM5MDBldmJfYXNvY19kZXYpOwo+ID4gKwo+ID4gKyAgICAg ICBpZiAocmV0KSB7Cj4gPiArICAgICAgICAgICAgICAgcGxhdGZvcm1fZGV2aWNlX3B1dChudWM5 MDBldmJfYXNvY19kZXYpOwo+ID4gKyAgICAgICAgICAgICAgIG51YzkwMGV2Yl9hc29jX2RldiA9 IE5VTEw7Cj4gPiArICAgICAgIH0KPiA+ICsKPiA+ICtvdXQ6Cj4gPiArICAgICAgIHJldHVybiBy ZXQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIF9fZXhpdCBudWM5MDBldmJfYXVkaW9f ZXhpdCh2b2lkKQo+ID4gK3sKPiA+ICsgICAgICAgcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIo bnVjOTAwZXZiX2Fzb2NfZGV2KTsKPiA+ICt9Cj4gPiArCj4gPiArbW9kdWxlX2luaXQobnVjOTAw ZXZiX2F1ZGlvX2luaXQpOwo+ID4gK21vZHVsZV9leGl0KG51YzkwMGV2Yl9hdWRpb19leGl0KTsK PiA+ICsKPiA+ICtNT0RVTEVfTElDRU5TRSgiR1BMIik7Cj4gPiArTU9EVUxFX0RFU0NSSVBUSU9O KCJOVUM5MDAgU2VyaWVzIEFTb0MgYXVkaW8gc3VwcG9ydCIpOwo+ID4gK01PRFVMRV9BVVRIT1Io IldhbiBab25nU2h1biIpOwo+ID4gZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9udWM5MDAvbnVjOTAw LWF1aWRvLmggYi9zb3VuZC9zb2MvbnVjOTAwL251YzkwMC1hdWlkby5oCj4gPiBuZXcgZmlsZSBt b2RlIDEwMDY0NAo+ID4gaW5kZXggMDAwMDAwMC4uOTVhYzRlZgo+ID4gLS0tIC9kZXYvbnVsbAo+ ID4gKysrIGIvc291bmQvc29jL251YzkwMC9udWM5MDAtYXVpZG8uaAo+ID4gQEAgLTAsMCArMSwx MjEgQEAKPiA+ICsvKgo+ID4gKyAqIENvcHlyaWdodCAoYykgMjAxMCBOdXZvdG9uIHRlY2hub2xv Z3kgY29ycG9yYXRpb24uCj4gPiArICoKPiA+ICsgKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBn bWFpbC5jb20+Cj4gPiArICoKPiA+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsg eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+ID4gKyAqIGl0IHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5 Cj4gPiArICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjt2ZXJzaW9uIDIgb2YgdGhlIExp Y2Vuc2UuCj4gPiArICoKPiA+ICsgKi8KPiA+ICsKPiA+ICsjaWZuZGVmIF9OVUM5MDBfQVVESU9f SAo+ID4gKyNkZWZpbmUgX05VQzkwMF9BVURJT19ICj4gPiArCj4gPiArI2luY2x1ZGUgPGxpbnV4 L2lvLmg+Cj4gPiArCj4gPiArLyogQXVkaW8gQ29udHJvbCBSZWdpc3RlcnMgKi8KPiA+ICsjZGVm aW5lIEFDVExfQ09OICAgICAgICAgICAgICAgMHgwMAo+ID4gKyNkZWZpbmUgQUNUTF9SRVNFVCAg ICAgICAgICAgICAweDA0Cj4gPiArI2RlZmluZSBBQ1RMX1JEU1RCICAgICAgICAgICAgIDB4MDgK PiA+ICsjZGVmaW5lIEFDVExfUkRTVF9MRU5HVEggICAgICAgMHgwQwo+ID4gKyNkZWZpbmUgQUNU TF9SRFNUQyAgICAgICAgICAgICAweDEwCj4gPiArI2RlZmluZSBBQ1RMX1JTUiAgICAgICAgICAg ICAgIDB4MTQKPiA+ICsjZGVmaW5lIEFDVExfUERTVEIgICAgICAgICAgICAgMHgxOAo+ID4gKyNk ZWZpbmUgQUNUTF9QRFNUX0xFTkdUSCAgICAgICAweDFDCj4gPiArI2RlZmluZSBBQ1RMX1BEU1RD ICAgICAgICAgICAgIDB4MjAKPiA+ICsjZGVmaW5lIEFDVExfUFNSICAgICAgICAgICAgICAgMHgy NAo+ID4gKyNkZWZpbmUgQUNUTF9JSVNDT04gICAgICAgICAgICAweDI4Cj4gPiArI2RlZmluZSBB Q1RMX0FDQ09OICAgICAgICAgICAgIDB4MkMKPiA+ICsjZGVmaW5lIEFDVExfQUNPUzAgICAgICAg ICAgICAgMHgzMAo+ID4gKyNkZWZpbmUgQUNUTF9BQ09TMSAgICAgICAgICAgICAweDM0Cj4gPiAr I2RlZmluZSBBQ1RMX0FDT1MyICAgICAgICAgICAgIDB4MzgKPiA+ICsjZGVmaW5lIEFDVExfQUNJ UzAgICAgICAgICAgICAgMHgzQwo+ID4gKyNkZWZpbmUgQUNUTF9BQ0lTMSAgICAgICAgICAgICAw eDQwCj4gPiArI2RlZmluZSBBQ1RMX0FDSVMyICAgICAgICAgICAgIDB4NDQKPiA+ICsjZGVmaW5l IEFDVExfQ09VTlRFUiAgICAgICAgICAgMHg0OAo+ID4gKwo+ID4gKy8qIGJpdCBkZWZpbml0aW9u IG9mIFJFR19BQ1RMX0NPTiByZWdpc3RlciAqLwo+ID4gKyNkZWZpbmUgUl9ETUFfSVJRICAgICAg ICAgICAgICAweDEwMDAKPiA+ICsjZGVmaW5lIFRfRE1BX0lSUSAgICAgICAgICAgICAgMHgwODAw Cj4gPiArI2RlZmluZSBJSVNfQUNfUElOX1NFTCAgICAgICAgIDB4MDEwMAo+ID4gKyNkZWZpbmUg RklGT19USCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MAo+ID4gKyNkZWZpbmUgQURDX0VO ICAgICAgICAgICAgICAgICAweDAwMTAKPiA+ICsjZGVmaW5lIE04MF9FTiAgICAgICAgICAgICAg ICAgMHgwMDA4Cj4gPiArI2RlZmluZSBBQ0xJTktfRU4gICAgICAgICAgICAgIDB4MDAwNAo+ID4g KyNkZWZpbmUgSUlTX0VOICAgICAgICAgICAgICAgICAweDAwMDIKPiA+ICsKPiA+ICsvKiBiaXQg ZGVmaW5pdGlvbiBvZiBSRUdfQUNUTF9SRVNFVCByZWdpc3RlciAqLwo+ID4gKyNkZWZpbmUgVzU2 OTFfUExBWSAgICAgICAgICAgICAweDIwMDAwCj4gPiArI2RlZmluZSBBQ1RMX1JFU0VUX0JJVCAg ICAgICAgIDB4MTAwMDAKPiA+ICsjZGVmaW5lIFJFQ09SRF9SSUdIVF9DSE5ORUwgICAgMHgwODAw MAo+ID4gKyNkZWZpbmUgUkVDT1JEX0xFRlRfQ0hOTkVMICAgICAweDA0MDAwCj4gPiArI2RlZmlu ZSBQTEFZX1JJR0hUX0NITk5FTCAgICAgIDB4MDIwMDAKPiA+ICsjZGVmaW5lIFBMQVlfTEVGVF9D SE5ORUwgICAgICAgMHgwMTAwMAo+ID4gKyNkZWZpbmUgREFDX1BMQVkgICAgICAgICAgICAgICAw eDAwODAwCj4gPiArI2RlZmluZSBBRENfUkVDT1JEICAgICAgICAgICAgIDB4MDA0MDAKPiA+ICsj ZGVmaW5lIE04MF9QTEFZICAgICAgICAgICAgICAgMHgwMDIwMAo+ID4gKyNkZWZpbmUgQUNfUkVD T1JEICAgICAgICAgICAgICAweDAwMTAwCj4gPiArI2RlZmluZSBBQ19QTEFZICAgICAgICAgICAg ICAgICAgICAgICAgMHgwMDA4MAo+ID4gKyNkZWZpbmUgSUlTX1JFQ09SRCAgICAgICAgICAgICAw eDAwMDQwCj4gPiArI2RlZmluZSBJSVNfUExBWSAgICAgICAgICAgICAgIDB4MDAwMjAKPiA+ICsj ZGVmaW5lIERBQ19SRVNFVCAgICAgICAgICAgICAgMHgwMDAxMAo+ID4gKyNkZWZpbmUgQURDX1JF U0VUICAgICAgICAgICAgICAweDAwMDA4Cj4gPiArI2RlZmluZSBNODBfUkVTRVQgICAgICAgICAg ICAgIDB4MDAwMDQKPiA+ICsjZGVmaW5lIEFDX1JFU0VUICAgICAgICAgICAgICAgMHgwMDAwMgo+ ID4gKyNkZWZpbmUgSUlTX1JFU0VUICAgICAgICAgICAgICAweDAwMDAxCj4gPiArCj4gPiArLyog Yml0IGRlZmluaXRpb24gb2YgUkVHX0FDVExfQUNDT04gcmVnaXN0ZXIgKi8KPiA+ICsjZGVmaW5l IEFDX0JDTEtfUFVfRU4gICAgICAgICAgMHgyMAo+ID4gKyNkZWZpbmUgQUNfUl9GSU5JU0ggICAg ICAgICAgICAweDEwCj4gPiArI2RlZmluZSBBQ19XX0ZJTklTSCAgICAgICAgICAgIDB4MDgKPiA+ ICsjZGVmaW5lIEFDX1dfUkVTICAgICAgICAgICAgICAgMHgwNAo+ID4gKyNkZWZpbmUgQUNfQ19S RVMgICAgICAgICAgICAgICAweDAyCj4gPiArCj4gPiArLyogYml0IGRlZmluaXRpb24gb2YgQUNU TF9SU1IgcmVnaXN0ZXIgKi8KPiA+ICsjZGVmaW5lIFJfRklGT19FTVBUWSAgICAgICAgICAgMHgw NAo+ID4gKyNkZWZpbmUgUl9ETUFfRU5EX0lSUSAgICAgICAgICAweDAyCj4gPiArI2RlZmluZSBS X0RNQV9NSURETEVfSVJRICAgICAgIDB4MDEKPiA+ICsKPiA+ICsvKiBiaXQgZGVmaW5pdGlvbiBv ZiBBQ1RMX1BTUiByZWdpc3RlciAqLwo+ID4gKyNkZWZpbmUgUF9GSUZPX0VNUFRZICAgICAgICAg ICAweDA0Cj4gPiArI2RlZmluZSBQX0RNQV9FTkRfSVJRICAgICAgICAgIDB4MDIKPiA+ICsjZGVm aW5lIFBfRE1BX01JRERMRV9JUlEgICAgICAgMHgwMQo+ID4gKwo+ID4gKy8qIGJpdCBkZWZpbml0 aW9uIG9mIEFDVExfQUNPUzAgcmVnaXN0ZXIgKi8KPiA+ICsjZGVmaW5lIFNMT1QxX1ZBTElEICAg ICAgICAgICAgMHgwMQo+ID4gKyNkZWZpbmUgU0xPVDJfVkFMSUQgICAgICAgICAgICAweDAyCj4g PiArI2RlZmluZSBTTE9UM19WQUxJRCAgICAgICAgICAgIDB4MDQKPiA+ICsjZGVmaW5lIFNMT1Q0 X1ZBTElEICAgICAgICAgICAgMHgwOAo+ID4gKyNkZWZpbmUgVkFMSURfRlJBTUUgICAgICAgICAg ICAweDEwCj4gPiArCj4gPiArLyogYml0IGRlZmluaXRpb24gb2YgQUNUTF9BQ09TMSByZWdpc3Rl ciAqLwo+ID4gKyNkZWZpbmUgUl9XQiAgICAgICAgICAgICAgICAgICAweDgwCj4gPiArCj4gPiAr I2RlZmluZSBDT0RFQ19SRUFEWSAgICAgICAgICAgIDB4MTAKPiA+ICsjZGVmaW5lIFJFU0VUX1BS U1IgICAgICAgICAgICAgMHgwMAo+ID4gKyNkZWZpbmUgQVVESU9fV1JJVEUoYWRkciwgdmFsKSBf X3Jhd193cml0ZWwodmFsLCBhZGRyKQo+ID4gKyNkZWZpbmUgQVVESU9fUkVBRChhZGRyKSAgICAg ICBfX3Jhd19yZWFkbChhZGRyKQo+ID4gKyNkZWZpbmUgUENNX1RYICAgICAgICAgICAgICAgICAw Cj4gPiArI2RlZmluZSBQQ01fUlggICAgICAgICAgICAgICAgIDEKPiA+ICsjZGVmaW5lIFNVQlNU UkVBTV9UWVBFKHN1YnN0cmVhbSkgXAo+ID4gKyAgICAgICAoKHN1YnN0cmVhbSktPnN0cmVhbSA9 PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8gUENNX1RYIDogUENNX1JYKQoKCldoeSBhcmUg eW91IHJlZGVmaW5pbmcgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyBhcyBQQ01fVFguIEl0IG1h a2VzIHRoZQpjb2RlIG1vcmUgZGlmZmljdWx0IHRvIHJlYWQuCgo+ID4gKwo+ID4gK3N0cnVjdCBu dWM5MDBfYXVkaW8gewo+ID4gKyAgICAgICB2b2lkIF9faW9tZW0gKm1taW87Cj4gPiArICAgICAg IHNwaW5sb2NrX3QgbG9jazsKPiA+ICsgICAgICAgZG1hX2FkZHJfdCBkbWFfYWRkclsyXTsKPiA+ ICsgICAgICAgdW5zaWduZWQgbG9uZyBidWZmZXJzaXplWzJdOwo+ID4gKyAgICAgICB1bnNpZ25l ZCBsb25nIGlycV9udW07Cj4gPiArICAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vi c3RyZWFtOwo+ID4gKyAgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKPiA+ICsgICAgICAgc3Ry dWN0IGNsayAqY2xrOwo+ID4gKyAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXY7Cj4gPiArCj4gPiAr fTsKPiA+ICsKPiA+ICtleHRlcm4gc3RydWN0IG51YzkwMF9hdWRpbyAqbnVjOTAwX2FjOTdfZGF0 YTsKPiA+ICtleHRlcm4gc3RydWN0IHNuZF9zb2NfZGFpIG51YzkwMF9hYzk3X2RhaTsKPiA+ICtl eHRlcm4gc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gbnVjOTAwX3NvY19wbGF0Zm9ybTsKPiA+ICsK PiA+ICsjZW5kaWYgLyplbmQgX05VQzkwMF9BVURJT19IICovCj4gPiBkaWZmIC0tZ2l0IGEvc291 bmQvc29jL251YzkwMC9udWM5MDAtcGNtLmMgYi9zb3VuZC9zb2MvbnVjOTAwL251YzkwMC1wY20u Ywo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+IGluZGV4IDAwMDAwMDAuLjMyYTUwM2MKPiA+ IC0tLSAvZGV2L251bGwKPiA+ICsrKyBiL3NvdW5kL3NvYy9udWM5MDAvbnVjOTAwLXBjbS5jCj4g PiBAQCAtMCwwICsxLDM1MiBAQAo+ID4gKy8qCj4gPiArICogQ29weXJpZ2h0IChjKSAyMDEwIE51 dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbi4KPiA+ICsgKgo+ID4gKyAqIFdhbiBab25nU2h1 biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KPiA+ICsgKgo+ID4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBm cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4gPiAr ICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkKPiA+ICsgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uO3ZlcnNp b24gMiBvZiB0aGUgTGljZW5zZS4KPiA+ICsgKgo+ID4gKyAqLwo+ID4gKwo+ID4gKyNpbmNsdWRl IDxsaW51eC9tb2R1bGUuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvaW5pdC5oPgo+ID4gKyNpbmNs dWRlIDxsaW51eC9pby5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4K PiA+ICsjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFw cGluZy5oPgo+ID4gKwo+ID4gKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Cj4gPiArI2luY2x1ZGUg PHNvdW5kL3BjbS5oPgo+ID4gKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+Cj4gPiArI2lu Y2x1ZGUgPHNvdW5kL3NvYy5oPgo+ID4gKwo+ID4gKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+ Cj4gPiArCj4gPiArI2luY2x1ZGUgIm51YzkwMC1hdWlkby5oIgo+ID4gKwo+ID4gK3N0YXRpYyBj b25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBudWM5MDBfcGNtX2hhcmR3YXJlID0gewo+ID4g KyAgICAgICAuaW5mbyAgICAgICAgICAgICAgICAgICA9IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVB VkVEIHwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTkRSVl9Q Q01fSU5GT19CTE9DS19UUkFOU0ZFUiB8Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgU05EUlZfUENNX0lORk9fTU1BUCB8Cj4gPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8Cj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU05EUlZfUENNX0lORk9fUEFVU0Ug fAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNORFJWX1BDTV9J TkZPX1JFU1VNRSwKPiA+ICsgICAgICAgLmZvcm1hdHMgICAgICAgICAgICAgICAgPSBTTkRSVl9Q Q01fRk1UQklUX1MxNl9MRSwKPiA+ICsgICAgICAgLmNoYW5uZWxzX21pbiAgICAgICAgICAgPSAx LAo+ID4gKyAgICAgICAuY2hhbm5lbHNfbWF4ICAgICAgICAgICA9IDIsCj4gPiArICAgICAgIC5i dWZmZXJfYnl0ZXNfbWF4ICAgICAgID0gNCoxMDI0LAo+ID4gKyAgICAgICAucGVyaW9kX2J5dGVz X21pbiAgICAgICA9IDEqMTAyNCwKPiA+ICsgICAgICAgLnBlcmlvZF9ieXRlc19tYXggICAgICAg PSA0KjEwMjQsCj4gPiArICAgICAgIC5wZXJpb2RzX21pbiAgICAgICAgICAgID0gMSwKPiA+ICsg ICAgICAgLnBlcmlvZHNfbWF4ICAgICAgICAgICAgPSAxMDI0LAo+ID4gK307Cj4gPiArCj4gPiAr c3RhdGljIGludCBudWM5MDBfZG1hX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0g KnN1YnN0cmVhbSwKPiA+ICsgICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMp Cj4gPiArewo+ID4gKyAgICAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vi c3RyZWFtLT5ydW50aW1lOwo+ID4gKyAgICAgICBzdHJ1Y3QgbnVjOTAwX2F1ZGlvICpudWM5MDBf YXVkaW8gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Cj4gPiArICAgICAgIHVuc2lnbmVkIGxvbmcg ZmxhZ3MsIHN0eXBlID0gU1VCU1RSRUFNX1RZUEUoc3Vic3RyZWFtKTsKPiA+ICsgICAgICAgaW50 IHJldCA9IDA7Cj4gPiArCj4gPiArICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZudWM5MDBfYXVk aW8tPmxvY2ssIGZsYWdzKTsKPiA+ICsKPiA+ICsgICAgICAgcmV0ID0gc25kX3BjbV9saWJfbWFs bG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpKTsKPiA+ICsg ICAgICAgaWYgKHJldCA8IDApCj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+ICsK PiA+ICsgICAgICAgbnVjOTAwX2F1ZGlvLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07Cj4gPiArICAg ICAgIG51YzkwMF9hdWRpby0+ZG1hX2FkZHJbc3R5cGVdID0gcnVudGltZS0+ZG1hX2FkZHI7Cj4g PiArICAgICAgIG51YzkwMF9hdWRpby0+YnVmZmVyc2l6ZVtzdHlwZV0gPSBwYXJhbXNfYnVmZmVy X2J5dGVzKHBhcmFtcyk7Cj4gPiArCj4gPiArICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUo Jm51YzkwMF9hdWRpby0+bG9jaywgZmxhZ3MpOwo+ID4gKwo+ID4gKyAgICAgICByZXR1cm4gcmV0 Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBudWM5MDBfdXBkYXRlX2RtYV9yZWdpc3Rl cihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IGNvdW50KQo+ID4g K3sKPiA+ICsgICAgICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVh bS0+cnVudGltZTsKPiA+ICsgICAgICAgc3RydWN0IG51YzkwMF9hdWRpbyAqbnVjOTAwX2F1ZGlv ID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwo+ID4gKyAgICAgICB2b2lkIF9faW9tZW0gKm1taW9f YWRkciwgKm1taW9fbGVuOwo+ID4gKwo+ID4gKyAgICAgICBpZiAoU1VCU1RSRUFNX1RZUEUoc3Vi c3RyZWFtKSA9PSBQQ01fVFgpIHsKPiA+ICsgICAgICAgICAgICAgICBtbWlvX2FkZHIgPSBudWM5 MDBfYXVkaW8tPm1taW8gKyBBQ1RMX1BEU1RCOwo+ID4gKyAgICAgICAgICAgICAgIG1taW9fbGVu ID0gbnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNUTF9QRFNUX0xFTkdUSDsKPiA+ICsgICAgICAgfSBl bHNlIHsKPiA+ICsgICAgICAgICAgICAgICBtbWlvX2FkZHIgPSBudWM5MDBfYXVkaW8tPm1taW8g KyBBQ1RMX1JEU1RCOwo+ID4gKyAgICAgICAgICAgICAgIG1taW9fbGVuID0gbnVjOTAwX2F1ZGlv LT5tbWlvICsgQUNUTF9SRFNUX0xFTkdUSDsKPiA+ICsgICAgICAgfQo+ID4gKwo+ID4gKyAgICAg ICBBVURJT19XUklURShtbWlvX2FkZHIsIGRtYV9hZGRyKTsKPiA+ICsgICAgICAgQVVESU9fV1JJ VEUobW1pb19sZW4sIGNvdW50KTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgbnVjOTAw X2RtYV9zdGFydChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKPiA+ICt7Cj4g PiArICAgICAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1 bnRpbWU7Cj4gPiArICAgICAgIHN0cnVjdCBudWM5MDBfYXVkaW8gKm51YzkwMF9hdWRpbyA9IHJ1 bnRpbWUtPnByaXZhdGVfZGF0YTsKPiA+ICsgICAgICAgdW5zaWduZWQgbG9uZyB2YWw7Cj4gPiAr Cj4gPiArICAgICAgIHZhbCA9IEFVRElPX1JFQUQobnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNUTF9D T04pOwo+ID4gKyAgICAgICB2YWwgfD0gKFRfRE1BX0lSUSB8IFJfRE1BX0lSUSk7Cj4gPiArICAg ICAgIEFVRElPX1dSSVRFKG51YzkwMF9hdWRpby0+bW1pbyArIEFDVExfQ09OLCB2YWwpOwo+ID4g K30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBudWM5MDBfZG1hX3N0b3Aoc3RydWN0IHNuZF9wY21f c3Vic3RyZWFtICpzdWJzdHJlYW0pCj4gPiArewo+ID4gKyAgICAgICBzdHJ1Y3Qgc25kX3BjbV9y dW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwo+ID4gKyAgICAgICBzdHJ1Y3Qg bnVjOTAwX2F1ZGlvICpudWM5MDBfYXVkaW8gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Cj4gPiAr ICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsOwo+ID4gKwo+ID4gKyAgICAgICB2YWwgPSBBVURJT19S RUFEKG51YzkwMF9hdWRpby0+bW1pbyArIEFDVExfQ09OKTsKPiA+ICsgICAgICAgdmFsICY9IH4o VF9ETUFfSVJRIHwgUl9ETUFfSVJRKTsKPiA+ICsgICAgICAgQVVESU9fV1JJVEUobnVjOTAwX2F1 ZGlvLT5tbWlvICsgQUNUTF9DT04sIHZhbCk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpcnFy ZXR1cm5fdCBudWM5MDBfZG1hX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCj4gPiAr ewo+ID4gKyAgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGRldl9p ZDsKPiA+ICsgICAgICAgc3RydWN0IG51YzkwMF9hdWRpbyAqbnVjOTAwX2F1ZGlvID0gc3Vic3Ry ZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Cj4gPiArICAgICAgIHVuc2lnbmVkIGxvbmcgdmFs Owo+ID4gKwo+ID4gKyAgICAgICBzcGluX2xvY2soJm51YzkwMF9hdWRpby0+bG9jayk7Cj4gPiAr Cj4gPiArICAgICAgIHZhbCA9IEFVRElPX1JFQUQobnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNUTF9D T04pOwo+ID4gKwo+ID4gKyAgICAgICBpZiAodmFsICYgUl9ETUFfSVJRKSB7Cj4gPiArICAgICAg ICAgICAgICAgQVVESU9fV1JJVEUobnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNUTF9DT04sIHZhbCB8 IFJfRE1BX0lSUSk7Cj4gPiArCj4gPiArICAgICAgICAgICAgICAgdmFsID0gQVVESU9fUkVBRChu dWM5MDBfYXVkaW8tPm1taW8gKyBBQ1RMX1JTUik7Cj4gPiArCj4gPiArICAgICAgICAgICAgICAg aWYgKHZhbCAmIFJfRE1BX01JRERMRV9JUlEpIHsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAg IHZhbCB8PSBSX0RNQV9NSURETEVfSVJROwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgQVVE SU9fV1JJVEUobnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNUTF9SU1IsIHZhbCk7Cj4gPiArICAgICAg ICAgICAgICAgfQo+ID4gKwo+ID4gKyAgICAgICAgICAgICAgIGlmICh2YWwgJiBSX0RNQV9FTkRf SVJRKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICB2YWwgfD0gUl9ETUFfRU5EX0lSUTsK PiA+ICsgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1dSSVRFKG51YzkwMF9hdWRpby0+bW1p byArIEFDVExfUlNSLCB2YWwpOwo+ID4gKyAgICAgICAgICAgICAgIH0KPiA+ICsgICAgICAgfSBl bHNlIGlmICh2YWwgJiBUX0RNQV9JUlEpIHsKPiA+ICsgICAgICAgICAgICAgICBBVURJT19XUklU RShudWM5MDBfYXVkaW8tPm1taW8gKyBBQ1RMX0NPTiwgdmFsIHwgVF9ETUFfSVJRKTsKPiA+ICsK PiA+ICsgICAgICAgICAgICAgICB2YWwgPSBBVURJT19SRUFEKG51YzkwMF9hdWRpby0+bW1pbyAr IEFDVExfUFNSKTsKPiA+ICsKPiA+ICsgICAgICAgICAgICAgICBpZiAodmFsICYgUF9ETUFfTUlE RExFX0lSUSkgewo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgdmFsIHw9IFBfRE1BX01JRERM RV9JUlE7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICBBVURJT19XUklURShudWM5MDBfYXVk aW8tPm1taW8gKyBBQ1RMX1BTUiwgdmFsKTsKPiA+ICsgICAgICAgICAgICAgICB9Cj4gPiArCj4g PiArICAgICAgICAgICAgICAgaWYgKHZhbCAmIFBfRE1BX0VORF9JUlEpIHsKPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgIHZhbCB8PSBQX0RNQV9FTkRfSVJROwo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgQVVESU9fV1JJVEUobnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNUTF9QU1IsIHZhbCk7 Cj4gPiArICAgICAgICAgICAgICAgfQo+ID4gKyAgICAgICB9IGVsc2Ugewo+ID4gKyAgICAgICAg ICAgICAgIGRldl9lcnIobnVjOTAwX2F1ZGlvLT5kZXYsICJXcm9uZyBETUEgaW50ZXJydXB0IHN0 YXR1cyFcbiIpOwo+ID4gKyAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKCZudWM5MDBfYXVkaW8t PmxvY2spOwo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKPiA+ICsgICAg ICAgfQo+ID4gKwo+ID4gKyAgICAgICBzcGluX3VubG9jaygmbnVjOTAwX2F1ZGlvLT5sb2NrKTsK PiA+ICsKPiA+ICsgICAgICAgc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOwo+ID4g Kwo+ID4gKyAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRp YyBpbnQgbnVjOTAwX2RtYV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3Ry ZWFtKQo+ID4gK3sKPiA+ICsgICAgICAgc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0p Owo+ID4gKyAgICAgICByZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBudWM5 MDBfZG1hX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCj4gPiAr ewo+ID4gKyAgICAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFt LT5ydW50aW1lOwo+ID4gKyAgICAgICBzdHJ1Y3QgbnVjOTAwX2F1ZGlvICpudWM5MDBfYXVkaW8g PSBydW50aW1lLT5wcml2YXRlX2RhdGE7Cj4gPiArICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3Ms IHZhbCwgc3R5cGUgPSBTVUJTVFJFQU1fVFlQRShzdWJzdHJlYW0pOzsKPiA+ICsKPiA+ICsgICAg ICAgc3Bpbl9sb2NrX2lycXNhdmUoJm51YzkwMF9hdWRpby0+bG9jaywgZmxhZ3MpOwo+ID4gKwo+ ID4gKyAgICAgICBudWM5MDBfdXBkYXRlX2RtYV9yZWdpc3RlcihzdWJzdHJlYW0sCj4gPiArICAg ICAgICAgICAgICAgbnVjOTAwX2F1ZGlvLT5kbWFfYWRkcltzdHlwZV0sIG51YzkwMF9hdWRpby0+ YnVmZmVyc2l6ZVtzdHlwZV0pOwo+ID4gKwo+ID4gKyAgICAgICB2YWwgPSBBVURJT19SRUFEKG51 YzkwMF9hdWRpby0+bW1pbyArIEFDVExfUkVTRVQpOwo+ID4gKwo+ID4gKyAgICAgICBzd2l0Y2gg KHJ1bnRpbWUtPmNoYW5uZWxzKSB7Cj4gPiArICAgICAgIGNhc2UgMToKPiA+ICsgICAgICAgICAg ICAgICBpZiAoUENNX1RYID09IHN0eXBlKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICB2 YWwgJj0gfihQTEFZX0xFRlRfQ0hOTkVMIHwgUExBWV9SSUdIVF9DSE5ORUwpOwo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgdmFsIHw9IFBMQVlfUklHSFRfQ0hOTkVMOwo+ID4gKyAgICAgICAg ICAgICAgIH0gZWxzZSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICB2YWwgJj0gfihSRUNP UkRfTEVGVF9DSE5ORUwgfCBSRUNPUkRfUklHSFRfQ0hOTkVMKTsKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgIHZhbCB8PSBSRUNPUkRfUklHSFRfQ0hOTkVMOwo+ID4gKyAgICAgICAgICAgICAg IH0KPiA+ICsgICAgICAgICAgICAgICBBVURJT19XUklURShudWM5MDBfYXVkaW8tPm1taW8gKyBB Q1RMX1JFU0VULCB2YWwpOwo+ID4gKyAgICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgICBj YXNlIDI6Cj4gPiArICAgICAgICAgICAgICAgaWYgKFBDTV9UWCA9PSBzdHlwZSkKPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgIHZhbCB8PSAoUExBWV9MRUZUX0NITk5FTCB8IFBMQVlfUklHSFRf Q0hOTkVMKTsKPiA+ICsgICAgICAgICAgICAgICBlbHNlCj4gPiArICAgICAgICAgICAgICAgICAg ICAgICB2YWwgfD0gKFJFQ09SRF9MRUZUX0NITk5FTCB8IFJFQ09SRF9SSUdIVF9DSE5ORUwpOwo+ ID4gKyAgICAgICAgICAgICAgIEFVRElPX1dSSVRFKG51YzkwMF9hdWRpby0+bW1pbyArIEFDVExf UkVTRVQsIHZhbCk7Cj4gPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICAgIGRlZmF1 bHQ6Cj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gPiArICAgICAgIH0KPiA+ ICsgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnVjOTAwX2F1ZGlvLT5sb2NrLCBmbGFn cyk7Cj4gPiArICAgICAgIHJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG51 YzkwMF9kbWFfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50 IGNtZCkKPiA+ICt7Cj4gPiArICAgICAgIGludCByZXQgPSAwOwo+ID4gKwo+ID4gKyAgICAgICBz d2l0Y2ggKGNtZCkgewo+ID4gKyAgICAgICBjYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgo+ ID4gKyAgICAgICBjYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKPiA+ICsgICAgICAgICAg ICAgICBudWM5MDBfZG1hX3N0YXJ0KHN1YnN0cmVhbSk7Cj4gPiArICAgICAgICAgICAgICAgYnJl YWs7Cj4gPiArCj4gPiArICAgICAgIGNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKPiA+ICsg ICAgICAgY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgo+ID4gKyAgICAgICAgICAgICAg IG51YzkwMF9kbWFfc3RvcChzdWJzdHJlYW0pOwo+ID4gKyAgICAgICAgICAgICAgIGJyZWFrOwo+ ID4gKwo+ID4gKyAgICAgICBkZWZhdWx0Ogo+ID4gKyAgICAgICAgICAgICAgIHJldCA9IC1FSU5W QUw7Cj4gPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICAgIH0KPiA+ICsKPiA+ICsg ICAgICAgcmV0dXJuIHJldDsKPiA+ICt9Cj4gPiArCj4gPiAraW50IG51YzkwMF9kbWFfZ2V0cG9z aXRpb24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG1hX2FkZHJfdCAqc3JjLCBkbWFfYWRkcl90 ICpkc3QpCj4gPiArewo+ID4gKyAgICAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1l ID0gc3Vic3RyZWFtLT5ydW50aW1lOwo+ID4gKyAgICAgICBzdHJ1Y3QgbnVjOTAwX2F1ZGlvICpu dWM5MDBfYXVkaW8gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Cj4gPiArCj4gPiArICAgICAgIGlm IChzcmMgIT0gTlVMTCkKPiA+ICsgICAgICAgICAgICAgICAqc3JjID0gQVVESU9fUkVBRChudWM5 MDBfYXVkaW8tPm1taW8gKyBBQ1RMX1BEU1RDKTsKPiA+ICsKPiA+ICsgICAgICAgaWYgKGRzdCAh PSBOVUxMKQo+ID4gKyAgICAgICAgICAgICAgICpkc3QgPSBBVURJT19SRUFEKG51YzkwMF9hdWRp by0+bW1pbyArIEFDVExfUkRTVEMpOwo+ID4gKwo+ID4gKyAgICAgICByZXR1cm4gMDsKPiA+ICt9 Cj4gPiArCj4gPiArc3RhdGljIHNuZF9wY21fdWZyYW1lc190IG51YzkwMF9kbWFfcG9pbnRlcihz dHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKPiA+ICt7Cj4gPiArICAgICAgIHN0 cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Cj4gPiAr ICAgICAgIGRtYV9hZGRyX3Qgc3JjLCBkc3Q7Cj4gPiArICAgICAgIHVuc2lnbmVkIGxvbmcgcmVz Owo+ID4gKwo+ID4gKyAgICAgICBudWM5MDBfZG1hX2dldHBvc2l0aW9uKHN1YnN0cmVhbSwgJnNy YywgJmRzdCk7Cj4gPiArCj4gPiArICAgICAgIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRS Vl9QQ01fU1RSRUFNX0NBUFRVUkUpCj4gPiArICAgICAgICAgICAgICAgcmVzID0gZHN0IC0gcnVu dGltZS0+ZG1hX2FkZHI7Cj4gPiArICAgICAgIGVsc2UKPiA+ICsgICAgICAgICAgICAgICByZXMg PSBzcmMgLSBydW50aW1lLT5kbWFfYWRkcjsKPiA+ICsKPiA+ICsgICAgICAgcmV0dXJuIGJ5dGVz X3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHJlcyk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0 YXRpYyBpbnQgbnVjOTAwX2RtYV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3Ry ZWFtKQo+ID4gK3sKPiA+ICsgICAgICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9 IHN1YnN0cmVhbS0+cnVudGltZTsKPiA+ICsgICAgICAgc3RydWN0IG51YzkwMF9hdWRpbyAqbnVj OTAwX2F1ZGlvOwo+ID4gKwo+ID4gKyAgICAgICBzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1z KHN1YnN0cmVhbSwgJm51YzkwMF9wY21faGFyZHdhcmUpOwo+ID4gKwo+ID4gKyAgICAgICBudWM5 MDBfYXVkaW8gPSBudWM5MDBfYWM5N19kYXRhOwo+ID4gKwo+ID4gKyAgICAgICBpZiAocmVxdWVz dF9pcnEobnVjOTAwX2F1ZGlvLT5pcnFfbnVtLCBudWM5MDBfZG1hX2ludGVycnVwdCwKPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgIElSUUZfRElTQUJMRUQsICJudWM5MDAtZG1hIiwgc3Vic3Ry ZWFtKSkKPiA+ICsgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwo+ID4gKwo+ID4gKyAgICAg ICBydW50aW1lLT5wcml2YXRlX2RhdGEgPSBudWM5MDBfYXVkaW87Cj4gPiArCj4gPiArICAgICAg IHJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG51YzkwMF9kbWFfY2xvc2Uo c3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCj4gPiArewo+ID4gKyAgICAgICBz dHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwo+ID4g KyAgICAgICBzdHJ1Y3QgbnVjOTAwX2F1ZGlvICpudWM5MDBfYXVkaW8gPSBydW50aW1lLT5wcml2 YXRlX2RhdGE7Cj4gPiArCj4gPiArICAgICAgIGZyZWVfaXJxKG51YzkwMF9hdWRpby0+aXJxX251 bSwgc3Vic3RyZWFtKTsKPiA+ICsKPiA+ICsgICAgICAgcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ ID4gK3N0YXRpYyBpbnQgbnVjOTAwX2RtYV9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAq c3Vic3RyZWFtLAo+ID4gKyAgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKPiA+ICt7 Cj4gPiArICAgICAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0t PnJ1bnRpbWU7Cj4gPiArCj4gPiArICAgICAgIHJldHVybiBkbWFfbW1hcF93cml0ZWNvbWJpbmUo c3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwgdm1hLAo+ID4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUtPmRtYV9hcmVhLAo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUtPmRtYV9hZGRyLAo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUtPmRtYV9ieXRlcyk7Cj4gPiAr fQo+ID4gKwo+ID4gK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgbnVjOTAwX2RtYV9vcHMgPSB7 Cj4gPiArICAgICAgIC5vcGVuICAgICAgICAgICA9IG51YzkwMF9kbWFfb3BlbiwKPiA+ICsgICAg ICAgLmNsb3NlICAgICAgICAgID0gbnVjOTAwX2RtYV9jbG9zZSwKPiA+ICsgICAgICAgLmlvY3Rs ICAgICAgICAgID0gc25kX3BjbV9saWJfaW9jdGwsCj4gPiArICAgICAgIC5od19wYXJhbXMgICAg ICA9IG51YzkwMF9kbWFfaHdfcGFyYW1zLAo+ID4gKyAgICAgICAuaHdfZnJlZSAgICAgICAgPSBu dWM5MDBfZG1hX2h3X2ZyZWUsCj4gPiArICAgICAgIC5wcmVwYXJlICAgICAgICA9IG51YzkwMF9k bWFfcHJlcGFyZSwKPiA+ICsgICAgICAgLnRyaWdnZXIgICAgICAgID0gbnVjOTAwX2RtYV90cmln Z2VyLAo+ID4gKyAgICAgICAucG9pbnRlciAgICAgICAgPSBudWM5MDBfZG1hX3BvaW50ZXIsCj4g PiArICAgICAgIC5tbWFwICAgICAgICAgICA9IG51YzkwMF9kbWFfbW1hcCwKPiA+ICt9Owo+ID4g Kwo+ID4gK3N0YXRpYyB2b2lkIG51YzkwMF9kbWFfZnJlZV9kbWFfYnVmZmVycyhzdHJ1Y3Qgc25k X3BjbSAqcGNtKQo+ID4gK3sKPiA+ICsgICAgICAgc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJl ZV9mb3JfYWxsKHBjbSk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB1NjQgbnVjOTAwX3BjbV9k bWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKPiA+ICtzdGF0aWMgaW50IG51YzkwMF9kbWFfbmV3 KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKPiA+ICsgICAgICAgc3RydWN0IHNuZF9zb2NfZGFpICpk YWksIHN0cnVjdCBzbmRfcGNtICpwY20pCj4gPiArewo+ID4gKyAgICAgICBpZiAoIWNhcmQtPmRl di0+ZG1hX21hc2spCj4gPiArICAgICAgICAgICAgICAgY2FyZC0+ZGV2LT5kbWFfbWFzayA9ICZu dWM5MDBfcGNtX2RtYW1hc2s7Cj4gPiArICAgICAgIGlmICghY2FyZC0+ZGV2LT5jb2hlcmVudF9k bWFfbWFzaykKPiA+ICsgICAgICAgICAgICAgICBjYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNr ID0gRE1BX0JJVF9NQVNLKDMyKTsKPiA+ICsKPiA+ICsgICAgICAgc25kX3BjbV9saWJfcHJlYWxs b2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFViwKPiA+ICsgICAgICAg ICAgICAgICBjYXJkLT5kZXYsIDQgKiAxMDI0LCAoNCAqIDEwMjQpIC0gMSk7Cj4gPiArCj4gPiAr ICAgICAgIHJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9y bSBudWM5MDBfc29jX3BsYXRmb3JtID0gewo+ID4gKyAgICAgICAubmFtZSAgICAgICAgICAgPSAi bnVjOTAwLWRtYSIsCj4gPiArICAgICAgIC5wY21fb3BzICAgICAgICA9ICZudWM5MDBfZG1hX29w cywKPiA+ICsgICAgICAgLnBjbV9uZXcgICAgICAgID0gbnVjOTAwX2RtYV9uZXcsCj4gPiArICAg ICAgIC5wY21fZnJlZSAgICAgICA9IG51YzkwMF9kbWFfZnJlZV9kbWFfYnVmZmVycywKPiA+ICt9 Cj4gPiArRVhQT1JUX1NZTUJPTF9HUEwobnVjOTAwX3NvY19wbGF0Zm9ybSk7Cj4gPiArCj4gPiAr c3RhdGljIGludCBfX2luaXQgbnVjOTAwX3NvY19wbGF0Zm9ybV9pbml0KHZvaWQpCj4gPiArewo+ ID4gKyAgICAgICByZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmbnVjOTAwX3NvY19w bGF0Zm9ybSk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIF9fZXhpdCBudWM5MDBfc29j X3BsYXRmb3JtX2V4aXQodm9pZCkKPiA+ICt7Cj4gPiArICAgICAgIHNuZF9zb2NfdW5yZWdpc3Rl cl9wbGF0Zm9ybSgmbnVjOTAwX3NvY19wbGF0Zm9ybSk7Cj4gPiArfQo+ID4gKwo+ID4gK21vZHVs ZV9pbml0KG51YzkwMF9zb2NfcGxhdGZvcm1faW5pdCk7Cj4gPiArbW9kdWxlX2V4aXQobnVjOTAw X3NvY19wbGF0Zm9ybV9leGl0KTsKPiA+ICsKPiA+ICtNT0RVTEVfQVVUSE9SKCJXYW4gWm9uZ1No dW4sIDxtY3Vvcy5jb21AZ21haWwuY29tPiIpOwo+ID4gK01PRFVMRV9ERVNDUklQVElPTigibnVj OTAwIEF1ZGlvIERNQSBtb2R1bGUiKTsKPiA+ICtNT0RVTEVfTElDRU5TRSgiR1BMIik7Cj4gPiAt LQo+ID4gMS42LjMuMwoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCkFsc2EtZGV2ZWwgbWFpbGluZyBsaXN0CkFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9y ZwpodHRwOi8vbWFpbG1hbi5hbHNhLXByb2plY3Qub3JnL21haWxtYW4vbGlzdGluZm8vYWxzYS1k ZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: lrg@slimlogic.co.uk (Liam Girdwood) Date: Wed, 19 May 2010 11:55:24 +0100 Subject: [PATCH v2] NUC900/audio: add nuc900 audio driver support In-Reply-To: References: <4BF2289A.9030609@gmail.com> Message-ID: <1274266524.3240.106.camel@odin> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Wed, 2010-05-19 at 16:07 +0800, Wan ZongShun wrote: > Hi Mark, > > How about this patch? > Could it be merged into mainline? Some minor comments inline. > > Thanks! > > ? 2010?5?18? ??1:41?Wan ZongShun ??? > > Dear Mark, > > > > I have modified some codes according to your comments, > > now I submit the patch as v2 again. > > > > Thanks a lot for your help. > > > > Signed-off-by: Wan ZongShun > > --- > > sound/soc/Kconfig | 1 + > > sound/soc/Makefile | 1 + > > sound/soc/nuc900/Kconfig | 27 +++ > > sound/soc/nuc900/Makefile | 11 + > > sound/soc/nuc900/nuc900-ac97.c | 443 +++++++++++++++++++++++++++++++++++++++ > > sound/soc/nuc900/nuc900-audio.c | 81 +++++++ > > sound/soc/nuc900/nuc900-auido.h | 121 +++++++++++ > > sound/soc/nuc900/nuc900-pcm.c | 352 +++++++++++++++++++++++++++++++ > > 8 files changed, 1037 insertions(+), 0 deletions(-) > > create mode 100644 sound/soc/nuc900/Kconfig > > create mode 100644 sound/soc/nuc900/Makefile > > create mode 100644 sound/soc/nuc900/nuc900-ac97.c > > create mode 100644 sound/soc/nuc900/nuc900-audio.c > > create mode 100644 sound/soc/nuc900/nuc900-auido.h > > create mode 100644 sound/soc/nuc900/nuc900-pcm.c > > > > diff --git a/sound/soc/Kconfig b/sound/soc/Kconfig > > index b1749bc..6e04fc2 100644 > > --- a/sound/soc/Kconfig > > +++ b/sound/soc/Kconfig > > @@ -30,6 +30,7 @@ source "sound/soc/blackfin/Kconfig" > > source "sound/soc/davinci/Kconfig" > > source "sound/soc/fsl/Kconfig" > > source "sound/soc/imx/Kconfig" > > +source "sound/soc/nuc900/Kconfig" > > source "sound/soc/omap/Kconfig" > > source "sound/soc/pxa/Kconfig" > > source "sound/soc/s3c24xx/Kconfig" > > diff --git a/sound/soc/Makefile b/sound/soc/Makefile > > index 1470141..ccec241 100644 > > --- a/sound/soc/Makefile > > +++ b/sound/soc/Makefile > > @@ -8,6 +8,7 @@ obj-$(CONFIG_SND_SOC) += blackfin/ > > obj-$(CONFIG_SND_SOC) += davinci/ > > obj-$(CONFIG_SND_SOC) += fsl/ > > obj-$(CONFIG_SND_SOC) += imx/ > > +obj-$(CONFIG_SND_SOC) += nuc900/ > > obj-$(CONFIG_SND_SOC) += omap/ > > obj-$(CONFIG_SND_SOC) += pxa/ > > obj-$(CONFIG_SND_SOC) += s3c24xx/ > > diff --git a/sound/soc/nuc900/Kconfig b/sound/soc/nuc900/Kconfig > > new file mode 100644 > > index 0000000..a0ed1c6 > > --- /dev/null > > +++ b/sound/soc/nuc900/Kconfig > > @@ -0,0 +1,27 @@ > > +## > > +## NUC900 series AC97 API > > +## > > +config SND_SOC_NUC900 > > + tristate "SoC Audio for NUC900 series" > > + depends on ARCH_W90X900 > > + help > > + This option enables support for AC97 mode on the NUC900 SoC. > > + > > +config SND_SOC_NUC900_AC97 > > + tristate > > + select AC97_BUS > > + select SND_AC97_CODEC > > + select SND_SOC_AC97_BUS > > + > > + > > +## > > +## Boards > > +## > > +config SND_SOC_NUC900EVB > > + tristate "NUC900 AC97 support for demo board" > > + depends on SND_SOC_NUC900 > > + select SND_SOC_NUC900_AC97 > > + select SND_SOC_AC97_CODEC > > + help > > + Select this option to enable audio (AC97) on the > > + NUC900 demoboard. > > diff --git a/sound/soc/nuc900/Makefile b/sound/soc/nuc900/Makefile > > new file mode 100644 > > index 0000000..7e46c71 > > --- /dev/null > > +++ b/sound/soc/nuc900/Makefile > > @@ -0,0 +1,11 @@ > > +# NUC900 series audio > > +snd-soc-nuc900-pcm-objs := nuc900-pcm.o > > +snd-soc-nuc900-ac97-objs := nuc900-ac97.o > > + > > +obj-$(CONFIG_SND_SOC_NUC900) += snd-soc-nuc900-pcm.o > > +obj-$(CONFIG_SND_SOC_NUC900_AC97) += snd-soc-nuc900-ac97.o > > + > > +# Boards > > +snd-soc-nuc900-audio-objs := nuc900-audio.o > > + > > +obj-$(CONFIG_SND_SOC_NUC900EVB) += snd-soc-nuc900-audio.o > > diff --git a/sound/soc/nuc900/nuc900-ac97.c b/sound/soc/nuc900/nuc900-ac97.c > > new file mode 100644 > > index 0000000..2c345e2 > > --- /dev/null > > +++ b/sound/soc/nuc900/nuc900-ac97.c > > @@ -0,0 +1,443 @@ > > +/* > > + * Copyright (c) 2009-2010 Nuvoton technology corporation. > > + * > > + * Wan ZongShun > > + * > > + * This program is free software; you can redistribute it and/or modify > > + * it under the terms of the GNU General Public License as published by > > + * the Free Software Foundation;version 2 of the License. > > + * > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#include > > + > > +#include "nuc900-auido.h" > > + > > +static DEFINE_MUTEX(ac97_mutex); > > +struct nuc900_audio *nuc900_ac97_data; > > + > > +static int nuc900_checkready(void) > > +{ > > + struct nuc900_audio *nuc900_audio = nuc900_ac97_data; > > + > > + if (!(AUDIO_READ(nuc900_audio->mmio + ACTL_ACIS0) & CODEC_READY)) > > + return -EPERM; > > + > > + return 0; > > +} > > + > > +/* AC97 controller reads codec register */ > > +static unsigned short nuc900_ac97_read(struct snd_ac97 *ac97, > > + unsigned short reg) > > +{ > > + struct nuc900_audio *nuc900_audio = nuc900_ac97_data; > > + unsigned long timeout = 0x10000, val; > > + > > + mutex_lock(&ac97_mutex); > > + > > + val = nuc900_checkready(); > > + if (!!val) { > > + dev_err(nuc900_audio->dev, "AC97 codec is not ready\n"); > > + goto out; > > + } > > + > > + /* set the R_WB bit and write register index */ > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS1, R_WB | reg); > > + > > + /* set the valid frame bit and valid slots */ > > + val = AUDIO_READ(nuc900_audio->mmio + ACTL_ACOS0); > > + val |= (VALID_FRAME | SLOT1_VALID); > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS0, val); > > + > > + udelay(100); > > + > > + /* polling the AC_R_FINISH */ > > + val = AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON); > > + val &= AC_R_FINISH; > > + while (!val && timeout--) > > + mdelay(1); > > + > > + if (!timeout) { > > + dev_err(nuc900_audio->dev, "AC97 read register time out !\n"); > > + val = -EPERM; > > + goto out; > > + } > > + > > + val = AUDIO_READ(nuc900_audio->mmio + ACTL_ACOS0) ; > > + val &= ~SLOT1_VALID; > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS0, val); > > + > > + if (AUDIO_READ(nuc900_audio->mmio + ACTL_ACIS1) >> 2 != reg) { > > + dev_err(nuc900_audio->dev, > > + "R_INDEX of REG_ACTL_ACIS1 not match!\n"); > > + } > > + > > + udelay(100); > > + val = (AUDIO_READ(nuc900_audio->mmio + ACTL_ACIS2) & 0xFFFF); > > + > > +out: > > + mutex_unlock(&ac97_mutex); > > + return val; > > +} > > + > > +/* AC97 controller writes to codec register */ > > +static void nuc900_ac97_write(struct snd_ac97 *ac97, unsigned short reg, > > + unsigned short val) > > +{ > > + struct nuc900_audio *nuc900_audio = nuc900_ac97_data; > > + unsigned long tmp, timeout = 0x10000; > > + > > + mutex_lock(&ac97_mutex); > > + > > + tmp = nuc900_checkready(); > > + if (!!tmp) > > + dev_err(nuc900_audio->dev, "AC97 codec is not ready\n"); > > + > > + /* clear the R_WB bit and write register index */ > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS1, reg); > > + > > + /* write register value */ > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS2, val); > > + > > + /* set the valid frame bit and valid slots */ > > + tmp = AUDIO_READ(nuc900_audio->mmio + ACTL_ACOS0); > > + tmp |= SLOT1_VALID | SLOT2_VALID | VALID_FRAME; > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS0, tmp); > > + > > + udelay(100); > > + > > + /* polling the AC_W_FINISH */ > > + tmp = AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON); > > + tmp &= AC_W_FINISH; > > + while (tmp && timeout--) > > + mdelay(1); > > + > > + if (!timeout) > > + dev_err(nuc900_audio->dev, "AC97 write register time out !\n"); > > + > > + tmp = AUDIO_READ(nuc900_audio->mmio + ACTL_ACOS0); > > + tmp &= ~(SLOT1_VALID | SLOT2_VALID); > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS0, tmp); > > + > > + mutex_unlock(&ac97_mutex); > > + > > +} > > + > > +static void nuc900_ac97_warm_reset(struct snd_ac97 *ac97) > > +{ > > + struct nuc900_audio *nuc900_audio = nuc900_ac97_data; > > + unsigned long val; > > + > > + mutex_lock(&ac97_mutex); > > + > > + /* warm reset AC 97 */ > > + val = AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON); > > + val |= AC_W_RES; > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACCON, val); > > + > > + udelay(1000); > > + > > + val = nuc900_checkready(); > > + if (!!val) > > + dev_err(nuc900_audio->dev, "AC97 codec is not ready\n"); > > + > > + mutex_unlock(&ac97_mutex); > > +} > > + > > +static void nuc900_ac97_cold_reset(struct snd_ac97 *ac97) > > +{ > > + struct nuc900_audio *nuc900_audio = nuc900_ac97_data; > > + unsigned long val; > > + > > + mutex_lock(&ac97_mutex); > > + > > + /* reset Audio Controller */ > > + val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); > > + val |= ACTL_RESET_BIT; > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); > > + > > + udelay(1000); > > + > > + val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); > > + val &= (~ACTL_RESET_BIT); > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); > > + > > + udelay(1000); > > + > > + /* reset AC-link interface */ > > + > > + val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); > > + val |= AC_RESET; > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); > > + > > + udelay(1000); > > + > > + val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); > > + val &= ~AC_RESET; > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); > > + > > + udelay(1000); > > + > > + /* cold reset AC 97 */ > > + val = AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON); > > + val |= AC_C_RES; > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACCON, val); > > + > > + udelay(1000); > > + > > + val = AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON); > > + val &= (~AC_C_RES); > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACCON, val); > > + > > + udelay(1000); > > + Just curious, these 1000 micro seconds delays all seem over spec for the AC97 interface. > > + mutex_unlock(&ac97_mutex); > > + > > +} > > + > > +/* AC97 controller operations */ > > +struct snd_ac97_bus_ops soc_ac97_ops = { > > + .read = nuc900_ac97_read, > > + .write = nuc900_ac97_write, > > + .reset = nuc900_ac97_cold_reset, > > + .warm_reset = nuc900_ac97_warm_reset, > > +} > > +EXPORT_SYMBOL_GPL(soc_ac97_ops); > > + > > +static int nuc900_ac97_trigger(struct snd_pcm_substream *substream, > > + int cmd, struct snd_soc_dai *dai) > > +{ > > + struct nuc900_audio *nuc900_audio = nuc900_ac97_data; > > + int ret, stype = SUBSTREAM_TYPE(substream); > > + unsigned long val, tmp; > > + > > + ret = 0; > > + > > + switch (cmd) { > > + case SNDRV_PCM_TRIGGER_START: > > + case SNDRV_PCM_TRIGGER_RESUME: > > + val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); > > + if (PCM_TX == stype) { > > + tmp = AUDIO_READ(nuc900_audio->mmio + ACTL_ACOS0); > > + tmp |= (SLOT3_VALID | SLOT4_VALID | VALID_FRAME); > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS0, tmp); > > + > > + tmp = AUDIO_READ(nuc900_audio->mmio + ACTL_PSR); > > + tmp |= (P_DMA_END_IRQ | P_DMA_MIDDLE_IRQ); > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_PSR, tmp); > > + val |= AC_PLAY; > > + } else { > > + tmp = AUDIO_READ(nuc900_audio->mmio + ACTL_RSR); > > + tmp |= (R_DMA_END_IRQ | R_DMA_MIDDLE_IRQ); > > + > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RSR, tmp); > > + val |= AC_RECORD; > > + } > > + > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); > > + > > + break; > > + case SNDRV_PCM_TRIGGER_STOP: > > + case SNDRV_PCM_TRIGGER_SUSPEND: > > + val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); > > + if (PCM_TX == stype) { > > + tmp = AUDIO_READ(nuc900_audio->mmio + ACTL_ACOS0); > > + tmp &= ~(SLOT3_VALID | SLOT4_VALID); > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_ACOS0, tmp); > > + > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_PSR, RESET_PRSR); > > + val &= ~AC_PLAY; > > + } else { > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RSR, RESET_PRSR); > > + val &= ~AC_RECORD; > > + } > > + > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); > > + > > + break; > > + default: > > + ret = -EINVAL; > > + } > > + > > + return ret; > > +} > > + > > +static int nuc900_ac97_probe(struct platform_device *pdev, > > + struct snd_soc_dai *dai) > > +{ > > + struct nuc900_audio *nuc900_audio = nuc900_ac97_data; > > + unsigned long val; > > + > > + mutex_lock(&ac97_mutex); > > + > > + /* enable unit clock */ > > + clk_enable(nuc900_audio->clk); > > + > > + /* enable audio controller and AC-link interface */ > > + val = AUDIO_READ(nuc900_audio->mmio + ACTL_CON); > > + val |= (IIS_AC_PIN_SEL | ACLINK_EN); > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_CON, val); > > + > > + mutex_unlock(&ac97_mutex); > > + > > + return 0; > > +} > > + > > +static void nuc900_ac97_remove(struct platform_device *pdev, > > + struct snd_soc_dai *dai) > > +{ > > + struct nuc900_audio *nuc900_audio = nuc900_ac97_data; > > + > > + clk_disable(nuc900_audio->clk); > > +} > > + > > +static struct snd_soc_dai_ops nuc900_ac97_dai_ops = { > > + .trigger = nuc900_ac97_trigger, > > +}; > > + > > +struct snd_soc_dai nuc900_ac97_dai = { > > + .name = "nuc900-ac97", > > + .probe = nuc900_ac97_probe, > > + .remove = nuc900_ac97_remove, > > + .ac97_control = 1, > > + .playback = { > > + .rates = SNDRV_PCM_RATE_8000_48000, > > + .formats = SNDRV_PCM_FMTBIT_S16_LE, > > + .channels_min = 1, > > + .channels_max = 2, > > + }, > > + .capture = { > > + .rates = SNDRV_PCM_RATE_8000_48000, > > + .formats = SNDRV_PCM_FMTBIT_S16_LE, > > + .channels_min = 1, > > + .channels_max = 2, > > + }, > > + .ops = &nuc900_ac97_dai_ops, > > +} > > +EXPORT_SYMBOL_GPL(nuc900_ac97_dai); > > + > > +static int __devinit nuc900_ac97_drvprobe(struct platform_device *pdev) > > +{ > > + struct nuc900_audio *nuc900_audio; > > + int ret; > > + > > + if (nuc900_ac97_data) > > + return -EBUSY; > > + > > + nuc900_audio = kzalloc(sizeof(struct nuc900_audio), GFP_KERNEL); > > + if (!nuc900_audio) > > + return -ENOMEM; > > + > > + spin_lock_init(&nuc900_audio->lock); > > + > > + nuc900_audio->res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > + if (!nuc900_audio->res) { > > + ret = -ENODEV; > > + goto out0; > > + } > > + > > + if (!request_mem_region(nuc900_audio->res->start, > > + resource_size(nuc900_audio->res), pdev->name)) { > > + ret = -EBUSY; > > + goto out0; > > + } > > + > > + nuc900_audio->mmio = ioremap(nuc900_audio->res->start, > > + resource_size(nuc900_audio->res)); > > + if (!nuc900_audio->mmio) { > > + ret = -ENOMEM; > > + goto out1; > > + } > > + > > + nuc900_audio->clk = clk_get(&pdev->dev, NULL); > > + if (IS_ERR(nuc900_audio->clk)) { > > + ret = PTR_ERR(nuc900_audio->clk); > > + goto out2; > > + } > > + > > + nuc900_audio->irq_num = platform_get_irq(pdev, 0); > > + if (!nuc900_audio->irq_num) { > > + ret = -EBUSY; > > + goto out2; > > + } > > + > > + nuc900_ac97_data = nuc900_audio; > > + > > + nuc900_audio->dev = nuc900_ac97_dai.dev = &pdev->dev; > > + > > + ret = snd_soc_register_dai(&nuc900_ac97_dai); > > + if (ret) > > + goto out3; > > + > > + mfp_set_groupg(nuc900_audio->dev); /* enbale ac97 multifunction pin*/ > > + > > + return 0; > > + > > +out3: > > + clk_put(nuc900_audio->clk); > > +out2: > > + iounmap(nuc900_audio->mmio); > > +out1: > > + release_mem_region(nuc900_audio->res->start, > > + resource_size(nuc900_audio->res)); > > +out0: > > + kfree(nuc900_audio); > > + return ret; > > +} > > + > > +static int __devexit nuc900_ac97_drvremove(struct platform_device *pdev) > > +{ > > + > > + snd_soc_unregister_dai(&nuc900_ac97_dai); > > + > > + clk_put(nuc900_ac97_data->clk); > > + iounmap(nuc900_ac97_data->mmio); > > + release_mem_region(nuc900_ac97_data->res->start, > > + resource_size(nuc900_ac97_data->res)); > > + > > + nuc900_ac97_data = NULL; > > + > > + return 0; > > +} > > + > > +static struct platform_driver nuc900_ac97_driver = { > > + .driver = { > > + .name = "nuc900-audio", > > + .owner = THIS_MODULE, > > + }, > > + .probe = nuc900_ac97_drvprobe, > > + .remove = __devexit_p(nuc900_ac97_drvremove), > > +}; > > + > > +static int __init nuc900_ac97_init(void) > > +{ > > + return platform_driver_register(&nuc900_ac97_driver); > > +} > > + > > +static void __exit nuc900_ac97_exit(void) > > +{ > > + platform_driver_unregister(&nuc900_ac97_driver); > > +} > > + > > +module_init(nuc900_ac97_init); > > +module_exit(nuc900_ac97_exit); > > + > > +MODULE_AUTHOR("Wan ZongShun "); > > +MODULE_DESCRIPTION("NUC900 AC97 SoC driver!"); > > +MODULE_LICENSE("GPL"); > > +MODULE_ALIAS("platform:nuc900-ac97"); > > + > > diff --git a/sound/soc/nuc900/nuc900-audio.c b/sound/soc/nuc900/nuc900-audio.c > > new file mode 100644 > > index 0000000..b33d5b8 > > --- /dev/null > > +++ b/sound/soc/nuc900/nuc900-audio.c > > @@ -0,0 +1,81 @@ > > +/* > > + * Copyright (c) 2010 Nuvoton technology corporation. > > + * > > + * Wan ZongShun > > + * > > + * This program is free software; you can redistribute it and/or modify > > + * it under the terms of the GNU General Public License as published by > > + * the Free Software Foundation;version 2 of the License. > > + * > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#include > > +#include > > +#include > > +#include > > + > > +#include "../codecs/ac97.h" > > +#include "nuc900-auido.h" > > + > > +static struct snd_soc_dai_link nuc900evb_ac97_dai = { > > + .name = "AC97", > > + .stream_name = "AC97 HiFi", > > + .cpu_dai = &nuc900_ac97_dai, > > + .codec_dai = &ac97_dai, > > +}; > > + > > +static struct snd_soc_card nuc900evb_audio_machine = { > > + .name = "NUC900EVB_AC97", > > + .dai_link = &nuc900evb_ac97_dai, > > + .num_links = 1, > > + .platform = &nuc900_soc_platform, > > +}; > > + > > +static struct snd_soc_device nuc900evb_ac97_devdata = { > > + .card = &nuc900evb_audio_machine, > > + .codec_dev = &soc_codec_dev_ac97, > > +}; > > + > > +static struct platform_device *nuc900evb_asoc_dev; > > + > > +static int __init nuc900evb_audio_init(void) > > +{ > > + int ret; > > + > > + ret = -ENOMEM; > > + nuc900evb_asoc_dev = platform_device_alloc("soc-audio", -1); > > + if (!nuc900evb_asoc_dev) > > + goto out; > > + > > + /* nuc900 board audio device */ > > + platform_set_drvdata(nuc900evb_asoc_dev, &nuc900evb_ac97_devdata); > > + > > + nuc900evb_ac97_devdata.dev = &nuc900evb_asoc_dev->dev; > > + ret = platform_device_add(nuc900evb_asoc_dev); > > + > > + if (ret) { > > + platform_device_put(nuc900evb_asoc_dev); > > + nuc900evb_asoc_dev = NULL; > > + } > > + > > +out: > > + return ret; > > +} > > + > > +static void __exit nuc900evb_audio_exit(void) > > +{ > > + platform_device_unregister(nuc900evb_asoc_dev); > > +} > > + > > +module_init(nuc900evb_audio_init); > > +module_exit(nuc900evb_audio_exit); > > + > > +MODULE_LICENSE("GPL"); > > +MODULE_DESCRIPTION("NUC900 Series ASoC audio support"); > > +MODULE_AUTHOR("Wan ZongShun"); > > diff --git a/sound/soc/nuc900/nuc900-auido.h b/sound/soc/nuc900/nuc900-auido.h > > new file mode 100644 > > index 0000000..95ac4ef > > --- /dev/null > > +++ b/sound/soc/nuc900/nuc900-auido.h > > @@ -0,0 +1,121 @@ > > +/* > > + * Copyright (c) 2010 Nuvoton technology corporation. > > + * > > + * Wan ZongShun > > + * > > + * This program is free software; you can redistribute it and/or modify > > + * it under the terms of the GNU General Public License as published by > > + * the Free Software Foundation;version 2 of the License. > > + * > > + */ > > + > > +#ifndef _NUC900_AUDIO_H > > +#define _NUC900_AUDIO_H > > + > > +#include > > + > > +/* Audio Control Registers */ > > +#define ACTL_CON 0x00 > > +#define ACTL_RESET 0x04 > > +#define ACTL_RDSTB 0x08 > > +#define ACTL_RDST_LENGTH 0x0C > > +#define ACTL_RDSTC 0x10 > > +#define ACTL_RSR 0x14 > > +#define ACTL_PDSTB 0x18 > > +#define ACTL_PDST_LENGTH 0x1C > > +#define ACTL_PDSTC 0x20 > > +#define ACTL_PSR 0x24 > > +#define ACTL_IISCON 0x28 > > +#define ACTL_ACCON 0x2C > > +#define ACTL_ACOS0 0x30 > > +#define ACTL_ACOS1 0x34 > > +#define ACTL_ACOS2 0x38 > > +#define ACTL_ACIS0 0x3C > > +#define ACTL_ACIS1 0x40 > > +#define ACTL_ACIS2 0x44 > > +#define ACTL_COUNTER 0x48 > > + > > +/* bit definition of REG_ACTL_CON register */ > > +#define R_DMA_IRQ 0x1000 > > +#define T_DMA_IRQ 0x0800 > > +#define IIS_AC_PIN_SEL 0x0100 > > +#define FIFO_TH 0x0080 > > +#define ADC_EN 0x0010 > > +#define M80_EN 0x0008 > > +#define ACLINK_EN 0x0004 > > +#define IIS_EN 0x0002 > > + > > +/* bit definition of REG_ACTL_RESET register */ > > +#define W5691_PLAY 0x20000 > > +#define ACTL_RESET_BIT 0x10000 > > +#define RECORD_RIGHT_CHNNEL 0x08000 > > +#define RECORD_LEFT_CHNNEL 0x04000 > > +#define PLAY_RIGHT_CHNNEL 0x02000 > > +#define PLAY_LEFT_CHNNEL 0x01000 > > +#define DAC_PLAY 0x00800 > > +#define ADC_RECORD 0x00400 > > +#define M80_PLAY 0x00200 > > +#define AC_RECORD 0x00100 > > +#define AC_PLAY 0x00080 > > +#define IIS_RECORD 0x00040 > > +#define IIS_PLAY 0x00020 > > +#define DAC_RESET 0x00010 > > +#define ADC_RESET 0x00008 > > +#define M80_RESET 0x00004 > > +#define AC_RESET 0x00002 > > +#define IIS_RESET 0x00001 > > + > > +/* bit definition of REG_ACTL_ACCON register */ > > +#define AC_BCLK_PU_EN 0x20 > > +#define AC_R_FINISH 0x10 > > +#define AC_W_FINISH 0x08 > > +#define AC_W_RES 0x04 > > +#define AC_C_RES 0x02 > > + > > +/* bit definition of ACTL_RSR register */ > > +#define R_FIFO_EMPTY 0x04 > > +#define R_DMA_END_IRQ 0x02 > > +#define R_DMA_MIDDLE_IRQ 0x01 > > + > > +/* bit definition of ACTL_PSR register */ > > +#define P_FIFO_EMPTY 0x04 > > +#define P_DMA_END_IRQ 0x02 > > +#define P_DMA_MIDDLE_IRQ 0x01 > > + > > +/* bit definition of ACTL_ACOS0 register */ > > +#define SLOT1_VALID 0x01 > > +#define SLOT2_VALID 0x02 > > +#define SLOT3_VALID 0x04 > > +#define SLOT4_VALID 0x08 > > +#define VALID_FRAME 0x10 > > + > > +/* bit definition of ACTL_ACOS1 register */ > > +#define R_WB 0x80 > > + > > +#define CODEC_READY 0x10 > > +#define RESET_PRSR 0x00 > > +#define AUDIO_WRITE(addr, val) __raw_writel(val, addr) > > +#define AUDIO_READ(addr) __raw_readl(addr) > > +#define PCM_TX 0 > > +#define PCM_RX 1 > > +#define SUBSTREAM_TYPE(substream) \ > > + ((substream)->stream == SNDRV_PCM_STREAM_PLAYBACK ? PCM_TX : PCM_RX) Why are you redefining SNDRV_PCM_STREAM_PLAYBACK as PCM_TX. It makes the code more difficult to read. > > + > > +struct nuc900_audio { > > + void __iomem *mmio; > > + spinlock_t lock; > > + dma_addr_t dma_addr[2]; > > + unsigned long buffersize[2]; > > + unsigned long irq_num; > > + struct snd_pcm_substream *substream; > > + struct resource *res; > > + struct clk *clk; > > + struct device *dev; > > + > > +}; > > + > > +extern struct nuc900_audio *nuc900_ac97_data; > > +extern struct snd_soc_dai nuc900_ac97_dai; > > +extern struct snd_soc_platform nuc900_soc_platform; > > + > > +#endif /*end _NUC900_AUDIO_H */ > > diff --git a/sound/soc/nuc900/nuc900-pcm.c b/sound/soc/nuc900/nuc900-pcm.c > > new file mode 100644 > > index 0000000..32a503c > > --- /dev/null > > +++ b/sound/soc/nuc900/nuc900-pcm.c > > @@ -0,0 +1,352 @@ > > +/* > > + * Copyright (c) 2010 Nuvoton technology corporation. > > + * > > + * Wan ZongShun > > + * > > + * This program is free software; you can redistribute it and/or modify > > + * it under the terms of the GNU General Public License as published by > > + * the Free Software Foundation;version 2 of the License. > > + * > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#include > > +#include > > +#include > > +#include > > + > > +#include > > + > > +#include "nuc900-auido.h" > > + > > +static const struct snd_pcm_hardware nuc900_pcm_hardware = { > > + .info = SNDRV_PCM_INFO_INTERLEAVED | > > + SNDRV_PCM_INFO_BLOCK_TRANSFER | > > + SNDRV_PCM_INFO_MMAP | > > + SNDRV_PCM_INFO_MMAP_VALID | > > + SNDRV_PCM_INFO_PAUSE | > > + SNDRV_PCM_INFO_RESUME, > > + .formats = SNDRV_PCM_FMTBIT_S16_LE, > > + .channels_min = 1, > > + .channels_max = 2, > > + .buffer_bytes_max = 4*1024, > > + .period_bytes_min = 1*1024, > > + .period_bytes_max = 4*1024, > > + .periods_min = 1, > > + .periods_max = 1024, > > +}; > > + > > +static int nuc900_dma_hw_params(struct snd_pcm_substream *substream, > > + struct snd_pcm_hw_params *params) > > +{ > > + struct snd_pcm_runtime *runtime = substream->runtime; > > + struct nuc900_audio *nuc900_audio = runtime->private_data; > > + unsigned long flags, stype = SUBSTREAM_TYPE(substream); > > + int ret = 0; > > + > > + spin_lock_irqsave(&nuc900_audio->lock, flags); > > + > > + ret = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(params)); > > + if (ret < 0) > > + return ret; > > + > > + nuc900_audio->substream = substream; > > + nuc900_audio->dma_addr[stype] = runtime->dma_addr; > > + nuc900_audio->buffersize[stype] = params_buffer_bytes(params); > > + > > + spin_unlock_irqrestore(&nuc900_audio->lock, flags); > > + > > + return ret; > > +} > > + > > +static void nuc900_update_dma_register(struct snd_pcm_substream *substream, > > + dma_addr_t dma_addr, size_t count) > > +{ > > + struct snd_pcm_runtime *runtime = substream->runtime; > > + struct nuc900_audio *nuc900_audio = runtime->private_data; > > + void __iomem *mmio_addr, *mmio_len; > > + > > + if (SUBSTREAM_TYPE(substream) == PCM_TX) { > > + mmio_addr = nuc900_audio->mmio + ACTL_PDSTB; > > + mmio_len = nuc900_audio->mmio + ACTL_PDST_LENGTH; > > + } else { > > + mmio_addr = nuc900_audio->mmio + ACTL_RDSTB; > > + mmio_len = nuc900_audio->mmio + ACTL_RDST_LENGTH; > > + } > > + > > + AUDIO_WRITE(mmio_addr, dma_addr); > > + AUDIO_WRITE(mmio_len, count); > > +} > > + > > +static void nuc900_dma_start(struct snd_pcm_substream *substream) > > +{ > > + struct snd_pcm_runtime *runtime = substream->runtime; > > + struct nuc900_audio *nuc900_audio = runtime->private_data; > > + unsigned long val; > > + > > + val = AUDIO_READ(nuc900_audio->mmio + ACTL_CON); > > + val |= (T_DMA_IRQ | R_DMA_IRQ); > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_CON, val); > > +} > > + > > +static void nuc900_dma_stop(struct snd_pcm_substream *substream) > > +{ > > + struct snd_pcm_runtime *runtime = substream->runtime; > > + struct nuc900_audio *nuc900_audio = runtime->private_data; > > + unsigned long val; > > + > > + val = AUDIO_READ(nuc900_audio->mmio + ACTL_CON); > > + val &= ~(T_DMA_IRQ | R_DMA_IRQ); > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_CON, val); > > +} > > + > > +static irqreturn_t nuc900_dma_interrupt(int irq, void *dev_id) > > +{ > > + struct snd_pcm_substream *substream = dev_id; > > + struct nuc900_audio *nuc900_audio = substream->runtime->private_data; > > + unsigned long val; > > + > > + spin_lock(&nuc900_audio->lock); > > + > > + val = AUDIO_READ(nuc900_audio->mmio + ACTL_CON); > > + > > + if (val & R_DMA_IRQ) { > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_CON, val | R_DMA_IRQ); > > + > > + val = AUDIO_READ(nuc900_audio->mmio + ACTL_RSR); > > + > > + if (val & R_DMA_MIDDLE_IRQ) { > > + val |= R_DMA_MIDDLE_IRQ; > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RSR, val); > > + } > > + > > + if (val & R_DMA_END_IRQ) { > > + val |= R_DMA_END_IRQ; > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RSR, val); > > + } > > + } else if (val & T_DMA_IRQ) { > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_CON, val | T_DMA_IRQ); > > + > > + val = AUDIO_READ(nuc900_audio->mmio + ACTL_PSR); > > + > > + if (val & P_DMA_MIDDLE_IRQ) { > > + val |= P_DMA_MIDDLE_IRQ; > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_PSR, val); > > + } > > + > > + if (val & P_DMA_END_IRQ) { > > + val |= P_DMA_END_IRQ; > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_PSR, val); > > + } > > + } else { > > + dev_err(nuc900_audio->dev, "Wrong DMA interrupt status!\n"); > > + spin_unlock(&nuc900_audio->lock); > > + return IRQ_HANDLED; > > + } > > + > > + spin_unlock(&nuc900_audio->lock); > > + > > + snd_pcm_period_elapsed(substream); > > + > > + return IRQ_HANDLED; > > +} > > + > > +static int nuc900_dma_hw_free(struct snd_pcm_substream *substream) > > +{ > > + snd_pcm_lib_free_pages(substream); > > + return 0; > > +} > > + > > +static int nuc900_dma_prepare(struct snd_pcm_substream *substream) > > +{ > > + struct snd_pcm_runtime *runtime = substream->runtime; > > + struct nuc900_audio *nuc900_audio = runtime->private_data; > > + unsigned long flags, val, stype = SUBSTREAM_TYPE(substream);; > > + > > + spin_lock_irqsave(&nuc900_audio->lock, flags); > > + > > + nuc900_update_dma_register(substream, > > + nuc900_audio->dma_addr[stype], nuc900_audio->buffersize[stype]); > > + > > + val = AUDIO_READ(nuc900_audio->mmio + ACTL_RESET); > > + > > + switch (runtime->channels) { > > + case 1: > > + if (PCM_TX == stype) { > > + val &= ~(PLAY_LEFT_CHNNEL | PLAY_RIGHT_CHNNEL); > > + val |= PLAY_RIGHT_CHNNEL; > > + } else { > > + val &= ~(RECORD_LEFT_CHNNEL | RECORD_RIGHT_CHNNEL); > > + val |= RECORD_RIGHT_CHNNEL; > > + } > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); > > + break; > > + case 2: > > + if (PCM_TX == stype) > > + val |= (PLAY_LEFT_CHNNEL | PLAY_RIGHT_CHNNEL); > > + else > > + val |= (RECORD_LEFT_CHNNEL | RECORD_RIGHT_CHNNEL); > > + AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val); > > + break; > > + default: > > + return -EINVAL; > > + } > > + spin_unlock_irqrestore(&nuc900_audio->lock, flags); > > + return 0; > > +} > > + > > +static int nuc900_dma_trigger(struct snd_pcm_substream *substream, int cmd) > > +{ > > + int ret = 0; > > + > > + switch (cmd) { > > + case SNDRV_PCM_TRIGGER_START: > > + case SNDRV_PCM_TRIGGER_RESUME: > > + nuc900_dma_start(substream); > > + break; > > + > > + case SNDRV_PCM_TRIGGER_STOP: > > + case SNDRV_PCM_TRIGGER_SUSPEND: > > + nuc900_dma_stop(substream); > > + break; > > + > > + default: > > + ret = -EINVAL; > > + break; > > + } > > + > > + return ret; > > +} > > + > > +int nuc900_dma_getposition(struct snd_pcm_substream *substream, > > + dma_addr_t *src, dma_addr_t *dst) > > +{ > > + struct snd_pcm_runtime *runtime = substream->runtime; > > + struct nuc900_audio *nuc900_audio = runtime->private_data; > > + > > + if (src != NULL) > > + *src = AUDIO_READ(nuc900_audio->mmio + ACTL_PDSTC); > > + > > + if (dst != NULL) > > + *dst = AUDIO_READ(nuc900_audio->mmio + ACTL_RDSTC); > > + > > + return 0; > > +} > > + > > +static snd_pcm_uframes_t nuc900_dma_pointer(struct snd_pcm_substream *substream) > > +{ > > + struct snd_pcm_runtime *runtime = substream->runtime; > > + dma_addr_t src, dst; > > + unsigned long res; > > + > > + nuc900_dma_getposition(substream, &src, &dst); > > + > > + if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) > > + res = dst - runtime->dma_addr; > > + else > > + res = src - runtime->dma_addr; > > + > > + return bytes_to_frames(substream->runtime, res); > > +} > > + > > +static int nuc900_dma_open(struct snd_pcm_substream *substream) > > +{ > > + struct snd_pcm_runtime *runtime = substream->runtime; > > + struct nuc900_audio *nuc900_audio; > > + > > + snd_soc_set_runtime_hwparams(substream, &nuc900_pcm_hardware); > > + > > + nuc900_audio = nuc900_ac97_data; > > + > > + if (request_irq(nuc900_audio->irq_num, nuc900_dma_interrupt, > > + IRQF_DISABLED, "nuc900-dma", substream)) > > + return -EBUSY; > > + > > + runtime->private_data = nuc900_audio; > > + > > + return 0; > > +} > > + > > +static int nuc900_dma_close(struct snd_pcm_substream *substream) > > +{ > > + struct snd_pcm_runtime *runtime = substream->runtime; > > + struct nuc900_audio *nuc900_audio = runtime->private_data; > > + > > + free_irq(nuc900_audio->irq_num, substream); > > + > > + return 0; > > +} > > + > > +static int nuc900_dma_mmap(struct snd_pcm_substream *substream, > > + struct vm_area_struct *vma) > > +{ > > + struct snd_pcm_runtime *runtime = substream->runtime; > > + > > + return dma_mmap_writecombine(substream->pcm->card->dev, vma, > > + runtime->dma_area, > > + runtime->dma_addr, > > + runtime->dma_bytes); > > +} > > + > > +static struct snd_pcm_ops nuc900_dma_ops = { > > + .open = nuc900_dma_open, > > + .close = nuc900_dma_close, > > + .ioctl = snd_pcm_lib_ioctl, > > + .hw_params = nuc900_dma_hw_params, > > + .hw_free = nuc900_dma_hw_free, > > + .prepare = nuc900_dma_prepare, > > + .trigger = nuc900_dma_trigger, > > + .pointer = nuc900_dma_pointer, > > + .mmap = nuc900_dma_mmap, > > +}; > > + > > +static void nuc900_dma_free_dma_buffers(struct snd_pcm *pcm) > > +{ > > + snd_pcm_lib_preallocate_free_for_all(pcm); > > +} > > + > > +static u64 nuc900_pcm_dmamask = DMA_BIT_MASK(32); > > +static int nuc900_dma_new(struct snd_card *card, > > + struct snd_soc_dai *dai, struct snd_pcm *pcm) > > +{ > > + if (!card->dev->dma_mask) > > + card->dev->dma_mask = &nuc900_pcm_dmamask; > > + if (!card->dev->coherent_dma_mask) > > + card->dev->coherent_dma_mask = DMA_BIT_MASK(32); > > + > > + snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, > > + card->dev, 4 * 1024, (4 * 1024) - 1); > > + > > + return 0; > > +} > > + > > +struct snd_soc_platform nuc900_soc_platform = { > > + .name = "nuc900-dma", > > + .pcm_ops = &nuc900_dma_ops, > > + .pcm_new = nuc900_dma_new, > > + .pcm_free = nuc900_dma_free_dma_buffers, > > +} > > +EXPORT_SYMBOL_GPL(nuc900_soc_platform); > > + > > +static int __init nuc900_soc_platform_init(void) > > +{ > > + return snd_soc_register_platform(&nuc900_soc_platform); > > +} > > + > > +static void __exit nuc900_soc_platform_exit(void) > > +{ > > + snd_soc_unregister_platform(&nuc900_soc_platform); > > +} > > + > > +module_init(nuc900_soc_platform_init); > > +module_exit(nuc900_soc_platform_exit); > > + > > +MODULE_AUTHOR("Wan ZongShun, "); > > +MODULE_DESCRIPTION("nuc900 Audio DMA module"); > > +MODULE_LICENSE("GPL"); > > -- > > 1.6.3.3