From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, NICE_REPLY_A,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 66218C433E0 for ; Mon, 3 Aug 2020 13:07:09 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 26EAA20678 for ; Mon, 3 Aug 2020 13:07:09 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="itRx1S5c"; dkim=pass (1024-bit key) header.d=microchiptechnology.onmicrosoft.com header.i=@microchiptechnology.onmicrosoft.com header.b="QZ8hmZBK" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728015AbgHCNHE (ORCPT ); Mon, 3 Aug 2020 09:07:04 -0400 Received: from esa2.microchip.iphmx.com ([68.232.149.84]:44425 "EHLO esa2.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726946AbgHCNHD (ORCPT ); Mon, 3 Aug 2020 09:07:03 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1596460021; x=1627996021; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-id:content-transfer-encoding: mime-version; bh=lFYmmCJ+kwPwVQIfcB1u2ydoBgfra08OW8XBd6VYAMk=; b=itRx1S5c/0MlNZJLNhTebr5DT7fETv+L68HlqIxa3ggYCUzfNRVogmGJ 6l4SHrp5uw6BY2DtKlr0NGsK4h0k61ElPOTGAAhIveJbJ5XuqOddFif2w 6vdwccXoLWUWS3qVZaSS8OcGu5Yr29d/a5zzjTurNROydAZ41CKA7jtbk 9rnx2921iBIoU7zduNPxNGnJxmHlseCHeQ2yEQkEBoQnNIO48ER++9+UW T5pNyL+ldtDs0FYZvM1NyN/34OFk6khcQPXFLEHaVI+FvDlLN+zqfcO9r MzI7KdRwluX5xtljtMAbdY7YnwIA/z7x/h+wEjfjPPWgzTAI0fpD/hX4m A==; IronPort-SDR: 77EH4yeVazX8KszrURS6XcVNCKQvnodAH5f4cAcEJ7b6zCEl0oK8v4p7W/vfc6K2g4Tc3UwqYq wZl3bT+U0NS4vDtQ3Izsz/noh/dztlvEwyli+9jQEEouz9R86j+eP0fSuFBeQuKNmchwhc8LoY dADU8XE0U8k3E1l5YUIDC0Dg3kZKKDGpm3hXINy36jnTbQiz+9A/kCMH68uirpyRZorBFANBqy DB8WEf/5A591tBjYDm9TFqteD801vELqybXW43KKLOBAgd8ywlyJMxy6KGbuYyiOTjntZRbHhC xrE= X-IronPort-AV: E=Sophos;i="5.75,430,1589266800"; d="scan'208";a="84235213" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa2.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 03 Aug 2020 06:07:01 -0700 Received: from chn-vm-ex02.mchp-main.com (10.10.85.144) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1979.3; Mon, 3 Aug 2020 06:07:00 -0700 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (10.10.215.89) by email.microchip.com (10.10.87.72) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1979.3 via Frontend Transport; Mon, 3 Aug 2020 06:06:57 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=KBFacZXk1H9O9mz+qT+zb/YDsXKjJORpUCndVJhmpimuOpItjVq4PqHJ+GfBJ45DiBs67I9j5/qYbE46ATz9N3tkFGZi7K/KiTuYTZImzCQh0AHV6vuBGs2+CeXFYzyLX6ybIQCflmx5P6Dq912u08SUcN1RaFf5w939psf2phn27F95xgHbFSROXENZAsRScrhjJf3W4yxOULxCwWoqSfVi4zAZhqcvQhEaEYjYJIs4Sn5eaQbaoFNKF9o6YOmeMLm+6slAaPC0E9tb3Z4nh26kQgFqBrWITZPFSUw3+LPXUuekfv2B27AbVMALHOaq0OeIMAgsMtFeS/dsS+NFbA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lFYmmCJ+kwPwVQIfcB1u2ydoBgfra08OW8XBd6VYAMk=; b=KTb5gqlYrsDZB+Pm6LOxsTig1G4xmNToiqUfV6C/laubwoDbgw07vgfv4UlXb3Q4nTbwG6y0DGC3oI+mQ22CN8N+Wy5heGgfQV92SEv4W7ajHeAwuLeLYeJD/9KAeNwnCECs7VnT1t/xb01eNPQoNkZVKVbnCSFXkPY3oUQ4zuf1S49715ZRw8UUVMLJ/Jn0WJqpi2chSLhPrfGsJTzr4Qe1oMkHKycT375mLs6BLJa19oLi+cXXQetv5oSa8Iu6ffiPuABmLzPROxthajjlBDqJjlhEazy1CuEUnYCh/8oT/QZRc7l9V6RSJ3fWrCt7S3i3O90X7FCjXbdZCH/mtA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=microchip.com; dmarc=pass action=none header.from=microchip.com; dkim=pass header.d=microchip.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microchiptechnology.onmicrosoft.com; s=selector2-microchiptechnology-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lFYmmCJ+kwPwVQIfcB1u2ydoBgfra08OW8XBd6VYAMk=; b=QZ8hmZBKJKejKM3ln+4SAY+wDKevBfEjnIO5STaaNpknqLHpk6+r5ArnPmwa7CO5cY6Od6yiW4kwdb+u8KhxtwiIKTg7AC1MCwQ1vtccjvndv5AgtE90PxvJNFw1PtJIDbTMBgpCVqG9pGKC8pWU2O3rAMJOoulTtPvI3wugcKI= Received: from DM6PR11MB3420.namprd11.prod.outlook.com (2603:10b6:5:69::31) by DM5PR11MB1930.namprd11.prod.outlook.com (2603:10b6:3:106::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3239.20; Mon, 3 Aug 2020 13:06:57 +0000 Received: from DM6PR11MB3420.namprd11.prod.outlook.com ([fe80::e8b2:1d82:49d9:f4b]) by DM6PR11MB3420.namprd11.prod.outlook.com ([fe80::e8b2:1d82:49d9:f4b%6]) with mapi id 15.20.3239.021; Mon, 3 Aug 2020 13:06:57 +0000 From: To: , , , , CC: , , , , , , Subject: Re: [PATCH v3 2/2] ASoC: mchp-spdiftx: add driver for S/PDIF TX Controller Thread-Topic: [PATCH v3 2/2] ASoC: mchp-spdiftx: add driver for S/PDIF TX Controller Thread-Index: AQHWaZb2Xv4RISU33E+0BkyOzrgC0g== Date: Mon, 3 Aug 2020 13:06:56 +0000 Message-ID: <4d009743-733a-9578-71b2-d320fdca9331@microchip.com> References: <20200803081851.102570-1-codrin.ciubotariu@microchip.com> <20200803081851.102570-2-codrin.ciubotariu@microchip.com> In-Reply-To: <20200803081851.102570-2-codrin.ciubotariu@microchip.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: user-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 authentication-results: microchip.com; dkim=none (message not signed) header.d=none;microchip.com; dmarc=none action=none header.from=microchip.com; x-originating-ip: [86.124.22.126] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 26f72aa7-d6a3-47e0-b6c5-08d837ae19e4 x-ms-traffictypediagnostic: DM5PR11MB1930: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-bypassexternaltag: True x-ms-oob-tlc-oobclassifiers: OLM:47; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: IqhWajqZAcLAF/se6/NI8rIYlmT55uVL/le6GBuZDf3L+5T0DHgJUhEDiuZQGFHEziiX8tp9WuwbCNJhKfrgmOjnq7VEAZI1Q280eS7CcYVGJdPu6zal0r8PxPi61AD+LFVobsR5+5T+bljTF/ifEg0+GJVYFYfi8xdK6rCowfnZw5wg3y/OgRpkTg0KhNHQms12uOp7T2lG0XfPOCi0S0a3m2Zl6AiZHf3U26STKliaDeFlv7JWtgVjqA9CvYpCE9rNBVXRonnQ8AzjCzHiA3BpbGzZgoUcqLTQ4VUsYFKFXO2l01KnbOAO7sT1oP0k7BrMoFo3qelAQGrrAStp6YLZVFLjimiavcUEujNj4dSw4SStkWQfmWLKTrXqGUAN x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM6PR11MB3420.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFTY:;SFS:(39860400002)(346002)(366004)(376002)(136003)(396003)(71200400001)(186003)(83380400001)(66946007)(2906002)(478600001)(86362001)(66446008)(64756008)(91956017)(76116006)(7416002)(31696002)(110136005)(31686004)(54906003)(53546011)(6506007)(66556008)(26005)(36756003)(66476007)(316002)(6512007)(30864003)(8676002)(6486002)(8936002)(4326008)(2616005)(5660300002)(43740500002)(579004)(559001);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata: yjnEvKxnfTZoydQst8YZNsAkheLwjl06evum8PdvhImoYtqY5m5/Z470cAOgOica1cj2h3rxfFBEoItJK9hPZt90rAqu28MI0Bk9Cfomm4fnAVN0E1FiWKYsxuLi2H0cEN4mjdjNbP1Hdlrv8u4BgKcAFmgr9a6p2LZ/oqLvm3OPokX59UNb/y4pucAFVK4fXLSboHIZ6uIBYfUaRjWY5dodWA/fYqoMXcbjwFXj0BvRFi4EJzDUTwwD0INsEljeS7o09TfmA1OSpK9pHTLCxiuoDlKhZC2b+QXvh+ZxPS8mC3EQkakfMkpaTe7HCOcss44MqgmZwER9eH/mXfooOsSfVvic36c2pCD59HnHnWgMI7kNnKx8MZ7HolWZsxvWt6/fHbShUp40GEkJoXy2EpMHo6ME4GvekyvVtPFXvjOAwRKEUERgDSkwaKjQY05yjlpsshGdVo6oLBjb2NsEpGGzoSBFWOEXUK+V1FL8kDUv4MnuPcN4TtTA0Y0GRh9abNTdSRjb9LtG1VnFDTI2Go++BV9L9YytFWtJi0po9EjdOi4qYNapGXd1AvqNTVoq+CIMRPBTnqaOQYj1irXYMgng8GxmVHch5zcFVFhDbQVcC6QG/AVhpU7FZRIUG4KFAAnyfrN4wWN9ccRqb11vlg== Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DM6PR11MB3420.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 26f72aa7-d6a3-47e0-b6c5-08d837ae19e4 X-MS-Exchange-CrossTenant-originalarrivaltime: 03 Aug 2020 13:06:56.9642 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3f4057f3-b418-4d4e-ba84-d55b4e897d88 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: k3afn8mp5+vevxtbh9HwxO8q4zNDj7yQHqMQO1yaxXNJMvMXipi1x8jsJiPXrpHX871k1y1YmP9vAyHaw+HwrhgObK3Xf30BCrbWBsQe1BY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR11MB1930 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org DQoNCk9uIDAzLjA4LjIwMjAgMTE6MTgsIENvZHJpbiBDaXVib3Rhcml1IHdyb3RlOg0KPiBUaGUg bmV3IFNQRElGIFRYIGNvbnRyb2xsZXIgaXMgYSBzZXJpYWwgcG9ydCBjb21wbGlhbnQgd2l0aCB0 aGUgSUVDLQ0KPiA2MDk1OCBzdGFuZGFyZC4gSXQgYWxzbyBzdXBwb3J0cyBwcm9ncmFtbWFibGUg VXNlciBEYXRhIGFuZCBDaGFubmVsDQo+IFN0YXR1cyBmaWVsZHMuDQo+IA0KPiBUaGlzIElQIGlz IGVtYmVkZGVkIGluIE1pY3JvY2hpcCdzIHNhbWE3ZzUgU29DLg0KPiANCj4gU2lnbmVkLW9mZi1i eTogQ29kcmluIENpdWJvdGFyaXUgPGNvZHJpbi5jaXVib3Rhcml1QG1pY3JvY2hpcC5jb20+DQo+ IC0tLQ0KPiANCj4gQ2hhbmdlcyBpbiB2MiwgdjM6DQo+ICAtIG5vbmU7DQo+IA0KPiAgc291bmQv c29jL2F0bWVsL0tjb25maWcgICAgICAgIHwgIDEyICsNCj4gIHNvdW5kL3NvYy9hdG1lbC9NYWtl ZmlsZSAgICAgICB8ICAgMiArDQo+ICBzb3VuZC9zb2MvYXRtZWwvbWNocC1zcGRpZnR4LmMgfCA4 NjQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrDQo+ICAzIGZpbGVzIGNoYW5nZWQs IDg3OCBpbnNlcnRpb25zKCspDQo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgc291bmQvc29jL2F0bWVs L21jaHAtc3BkaWZ0eC5jDQo+IA0KPiBkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0bWVsL0tjb25m aWcgYi9zb3VuZC9zb2MvYXRtZWwvS2NvbmZpZw0KPiBpbmRleCA3MWYyZDQyMTg4YzQuLjkzYmVi N2Q2NzBhMyAxMDA2NDQNCj4gLS0tIGEvc291bmQvc29jL2F0bWVsL0tjb25maWcNCj4gKysrIGIv c291bmQvc29jL2F0bWVsL0tjb25maWcNCj4gQEAgLTEzMiw0ICsxMzIsMTYgQEAgY29uZmlnIFNO RF9NQ0hQX1NPQ19JMlNfTUNDDQo+ICAJICBhbmQgc3VwcG9ydHMgYSBUaW1lIERpdmlzaW9uIE11 bHRpcGxleGVkIChURE0pIGludGVyZmFjZSB3aXRoDQo+ICAJICBleHRlcm5hbCBtdWx0aS1jaGFu bmVsIGF1ZGlvIGNvZGVjcy4NCj4gIA0KPiArY29uZmlnIFNORF9NQ0hQX1NPQ19TUERJRlRYDQo+ ICsJdHJpc3RhdGUgIk1pY3JvY2hpcCBBU29DIGRyaXZlciBmb3IgYm9hcmRzIHVzaW5nIFMvUERJ RiBUWCINCj4gKwlkZXBlbmRzIG9uIE9GICYmIChBUkNIX0FUOTEgfHwgQ09NUElMRV9URVNUKQ0K PiArCXNlbGVjdCBTTkRfU09DX0dFTkVSSUNfRE1BRU5HSU5FX1BDTQ0KPiArCXNlbGVjdCBSRUdN QVBfTU1JTw0KPiArCWhlbHANCj4gKwkgIFNheSBZIG9yIE0gaWYgeW91IHdhbnQgdG8gYWRkIHN1 cHBvcnQgZm9yIE1pY3JvY2hpcCBTL1BESUYgVFggQVNvYw0KPiArCSAgZHJpdmVyIG9uIHRoZSBm b2xsb3dpbmcgTWljcm9jaGlwIHBsYXRmb3JtczoNCj4gKwkgIC0gc2FtYTdnNQ0KPiArDQo+ICsJ ICBUaGlzIFMvUERJRiBUWCBkcml2ZXIgaXMgY29tcGxpYW50IHdpdGggSUVDLTYwOTU4IHN0YW5k YXJkIGFuZA0KPiArCSAgaW5jbHVkZXMgcHJvZ3JhbWFibGUgVXNlciBEYXRhIGFuZCBDaGFubmVs IFN0YXR1cyBmaWVsZHMuDQo+ICBlbmRpZg0KPiBkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0bWVs L01ha2VmaWxlIGIvc291bmQvc29jL2F0bWVsL01ha2VmaWxlDQo+IGluZGV4IGM3ZDI5ODk3OTFi ZS4uM2ZkODlhMDA2M2RmIDEwMDY0NA0KPiAtLS0gYS9zb3VuZC9zb2MvYXRtZWwvTWFrZWZpbGUN Cj4gKysrIGIvc291bmQvc29jL2F0bWVsL01ha2VmaWxlDQo+IEBAIC01LDYgKzUsNyBAQCBzbmQt c29jLWF0bWVsLXBjbS1kbWEtb2JqcyA6PSBhdG1lbC1wY20tZG1hLm8NCj4gIHNuZC1zb2MtYXRt ZWxfc3NjX2RhaS1vYmpzIDo9IGF0bWVsX3NzY19kYWkubw0KPiAgc25kLXNvYy1hdG1lbC1pMnMt b2JqcyA6PSBhdG1lbC1pMnMubw0KPiAgc25kLXNvYy1tY2hwLWkycy1tY2Mtb2JqcyA6PSBtY2hw LWkycy1tY2Mubw0KPiArc25kLXNvYy1tY2hwLXNwZGlmdHgtb2JqcyA6PSBtY2hwLXNwZGlmdHgu bw0KPiAgDQo+ICAjIHBkYyBhbmQgZG1hIG5lZWQgdG8gYm90aCBiZSBidWlsdC1pbiBpZiBhbnkg dXNlciBvZg0KPiAgIyBzc2MgaXMgYnVpbHQtaW4uDQo+IEBAIC0xNyw2ICsxOCw3IEBAIGVuZGlm DQo+ICBvYmotJChDT05GSUdfU05EX0FUTUVMX1NPQ19TU0MpICs9IHNuZC1zb2MtYXRtZWxfc3Nj X2RhaS5vDQo+ICBvYmotJChDT05GSUdfU05EX0FUTUVMX1NPQ19JMlMpICs9IHNuZC1zb2MtYXRt ZWwtaTJzLm8NCj4gIG9iai0kKENPTkZJR19TTkRfTUNIUF9TT0NfSTJTX01DQykgKz0gc25kLXNv Yy1tY2hwLWkycy1tY2Mubw0KPiArb2JqLSQoQ09ORklHX1NORF9NQ0hQX1NPQ19TUERJRlRYKSAr PSBzbmQtc29jLW1jaHAtc3BkaWZ0eC5vDQo+ICANCj4gICMgQVQ5MSBNYWNoaW5lIFN1cHBvcnQN Cj4gIHNuZC1zb2Mtc2FtOWcyMC13bTg3MzEtb2JqcyA6PSBzYW05ZzIwX3dtODczMS5vDQo+IGRp ZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvbWNocC1zcGRpZnR4LmMgYi9zb3VuZC9zb2MvYXRt ZWwvbWNocC1zcGRpZnR4LmMNCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4gaW5kZXggMDAwMDAw MDAwMDAwLi43MzhmNjc4ODIxMmUNCj4gLS0tIC9kZXYvbnVsbA0KPiArKysgYi9zb3VuZC9zb2Mv YXRtZWwvbWNocC1zcGRpZnR4LmMNCj4gQEAgLTAsMCArMSw4NjQgQEANCj4gKy8vIFNQRFgtTGlj ZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wDQo+ICsvLw0KPiArLy8gRHJpdmVyIGZvciBNaWNyb2No aXAgUy9QRElGIFRYIENvbnRyb2xsZXINCj4gKy8vDQo+ICsvLyBDb3B5cmlnaHQgKEMpIDIwMjAg TWljcm9jaGlwIFRlY2hub2xvZ3kgSW5jLiBhbmQgaXRzIHN1YnNpZGlhcmllcw0KPiArLy8NCj4g Ky8vIEF1dGhvcjogQ29kcmluIENpdWJvdGFyaXUgPGNvZHJpbi5jaXVib3Rhcml1QG1pY3JvY2hp cC5jb20+DQo+ICsNCj4gKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4NCj4gKyNpbmNsdWRlIDxsaW51 eC9pby5oPg0KPiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KPiArI2luY2x1ZGUgPGxpbnV4 L3NwaW5sb2NrLmg+DQo+ICsNCj4gKyNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPg0KPiArI2lu Y2x1ZGUgPHNvdW5kL2RtYWVuZ2luZV9wY20uaD4NCj4gKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFy YW1zLmg+DQo+ICsjaW5jbHVkZSA8c291bmQvc29jLmg+DQo+ICsNCj4gKy8qDQo+ICsgKiAtLS0t IFMvUERJRiBUcmFuc21pdHRlciBDb250cm9sbGVyIFJlZ2lzdGVyIG1hcCAtLS0tDQo+ICsgKi8N Cj4gKyNkZWZpbmUgU1BESUZUWF9DUgkJCTB4MDAJLyogQ29udHJvbCBSZWdpc3RlciAqLw0KPiAr I2RlZmluZSBTUERJRlRYX01SCQkJMHgwNAkvKiBNb2RlIFJlZ2lzdGVyICovDQoNClRoaXMgcmVn aXN0ZXIgaXMgcmVhZC93cml0ZSBlaXRoZXIgaW4gYXRvbWljIGFuZCBub24tYXRvbWljIGNvbnRl eHRlcyBidXQNCm5vdCBwcm90ZWN0ZWQgZXZlcnl3aGVyZSB0aGUgc2FtZSB3YXkuDQoNCj4gKyNk ZWZpbmUgU1BESUZUWF9DRFIJCQkweDBDCS8qIENvbW1vbiBEYXRhIFJlZ2lzdGVyICovDQo+ICsN Cj4gKyNkZWZpbmUgU1BESUZUWF9JRVIJCQkweDE0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0 ZXIgKi8NCj4gKyNkZWZpbmUgU1BESUZUWF9JRFIJCQkweDE4CS8qIEludGVycnVwdCBEaXNhYmxl IFJlZ2lzdGVyICovDQo+ICsjZGVmaW5lIFNQRElGVFhfSU1SCQkJMHgxQwkvKiBJbnRlcnJ1cHQg TWFzayBSZWdpc3RlciAqLw0KPiArI2RlZmluZSBTUERJRlRYX0lTUgkJCTB4MjAJLyogSW50ZXJy dXB0IFN0YXR1cyBSZWdpc3RlciAqLw0KPiArDQo+ICsjZGVmaW5lIFNQRElGVFhfQ0gxVUQocmVn KQkoMHg1MCArIChyZWcpICogNCkJLyogVXNlciBEYXRhIDEgUmVnaXN0ZXIgeCAqLw0KPiArI2Rl ZmluZSBTUERJRlRYX0NIMVMocmVnKQkoMHg4MCArIChyZWcpICogNCkJLyogQ2hhbm5lbCBTdGF0 dXMgMSBSZWdpc3RlciB4ICovDQo+ICsNCj4gKyNkZWZpbmUgU1BESUZUWF9WRVJTSU9OCQkJMHhG MA0KPiArDQo+ICsvKg0KPiArICogLS0tLSBDb250cm9sIFJlZ2lzdGVyIChXcml0ZS1vbmx5KSAt LS0tDQo+ICsgKi8NCj4gKyNkZWZpbmUgU1BESUZUWF9DUl9TV1JTVAkJQklUKDApCS8qIFNvZnR3 YXJlIFJlc2V0ICovDQo+ICsjZGVmaW5lIFNQRElGVFhfQ1JfRkNMUgkJCUJJVCgxKQkvKiBGSUZP IGNsZWFyICovDQo+ICsNCj4gKy8qDQo+ICsgKiAtLS0tIE1vZGUgUmVnaXN0ZXIgKFJlYWQvV3Jp dGUpIC0tLS0NCj4gKyAqLw0KPiArLyogVHJhbnNtaXQgRW5hYmxlICovDQo+ICsjZGVmaW5lIFNQ RElGVFhfTVJfVFhFTl9NQVNLCQlHRU5NQVNLKDAsIDApDQo+ICsjZGVmaW5lIFNQRElGVFhfTVJf VFhFTl9ESVNBQkxFCQkoMCA8PCAwKQ0KPiArI2RlZmluZSBTUERJRlRYX01SX1RYRU5fRU5BQkxF CQkoMSA8PCAwKQ0KPiArDQo+ICsvKiBNdWx0aWNoYW5uZWwgVHJhbnNmZXIgKi8NCj4gKyNkZWZp bmUgU1BESUZUWF9NUl9NVUxUSUNIX01BU0sJCUdFTkFNU0soMSwgMSkNCj4gKyNkZWZpbmUgU1BE SUZUWF9NUl9NVUxUSUNIX01PTk8JCSgwIDw8IDEpDQo+ICsjZGVmaW5lIFNQRElGVFhfTVJfTVVM VElDSF9EVUFMCQkoMSA8PCAxKQ0KPiArDQo+ICsvKiBEYXRhIFdvcmQgRW5kaWFuIE1vZGUgKi8N Cj4gKyNkZWZpbmUgU1BESUZUWF9NUl9FTkRJQU5fTUFTSwkJR0VOTUFTSygyLCAyKQ0KPiArI2Rl ZmluZSBTUERJRlRYX01SX0VORElBTl9MSVRUTEUJKDAgPDwgMikNCj4gKyNkZWZpbmUgU1BESUZU WF9NUl9FTkRJQU5fQklHCQkoMSA8PCAyKQ0KPiArDQo+ICsvKiBEYXRhIEp1c3RpZmljYXRpb24g Ki8NCj4gKyNkZWZpbmUgU1BESUZUWF9NUl9KVVNUSUZZX01BU0sJCUdFTk1BU0soMywgMykNCj4g KyNkZWZpbmUgU1BESUZUWF9NUl9KVVNUSUZZX0xTQgkJKDAgPDwgMykNCj4gKyNkZWZpbmUgU1BE SUZUWF9NUl9KVVNUSUZZX01TQgkJKDEgPDwgMykNCj4gKw0KPiArLyogQ29tbW9uIEF1ZGlvIFJl Z2lzdGVyIFRyYW5zZmVyIE1vZGUgKi8NCj4gKyNkZWZpbmUgU1BESUZUWF9NUl9DTU9ERV9NQVNL CQkJR0VOTUFTSyg1LCA0KQ0KPiArI2RlZmluZSBTUERJRlRYX01SX0NNT0RFX0lOREVYX0FDQ0VT UwkJKDAgPDwgNCkNCj4gKyNkZWZpbmUgU1BESUZUWF9NUl9DTU9ERV9UT0dHTEVfQUNDRVNTCQko MSA8PCA0KQ0KPiArI2RlZmluZSBTUERJRlRYX01SX0NNT0RFX0lOVEVSTFZEX0FDQ0VTUwkoMiA8 PCA0KQ0KPiArDQo+ICsvKiBWYWxpZCBCaXRzIHBlciBTYW1wbGUgKi8NCj4gKyNkZWZpbmUgU1BE SUZUWF9NUl9WQlBTX01BU0sJCUdFTk1BU0soMTMsIDgpDQo+ICsjZGVmaW5lIFNQRElGVFhfTVJf VkJQUyhicHMpCQkoKChicHMpIDw8IDgpICYgU1BESUZUWF9NUl9WQlBTX01BU0spDQo+ICsNCj4g Ky8qIENodW5rIFNpemUgKi8NCj4gKyNkZWZpbmUgU1BESUZUWF9NUl9DSFVOS19NQVNLCQlHRU5N QVNLKDE5LCAxNikNCj4gKyNkZWZpbmUgU1BESUZUWF9NUl9DSFVOSyhzaXplKQkJKCgoc2l6ZSkg PDwgMTYpICYgU1BESUZUWF9NUl9DSFVOS19NQVNLKQ0KPiArDQo+ICsvKiBWYWxpZGl0eSBCaXRz IGZvciBDaGFubmVscyAxIGFuZCAyICovDQo+ICsjZGVmaW5lIFNQRElGVFhfTVJfVkFMSUQxCQkJ QklUKDI0KQ0KPiArI2RlZmluZSBTUERJRlRYX01SX1ZBTElEMgkJCUJJVCgyNSkNCj4gKw0KPiAr LyogRGlzYWJsZSBOdWxsIEZyYW1lIG9uIHVuZGVycnJ1biAqLw0KPiArI2RlZmluZSBTUERJRlRY X01SX0RORlJfTUFTSwkJR0VOTUFTSygyNywgMjcpDQo+ICsjZGVmaW5lIFNQRElGVFhfTVJfRE5G Ul9JTlZBTElECQkoMCA8PCAyNykNCj4gKyNkZWZpbmUgU1BESUZUWF9NUl9ETkZSX1ZBTElECQko MSA8PCAyNykNCj4gKw0KPiArLyogQnl0ZXMgcGVyIFNhbXBsZSAqLw0KPiArI2RlZmluZSBTUERJ RlRYX01SX0JQU19NQVNLCQlHRU5NQVNLKDI5LCAyOCkNCj4gKyNkZWZpbmUgU1BESUZUWF9NUl9C UFMoYnl0ZXMpIFwNCj4gKwkoKCgoYnl0ZXMpIC0gMSkgPDwgMjgpICYgU1BESUZUWF9NUl9CUFNf TUFTSykNCj4gKw0KPiArLyoNCj4gKyAqIC0tLS0gSW50ZXJydXB0IEVuYWJsZS9EaXNhYmxlL01h c2svU3RhdHVzIFJlZ2lzdGVyIChXcml0ZS9SZWFkLW9ubHkpIC0tLS0NCj4gKyAqLw0KPiArI2Rl ZmluZSBTUERJRlRYX0lSX1RYUkRZCQlCSVQoMCkNCj4gKyNkZWZpbmUgU1BESUZUWF9JUl9UWEVN UFRZCQlCSVQoMSkNCj4gKyNkZWZpbmUgU1BESUZUWF9JUl9UWEZVTEwJCUJJVCgyKQ0KPiArI2Rl ZmluZSBTUERJRlRYX0lSX1RYQ0hVTksJCUJJVCgzKQ0KPiArI2RlZmluZSBTUERJRlRYX0lSX1RY VURSCQlCSVQoNCkNCj4gKyNkZWZpbmUgU1BESUZUWF9JUl9UWE9WUgkJQklUKDUpDQo+ICsjZGVm aW5lIFNQRElGVFhfSVJfQ1NSRFkJCUJJVCg2KQ0KPiArI2RlZmluZSBTUERJRlRYX0lSX1VEUkRZ CQlCSVQoNykNCj4gKyNkZWZpbmUgU1BESUZUWF9JUl9UWFJEWUNIKGNoKQkJQklUKChjaCkgKyA4 KQ0KPiArI2RlZmluZSBTUERJRlRYX0lSX1NFQ0UJCQlCSVQoMTApDQo+ICsjZGVmaW5lIFNQRElG VFhfSVJfVFhVRFJDSChjaCkJCUJJVCgoY2gpICsgMTEpDQo+ICsjZGVmaW5lIFNQRElGVFhfSVJf QkVORAkJCUJJVCgxMykNCj4gKw0KPiArc3RhdGljIGJvb2wgbWNocF9zcGRpZnR4X3JlYWRhYmxl X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpDQo+ICt7DQo+ICsJc3dp dGNoIChyZWcpIHsNCj4gKwljYXNlIFNQRElGVFhfTVI6DQo+ICsJY2FzZSBTUERJRlRYX0lNUjoN Cj4gKwljYXNlIFNQRElGVFhfSVNSOg0KPiArCWNhc2UgU1BESUZUWF9DSDFVRCgwKToNCj4gKwlj YXNlIFNQRElGVFhfQ0gxVUQoMSk6DQo+ICsJY2FzZSBTUERJRlRYX0NIMVVEKDIpOg0KPiArCWNh c2UgU1BESUZUWF9DSDFVRCgzKToNCj4gKwljYXNlIFNQRElGVFhfQ0gxVUQoNCk6DQo+ICsJY2Fz ZSBTUERJRlRYX0NIMVVEKDUpOg0KPiArCWNhc2UgU1BESUZUWF9DSDFTKDApOg0KPiArCWNhc2Ug U1BESUZUWF9DSDFTKDEpOg0KPiArCWNhc2UgU1BESUZUWF9DSDFTKDIpOg0KPiArCWNhc2UgU1BE SUZUWF9DSDFTKDMpOg0KPiArCWNhc2UgU1BESUZUWF9DSDFTKDQpOg0KPiArCWNhc2UgU1BESUZU WF9DSDFTKDUpOg0KPiArCQlyZXR1cm4gdHJ1ZTsNCj4gKwlkZWZhdWx0Og0KPiArCQlyZXR1cm4g ZmFsc2U7DQo+ICsJfQ0KPiArfQ0KPiArDQo+ICtzdGF0aWMgYm9vbCBtY2hwX3NwZGlmdHhfd3Jp dGVhYmxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpDQo+ICt7DQo+ ICsJc3dpdGNoIChyZWcpIHsNCj4gKwljYXNlIFNQRElGVFhfQ1I6DQo+ICsJY2FzZSBTUERJRlRY X01SOg0KPiArCWNhc2UgU1BESUZUWF9DRFI6DQo+ICsJY2FzZSBTUERJRlRYX0lFUjoNCj4gKwlj YXNlIFNQRElGVFhfSURSOg0KPiArCWNhc2UgU1BESUZUWF9DSDFVRCgwKToNCj4gKwljYXNlIFNQ RElGVFhfQ0gxVUQoMSk6DQo+ICsJY2FzZSBTUERJRlRYX0NIMVVEKDIpOg0KPiArCWNhc2UgU1BE SUZUWF9DSDFVRCgzKToNCj4gKwljYXNlIFNQRElGVFhfQ0gxVUQoNCk6DQo+ICsJY2FzZSBTUERJ RlRYX0NIMVVEKDUpOg0KPiArCWNhc2UgU1BESUZUWF9DSDFTKDApOg0KPiArCWNhc2UgU1BESUZU WF9DSDFTKDEpOg0KPiArCWNhc2UgU1BESUZUWF9DSDFTKDIpOg0KPiArCWNhc2UgU1BESUZUWF9D SDFTKDMpOg0KPiArCWNhc2UgU1BESUZUWF9DSDFTKDQpOg0KPiArCWNhc2UgU1BESUZUWF9DSDFT KDUpOg0KPiArCQlyZXR1cm4gdHJ1ZTsNCj4gKwlkZWZhdWx0Og0KPiArCQlyZXR1cm4gZmFsc2U7 DQo+ICsJfQ0KPiArfQ0KPiArDQo+ICtzdGF0aWMgYm9vbCBtY2hwX3NwZGlmdHhfcHJlY2lvdXNf cmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykNCj4gK3sNCj4gKwlzd2l0 Y2ggKHJlZykgew0KPiArCWNhc2UgU1BESUZUWF9DRFI6DQo+ICsJY2FzZSBTUERJRlRYX0lTUjoN Cj4gKwkJcmV0dXJuIHRydWU7DQo+ICsJZGVmYXVsdDoNCj4gKwkJcmV0dXJuIGZhbHNlOw0KPiAr CX0NCj4gK30NCj4gKw0KPiArc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIG1jaHBf c3BkaWZ0eF9yZWdtYXBfY29uZmlnID0gew0KPiArCS5yZWdfYml0cyA9IDMyLA0KPiArCS5yZWdf c3RyaWRlID0gNCwNCj4gKwkudmFsX2JpdHMgPSAzMiwNCj4gKwkubWF4X3JlZ2lzdGVyID0gU1BE SUZUWF9WRVJTSU9OLA0KPiArCS5yZWFkYWJsZV9yZWcgPSBtY2hwX3NwZGlmdHhfcmVhZGFibGVf cmVnLA0KPiArCS53cml0ZWFibGVfcmVnID0gbWNocF9zcGRpZnR4X3dyaXRlYWJsZV9yZWcsDQo+ ICsJLnByZWNpb3VzX3JlZyA9IG1jaHBfc3BkaWZ0eF9wcmVjaW91c19yZWcsDQo+ICt9Ow0KPiAr DQo+ICsjZGVmaW5lIFNQRElGVFhfR0NMS19SQVRJTwkxMjgNCj4gKw0KPiArI2RlZmluZSBTUERJ RlRYX0NTX0JJVFMJCTE5Mg0KPiArI2RlZmluZSBTUERJRlRYX1VEX0JJVFMJCTE5Mg0KPiArDQo+ ICtzdHJ1Y3QgbWNocF9zcGRpZnR4X21peGVyX2NvbnRyb2wgew0KPiArCXVuc2lnbmVkIGNoYXIJ CQkJY2hfc3RhdFtTUERJRlRYX0NTX0JJVFMgLyA4XTsNCj4gKwl1bnNpZ25lZCBjaGFyCQkJCXVz ZXJfZGF0YVtTUERJRlRYX1VEX0JJVFMgLyA4XTsNCj4gKwlzcGlubG9ja190CQkJCWxvY2s7DQo+ ICt9Ow0KPiArDQo+ICtzdHJ1Y3QgbWNocF9zcGRpZnR4X2RldiB7DQo+ICsJc3RydWN0IG1jaHBf c3BkaWZ0eF9taXhlcl9jb250cm9sCWNvbnRyb2w7DQo+ICsJc3RydWN0IHNuZF9kbWFlbmdpbmVf ZGFpX2RtYV9kYXRhCXBsYXliYWNrOw0KPiArCXN0cnVjdCBkZXZpY2UJCQkJKmRldjsNCj4gKwlz dHJ1Y3QgcmVnbWFwCQkJCSpyZWdtYXA7DQo+ICsJc3RydWN0IGNsawkJCQkqcGNsazsNCj4gKwlz dHJ1Y3QgY2xrCQkJCSpnY2xrOw0KPiArCXVuc2lnbmVkIGludAkJCQlmbXQ7DQo+ICsJY29uc3Qg c3RydWN0IG1jaHBfaTJzX2NhcHMJCSpjYXBzOw0KPiArCWludAkJCQkJZ2Nsa19lbmFibGVkOjE7 DQo+ICt9Ow0KPiArDQo+ICtzdGF0aWMgaW5saW5lIGludCBtY2hwX3NwZGlmdHhfaXNfcnVubmlu ZyhzdHJ1Y3QgbWNocF9zcGRpZnR4X2RldiAqZGV2KQ0KPiArew0KPiArCXUzMiBtcjsNCj4gKw0K PiArCXJlZ21hcF9yZWFkKGRldi0+cmVnbWFwLCBTUERJRlRYX01SLCAmbXIpOw0KPiArCXJldHVy biAhIShtciAmIFNQRElGVFhfTVJfVFhFTl9FTkFCTEUpOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMg dm9pZCBtY2hwX3NwZGlmdHhfY2hhbm5lbF9zdGF0dXNfd3JpdGUoc3RydWN0IG1jaHBfc3BkaWZ0 eF9kZXYgKmRldikNCj4gK3sNCj4gKwlzdHJ1Y3QgbWNocF9zcGRpZnR4X21peGVyX2NvbnRyb2wg KmN0cmwgPSAmZGV2LT5jb250cm9sOw0KPiArCXUzMiB2YWw7DQo+ICsJaW50IGk7DQo+ICsNCj4g Kwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjdHJsLT5jaF9zdGF0KSAvIDQ7IGkrKykgew0K PiArCQl2YWwgPSAoY3RybC0+Y2hfc3RhdFsoaSAqIDQpICsgMF0gPDwgMCkgfA0KPiArCQkgICAg ICAoY3RybC0+Y2hfc3RhdFsoaSAqIDQpICsgMV0gPDwgOCkgfA0KPiArCQkgICAgICAoY3RybC0+ Y2hfc3RhdFsoaSAqIDQpICsgMl0gPDwgMTYpIHwNCj4gKwkJICAgICAgKGN0cmwtPmNoX3N0YXRb KGkgKiA0KSArIDNdIDw8IDI0KTsNCj4gKw0KPiArCQlyZWdtYXBfd3JpdGUoZGV2LT5yZWdtYXAs IFNQRElGVFhfQ0gxUyhpKSwgdmFsKTsNCj4gKwl9DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyB2b2lk IG1jaHBfc3BkaWZ0eF91c2VyX2RhdGFfd3JpdGUoc3RydWN0IG1jaHBfc3BkaWZ0eF9kZXYgKmRl dikNCj4gK3sNCj4gKwlzdHJ1Y3QgbWNocF9zcGRpZnR4X21peGVyX2NvbnRyb2wgKmN0cmwgPSAm ZGV2LT5jb250cm9sOw0KPiArCXUzMiB2YWw7DQo+ICsJaW50IGk7DQo+ICsNCj4gKwlmb3IgKGkg PSAwOyBpIDwgQVJSQVlfU0laRShjdHJsLT51c2VyX2RhdGEpIC8gNDsgaSsrKSB7DQo+ICsJCXZh bCA9IChjdHJsLT51c2VyX2RhdGFbKGkgKiA0KSArIDBdIDw8IDApIHwNCj4gKwkJICAgICAgKGN0 cmwtPnVzZXJfZGF0YVsoaSAqIDQpICsgMV0gPDwgOCkgfA0KPiArCQkgICAgICAoY3RybC0+dXNl cl9kYXRhWyhpICogNCkgKyAyXSA8PCAxNikgfA0KPiArCQkgICAgICAoY3RybC0+dXNlcl9kYXRh WyhpICogNCkgKyAzXSA8PCAyNCk7DQo+ICsNCj4gKwkJcmVnbWFwX3dyaXRlKGRldi0+cmVnbWFw LCBTUERJRlRYX0NIMVVEKGkpLCB2YWwpOw0KPiArCX0NCj4gK30NCj4gKw0KPiArc3RhdGljIGly cXJldHVybl90IG1jaHBfc3BkaWZ0eF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQ0K PiArew0KPiArCXN0cnVjdCBtY2hwX3NwZGlmdHhfZGV2ICpkZXYgPSBkZXZfaWQ7DQo+ICsJc3Ry dWN0IG1jaHBfc3BkaWZ0eF9taXhlcl9jb250cm9sICpjdHJsID0gJmRldi0+Y29udHJvbDsNCj4g Kwl1MzIgc3IsIGltciwgcGVuZGluZywgaWRyID0gMDsNCj4gKw0KPiArCXJlZ21hcF9yZWFkKGRl di0+cmVnbWFwLCBTUERJRlRYX0lTUiwgJnNyKTsNCj4gKwlyZWdtYXBfcmVhZChkZXYtPnJlZ21h cCwgU1BESUZUWF9JTVIsICZpbXIpOw0KPiArCXBlbmRpbmcgPSBzciAmIGltcjsNCj4gKw0KPiAr CWlmICghcGVuZGluZykNCj4gKwkJcmV0dXJuIElSUV9OT05FOw0KPiArDQo+ICsJaWYgKHBlbmRp bmcgJiBTUERJRlRYX0lSX1RYVURSKSB7DQo+ICsJCWRldl93YXJuKGRldi0+ZGV2LCAidW5kZXJm bG93IGRldGVjdGVkXG4iKTsNCj4gKwkJaWRyIHw9IFNQRElGVFhfSVJfVFhVRFI7DQo+ICsJfQ0K PiArDQo+ICsJaWYgKHBlbmRpbmcgJiBTUERJRlRYX0lSX1RYT1ZSKSB7DQo+ICsJCWRldl93YXJu KGRldi0+ZGV2LCAib3ZlcmZsb3cgZGV0ZWN0ZWRcbiIpOw0KPiArCQlpZHIgfD0gU1BESUZUWF9J Ul9UWE9WUjsNCj4gKwl9DQo+ICsNCj4gKwlpZiAocGVuZGluZyAmIFNQRElGVFhfSVJfVURSRFkp IHsNCj4gKwkJc3Bpbl9sb2NrKCZjdHJsLT5sb2NrKTsNCj4gKwkJbWNocF9zcGRpZnR4X3VzZXJf ZGF0YV93cml0ZShkZXYpOw0KPiArCQlzcGluX3VubG9jaygmY3RybC0+bG9jayk7DQo+ICsJCWlk ciB8PSBTUERJRlRYX0lSX1VEUkRZOw0KPiArCX0NCj4gKw0KPiArCWlmIChwZW5kaW5nICYgU1BE SUZUWF9JUl9DU1JEWSkgew0KPiArCQlzcGluX2xvY2soJmN0cmwtPmxvY2spOw0KPiArCQltY2hw X3NwZGlmdHhfY2hhbm5lbF9zdGF0dXNfd3JpdGUoZGV2KTsNCj4gKwkJc3Bpbl91bmxvY2soJmN0 cmwtPmxvY2spOw0KPiArCQlpZHIgfD0gU1BESUZUWF9JUl9DU1JEWTsNCj4gKwl9DQo+ICsNCj4g KwlyZWdtYXBfd3JpdGUoZGV2LT5yZWdtYXAsIFNQRElGVFhfSURSLCBpZHIpOw0KPiArDQo+ICsJ cmV0dXJuIElSUV9IQU5ETEVEOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW50IG1jaHBfc3BkaWZ0 eF9kYWlfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwNCj4gKwkJ CQkgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpDQo+ICt7DQo+ICsJc3RydWN0IG1jaHBfc3Bk aWZ0eF9kZXYgKmRldiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7DQo+ICsJaW50IGVy cjsNCj4gKw0KPiArCWVyciA9IGNsa19wcmVwYXJlX2VuYWJsZShkZXYtPnBjbGspOw0KPiArCWlm IChlcnIpIHsNCj4gKwkJZGV2X2VycihkZXYtPmRldiwNCj4gKwkJCSJmYWlsZWQgdG8gZW5hYmxl IHRoZSBwZXJpcGhlcmFsIGNsb2NrOiAlZFxuIiwgZXJyKTsNCj4gKwkJcmV0dXJuIGVycjsNCj4g Kwl9DQo+ICsNCj4gKwkvKiBTb2Z0d2FyZSByZXNldCB0aGUgSVAgKi8NCj4gKwlyZWdtYXBfd3Jp dGUoZGV2LT5yZWdtYXAsIFNQRElGVFhfQ1IsDQo+ICsJCSAgICAgU1BESUZUWF9DUl9TV1JTVCB8 IFNQRElGVFhfQ1JfRkNMUik7DQo+ICsNCj4gKwlyZXR1cm4gMDsNCj4gK30NCj4gKw0KPiArc3Rh dGljIHZvaWQgbWNocF9zcGRpZnR4X2RhaV9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJl YW0gKnN1YnN0cmVhbSwNCj4gKwkJCQkgICAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkNCj4g K3sNCj4gKwlzdHJ1Y3QgbWNocF9zcGRpZnR4X2RldiAqZGV2ID0gc25kX3NvY19kYWlfZ2V0X2Ry dmRhdGEoZGFpKTsNCj4gKw0KPiArCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLw0KPiArCXJlZ21h cF93cml0ZShkZXYtPnJlZ21hcCwgU1BESUZUWF9JRFIsIDB4ZmZmZmZmZmYpOw0KPiArDQo+ICsJ Y2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRldi0+cGNsayk7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBp bnQgbWNocF9zcGRpZnR4X3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJl YW0sIGludCBjbWQsDQo+ICsJCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpDQo+ICt7DQo+ICsJ c3RydWN0IG1jaHBfc3BkaWZ0eF9kZXYgKmRldiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRh aSk7DQo+ICsJc3RydWN0IG1jaHBfc3BkaWZ0eF9taXhlcl9jb250cm9sICpjdHJsID0gJmRldi0+ Y29udHJvbDsNCj4gKwl1MzIgbXI7DQo+ICsJaW50IHJ1bm5pbmc7DQo+ICsJaW50IHJldDsNCj4g Kw0KPiArCS8qIGRvIG5vdCBzdGFydC9zdG9wIHdoaWxlIGNoYW5uZWwgc3RhdHVzIG9yIHVzZXIg ZGF0YSBpcyB1cGRhdGVkICovDQo+ICsJc3Bpbl9sb2NrKCZjdHJsLT5sb2NrKTsNCj4gKwlyZWdt YXBfcmVhZChkZXYtPnJlZ21hcCwgU1BESUZUWF9NUiwgJm1yKTsNCg0KSGVyZSwgYXRvbWljLCBm b3IgaW5zdGFuY2UuDQoNCj4gKwlydW5uaW5nID0gISEobXIgJiBTUERJRlRYX01SX1RYRU5fRU5B QkxFKTsNCj4gKw0KPiArCXN3aXRjaCAoY21kKSB7DQo+ICsJY2FzZSBTTkRSVl9QQ01fVFJJR0dF Ul9TVEFSVDoNCj4gKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToNCj4gKwljYXNlIFNO RFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6DQo+ICsJCWlmICghcnVubmluZykgew0KPiAr CQkJbXIgJj0gflNQRElGVFhfTVJfVFhFTl9NQVNLOw0KPiArCQkJbXIgfD0gU1BESUZUWF9NUl9U WEVOX0VOQUJMRTsNCj4gKwkJfQ0KPiArCQlicmVhazsNCj4gKwljYXNlIFNORFJWX1BDTV9UUklH R0VSX1NUT1A6DQo+ICsJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOg0KPiArCWNhc2Ug U05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoNCj4gKwkJaWYgKHJ1bm5pbmcpIHsNCj4gKwkJ CW1yICY9IH5TUERJRlRYX01SX1RYRU5fTUFTSzsNCj4gKwkJCW1yIHw9IFNQRElGVFhfTVJfVFhF Tl9ESVNBQkxFOw0KPiArCQl9DQo+ICsJCWJyZWFrOw0KPiArCWRlZmF1bHQ6DQo+ICsJCXNwaW5f dW5sb2NrKCZjdHJsLT5sb2NrKTsNCj4gKwkJcmV0dXJuIC1FSU5WQUw7DQo+ICsJfQ0KPiArDQo+ ICsJcmV0ID0gcmVnbWFwX3dyaXRlKGRldi0+cmVnbWFwLCBTUERJRlRYX01SLCBtcik7DQo+ICsJ c3Bpbl91bmxvY2soJmN0cmwtPmxvY2spOw0KPiArCWlmIChyZXQpIHsNCj4gKwkJZGV2X2Vycihk ZXYtPmRldiwgInVuYWJsZSB0byBkaXNhYmxlIFRYOiAlZFxuIiwgcmV0KTsNCj4gKwkJcmV0dXJu IHJldDsNCj4gKwl9DQo+ICsNCj4gKwlyZXR1cm4gMDsNCj4gK30NCj4gKw0KPiArc3RhdGljIGlu dCBtY2hwX3NwZGlmdHhfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3Ry ZWFtLA0KPiArCQkJCSAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsDQo+ICsJCQkJ ICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkNCj4gK3sNCj4gKwl1bnNpZ25lZCBsb25nIGZsYWdz Ow0KPiArCXN0cnVjdCBtY2hwX3NwZGlmdHhfZGV2ICpkZXYgPSBzbmRfc29jX2RhaV9nZXRfZHJ2 ZGF0YShkYWkpOw0KPiArCXN0cnVjdCBtY2hwX3NwZGlmdHhfbWl4ZXJfY29udHJvbCAqY3RybCA9 ICZkZXYtPmNvbnRyb2w7DQo+ICsJdTMyIG1yOw0KPiArCXVuc2lnbmVkIGludCBicHMgPSBwYXJh bXNfcGh5c2ljYWxfd2lkdGgocGFyYW1zKSAvIDg7DQo+ICsJaW50IHJldDsNCj4gKw0KPiArCWRl dl9kYmcoZGV2LT5kZXYsICIlcygpIHJhdGU9JXUgZm9ybWF0PSUjeCB3aWR0aD0ldSBjaGFubmVs cz0ldVxuIiwNCj4gKwkJX19mdW5jX18sIHBhcmFtc19yYXRlKHBhcmFtcyksIHBhcmFtc19mb3Jt YXQocGFyYW1zKSwNCj4gKwkJcGFyYW1zX3dpZHRoKHBhcmFtcyksIHBhcmFtc19jaGFubmVscyhw YXJhbXMpKTsNCj4gKw0KPiArCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RS RUFNX0NBUFRVUkUpIHsNCj4gKwkJZGV2X2VycihkZXYtPmRldiwgIkNhcHR1cmUgaXMgbm90IHN1 cHBvcnRlZFxuIik7DQo+ICsJCXJldHVybiAtRUlOVkFMOw0KPiArCX0NCj4gKw0KPiArCXJlZ21h cF9yZWFkKGRldi0+cmVnbWFwLCBTUERJRlRYX01SLCAmbXIpOw0KDQpIZXJlIG5vbi1hdG9taWMu DQoNCj4gKw0KPiArCWlmIChtciAmIFNQRElGVFhfTVJfVFhFTl9FTkFCTEUpIHsNCj4gKwkJZGV2 X2VycihkZXYtPmRldiwgIlBDTSBhbHJlYWR5IHJ1bm5pbmdcbiIpOw0KPiArCQlyZXR1cm4gLUVC VVNZOw0KPiArCX0NCj4gKw0KPiArCS8qIERlZmF1bHRzOiBUb2dnbGUgbW9kZSwganVzdGlmeSB0 byBMU0IsIGNodW5rc2l6ZSAxICovDQo+ICsJbXIgPSBTUERJRlRYX01SX0NNT0RFX1RPR0dMRV9B Q0NFU1MgfCBTUERJRlRYX01SX0pVU1RJRllfTFNCOw0KPiArCWRldi0+cGxheWJhY2subWF4YnVy c3QgPSAxOw0KPiArCXN3aXRjaCAocGFyYW1zX2NoYW5uZWxzKHBhcmFtcykpIHsNCj4gKwljYXNl IDE6DQo+ICsJCW1yIHw9IFNQRElGVFhfTVJfTVVMVElDSF9NT05POw0KPiArCQlicmVhazsNCj4g KwljYXNlIDI6DQo+ICsJCW1yIHw9IFNQRElGVFhfTVJfTVVMVElDSF9EVUFMOw0KPiArCQlpZiAo YnBzID4gMikNCj4gKwkJCWRldi0+cGxheWJhY2subWF4YnVyc3QgPSAyOw0KPiArCQlicmVhazsN Cj4gKwlkZWZhdWx0Og0KPiArCQlkZXZfZXJyKGRldi0+ZGV2LCAidW5zdXBwb3J0ZWQgbnVtYmVy IG9mIGNoYW5uZWxzOiAlZFxuIiwNCj4gKwkJCXBhcmFtc19jaGFubmVscyhwYXJhbXMpKTsNCj4g KwkJcmV0dXJuIC1FSU5WQUw7DQo+ICsJfQ0KPiArCW1yIHw9IFNQRElGVFhfTVJfQ0hVTksoZGV2 LT5wbGF5YmFjay5tYXhidXJzdCk7DQo+ICsNCj4gKwlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFy YW1zKSkgew0KPiArCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TODoNCj4gKwkJbXIgfD0gU1BESUZU WF9NUl9WQlBTKDgpOw0KPiArCQlicmVhazsNCj4gKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2 X0JFOg0KPiArCQltciB8PSBTUERJRlRYX01SX0VORElBTl9CSUc7DQo+ICsJCWZhbGx0aHJvdWdo Ow0KPiArCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6DQo+ICsJCW1yIHw9IFNQRElGVFhf TVJfVkJQUygxNik7DQo+ICsJCWJyZWFrOw0KPiArCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMThf M0JFOg0KPiArCQltciB8PSBTUERJRlRYX01SX0VORElBTl9CSUc7DQo+ICsJCWZhbGx0aHJvdWdo Ow0KPiArCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMThfM0xFOg0KPiArCQltciB8PSBTUERJRlRY X01SX1ZCUFMoMTgpOw0KPiArCQlicmVhazsNCj4gKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIw XzNCRToNCj4gKwkJbXIgfD0gU1BESUZUWF9NUl9FTkRJQU5fQklHOw0KPiArCQlmYWxsdGhyb3Vn aDsNCj4gKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIwXzNMRToNCj4gKwkJbXIgfD0gU1BESUZU WF9NUl9WQlBTKDIwKTsNCj4gKwkJYnJlYWs7DQo+ICsJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1My NF8zQkU6DQo+ICsJCW1yIHw9IFNQRElGVFhfTVJfRU5ESUFOX0JJRzsNCj4gKwkJZmFsbHRocm91 Z2g7DQo+ICsJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6DQo+ICsJCW1yIHw9IFNQRElG VFhfTVJfVkJQUygyNCk7DQo+ICsJCWJyZWFrOw0KPiArCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9T MjRfQkU6DQo+ICsJCW1yIHw9IFNQRElGVFhfTVJfRU5ESUFOX0JJRzsNCj4gKwkJZmFsbHRocm91 Z2g7DQo+ICsJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToNCj4gKwkJbXIgfD0gU1BESUZU WF9NUl9WQlBTKDI0KTsNCj4gKwkJYnJlYWs7DQo+ICsJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1Mz Ml9CRToNCj4gKwkJbXIgfD0gU1BESUZUWF9NUl9FTkRJQU5fQklHOw0KPiArCQlmYWxsdGhyb3Vn aDsNCj4gKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOg0KPiArCQltciB8PSBTUERJRlRY X01SX1ZCUFMoMzIpOw0KPiArCQlicmVhazsNCj4gKwlkZWZhdWx0Og0KPiArCQlkZXZfZXJyKGRl di0+ZGV2LCAidW5zdXBwb3J0ZWQgUENNIGZvcm1hdDogJWRcbiIsDQo+ICsJCQlwYXJhbXNfZm9y bWF0KHBhcmFtcykpOw0KPiArCQlyZXR1cm4gLUVJTlZBTDsNCj4gKwl9DQo+ICsNCj4gKwltciB8 PSBTUERJRlRYX01SX0JQUyhicHMpOw0KPiArDQo+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJmN0cmwt PmxvY2ssIGZsYWdzKTsNCj4gKwljdHJsLT5jaF9zdGF0WzNdICY9IH5JRUM5NThfQUVTM19DT05f RlM7DQo+ICsJc3dpdGNoIChwYXJhbXNfcmF0ZShwYXJhbXMpKSB7DQo+ICsJY2FzZSAyMjA1MDoN Cj4gKwkJY3RybC0+Y2hfc3RhdFszXSB8PSBJRUM5NThfQUVTM19DT05fRlNfMjIwNTA7DQo+ICsJ CWJyZWFrOw0KPiArCWNhc2UgMjQwMDA6DQo+ICsJCWN0cmwtPmNoX3N0YXRbM10gfD0gSUVDOTU4 X0FFUzNfQ09OX0ZTXzI0MDAwOw0KPiArCQlicmVhazsNCj4gKwljYXNlIDMyMDAwOg0KPiArCQlj dHJsLT5jaF9zdGF0WzNdIHw9IElFQzk1OF9BRVMzX0NPTl9GU18zMjAwMDsNCj4gKwkJYnJlYWs7 DQo+ICsJY2FzZSA0NDEwMDoNCj4gKwkJY3RybC0+Y2hfc3RhdFszXSB8PSBJRUM5NThfQUVTM19D T05fRlNfNDQxMDA7DQo+ICsJCWJyZWFrOw0KPiArCWNhc2UgNDgwMDA6DQo+ICsJCWN0cmwtPmNo X3N0YXRbM10gfD0gSUVDOTU4X0FFUzNfQ09OX0ZTXzQ4MDAwOw0KPiArCQlicmVhazsNCj4gKwlj YXNlIDg4MjAwOg0KPiArCQljdHJsLT5jaF9zdGF0WzNdIHw9IElFQzk1OF9BRVMzX0NPTl9GU184 ODIwMDsNCj4gKwkJYnJlYWs7DQo+ICsJY2FzZSA5NjAwMDoNCj4gKwkJY3RybC0+Y2hfc3RhdFsz XSB8PSBJRUM5NThfQUVTM19DT05fRlNfOTYwMDA7DQo+ICsJCWJyZWFrOw0KPiArCWNhc2UgMTc2 NDAwOg0KPiArCQljdHJsLT5jaF9zdGF0WzNdIHw9IElFQzk1OF9BRVMzX0NPTl9GU18xNzY0MDA7 DQo+ICsJCWJyZWFrOw0KPiArCWNhc2UgMTkyMDAwOg0KPiArCQljdHJsLT5jaF9zdGF0WzNdIHw9 IElFQzk1OF9BRVMzX0NPTl9GU18xOTIwMDA7DQo+ICsJCWJyZWFrOw0KPiArCWNhc2UgODAwMDoN Cj4gKwljYXNlIDExMDI1Og0KPiArCWNhc2UgMTYwMDA6DQo+ICsJY2FzZSA2NDAwMDoNCj4gKwkJ Y3RybC0+Y2hfc3RhdFszXSB8PSBJRUM5NThfQUVTM19DT05fRlNfTk9USUQ7DQo+ICsJCWJyZWFr Ow0KPiArCWRlZmF1bHQ6DQo+ICsJCWRldl9lcnIoZGV2LT5kZXYsICJ1bnN1cHBvcnRlZCBzYW1w bGUgZnJlcXVlbmN5OiAldVxuIiwNCj4gKwkJCXBhcmFtc19yYXRlKHBhcmFtcykpOw0KPiArCQlz cGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHJsLT5sb2NrLCBmbGFncyk7DQo+ICsJCXJldHVybiAt RUlOVkFMOw0KPiArCX0NCj4gKwltY2hwX3NwZGlmdHhfY2hhbm5lbF9zdGF0dXNfd3JpdGUoZGV2 KTsNCj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHJsLT5sb2NrLCBmbGFncyk7DQo+ICsJ bXIgfD0gU1BESUZUWF9NUl9WQUxJRDEgfCBTUERJRlRYX01SX1ZBTElEMjsNCj4gKw0KPiArCWlm IChkZXYtPmdjbGtfZW5hYmxlZCkgew0KPiArCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZGV2LT5n Y2xrKTsNCj4gKwkJZGV2LT5nY2xrX2VuYWJsZWQgPSAwOw0KPiArCX0NCj4gKwlyZXQgPSBjbGtf c2V0X3JhdGUoZGV2LT5nY2xrLCBwYXJhbXNfcmF0ZShwYXJhbXMpICoNCj4gKwkJCQkgICAgICBT UERJRlRYX0dDTEtfUkFUSU8pOw0KPiArCWlmIChyZXQpIHsNCj4gKwkJZGV2X2VycihkZXYtPmRl diwNCj4gKwkJCSJ1bmFibGUgdG8gY2hhbmdlIGdjbGsgcmF0ZSB0bzogcmF0ZSAldSAqIHJhdGlv ICV1XG4iLA0KPiArCQkJcGFyYW1zX3JhdGUocGFyYW1zKSwgU1BESUZUWF9HQ0xLX1JBVElPKTsN Cj4gKwkJcmV0dXJuIHJldDsNCj4gKwl9DQo+ICsJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRl di0+Z2Nsayk7DQo+ICsJaWYgKHJldCkgew0KPiArCQlkZXZfZXJyKGRldi0+ZGV2LCAidW5hYmxl IHRvIGVuYWJsZSBnY2xrOiAlZFxuIiwgcmV0KTsNCj4gKwkJcmV0dXJuIHJldDsNCj4gKwl9DQo+ ICsJZGV2LT5nY2xrX2VuYWJsZWQgPSAxOw0KPiArCWRldl9kYmcoZGV2LT5kZXYsICIlcygpOiBH Q0xLIHNldCB0byAlZFxuIiwgX19mdW5jX18sDQo+ICsJCXBhcmFtc19yYXRlKHBhcmFtcykgKiBT UERJRlRYX0dDTEtfUkFUSU8pOw0KPiArDQo+ICsJLyogRW5hYmxlIGludGVycnVwdHMgKi8NCj4g KwlyZWdtYXBfd3JpdGUoZGV2LT5yZWdtYXAsIFNQRElGVFhfSUVSLA0KPiArCQkgICAgIFNQRElG VFhfSVJfVFhVRFIgfCBTUERJRlRYX0lSX1RYT1ZSKTsNCj4gKw0KPiArCXJlZ21hcF93cml0ZShk ZXYtPnJlZ21hcCwgU1BESUZUWF9NUiwgbXIpOw0KDQpTYW1lIGhlcmUuDQoNCj4gKw0KPiArCXJl dHVybiAwOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW50IG1jaHBfc3BkaWZ0eF9od19mcmVlKHN0 cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLA0KPiArCQkJCXN0cnVjdCBzbmRfc29j X2RhaSAqZGFpKQ0KPiArew0KPiArCXN0cnVjdCBtY2hwX3NwZGlmdHhfZGV2ICpkZXYgPSBzbmRf c29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOw0KPiArDQo+ICsJcmVnbWFwX3dyaXRlKGRldi0+cmVn bWFwLCBTUERJRlRYX0lEUiwNCj4gKwkJICAgICBTUERJRlRYX0lSX1RYVURSIHwgU1BESUZUWF9J Ul9UWE9WUik7DQo+ICsJaWYgKGRldi0+Z2Nsa19lbmFibGVkKSB7DQo+ICsJCWNsa19kaXNhYmxl X3VucHJlcGFyZShkZXYtPmdjbGspOw0KPiArCQlkZXYtPmdjbGtfZW5hYmxlZCA9IDA7DQo+ICsJ fQ0KPiArDQo+ICsJcmV0dXJuIHJlZ21hcF93cml0ZShkZXYtPnJlZ21hcCwgU1BESUZUWF9DUiwN Cj4gKwkJCSAgICBTUERJRlRYX0NSX1NXUlNUIHwgU1BESUZUWF9DUl9GQ0xSKTsNCj4gK30NCj4g Kw0KPiArDQo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBtY2hwX3NwZGlm dHhfZGFpX29wcyA9IHsNCj4gKwkuc3RhcnR1cAk9IG1jaHBfc3BkaWZ0eF9kYWlfc3RhcnR1cCwN Cj4gKwkuc2h1dGRvd24JPSBtY2hwX3NwZGlmdHhfZGFpX3NodXRkb3duLA0KPiArCS50cmlnZ2Vy CT0gbWNocF9zcGRpZnR4X3RyaWdnZXIsDQo+ICsJLmh3X3BhcmFtcwk9IG1jaHBfc3BkaWZ0eF9o d19wYXJhbXMsDQo+ICsJLmh3X2ZyZWUJPSBtY2hwX3NwZGlmdHhfaHdfZnJlZSwNCj4gK307DQo+ ICsNCj4gKyNkZWZpbmUgTUNIUF9TUERJRlRYX1JBVEVTCVNORFJWX1BDTV9SQVRFXzgwMDBfMTky MDAwDQo+ICsNCj4gKyNkZWZpbmUgTUNIUF9TUERJRlRYX0ZPUk1BVFMJKFNORFJWX1BDTV9GTVRC SVRfUzggfAkJXA0KPiArCQkJCSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CVwNCj4gKwkJCQkg U05EUlZfUENNX0ZNVEJJVF9VMTZfQkUgfAlcDQo+ICsJCQkJIFNORFJWX1BDTV9GTVRCSVRfUzE4 XzNMRSB8CVwNCj4gKwkJCQkgU05EUlZfUENNX0ZNVEJJVF9TMThfM0JFIHwJXA0KPiArCQkJCSBT TkRSVl9QQ01fRk1UQklUX1MyMF8zTEUgfAlcDQo+ICsJCQkJIFNORFJWX1BDTV9GTVRCSVRfUzIw XzNCRSB8CVwNCj4gKwkJCQkgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwJXA0KPiArCQkJCSBT TkRSVl9QQ01fRk1UQklUX1MyNF8zQkUgfAlcDQo+ICsJCQkJIFNORFJWX1BDTV9GTVRCSVRfUzI0 X0xFIHwJXA0KPiArCQkJCSBTTkRSVl9QQ01fRk1UQklUX1MyNF9CRSB8CVwNCj4gKwkJCQkgU05E UlZfUENNX0ZNVEJJVF9TMzJfTEUgfAlcDQo+ICsJCQkJIFNORFJWX1BDTV9GTVRCSVRfUzMyX0JF CVwNCj4gKwkJCQkgKQ0KPiArDQo+ICtzdGF0aWMgaW50IG1jaHBfc3BkaWZ0eF9pbmZvKHN0cnVj dCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLA0KPiArCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVt X2luZm8gKnVpbmZvKQ0KPiArew0KPiArCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQ RV9JRUM5NTg7DQo+ICsJdWluZm8tPmNvdW50ID0gMTsNCj4gKw0KPiArCXJldHVybiAwOw0KPiAr fQ0KPiArDQo+ICtzdGF0aWMgaW50IG1jaHBfc3BkaWZ0eF9jc19nZXQoc3RydWN0IHNuZF9rY29u dHJvbCAqa2NvbnRyb2wsDQo+ICsJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAq dXZhbHVlKQ0KPiArew0KPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7DQo+ICsJc3RydWN0IHNuZF9z b2NfZGFpICpkYWkgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7DQo+ICsJc3RydWN0IG1j aHBfc3BkaWZ0eF9kZXYgKmRldiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7DQo+ICsJ c3RydWN0IG1jaHBfc3BkaWZ0eF9taXhlcl9jb250cm9sICpjdHJsID0gJmRldi0+Y29udHJvbDsN Cj4gKw0KPiArCXNwaW5fbG9ja19pcnFzYXZlKCZjdHJsLT5sb2NrLCBmbGFncyk7DQo+ICsJbWVt Y3B5KHV2YWx1ZS0+dmFsdWUuaWVjOTU4LnN0YXR1cywgY3RybC0+Y2hfc3RhdCwNCj4gKwkgICAg ICAgc2l6ZW9mKGN0cmwtPmNoX3N0YXQpKTsNCj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZj dHJsLT5sb2NrLCBmbGFncyk7DQo+ICsNCj4gKwlyZXR1cm4gMDsNCj4gK30NCj4gKw0KPiArc3Rh dGljIGludCBtY2hwX3NwZGlmdHhfY3NfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9s LA0KPiArCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnV2YWx1ZSkNCj4gK3sN Cj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOw0KPiArCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpID0g c25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOw0KPiArCXN0cnVjdCBtY2hwX3NwZGlmdHhfZGV2 ICpkZXYgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOw0KPiArCXN0cnVjdCBtY2hwX3Nw ZGlmdHhfbWl4ZXJfY29udHJvbCAqY3RybCA9ICZkZXYtPmNvbnRyb2w7DQo+ICsJaW50IGNoYW5n ZWQgPSAwOw0KPiArCWludCBpOw0KPiArDQo+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJmN0cmwtPmxv Y2ssIGZsYWdzKTsNCj4gKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjdHJsLT5jaF9zdGF0 KTsgaSsrKSB7DQo+ICsJCWlmIChjdHJsLT5jaF9zdGF0W2ldICE9IHV2YWx1ZS0+dmFsdWUuaWVj OTU4LnN0YXR1c1tpXSkNCj4gKwkJCWNoYW5nZWQgPSAxOw0KPiArCQljdHJsLT5jaF9zdGF0W2ld ID0gdXZhbHVlLT52YWx1ZS5pZWM5NTguc3RhdHVzW2ldOw0KPiArCX0NCj4gKw0KPiArCWlmIChj aGFuZ2VkKSB7DQo+ICsJCS8qIGRvbid0IGVuYWJsZSBJUCB3aGlsZSB3ZSBjb3B5IHRoZSBjaGFu bmVsIHN0YXR1cyAqLw0KPiArCQlpZiAobWNocF9zcGRpZnR4X2lzX3J1bm5pbmcoZGV2KSkgew0K PiArCQkJLyoNCj4gKwkJCSAqIGlmIFNQRElGIGlzIHJ1bm5pbmcsIHdhaXQgZm9yIGludGVycnVw dCB0byB3cml0ZQ0KPiArCQkJICogY2hhbm5lbCBzdGF0dXMNCj4gKwkJCSAqLw0KPiArCQkJcmVn bWFwX3dyaXRlKGRldi0+cmVnbWFwLCBTUERJRlRYX0lFUiwNCj4gKwkJCQkgICAgIFNQRElGVFhf SVJfQ1NSRFkpOw0KPiArCQl9IGVsc2Ugew0KPiArCQkJbWNocF9zcGRpZnR4X2NoYW5uZWxfc3Rh dHVzX3dyaXRlKGRldik7DQo+ICsJCX0NCj4gKwl9DQo+ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmY3RybC0+bG9jaywgZmxhZ3MpOw0KPiArDQo+ICsJcmV0dXJuIGNoYW5nZWQ7DQo+ICt9DQo+ ICsNCj4gK3N0YXRpYyBpbnQgbWNocF9zcGRpZnR4X2NzX21hc2soc3RydWN0IHNuZF9rY29udHJv bCAqa2NvbnRyb2wsDQo+ICsJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdXZhbHVlKQ0K PiArew0KPiArCW1lbXNldCh1dmFsdWUtPnZhbHVlLmllYzk1OC5zdGF0dXMsIDB4ZmYsDQo+ICsJ ICAgICAgIHNpemVvZih1dmFsdWUtPnZhbHVlLmllYzk1OC5zdGF0dXMpKTsNCj4gKw0KPiArCXJl dHVybiAwOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW50IG1jaHBfc3BkaWZ0eF9zdWJjb2RlX2dl dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwNCj4gKwkJCQkgICAgc3RydWN0IHNuZF9j dGxfZWxlbV92YWx1ZSAqdXZhbHVlKQ0KPiArew0KPiArCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFp ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOw0KPiArCXN0cnVjdCBtY2hwX3NwZGlmdHhf ZGV2ICpkZXYgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOw0KPiArCXN0cnVjdCBtY2hw X3NwZGlmdHhfbWl4ZXJfY29udHJvbCAqY3RybCA9ICZkZXYtPmNvbnRyb2w7DQo+ICsJdW5zaWdu ZWQgbG9uZyBmbGFnczsNCj4gKw0KPiArCXNwaW5fbG9ja19pcnFzYXZlKCZjdHJsLT5sb2NrLCBm bGFncyk7DQo+ICsJbWVtY3B5KHV2YWx1ZS0+dmFsdWUuaWVjOTU4LnN1YmNvZGUsIGN0cmwtPnVz ZXJfZGF0YSwNCj4gKwkgICAgICAgc2l6ZW9mKGN0cmwtPnVzZXJfZGF0YSkpOw0KPiArCXNwaW5f dW5sb2NrX2lycXJlc3RvcmUoJmN0cmwtPmxvY2ssIGZsYWdzKTsNCj4gKw0KPiArCXJldHVybiAw Ow0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW50IG1jaHBfc3BkaWZ0eF9zdWJjb2RlX3B1dChzdHJ1 Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwNCj4gKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxl bV92YWx1ZSAqdXZhbHVlKQ0KPiArew0KPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7DQo+ICsJc3Ry dWN0IHNuZF9zb2NfZGFpICpkYWkgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7DQo+ICsJ c3RydWN0IG1jaHBfc3BkaWZ0eF9kZXYgKmRldiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRh aSk7DQo+ICsJc3RydWN0IG1jaHBfc3BkaWZ0eF9taXhlcl9jb250cm9sICpjdHJsID0gJmRldi0+ Y29udHJvbDsNCj4gKwlpbnQgY2hhbmdlZCA9IDA7DQo+ICsJaW50IGk7DQo+ICsNCj4gKwlzcGlu X2xvY2tfaXJxc2F2ZSgmY3RybC0+bG9jaywgZmxhZ3MpOw0KPiArCWZvciAoaSA9IDA7IGkgPCBB UlJBWV9TSVpFKGN0cmwtPnVzZXJfZGF0YSk7IGkrKykgew0KPiArCQlpZiAoY3RybC0+dXNlcl9k YXRhW2ldICE9IHV2YWx1ZS0+dmFsdWUuaWVjOTU4LnN1YmNvZGVbaV0pDQo+ICsJCQljaGFuZ2Vk ID0gMTsNCj4gKw0KPiArCQljdHJsLT51c2VyX2RhdGFbaV0gPSB1dmFsdWUtPnZhbHVlLmllYzk1 OC5zdWJjb2RlW2ldOw0KPiArCX0NCj4gKwlpZiAoY2hhbmdlZCkgew0KPiArCQlpZiAobWNocF9z cGRpZnR4X2lzX3J1bm5pbmcoZGV2KSkgew0KPiArCQkJLyoNCj4gKwkJCSAqIGlmIFNQRElGIGlz IHJ1bm5pbmcsIHdhaXQgZm9yIGludGVycnVwdCB0byB3cml0ZQ0KPiArCQkJICogdXNlciBkYXRh DQo+ICsJCQkgKi8NCj4gKwkJCXJlZ21hcF93cml0ZShkZXYtPnJlZ21hcCwgU1BESUZUWF9JRVIs DQo+ICsJCQkJICAgICBTUERJRlRYX0lSX1VEUkRZKTsNCj4gKwkJfSBlbHNlIHsNCj4gKwkJCW1j aHBfc3BkaWZ0eF91c2VyX2RhdGFfd3JpdGUoZGV2KTsNCj4gKwkJfQ0KPiArCX0NCj4gKwlzcGlu X3VubG9ja19pcnFyZXN0b3JlKCZjdHJsLT5sb2NrLCBmbGFncyk7DQo+ICsNCj4gKwlyZXR1cm4g Y2hhbmdlZDsNCj4gK30NCj4gKw0KPiArc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1j aHBfc3BkaWZ0eF9jdHJsc1tdID0gew0KPiArCS8qIENoYW5uZWwgc3RhdHVzIGNvbnRyb2xsZXIg Ki8NCj4gKwl7DQo+ICsJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwNCj4gKwkJ Lm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsIFBMQVlCQUNLLCBERUZBVUxUKSwNCj4g KwkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfA0KPiArCQkJU05E UlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLA0KPiArCQkuaW5mbyA9IG1jaHBfc3BkaWZ0eF9p bmZvLA0KPiArCQkuZ2V0ID0gbWNocF9zcGRpZnR4X2NzX2dldCwNCj4gKwkJLnB1dCA9IG1jaHBf c3BkaWZ0eF9jc19wdXQsDQo+ICsJfSwNCj4gKwl7DQo+ICsJCS5pZmFjZSA9IFNORFJWX0NUTF9F TEVNX0lGQUNFX1BDTSwNCj4gKwkJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsIFBM QVlCQUNLLCBNQVNLKSwNCj4gKwkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFE LA0KPiArCQkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLA0KPiArCQkuaW5mbyA9IG1j aHBfc3BkaWZ0eF9pbmZvLA0KPiArCQkuZ2V0ID0gbWNocF9zcGRpZnR4X2NzX21hc2ssDQo+ICsJ fSwNCj4gKwkvKiBVc2VyIGJpdHMgY29udHJvbGxlciAqLw0KPiArCXsNCj4gKwkJLmlmYWNlID0g U05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLA0KPiArCQkubmFtZSA9ICJJRUM5NTggU3ViY29kZSBQ bGF5YmFjayBEZWZhdWx0IiwNCj4gKwkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19S RUFEV1JJVEUsDQo+ICsJCS5pbmZvID0gbWNocF9zcGRpZnR4X2luZm8sDQo+ICsJCS5nZXQgPSBt Y2hwX3NwZGlmdHhfc3ViY29kZV9nZXQsDQo+ICsJCS5wdXQgPSBtY2hwX3NwZGlmdHhfc3ViY29k ZV9wdXQsDQo+ICsJfSwNCj4gK307DQo+ICsNCj4gK3N0YXRpYyBpbnQgbWNocF9zcGRpZnR4X2Rh aV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkNCj4gK3sNCj4gKwlzdHJ1Y3QgbWNocF9z cGRpZnR4X2RldiAqZGV2ID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsNCj4gKw0KPiAr CXNuZF9zb2NfZGFpX2luaXRfZG1hX2RhdGEoZGFpLCAmZGV2LT5wbGF5YmFjaywgTlVMTCk7DQo+ ICsNCj4gKwkvKiBBZGQgY29udHJvbHMgKi8NCj4gKwlzbmRfc29jX2FkZF9kYWlfY29udHJvbHMo ZGFpLCBtY2hwX3NwZGlmdHhfY3RybHMsDQo+ICsJCQkJIEFSUkFZX1NJWkUobWNocF9zcGRpZnR4 X2N0cmxzKSk7DQo+ICsNCj4gKwlyZXR1cm4gMDsNCj4gK30NCj4gKw0KPiArc3RhdGljIHN0cnVj dCBzbmRfc29jX2RhaV9kcml2ZXIgbWNocF9zcGRpZnR4X2RhaSA9IHsNCj4gKwkubmFtZSA9ICJt Y2hwLXNwZGlmdHgiLA0KPiArCS5wcm9iZQk9IG1jaHBfc3BkaWZ0eF9kYWlfcHJvYmUsDQo+ICsJ LnBsYXliYWNrID0gew0KPiArCQkuc3RyZWFtX25hbWUgPSAiUy9QRElGIFRYIFBsYXliYWNrIiwN Cj4gKwkJLmNoYW5uZWxzX21pbiA9IDEsDQo+ICsJCS5jaGFubmVsc19tYXggPSAyLA0KPiArCQku cmF0ZXMgPSBNQ0hQX1NQRElGVFhfUkFURVMsDQo+ICsJCS5mb3JtYXRzID0gTUNIUF9TUERJRlRY X0ZPUk1BVFMsDQo+ICsJfSwNCj4gKwkub3BzID0gJm1jaHBfc3BkaWZ0eF9kYWlfb3BzLA0KPiAr fTsNCj4gKw0KPiArc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIg bWNocF9zcGRpZnR4X2NvbXBvbmVudCA9IHsNCj4gKwkubmFtZQkJPSAibWNocC1zcGRpZnR4IiwN Cj4gK307DQo+ICsNCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1jaHBfc3Bk aWZ0eF9kdF9pZHNbXSA9IHsNCj4gKwl7DQo+ICsJCS5jb21wYXRpYmxlID0gIm1pY3JvY2hpcCxz YW1hN2c1LXNwZGlmdHgiLA0KPiArCX0sDQo+ICsJeyAvKiBzZW50aW5lbCAqLyB9DQo+ICt9Ow0K PiArDQo+ICtNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtY2hwX3NwZGlmdHhfZHRfaWRzKTsNCj4g K3N0YXRpYyBpbnQgbWNocF9zcGRpZnR4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk ZXYpDQo+ICt7DQo+ICsJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2Rl Ow0KPiArCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOw0KPiArCXN0cnVjdCBtY2hw X3NwZGlmdHhfZGV2ICpkZXY7DQo+ICsJc3RydWN0IHJlc291cmNlICptZW07DQo+ICsJc3RydWN0 IHJlZ21hcCAqcmVnbWFwOw0KPiArCXZvaWQgX19pb21lbSAqYmFzZTsNCj4gKwlzdHJ1Y3QgbWNo cF9zcGRpZnR4X21peGVyX2NvbnRyb2wgKmN0cmw7DQo+ICsJaW50IGlycTsNCj4gKwlpbnQgZXJy Ow0KPiArDQo+ICsJLyogR2V0IG1lbW9yeSBmb3IgZHJpdmVyIGRhdGEuICovDQo+ICsJZGV2ID0g ZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7DQo+ICsJ aWYgKCFkZXYpDQo+ICsJCXJldHVybiAtRU5PTUVNOw0KPiArDQo+ICsJLyogR2V0IGhhcmR3YXJl IGNhcGFiaWxpdGllcy4gKi8NCj4gKwltYXRjaCA9IG9mX21hdGNoX25vZGUobWNocF9zcGRpZnR4 X2R0X2lkcywgbnApOw0KPiArCWlmIChtYXRjaCkNCj4gKwkJZGV2LT5jYXBzID0gbWF0Y2gtPmRh dGE7DQo+ICsNCj4gKwkvKiBNYXAgSS9PIHJlZ2lzdGVycy4gKi8NCj4gKwliYXNlID0gZGV2bV9w bGF0Zm9ybV9nZXRfYW5kX2lvcmVtYXBfcmVzb3VyY2UocGRldiwgMCwgJm1lbSk7DQo+ICsJaWYg KElTX0VSUihiYXNlKSkNCj4gKwkJcmV0dXJuIFBUUl9FUlIoYmFzZSk7DQo+ICsNCj4gKwlyZWdt YXAgPSBkZXZtX3JlZ21hcF9pbml0X21taW8oJnBkZXYtPmRldiwgYmFzZSwNCj4gKwkJCQkgICAg ICAgJm1jaHBfc3BkaWZ0eF9yZWdtYXBfY29uZmlnKTsNCj4gKwlpZiAoSVNfRVJSKHJlZ21hcCkp DQo+ICsJCXJldHVybiBQVFJfRVJSKHJlZ21hcCk7DQo+ICsNCj4gKwkvKiBSZXF1ZXN0IElSUSAq Lw0KPiArCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7DQo+ICsJaWYgKGlycSA8IDAp DQo+ICsJCXJldHVybiBpcnE7DQo+ICsNCj4gKwllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2 LT5kZXYsIGlycSwgbWNocF9zcGRpZnR4X2ludGVycnVwdCwgMCwNCj4gKwkJCSAgICAgICBkZXZf bmFtZSgmcGRldi0+ZGV2KSwgZGV2KTsNCj4gKwlpZiAoZXJyKQ0KPiArCQlyZXR1cm4gZXJyOw0K PiArDQo+ICsJLyogR2V0IHRoZSBwZXJpcGhlcmFsIGNsb2NrICovDQo+ICsJZGV2LT5wY2xrID0g ZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJwY2xrIik7DQo+ICsJaWYgKElTX0VSUihkZXYtPnBj bGspKSB7DQo+ICsJCWVyciA9IFBUUl9FUlIoZGV2LT5wY2xrKTsNCj4gKwkJZGV2X2VycigmcGRl di0+ZGV2LA0KPiArCQkJImZhaWxlZCB0byBnZXQgdGhlIHBlcmlwaGVyYWwgY2xvY2s6ICVkXG4i LCBlcnIpOw0KPiArCQlyZXR1cm4gZXJyOw0KPiArCX0NCj4gKw0KPiArCS8qIEdldCB0aGUgZ2Vu ZXJpYyBjbG9jayAqLw0KPiArCWRldi0+Z2NsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAi Z2NsayIpOw0KPiArCWlmIChJU19FUlIoZGV2LT5nY2xrKSkgew0KPiArCQllcnIgPSBQVFJfRVJS KGRldi0+Z2Nsayk7DQo+ICsJCWRldl9lcnIoJnBkZXYtPmRldiwNCj4gKwkJCSJmYWlsZWQgdG8g Z2V0IHRoZSBQTUMgZ2VuZXJpYyBjbG9jazogJWRcbiIsIGVycik7DQo+ICsJCXJldHVybiBlcnI7 DQo+ICsJfQ0KPiArDQo+ICsJY3RybCA9ICZkZXYtPmNvbnRyb2w7DQo+ICsJc3Bpbl9sb2NrX2lu aXQoJmN0cmwtPmxvY2spOw0KPiArDQo+ICsJLyogSW5pdCBjaGFubmVsIHN0YXR1cyAqLw0KPiAr CWN0cmwtPmNoX3N0YXRbMF0gPSBJRUM5NThfQUVTMF9DT05fTk9UX0NPUFlSSUdIVCB8DQo+ICsJ CQkgICBJRUM5NThfQUVTMF9DT05fRU1QSEFTSVNfTk9ORTsNCj4gKw0KPiArCWRldi0+ZGV2ID0g JnBkZXYtPmRldjsNCj4gKwlkZXYtPnJlZ21hcCA9IHJlZ21hcDsNCj4gKwlwbGF0Zm9ybV9zZXRf ZHJ2ZGF0YShwZGV2LCBkZXYpOw0KPiArDQo+ICsJZGV2LT5wbGF5YmFjay5hZGRyID0gKGRtYV9h ZGRyX3QpbWVtLT5zdGFydCArIFNQRElGVFhfQ0RSOw0KPiArCWRldi0+cGxheWJhY2suYWRkcl93 aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOw0KPiArDQo+ICsJZXJyID0gZGV2bV9z bmRfZG1hZW5naW5lX3BjbV9yZWdpc3RlcigmcGRldi0+ZGV2LCBOVUxMLCAwKTsNCj4gKwlpZiAo ZXJyKSB7DQo+ICsJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBQTUM6 ICVkXG4iLCBlcnIpOw0KPiArCQlyZXR1cm4gZXJyOw0KPiArCX0NCj4gKw0KPiArCWVyciA9IGRl dm1fc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwNCj4gKwkJCQkJICAgICAg Jm1jaHBfc3BkaWZ0eF9jb21wb25lbnQsDQo+ICsJCQkJCSAgICAgICZtY2hwX3NwZGlmdHhfZGFp LCAxKTsNCj4gKwlpZiAoZXJyKSB7DQo+ICsJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0 byByZWdpc3RlciBjb21wb25lbnQ6ICVkXG4iLCBlcnIpOw0KPiArCQlyZXR1cm4gZXJyOw0KPiAr CX0NCj4gKw0KPiArCXJldHVybiAwOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgc3RydWN0IHBsYXRm b3JtX2RyaXZlciBtY2hwX3NwZGlmdHhfZHJpdmVyID0gew0KPiArCS5wcm9iZQk9IG1jaHBfc3Bk aWZ0eF9wcm9iZSwNCj4gKwkuZHJpdmVyCT0gew0KPiArCQkubmFtZQk9ICJtY2hwX3NwZGlmdHgi LA0KPiArCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIobWNocF9zcGRpZnR4X2R0X2lk cyksDQo+ICsJfSwNCj4gK307DQo+ICsNCj4gK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobWNocF9z cGRpZnR4X2RyaXZlcik7DQo+ICsNCj4gK01PRFVMRV9BVVRIT1IoIkNvZHJpbiBDaXVib3Rhcml1 IDxjb2RyaW4uY2l1Ym90YXJpdUBtaWNyb2NoaXAuY29tPiIpOw0KPiArTU9EVUxFX0RFU0NSSVBU SU9OKCJNaWNyb2NoaXAgUy9QRElGIFRYIENvbnRyb2xsZXIgRHJpdmVyIik7DQo+ICtNT0RVTEVf TElDRU5TRSgiR1BMIHYyIik7DQo+IA== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, NICE_REPLY_A,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 793E2C433E0 for ; Thu, 6 Aug 2020 16:38:35 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 497362311A for ; Thu, 6 Aug 2020 16:38:35 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=alsa-project.org header.i=@alsa-project.org header.b="tWae6bGV"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="C0kvVuvm"; dkim=pass (1024-bit key) header.d=microchiptechnology.onmicrosoft.com header.i=@microchiptechnology.onmicrosoft.com header.b="QZ8hmZBK" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 497362311A Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=microchip.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 24DF4844; Thu, 6 Aug 2020 18:37:43 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 24DF4844 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1596731913; bh=lFYmmCJ+kwPwVQIfcB1u2ydoBgfra08OW8XBd6VYAMk=; h=From:To:Subject:Date:References:In-Reply-To:Cc:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=tWae6bGV5cqIKM6bcpAtfvHonrWmSb9olMTxRo93XnU8V1y13PxgVMsM/z1qtX2QH AXVNRjw1FH3t2SZF5uw5bJyAJVBlk1gRHDvyguRAHJ5KSnbLpF+o+Sz1TdSBXAwRO/ UycHZ+FAYTCni8MOd/diCtlrXgaUSL5e0+f4nQAQ= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id EF66FF8015A; Thu, 6 Aug 2020 18:36:50 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 3F69BF80218; Mon, 3 Aug 2020 15:07:15 +0200 (CEST) Received: from esa2.microchip.iphmx.com (esa2.microchip.iphmx.com [68.232.149.84]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 448ACF80148 for ; Mon, 3 Aug 2020 15:07:03 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 448ACF80148 Authentication-Results: alsa1.perex.cz; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="C0kvVuvm"; dkim=pass (1024-bit key) header.d=microchiptechnology.onmicrosoft.com header.i=@microchiptechnology.onmicrosoft.com header.b="QZ8hmZBK" DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1596460029; x=1627996029; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-id:content-transfer-encoding: mime-version; bh=lFYmmCJ+kwPwVQIfcB1u2ydoBgfra08OW8XBd6VYAMk=; b=C0kvVuvmH6c4upMm2HUcm0bWmQewjw7UDUeJ5IiTlx0Eo8bPZBn4m4vI ittfNmfIQ+H1ZN5shYCoUG5fieU5IUNRmaZcITeVNEzagbZ6q7DtFM0da zsPlMp1sN0qTFXICOcZZrHnpyokyu6usnxHd6h7MTkWeeDCKSGCaL5oeM bzvSCBBFGyFrUwVl4rPrvJlEqfdYzjKLrSvvzvDJXmLOgXJZS1qP+fwWZ reTKZFmqytAzYiOb1OcXmYX5QDWojBNLGMfTEEn18r0WfM1Wul/BBLH69 ARqYFsb5AaMFxQ1ZiXE8KVVjd3nfExkWxBCZhnaoAN0zVjdFXsJLPuhNA g==; IronPort-SDR: 77EH4yeVazX8KszrURS6XcVNCKQvnodAH5f4cAcEJ7b6zCEl0oK8v4p7W/vfc6K2g4Tc3UwqYq wZl3bT+U0NS4vDtQ3Izsz/noh/dztlvEwyli+9jQEEouz9R86j+eP0fSuFBeQuKNmchwhc8LoY dADU8XE0U8k3E1l5YUIDC0Dg3kZKKDGpm3hXINy36jnTbQiz+9A/kCMH68uirpyRZorBFANBqy DB8WEf/5A591tBjYDm9TFqteD801vELqybXW43KKLOBAgd8ywlyJMxy6KGbuYyiOTjntZRbHhC xrE= X-IronPort-AV: E=Sophos;i="5.75,430,1589266800"; d="scan'208";a="84235213" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa2.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 03 Aug 2020 06:07:01 -0700 Received: from chn-vm-ex02.mchp-main.com (10.10.85.144) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1979.3; Mon, 3 Aug 2020 06:07:00 -0700 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (10.10.215.89) by email.microchip.com (10.10.87.72) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1979.3 via Frontend Transport; Mon, 3 Aug 2020 06:06:57 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=KBFacZXk1H9O9mz+qT+zb/YDsXKjJORpUCndVJhmpimuOpItjVq4PqHJ+GfBJ45DiBs67I9j5/qYbE46ATz9N3tkFGZi7K/KiTuYTZImzCQh0AHV6vuBGs2+CeXFYzyLX6ybIQCflmx5P6Dq912u08SUcN1RaFf5w939psf2phn27F95xgHbFSROXENZAsRScrhjJf3W4yxOULxCwWoqSfVi4zAZhqcvQhEaEYjYJIs4Sn5eaQbaoFNKF9o6YOmeMLm+6slAaPC0E9tb3Z4nh26kQgFqBrWITZPFSUw3+LPXUuekfv2B27AbVMALHOaq0OeIMAgsMtFeS/dsS+NFbA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lFYmmCJ+kwPwVQIfcB1u2ydoBgfra08OW8XBd6VYAMk=; b=KTb5gqlYrsDZB+Pm6LOxsTig1G4xmNToiqUfV6C/laubwoDbgw07vgfv4UlXb3Q4nTbwG6y0DGC3oI+mQ22CN8N+Wy5heGgfQV92SEv4W7ajHeAwuLeLYeJD/9KAeNwnCECs7VnT1t/xb01eNPQoNkZVKVbnCSFXkPY3oUQ4zuf1S49715ZRw8UUVMLJ/Jn0WJqpi2chSLhPrfGsJTzr4Qe1oMkHKycT375mLs6BLJa19oLi+cXXQetv5oSa8Iu6ffiPuABmLzPROxthajjlBDqJjlhEazy1CuEUnYCh/8oT/QZRc7l9V6RSJ3fWrCt7S3i3O90X7FCjXbdZCH/mtA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=microchip.com; dmarc=pass action=none header.from=microchip.com; dkim=pass header.d=microchip.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microchiptechnology.onmicrosoft.com; s=selector2-microchiptechnology-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lFYmmCJ+kwPwVQIfcB1u2ydoBgfra08OW8XBd6VYAMk=; b=QZ8hmZBKJKejKM3ln+4SAY+wDKevBfEjnIO5STaaNpknqLHpk6+r5ArnPmwa7CO5cY6Od6yiW4kwdb+u8KhxtwiIKTg7AC1MCwQ1vtccjvndv5AgtE90PxvJNFw1PtJIDbTMBgpCVqG9pGKC8pWU2O3rAMJOoulTtPvI3wugcKI= Received: from DM6PR11MB3420.namprd11.prod.outlook.com (2603:10b6:5:69::31) by DM5PR11MB1930.namprd11.prod.outlook.com (2603:10b6:3:106::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3239.20; Mon, 3 Aug 2020 13:06:57 +0000 Received: from DM6PR11MB3420.namprd11.prod.outlook.com ([fe80::e8b2:1d82:49d9:f4b]) by DM6PR11MB3420.namprd11.prod.outlook.com ([fe80::e8b2:1d82:49d9:f4b%6]) with mapi id 15.20.3239.021; Mon, 3 Aug 2020 13:06:57 +0000 From: To: , , , , Subject: Re: [PATCH v3 2/2] ASoC: mchp-spdiftx: add driver for S/PDIF TX Controller Thread-Topic: [PATCH v3 2/2] ASoC: mchp-spdiftx: add driver for S/PDIF TX Controller Thread-Index: AQHWaZb2Xv4RISU33E+0BkyOzrgC0g== Date: Mon, 3 Aug 2020 13:06:56 +0000 Message-ID: <4d009743-733a-9578-71b2-d320fdca9331@microchip.com> References: <20200803081851.102570-1-codrin.ciubotariu@microchip.com> <20200803081851.102570-2-codrin.ciubotariu@microchip.com> In-Reply-To: <20200803081851.102570-2-codrin.ciubotariu@microchip.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: user-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 authentication-results: microchip.com; dkim=none (message not signed) header.d=none;microchip.com; dmarc=none action=none header.from=microchip.com; x-originating-ip: [86.124.22.126] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 26f72aa7-d6a3-47e0-b6c5-08d837ae19e4 x-ms-traffictypediagnostic: DM5PR11MB1930: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-bypassexternaltag: True x-ms-oob-tlc-oobclassifiers: OLM:47; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: IqhWajqZAcLAF/se6/NI8rIYlmT55uVL/le6GBuZDf3L+5T0DHgJUhEDiuZQGFHEziiX8tp9WuwbCNJhKfrgmOjnq7VEAZI1Q280eS7CcYVGJdPu6zal0r8PxPi61AD+LFVobsR5+5T+bljTF/ifEg0+GJVYFYfi8xdK6rCowfnZw5wg3y/OgRpkTg0KhNHQms12uOp7T2lG0XfPOCi0S0a3m2Zl6AiZHf3U26STKliaDeFlv7JWtgVjqA9CvYpCE9rNBVXRonnQ8AzjCzHiA3BpbGzZgoUcqLTQ4VUsYFKFXO2l01KnbOAO7sT1oP0k7BrMoFo3qelAQGrrAStp6YLZVFLjimiavcUEujNj4dSw4SStkWQfmWLKTrXqGUAN x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR11MB3420.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(39860400002)(346002)(366004)(376002)(136003)(396003)(71200400001)(186003)(83380400001)(66946007)(2906002)(478600001)(86362001)(66446008)(64756008)(91956017)(76116006)(7416002)(31696002)(110136005)(31686004)(54906003)(53546011)(6506007)(66556008)(26005)(36756003)(66476007)(316002)(6512007)(30864003)(8676002)(6486002)(8936002)(4326008)(2616005)(5660300002)(43740500002)(579004)(559001); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata: yjnEvKxnfTZoydQst8YZNsAkheLwjl06evum8PdvhImoYtqY5m5/Z470cAOgOica1cj2h3rxfFBEoItJK9hPZt90rAqu28MI0Bk9Cfomm4fnAVN0E1FiWKYsxuLi2H0cEN4mjdjNbP1Hdlrv8u4BgKcAFmgr9a6p2LZ/oqLvm3OPokX59UNb/y4pucAFVK4fXLSboHIZ6uIBYfUaRjWY5dodWA/fYqoMXcbjwFXj0BvRFi4EJzDUTwwD0INsEljeS7o09TfmA1OSpK9pHTLCxiuoDlKhZC2b+QXvh+ZxPS8mC3EQkakfMkpaTe7HCOcss44MqgmZwER9eH/mXfooOsSfVvic36c2pCD59HnHnWgMI7kNnKx8MZ7HolWZsxvWt6/fHbShUp40GEkJoXy2EpMHo6ME4GvekyvVtPFXvjOAwRKEUERgDSkwaKjQY05yjlpsshGdVo6oLBjb2NsEpGGzoSBFWOEXUK+V1FL8kDUv4MnuPcN4TtTA0Y0GRh9abNTdSRjb9LtG1VnFDTI2Go++BV9L9YytFWtJi0po9EjdOi4qYNapGXd1AvqNTVoq+CIMRPBTnqaOQYj1irXYMgng8GxmVHch5zcFVFhDbQVcC6QG/AVhpU7FZRIUG4KFAAnyfrN4wWN9ccRqb11vlg== Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DM6PR11MB3420.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 26f72aa7-d6a3-47e0-b6c5-08d837ae19e4 X-MS-Exchange-CrossTenant-originalarrivaltime: 03 Aug 2020 13:06:56.9642 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3f4057f3-b418-4d4e-ba84-d55b4e897d88 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: k3afn8mp5+vevxtbh9HwxO8q4zNDj7yQHqMQO1yaxXNJMvMXipi1x8jsJiPXrpHX871k1y1YmP9vAyHaw+HwrhgObK3Xf30BCrbWBsQe1BY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR11MB1930 X-Mailman-Approved-At: Thu, 06 Aug 2020 18:36:48 +0200 Cc: alexandre.belloni@bootlin.com, broonie@kernel.org, lgirdwood@gmail.com, tiwai@suse.com, Ludovic.Desroches@microchip.com, robh+dt@kernel.org X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" DQoNCk9uIDAzLjA4LjIwMjAgMTE6MTgsIENvZHJpbiBDaXVib3Rhcml1IHdyb3RlOg0KPiBUaGUg bmV3IFNQRElGIFRYIGNvbnRyb2xsZXIgaXMgYSBzZXJpYWwgcG9ydCBjb21wbGlhbnQgd2l0aCB0 aGUgSUVDLQ0KPiA2MDk1OCBzdGFuZGFyZC4gSXQgYWxzbyBzdXBwb3J0cyBwcm9ncmFtbWFibGUg VXNlciBEYXRhIGFuZCBDaGFubmVsDQo+IFN0YXR1cyBmaWVsZHMuDQo+IA0KPiBUaGlzIElQIGlz IGVtYmVkZGVkIGluIE1pY3JvY2hpcCdzIHNhbWE3ZzUgU29DLg0KPiANCj4gU2lnbmVkLW9mZi1i eTogQ29kcmluIENpdWJvdGFyaXUgPGNvZHJpbi5jaXVib3Rhcml1QG1pY3JvY2hpcC5jb20+DQo+ IC0tLQ0KPiANCj4gQ2hhbmdlcyBpbiB2MiwgdjM6DQo+ICAtIG5vbmU7DQo+IA0KPiAgc291bmQv c29jL2F0bWVsL0tjb25maWcgICAgICAgIHwgIDEyICsNCj4gIHNvdW5kL3NvYy9hdG1lbC9NYWtl ZmlsZSAgICAgICB8ICAgMiArDQo+ICBzb3VuZC9zb2MvYXRtZWwvbWNocC1zcGRpZnR4LmMgfCA4 NjQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrDQo+ICAzIGZpbGVzIGNoYW5nZWQs IDg3OCBpbnNlcnRpb25zKCspDQo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgc291bmQvc29jL2F0bWVs L21jaHAtc3BkaWZ0eC5jDQo+IA0KPiBkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0bWVsL0tjb25m aWcgYi9zb3VuZC9zb2MvYXRtZWwvS2NvbmZpZw0KPiBpbmRleCA3MWYyZDQyMTg4YzQuLjkzYmVi N2Q2NzBhMyAxMDA2NDQNCj4gLS0tIGEvc291bmQvc29jL2F0bWVsL0tjb25maWcNCj4gKysrIGIv c291bmQvc29jL2F0bWVsL0tjb25maWcNCj4gQEAgLTEzMiw0ICsxMzIsMTYgQEAgY29uZmlnIFNO RF9NQ0hQX1NPQ19JMlNfTUNDDQo+ICAJICBhbmQgc3VwcG9ydHMgYSBUaW1lIERpdmlzaW9uIE11 bHRpcGxleGVkIChURE0pIGludGVyZmFjZSB3aXRoDQo+ICAJICBleHRlcm5hbCBtdWx0aS1jaGFu bmVsIGF1ZGlvIGNvZGVjcy4NCj4gIA0KPiArY29uZmlnIFNORF9NQ0hQX1NPQ19TUERJRlRYDQo+ ICsJdHJpc3RhdGUgIk1pY3JvY2hpcCBBU29DIGRyaXZlciBmb3IgYm9hcmRzIHVzaW5nIFMvUERJ RiBUWCINCj4gKwlkZXBlbmRzIG9uIE9GICYmIChBUkNIX0FUOTEgfHwgQ09NUElMRV9URVNUKQ0K PiArCXNlbGVjdCBTTkRfU09DX0dFTkVSSUNfRE1BRU5HSU5FX1BDTQ0KPiArCXNlbGVjdCBSRUdN QVBfTU1JTw0KPiArCWhlbHANCj4gKwkgIFNheSBZIG9yIE0gaWYgeW91IHdhbnQgdG8gYWRkIHN1 cHBvcnQgZm9yIE1pY3JvY2hpcCBTL1BESUYgVFggQVNvYw0KPiArCSAgZHJpdmVyIG9uIHRoZSBm b2xsb3dpbmcgTWljcm9jaGlwIHBsYXRmb3JtczoNCj4gKwkgIC0gc2FtYTdnNQ0KPiArDQo+ICsJ ICBUaGlzIFMvUERJRiBUWCBkcml2ZXIgaXMgY29tcGxpYW50IHdpdGggSUVDLTYwOTU4IHN0YW5k YXJkIGFuZA0KPiArCSAgaW5jbHVkZXMgcHJvZ3JhbWFibGUgVXNlciBEYXRhIGFuZCBDaGFubmVs IFN0YXR1cyBmaWVsZHMuDQo+ICBlbmRpZg0KPiBkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0bWVs L01ha2VmaWxlIGIvc291bmQvc29jL2F0bWVsL01ha2VmaWxlDQo+IGluZGV4IGM3ZDI5ODk3OTFi ZS4uM2ZkODlhMDA2M2RmIDEwMDY0NA0KPiAtLS0gYS9zb3VuZC9zb2MvYXRtZWwvTWFrZWZpbGUN Cj4gKysrIGIvc291bmQvc29jL2F0bWVsL01ha2VmaWxlDQo+IEBAIC01LDYgKzUsNyBAQCBzbmQt c29jLWF0bWVsLXBjbS1kbWEtb2JqcyA6PSBhdG1lbC1wY20tZG1hLm8NCj4gIHNuZC1zb2MtYXRt ZWxfc3NjX2RhaS1vYmpzIDo9IGF0bWVsX3NzY19kYWkubw0KPiAgc25kLXNvYy1hdG1lbC1pMnMt b2JqcyA6PSBhdG1lbC1pMnMubw0KPiAgc25kLXNvYy1tY2hwLWkycy1tY2Mtb2JqcyA6PSBtY2hw LWkycy1tY2Mubw0KPiArc25kLXNvYy1tY2hwLXNwZGlmdHgtb2JqcyA6PSBtY2hwLXNwZGlmdHgu bw0KPiAgDQo+ICAjIHBkYyBhbmQgZG1hIG5lZWQgdG8gYm90aCBiZSBidWlsdC1pbiBpZiBhbnkg dXNlciBvZg0KPiAgIyBzc2MgaXMgYnVpbHQtaW4uDQo+IEBAIC0xNyw2ICsxOCw3IEBAIGVuZGlm DQo+ICBvYmotJChDT05GSUdfU05EX0FUTUVMX1NPQ19TU0MpICs9IHNuZC1zb2MtYXRtZWxfc3Nj X2RhaS5vDQo+ICBvYmotJChDT05GSUdfU05EX0FUTUVMX1NPQ19JMlMpICs9IHNuZC1zb2MtYXRt ZWwtaTJzLm8NCj4gIG9iai0kKENPTkZJR19TTkRfTUNIUF9TT0NfSTJTX01DQykgKz0gc25kLXNv Yy1tY2hwLWkycy1tY2Mubw0KPiArb2JqLSQoQ09ORklHX1NORF9NQ0hQX1NPQ19TUERJRlRYKSAr PSBzbmQtc29jLW1jaHAtc3BkaWZ0eC5vDQo+ICANCj4gICMgQVQ5MSBNYWNoaW5lIFN1cHBvcnQN Cj4gIHNuZC1zb2Mtc2FtOWcyMC13bTg3MzEtb2JqcyA6PSBzYW05ZzIwX3dtODczMS5vDQo+IGRp ZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvbWNocC1zcGRpZnR4LmMgYi9zb3VuZC9zb2MvYXRt ZWwvbWNocC1zcGRpZnR4LmMNCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4gaW5kZXggMDAwMDAw MDAwMDAwLi43MzhmNjc4ODIxMmUNCj4gLS0tIC9kZXYvbnVsbA0KPiArKysgYi9zb3VuZC9zb2Mv YXRtZWwvbWNocC1zcGRpZnR4LmMNCj4gQEAgLTAsMCArMSw4NjQgQEANCj4gKy8vIFNQRFgtTGlj ZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wDQo+ICsvLw0KPiArLy8gRHJpdmVyIGZvciBNaWNyb2No aXAgUy9QRElGIFRYIENvbnRyb2xsZXINCj4gKy8vDQo+ICsvLyBDb3B5cmlnaHQgKEMpIDIwMjAg TWljcm9jaGlwIFRlY2hub2xvZ3kgSW5jLiBhbmQgaXRzIHN1YnNpZGlhcmllcw0KPiArLy8NCj4g Ky8vIEF1dGhvcjogQ29kcmluIENpdWJvdGFyaXUgPGNvZHJpbi5jaXVib3Rhcml1QG1pY3JvY2hp cC5jb20+DQo+ICsNCj4gKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4NCj4gKyNpbmNsdWRlIDxsaW51 eC9pby5oPg0KPiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KPiArI2luY2x1ZGUgPGxpbnV4 L3NwaW5sb2NrLmg+DQo+ICsNCj4gKyNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPg0KPiArI2lu Y2x1ZGUgPHNvdW5kL2RtYWVuZ2luZV9wY20uaD4NCj4gKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFy YW1zLmg+DQo+ICsjaW5jbHVkZSA8c291bmQvc29jLmg+DQo+ICsNCj4gKy8qDQo+ICsgKiAtLS0t IFMvUERJRiBUcmFuc21pdHRlciBDb250cm9sbGVyIFJlZ2lzdGVyIG1hcCAtLS0tDQo+ICsgKi8N Cj4gKyNkZWZpbmUgU1BESUZUWF9DUgkJCTB4MDAJLyogQ29udHJvbCBSZWdpc3RlciAqLw0KPiAr I2RlZmluZSBTUERJRlRYX01SCQkJMHgwNAkvKiBNb2RlIFJlZ2lzdGVyICovDQoNClRoaXMgcmVn aXN0ZXIgaXMgcmVhZC93cml0ZSBlaXRoZXIgaW4gYXRvbWljIGFuZCBub24tYXRvbWljIGNvbnRl eHRlcyBidXQNCm5vdCBwcm90ZWN0ZWQgZXZlcnl3aGVyZSB0aGUgc2FtZSB3YXkuDQoNCj4gKyNk ZWZpbmUgU1BESUZUWF9DRFIJCQkweDBDCS8qIENvbW1vbiBEYXRhIFJlZ2lzdGVyICovDQo+ICsN Cj4gKyNkZWZpbmUgU1BESUZUWF9JRVIJCQkweDE0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0 ZXIgKi8NCj4gKyNkZWZpbmUgU1BESUZUWF9JRFIJCQkweDE4CS8qIEludGVycnVwdCBEaXNhYmxl IFJlZ2lzdGVyICovDQo+ICsjZGVmaW5lIFNQRElGVFhfSU1SCQkJMHgxQwkvKiBJbnRlcnJ1cHQg TWFzayBSZWdpc3RlciAqLw0KPiArI2RlZmluZSBTUERJRlRYX0lTUgkJCTB4MjAJLyogSW50ZXJy dXB0IFN0YXR1cyBSZWdpc3RlciAqLw0KPiArDQo+ICsjZGVmaW5lIFNQRElGVFhfQ0gxVUQocmVn KQkoMHg1MCArIChyZWcpICogNCkJLyogVXNlciBEYXRhIDEgUmVnaXN0ZXIgeCAqLw0KPiArI2Rl ZmluZSBTUERJRlRYX0NIMVMocmVnKQkoMHg4MCArIChyZWcpICogNCkJLyogQ2hhbm5lbCBTdGF0 dXMgMSBSZWdpc3RlciB4ICovDQo+ICsNCj4gKyNkZWZpbmUgU1BESUZUWF9WRVJTSU9OCQkJMHhG MA0KPiArDQo+ICsvKg0KPiArICogLS0tLSBDb250cm9sIFJlZ2lzdGVyIChXcml0ZS1vbmx5KSAt LS0tDQo+ICsgKi8NCj4gKyNkZWZpbmUgU1BESUZUWF9DUl9TV1JTVAkJQklUKDApCS8qIFNvZnR3 YXJlIFJlc2V0ICovDQo+ICsjZGVmaW5lIFNQRElGVFhfQ1JfRkNMUgkJCUJJVCgxKQkvKiBGSUZP IGNsZWFyICovDQo+ICsNCj4gKy8qDQo+ICsgKiAtLS0tIE1vZGUgUmVnaXN0ZXIgKFJlYWQvV3Jp dGUpIC0tLS0NCj4gKyAqLw0KPiArLyogVHJhbnNtaXQgRW5hYmxlICovDQo+ICsjZGVmaW5lIFNQ RElGVFhfTVJfVFhFTl9NQVNLCQlHRU5NQVNLKDAsIDApDQo+ICsjZGVmaW5lIFNQRElGVFhfTVJf VFhFTl9ESVNBQkxFCQkoMCA8PCAwKQ0KPiArI2RlZmluZSBTUERJRlRYX01SX1RYRU5fRU5BQkxF CQkoMSA8PCAwKQ0KPiArDQo+ICsvKiBNdWx0aWNoYW5uZWwgVHJhbnNmZXIgKi8NCj4gKyNkZWZp bmUgU1BESUZUWF9NUl9NVUxUSUNIX01BU0sJCUdFTkFNU0soMSwgMSkNCj4gKyNkZWZpbmUgU1BE SUZUWF9NUl9NVUxUSUNIX01PTk8JCSgwIDw8IDEpDQo+ICsjZGVmaW5lIFNQRElGVFhfTVJfTVVM VElDSF9EVUFMCQkoMSA8PCAxKQ0KPiArDQo+ICsvKiBEYXRhIFdvcmQgRW5kaWFuIE1vZGUgKi8N Cj4gKyNkZWZpbmUgU1BESUZUWF9NUl9FTkRJQU5fTUFTSwkJR0VOTUFTSygyLCAyKQ0KPiArI2Rl ZmluZSBTUERJRlRYX01SX0VORElBTl9MSVRUTEUJKDAgPDwgMikNCj4gKyNkZWZpbmUgU1BESUZU WF9NUl9FTkRJQU5fQklHCQkoMSA8PCAyKQ0KPiArDQo+ICsvKiBEYXRhIEp1c3RpZmljYXRpb24g Ki8NCj4gKyNkZWZpbmUgU1BESUZUWF9NUl9KVVNUSUZZX01BU0sJCUdFTk1BU0soMywgMykNCj4g KyNkZWZpbmUgU1BESUZUWF9NUl9KVVNUSUZZX0xTQgkJKDAgPDwgMykNCj4gKyNkZWZpbmUgU1BE SUZUWF9NUl9KVVNUSUZZX01TQgkJKDEgPDwgMykNCj4gKw0KPiArLyogQ29tbW9uIEF1ZGlvIFJl Z2lzdGVyIFRyYW5zZmVyIE1vZGUgKi8NCj4gKyNkZWZpbmUgU1BESUZUWF9NUl9DTU9ERV9NQVNL CQkJR0VOTUFTSyg1LCA0KQ0KPiArI2RlZmluZSBTUERJRlRYX01SX0NNT0RFX0lOREVYX0FDQ0VT UwkJKDAgPDwgNCkNCj4gKyNkZWZpbmUgU1BESUZUWF9NUl9DTU9ERV9UT0dHTEVfQUNDRVNTCQko MSA8PCA0KQ0KPiArI2RlZmluZSBTUERJRlRYX01SX0NNT0RFX0lOVEVSTFZEX0FDQ0VTUwkoMiA8 PCA0KQ0KPiArDQo+ICsvKiBWYWxpZCBCaXRzIHBlciBTYW1wbGUgKi8NCj4gKyNkZWZpbmUgU1BE SUZUWF9NUl9WQlBTX01BU0sJCUdFTk1BU0soMTMsIDgpDQo+ICsjZGVmaW5lIFNQRElGVFhfTVJf VkJQUyhicHMpCQkoKChicHMpIDw8IDgpICYgU1BESUZUWF9NUl9WQlBTX01BU0spDQo+ICsNCj4g Ky8qIENodW5rIFNpemUgKi8NCj4gKyNkZWZpbmUgU1BESUZUWF9NUl9DSFVOS19NQVNLCQlHRU5N QVNLKDE5LCAxNikNCj4gKyNkZWZpbmUgU1BESUZUWF9NUl9DSFVOSyhzaXplKQkJKCgoc2l6ZSkg PDwgMTYpICYgU1BESUZUWF9NUl9DSFVOS19NQVNLKQ0KPiArDQo+ICsvKiBWYWxpZGl0eSBCaXRz IGZvciBDaGFubmVscyAxIGFuZCAyICovDQo+ICsjZGVmaW5lIFNQRElGVFhfTVJfVkFMSUQxCQkJ QklUKDI0KQ0KPiArI2RlZmluZSBTUERJRlRYX01SX1ZBTElEMgkJCUJJVCgyNSkNCj4gKw0KPiAr LyogRGlzYWJsZSBOdWxsIEZyYW1lIG9uIHVuZGVycnJ1biAqLw0KPiArI2RlZmluZSBTUERJRlRY X01SX0RORlJfTUFTSwkJR0VOTUFTSygyNywgMjcpDQo+ICsjZGVmaW5lIFNQRElGVFhfTVJfRE5G Ul9JTlZBTElECQkoMCA8PCAyNykNCj4gKyNkZWZpbmUgU1BESUZUWF9NUl9ETkZSX1ZBTElECQko MSA8PCAyNykNCj4gKw0KPiArLyogQnl0ZXMgcGVyIFNhbXBsZSAqLw0KPiArI2RlZmluZSBTUERJ RlRYX01SX0JQU19NQVNLCQlHRU5NQVNLKDI5LCAyOCkNCj4gKyNkZWZpbmUgU1BESUZUWF9NUl9C UFMoYnl0ZXMpIFwNCj4gKwkoKCgoYnl0ZXMpIC0gMSkgPDwgMjgpICYgU1BESUZUWF9NUl9CUFNf TUFTSykNCj4gKw0KPiArLyoNCj4gKyAqIC0tLS0gSW50ZXJydXB0IEVuYWJsZS9EaXNhYmxlL01h c2svU3RhdHVzIFJlZ2lzdGVyIChXcml0ZS9SZWFkLW9ubHkpIC0tLS0NCj4gKyAqLw0KPiArI2Rl ZmluZSBTUERJRlRYX0lSX1RYUkRZCQlCSVQoMCkNCj4gKyNkZWZpbmUgU1BESUZUWF9JUl9UWEVN UFRZCQlCSVQoMSkNCj4gKyNkZWZpbmUgU1BESUZUWF9JUl9UWEZVTEwJCUJJVCgyKQ0KPiArI2Rl ZmluZSBTUERJRlRYX0lSX1RYQ0hVTksJCUJJVCgzKQ0KPiArI2RlZmluZSBTUERJRlRYX0lSX1RY VURSCQlCSVQoNCkNCj4gKyNkZWZpbmUgU1BESUZUWF9JUl9UWE9WUgkJQklUKDUpDQo+ICsjZGVm aW5lIFNQRElGVFhfSVJfQ1NSRFkJCUJJVCg2KQ0KPiArI2RlZmluZSBTUERJRlRYX0lSX1VEUkRZ CQlCSVQoNykNCj4gKyNkZWZpbmUgU1BESUZUWF9JUl9UWFJEWUNIKGNoKQkJQklUKChjaCkgKyA4 KQ0KPiArI2RlZmluZSBTUERJRlRYX0lSX1NFQ0UJCQlCSVQoMTApDQo+ICsjZGVmaW5lIFNQRElG VFhfSVJfVFhVRFJDSChjaCkJCUJJVCgoY2gpICsgMTEpDQo+ICsjZGVmaW5lIFNQRElGVFhfSVJf QkVORAkJCUJJVCgxMykNCj4gKw0KPiArc3RhdGljIGJvb2wgbWNocF9zcGRpZnR4X3JlYWRhYmxl X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpDQo+ICt7DQo+ICsJc3dp dGNoIChyZWcpIHsNCj4gKwljYXNlIFNQRElGVFhfTVI6DQo+ICsJY2FzZSBTUERJRlRYX0lNUjoN Cj4gKwljYXNlIFNQRElGVFhfSVNSOg0KPiArCWNhc2UgU1BESUZUWF9DSDFVRCgwKToNCj4gKwlj YXNlIFNQRElGVFhfQ0gxVUQoMSk6DQo+ICsJY2FzZSBTUERJRlRYX0NIMVVEKDIpOg0KPiArCWNh c2UgU1BESUZUWF9DSDFVRCgzKToNCj4gKwljYXNlIFNQRElGVFhfQ0gxVUQoNCk6DQo+ICsJY2Fz ZSBTUERJRlRYX0NIMVVEKDUpOg0KPiArCWNhc2UgU1BESUZUWF9DSDFTKDApOg0KPiArCWNhc2Ug U1BESUZUWF9DSDFTKDEpOg0KPiArCWNhc2UgU1BESUZUWF9DSDFTKDIpOg0KPiArCWNhc2UgU1BE SUZUWF9DSDFTKDMpOg0KPiArCWNhc2UgU1BESUZUWF9DSDFTKDQpOg0KPiArCWNhc2UgU1BESUZU WF9DSDFTKDUpOg0KPiArCQlyZXR1cm4gdHJ1ZTsNCj4gKwlkZWZhdWx0Og0KPiArCQlyZXR1cm4g ZmFsc2U7DQo+ICsJfQ0KPiArfQ0KPiArDQo+ICtzdGF0aWMgYm9vbCBtY2hwX3NwZGlmdHhfd3Jp dGVhYmxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpDQo+ICt7DQo+ ICsJc3dpdGNoIChyZWcpIHsNCj4gKwljYXNlIFNQRElGVFhfQ1I6DQo+ICsJY2FzZSBTUERJRlRY X01SOg0KPiArCWNhc2UgU1BESUZUWF9DRFI6DQo+ICsJY2FzZSBTUERJRlRYX0lFUjoNCj4gKwlj YXNlIFNQRElGVFhfSURSOg0KPiArCWNhc2UgU1BESUZUWF9DSDFVRCgwKToNCj4gKwljYXNlIFNQ RElGVFhfQ0gxVUQoMSk6DQo+ICsJY2FzZSBTUERJRlRYX0NIMVVEKDIpOg0KPiArCWNhc2UgU1BE SUZUWF9DSDFVRCgzKToNCj4gKwljYXNlIFNQRElGVFhfQ0gxVUQoNCk6DQo+ICsJY2FzZSBTUERJ RlRYX0NIMVVEKDUpOg0KPiArCWNhc2UgU1BESUZUWF9DSDFTKDApOg0KPiArCWNhc2UgU1BESUZU WF9DSDFTKDEpOg0KPiArCWNhc2UgU1BESUZUWF9DSDFTKDIpOg0KPiArCWNhc2UgU1BESUZUWF9D SDFTKDMpOg0KPiArCWNhc2UgU1BESUZUWF9DSDFTKDQpOg0KPiArCWNhc2UgU1BESUZUWF9DSDFT KDUpOg0KPiArCQlyZXR1cm4gdHJ1ZTsNCj4gKwlkZWZhdWx0Og0KPiArCQlyZXR1cm4gZmFsc2U7 DQo+ICsJfQ0KPiArfQ0KPiArDQo+ICtzdGF0aWMgYm9vbCBtY2hwX3NwZGlmdHhfcHJlY2lvdXNf cmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykNCj4gK3sNCj4gKwlzd2l0 Y2ggKHJlZykgew0KPiArCWNhc2UgU1BESUZUWF9DRFI6DQo+ICsJY2FzZSBTUERJRlRYX0lTUjoN Cj4gKwkJcmV0dXJuIHRydWU7DQo+ICsJZGVmYXVsdDoNCj4gKwkJcmV0dXJuIGZhbHNlOw0KPiAr CX0NCj4gK30NCj4gKw0KPiArc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIG1jaHBf c3BkaWZ0eF9yZWdtYXBfY29uZmlnID0gew0KPiArCS5yZWdfYml0cyA9IDMyLA0KPiArCS5yZWdf c3RyaWRlID0gNCwNCj4gKwkudmFsX2JpdHMgPSAzMiwNCj4gKwkubWF4X3JlZ2lzdGVyID0gU1BE SUZUWF9WRVJTSU9OLA0KPiArCS5yZWFkYWJsZV9yZWcgPSBtY2hwX3NwZGlmdHhfcmVhZGFibGVf cmVnLA0KPiArCS53cml0ZWFibGVfcmVnID0gbWNocF9zcGRpZnR4X3dyaXRlYWJsZV9yZWcsDQo+ ICsJLnByZWNpb3VzX3JlZyA9IG1jaHBfc3BkaWZ0eF9wcmVjaW91c19yZWcsDQo+ICt9Ow0KPiAr DQo+ICsjZGVmaW5lIFNQRElGVFhfR0NMS19SQVRJTwkxMjgNCj4gKw0KPiArI2RlZmluZSBTUERJ RlRYX0NTX0JJVFMJCTE5Mg0KPiArI2RlZmluZSBTUERJRlRYX1VEX0JJVFMJCTE5Mg0KPiArDQo+ ICtzdHJ1Y3QgbWNocF9zcGRpZnR4X21peGVyX2NvbnRyb2wgew0KPiArCXVuc2lnbmVkIGNoYXIJ CQkJY2hfc3RhdFtTUERJRlRYX0NTX0JJVFMgLyA4XTsNCj4gKwl1bnNpZ25lZCBjaGFyCQkJCXVz ZXJfZGF0YVtTUERJRlRYX1VEX0JJVFMgLyA4XTsNCj4gKwlzcGlubG9ja190CQkJCWxvY2s7DQo+ ICt9Ow0KPiArDQo+ICtzdHJ1Y3QgbWNocF9zcGRpZnR4X2RldiB7DQo+ICsJc3RydWN0IG1jaHBf c3BkaWZ0eF9taXhlcl9jb250cm9sCWNvbnRyb2w7DQo+ICsJc3RydWN0IHNuZF9kbWFlbmdpbmVf ZGFpX2RtYV9kYXRhCXBsYXliYWNrOw0KPiArCXN0cnVjdCBkZXZpY2UJCQkJKmRldjsNCj4gKwlz dHJ1Y3QgcmVnbWFwCQkJCSpyZWdtYXA7DQo+ICsJc3RydWN0IGNsawkJCQkqcGNsazsNCj4gKwlz dHJ1Y3QgY2xrCQkJCSpnY2xrOw0KPiArCXVuc2lnbmVkIGludAkJCQlmbXQ7DQo+ICsJY29uc3Qg c3RydWN0IG1jaHBfaTJzX2NhcHMJCSpjYXBzOw0KPiArCWludAkJCQkJZ2Nsa19lbmFibGVkOjE7 DQo+ICt9Ow0KPiArDQo+ICtzdGF0aWMgaW5saW5lIGludCBtY2hwX3NwZGlmdHhfaXNfcnVubmlu ZyhzdHJ1Y3QgbWNocF9zcGRpZnR4X2RldiAqZGV2KQ0KPiArew0KPiArCXUzMiBtcjsNCj4gKw0K PiArCXJlZ21hcF9yZWFkKGRldi0+cmVnbWFwLCBTUERJRlRYX01SLCAmbXIpOw0KPiArCXJldHVy biAhIShtciAmIFNQRElGVFhfTVJfVFhFTl9FTkFCTEUpOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMg dm9pZCBtY2hwX3NwZGlmdHhfY2hhbm5lbF9zdGF0dXNfd3JpdGUoc3RydWN0IG1jaHBfc3BkaWZ0 eF9kZXYgKmRldikNCj4gK3sNCj4gKwlzdHJ1Y3QgbWNocF9zcGRpZnR4X21peGVyX2NvbnRyb2wg KmN0cmwgPSAmZGV2LT5jb250cm9sOw0KPiArCXUzMiB2YWw7DQo+ICsJaW50IGk7DQo+ICsNCj4g Kwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjdHJsLT5jaF9zdGF0KSAvIDQ7IGkrKykgew0K PiArCQl2YWwgPSAoY3RybC0+Y2hfc3RhdFsoaSAqIDQpICsgMF0gPDwgMCkgfA0KPiArCQkgICAg ICAoY3RybC0+Y2hfc3RhdFsoaSAqIDQpICsgMV0gPDwgOCkgfA0KPiArCQkgICAgICAoY3RybC0+ Y2hfc3RhdFsoaSAqIDQpICsgMl0gPDwgMTYpIHwNCj4gKwkJICAgICAgKGN0cmwtPmNoX3N0YXRb KGkgKiA0KSArIDNdIDw8IDI0KTsNCj4gKw0KPiArCQlyZWdtYXBfd3JpdGUoZGV2LT5yZWdtYXAs IFNQRElGVFhfQ0gxUyhpKSwgdmFsKTsNCj4gKwl9DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyB2b2lk IG1jaHBfc3BkaWZ0eF91c2VyX2RhdGFfd3JpdGUoc3RydWN0IG1jaHBfc3BkaWZ0eF9kZXYgKmRl dikNCj4gK3sNCj4gKwlzdHJ1Y3QgbWNocF9zcGRpZnR4X21peGVyX2NvbnRyb2wgKmN0cmwgPSAm ZGV2LT5jb250cm9sOw0KPiArCXUzMiB2YWw7DQo+ICsJaW50IGk7DQo+ICsNCj4gKwlmb3IgKGkg PSAwOyBpIDwgQVJSQVlfU0laRShjdHJsLT51c2VyX2RhdGEpIC8gNDsgaSsrKSB7DQo+ICsJCXZh bCA9IChjdHJsLT51c2VyX2RhdGFbKGkgKiA0KSArIDBdIDw8IDApIHwNCj4gKwkJICAgICAgKGN0 cmwtPnVzZXJfZGF0YVsoaSAqIDQpICsgMV0gPDwgOCkgfA0KPiArCQkgICAgICAoY3RybC0+dXNl cl9kYXRhWyhpICogNCkgKyAyXSA8PCAxNikgfA0KPiArCQkgICAgICAoY3RybC0+dXNlcl9kYXRh WyhpICogNCkgKyAzXSA8PCAyNCk7DQo+ICsNCj4gKwkJcmVnbWFwX3dyaXRlKGRldi0+cmVnbWFw LCBTUERJRlRYX0NIMVVEKGkpLCB2YWwpOw0KPiArCX0NCj4gK30NCj4gKw0KPiArc3RhdGljIGly cXJldHVybl90IG1jaHBfc3BkaWZ0eF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQ0K PiArew0KPiArCXN0cnVjdCBtY2hwX3NwZGlmdHhfZGV2ICpkZXYgPSBkZXZfaWQ7DQo+ICsJc3Ry dWN0IG1jaHBfc3BkaWZ0eF9taXhlcl9jb250cm9sICpjdHJsID0gJmRldi0+Y29udHJvbDsNCj4g Kwl1MzIgc3IsIGltciwgcGVuZGluZywgaWRyID0gMDsNCj4gKw0KPiArCXJlZ21hcF9yZWFkKGRl di0+cmVnbWFwLCBTUERJRlRYX0lTUiwgJnNyKTsNCj4gKwlyZWdtYXBfcmVhZChkZXYtPnJlZ21h cCwgU1BESUZUWF9JTVIsICZpbXIpOw0KPiArCXBlbmRpbmcgPSBzciAmIGltcjsNCj4gKw0KPiAr CWlmICghcGVuZGluZykNCj4gKwkJcmV0dXJuIElSUV9OT05FOw0KPiArDQo+ICsJaWYgKHBlbmRp bmcgJiBTUERJRlRYX0lSX1RYVURSKSB7DQo+ICsJCWRldl93YXJuKGRldi0+ZGV2LCAidW5kZXJm bG93IGRldGVjdGVkXG4iKTsNCj4gKwkJaWRyIHw9IFNQRElGVFhfSVJfVFhVRFI7DQo+ICsJfQ0K PiArDQo+ICsJaWYgKHBlbmRpbmcgJiBTUERJRlRYX0lSX1RYT1ZSKSB7DQo+ICsJCWRldl93YXJu KGRldi0+ZGV2LCAib3ZlcmZsb3cgZGV0ZWN0ZWRcbiIpOw0KPiArCQlpZHIgfD0gU1BESUZUWF9J Ul9UWE9WUjsNCj4gKwl9DQo+ICsNCj4gKwlpZiAocGVuZGluZyAmIFNQRElGVFhfSVJfVURSRFkp IHsNCj4gKwkJc3Bpbl9sb2NrKCZjdHJsLT5sb2NrKTsNCj4gKwkJbWNocF9zcGRpZnR4X3VzZXJf ZGF0YV93cml0ZShkZXYpOw0KPiArCQlzcGluX3VubG9jaygmY3RybC0+bG9jayk7DQo+ICsJCWlk ciB8PSBTUERJRlRYX0lSX1VEUkRZOw0KPiArCX0NCj4gKw0KPiArCWlmIChwZW5kaW5nICYgU1BE SUZUWF9JUl9DU1JEWSkgew0KPiArCQlzcGluX2xvY2soJmN0cmwtPmxvY2spOw0KPiArCQltY2hw X3NwZGlmdHhfY2hhbm5lbF9zdGF0dXNfd3JpdGUoZGV2KTsNCj4gKwkJc3Bpbl91bmxvY2soJmN0 cmwtPmxvY2spOw0KPiArCQlpZHIgfD0gU1BESUZUWF9JUl9DU1JEWTsNCj4gKwl9DQo+ICsNCj4g KwlyZWdtYXBfd3JpdGUoZGV2LT5yZWdtYXAsIFNQRElGVFhfSURSLCBpZHIpOw0KPiArDQo+ICsJ cmV0dXJuIElSUV9IQU5ETEVEOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW50IG1jaHBfc3BkaWZ0 eF9kYWlfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwNCj4gKwkJ CQkgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpDQo+ICt7DQo+ICsJc3RydWN0IG1jaHBfc3Bk aWZ0eF9kZXYgKmRldiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7DQo+ICsJaW50IGVy cjsNCj4gKw0KPiArCWVyciA9IGNsa19wcmVwYXJlX2VuYWJsZShkZXYtPnBjbGspOw0KPiArCWlm IChlcnIpIHsNCj4gKwkJZGV2X2VycihkZXYtPmRldiwNCj4gKwkJCSJmYWlsZWQgdG8gZW5hYmxl IHRoZSBwZXJpcGhlcmFsIGNsb2NrOiAlZFxuIiwgZXJyKTsNCj4gKwkJcmV0dXJuIGVycjsNCj4g Kwl9DQo+ICsNCj4gKwkvKiBTb2Z0d2FyZSByZXNldCB0aGUgSVAgKi8NCj4gKwlyZWdtYXBfd3Jp dGUoZGV2LT5yZWdtYXAsIFNQRElGVFhfQ1IsDQo+ICsJCSAgICAgU1BESUZUWF9DUl9TV1JTVCB8 IFNQRElGVFhfQ1JfRkNMUik7DQo+ICsNCj4gKwlyZXR1cm4gMDsNCj4gK30NCj4gKw0KPiArc3Rh dGljIHZvaWQgbWNocF9zcGRpZnR4X2RhaV9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJl YW0gKnN1YnN0cmVhbSwNCj4gKwkJCQkgICAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkNCj4g K3sNCj4gKwlzdHJ1Y3QgbWNocF9zcGRpZnR4X2RldiAqZGV2ID0gc25kX3NvY19kYWlfZ2V0X2Ry dmRhdGEoZGFpKTsNCj4gKw0KPiArCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLw0KPiArCXJlZ21h cF93cml0ZShkZXYtPnJlZ21hcCwgU1BESUZUWF9JRFIsIDB4ZmZmZmZmZmYpOw0KPiArDQo+ICsJ Y2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRldi0+cGNsayk7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBp bnQgbWNocF9zcGRpZnR4X3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJl YW0sIGludCBjbWQsDQo+ICsJCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpDQo+ICt7DQo+ICsJ c3RydWN0IG1jaHBfc3BkaWZ0eF9kZXYgKmRldiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRh aSk7DQo+ICsJc3RydWN0IG1jaHBfc3BkaWZ0eF9taXhlcl9jb250cm9sICpjdHJsID0gJmRldi0+ Y29udHJvbDsNCj4gKwl1MzIgbXI7DQo+ICsJaW50IHJ1bm5pbmc7DQo+ICsJaW50IHJldDsNCj4g Kw0KPiArCS8qIGRvIG5vdCBzdGFydC9zdG9wIHdoaWxlIGNoYW5uZWwgc3RhdHVzIG9yIHVzZXIg ZGF0YSBpcyB1cGRhdGVkICovDQo+ICsJc3Bpbl9sb2NrKCZjdHJsLT5sb2NrKTsNCj4gKwlyZWdt YXBfcmVhZChkZXYtPnJlZ21hcCwgU1BESUZUWF9NUiwgJm1yKTsNCg0KSGVyZSwgYXRvbWljLCBm b3IgaW5zdGFuY2UuDQoNCj4gKwlydW5uaW5nID0gISEobXIgJiBTUERJRlRYX01SX1RYRU5fRU5B QkxFKTsNCj4gKw0KPiArCXN3aXRjaCAoY21kKSB7DQo+ICsJY2FzZSBTTkRSVl9QQ01fVFJJR0dF Ul9TVEFSVDoNCj4gKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToNCj4gKwljYXNlIFNO RFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6DQo+ICsJCWlmICghcnVubmluZykgew0KPiAr CQkJbXIgJj0gflNQRElGVFhfTVJfVFhFTl9NQVNLOw0KPiArCQkJbXIgfD0gU1BESUZUWF9NUl9U WEVOX0VOQUJMRTsNCj4gKwkJfQ0KPiArCQlicmVhazsNCj4gKwljYXNlIFNORFJWX1BDTV9UUklH R0VSX1NUT1A6DQo+ICsJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOg0KPiArCWNhc2Ug U05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoNCj4gKwkJaWYgKHJ1bm5pbmcpIHsNCj4gKwkJ CW1yICY9IH5TUERJRlRYX01SX1RYRU5fTUFTSzsNCj4gKwkJCW1yIHw9IFNQRElGVFhfTVJfVFhF Tl9ESVNBQkxFOw0KPiArCQl9DQo+ICsJCWJyZWFrOw0KPiArCWRlZmF1bHQ6DQo+ICsJCXNwaW5f dW5sb2NrKCZjdHJsLT5sb2NrKTsNCj4gKwkJcmV0dXJuIC1FSU5WQUw7DQo+ICsJfQ0KPiArDQo+ ICsJcmV0ID0gcmVnbWFwX3dyaXRlKGRldi0+cmVnbWFwLCBTUERJRlRYX01SLCBtcik7DQo+ICsJ c3Bpbl91bmxvY2soJmN0cmwtPmxvY2spOw0KPiArCWlmIChyZXQpIHsNCj4gKwkJZGV2X2Vycihk ZXYtPmRldiwgInVuYWJsZSB0byBkaXNhYmxlIFRYOiAlZFxuIiwgcmV0KTsNCj4gKwkJcmV0dXJu IHJldDsNCj4gKwl9DQo+ICsNCj4gKwlyZXR1cm4gMDsNCj4gK30NCj4gKw0KPiArc3RhdGljIGlu dCBtY2hwX3NwZGlmdHhfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3Ry ZWFtLA0KPiArCQkJCSAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsDQo+ICsJCQkJ ICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkNCj4gK3sNCj4gKwl1bnNpZ25lZCBsb25nIGZsYWdz Ow0KPiArCXN0cnVjdCBtY2hwX3NwZGlmdHhfZGV2ICpkZXYgPSBzbmRfc29jX2RhaV9nZXRfZHJ2 ZGF0YShkYWkpOw0KPiArCXN0cnVjdCBtY2hwX3NwZGlmdHhfbWl4ZXJfY29udHJvbCAqY3RybCA9 ICZkZXYtPmNvbnRyb2w7DQo+ICsJdTMyIG1yOw0KPiArCXVuc2lnbmVkIGludCBicHMgPSBwYXJh bXNfcGh5c2ljYWxfd2lkdGgocGFyYW1zKSAvIDg7DQo+ICsJaW50IHJldDsNCj4gKw0KPiArCWRl dl9kYmcoZGV2LT5kZXYsICIlcygpIHJhdGU9JXUgZm9ybWF0PSUjeCB3aWR0aD0ldSBjaGFubmVs cz0ldVxuIiwNCj4gKwkJX19mdW5jX18sIHBhcmFtc19yYXRlKHBhcmFtcyksIHBhcmFtc19mb3Jt YXQocGFyYW1zKSwNCj4gKwkJcGFyYW1zX3dpZHRoKHBhcmFtcyksIHBhcmFtc19jaGFubmVscyhw YXJhbXMpKTsNCj4gKw0KPiArCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RS RUFNX0NBUFRVUkUpIHsNCj4gKwkJZGV2X2VycihkZXYtPmRldiwgIkNhcHR1cmUgaXMgbm90IHN1 cHBvcnRlZFxuIik7DQo+ICsJCXJldHVybiAtRUlOVkFMOw0KPiArCX0NCj4gKw0KPiArCXJlZ21h cF9yZWFkKGRldi0+cmVnbWFwLCBTUERJRlRYX01SLCAmbXIpOw0KDQpIZXJlIG5vbi1hdG9taWMu DQoNCj4gKw0KPiArCWlmIChtciAmIFNQRElGVFhfTVJfVFhFTl9FTkFCTEUpIHsNCj4gKwkJZGV2 X2VycihkZXYtPmRldiwgIlBDTSBhbHJlYWR5IHJ1bm5pbmdcbiIpOw0KPiArCQlyZXR1cm4gLUVC VVNZOw0KPiArCX0NCj4gKw0KPiArCS8qIERlZmF1bHRzOiBUb2dnbGUgbW9kZSwganVzdGlmeSB0 byBMU0IsIGNodW5rc2l6ZSAxICovDQo+ICsJbXIgPSBTUERJRlRYX01SX0NNT0RFX1RPR0dMRV9B Q0NFU1MgfCBTUERJRlRYX01SX0pVU1RJRllfTFNCOw0KPiArCWRldi0+cGxheWJhY2subWF4YnVy c3QgPSAxOw0KPiArCXN3aXRjaCAocGFyYW1zX2NoYW5uZWxzKHBhcmFtcykpIHsNCj4gKwljYXNl IDE6DQo+ICsJCW1yIHw9IFNQRElGVFhfTVJfTVVMVElDSF9NT05POw0KPiArCQlicmVhazsNCj4g KwljYXNlIDI6DQo+ICsJCW1yIHw9IFNQRElGVFhfTVJfTVVMVElDSF9EVUFMOw0KPiArCQlpZiAo YnBzID4gMikNCj4gKwkJCWRldi0+cGxheWJhY2subWF4YnVyc3QgPSAyOw0KPiArCQlicmVhazsN Cj4gKwlkZWZhdWx0Og0KPiArCQlkZXZfZXJyKGRldi0+ZGV2LCAidW5zdXBwb3J0ZWQgbnVtYmVy IG9mIGNoYW5uZWxzOiAlZFxuIiwNCj4gKwkJCXBhcmFtc19jaGFubmVscyhwYXJhbXMpKTsNCj4g KwkJcmV0dXJuIC1FSU5WQUw7DQo+ICsJfQ0KPiArCW1yIHw9IFNQRElGVFhfTVJfQ0hVTksoZGV2 LT5wbGF5YmFjay5tYXhidXJzdCk7DQo+ICsNCj4gKwlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFy YW1zKSkgew0KPiArCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TODoNCj4gKwkJbXIgfD0gU1BESUZU WF9NUl9WQlBTKDgpOw0KPiArCQlicmVhazsNCj4gKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2 X0JFOg0KPiArCQltciB8PSBTUERJRlRYX01SX0VORElBTl9CSUc7DQo+ICsJCWZhbGx0aHJvdWdo Ow0KPiArCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6DQo+ICsJCW1yIHw9IFNQRElGVFhf TVJfVkJQUygxNik7DQo+ICsJCWJyZWFrOw0KPiArCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMThf M0JFOg0KPiArCQltciB8PSBTUERJRlRYX01SX0VORElBTl9CSUc7DQo+ICsJCWZhbGx0aHJvdWdo Ow0KPiArCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMThfM0xFOg0KPiArCQltciB8PSBTUERJRlRY X01SX1ZCUFMoMTgpOw0KPiArCQlicmVhazsNCj4gKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIw XzNCRToNCj4gKwkJbXIgfD0gU1BESUZUWF9NUl9FTkRJQU5fQklHOw0KPiArCQlmYWxsdGhyb3Vn aDsNCj4gKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIwXzNMRToNCj4gKwkJbXIgfD0gU1BESUZU WF9NUl9WQlBTKDIwKTsNCj4gKwkJYnJlYWs7DQo+ICsJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1My NF8zQkU6DQo+ICsJCW1yIHw9IFNQRElGVFhfTVJfRU5ESUFOX0JJRzsNCj4gKwkJZmFsbHRocm91 Z2g7DQo+ICsJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6DQo+ICsJCW1yIHw9IFNQRElG VFhfTVJfVkJQUygyNCk7DQo+ICsJCWJyZWFrOw0KPiArCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9T MjRfQkU6DQo+ICsJCW1yIHw9IFNQRElGVFhfTVJfRU5ESUFOX0JJRzsNCj4gKwkJZmFsbHRocm91 Z2g7DQo+ICsJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToNCj4gKwkJbXIgfD0gU1BESUZU WF9NUl9WQlBTKDI0KTsNCj4gKwkJYnJlYWs7DQo+ICsJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1Mz Ml9CRToNCj4gKwkJbXIgfD0gU1BESUZUWF9NUl9FTkRJQU5fQklHOw0KPiArCQlmYWxsdGhyb3Vn aDsNCj4gKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOg0KPiArCQltciB8PSBTUERJRlRY X01SX1ZCUFMoMzIpOw0KPiArCQlicmVhazsNCj4gKwlkZWZhdWx0Og0KPiArCQlkZXZfZXJyKGRl di0+ZGV2LCAidW5zdXBwb3J0ZWQgUENNIGZvcm1hdDogJWRcbiIsDQo+ICsJCQlwYXJhbXNfZm9y bWF0KHBhcmFtcykpOw0KPiArCQlyZXR1cm4gLUVJTlZBTDsNCj4gKwl9DQo+ICsNCj4gKwltciB8 PSBTUERJRlRYX01SX0JQUyhicHMpOw0KPiArDQo+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJmN0cmwt PmxvY2ssIGZsYWdzKTsNCj4gKwljdHJsLT5jaF9zdGF0WzNdICY9IH5JRUM5NThfQUVTM19DT05f RlM7DQo+ICsJc3dpdGNoIChwYXJhbXNfcmF0ZShwYXJhbXMpKSB7DQo+ICsJY2FzZSAyMjA1MDoN Cj4gKwkJY3RybC0+Y2hfc3RhdFszXSB8PSBJRUM5NThfQUVTM19DT05fRlNfMjIwNTA7DQo+ICsJ CWJyZWFrOw0KPiArCWNhc2UgMjQwMDA6DQo+ICsJCWN0cmwtPmNoX3N0YXRbM10gfD0gSUVDOTU4 X0FFUzNfQ09OX0ZTXzI0MDAwOw0KPiArCQlicmVhazsNCj4gKwljYXNlIDMyMDAwOg0KPiArCQlj dHJsLT5jaF9zdGF0WzNdIHw9IElFQzk1OF9BRVMzX0NPTl9GU18zMjAwMDsNCj4gKwkJYnJlYWs7 DQo+ICsJY2FzZSA0NDEwMDoNCj4gKwkJY3RybC0+Y2hfc3RhdFszXSB8PSBJRUM5NThfQUVTM19D T05fRlNfNDQxMDA7DQo+ICsJCWJyZWFrOw0KPiArCWNhc2UgNDgwMDA6DQo+ICsJCWN0cmwtPmNo X3N0YXRbM10gfD0gSUVDOTU4X0FFUzNfQ09OX0ZTXzQ4MDAwOw0KPiArCQlicmVhazsNCj4gKwlj YXNlIDg4MjAwOg0KPiArCQljdHJsLT5jaF9zdGF0WzNdIHw9IElFQzk1OF9BRVMzX0NPTl9GU184 ODIwMDsNCj4gKwkJYnJlYWs7DQo+ICsJY2FzZSA5NjAwMDoNCj4gKwkJY3RybC0+Y2hfc3RhdFsz XSB8PSBJRUM5NThfQUVTM19DT05fRlNfOTYwMDA7DQo+ICsJCWJyZWFrOw0KPiArCWNhc2UgMTc2 NDAwOg0KPiArCQljdHJsLT5jaF9zdGF0WzNdIHw9IElFQzk1OF9BRVMzX0NPTl9GU18xNzY0MDA7 DQo+ICsJCWJyZWFrOw0KPiArCWNhc2UgMTkyMDAwOg0KPiArCQljdHJsLT5jaF9zdGF0WzNdIHw9 IElFQzk1OF9BRVMzX0NPTl9GU18xOTIwMDA7DQo+ICsJCWJyZWFrOw0KPiArCWNhc2UgODAwMDoN Cj4gKwljYXNlIDExMDI1Og0KPiArCWNhc2UgMTYwMDA6DQo+ICsJY2FzZSA2NDAwMDoNCj4gKwkJ Y3RybC0+Y2hfc3RhdFszXSB8PSBJRUM5NThfQUVTM19DT05fRlNfTk9USUQ7DQo+ICsJCWJyZWFr Ow0KPiArCWRlZmF1bHQ6DQo+ICsJCWRldl9lcnIoZGV2LT5kZXYsICJ1bnN1cHBvcnRlZCBzYW1w bGUgZnJlcXVlbmN5OiAldVxuIiwNCj4gKwkJCXBhcmFtc19yYXRlKHBhcmFtcykpOw0KPiArCQlz cGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHJsLT5sb2NrLCBmbGFncyk7DQo+ICsJCXJldHVybiAt RUlOVkFMOw0KPiArCX0NCj4gKwltY2hwX3NwZGlmdHhfY2hhbm5lbF9zdGF0dXNfd3JpdGUoZGV2 KTsNCj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHJsLT5sb2NrLCBmbGFncyk7DQo+ICsJ bXIgfD0gU1BESUZUWF9NUl9WQUxJRDEgfCBTUERJRlRYX01SX1ZBTElEMjsNCj4gKw0KPiArCWlm IChkZXYtPmdjbGtfZW5hYmxlZCkgew0KPiArCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZGV2LT5n Y2xrKTsNCj4gKwkJZGV2LT5nY2xrX2VuYWJsZWQgPSAwOw0KPiArCX0NCj4gKwlyZXQgPSBjbGtf c2V0X3JhdGUoZGV2LT5nY2xrLCBwYXJhbXNfcmF0ZShwYXJhbXMpICoNCj4gKwkJCQkgICAgICBT UERJRlRYX0dDTEtfUkFUSU8pOw0KPiArCWlmIChyZXQpIHsNCj4gKwkJZGV2X2VycihkZXYtPmRl diwNCj4gKwkJCSJ1bmFibGUgdG8gY2hhbmdlIGdjbGsgcmF0ZSB0bzogcmF0ZSAldSAqIHJhdGlv ICV1XG4iLA0KPiArCQkJcGFyYW1zX3JhdGUocGFyYW1zKSwgU1BESUZUWF9HQ0xLX1JBVElPKTsN Cj4gKwkJcmV0dXJuIHJldDsNCj4gKwl9DQo+ICsJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRl di0+Z2Nsayk7DQo+ICsJaWYgKHJldCkgew0KPiArCQlkZXZfZXJyKGRldi0+ZGV2LCAidW5hYmxl IHRvIGVuYWJsZSBnY2xrOiAlZFxuIiwgcmV0KTsNCj4gKwkJcmV0dXJuIHJldDsNCj4gKwl9DQo+ ICsJZGV2LT5nY2xrX2VuYWJsZWQgPSAxOw0KPiArCWRldl9kYmcoZGV2LT5kZXYsICIlcygpOiBH Q0xLIHNldCB0byAlZFxuIiwgX19mdW5jX18sDQo+ICsJCXBhcmFtc19yYXRlKHBhcmFtcykgKiBT UERJRlRYX0dDTEtfUkFUSU8pOw0KPiArDQo+ICsJLyogRW5hYmxlIGludGVycnVwdHMgKi8NCj4g KwlyZWdtYXBfd3JpdGUoZGV2LT5yZWdtYXAsIFNQRElGVFhfSUVSLA0KPiArCQkgICAgIFNQRElG VFhfSVJfVFhVRFIgfCBTUERJRlRYX0lSX1RYT1ZSKTsNCj4gKw0KPiArCXJlZ21hcF93cml0ZShk ZXYtPnJlZ21hcCwgU1BESUZUWF9NUiwgbXIpOw0KDQpTYW1lIGhlcmUuDQoNCj4gKw0KPiArCXJl dHVybiAwOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW50IG1jaHBfc3BkaWZ0eF9od19mcmVlKHN0 cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLA0KPiArCQkJCXN0cnVjdCBzbmRfc29j X2RhaSAqZGFpKQ0KPiArew0KPiArCXN0cnVjdCBtY2hwX3NwZGlmdHhfZGV2ICpkZXYgPSBzbmRf c29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOw0KPiArDQo+ICsJcmVnbWFwX3dyaXRlKGRldi0+cmVn bWFwLCBTUERJRlRYX0lEUiwNCj4gKwkJICAgICBTUERJRlRYX0lSX1RYVURSIHwgU1BESUZUWF9J Ul9UWE9WUik7DQo+ICsJaWYgKGRldi0+Z2Nsa19lbmFibGVkKSB7DQo+ICsJCWNsa19kaXNhYmxl X3VucHJlcGFyZShkZXYtPmdjbGspOw0KPiArCQlkZXYtPmdjbGtfZW5hYmxlZCA9IDA7DQo+ICsJ fQ0KPiArDQo+ICsJcmV0dXJuIHJlZ21hcF93cml0ZShkZXYtPnJlZ21hcCwgU1BESUZUWF9DUiwN Cj4gKwkJCSAgICBTUERJRlRYX0NSX1NXUlNUIHwgU1BESUZUWF9DUl9GQ0xSKTsNCj4gK30NCj4g Kw0KPiArDQo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBtY2hwX3NwZGlm dHhfZGFpX29wcyA9IHsNCj4gKwkuc3RhcnR1cAk9IG1jaHBfc3BkaWZ0eF9kYWlfc3RhcnR1cCwN Cj4gKwkuc2h1dGRvd24JPSBtY2hwX3NwZGlmdHhfZGFpX3NodXRkb3duLA0KPiArCS50cmlnZ2Vy CT0gbWNocF9zcGRpZnR4X3RyaWdnZXIsDQo+ICsJLmh3X3BhcmFtcwk9IG1jaHBfc3BkaWZ0eF9o d19wYXJhbXMsDQo+ICsJLmh3X2ZyZWUJPSBtY2hwX3NwZGlmdHhfaHdfZnJlZSwNCj4gK307DQo+ ICsNCj4gKyNkZWZpbmUgTUNIUF9TUERJRlRYX1JBVEVTCVNORFJWX1BDTV9SQVRFXzgwMDBfMTky MDAwDQo+ICsNCj4gKyNkZWZpbmUgTUNIUF9TUERJRlRYX0ZPUk1BVFMJKFNORFJWX1BDTV9GTVRC SVRfUzggfAkJXA0KPiArCQkJCSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CVwNCj4gKwkJCQkg U05EUlZfUENNX0ZNVEJJVF9VMTZfQkUgfAlcDQo+ICsJCQkJIFNORFJWX1BDTV9GTVRCSVRfUzE4 XzNMRSB8CVwNCj4gKwkJCQkgU05EUlZfUENNX0ZNVEJJVF9TMThfM0JFIHwJXA0KPiArCQkJCSBT TkRSVl9QQ01fRk1UQklUX1MyMF8zTEUgfAlcDQo+ICsJCQkJIFNORFJWX1BDTV9GTVRCSVRfUzIw XzNCRSB8CVwNCj4gKwkJCQkgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwJXA0KPiArCQkJCSBT TkRSVl9QQ01fRk1UQklUX1MyNF8zQkUgfAlcDQo+ICsJCQkJIFNORFJWX1BDTV9GTVRCSVRfUzI0 X0xFIHwJXA0KPiArCQkJCSBTTkRSVl9QQ01fRk1UQklUX1MyNF9CRSB8CVwNCj4gKwkJCQkgU05E UlZfUENNX0ZNVEJJVF9TMzJfTEUgfAlcDQo+ICsJCQkJIFNORFJWX1BDTV9GTVRCSVRfUzMyX0JF CVwNCj4gKwkJCQkgKQ0KPiArDQo+ICtzdGF0aWMgaW50IG1jaHBfc3BkaWZ0eF9pbmZvKHN0cnVj dCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLA0KPiArCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVt X2luZm8gKnVpbmZvKQ0KPiArew0KPiArCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQ RV9JRUM5NTg7DQo+ICsJdWluZm8tPmNvdW50ID0gMTsNCj4gKw0KPiArCXJldHVybiAwOw0KPiAr fQ0KPiArDQo+ICtzdGF0aWMgaW50IG1jaHBfc3BkaWZ0eF9jc19nZXQoc3RydWN0IHNuZF9rY29u dHJvbCAqa2NvbnRyb2wsDQo+ICsJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAq dXZhbHVlKQ0KPiArew0KPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7DQo+ICsJc3RydWN0IHNuZF9z b2NfZGFpICpkYWkgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7DQo+ICsJc3RydWN0IG1j aHBfc3BkaWZ0eF9kZXYgKmRldiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7DQo+ICsJ c3RydWN0IG1jaHBfc3BkaWZ0eF9taXhlcl9jb250cm9sICpjdHJsID0gJmRldi0+Y29udHJvbDsN Cj4gKw0KPiArCXNwaW5fbG9ja19pcnFzYXZlKCZjdHJsLT5sb2NrLCBmbGFncyk7DQo+ICsJbWVt Y3B5KHV2YWx1ZS0+dmFsdWUuaWVjOTU4LnN0YXR1cywgY3RybC0+Y2hfc3RhdCwNCj4gKwkgICAg ICAgc2l6ZW9mKGN0cmwtPmNoX3N0YXQpKTsNCj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZj dHJsLT5sb2NrLCBmbGFncyk7DQo+ICsNCj4gKwlyZXR1cm4gMDsNCj4gK30NCj4gKw0KPiArc3Rh dGljIGludCBtY2hwX3NwZGlmdHhfY3NfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9s LA0KPiArCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnV2YWx1ZSkNCj4gK3sN Cj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOw0KPiArCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpID0g c25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOw0KPiArCXN0cnVjdCBtY2hwX3NwZGlmdHhfZGV2 ICpkZXYgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOw0KPiArCXN0cnVjdCBtY2hwX3Nw ZGlmdHhfbWl4ZXJfY29udHJvbCAqY3RybCA9ICZkZXYtPmNvbnRyb2w7DQo+ICsJaW50IGNoYW5n ZWQgPSAwOw0KPiArCWludCBpOw0KPiArDQo+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJmN0cmwtPmxv Y2ssIGZsYWdzKTsNCj4gKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjdHJsLT5jaF9zdGF0 KTsgaSsrKSB7DQo+ICsJCWlmIChjdHJsLT5jaF9zdGF0W2ldICE9IHV2YWx1ZS0+dmFsdWUuaWVj OTU4LnN0YXR1c1tpXSkNCj4gKwkJCWNoYW5nZWQgPSAxOw0KPiArCQljdHJsLT5jaF9zdGF0W2ld ID0gdXZhbHVlLT52YWx1ZS5pZWM5NTguc3RhdHVzW2ldOw0KPiArCX0NCj4gKw0KPiArCWlmIChj aGFuZ2VkKSB7DQo+ICsJCS8qIGRvbid0IGVuYWJsZSBJUCB3aGlsZSB3ZSBjb3B5IHRoZSBjaGFu bmVsIHN0YXR1cyAqLw0KPiArCQlpZiAobWNocF9zcGRpZnR4X2lzX3J1bm5pbmcoZGV2KSkgew0K PiArCQkJLyoNCj4gKwkJCSAqIGlmIFNQRElGIGlzIHJ1bm5pbmcsIHdhaXQgZm9yIGludGVycnVw dCB0byB3cml0ZQ0KPiArCQkJICogY2hhbm5lbCBzdGF0dXMNCj4gKwkJCSAqLw0KPiArCQkJcmVn bWFwX3dyaXRlKGRldi0+cmVnbWFwLCBTUERJRlRYX0lFUiwNCj4gKwkJCQkgICAgIFNQRElGVFhf SVJfQ1NSRFkpOw0KPiArCQl9IGVsc2Ugew0KPiArCQkJbWNocF9zcGRpZnR4X2NoYW5uZWxfc3Rh dHVzX3dyaXRlKGRldik7DQo+ICsJCX0NCj4gKwl9DQo+ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmY3RybC0+bG9jaywgZmxhZ3MpOw0KPiArDQo+ICsJcmV0dXJuIGNoYW5nZWQ7DQo+ICt9DQo+ ICsNCj4gK3N0YXRpYyBpbnQgbWNocF9zcGRpZnR4X2NzX21hc2soc3RydWN0IHNuZF9rY29udHJv bCAqa2NvbnRyb2wsDQo+ICsJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdXZhbHVlKQ0K PiArew0KPiArCW1lbXNldCh1dmFsdWUtPnZhbHVlLmllYzk1OC5zdGF0dXMsIDB4ZmYsDQo+ICsJ ICAgICAgIHNpemVvZih1dmFsdWUtPnZhbHVlLmllYzk1OC5zdGF0dXMpKTsNCj4gKw0KPiArCXJl dHVybiAwOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW50IG1jaHBfc3BkaWZ0eF9zdWJjb2RlX2dl dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwNCj4gKwkJCQkgICAgc3RydWN0IHNuZF9j dGxfZWxlbV92YWx1ZSAqdXZhbHVlKQ0KPiArew0KPiArCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFp ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOw0KPiArCXN0cnVjdCBtY2hwX3NwZGlmdHhf ZGV2ICpkZXYgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOw0KPiArCXN0cnVjdCBtY2hw X3NwZGlmdHhfbWl4ZXJfY29udHJvbCAqY3RybCA9ICZkZXYtPmNvbnRyb2w7DQo+ICsJdW5zaWdu ZWQgbG9uZyBmbGFnczsNCj4gKw0KPiArCXNwaW5fbG9ja19pcnFzYXZlKCZjdHJsLT5sb2NrLCBm bGFncyk7DQo+ICsJbWVtY3B5KHV2YWx1ZS0+dmFsdWUuaWVjOTU4LnN1YmNvZGUsIGN0cmwtPnVz ZXJfZGF0YSwNCj4gKwkgICAgICAgc2l6ZW9mKGN0cmwtPnVzZXJfZGF0YSkpOw0KPiArCXNwaW5f dW5sb2NrX2lycXJlc3RvcmUoJmN0cmwtPmxvY2ssIGZsYWdzKTsNCj4gKw0KPiArCXJldHVybiAw Ow0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW50IG1jaHBfc3BkaWZ0eF9zdWJjb2RlX3B1dChzdHJ1 Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwNCj4gKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxl bV92YWx1ZSAqdXZhbHVlKQ0KPiArew0KPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7DQo+ICsJc3Ry dWN0IHNuZF9zb2NfZGFpICpkYWkgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7DQo+ICsJ c3RydWN0IG1jaHBfc3BkaWZ0eF9kZXYgKmRldiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRh aSk7DQo+ICsJc3RydWN0IG1jaHBfc3BkaWZ0eF9taXhlcl9jb250cm9sICpjdHJsID0gJmRldi0+ Y29udHJvbDsNCj4gKwlpbnQgY2hhbmdlZCA9IDA7DQo+ICsJaW50IGk7DQo+ICsNCj4gKwlzcGlu X2xvY2tfaXJxc2F2ZSgmY3RybC0+bG9jaywgZmxhZ3MpOw0KPiArCWZvciAoaSA9IDA7IGkgPCBB UlJBWV9TSVpFKGN0cmwtPnVzZXJfZGF0YSk7IGkrKykgew0KPiArCQlpZiAoY3RybC0+dXNlcl9k YXRhW2ldICE9IHV2YWx1ZS0+dmFsdWUuaWVjOTU4LnN1YmNvZGVbaV0pDQo+ICsJCQljaGFuZ2Vk ID0gMTsNCj4gKw0KPiArCQljdHJsLT51c2VyX2RhdGFbaV0gPSB1dmFsdWUtPnZhbHVlLmllYzk1 OC5zdWJjb2RlW2ldOw0KPiArCX0NCj4gKwlpZiAoY2hhbmdlZCkgew0KPiArCQlpZiAobWNocF9z cGRpZnR4X2lzX3J1bm5pbmcoZGV2KSkgew0KPiArCQkJLyoNCj4gKwkJCSAqIGlmIFNQRElGIGlz IHJ1bm5pbmcsIHdhaXQgZm9yIGludGVycnVwdCB0byB3cml0ZQ0KPiArCQkJICogdXNlciBkYXRh DQo+ICsJCQkgKi8NCj4gKwkJCXJlZ21hcF93cml0ZShkZXYtPnJlZ21hcCwgU1BESUZUWF9JRVIs DQo+ICsJCQkJICAgICBTUERJRlRYX0lSX1VEUkRZKTsNCj4gKwkJfSBlbHNlIHsNCj4gKwkJCW1j aHBfc3BkaWZ0eF91c2VyX2RhdGFfd3JpdGUoZGV2KTsNCj4gKwkJfQ0KPiArCX0NCj4gKwlzcGlu X3VubG9ja19pcnFyZXN0b3JlKCZjdHJsLT5sb2NrLCBmbGFncyk7DQo+ICsNCj4gKwlyZXR1cm4g Y2hhbmdlZDsNCj4gK30NCj4gKw0KPiArc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1j aHBfc3BkaWZ0eF9jdHJsc1tdID0gew0KPiArCS8qIENoYW5uZWwgc3RhdHVzIGNvbnRyb2xsZXIg Ki8NCj4gKwl7DQo+ICsJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwNCj4gKwkJ Lm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsIFBMQVlCQUNLLCBERUZBVUxUKSwNCj4g KwkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfA0KPiArCQkJU05E UlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLA0KPiArCQkuaW5mbyA9IG1jaHBfc3BkaWZ0eF9p bmZvLA0KPiArCQkuZ2V0ID0gbWNocF9zcGRpZnR4X2NzX2dldCwNCj4gKwkJLnB1dCA9IG1jaHBf c3BkaWZ0eF9jc19wdXQsDQo+ICsJfSwNCj4gKwl7DQo+ICsJCS5pZmFjZSA9IFNORFJWX0NUTF9F TEVNX0lGQUNFX1BDTSwNCj4gKwkJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsIFBM QVlCQUNLLCBNQVNLKSwNCj4gKwkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFE LA0KPiArCQkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLA0KPiArCQkuaW5mbyA9IG1j aHBfc3BkaWZ0eF9pbmZvLA0KPiArCQkuZ2V0ID0gbWNocF9zcGRpZnR4X2NzX21hc2ssDQo+ICsJ fSwNCj4gKwkvKiBVc2VyIGJpdHMgY29udHJvbGxlciAqLw0KPiArCXsNCj4gKwkJLmlmYWNlID0g U05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLA0KPiArCQkubmFtZSA9ICJJRUM5NTggU3ViY29kZSBQ bGF5YmFjayBEZWZhdWx0IiwNCj4gKwkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19S RUFEV1JJVEUsDQo+ICsJCS5pbmZvID0gbWNocF9zcGRpZnR4X2luZm8sDQo+ICsJCS5nZXQgPSBt Y2hwX3NwZGlmdHhfc3ViY29kZV9nZXQsDQo+ICsJCS5wdXQgPSBtY2hwX3NwZGlmdHhfc3ViY29k ZV9wdXQsDQo+ICsJfSwNCj4gK307DQo+ICsNCj4gK3N0YXRpYyBpbnQgbWNocF9zcGRpZnR4X2Rh aV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkNCj4gK3sNCj4gKwlzdHJ1Y3QgbWNocF9z cGRpZnR4X2RldiAqZGV2ID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsNCj4gKw0KPiAr CXNuZF9zb2NfZGFpX2luaXRfZG1hX2RhdGEoZGFpLCAmZGV2LT5wbGF5YmFjaywgTlVMTCk7DQo+ ICsNCj4gKwkvKiBBZGQgY29udHJvbHMgKi8NCj4gKwlzbmRfc29jX2FkZF9kYWlfY29udHJvbHMo ZGFpLCBtY2hwX3NwZGlmdHhfY3RybHMsDQo+ICsJCQkJIEFSUkFZX1NJWkUobWNocF9zcGRpZnR4 X2N0cmxzKSk7DQo+ICsNCj4gKwlyZXR1cm4gMDsNCj4gK30NCj4gKw0KPiArc3RhdGljIHN0cnVj dCBzbmRfc29jX2RhaV9kcml2ZXIgbWNocF9zcGRpZnR4X2RhaSA9IHsNCj4gKwkubmFtZSA9ICJt Y2hwLXNwZGlmdHgiLA0KPiArCS5wcm9iZQk9IG1jaHBfc3BkaWZ0eF9kYWlfcHJvYmUsDQo+ICsJ LnBsYXliYWNrID0gew0KPiArCQkuc3RyZWFtX25hbWUgPSAiUy9QRElGIFRYIFBsYXliYWNrIiwN Cj4gKwkJLmNoYW5uZWxzX21pbiA9IDEsDQo+ICsJCS5jaGFubmVsc19tYXggPSAyLA0KPiArCQku cmF0ZXMgPSBNQ0hQX1NQRElGVFhfUkFURVMsDQo+ICsJCS5mb3JtYXRzID0gTUNIUF9TUERJRlRY X0ZPUk1BVFMsDQo+ICsJfSwNCj4gKwkub3BzID0gJm1jaHBfc3BkaWZ0eF9kYWlfb3BzLA0KPiAr fTsNCj4gKw0KPiArc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIg bWNocF9zcGRpZnR4X2NvbXBvbmVudCA9IHsNCj4gKwkubmFtZQkJPSAibWNocC1zcGRpZnR4IiwN Cj4gK307DQo+ICsNCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1jaHBfc3Bk aWZ0eF9kdF9pZHNbXSA9IHsNCj4gKwl7DQo+ICsJCS5jb21wYXRpYmxlID0gIm1pY3JvY2hpcCxz YW1hN2c1LXNwZGlmdHgiLA0KPiArCX0sDQo+ICsJeyAvKiBzZW50aW5lbCAqLyB9DQo+ICt9Ow0K PiArDQo+ICtNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtY2hwX3NwZGlmdHhfZHRfaWRzKTsNCj4g K3N0YXRpYyBpbnQgbWNocF9zcGRpZnR4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk ZXYpDQo+ICt7DQo+ICsJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2Rl Ow0KPiArCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOw0KPiArCXN0cnVjdCBtY2hw X3NwZGlmdHhfZGV2ICpkZXY7DQo+ICsJc3RydWN0IHJlc291cmNlICptZW07DQo+ICsJc3RydWN0 IHJlZ21hcCAqcmVnbWFwOw0KPiArCXZvaWQgX19pb21lbSAqYmFzZTsNCj4gKwlzdHJ1Y3QgbWNo cF9zcGRpZnR4X21peGVyX2NvbnRyb2wgKmN0cmw7DQo+ICsJaW50IGlycTsNCj4gKwlpbnQgZXJy Ow0KPiArDQo+ICsJLyogR2V0IG1lbW9yeSBmb3IgZHJpdmVyIGRhdGEuICovDQo+ICsJZGV2ID0g ZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7DQo+ICsJ aWYgKCFkZXYpDQo+ICsJCXJldHVybiAtRU5PTUVNOw0KPiArDQo+ICsJLyogR2V0IGhhcmR3YXJl IGNhcGFiaWxpdGllcy4gKi8NCj4gKwltYXRjaCA9IG9mX21hdGNoX25vZGUobWNocF9zcGRpZnR4 X2R0X2lkcywgbnApOw0KPiArCWlmIChtYXRjaCkNCj4gKwkJZGV2LT5jYXBzID0gbWF0Y2gtPmRh dGE7DQo+ICsNCj4gKwkvKiBNYXAgSS9PIHJlZ2lzdGVycy4gKi8NCj4gKwliYXNlID0gZGV2bV9w bGF0Zm9ybV9nZXRfYW5kX2lvcmVtYXBfcmVzb3VyY2UocGRldiwgMCwgJm1lbSk7DQo+ICsJaWYg KElTX0VSUihiYXNlKSkNCj4gKwkJcmV0dXJuIFBUUl9FUlIoYmFzZSk7DQo+ICsNCj4gKwlyZWdt YXAgPSBkZXZtX3JlZ21hcF9pbml0X21taW8oJnBkZXYtPmRldiwgYmFzZSwNCj4gKwkJCQkgICAg ICAgJm1jaHBfc3BkaWZ0eF9yZWdtYXBfY29uZmlnKTsNCj4gKwlpZiAoSVNfRVJSKHJlZ21hcCkp DQo+ICsJCXJldHVybiBQVFJfRVJSKHJlZ21hcCk7DQo+ICsNCj4gKwkvKiBSZXF1ZXN0IElSUSAq Lw0KPiArCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7DQo+ICsJaWYgKGlycSA8IDAp DQo+ICsJCXJldHVybiBpcnE7DQo+ICsNCj4gKwllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2 LT5kZXYsIGlycSwgbWNocF9zcGRpZnR4X2ludGVycnVwdCwgMCwNCj4gKwkJCSAgICAgICBkZXZf bmFtZSgmcGRldi0+ZGV2KSwgZGV2KTsNCj4gKwlpZiAoZXJyKQ0KPiArCQlyZXR1cm4gZXJyOw0K PiArDQo+ICsJLyogR2V0IHRoZSBwZXJpcGhlcmFsIGNsb2NrICovDQo+ICsJZGV2LT5wY2xrID0g ZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJwY2xrIik7DQo+ICsJaWYgKElTX0VSUihkZXYtPnBj bGspKSB7DQo+ICsJCWVyciA9IFBUUl9FUlIoZGV2LT5wY2xrKTsNCj4gKwkJZGV2X2VycigmcGRl di0+ZGV2LA0KPiArCQkJImZhaWxlZCB0byBnZXQgdGhlIHBlcmlwaGVyYWwgY2xvY2s6ICVkXG4i LCBlcnIpOw0KPiArCQlyZXR1cm4gZXJyOw0KPiArCX0NCj4gKw0KPiArCS8qIEdldCB0aGUgZ2Vu ZXJpYyBjbG9jayAqLw0KPiArCWRldi0+Z2NsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAi Z2NsayIpOw0KPiArCWlmIChJU19FUlIoZGV2LT5nY2xrKSkgew0KPiArCQllcnIgPSBQVFJfRVJS KGRldi0+Z2Nsayk7DQo+ICsJCWRldl9lcnIoJnBkZXYtPmRldiwNCj4gKwkJCSJmYWlsZWQgdG8g Z2V0IHRoZSBQTUMgZ2VuZXJpYyBjbG9jazogJWRcbiIsIGVycik7DQo+ICsJCXJldHVybiBlcnI7 DQo+ICsJfQ0KPiArDQo+ICsJY3RybCA9ICZkZXYtPmNvbnRyb2w7DQo+ICsJc3Bpbl9sb2NrX2lu aXQoJmN0cmwtPmxvY2spOw0KPiArDQo+ICsJLyogSW5pdCBjaGFubmVsIHN0YXR1cyAqLw0KPiAr CWN0cmwtPmNoX3N0YXRbMF0gPSBJRUM5NThfQUVTMF9DT05fTk9UX0NPUFlSSUdIVCB8DQo+ICsJ CQkgICBJRUM5NThfQUVTMF9DT05fRU1QSEFTSVNfTk9ORTsNCj4gKw0KPiArCWRldi0+ZGV2ID0g JnBkZXYtPmRldjsNCj4gKwlkZXYtPnJlZ21hcCA9IHJlZ21hcDsNCj4gKwlwbGF0Zm9ybV9zZXRf ZHJ2ZGF0YShwZGV2LCBkZXYpOw0KPiArDQo+ICsJZGV2LT5wbGF5YmFjay5hZGRyID0gKGRtYV9h ZGRyX3QpbWVtLT5zdGFydCArIFNQRElGVFhfQ0RSOw0KPiArCWRldi0+cGxheWJhY2suYWRkcl93 aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOw0KPiArDQo+ICsJZXJyID0gZGV2bV9z bmRfZG1hZW5naW5lX3BjbV9yZWdpc3RlcigmcGRldi0+ZGV2LCBOVUxMLCAwKTsNCj4gKwlpZiAo ZXJyKSB7DQo+ICsJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBQTUM6 ICVkXG4iLCBlcnIpOw0KPiArCQlyZXR1cm4gZXJyOw0KPiArCX0NCj4gKw0KPiArCWVyciA9IGRl dm1fc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwNCj4gKwkJCQkJICAgICAg Jm1jaHBfc3BkaWZ0eF9jb21wb25lbnQsDQo+ICsJCQkJCSAgICAgICZtY2hwX3NwZGlmdHhfZGFp LCAxKTsNCj4gKwlpZiAoZXJyKSB7DQo+ICsJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0 byByZWdpc3RlciBjb21wb25lbnQ6ICVkXG4iLCBlcnIpOw0KPiArCQlyZXR1cm4gZXJyOw0KPiAr CX0NCj4gKw0KPiArCXJldHVybiAwOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgc3RydWN0IHBsYXRm b3JtX2RyaXZlciBtY2hwX3NwZGlmdHhfZHJpdmVyID0gew0KPiArCS5wcm9iZQk9IG1jaHBfc3Bk aWZ0eF9wcm9iZSwNCj4gKwkuZHJpdmVyCT0gew0KPiArCQkubmFtZQk9ICJtY2hwX3NwZGlmdHgi LA0KPiArCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIobWNocF9zcGRpZnR4X2R0X2lk cyksDQo+ICsJfSwNCj4gK307DQo+ICsNCj4gK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobWNocF9z cGRpZnR4X2RyaXZlcik7DQo+ICsNCj4gK01PRFVMRV9BVVRIT1IoIkNvZHJpbiBDaXVib3Rhcml1 IDxjb2RyaW4uY2l1Ym90YXJpdUBtaWNyb2NoaXAuY29tPiIpOw0KPiArTU9EVUxFX0RFU0NSSVBU SU9OKCJNaWNyb2NoaXAgUy9QRElGIFRYIENvbnRyb2xsZXIgRHJpdmVyIik7DQo+ICtNT0RVTEVf TElDRU5TRSgiR1BMIHYyIik7DQo+IA== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8B73DC433E0 for ; Mon, 3 Aug 2020 13:09:28 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 481D520678 for ; Mon, 3 Aug 2020 13:09:28 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="w303k0TZ"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="zMD5uDFt"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=microchiptechnology.onmicrosoft.com header.i=@microchiptechnology.onmicrosoft.com header.b="QZ8hmZBK" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 481D520678 Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=microchip.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:Content-ID:In-Reply-To:References: Message-ID:Date:Subject:To:From:Reply-To:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=fHQn0zh4FKmsrkgRfG0nu9hjtHaidP99/n5MzoQ1spA=; b=w303k0TZCxfOAfJzVOVnCWc9O dn37YSM/ZYa1yyv8SNjTFGvNxBftnio0lSmJT7hvMUzo1MZ6UAAdyrKs5PBtMEnxVJOnZUNPACqFN 7GblSUpNB23EVDEYNMqTEs4ELiXDMbp/o9tHObNvl9n+2jr464A8v9fgXY+NzvprNdAtl4f5/w8MD b88cQEg1KUlsoutuqG20tXzcOh3H9w94dYTwwfsxRemc0kOpzRv4mdEtX7yergoGMPQ03d8tj8a4m CMUPNDyzKwcv7V7g+9lEuc2pVJDczmCCcxLlD5ASMD7/lewpDUBbt4sgyGU9TKTQeK+HXevxMWQjx bjfkXNZYQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1k2aBH-0001TX-VL; Mon, 03 Aug 2020 13:07:08 +0000 Received: from esa2.microchip.iphmx.com ([68.232.149.84]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1k2aBE-0001St-6l for linux-arm-kernel@lists.infradead.org; Mon, 03 Aug 2020 13:07:06 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1596460024; x=1627996024; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-id:content-transfer-encoding: mime-version; bh=lFYmmCJ+kwPwVQIfcB1u2ydoBgfra08OW8XBd6VYAMk=; b=zMD5uDFt1SQ9RK2FnMWxajoKa7IorpO2Mg05s/zZRWw2Tu13vf1hJHXy P+zlLNS7B8cCnMyehDUx2DMzOd2GHIaQPuECGUPi14g9KPFlYC+k3Ilvz WW/caItNBbuTqD1hLdyVjjiZ+ByuQPhEvn2esjFe0k/4LwdDai9g3hBjv dVZoHI4kbtgu2WJY9UziE6Decaduz2/4hNa+7x5D5sfsJIYDRZVNx2zwa 6I3h8nF5frvQn9QMftg5BajGnhB3mbuc1lY/F/5P+itgIlKqREDxhm609 knEpvS/ZzhitQ0cyLirxWi/LmKSV+20GlM3FpixXe5GXhESA2co6QqHd8 g==; IronPort-SDR: 77EH4yeVazX8KszrURS6XcVNCKQvnodAH5f4cAcEJ7b6zCEl0oK8v4p7W/vfc6K2g4Tc3UwqYq wZl3bT+U0NS4vDtQ3Izsz/noh/dztlvEwyli+9jQEEouz9R86j+eP0fSuFBeQuKNmchwhc8LoY dADU8XE0U8k3E1l5YUIDC0Dg3kZKKDGpm3hXINy36jnTbQiz+9A/kCMH68uirpyRZorBFANBqy DB8WEf/5A591tBjYDm9TFqteD801vELqybXW43KKLOBAgd8ywlyJMxy6KGbuYyiOTjntZRbHhC xrE= X-IronPort-AV: E=Sophos;i="5.75,430,1589266800"; d="scan'208";a="84235213" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa2.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 03 Aug 2020 06:07:01 -0700 Received: from chn-vm-ex02.mchp-main.com (10.10.85.144) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1979.3; Mon, 3 Aug 2020 06:07:00 -0700 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (10.10.215.89) by email.microchip.com (10.10.87.72) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1979.3 via Frontend Transport; Mon, 3 Aug 2020 06:06:57 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=KBFacZXk1H9O9mz+qT+zb/YDsXKjJORpUCndVJhmpimuOpItjVq4PqHJ+GfBJ45DiBs67I9j5/qYbE46ATz9N3tkFGZi7K/KiTuYTZImzCQh0AHV6vuBGs2+CeXFYzyLX6ybIQCflmx5P6Dq912u08SUcN1RaFf5w939psf2phn27F95xgHbFSROXENZAsRScrhjJf3W4yxOULxCwWoqSfVi4zAZhqcvQhEaEYjYJIs4Sn5eaQbaoFNKF9o6YOmeMLm+6slAaPC0E9tb3Z4nh26kQgFqBrWITZPFSUw3+LPXUuekfv2B27AbVMALHOaq0OeIMAgsMtFeS/dsS+NFbA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lFYmmCJ+kwPwVQIfcB1u2ydoBgfra08OW8XBd6VYAMk=; b=KTb5gqlYrsDZB+Pm6LOxsTig1G4xmNToiqUfV6C/laubwoDbgw07vgfv4UlXb3Q4nTbwG6y0DGC3oI+mQ22CN8N+Wy5heGgfQV92SEv4W7ajHeAwuLeLYeJD/9KAeNwnCECs7VnT1t/xb01eNPQoNkZVKVbnCSFXkPY3oUQ4zuf1S49715ZRw8UUVMLJ/Jn0WJqpi2chSLhPrfGsJTzr4Qe1oMkHKycT375mLs6BLJa19oLi+cXXQetv5oSa8Iu6ffiPuABmLzPROxthajjlBDqJjlhEazy1CuEUnYCh/8oT/QZRc7l9V6RSJ3fWrCt7S3i3O90X7FCjXbdZCH/mtA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=microchip.com; dmarc=pass action=none header.from=microchip.com; dkim=pass header.d=microchip.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microchiptechnology.onmicrosoft.com; s=selector2-microchiptechnology-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lFYmmCJ+kwPwVQIfcB1u2ydoBgfra08OW8XBd6VYAMk=; b=QZ8hmZBKJKejKM3ln+4SAY+wDKevBfEjnIO5STaaNpknqLHpk6+r5ArnPmwa7CO5cY6Od6yiW4kwdb+u8KhxtwiIKTg7AC1MCwQ1vtccjvndv5AgtE90PxvJNFw1PtJIDbTMBgpCVqG9pGKC8pWU2O3rAMJOoulTtPvI3wugcKI= Received: from DM6PR11MB3420.namprd11.prod.outlook.com (2603:10b6:5:69::31) by DM5PR11MB1930.namprd11.prod.outlook.com (2603:10b6:3:106::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3239.20; Mon, 3 Aug 2020 13:06:57 +0000 Received: from DM6PR11MB3420.namprd11.prod.outlook.com ([fe80::e8b2:1d82:49d9:f4b]) by DM6PR11MB3420.namprd11.prod.outlook.com ([fe80::e8b2:1d82:49d9:f4b%6]) with mapi id 15.20.3239.021; Mon, 3 Aug 2020 13:06:57 +0000 From: To: , , , , Subject: Re: [PATCH v3 2/2] ASoC: mchp-spdiftx: add driver for S/PDIF TX Controller Thread-Topic: [PATCH v3 2/2] ASoC: mchp-spdiftx: add driver for S/PDIF TX Controller Thread-Index: AQHWaZb2Xv4RISU33E+0BkyOzrgC0g== Date: Mon, 3 Aug 2020 13:06:56 +0000 Message-ID: <4d009743-733a-9578-71b2-d320fdca9331@microchip.com> References: <20200803081851.102570-1-codrin.ciubotariu@microchip.com> <20200803081851.102570-2-codrin.ciubotariu@microchip.com> In-Reply-To: <20200803081851.102570-2-codrin.ciubotariu@microchip.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: user-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 authentication-results: microchip.com; dkim=none (message not signed) header.d=none;microchip.com; dmarc=none action=none header.from=microchip.com; x-originating-ip: [86.124.22.126] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 26f72aa7-d6a3-47e0-b6c5-08d837ae19e4 x-ms-traffictypediagnostic: DM5PR11MB1930: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-bypassexternaltag: True x-ms-oob-tlc-oobclassifiers: OLM:47; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: IqhWajqZAcLAF/se6/NI8rIYlmT55uVL/le6GBuZDf3L+5T0DHgJUhEDiuZQGFHEziiX8tp9WuwbCNJhKfrgmOjnq7VEAZI1Q280eS7CcYVGJdPu6zal0r8PxPi61AD+LFVobsR5+5T+bljTF/ifEg0+GJVYFYfi8xdK6rCowfnZw5wg3y/OgRpkTg0KhNHQms12uOp7T2lG0XfPOCi0S0a3m2Zl6AiZHf3U26STKliaDeFlv7JWtgVjqA9CvYpCE9rNBVXRonnQ8AzjCzHiA3BpbGzZgoUcqLTQ4VUsYFKFXO2l01KnbOAO7sT1oP0k7BrMoFo3qelAQGrrAStp6YLZVFLjimiavcUEujNj4dSw4SStkWQfmWLKTrXqGUAN x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR11MB3420.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(39860400002)(346002)(366004)(376002)(136003)(396003)(71200400001)(186003)(83380400001)(66946007)(2906002)(478600001)(86362001)(66446008)(64756008)(91956017)(76116006)(7416002)(31696002)(110136005)(31686004)(54906003)(53546011)(6506007)(66556008)(26005)(36756003)(66476007)(316002)(6512007)(30864003)(8676002)(6486002)(8936002)(4326008)(2616005)(5660300002)(43740500002)(579004)(559001); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata: yjnEvKxnfTZoydQst8YZNsAkheLwjl06evum8PdvhImoYtqY5m5/Z470cAOgOica1cj2h3rxfFBEoItJK9hPZt90rAqu28MI0Bk9Cfomm4fnAVN0E1FiWKYsxuLi2H0cEN4mjdjNbP1Hdlrv8u4BgKcAFmgr9a6p2LZ/oqLvm3OPokX59UNb/y4pucAFVK4fXLSboHIZ6uIBYfUaRjWY5dodWA/fYqoMXcbjwFXj0BvRFi4EJzDUTwwD0INsEljeS7o09TfmA1OSpK9pHTLCxiuoDlKhZC2b+QXvh+ZxPS8mC3EQkakfMkpaTe7HCOcss44MqgmZwER9eH/mXfooOsSfVvic36c2pCD59HnHnWgMI7kNnKx8MZ7HolWZsxvWt6/fHbShUp40GEkJoXy2EpMHo6ME4GvekyvVtPFXvjOAwRKEUERgDSkwaKjQY05yjlpsshGdVo6oLBjb2NsEpGGzoSBFWOEXUK+V1FL8kDUv4MnuPcN4TtTA0Y0GRh9abNTdSRjb9LtG1VnFDTI2Go++BV9L9YytFWtJi0po9EjdOi4qYNapGXd1AvqNTVoq+CIMRPBTnqaOQYj1irXYMgng8GxmVHch5zcFVFhDbQVcC6QG/AVhpU7FZRIUG4KFAAnyfrN4wWN9ccRqb11vlg== Content-ID: MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DM6PR11MB3420.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 26f72aa7-d6a3-47e0-b6c5-08d837ae19e4 X-MS-Exchange-CrossTenant-originalarrivaltime: 03 Aug 2020 13:06:56.9642 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3f4057f3-b418-4d4e-ba84-d55b4e897d88 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: k3afn8mp5+vevxtbh9HwxO8q4zNDj7yQHqMQO1yaxXNJMvMXipi1x8jsJiPXrpHX871k1y1YmP9vAyHaw+HwrhgObK3Xf30BCrbWBsQe1BY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR11MB1930 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200803_090704_562251_67597641 X-CRM114-Status: GOOD ( 24.63 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: alexandre.belloni@bootlin.com, broonie@kernel.org, lgirdwood@gmail.com, tiwai@suse.com, Ludovic.Desroches@microchip.com, robh+dt@kernel.org, perex@perex.cz Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On 03.08.2020 11:18, Codrin Ciubotariu wrote: > The new SPDIF TX controller is a serial port compliant with the IEC- > 60958 standard. It also supports programmable User Data and Channel > Status fields. > > This IP is embedded in Microchip's sama7g5 SoC. > > Signed-off-by: Codrin Ciubotariu > --- > > Changes in v2, v3: > - none; > > sound/soc/atmel/Kconfig | 12 + > sound/soc/atmel/Makefile | 2 + > sound/soc/atmel/mchp-spdiftx.c | 864 +++++++++++++++++++++++++++++++++ > 3 files changed, 878 insertions(+) > create mode 100644 sound/soc/atmel/mchp-spdiftx.c > > diff --git a/sound/soc/atmel/Kconfig b/sound/soc/atmel/Kconfig > index 71f2d42188c4..93beb7d670a3 100644 > --- a/sound/soc/atmel/Kconfig > +++ b/sound/soc/atmel/Kconfig > @@ -132,4 +132,16 @@ config SND_MCHP_SOC_I2S_MCC > and supports a Time Division Multiplexed (TDM) interface with > external multi-channel audio codecs. > > +config SND_MCHP_SOC_SPDIFTX > + tristate "Microchip ASoC driver for boards using S/PDIF TX" > + depends on OF && (ARCH_AT91 || COMPILE_TEST) > + select SND_SOC_GENERIC_DMAENGINE_PCM > + select REGMAP_MMIO > + help > + Say Y or M if you want to add support for Microchip S/PDIF TX ASoc > + driver on the following Microchip platforms: > + - sama7g5 > + > + This S/PDIF TX driver is compliant with IEC-60958 standard and > + includes programable User Data and Channel Status fields. > endif > diff --git a/sound/soc/atmel/Makefile b/sound/soc/atmel/Makefile > index c7d2989791be..3fd89a0063df 100644 > --- a/sound/soc/atmel/Makefile > +++ b/sound/soc/atmel/Makefile > @@ -5,6 +5,7 @@ snd-soc-atmel-pcm-dma-objs := atmel-pcm-dma.o > snd-soc-atmel_ssc_dai-objs := atmel_ssc_dai.o > snd-soc-atmel-i2s-objs := atmel-i2s.o > snd-soc-mchp-i2s-mcc-objs := mchp-i2s-mcc.o > +snd-soc-mchp-spdiftx-objs := mchp-spdiftx.o > > # pdc and dma need to both be built-in if any user of > # ssc is built-in. > @@ -17,6 +18,7 @@ endif > obj-$(CONFIG_SND_ATMEL_SOC_SSC) += snd-soc-atmel_ssc_dai.o > obj-$(CONFIG_SND_ATMEL_SOC_I2S) += snd-soc-atmel-i2s.o > obj-$(CONFIG_SND_MCHP_SOC_I2S_MCC) += snd-soc-mchp-i2s-mcc.o > +obj-$(CONFIG_SND_MCHP_SOC_SPDIFTX) += snd-soc-mchp-spdiftx.o > > # AT91 Machine Support > snd-soc-sam9g20-wm8731-objs := sam9g20_wm8731.o > diff --git a/sound/soc/atmel/mchp-spdiftx.c b/sound/soc/atmel/mchp-spdiftx.c > new file mode 100644 > index 000000000000..738f6788212e > --- /dev/null > +++ b/sound/soc/atmel/mchp-spdiftx.c > @@ -0,0 +1,864 @@ > +// SPDX-License-Identifier: GPL-2.0 > +// > +// Driver for Microchip S/PDIF TX Controller > +// > +// Copyright (C) 2020 Microchip Technology Inc. and its subsidiaries > +// > +// Author: Codrin Ciubotariu > + > +#include > +#include > +#include > +#include > + > +#include > +#include > +#include > +#include > + > +/* > + * ---- S/PDIF Transmitter Controller Register map ---- > + */ > +#define SPDIFTX_CR 0x00 /* Control Register */ > +#define SPDIFTX_MR 0x04 /* Mode Register */ This register is read/write either in atomic and non-atomic contextes but not protected everywhere the same way. > +#define SPDIFTX_CDR 0x0C /* Common Data Register */ > + > +#define SPDIFTX_IER 0x14 /* Interrupt Enable Register */ > +#define SPDIFTX_IDR 0x18 /* Interrupt Disable Register */ > +#define SPDIFTX_IMR 0x1C /* Interrupt Mask Register */ > +#define SPDIFTX_ISR 0x20 /* Interrupt Status Register */ > + > +#define SPDIFTX_CH1UD(reg) (0x50 + (reg) * 4) /* User Data 1 Register x */ > +#define SPDIFTX_CH1S(reg) (0x80 + (reg) * 4) /* Channel Status 1 Register x */ > + > +#define SPDIFTX_VERSION 0xF0 > + > +/* > + * ---- Control Register (Write-only) ---- > + */ > +#define SPDIFTX_CR_SWRST BIT(0) /* Software Reset */ > +#define SPDIFTX_CR_FCLR BIT(1) /* FIFO clear */ > + > +/* > + * ---- Mode Register (Read/Write) ---- > + */ > +/* Transmit Enable */ > +#define SPDIFTX_MR_TXEN_MASK GENMASK(0, 0) > +#define SPDIFTX_MR_TXEN_DISABLE (0 << 0) > +#define SPDIFTX_MR_TXEN_ENABLE (1 << 0) > + > +/* Multichannel Transfer */ > +#define SPDIFTX_MR_MULTICH_MASK GENAMSK(1, 1) > +#define SPDIFTX_MR_MULTICH_MONO (0 << 1) > +#define SPDIFTX_MR_MULTICH_DUAL (1 << 1) > + > +/* Data Word Endian Mode */ > +#define SPDIFTX_MR_ENDIAN_MASK GENMASK(2, 2) > +#define SPDIFTX_MR_ENDIAN_LITTLE (0 << 2) > +#define SPDIFTX_MR_ENDIAN_BIG (1 << 2) > + > +/* Data Justification */ > +#define SPDIFTX_MR_JUSTIFY_MASK GENMASK(3, 3) > +#define SPDIFTX_MR_JUSTIFY_LSB (0 << 3) > +#define SPDIFTX_MR_JUSTIFY_MSB (1 << 3) > + > +/* Common Audio Register Transfer Mode */ > +#define SPDIFTX_MR_CMODE_MASK GENMASK(5, 4) > +#define SPDIFTX_MR_CMODE_INDEX_ACCESS (0 << 4) > +#define SPDIFTX_MR_CMODE_TOGGLE_ACCESS (1 << 4) > +#define SPDIFTX_MR_CMODE_INTERLVD_ACCESS (2 << 4) > + > +/* Valid Bits per Sample */ > +#define SPDIFTX_MR_VBPS_MASK GENMASK(13, 8) > +#define SPDIFTX_MR_VBPS(bps) (((bps) << 8) & SPDIFTX_MR_VBPS_MASK) > + > +/* Chunk Size */ > +#define SPDIFTX_MR_CHUNK_MASK GENMASK(19, 16) > +#define SPDIFTX_MR_CHUNK(size) (((size) << 16) & SPDIFTX_MR_CHUNK_MASK) > + > +/* Validity Bits for Channels 1 and 2 */ > +#define SPDIFTX_MR_VALID1 BIT(24) > +#define SPDIFTX_MR_VALID2 BIT(25) > + > +/* Disable Null Frame on underrrun */ > +#define SPDIFTX_MR_DNFR_MASK GENMASK(27, 27) > +#define SPDIFTX_MR_DNFR_INVALID (0 << 27) > +#define SPDIFTX_MR_DNFR_VALID (1 << 27) > + > +/* Bytes per Sample */ > +#define SPDIFTX_MR_BPS_MASK GENMASK(29, 28) > +#define SPDIFTX_MR_BPS(bytes) \ > + ((((bytes) - 1) << 28) & SPDIFTX_MR_BPS_MASK) > + > +/* > + * ---- Interrupt Enable/Disable/Mask/Status Register (Write/Read-only) ---- > + */ > +#define SPDIFTX_IR_TXRDY BIT(0) > +#define SPDIFTX_IR_TXEMPTY BIT(1) > +#define SPDIFTX_IR_TXFULL BIT(2) > +#define SPDIFTX_IR_TXCHUNK BIT(3) > +#define SPDIFTX_IR_TXUDR BIT(4) > +#define SPDIFTX_IR_TXOVR BIT(5) > +#define SPDIFTX_IR_CSRDY BIT(6) > +#define SPDIFTX_IR_UDRDY BIT(7) > +#define SPDIFTX_IR_TXRDYCH(ch) BIT((ch) + 8) > +#define SPDIFTX_IR_SECE BIT(10) > +#define SPDIFTX_IR_TXUDRCH(ch) BIT((ch) + 11) > +#define SPDIFTX_IR_BEND BIT(13) > + > +static bool mchp_spdiftx_readable_reg(struct device *dev, unsigned int reg) > +{ > + switch (reg) { > + case SPDIFTX_MR: > + case SPDIFTX_IMR: > + case SPDIFTX_ISR: > + case SPDIFTX_CH1UD(0): > + case SPDIFTX_CH1UD(1): > + case SPDIFTX_CH1UD(2): > + case SPDIFTX_CH1UD(3): > + case SPDIFTX_CH1UD(4): > + case SPDIFTX_CH1UD(5): > + case SPDIFTX_CH1S(0): > + case SPDIFTX_CH1S(1): > + case SPDIFTX_CH1S(2): > + case SPDIFTX_CH1S(3): > + case SPDIFTX_CH1S(4): > + case SPDIFTX_CH1S(5): > + return true; > + default: > + return false; > + } > +} > + > +static bool mchp_spdiftx_writeable_reg(struct device *dev, unsigned int reg) > +{ > + switch (reg) { > + case SPDIFTX_CR: > + case SPDIFTX_MR: > + case SPDIFTX_CDR: > + case SPDIFTX_IER: > + case SPDIFTX_IDR: > + case SPDIFTX_CH1UD(0): > + case SPDIFTX_CH1UD(1): > + case SPDIFTX_CH1UD(2): > + case SPDIFTX_CH1UD(3): > + case SPDIFTX_CH1UD(4): > + case SPDIFTX_CH1UD(5): > + case SPDIFTX_CH1S(0): > + case SPDIFTX_CH1S(1): > + case SPDIFTX_CH1S(2): > + case SPDIFTX_CH1S(3): > + case SPDIFTX_CH1S(4): > + case SPDIFTX_CH1S(5): > + return true; > + default: > + return false; > + } > +} > + > +static bool mchp_spdiftx_precious_reg(struct device *dev, unsigned int reg) > +{ > + switch (reg) { > + case SPDIFTX_CDR: > + case SPDIFTX_ISR: > + return true; > + default: > + return false; > + } > +} > + > +static const struct regmap_config mchp_spdiftx_regmap_config = { > + .reg_bits = 32, > + .reg_stride = 4, > + .val_bits = 32, > + .max_register = SPDIFTX_VERSION, > + .readable_reg = mchp_spdiftx_readable_reg, > + .writeable_reg = mchp_spdiftx_writeable_reg, > + .precious_reg = mchp_spdiftx_precious_reg, > +}; > + > +#define SPDIFTX_GCLK_RATIO 128 > + > +#define SPDIFTX_CS_BITS 192 > +#define SPDIFTX_UD_BITS 192 > + > +struct mchp_spdiftx_mixer_control { > + unsigned char ch_stat[SPDIFTX_CS_BITS / 8]; > + unsigned char user_data[SPDIFTX_UD_BITS / 8]; > + spinlock_t lock; > +}; > + > +struct mchp_spdiftx_dev { > + struct mchp_spdiftx_mixer_control control; > + struct snd_dmaengine_dai_dma_data playback; > + struct device *dev; > + struct regmap *regmap; > + struct clk *pclk; > + struct clk *gclk; > + unsigned int fmt; > + const struct mchp_i2s_caps *caps; > + int gclk_enabled:1; > +}; > + > +static inline int mchp_spdiftx_is_running(struct mchp_spdiftx_dev *dev) > +{ > + u32 mr; > + > + regmap_read(dev->regmap, SPDIFTX_MR, &mr); > + return !!(mr & SPDIFTX_MR_TXEN_ENABLE); > +} > + > +static void mchp_spdiftx_channel_status_write(struct mchp_spdiftx_dev *dev) > +{ > + struct mchp_spdiftx_mixer_control *ctrl = &dev->control; > + u32 val; > + int i; > + > + for (i = 0; i < ARRAY_SIZE(ctrl->ch_stat) / 4; i++) { > + val = (ctrl->ch_stat[(i * 4) + 0] << 0) | > + (ctrl->ch_stat[(i * 4) + 1] << 8) | > + (ctrl->ch_stat[(i * 4) + 2] << 16) | > + (ctrl->ch_stat[(i * 4) + 3] << 24); > + > + regmap_write(dev->regmap, SPDIFTX_CH1S(i), val); > + } > +} > + > +static void mchp_spdiftx_user_data_write(struct mchp_spdiftx_dev *dev) > +{ > + struct mchp_spdiftx_mixer_control *ctrl = &dev->control; > + u32 val; > + int i; > + > + for (i = 0; i < ARRAY_SIZE(ctrl->user_data) / 4; i++) { > + val = (ctrl->user_data[(i * 4) + 0] << 0) | > + (ctrl->user_data[(i * 4) + 1] << 8) | > + (ctrl->user_data[(i * 4) + 2] << 16) | > + (ctrl->user_data[(i * 4) + 3] << 24); > + > + regmap_write(dev->regmap, SPDIFTX_CH1UD(i), val); > + } > +} > + > +static irqreturn_t mchp_spdiftx_interrupt(int irq, void *dev_id) > +{ > + struct mchp_spdiftx_dev *dev = dev_id; > + struct mchp_spdiftx_mixer_control *ctrl = &dev->control; > + u32 sr, imr, pending, idr = 0; > + > + regmap_read(dev->regmap, SPDIFTX_ISR, &sr); > + regmap_read(dev->regmap, SPDIFTX_IMR, &imr); > + pending = sr & imr; > + > + if (!pending) > + return IRQ_NONE; > + > + if (pending & SPDIFTX_IR_TXUDR) { > + dev_warn(dev->dev, "underflow detected\n"); > + idr |= SPDIFTX_IR_TXUDR; > + } > + > + if (pending & SPDIFTX_IR_TXOVR) { > + dev_warn(dev->dev, "overflow detected\n"); > + idr |= SPDIFTX_IR_TXOVR; > + } > + > + if (pending & SPDIFTX_IR_UDRDY) { > + spin_lock(&ctrl->lock); > + mchp_spdiftx_user_data_write(dev); > + spin_unlock(&ctrl->lock); > + idr |= SPDIFTX_IR_UDRDY; > + } > + > + if (pending & SPDIFTX_IR_CSRDY) { > + spin_lock(&ctrl->lock); > + mchp_spdiftx_channel_status_write(dev); > + spin_unlock(&ctrl->lock); > + idr |= SPDIFTX_IR_CSRDY; > + } > + > + regmap_write(dev->regmap, SPDIFTX_IDR, idr); > + > + return IRQ_HANDLED; > +} > + > +static int mchp_spdiftx_dai_startup(struct snd_pcm_substream *substream, > + struct snd_soc_dai *dai) > +{ > + struct mchp_spdiftx_dev *dev = snd_soc_dai_get_drvdata(dai); > + int err; > + > + err = clk_prepare_enable(dev->pclk); > + if (err) { > + dev_err(dev->dev, > + "failed to enable the peripheral clock: %d\n", err); > + return err; > + } > + > + /* Software reset the IP */ > + regmap_write(dev->regmap, SPDIFTX_CR, > + SPDIFTX_CR_SWRST | SPDIFTX_CR_FCLR); > + > + return 0; > +} > + > +static void mchp_spdiftx_dai_shutdown(struct snd_pcm_substream *substream, > + struct snd_soc_dai *dai) > +{ > + struct mchp_spdiftx_dev *dev = snd_soc_dai_get_drvdata(dai); > + > + /* Disable interrupts */ > + regmap_write(dev->regmap, SPDIFTX_IDR, 0xffffffff); > + > + clk_disable_unprepare(dev->pclk); > +} > + > +static int mchp_spdiftx_trigger(struct snd_pcm_substream *substream, int cmd, > + struct snd_soc_dai *dai) > +{ > + struct mchp_spdiftx_dev *dev = snd_soc_dai_get_drvdata(dai); > + struct mchp_spdiftx_mixer_control *ctrl = &dev->control; > + u32 mr; > + int running; > + int ret; > + > + /* do not start/stop while channel status or user data is updated */ > + spin_lock(&ctrl->lock); > + regmap_read(dev->regmap, SPDIFTX_MR, &mr); Here, atomic, for instance. > + running = !!(mr & SPDIFTX_MR_TXEN_ENABLE); > + > + switch (cmd) { > + case SNDRV_PCM_TRIGGER_START: > + case SNDRV_PCM_TRIGGER_RESUME: > + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: > + if (!running) { > + mr &= ~SPDIFTX_MR_TXEN_MASK; > + mr |= SPDIFTX_MR_TXEN_ENABLE; > + } > + break; > + case SNDRV_PCM_TRIGGER_STOP: > + case SNDRV_PCM_TRIGGER_SUSPEND: > + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: > + if (running) { > + mr &= ~SPDIFTX_MR_TXEN_MASK; > + mr |= SPDIFTX_MR_TXEN_DISABLE; > + } > + break; > + default: > + spin_unlock(&ctrl->lock); > + return -EINVAL; > + } > + > + ret = regmap_write(dev->regmap, SPDIFTX_MR, mr); > + spin_unlock(&ctrl->lock); > + if (ret) { > + dev_err(dev->dev, "unable to disable TX: %d\n", ret); > + return ret; > + } > + > + return 0; > +} > + > +static int mchp_spdiftx_hw_params(struct snd_pcm_substream *substream, > + struct snd_pcm_hw_params *params, > + struct snd_soc_dai *dai) > +{ > + unsigned long flags; > + struct mchp_spdiftx_dev *dev = snd_soc_dai_get_drvdata(dai); > + struct mchp_spdiftx_mixer_control *ctrl = &dev->control; > + u32 mr; > + unsigned int bps = params_physical_width(params) / 8; > + int ret; > + > + dev_dbg(dev->dev, "%s() rate=%u format=%#x width=%u channels=%u\n", > + __func__, params_rate(params), params_format(params), > + params_width(params), params_channels(params)); > + > + if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { > + dev_err(dev->dev, "Capture is not supported\n"); > + return -EINVAL; > + } > + > + regmap_read(dev->regmap, SPDIFTX_MR, &mr); Here non-atomic. > + > + if (mr & SPDIFTX_MR_TXEN_ENABLE) { > + dev_err(dev->dev, "PCM already running\n"); > + return -EBUSY; > + } > + > + /* Defaults: Toggle mode, justify to LSB, chunksize 1 */ > + mr = SPDIFTX_MR_CMODE_TOGGLE_ACCESS | SPDIFTX_MR_JUSTIFY_LSB; > + dev->playback.maxburst = 1; > + switch (params_channels(params)) { > + case 1: > + mr |= SPDIFTX_MR_MULTICH_MONO; > + break; > + case 2: > + mr |= SPDIFTX_MR_MULTICH_DUAL; > + if (bps > 2) > + dev->playback.maxburst = 2; > + break; > + default: > + dev_err(dev->dev, "unsupported number of channels: %d\n", > + params_channels(params)); > + return -EINVAL; > + } > + mr |= SPDIFTX_MR_CHUNK(dev->playback.maxburst); > + > + switch (params_format(params)) { > + case SNDRV_PCM_FORMAT_S8: > + mr |= SPDIFTX_MR_VBPS(8); > + break; > + case SNDRV_PCM_FORMAT_S16_BE: > + mr |= SPDIFTX_MR_ENDIAN_BIG; > + fallthrough; > + case SNDRV_PCM_FORMAT_S16_LE: > + mr |= SPDIFTX_MR_VBPS(16); > + break; > + case SNDRV_PCM_FORMAT_S18_3BE: > + mr |= SPDIFTX_MR_ENDIAN_BIG; > + fallthrough; > + case SNDRV_PCM_FORMAT_S18_3LE: > + mr |= SPDIFTX_MR_VBPS(18); > + break; > + case SNDRV_PCM_FORMAT_S20_3BE: > + mr |= SPDIFTX_MR_ENDIAN_BIG; > + fallthrough; > + case SNDRV_PCM_FORMAT_S20_3LE: > + mr |= SPDIFTX_MR_VBPS(20); > + break; > + case SNDRV_PCM_FORMAT_S24_3BE: > + mr |= SPDIFTX_MR_ENDIAN_BIG; > + fallthrough; > + case SNDRV_PCM_FORMAT_S24_3LE: > + mr |= SPDIFTX_MR_VBPS(24); > + break; > + case SNDRV_PCM_FORMAT_S24_BE: > + mr |= SPDIFTX_MR_ENDIAN_BIG; > + fallthrough; > + case SNDRV_PCM_FORMAT_S24_LE: > + mr |= SPDIFTX_MR_VBPS(24); > + break; > + case SNDRV_PCM_FORMAT_S32_BE: > + mr |= SPDIFTX_MR_ENDIAN_BIG; > + fallthrough; > + case SNDRV_PCM_FORMAT_S32_LE: > + mr |= SPDIFTX_MR_VBPS(32); > + break; > + default: > + dev_err(dev->dev, "unsupported PCM format: %d\n", > + params_format(params)); > + return -EINVAL; > + } > + > + mr |= SPDIFTX_MR_BPS(bps); > + > + spin_lock_irqsave(&ctrl->lock, flags); > + ctrl->ch_stat[3] &= ~IEC958_AES3_CON_FS; > + switch (params_rate(params)) { > + case 22050: > + ctrl->ch_stat[3] |= IEC958_AES3_CON_FS_22050; > + break; > + case 24000: > + ctrl->ch_stat[3] |= IEC958_AES3_CON_FS_24000; > + break; > + case 32000: > + ctrl->ch_stat[3] |= IEC958_AES3_CON_FS_32000; > + break; > + case 44100: > + ctrl->ch_stat[3] |= IEC958_AES3_CON_FS_44100; > + break; > + case 48000: > + ctrl->ch_stat[3] |= IEC958_AES3_CON_FS_48000; > + break; > + case 88200: > + ctrl->ch_stat[3] |= IEC958_AES3_CON_FS_88200; > + break; > + case 96000: > + ctrl->ch_stat[3] |= IEC958_AES3_CON_FS_96000; > + break; > + case 176400: > + ctrl->ch_stat[3] |= IEC958_AES3_CON_FS_176400; > + break; > + case 192000: > + ctrl->ch_stat[3] |= IEC958_AES3_CON_FS_192000; > + break; > + case 8000: > + case 11025: > + case 16000: > + case 64000: > + ctrl->ch_stat[3] |= IEC958_AES3_CON_FS_NOTID; > + break; > + default: > + dev_err(dev->dev, "unsupported sample frequency: %u\n", > + params_rate(params)); > + spin_unlock_irqrestore(&ctrl->lock, flags); > + return -EINVAL; > + } > + mchp_spdiftx_channel_status_write(dev); > + spin_unlock_irqrestore(&ctrl->lock, flags); > + mr |= SPDIFTX_MR_VALID1 | SPDIFTX_MR_VALID2; > + > + if (dev->gclk_enabled) { > + clk_disable_unprepare(dev->gclk); > + dev->gclk_enabled = 0; > + } > + ret = clk_set_rate(dev->gclk, params_rate(params) * > + SPDIFTX_GCLK_RATIO); > + if (ret) { > + dev_err(dev->dev, > + "unable to change gclk rate to: rate %u * ratio %u\n", > + params_rate(params), SPDIFTX_GCLK_RATIO); > + return ret; > + } > + ret = clk_prepare_enable(dev->gclk); > + if (ret) { > + dev_err(dev->dev, "unable to enable gclk: %d\n", ret); > + return ret; > + } > + dev->gclk_enabled = 1; > + dev_dbg(dev->dev, "%s(): GCLK set to %d\n", __func__, > + params_rate(params) * SPDIFTX_GCLK_RATIO); > + > + /* Enable interrupts */ > + regmap_write(dev->regmap, SPDIFTX_IER, > + SPDIFTX_IR_TXUDR | SPDIFTX_IR_TXOVR); > + > + regmap_write(dev->regmap, SPDIFTX_MR, mr); Same here. > + > + return 0; > +} > + > +static int mchp_spdiftx_hw_free(struct snd_pcm_substream *substream, > + struct snd_soc_dai *dai) > +{ > + struct mchp_spdiftx_dev *dev = snd_soc_dai_get_drvdata(dai); > + > + regmap_write(dev->regmap, SPDIFTX_IDR, > + SPDIFTX_IR_TXUDR | SPDIFTX_IR_TXOVR); > + if (dev->gclk_enabled) { > + clk_disable_unprepare(dev->gclk); > + dev->gclk_enabled = 0; > + } > + > + return regmap_write(dev->regmap, SPDIFTX_CR, > + SPDIFTX_CR_SWRST | SPDIFTX_CR_FCLR); > +} > + > + > +static const struct snd_soc_dai_ops mchp_spdiftx_dai_ops = { > + .startup = mchp_spdiftx_dai_startup, > + .shutdown = mchp_spdiftx_dai_shutdown, > + .trigger = mchp_spdiftx_trigger, > + .hw_params = mchp_spdiftx_hw_params, > + .hw_free = mchp_spdiftx_hw_free, > +}; > + > +#define MCHP_SPDIFTX_RATES SNDRV_PCM_RATE_8000_192000 > + > +#define MCHP_SPDIFTX_FORMATS (SNDRV_PCM_FMTBIT_S8 | \ > + SNDRV_PCM_FMTBIT_S16_LE | \ > + SNDRV_PCM_FMTBIT_U16_BE | \ > + SNDRV_PCM_FMTBIT_S18_3LE | \ > + SNDRV_PCM_FMTBIT_S18_3BE | \ > + SNDRV_PCM_FMTBIT_S20_3LE | \ > + SNDRV_PCM_FMTBIT_S20_3BE | \ > + SNDRV_PCM_FMTBIT_S24_3LE | \ > + SNDRV_PCM_FMTBIT_S24_3BE | \ > + SNDRV_PCM_FMTBIT_S24_LE | \ > + SNDRV_PCM_FMTBIT_S24_BE | \ > + SNDRV_PCM_FMTBIT_S32_LE | \ > + SNDRV_PCM_FMTBIT_S32_BE \ > + ) > + > +static int mchp_spdiftx_info(struct snd_kcontrol *kcontrol, > + struct snd_ctl_elem_info *uinfo) > +{ > + uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; > + uinfo->count = 1; > + > + return 0; > +} > + > +static int mchp_spdiftx_cs_get(struct snd_kcontrol *kcontrol, > + struct snd_ctl_elem_value *uvalue) > +{ > + unsigned long flags; > + struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol); > + struct mchp_spdiftx_dev *dev = snd_soc_dai_get_drvdata(dai); > + struct mchp_spdiftx_mixer_control *ctrl = &dev->control; > + > + spin_lock_irqsave(&ctrl->lock, flags); > + memcpy(uvalue->value.iec958.status, ctrl->ch_stat, > + sizeof(ctrl->ch_stat)); > + spin_unlock_irqrestore(&ctrl->lock, flags); > + > + return 0; > +} > + > +static int mchp_spdiftx_cs_put(struct snd_kcontrol *kcontrol, > + struct snd_ctl_elem_value *uvalue) > +{ > + unsigned long flags; > + struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol); > + struct mchp_spdiftx_dev *dev = snd_soc_dai_get_drvdata(dai); > + struct mchp_spdiftx_mixer_control *ctrl = &dev->control; > + int changed = 0; > + int i; > + > + spin_lock_irqsave(&ctrl->lock, flags); > + for (i = 0; i < ARRAY_SIZE(ctrl->ch_stat); i++) { > + if (ctrl->ch_stat[i] != uvalue->value.iec958.status[i]) > + changed = 1; > + ctrl->ch_stat[i] = uvalue->value.iec958.status[i]; > + } > + > + if (changed) { > + /* don't enable IP while we copy the channel status */ > + if (mchp_spdiftx_is_running(dev)) { > + /* > + * if SPDIF is running, wait for interrupt to write > + * channel status > + */ > + regmap_write(dev->regmap, SPDIFTX_IER, > + SPDIFTX_IR_CSRDY); > + } else { > + mchp_spdiftx_channel_status_write(dev); > + } > + } > + spin_unlock_irqrestore(&ctrl->lock, flags); > + > + return changed; > +} > + > +static int mchp_spdiftx_cs_mask(struct snd_kcontrol *kcontrol, > + struct snd_ctl_elem_value *uvalue) > +{ > + memset(uvalue->value.iec958.status, 0xff, > + sizeof(uvalue->value.iec958.status)); > + > + return 0; > +} > + > +static int mchp_spdiftx_subcode_get(struct snd_kcontrol *kcontrol, > + struct snd_ctl_elem_value *uvalue) > +{ > + struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol); > + struct mchp_spdiftx_dev *dev = snd_soc_dai_get_drvdata(dai); > + struct mchp_spdiftx_mixer_control *ctrl = &dev->control; > + unsigned long flags; > + > + spin_lock_irqsave(&ctrl->lock, flags); > + memcpy(uvalue->value.iec958.subcode, ctrl->user_data, > + sizeof(ctrl->user_data)); > + spin_unlock_irqrestore(&ctrl->lock, flags); > + > + return 0; > +} > + > +static int mchp_spdiftx_subcode_put(struct snd_kcontrol *kcontrol, > + struct snd_ctl_elem_value *uvalue) > +{ > + unsigned long flags; > + struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol); > + struct mchp_spdiftx_dev *dev = snd_soc_dai_get_drvdata(dai); > + struct mchp_spdiftx_mixer_control *ctrl = &dev->control; > + int changed = 0; > + int i; > + > + spin_lock_irqsave(&ctrl->lock, flags); > + for (i = 0; i < ARRAY_SIZE(ctrl->user_data); i++) { > + if (ctrl->user_data[i] != uvalue->value.iec958.subcode[i]) > + changed = 1; > + > + ctrl->user_data[i] = uvalue->value.iec958.subcode[i]; > + } > + if (changed) { > + if (mchp_spdiftx_is_running(dev)) { > + /* > + * if SPDIF is running, wait for interrupt to write > + * user data > + */ > + regmap_write(dev->regmap, SPDIFTX_IER, > + SPDIFTX_IR_UDRDY); > + } else { > + mchp_spdiftx_user_data_write(dev); > + } > + } > + spin_unlock_irqrestore(&ctrl->lock, flags); > + > + return changed; > +} > + > +static struct snd_kcontrol_new mchp_spdiftx_ctrls[] = { > + /* Channel status controller */ > + { > + .iface = SNDRV_CTL_ELEM_IFACE_PCM, > + .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT), > + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | > + SNDRV_CTL_ELEM_ACCESS_VOLATILE, > + .info = mchp_spdiftx_info, > + .get = mchp_spdiftx_cs_get, > + .put = mchp_spdiftx_cs_put, > + }, > + { > + .iface = SNDRV_CTL_ELEM_IFACE_PCM, > + .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, MASK), > + .access = SNDRV_CTL_ELEM_ACCESS_READ, > + SNDRV_CTL_ELEM_ACCESS_VOLATILE, > + .info = mchp_spdiftx_info, > + .get = mchp_spdiftx_cs_mask, > + }, > + /* User bits controller */ > + { > + .iface = SNDRV_CTL_ELEM_IFACE_PCM, > + .name = "IEC958 Subcode Playback Default", > + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, > + .info = mchp_spdiftx_info, > + .get = mchp_spdiftx_subcode_get, > + .put = mchp_spdiftx_subcode_put, > + }, > +}; > + > +static int mchp_spdiftx_dai_probe(struct snd_soc_dai *dai) > +{ > + struct mchp_spdiftx_dev *dev = snd_soc_dai_get_drvdata(dai); > + > + snd_soc_dai_init_dma_data(dai, &dev->playback, NULL); > + > + /* Add controls */ > + snd_soc_add_dai_controls(dai, mchp_spdiftx_ctrls, > + ARRAY_SIZE(mchp_spdiftx_ctrls)); > + > + return 0; > +} > + > +static struct snd_soc_dai_driver mchp_spdiftx_dai = { > + .name = "mchp-spdiftx", > + .probe = mchp_spdiftx_dai_probe, > + .playback = { > + .stream_name = "S/PDIF TX Playback", > + .channels_min = 1, > + .channels_max = 2, > + .rates = MCHP_SPDIFTX_RATES, > + .formats = MCHP_SPDIFTX_FORMATS, > + }, > + .ops = &mchp_spdiftx_dai_ops, > +}; > + > +static const struct snd_soc_component_driver mchp_spdiftx_component = { > + .name = "mchp-spdiftx", > +}; > + > +static const struct of_device_id mchp_spdiftx_dt_ids[] = { > + { > + .compatible = "microchip,sama7g5-spdiftx", > + }, > + { /* sentinel */ } > +}; > + > +MODULE_DEVICE_TABLE(of, mchp_spdiftx_dt_ids); > +static int mchp_spdiftx_probe(struct platform_device *pdev) > +{ > + struct device_node *np = pdev->dev.of_node; > + const struct of_device_id *match; > + struct mchp_spdiftx_dev *dev; > + struct resource *mem; > + struct regmap *regmap; > + void __iomem *base; > + struct mchp_spdiftx_mixer_control *ctrl; > + int irq; > + int err; > + > + /* Get memory for driver data. */ > + dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); > + if (!dev) > + return -ENOMEM; > + > + /* Get hardware capabilities. */ > + match = of_match_node(mchp_spdiftx_dt_ids, np); > + if (match) > + dev->caps = match->data; > + > + /* Map I/O registers. */ > + base = devm_platform_get_and_ioremap_resource(pdev, 0, &mem); > + if (IS_ERR(base)) > + return PTR_ERR(base); > + > + regmap = devm_regmap_init_mmio(&pdev->dev, base, > + &mchp_spdiftx_regmap_config); > + if (IS_ERR(regmap)) > + return PTR_ERR(regmap); > + > + /* Request IRQ */ > + irq = platform_get_irq(pdev, 0); > + if (irq < 0) > + return irq; > + > + err = devm_request_irq(&pdev->dev, irq, mchp_spdiftx_interrupt, 0, > + dev_name(&pdev->dev), dev); > + if (err) > + return err; > + > + /* Get the peripheral clock */ > + dev->pclk = devm_clk_get(&pdev->dev, "pclk"); > + if (IS_ERR(dev->pclk)) { > + err = PTR_ERR(dev->pclk); > + dev_err(&pdev->dev, > + "failed to get the peripheral clock: %d\n", err); > + return err; > + } > + > + /* Get the generic clock */ > + dev->gclk = devm_clk_get(&pdev->dev, "gclk"); > + if (IS_ERR(dev->gclk)) { > + err = PTR_ERR(dev->gclk); > + dev_err(&pdev->dev, > + "failed to get the PMC generic clock: %d\n", err); > + return err; > + } > + > + ctrl = &dev->control; > + spin_lock_init(&ctrl->lock); > + > + /* Init channel status */ > + ctrl->ch_stat[0] = IEC958_AES0_CON_NOT_COPYRIGHT | > + IEC958_AES0_CON_EMPHASIS_NONE; > + > + dev->dev = &pdev->dev; > + dev->regmap = regmap; > + platform_set_drvdata(pdev, dev); > + > + dev->playback.addr = (dma_addr_t)mem->start + SPDIFTX_CDR; > + dev->playback.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; > + > + err = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); > + if (err) { > + dev_err(&pdev->dev, "failed to register PMC: %d\n", err); > + return err; > + } > + > + err = devm_snd_soc_register_component(&pdev->dev, > + &mchp_spdiftx_component, > + &mchp_spdiftx_dai, 1); > + if (err) { > + dev_err(&pdev->dev, "failed to register component: %d\n", err); > + return err; > + } > + > + return 0; > +} > + > +static struct platform_driver mchp_spdiftx_driver = { > + .probe = mchp_spdiftx_probe, > + .driver = { > + .name = "mchp_spdiftx", > + .of_match_table = of_match_ptr(mchp_spdiftx_dt_ids), > + }, > +}; > + > +module_platform_driver(mchp_spdiftx_driver); > + > +MODULE_AUTHOR("Codrin Ciubotariu "); > +MODULE_DESCRIPTION("Microchip S/PDIF TX Controller Driver"); > +MODULE_LICENSE("GPL v2"); > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel