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=-9.5 required=3.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 742AFC433E1 for ; Tue, 18 Aug 2020 17:44:09 +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 333CE2054F for ; Tue, 18 Aug 2020 17:44:09 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="Zz8cXfbj"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="QxZZZFfq" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 333CE2054F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.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:In-Reply-To:MIME-Version:References:Message-ID: Subject:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=0+rs3vZsw/l+a+LE6vtV0w56jvGlYt8yMEhDvRf1H3Y=; b=Zz8cXfbjz1k1uAgk7oBCulnI8 RUJIO1v0AmGoTNQH2S71tCzNBKcUbnQ08fPzouwkJVkBKDLroQ54yiPE7NRSCOKHfQkEqtE3mddbo d9IhHNh6d5rgd/aAYz7j9EIuwTc97Vpta0DPROsN7/YsXnL0nAZF89SgwyRPMYrI7vBspQA02GjMZ Hcak9PvdoxiN+0LoYGpg4TUIL8XHjnFOCxx5exK4cM0u0eZjpVxDy2C3Ay4N0K0n1n6kA0rzOSEks vVsjYK7Isw2EreEPejilcUR8fjTHY2jgIenSfVz/bIc/b148ZvsmKJ7hzuQgL6Pk3Vy5JS6Jdz9sS w1zm6BjUg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1k85dJ-0003BC-VZ; Tue, 18 Aug 2020 17:42:50 +0000 Received: from mail-ej1-x641.google.com ([2a00:1450:4864:20::641]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1k85dH-00037D-QR; Tue, 18 Aug 2020 17:42:48 +0000 Received: by mail-ej1-x641.google.com with SMTP id a26so23103285ejc.2; Tue, 18 Aug 2020 10:42:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=RLSht3RIYrYvOJyCZb8S7UriIeq7yTfzTMH9GBL0tvg=; b=QxZZZFfquhXE5HEZVH6teiE3YKTcoBY284GURrd+CRJYbxzkoO5THrlf1DL/ZLd36v wqDGhZosENshPvyAOCNMAUpZjTyrkqMMCa/ge6g+IVd2k48+ABW8T1Xm9/dXHLCypSnE 9lgO8sm9bD50EanbVtx/v76/EEZNDrzhZ44q2uS3Z27ktG5WhmcLKg26XOG6GP6Ncdr6 u6d/DCmOwlPUUENx3PjfSO0MM1qQ+gOmuqyKO+Nt6MNwplUxguHquLWA69dNYGz/206l zdl59eEaFiXfYMddhK8GvrXRRPWBH6HzZBW8CMdV1twCp24wTAjJW/9LwVerXhnNX3Wm WM2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=RLSht3RIYrYvOJyCZb8S7UriIeq7yTfzTMH9GBL0tvg=; b=YDtg9+Ub1enXVMx51jTWkjzws2ToZDHypFeXVvsvlraqkYAU/w0oT439g14OD5RMI1 7cTSpwE9nYj9Rc6m9MfSd+ksTtneQAMBq35kjRDnIG4ZPRuT+tFIe6dJtVGg3EUDnpQp MOGaQuZywLxH8T4AaS3oBfy6N4DeLwmeVDtWxpvz5TOrjNiOqhv/L9VeHGAxh9ObEkiB 9An3DalAo3bJxHBOuuB7omAU6GMllgdZMWP3ms5Rd79Ehvov/uy3xLMHjIDmB4r3gy35 4Gl8PRRWGc1PUODrH4Nah5j38cQ9C1m/XyOIZ/LbhvYjHmPLd3BOiYmZi5UB58Qw8q2b rFAQ== X-Gm-Message-State: AOAM533oRzeDFVpKnh6W65peqhBGUlwpp+d+GDU6K3+4+uua18TOfpc9 o4kJsriZNwH1piSPIqhZ3zk= X-Google-Smtp-Source: ABdhPJyIaAtcVFg7kwhJNMU96Jc6xlED3L5/1oRcb9KAJJXt7rs8hbxMiUz7JCjj9SH8gZMlh9/PnQ== X-Received: by 2002:a17:906:a18e:: with SMTP id s14mr20824421ejy.168.1597772564730; Tue, 18 Aug 2020 10:42:44 -0700 (PDT) Received: from BV030612LT ([188.24.144.238]) by smtp.gmail.com with ESMTPSA id u13sm17168211eje.9.2020.08.18.10.42.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Aug 2020 10:42:43 -0700 (PDT) Date: Tue, 18 Aug 2020 20:42:41 +0300 From: Cristian Ciocaltea To: Marc Zyngier Subject: Re: [PATCH v4 2/3] irqchip: Add Actions Semi Owl SIRQ controller Message-ID: <20200818174241.GA2020288@BV030612LT> References: <8e43fe6c6246bfd5347dc21b6f5c3f50@kernel.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <8e43fe6c6246bfd5347dc21b6f5c3f50@kernel.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200818_134247_903562_B683E056 X-CRM114-Status: GOOD ( 43.46 ) 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: devicetree@vger.kernel.org, Jason Cooper , linux-actions@lists.infradead.org, linux-kernel@vger.kernel.org, Rob Herring , Manivannan Sadhasivam , Thomas Gleixner , Andreas =?iso-8859-1?Q?F=E4rber?= , linux-arm-kernel@lists.infradead.org, Saravanan Sekar Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgTWFyYywKClRoYW5rcyBmb3IgeW91ciBxdWljayBhbmQgZGV0YWlsZWQgcmV2aWV3IQoKT24g TW9uLCBBdWcgMTcsIDIwMjAgYXQgMDI6NTI6MDZQTSArMDEwMCwgTWFyYyBaeW5naWVyIHdyb3Rl Ogo+IE9uIDIwMjAtMDgtMTYgMTI6MzMsIENyaXN0aWFuIENpb2NhbHRlYSB3cm90ZToKPiA+IFRo aXMgY29udHJvbGxlciBhcHBlYXJzIG9uIEFjdGlvbnMgU2VtaSBPd2wgZmFtaWx5IFNvQydzIFM1 MDAsIFM3MDAgYW5kCj4gPiBTOTAwIGFuZCBwcm92aWRlcyBzdXBwb3J0IGZvciAzIGV4dGVybmFs IGludGVycnVwdCBjb250cm9sbGVycyB0aHJvdWdoCj4gCj4gSXMgdGhhdCByZWFsbHkgMyBpbnRl cnJ1cHQgY29udHJvbGxlcnM/IE9yIG1lcmVseSAzIGludGVycnVwdCBsaW5lcz8KClRoaXMgaXMg bW9zdGx5IGEgbGVmdG92ZXIgc3RhdGVtZW50IGZyb20gdGhlIHByZXZpb3VzIHBhdGNoIHJldmlz aW9uLgpJIHdpbGwgY2hhbmdlIGl0IHRvIHNvbWV0aGluZyBsaWtlOgoKIlRoaXMgaW50ZXJydXB0 IGNvbnRyb2xsZXIgaXMgZm91bmQgaW4gdGhlIEFjdGlvbnMgU2VtaSBPd2wgU29DcyAoUzUwMCwK UzcwMCBhbmQgUzkwMCkgYW5kIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGhhbmRsaW5nIHVwIHRvIDMg ZXh0ZXJuYWwKaW50ZXJydXB0IGxpbmVzLiIKCj4gPiBkZWRpY2F0ZWQgU0lSUSBwaW5zLgo+ID4g Cj4gPiBFYWNoIGxpbmUgY2FuIGJlIGluZGVwZW5kZW50bHkgY29uZmlndXJlZCBhcyBpbnRlcnJ1 cHQgYW5kIHRyaWdnZXJzCj4gPiBvbiBlaXRoZXIgb2YgdGhlIGVkZ2VzIChyYWlzaW5nIG9yIGZh bGxpbmcpIG9yIGVpdGhlciBvZiB0aGUgbGV2ZWxzCj4gPiAoaGlnaCBvciBsb3cpLiBFYWNoIGxp bmUgY2FuIGFsc28gYmUgbWFza2VkIGluZGVwZW5kZW50bHkuCj4gPiAKPiA+IFRoaXMgaXMgYmFz ZWQgb24gdGhlIHBhdGNoIHNlcmllcyBzdWJtaXR0ZWQgYnkgUGFydGhpYmFuIE5hbGxhdGhhbWJp Ogo+ID4gaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvbGttbC8yMDE4MTEyNjEwMDM1Ni4yODQwNTc4 LTEtcG5AZGVueC5kZS8KPiA+IAo+ID4gU2lnbmVkLW9mZi1ieTogUGFydGhpYmFuIE5hbGxhdGhh bWJpIDxwbkBkZW54LmRlPgo+ID4gU2lnbmVkLW9mZi1ieTogU2FyYXZhbmFuIFNla2FyIDxzcmF2 YW5ob21lQGdtYWlsLmNvbT4KPiA+IFtjcmlzdGk6IG9wdGltaXplZCBEVCwgdmFyaW91cyBmaXhl cy9jbGVhbnVwcy9pbXByb3ZlbWVudHNdCj4gPiBTaWduZWQtb2ZmLWJ5OiBDcmlzdGlhbiBDaW9j YWx0ZWEgPGNyaXN0aWFuLmNpb2NhbHRlYUBnbWFpbC5jb20+Cj4gPiAtLS0KPiA+ICBkcml2ZXJz L2lycWNoaXAvTWFrZWZpbGUgICAgICAgfCAgIDEgKwo+ID4gIGRyaXZlcnMvaXJxY2hpcC9pcnEt b3dsLXNpcnEuYyB8IDMxOCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKPiA+ICAy IGZpbGVzIGNoYW5nZWQsIDMxOSBpbnNlcnRpb25zKCspCj4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0 IGRyaXZlcnMvaXJxY2hpcC9pcnEtb3dsLXNpcnEuYwo+ID4gCj4gPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9pcnFjaGlwL01ha2VmaWxlIGIvZHJpdmVycy9pcnFjaGlwL01ha2VmaWxlCj4gPiBpbmRl eCAxMzNmOWM0NTc0NGEuLmI4ZWI1YjhiNzY2ZCAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvaXJx Y2hpcC9NYWtlZmlsZQo+ID4gKysrIGIvZHJpdmVycy9pcnFjaGlwL01ha2VmaWxlCj4gPiBAQCAt Nyw2ICs3LDcgQEAgb2JqLSQoQ09ORklHX0FUSDc5KQkJCSs9IGlycS1hdGg3OS1jcHUubwo+ID4g IG9iai0kKENPTkZJR19BVEg3OSkJCQkrPSBpcnEtYXRoNzktbWlzYy5vCj4gPiAgb2JqLSQoQ09O RklHX0FSQ0hfQkNNMjgzNSkJCSs9IGlycS1iY20yODM1Lm8KPiA+ICBvYmotJChDT05GSUdfQVJD SF9CQ00yODM1KQkJKz0gaXJxLWJjbTI4MzYubwo+ID4gK29iai0kKENPTkZJR19BUkNIX0FDVElP TlMpCQkrPSBpcnEtb3dsLXNpcnEubwo+ID4gIG9iai0kKENPTkZJR19EQVZJTkNJX0FJTlRDKQkJ Kz0gaXJxLWRhdmluY2ktYWludGMubwo+ID4gIG9iai0kKENPTkZJR19EQVZJTkNJX0NQX0lOVEMp CQkrPSBpcnEtZGF2aW5jaS1jcC1pbnRjLm8KPiA+ICBvYmotJChDT05GSUdfRVhZTk9TX0lSUV9D T01CSU5FUikJKz0gZXh5bm9zLWNvbWJpbmVyLm8KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2ly cWNoaXAvaXJxLW93bC1zaXJxLmMKPiA+IGIvZHJpdmVycy9pcnFjaGlwL2lycS1vd2wtc2lycS5j Cj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gaW5kZXggMDAwMDAwMDAwMDAwLi4yOWI3ZmZj NDBhYzcKPiA+IC0tLSAvZGV2L251bGwKPiA+ICsrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtb3ds LXNpcnEuYwo+ID4gQEAgLTAsMCArMSwzMTggQEAKPiA+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRp ZmllcjogR1BMLTIuMCsKPiA+ICsvKgo+ID4gKyAqIEFjdGlvbnMgU2VtaSBPd2wgU29DcyBTSVJR IGludGVycnVwdCBjb250cm9sbGVyIGRyaXZlcgo+ID4gKyAqCj4gPiArICogQ29weXJpZ2h0IChD KSAyMDE0IEFjdGlvbnMgU2VtaSBJbmMuCj4gPiArICogRGF2aWQgTGl1IDxsaXV3ZWlAYWN0aW9u cy1zZW1pLmNvbT4KPiA+ICsgKgo+ID4gKyAqIEF1dGhvcjogUGFydGhpYmFuIE5hbGxhdGhhbWJp IDxwbkBkZW54LmRlPgo+ID4gKyAqIEF1dGhvcjogU2FyYXZhbmFuIFNla2FyIDxzcmF2YW5ob21l QGdtYWlsLmNvbT4KPiA+ICsgKiBBdXRob3I6IENyaXN0aWFuIENpb2NhbHRlYSA8Y3Jpc3RpYW4u Y2lvY2FsdGVhQGdtYWlsLmNvbT4KPiA+ICsgKi8KPiA+ICsKPiA+ICsjaW5jbHVkZSA8bGludXgv aW50ZXJydXB0Lmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAuaD4KPiA+ICsjaW5jbHVk ZSA8bGludXgvb2ZfYWRkcmVzcy5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KPiA+ ICsKPiA+ICsjZGVmaW5lIE5VTV9TSVJRCQkJMwo+ID4gKwo+ID4gKyNkZWZpbmUgSU5UQ19FWFRD VExfUEVORElORwkJQklUKDApCj4gPiArI2RlZmluZSBJTlRDX0VYVENUTF9DTEtfU0VMCQlCSVQo NCkKPiA+ICsjZGVmaW5lIElOVENfRVhUQ1RMX0VOCQkJQklUKDUpCj4gPiArI2RlZmluZSBJTlRD X0VYVENUTF9UWVBFX01BU0sJCUdFTk1BU0soNywgNikKPiA+ICsjZGVmaW5lIElOVENfRVhUQ1RM X1RZUEVfSElHSAkJMAo+ID4gKyNkZWZpbmUgSU5UQ19FWFRDVExfVFlQRV9MT1cJCUJJVCg2KQo+ ID4gKyNkZWZpbmUgSU5UQ19FWFRDVExfVFlQRV9SSVNJTkcJCUJJVCg3KQo+ID4gKyNkZWZpbmUg SU5UQ19FWFRDVExfVFlQRV9GQUxMSU5HCShCSVQoNikgfCBCSVQoNykpCj4gPiArCj4gPiArLyog UzkwMCBTSVJRMSAmIFNJUlEyIGNvbnRyb2wgcmVnaXN0ZXIgb2Zmc2V0cywgcmVsYXRpdmUgdG8g U0lSUTAgKi8KPiA+ICsjZGVmaW5lIElOVENfRVhUQ1RMMQkJCTB4MDMyOAo+ID4gKyNkZWZpbmUg SU5UQ19FWFRDVEwyCQkJMHgwMzJjCj4gPiArCj4gPiArc3RydWN0IG93bF9zaXJxX3BhcmFtcyB7 Cj4gPiArCS8qIElOVENfRVhUQ1RMIHJlZyBzaGFyZWQgZm9yIGFsbCB0aHJlZSBTSVJRIGxpbmVz ICovCj4gPiArCWJvb2wgcmVnX3NoYXJlZDsKPiA+ICsJLyogSU5UQ19FWFRDVEwgcmVnIG9mZnNl dHMgcmVsYXRpdmUgdG8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8KPiA+ICsJdTE2IHJlZ19v ZmZzZXRbTlVNX1NJUlFdOwo+ID4gK307Cj4gPiArCj4gPiArc3RydWN0IG93bF9zaXJxX2NoaXBf ZGF0YSB7Cj4gPiArCWNvbnN0IHN0cnVjdCBvd2xfc2lycV9wYXJhbXMgKnBhcmFtczsKPiA+ICsJ dm9pZCBfX2lvbWVtICpiYXNlOwo+ID4gKwlyYXdfc3BpbmxvY2tfdCBsb2NrOwo+ID4gKwl1MzIg ZXh0X2lycXNbTlVNX1NJUlFdOwo+ID4gKwl1OCB0cmlnZ2VyOwo+IAo+IE5pdDogUGxlYXNlIGFs aWduIGRhdGEgc3RydWN0dXJlIG1lbWJlcnMgdmVydGljYWxseToKPiAKPiBzdHJ1Y3Qgb3dsX3Np cnFfY2hpcF9kYXRhIHsKPiAJY29uc3Qgc3RydWN0IG93bF9zaXJxX3BhcmFtcyAqcGFyYW1zOwo+ IAl2b2lkIF9faW9tZW0gICAgICAgICAgICAgICAgICpiYXNlOwo+IAlyYXdfc3BpbmxvY2tfdCAg ICAgICAgICAgICAgIGxvY2s7Cj4gCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0X2ly cXNbTlVNX1NJUlFdOwo+IAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXI7Cj4g fTsKCkRvbmUuCgo+ID4gK307Cj4gPiArCj4gPiArLyogUzUwMCBhbmQgUzcwMCBTb0NzICovCj4g PiArc3RhdGljIGNvbnN0IHN0cnVjdCBvd2xfc2lycV9wYXJhbXMgb3dsX3NpcnFfczUwMF9wYXJh bXMgPSB7Cj4gPiArCS5yZWdfc2hhcmVkID0gdHJ1ZSwKPiA+ICsJLnJlZ19vZmZzZXQgPSB7IDAs IDAsIDAgfSwKPiA+ICt9Owo+ID4gKwo+ID4gKy8qIFM5MDAgU29DICovCj4gPiArc3RhdGljIGNv bnN0IHN0cnVjdCBvd2xfc2lycV9wYXJhbXMgb3dsX3NpcnFfczkwMF9wYXJhbXMgPSB7Cj4gPiAr CS5yZWdfc2hhcmVkID0gZmFsc2UsCj4gPiArCS5yZWdfb2Zmc2V0ID0geyAwLCBJTlRDX0VYVENU TDEsIElOVENfRVhUQ1RMMiB9LAo+IAo+IDAgKmlzKiBhbiBvZmZzZXQsIHJpZ2h0PyBXaHkgZG9l c24ndCBpdCBoYXZlIGEgbmFtZSB0b28/CgpSaWdodCwgSSB1cGRhdGVkIHRoZSBkZWZpbmVzIHNl Y3Rpb246CgovKiBTOTAwIFNJUlEgY29udHJvbCByZWdpc3RlciBvZmZzZXRzLCByZWxhdGl2ZSB0 byBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLwojZGVmaW5lIElOVENfRVhUQ1RMMAkJCTB4MDAw MAojZGVmaW5lIElOVENfRVhUQ1RMMQkJCTB4MDMyOApbLi4uXQoKVGhlIGNvbnRyb2xsZXIgYmFz ZSBhZGRyZXNzIHBvaW50cyB0byBTSVJRMCBjb250cm9sIHJlZ2lzdGVyLCBzbyB0aGlzCm9mZnNl dCBpcyBhbHdheXMgMCwgYnV0IEkgdG90YWxseSBhZ3JlZSB3ZSBzaG91bGQgaGF2ZSBhIG5hbWUg Zm9yIGl0LgoKPiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRpYyB1MzIgb3dsX3NpcnFfcmVhZF9leHRj dGwoc3RydWN0IG93bF9zaXJxX2NoaXBfZGF0YSAqZGF0YSwgdTMyCj4gPiBpbmRleCkKPiA+ICt7 Cj4gPiArCXUzMiB2YWw7Cj4gPiArCj4gPiArCXZhbCA9IHJlYWRsX3JlbGF4ZWQoZGF0YS0+YmFz ZSArIGRhdGEtPnBhcmFtcy0+cmVnX29mZnNldFtpbmRleF0pOwo+ID4gKwlpZiAoZGF0YS0+cGFy YW1zLT5yZWdfc2hhcmVkKQo+ID4gKwkJdmFsID0gKHZhbCA+PiAoMiAtIGluZGV4KSAqIDgpICYg MHhmZjsKPiAKPiAgICAgICAgIGJhc2UgPSAoMiAtIGluZGV4KSAqIDg7Cj4gICAgICAgICB2YWwg PSBGSUVMRF9HRVQoR0VOTUFTSyhiYXNlICsgNywgYmFzZSksIHZhbCk7CgpVbmZvcnR1bmF0ZWx5 IHRoZSBjb250ZXh0IGRvZXNuJ3QgYWxsb3cgdXNpbmcgRklFTERfR0VUOgoKLi9pbmNsdWRlL2xp bnV4L2NvbXBpbGVyLmg6MzkyOjM4OiBlcnJvcjogY2FsbCB0byDigJhfX2NvbXBpbGV0aW1lX2Fz c2VydF8xNTnigJkgCiBkZWNsYXJlZCB3aXRoIGF0dHJpYnV0ZSBlcnJvcjogRklFTERfR0VUOiBt YXNrIGlzIG5vdCBjb25zdGFudAoKPiA+ICsKPiA+ICsJcmV0dXJuIHZhbDsKPiA+ICt9Cj4gPiAr Cj4gPiArc3RhdGljIHZvaWQgb3dsX3NpcnFfd3JpdGVfZXh0Y3RsKHN0cnVjdCBvd2xfc2lycV9j aGlwX2RhdGEgKmRhdGEsCj4gPiArCQkJCSAgdTMyIGV4dGN0bCwgdTMyIGluZGV4KQo+ID4gK3sK PiA+ICsJdTMyIHZhbDsKPiA+ICsKPiA+ICsJaWYgKGRhdGEtPnBhcmFtcy0+cmVnX3NoYXJlZCkg ewo+ID4gKwkJdmFsID0gcmVhZGxfcmVsYXhlZChkYXRhLT5iYXNlICsgZGF0YS0+cGFyYW1zLT5y ZWdfb2Zmc2V0W2luZGV4XSk7Cj4gPiArCQl2YWwgJj0gfigweGZmIDw8ICgyIC0gaW5kZXgpICog OCk7Cj4gPiArCQlleHRjdGwgJj0gMHhmZjsKPiA+ICsJCWV4dGN0bCA9IChleHRjdGwgPDwgKDIg LSBpbmRleCkgKiA4KSB8IHZhbDsKPiAKPiBQbGVhc2UgbWFrZSB1c2Ugb2YgRklFTERfUFJFUCwg RklFTERfR0VUIGFuZCBHRU5NQVNLLgoKSSdtIG5vdCBzdXJlIGhvdyB0byBkZWFsIHdpdGggdGhl IG1hc2sgY29uc3RuZXNzIHJlc3RyaWN0aW9uLCBleGNlcHQKdXNpbmcgc3RhdGljIGRlZmluZXMg YW5kIGlmL2Vsc2Ugc3RhdGVtZW50cywgd2hpY2ggaXMgbm90IHF1aXRlIGVsZWdhbnQuCgo+ID4g Kwl9Cj4gPiArCj4gPiArCXdyaXRlbF9yZWxheGVkKGV4dGN0bCwgZGF0YS0+YmFzZSArIGRhdGEt PnBhcmFtcy0+cmVnX29mZnNldFtpbmRleF0pOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9p ZCBvd2xfc2lycV9jbGVhcl9zZXRfZXh0Y3RsKHN0cnVjdCBvd2xfc2lycV9jaGlwX2RhdGEgKmQs Cj4gPiArCQkJCSAgICAgIHUzMiBjbGVhciwgdTMyIHNldCwgdTMyIGluZGV4KQo+ID4gK3sKPiA+ ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPiA+ICsJdTMyIHZhbDsKPiA+ICsKPiA+ICsJcmF3X3Nw aW5fbG9ja19pcnFzYXZlKCZkLT5sb2NrLCBmbGFncyk7Cj4gPiArCXZhbCA9IG93bF9zaXJxX3Jl YWRfZXh0Y3RsKGQsIGluZGV4KTsKPiA+ICsJdmFsICY9IH5jbGVhcjsKPiA+ICsJdmFsIHw9IHNl dDsKPiA+ICsJb3dsX3NpcnFfd3JpdGVfZXh0Y3RsKGQsIHZhbCwgaW5kZXgpOwo+ID4gKwlyYXdf c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jaywgZmxhZ3MpOwo+ID4gK30KPiA+ICsKPiA+ ICtzdGF0aWMgdm9pZCBvd2xfc2lycV9lb2koc3RydWN0IGlycV9kYXRhICpkYXRhKQo+ID4gK3sK PiA+ICsJc3RydWN0IG93bF9zaXJxX2NoaXBfZGF0YSAqY2hpcF9kYXRhID0KPiA+IGlycV9kYXRh X2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwo+ID4gKwo+ID4gKwkvKgo+ID4gKwkgKiBTb2Z0d2Fy ZSBtdXN0IGNsZWFyIGV4dGVybmFsIGludGVycnVwdCBwZW5kaW5nLCB3aGVuIGludGVycnVwdCB0 eXBlCj4gPiArCSAqIGlzIGVkZ2UgdHJpZ2dlcmVkLCBzbyB3ZSBuZWVkIHBlciBTSVJRIGJhc2Vk IGNsZWFyaW5nLgo+ID4gKwkgKi8KPiA+ICsJaWYgKGNoaXBfZGF0YS0+dHJpZ2dlciAmICgxIDw8 IGRhdGEtPmh3aXJxKSkKPiAKPiBCSVQoZC0+aHdpcnEpCj4gCj4gQnV0IGl0IGFsc28gYmVncyB0 aGUgcXVlc3Rpb246IHdlIGFscmVhZHkgaGF2ZSBhbGwgdGhlIHRyaWdnZXIgaW5mb3JtYXRpb24K PiBpbiB0aGUgaXJxZGVzYy4gV2h5IGRvIHlvdSBuZWVkIHNvbWUgYWRkaXRpb25hbCBib29ra2Vl cGluZz8KClRoYXQncyBhbm90aGVyIGxlZnRvdmVyIGZyb20gdGhlIG9yaWdpbmFsIHdvcmsuIFRo YW5rcyBmb3IgcG9pbnRpbmcKdGhpcyBvdXQsIEkgbWlzc2VkIGl0LiBJIGRyb3BwZWQgdGhlIHJl ZHVuZGFudCBoYW5kbGluZyBvZiB0aGUgSVJRCnRyaWdnZXIgaW5mb3JtYXRpb24gYW5kIGp1c3Qg cmVwbGFjZWQgdGhpcyB3aXRoOgoKICBpZiAoIWlycWRfaXNfbGV2ZWxfdHlwZShkYXRhKSkKCj4g PiArCQlvd2xfc2lycV9jbGVhcl9zZXRfZXh0Y3RsKGNoaXBfZGF0YSwgMCwgSU5UQ19FWFRDVExf UEVORElORywKPiA+ICsJCQkJCSAgZGF0YS0+aHdpcnEpOwo+ID4gKwo+ID4gKwlpcnFfY2hpcF9l b2lfcGFyZW50KGRhdGEpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBvd2xfc2lycV9t YXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKPiA+ICt7Cj4gPiArCXN0cnVjdCBvd2xfc2lycV9j aGlwX2RhdGEgKmNoaXBfZGF0YSA9Cj4gPiBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRh KTsKPiA+ICsKPiA+ICsJb3dsX3NpcnFfY2xlYXJfc2V0X2V4dGN0bChjaGlwX2RhdGEsIElOVENf RVhUQ1RMX0VOLCAwLCBkYXRhLT5od2lycSk7Cj4gPiArCWlycV9jaGlwX21hc2tfcGFyZW50KGRh dGEpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBvd2xfc2lycV91bm1hc2soc3RydWN0 IGlycV9kYXRhICpkYXRhKQo+ID4gK3sKPiA+ICsJc3RydWN0IG93bF9zaXJxX2NoaXBfZGF0YSAq Y2hpcF9kYXRhID0KPiA+IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwo+ID4gKwo+ ID4gKwlvd2xfc2lycV9jbGVhcl9zZXRfZXh0Y3RsKGNoaXBfZGF0YSwgMCwgSU5UQ19FWFRDVExf RU4sIGRhdGEtPmh3aXJxKTsKPiA+ICsJaXJxX2NoaXBfdW5tYXNrX3BhcmVudChkYXRhKTsKPiA+ ICt9Cj4gPiArCj4gPiArLyoKPiA+ICsgKiBHSUMgZG9lcyBub3QgaGFuZGxlIGZhbGxpbmcgZWRn ZSBvciBhY3RpdmUgbG93LCBoZW5jZSBTSVJRIHNoYWxsIGJlCj4gPiArICogcHJvZ3JhbW1lZCB0 byBjb252ZXJ0IGZhbGxpbmcgZWRnZSB0byByaXNpbmcgZWRnZSBzaWduYWwgYW5kIGFjdGl2ZQo+ ID4gKyAqIGxvdyB0byBhY3RpdmUgaGlnaCBzaWduYWwuCj4gPiArICovCj4gPiArc3RhdGljIGlu dCBvd2xfc2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCB0 eXBlKQo+ID4gK3sKPiA+ICsJc3RydWN0IG93bF9zaXJxX2NoaXBfZGF0YSAqY2hpcF9kYXRhID0K PiA+IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwo+ID4gKwl1MzIgc2lycV90eXBl Owo+ID4gKwo+ID4gKwlzd2l0Y2ggKHR5cGUpIHsKPiA+ICsJY2FzZSBJUlFfVFlQRV9MRVZFTF9M T1c6Cj4gPiArCQlzaXJxX3R5cGUgPSBJTlRDX0VYVENUTF9UWVBFX0xPVzsKPiA+ICsJCWNoaXBf ZGF0YS0+dHJpZ2dlciAmPSB+KDEgPDwgZGF0YS0+aHdpcnEpOwo+ID4gKwkJdHlwZSA9IElSUV9U WVBFX0xFVkVMX0hJR0g7Cj4gPiArCQlicmVhazsKPiA+ICsJY2FzZSBJUlFfVFlQRV9MRVZFTF9I SUdIOgo+ID4gKwkJc2lycV90eXBlID0gSU5UQ19FWFRDVExfVFlQRV9ISUdIOwo+ID4gKwkJY2hp cF9kYXRhLT50cmlnZ2VyICY9IH4oMSA8PCBkYXRhLT5od2lycSk7Cj4gPiArCQlicmVhazsKPiA+ ICsJY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6Cj4gPiArCQlzaXJxX3R5cGUgPSBJTlRDX0VY VENUTF9UWVBFX0ZBTExJTkc7Cj4gPiArCQljaGlwX2RhdGEtPnRyaWdnZXIgfD0gMSA8PCBkYXRh LT5od2lycTsKPiA+ICsJCXR5cGUgPSBJUlFfVFlQRV9FREdFX1JJU0lORzsKPiA+ICsJCWJyZWFr Owo+ID4gKwljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgo+ID4gKwkJc2lycV90eXBlID0gSU5U Q19FWFRDVExfVFlQRV9SSVNJTkc7Cj4gPiArCQljaGlwX2RhdGEtPnRyaWdnZXIgfD0gMSA8PCBk YXRhLT5od2lycTsKPiA+ICsJCWJyZWFrOwo+ID4gKwlkZWZhdWx0Ogo+ID4gKwkJV0FSTl9PTigx KTsKPiAKPiBObyBuZWVkIGZvciB0aGlzIFdBUk5fT04oKSwgdGhlIGNvcmUga2VybmVsIGlzIGxv dWQgZW5vdWdoLgoKRG9uZS4KCj4gPiArCQlyZXR1cm4gLUVJTlZBTDsKPiA+ICsJfQo+ID4gKwo+ ID4gKwlvd2xfc2lycV9jbGVhcl9zZXRfZXh0Y3RsKGNoaXBfZGF0YSwgSU5UQ19FWFRDVExfVFlQ RV9NQVNLLCBzaXJxX3R5cGUsCj4gPiArCQkJCSAgZGF0YS0+aHdpcnEpOwo+ID4gKwo+ID4gKwly ZXR1cm4gaXJxX2NoaXBfc2V0X3R5cGVfcGFyZW50KGRhdGEsIHR5cGUpOwo+ID4gK30KPiA+ICsK PiA+ICtzdGF0aWMgc3RydWN0IGlycV9jaGlwIG93bF9zaXJxX2NoaXAgPSB7Cj4gPiArCS5uYW1l CQk9ICJvd2wtc2lycSIsCj4gPiArCS5pcnFfbWFzawk9IG93bF9zaXJxX21hc2ssCj4gPiArCS5p cnFfdW5tYXNrCT0gb3dsX3NpcnFfdW5tYXNrLAo+ID4gKwkuaXJxX2VvaQk9IG93bF9zaXJxX2Vv aSwKPiA+ICsJLmlycV9zZXRfdHlwZQk9IG93bF9zaXJxX3NldF90eXBlLAo+ID4gKwkuaXJxX3Jl dHJpZ2dlcgk9IGlycV9jaGlwX3JldHJpZ2dlcl9oaWVyYXJjaHksCj4gCj4gSG93IGFib3V0IGly cV9zZXRfYWZmaW5pdHk/IE9yIGRvZXMgaXQgb25seSBleGlzdCBvbiBVUCBzeXN0ZW1zPwoKSSBo YXZlIGp1c3QgYWRkZWQ6CgojaWZkZWYgQ09ORklHX1NNUAoJLmlycV9zZXRfYWZmaW5pdHkgPSBp cnFfY2hpcF9zZXRfYWZmaW5pdHlfcGFyZW50LAojZW5kaWYKCj4gPiArfTsKPiA+ICsKPiA+ICtz dGF0aWMgaW50IG93bF9zaXJxX2RvbWFpbl90cmFuc2xhdGUoc3RydWN0IGlycV9kb21haW4gKmQs Cj4gPiArCQkJCSAgICAgc3RydWN0IGlycV9md3NwZWMgKmZ3c3BlYywKPiA+ICsJCQkJICAgICB1 bnNpZ25lZCBsb25nICpod2lycSwKPiA+ICsJCQkJICAgICB1bnNpZ25lZCBpbnQgKnR5cGUpCj4g PiArewo+ID4gKwlpZiAoIWlzX29mX25vZGUoZndzcGVjLT5md25vZGUpKQo+ID4gKwkJcmV0dXJu IC1FSU5WQUw7Cj4gPiArCj4gPiArCWlmIChmd3NwZWMtPnBhcmFtX2NvdW50ICE9IDIgfHwgZndz cGVjLT5wYXJhbVswXSA+PSBOVU1fU0lSUSkKPiA+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4gKwo+ ID4gKwkqaHdpcnEgPSBmd3NwZWMtPnBhcmFtWzBdOwo+ID4gKwkqdHlwZSA9IGZ3c3BlYy0+cGFy YW1bMV07Cj4gPiArCj4gPiArCXJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50 IG93bF9zaXJxX2RvbWFpbl9hbGxvYyhzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluLCB1bnNpZ25l ZAo+ID4gaW50IHZpcnEsCj4gPiArCQkJCSB1bnNpZ25lZCBpbnQgbnJfaXJxcywgdm9pZCAqZGF0 YSkKPiA+ICt7Cj4gPiArCXN0cnVjdCBvd2xfc2lycV9jaGlwX2RhdGEgKmNoaXBfZGF0YSA9IGRv bWFpbi0+aG9zdF9kYXRhOwo+ID4gKwlzdHJ1Y3QgaXJxX2Z3c3BlYyAqZndzcGVjID0gZGF0YTsK PiA+ICsJc3RydWN0IGlycV9md3NwZWMgcGFyZW50X2Z3c3BlYzsKPiA+ICsJaXJxX2h3X251bWJl cl90IGh3aXJxOwo+ID4gKwl1bnNpZ25lZCBpbnQgdHlwZTsKPiA+ICsJaW50IHJldDsKPiA+ICsK PiA+ICsJaWYgKFdBUk5fT04obnJfaXJxcyAhPSAxKSkKPiA+ICsJCXJldHVybiAtRUlOVkFMOwo+ ID4gKwo+ID4gKwlyZXQgPSBvd2xfc2lycV9kb21haW5fdHJhbnNsYXRlKGRvbWFpbiwgZndzcGVj LCAmaHdpcnEsICZ0eXBlKTsKPiA+ICsJaWYgKHJldCkKPiA+ICsJCXJldHVybiByZXQ7Cj4gPiAr Cj4gPiArCXN3aXRjaCAodHlwZSkgewo+ID4gKwljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgo+ ID4gKwljYXNlIElSUV9UWVBFX0xFVkVMX0hJR0g6Cj4gPiArCQlicmVhazsKPiA+ICsJY2FzZSBJ UlFfVFlQRV9FREdFX0ZBTExJTkc6Cj4gPiArCQl0eXBlID0gSVJRX1RZUEVfRURHRV9SSVNJTkc7 Cj4gPiArCQlicmVhazsKPiA+ICsJY2FzZSBJUlFfVFlQRV9MRVZFTF9MT1c6Cj4gPiArCQl0eXBl ID0gSVJRX1RZUEVfTEVWRUxfSElHSDsKPiA+ICsJCWJyZWFrOwo+ID4gKwlkZWZhdWx0Ogo+ID4g KwkJcmV0dXJuIC1FSU5WQUw7Cj4gPiArCX0KPiA+ICsKPiA+ICsJaXJxX2RvbWFpbl9zZXRfaHdp cnFfYW5kX2NoaXAoZG9tYWluLCB2aXJxLCBod2lycSwgJm93bF9zaXJxX2NoaXAsCj4gPiArCQkJ CSAgICAgIGNoaXBfZGF0YSk7Cj4gPiArCj4gPiArCXBhcmVudF9md3NwZWMuZndub2RlID0gZG9t YWluLT5wYXJlbnQtPmZ3bm9kZTsKPiA+ICsJcGFyZW50X2Z3c3BlYy5wYXJhbV9jb3VudCA9IDM7 Cj4gPiArCXBhcmVudF9md3NwZWMucGFyYW1bMF0gPSAwOwkvKiBTUEkgKi8KPiA+ICsJcGFyZW50 X2Z3c3BlYy5wYXJhbVsxXSA9IGNoaXBfZGF0YS0+ZXh0X2lycXNbaHdpcnFdOwo+ID4gKwlwYXJl bnRfZndzcGVjLnBhcmFtWzJdID0gdHlwZTsKPiA+ICsKPiA+ICsJcmV0dXJuIGlycV9kb21haW5f YWxsb2NfaXJxc19wYXJlbnQoZG9tYWluLCB2aXJxLCAxLCAmcGFyZW50X2Z3c3BlYyk7Cj4gPiAr fQo+ID4gKwo+ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgb3dsX3NpcnFf ZG9tYWluX29wcyA9IHsKPiA+ICsJLnRyYW5zbGF0ZQk9IG93bF9zaXJxX2RvbWFpbl90cmFuc2xh dGUsCj4gPiArCS5hbGxvYwkJPSBvd2xfc2lycV9kb21haW5fYWxsb2MsCj4gPiArCS5mcmVlCQk9 IGlycV9kb21haW5fZnJlZV9pcnFzX2NvbW1vbiwKPiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRpYyBj b25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG93bF9zaXJxX29mX21hdGNoW10gPSB7Cj4gPiArCXsg LmNvbXBhdGlibGUgPSAiYWN0aW9ucyxzNTAwLXNpcnEiLCAuZGF0YSA9ICZvd2xfc2lycV9zNTAw X3BhcmFtcyB9LAo+ID4gKwl7IC5jb21wYXRpYmxlID0gImFjdGlvbnMsczcwMC1zaXJxIiwgLmRh dGEgPSAmb3dsX3NpcnFfczUwMF9wYXJhbXMgfSwKPiA+ICsJeyAuY29tcGF0aWJsZSA9ICJhY3Rp b25zLHM5MDAtc2lycSIsIC5kYXRhID0gJm93bF9zaXJxX3M5MDBfcGFyYW1zIH0sCj4gPiArCXsg Lyogc2VudGluZWwgKi8gfQo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljIGludCBfX2luaXQgb3ds X3NpcnFfb2ZfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCj4gPiArCQkJCSAgIHN0cnVj dCBkZXZpY2Vfbm9kZSAqcGFyZW50KQo+ID4gK3sKPiA+ICsJY29uc3Qgc3RydWN0IG9mX2Rldmlj ZV9pZCAqbWF0Y2g7Cj4gPiArCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW4sICpwYXJlbnRfZG9t YWluOwo+ID4gKwlzdHJ1Y3Qgb3dsX3NpcnFfY2hpcF9kYXRhICpjaGlwX2RhdGE7Cj4gPiArCWlu dCByZXQsIGk7Cj4gPiArCj4gPiArCXBhcmVudF9kb21haW4gPSBpcnFfZmluZF9ob3N0KHBhcmVu dCk7Cj4gPiArCWlmICghcGFyZW50X2RvbWFpbikgewo+ID4gKwkJcHJfZXJyKCIlcE9GOiBmYWls ZWQgdG8gZmluZCBzaXJxIHBhcmVudCBkb21haW5cbiIsIG5vZGUpOwo+ID4gKwkJcmV0dXJuIC1F TlhJTzsKPiA+ICsJfQo+ID4gKwo+ID4gKwljaGlwX2RhdGEgPSBremFsbG9jKHNpemVvZigqY2hp cF9kYXRhKSwgR0ZQX0tFUk5FTCk7Cj4gPiArCWlmICghY2hpcF9kYXRhKQo+ID4gKwkJcmV0dXJu IC1FTk9NRU07Cj4gPiArCj4gPiArCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShvd2xfc2lycV9vZl9t YXRjaCwgbm9kZSk7Cj4gPiArCWlmICghbWF0Y2gpIHsKPiA+ICsJCXByX3dhcm4oIm93bC1zaXJx OiBhc3N1bWluZyBTNTAwL1M3MDAgY29tcGF0aWJsZSBjb250cm9sbGVyXG4iKTsKPiA+ICsJCWNo aXBfZGF0YS0+cGFyYW1zID0gJm93bF9zaXJxX3M1MDBfcGFyYW1zOwo+ID4gKwl9IGVsc2Ugewo+ ID4gKwkJY2hpcF9kYXRhLT5wYXJhbXMgPSBtYXRjaC0+ZGF0YTsKPiA+ICsJfQo+ID4gKwo+ID4g KwlyYXdfc3Bpbl9sb2NrX2luaXQoJmNoaXBfZGF0YS0+bG9jayk7Cj4gPiArCj4gPiArCWNoaXBf ZGF0YS0+YmFzZSA9IG9mX2lvbWFwKG5vZGUsIDApOwo+ID4gKwlpZiAoIWNoaXBfZGF0YS0+YmFz ZSkgewo+ID4gKwkJcHJfZXJyKCIlcE9GOiBmYWlsZWQgdG8gbWFwIHNpcnEgcmVnaXN0ZXJzXG4i LCBub2RlKTsKPiA+ICsJCXJldCA9IC1FTlhJTzsKPiA+ICsJCWdvdG8gb3V0X2ZyZWU7Cj4gPiAr CX0KPiA+ICsKPiA+ICsJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91MzJfYXJyYXko bm9kZSwKPiA+ICJhY3Rpb25zLGV4dC1pbnRlcnJ1cHRzIiwKPiA+ICsJCQkJCQkgIGNoaXBfZGF0 YS0+ZXh0X2lycXMsCj4gPiArCQkJCQkJICBOVU1fU0lSUSwgTlVNX1NJUlEpOwo+ID4gKwlpZiAo cmV0IDwgTlVNX1NJUlEpIHsKPiA+ICsJCXByX2VycigiJXBPRjogZmFpbGVkIHRvIHJlYWQgc2ly cSBpbnRlcnJ1cHRzXG4iLCBub2RlKTsKPiA+ICsJCWdvdG8gb3V0X3VubWFwOwo+ID4gKwl9Cj4g PiArCj4gPiArCS8qIFNldCAyNE1IeiBleHRlcm5hbCBpbnRlcnJ1cHQgY2xvY2sgZnJlcSAqLwo+ ID4gKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1NJUlE7IGkrKykKPiA+ICsJCW93bF9zaXJxX2NsZWFy X3NldF9leHRjdGwoY2hpcF9kYXRhLCAwLCBJTlRDX0VYVENUTF9DTEtfU0VMLCBpKTsKPiA+ICsK PiA+ICsJZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfaGllcmFyY2h5KHBhcmVudF9kb21haW4sIDAs IE5VTV9TSVJRLCBub2RlLAo+ID4gKwkJCQkJICAmb3dsX3NpcnFfZG9tYWluX29wcywgY2hpcF9k YXRhKTsKPiA+ICsJaWYgKCFkb21haW4pIHsKPiA+ICsJCXByX2VycigiJXBPRjogZmFpbGVkIHRv IGFkZCBkb21haW5cbiIsIG5vZGUpOwo+ID4gKwkJcmV0ID0gLUVOT01FTTsKPiA+ICsJCWdvdG8g b3V0X3VubWFwOwo+ID4gKwl9Cj4gPiArCj4gPiArCXJldHVybiAwOwo+ID4gKwo+ID4gK291dF91 bm1hcDoKPiA+ICsJaW91bm1hcChjaGlwX2RhdGEtPmJhc2UpOwo+ID4gK291dF9mcmVlOgo+ID4g KwlrZnJlZShjaGlwX2RhdGEpOwo+ID4gKwo+ID4gKwlyZXR1cm4gcmV0Owo+ID4gK30KPiA+ICsK PiA+ICtJUlFDSElQX0RFQ0xBUkUob3dsX3NpcnEsICJhY3Rpb25zLG93bC1zaXJxIiwgb3dsX3Np cnFfb2ZfaW5pdCk7Cj4gCj4gVGhhbmtzLAo+IAo+ICAgICAgICAgTS4KPiAtLSAKPiBKYXp6IGlz IG5vdCBkZWFkLiBJdCBqdXN0IHNtZWxscyBmdW5ueS4uLgoKVGhhbmtzIGFnYWluLApDcmlzdGkK Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFy bS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9y ZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1r ZXJuZWwK 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=-9.6 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 D4092C433DF for ; Tue, 18 Aug 2020 17:42:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id AB96320674 for ; Tue, 18 Aug 2020 17:42:49 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="QxZZZFfq" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726552AbgHRRmt (ORCPT ); Tue, 18 Aug 2020 13:42:49 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54508 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726145AbgHRRmr (ORCPT ); Tue, 18 Aug 2020 13:42:47 -0400 Received: from mail-ej1-x643.google.com (mail-ej1-x643.google.com [IPv6:2a00:1450:4864:20::643]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DEB97C061389; Tue, 18 Aug 2020 10:42:46 -0700 (PDT) Received: by mail-ej1-x643.google.com with SMTP id c16so23076719ejx.12; Tue, 18 Aug 2020 10:42:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=RLSht3RIYrYvOJyCZb8S7UriIeq7yTfzTMH9GBL0tvg=; b=QxZZZFfquhXE5HEZVH6teiE3YKTcoBY284GURrd+CRJYbxzkoO5THrlf1DL/ZLd36v wqDGhZosENshPvyAOCNMAUpZjTyrkqMMCa/ge6g+IVd2k48+ABW8T1Xm9/dXHLCypSnE 9lgO8sm9bD50EanbVtx/v76/EEZNDrzhZ44q2uS3Z27ktG5WhmcLKg26XOG6GP6Ncdr6 u6d/DCmOwlPUUENx3PjfSO0MM1qQ+gOmuqyKO+Nt6MNwplUxguHquLWA69dNYGz/206l zdl59eEaFiXfYMddhK8GvrXRRPWBH6HzZBW8CMdV1twCp24wTAjJW/9LwVerXhnNX3Wm WM2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=RLSht3RIYrYvOJyCZb8S7UriIeq7yTfzTMH9GBL0tvg=; b=A8xyAWVPqC7q9Jpk2txdWYyGQ2mb4/e9I+evGhA3AZFx9KoV9vfLu5DSQkbzZK+AZ3 UA82OMDDRnweHTYn0R58Ox9uJ5H4Dfka9gUuGLiBkyY1XHyZjMH4+PjdQJH9J4SJ7hvB LIIGMc+TrjzTgKhmEndKOsTtpvHGjojnxuFoDu5c5Q+zcbM9l4viJwjwVNByc/Oe4lhN htXPPo1+BD/1i+ZVuU6KKZOBDrCfwdZrgdZQNiCSAvd2d54aQl/4fW9BrYYX74zSynE0 440BX++rg/4apxw+IXxDFow7W/cAz6x5UqGk4UPtEeVoAhDIjPCJvtIs1CzVp73/WcLZ v/sA== X-Gm-Message-State: AOAM530S7NmN6HTD0Ki81DrB8/RDIUfB9FFCg/4doiPVWUZRfDYaKrsB z7Mzbj7I43pntvfab9eDXSM= X-Google-Smtp-Source: ABdhPJyIaAtcVFg7kwhJNMU96Jc6xlED3L5/1oRcb9KAJJXt7rs8hbxMiUz7JCjj9SH8gZMlh9/PnQ== X-Received: by 2002:a17:906:a18e:: with SMTP id s14mr20824421ejy.168.1597772564730; Tue, 18 Aug 2020 10:42:44 -0700 (PDT) Received: from BV030612LT ([188.24.144.238]) by smtp.gmail.com with ESMTPSA id u13sm17168211eje.9.2020.08.18.10.42.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Aug 2020 10:42:43 -0700 (PDT) Date: Tue, 18 Aug 2020 20:42:41 +0300 From: Cristian Ciocaltea To: Marc Zyngier Cc: Thomas Gleixner , Jason Cooper , Rob Herring , Andreas =?iso-8859-1?Q?F=E4rber?= , Manivannan Sadhasivam , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-actions@lists.infradead.org, Saravanan Sekar Subject: Re: [PATCH v4 2/3] irqchip: Add Actions Semi Owl SIRQ controller Message-ID: <20200818174241.GA2020288@BV030612LT> References: <8e43fe6c6246bfd5347dc21b6f5c3f50@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <8e43fe6c6246bfd5347dc21b6f5c3f50@kernel.org> Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Hi Marc, Thanks for your quick and detailed review! On Mon, Aug 17, 2020 at 02:52:06PM +0100, Marc Zyngier wrote: > On 2020-08-16 12:33, Cristian Ciocaltea wrote: > > This controller appears on Actions Semi Owl family SoC's S500, S700 and > > S900 and provides support for 3 external interrupt controllers through > > Is that really 3 interrupt controllers? Or merely 3 interrupt lines? This is mostly a leftover statement from the previous patch revision. I will change it to something like: "This interrupt controller is found in the Actions Semi Owl SoCs (S500, S700 and S900) and provides support for handling up to 3 external interrupt lines." > > dedicated SIRQ pins. > > > > Each line can be independently configured as interrupt and triggers > > on either of the edges (raising or falling) or either of the levels > > (high or low). Each line can also be masked independently. > > > > This is based on the patch series submitted by Parthiban Nallathambi: > > https://lore.kernel.org/lkml/20181126100356.2840578-1-pn@denx.de/ > > > > Signed-off-by: Parthiban Nallathambi > > Signed-off-by: Saravanan Sekar > > [cristi: optimized DT, various fixes/cleanups/improvements] > > Signed-off-by: Cristian Ciocaltea > > --- > > drivers/irqchip/Makefile | 1 + > > drivers/irqchip/irq-owl-sirq.c | 318 +++++++++++++++++++++++++++++++++ > > 2 files changed, 319 insertions(+) > > create mode 100644 drivers/irqchip/irq-owl-sirq.c > > > > diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile > > index 133f9c45744a..b8eb5b8b766d 100644 > > --- a/drivers/irqchip/Makefile > > +++ b/drivers/irqchip/Makefile > > @@ -7,6 +7,7 @@ obj-$(CONFIG_ATH79) += irq-ath79-cpu.o > > obj-$(CONFIG_ATH79) += irq-ath79-misc.o > > obj-$(CONFIG_ARCH_BCM2835) += irq-bcm2835.o > > obj-$(CONFIG_ARCH_BCM2835) += irq-bcm2836.o > > +obj-$(CONFIG_ARCH_ACTIONS) += irq-owl-sirq.o > > obj-$(CONFIG_DAVINCI_AINTC) += irq-davinci-aintc.o > > obj-$(CONFIG_DAVINCI_CP_INTC) += irq-davinci-cp-intc.o > > obj-$(CONFIG_EXYNOS_IRQ_COMBINER) += exynos-combiner.o > > diff --git a/drivers/irqchip/irq-owl-sirq.c > > b/drivers/irqchip/irq-owl-sirq.c > > new file mode 100644 > > index 000000000000..29b7ffc40ac7 > > --- /dev/null > > +++ b/drivers/irqchip/irq-owl-sirq.c > > @@ -0,0 +1,318 @@ > > +// SPDX-License-Identifier: GPL-2.0+ > > +/* > > + * Actions Semi Owl SoCs SIRQ interrupt controller driver > > + * > > + * Copyright (C) 2014 Actions Semi Inc. > > + * David Liu > > + * > > + * Author: Parthiban Nallathambi > > + * Author: Saravanan Sekar > > + * Author: Cristian Ciocaltea > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > + > > +#define NUM_SIRQ 3 > > + > > +#define INTC_EXTCTL_PENDING BIT(0) > > +#define INTC_EXTCTL_CLK_SEL BIT(4) > > +#define INTC_EXTCTL_EN BIT(5) > > +#define INTC_EXTCTL_TYPE_MASK GENMASK(7, 6) > > +#define INTC_EXTCTL_TYPE_HIGH 0 > > +#define INTC_EXTCTL_TYPE_LOW BIT(6) > > +#define INTC_EXTCTL_TYPE_RISING BIT(7) > > +#define INTC_EXTCTL_TYPE_FALLING (BIT(6) | BIT(7)) > > + > > +/* S900 SIRQ1 & SIRQ2 control register offsets, relative to SIRQ0 */ > > +#define INTC_EXTCTL1 0x0328 > > +#define INTC_EXTCTL2 0x032c > > + > > +struct owl_sirq_params { > > + /* INTC_EXTCTL reg shared for all three SIRQ lines */ > > + bool reg_shared; > > + /* INTC_EXTCTL reg offsets relative to controller base address */ > > + u16 reg_offset[NUM_SIRQ]; > > +}; > > + > > +struct owl_sirq_chip_data { > > + const struct owl_sirq_params *params; > > + void __iomem *base; > > + raw_spinlock_t lock; > > + u32 ext_irqs[NUM_SIRQ]; > > + u8 trigger; > > Nit: Please align data structure members vertically: > > struct owl_sirq_chip_data { > const struct owl_sirq_params *params; > void __iomem *base; > raw_spinlock_t lock; > u32 ext_irqs[NUM_SIRQ]; > u8 trigger; > }; Done. > > +}; > > + > > +/* S500 and S700 SoCs */ > > +static const struct owl_sirq_params owl_sirq_s500_params = { > > + .reg_shared = true, > > + .reg_offset = { 0, 0, 0 }, > > +}; > > + > > +/* S900 SoC */ > > +static const struct owl_sirq_params owl_sirq_s900_params = { > > + .reg_shared = false, > > + .reg_offset = { 0, INTC_EXTCTL1, INTC_EXTCTL2 }, > > 0 *is* an offset, right? Why doesn't it have a name too? Right, I updated the defines section: /* S900 SIRQ control register offsets, relative to controller base address */ #define INTC_EXTCTL0 0x0000 #define INTC_EXTCTL1 0x0328 [...] The controller base address points to SIRQ0 control register, so this offset is always 0, but I totally agree we should have a name for it. > > +}; > > + > > +static u32 owl_sirq_read_extctl(struct owl_sirq_chip_data *data, u32 > > index) > > +{ > > + u32 val; > > + > > + val = readl_relaxed(data->base + data->params->reg_offset[index]); > > + if (data->params->reg_shared) > > + val = (val >> (2 - index) * 8) & 0xff; > > base = (2 - index) * 8; > val = FIELD_GET(GENMASK(base + 7, base), val); Unfortunately the context doesn't allow using FIELD_GET: ./include/linux/compiler.h:392:38: error: call to ‘__compiletime_assert_159’ declared with attribute error: FIELD_GET: mask is not constant > > + > > + return val; > > +} > > + > > +static void owl_sirq_write_extctl(struct owl_sirq_chip_data *data, > > + u32 extctl, u32 index) > > +{ > > + u32 val; > > + > > + if (data->params->reg_shared) { > > + val = readl_relaxed(data->base + data->params->reg_offset[index]); > > + val &= ~(0xff << (2 - index) * 8); > > + extctl &= 0xff; > > + extctl = (extctl << (2 - index) * 8) | val; > > Please make use of FIELD_PREP, FIELD_GET and GENMASK. I'm not sure how to deal with the mask constness restriction, except using static defines and if/else statements, which is not quite elegant. > > + } > > + > > + writel_relaxed(extctl, data->base + data->params->reg_offset[index]); > > +} > > + > > +static void owl_sirq_clear_set_extctl(struct owl_sirq_chip_data *d, > > + u32 clear, u32 set, u32 index) > > +{ > > + unsigned long flags; > > + u32 val; > > + > > + raw_spin_lock_irqsave(&d->lock, flags); > > + val = owl_sirq_read_extctl(d, index); > > + val &= ~clear; > > + val |= set; > > + owl_sirq_write_extctl(d, val, index); > > + raw_spin_unlock_irqrestore(&d->lock, flags); > > +} > > + > > +static void owl_sirq_eoi(struct irq_data *data) > > +{ > > + struct owl_sirq_chip_data *chip_data = > > irq_data_get_irq_chip_data(data); > > + > > + /* > > + * Software must clear external interrupt pending, when interrupt type > > + * is edge triggered, so we need per SIRQ based clearing. > > + */ > > + if (chip_data->trigger & (1 << data->hwirq)) > > BIT(d->hwirq) > > But it also begs the question: we already have all the trigger information > in the irqdesc. Why do you need some additional bookkeeping? That's another leftover from the original work. Thanks for pointing this out, I missed it. I dropped the redundant handling of the IRQ trigger information and just replaced this with: if (!irqd_is_level_type(data)) > > + owl_sirq_clear_set_extctl(chip_data, 0, INTC_EXTCTL_PENDING, > > + data->hwirq); > > + > > + irq_chip_eoi_parent(data); > > +} > > + > > +static void owl_sirq_mask(struct irq_data *data) > > +{ > > + struct owl_sirq_chip_data *chip_data = > > irq_data_get_irq_chip_data(data); > > + > > + owl_sirq_clear_set_extctl(chip_data, INTC_EXTCTL_EN, 0, data->hwirq); > > + irq_chip_mask_parent(data); > > +} > > + > > +static void owl_sirq_unmask(struct irq_data *data) > > +{ > > + struct owl_sirq_chip_data *chip_data = > > irq_data_get_irq_chip_data(data); > > + > > + owl_sirq_clear_set_extctl(chip_data, 0, INTC_EXTCTL_EN, data->hwirq); > > + irq_chip_unmask_parent(data); > > +} > > + > > +/* > > + * GIC does not handle falling edge or active low, hence SIRQ shall be > > + * programmed to convert falling edge to rising edge signal and active > > + * low to active high signal. > > + */ > > +static int owl_sirq_set_type(struct irq_data *data, unsigned int type) > > +{ > > + struct owl_sirq_chip_data *chip_data = > > irq_data_get_irq_chip_data(data); > > + u32 sirq_type; > > + > > + switch (type) { > > + case IRQ_TYPE_LEVEL_LOW: > > + sirq_type = INTC_EXTCTL_TYPE_LOW; > > + chip_data->trigger &= ~(1 << data->hwirq); > > + type = IRQ_TYPE_LEVEL_HIGH; > > + break; > > + case IRQ_TYPE_LEVEL_HIGH: > > + sirq_type = INTC_EXTCTL_TYPE_HIGH; > > + chip_data->trigger &= ~(1 << data->hwirq); > > + break; > > + case IRQ_TYPE_EDGE_FALLING: > > + sirq_type = INTC_EXTCTL_TYPE_FALLING; > > + chip_data->trigger |= 1 << data->hwirq; > > + type = IRQ_TYPE_EDGE_RISING; > > + break; > > + case IRQ_TYPE_EDGE_RISING: > > + sirq_type = INTC_EXTCTL_TYPE_RISING; > > + chip_data->trigger |= 1 << data->hwirq; > > + break; > > + default: > > + WARN_ON(1); > > No need for this WARN_ON(), the core kernel is loud enough. Done. > > + return -EINVAL; > > + } > > + > > + owl_sirq_clear_set_extctl(chip_data, INTC_EXTCTL_TYPE_MASK, sirq_type, > > + data->hwirq); > > + > > + return irq_chip_set_type_parent(data, type); > > +} > > + > > +static struct irq_chip owl_sirq_chip = { > > + .name = "owl-sirq", > > + .irq_mask = owl_sirq_mask, > > + .irq_unmask = owl_sirq_unmask, > > + .irq_eoi = owl_sirq_eoi, > > + .irq_set_type = owl_sirq_set_type, > > + .irq_retrigger = irq_chip_retrigger_hierarchy, > > How about irq_set_affinity? Or does it only exist on UP systems? I have just added: #ifdef CONFIG_SMP .irq_set_affinity = irq_chip_set_affinity_parent, #endif > > +}; > > + > > +static int owl_sirq_domain_translate(struct irq_domain *d, > > + struct irq_fwspec *fwspec, > > + unsigned long *hwirq, > > + unsigned int *type) > > +{ > > + if (!is_of_node(fwspec->fwnode)) > > + return -EINVAL; > > + > > + if (fwspec->param_count != 2 || fwspec->param[0] >= NUM_SIRQ) > > + return -EINVAL; > > + > > + *hwirq = fwspec->param[0]; > > + *type = fwspec->param[1]; > > + > > + return 0; > > +} > > + > > +static int owl_sirq_domain_alloc(struct irq_domain *domain, unsigned > > int virq, > > + unsigned int nr_irqs, void *data) > > +{ > > + struct owl_sirq_chip_data *chip_data = domain->host_data; > > + struct irq_fwspec *fwspec = data; > > + struct irq_fwspec parent_fwspec; > > + irq_hw_number_t hwirq; > > + unsigned int type; > > + int ret; > > + > > + if (WARN_ON(nr_irqs != 1)) > > + return -EINVAL; > > + > > + ret = owl_sirq_domain_translate(domain, fwspec, &hwirq, &type); > > + if (ret) > > + return ret; > > + > > + switch (type) { > > + case IRQ_TYPE_EDGE_RISING: > > + case IRQ_TYPE_LEVEL_HIGH: > > + break; > > + case IRQ_TYPE_EDGE_FALLING: > > + type = IRQ_TYPE_EDGE_RISING; > > + break; > > + case IRQ_TYPE_LEVEL_LOW: > > + type = IRQ_TYPE_LEVEL_HIGH; > > + break; > > + default: > > + return -EINVAL; > > + } > > + > > + irq_domain_set_hwirq_and_chip(domain, virq, hwirq, &owl_sirq_chip, > > + chip_data); > > + > > + parent_fwspec.fwnode = domain->parent->fwnode; > > + parent_fwspec.param_count = 3; > > + parent_fwspec.param[0] = 0; /* SPI */ > > + parent_fwspec.param[1] = chip_data->ext_irqs[hwirq]; > > + parent_fwspec.param[2] = type; > > + > > + return irq_domain_alloc_irqs_parent(domain, virq, 1, &parent_fwspec); > > +} > > + > > +static const struct irq_domain_ops owl_sirq_domain_ops = { > > + .translate = owl_sirq_domain_translate, > > + .alloc = owl_sirq_domain_alloc, > > + .free = irq_domain_free_irqs_common, > > +}; > > + > > +static const struct of_device_id owl_sirq_of_match[] = { > > + { .compatible = "actions,s500-sirq", .data = &owl_sirq_s500_params }, > > + { .compatible = "actions,s700-sirq", .data = &owl_sirq_s500_params }, > > + { .compatible = "actions,s900-sirq", .data = &owl_sirq_s900_params }, > > + { /* sentinel */ } > > +}; > > + > > +static int __init owl_sirq_of_init(struct device_node *node, > > + struct device_node *parent) > > +{ > > + const struct of_device_id *match; > > + struct irq_domain *domain, *parent_domain; > > + struct owl_sirq_chip_data *chip_data; > > + int ret, i; > > + > > + parent_domain = irq_find_host(parent); > > + if (!parent_domain) { > > + pr_err("%pOF: failed to find sirq parent domain\n", node); > > + return -ENXIO; > > + } > > + > > + chip_data = kzalloc(sizeof(*chip_data), GFP_KERNEL); > > + if (!chip_data) > > + return -ENOMEM; > > + > > + match = of_match_node(owl_sirq_of_match, node); > > + if (!match) { > > + pr_warn("owl-sirq: assuming S500/S700 compatible controller\n"); > > + chip_data->params = &owl_sirq_s500_params; > > + } else { > > + chip_data->params = match->data; > > + } > > + > > + raw_spin_lock_init(&chip_data->lock); > > + > > + chip_data->base = of_iomap(node, 0); > > + if (!chip_data->base) { > > + pr_err("%pOF: failed to map sirq registers\n", node); > > + ret = -ENXIO; > > + goto out_free; > > + } > > + > > + ret = of_property_read_variable_u32_array(node, > > "actions,ext-interrupts", > > + chip_data->ext_irqs, > > + NUM_SIRQ, NUM_SIRQ); > > + if (ret < NUM_SIRQ) { > > + pr_err("%pOF: failed to read sirq interrupts\n", node); > > + goto out_unmap; > > + } > > + > > + /* Set 24MHz external interrupt clock freq */ > > + for (i = 0; i < NUM_SIRQ; i++) > > + owl_sirq_clear_set_extctl(chip_data, 0, INTC_EXTCTL_CLK_SEL, i); > > + > > + domain = irq_domain_add_hierarchy(parent_domain, 0, NUM_SIRQ, node, > > + &owl_sirq_domain_ops, chip_data); > > + if (!domain) { > > + pr_err("%pOF: failed to add domain\n", node); > > + ret = -ENOMEM; > > + goto out_unmap; > > + } > > + > > + return 0; > > + > > +out_unmap: > > + iounmap(chip_data->base); > > +out_free: > > + kfree(chip_data); > > + > > + return ret; > > +} > > + > > +IRQCHIP_DECLARE(owl_sirq, "actions,owl-sirq", owl_sirq_of_init); > > Thanks, > > M. > -- > Jazz is not dead. It just smells funny... Thanks again, Cristi