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=-6.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,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 B3956C2BA1A for ; Fri, 24 Apr 2020 08:05:33 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 76B3320774 for ; Fri, 24 Apr 2020 08:05:33 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="c/SZeScc"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="jMKF0/4E" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 76B3320774 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-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=bombadil.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=L/quVEnVrqwcaEy6pE08oQX18xS9eRTebKEZzlDasnY=; b=c/SZeSccQiztvZ ot67yLYgAZ12V7ViqCheR2GmnPyPZa/BtmLY1K0cGvGJudOu/iqc1s3f0TsckxvC3coh9zEtQkNvb +JjgzTZs3iW9RJVBdqBtaYfJv5OT7ObMYtAXAGzZjZDo9ZBHX0BPtUZTSF+/WrEHngJVv9cGYXswh Mg6bY+pDg3o9A8Q1U8U+ic+ZFgLhSVo5QuJ4KAlmLgqFFTCk9qPsaN5kvddV/aUmccO4EUffg4qQp 9MxBrpt1nPCQeLkCEopStq3ZLt9Wf1f8buevOmFTsPv21NVpGywvq8lOBgQD/ylL88cLWJ07Nrc04 n1Q3HkiU7Mu6p7UMVbjA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jRtKx-0004FW-R7; Fri, 24 Apr 2020 08:05:27 +0000 Received: from mail-wm1-x344.google.com ([2a00:1450:4864:20::344]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jRtKt-0004Ei-DO for linux-arm-kernel@lists.infradead.org; Fri, 24 Apr 2020 08:05:25 +0000 Received: by mail-wm1-x344.google.com with SMTP id y24so9637565wma.4 for ; Fri, 24 Apr 2020 01:05:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=WmaSZtcJ97CVuu5ovBVXDQ/oN+gMvGID2LE/mRUyMFg=; b=jMKF0/4ElvJJU7ACf8LJ4xPnX+osyHWbnXvCkZLDHI2ozVzE73WQ1ti40GmhmeQaf4 W9d3u+Aq//ipqx5TPvpM0NqfkN+zhE5FqT5ZFFLJfeQEjbfeBxd+Ec+RCC1HWKrzeyBY tavYHXqgaU565PNno3ZyaLrtBJorwTriaG1N+LmnXJgQq2vJ7rysJHQSiMAreUdHwbeA iTB7d9JUrSt7OLQBpbRrlzf/icJxoRlONAW8+x3ndfwlF6G6yS9uv2iH2FQcFPL2l9zp vdCMQgjrw7hsYH99BsSLpgByq5izD+jxpJVsxD+iYbgVfl0wBfGn7bGmjephUqM3u80K b4VQ== 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=WmaSZtcJ97CVuu5ovBVXDQ/oN+gMvGID2LE/mRUyMFg=; b=YAtlVLIYRgTu0atP/YOomRbqkg5YpVMpocVInp3FKj4dPVhYhX4BDzx1wQtjDdr0jE uOu/DQzd7lamg4NpfB/3rn0KcXMSuctpNPmfXlqsIoed63VRu+WbHiVT/uwLghwC8lU1 IqWThwl9Iq4pUFPI0yFnh69bPtZ3h+7d5mS7HFIuTXPuBqv2rQZcP4pvlqeGg+N4KHmg UVf+VKecAqiup/DnG3zAGiEmznaMGk+NDBZ44WDpOvVArAmvAJik72O0Vy92/s0OmvHZ Wv8ID6dY747Pc2FvvWCVcXujdZCim99uBKegFShLlKrnRzoB4vtpesknPCKdjD3s3SEp JBdQ== X-Gm-Message-State: AGi0PuaNCVmhjXJdYbJOxCF6ihtfOcBZWBZSBFurZ2zypO20VIgS1NpV 14TSbTnJiytqjE0VwdnDvSdS7g== X-Google-Smtp-Source: APiQypKfRbQHOEb26CmLxcxK7PdDhRB4YNVM3ll52lyYv4/YuYOGq4FejHAjcQ9F2GuTU8hNHZDCuw== X-Received: by 2002:a1c:750a:: with SMTP id o10mr8535498wmc.124.1587715520195; Fri, 24 Apr 2020 01:05:20 -0700 (PDT) Received: from dell ([2.31.163.63]) by smtp.gmail.com with ESMTPSA id d7sm6958518wrn.78.2020.04.24.01.05.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Apr 2020 01:05:18 -0700 (PDT) Date: Fri, 24 Apr 2020 09:05:17 +0100 From: Lee Jones To: Jernej Skrabec Subject: Re: [RFC PATCH 1/4] mfd: Add support for AC200 Message-ID: <20200424080517.GO3612@dell> References: <20200416185758.1388148-1-jernej.skrabec@siol.net> <20200416185758.1388148-2-jernej.skrabec@siol.net> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20200416185758.1388148-2-jernej.skrabec@siol.net> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200424_010523_475561_9180A523 X-CRM114-Status: GOOD ( 28.62 ) 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: andrew@lunn.ch, f.fainelli@gmail.com, devicetree@vger.kernel.org, netdev@vger.kernel.org, linux@armlinux.org.uk, mripard@kernel.org, linux-kernel@vger.kernel.org, wens@csie.org, robh+dt@kernel.org, davem@davemloft.net, linux-arm-kernel@lists.infradead.org, hkallweit1@gmail.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gVGh1LCAxNiBBcHIgMjAyMCwgSmVybmVqIFNrcmFiZWMgd3JvdGU6Cgo+IFRoaXMgYWRkcyBz dXBwb3J0IGZvciBBQzIwMCBtdWx0aSBmdW5jdGlvbmFsIElDLiBJdCBjYW4gYmUgcGFja2FnZWQK PiBzdGFuZGFsb25lIG9yIGNvcGFja2FnZWQgd2l0aCBTb0MgbGlrZSBBbGx3aW5uZXIgSDYuCj4g Cj4gSXQgaGFzIGFuYWxvZyBhdWRpbyBjb2RlYywgQ1ZCUyBlbmNvZGVyLCBSVEMgYW5kIEZhc3Qg RXRoZXJuZXQgUEhZLgo+IERvY3VtZW50YXRpb24gYWxzbyBtZW50aW9uIGVGdXNlcywgYnV0IGl0 IHNlZW1zIHRoYXQgaXQncyBub3QgdXNlZCBpbgo+IGNvcGFja2FnZWQgdmFyaWFudC4KPiAKPiBT aWduZWQtb2ZmLWJ5OiBKZXJuZWogU2tyYWJlYyA8amVybmVqLnNrcmFiZWNAc2lvbC5uZXQ+Cj4g LS0tCj4gIGRyaXZlcnMvbWZkL0tjb25maWcgICAgICAgfCAgIDkgKysKPiAgZHJpdmVycy9tZmQv TWFrZWZpbGUgICAgICB8ICAgMSArCj4gIGRyaXZlcnMvbWZkL2FjMjAwLmMgICAgICAgfCAxODgg KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ICBpbmNsdWRlL2xpbnV4L21mZC9h YzIwMC5oIHwgMjEwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4gIDQg ZmlsZXMgY2hhbmdlZCwgNDA4IGluc2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRy aXZlcnMvbWZkL2FjMjAwLmMKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvbGludXgvbWZk L2FjMjAwLmgKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvS2NvbmZpZyBiL2RyaXZlcnMv bWZkL0tjb25maWcKPiBpbmRleCAwYTU5MjQ5MTk4ZDMuLjFkNmI3ZjNhZTE5MyAxMDA2NDQKPiAt LS0gYS9kcml2ZXJzL21mZC9LY29uZmlnCj4gKysrIGIvZHJpdmVycy9tZmQvS2NvbmZpZwo+IEBA IC0xNzgsNiArMTc4LDE1IEBAIGNvbmZpZyBNRkRfQUMxMDAKPiAgCSAgVGhpcyBkcml2ZXIgaW5j bHVkZSBvbmx5IHRoZSBjb3JlIEFQSXMuIFlvdSBoYXZlIHRvIHNlbGVjdCBpbmRpdmlkdWFsCj4g IAkgIGNvbXBvbmVudHMgbGlrZSBjb2RlY3Mgb3IgUlRDIHVuZGVyIHRoZSBjb3JyZXNwb25kaW5n IG1lbnVzLgo+ICAKPiArY29uZmlnIE1GRF9BQzIwMAo+ICsJdHJpc3RhdGUgIlgtUG93ZXJzIEFD MjAwIgo+ICsJc2VsZWN0IE1GRF9DT1JFCj4gKwlkZXBlbmRzIG9uIEkyQwo+ICsJaGVscAo+ICsJ ICBJZiB5b3Ugc2F5IFkgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBYLVBvd2VycyBBQzIw MCBJQy4KClBsZWFzZSBkZXNjcmliZSB0aGUgSUMgaGVyZS4KCj4gKwkgIFRoaXMgZHJpdmVyIGlu Y2x1ZGUgb25seSB0aGUgY29yZSBBUElzLiBZb3UgaGF2ZSB0byBzZWxlY3QgaW5kaXZpZHVhbAo+ ICsJICBjb21wb25lbnRzIGxpa2UgRXRoZXJuZXQgUEhZIG9yIFJUQyB1bmRlciB0aGUgY29ycmVz cG9uZGluZyBtZW51cy4KPiArCj4gIGNvbmZpZyBNRkRfQVhQMjBYCj4gIAl0cmlzdGF0ZQo+ICAJ c2VsZWN0IE1GRF9DT1JFCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL01ha2VmaWxlIGIvZHJp dmVycy9tZmQvTWFrZWZpbGUKPiBpbmRleCBmOTM1ZDEwY2JmMGYuLmEyMDQwNzI5MGQ2ZiAxMDA2 NDQKPiAtLS0gYS9kcml2ZXJzL21mZC9NYWtlZmlsZQo+ICsrKyBiL2RyaXZlcnMvbWZkL01ha2Vm aWxlCj4gQEAgLTE0Miw2ICsxNDIsNyBAQCBvYmotJChDT05GSUdfTUZEX0RBOTA1Ml9TUEkpCSs9 IGRhOTA1Mi1zcGkubwo+ICBvYmotJChDT05GSUdfTUZEX0RBOTA1Ml9JMkMpCSs9IGRhOTA1Mi1p MmMubwo+ICAKPiAgb2JqLSQoQ09ORklHX01GRF9BQzEwMCkJCSs9IGFjMTAwLm8KPiArb2JqLSQo Q09ORklHX01GRF9BQzIwMCkJCSs9IGFjMjAwLm8KPiAgb2JqLSQoQ09ORklHX01GRF9BWFAyMFgp CSs9IGF4cDIweC5vCj4gIG9iai0kKENPTkZJR19NRkRfQVhQMjBYX0kyQykJKz0gYXhwMjB4LWky Yy5vCj4gIG9iai0kKENPTkZJR19NRkRfQVhQMjBYX1JTQikJKz0gYXhwMjB4LXJzYi5vCj4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FjMjAwLmMgYi9kcml2ZXJzL21mZC9hYzIwMC5jCj4gbmV3 IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLmNmMjcxMGI4NDg3OQo+IC0t LSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL21mZC9hYzIwMC5jCj4gQEAgLTAsMCArMSwxODgg QEAKPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQo+ICsvKgo+ICsg KiBNRkQgY29yZSBkcml2ZXIgZm9yIFgtUG93ZXJzJyBBQzIwMCBJQwo+ICsgKgo+ICsgKiBUaGUg QUMyMDAgaXMgYSBjaGlwIHdoaWNoIGlzIGNvLXBhY2thZ2VkIHdpdGggQWxsd2lubmVyIEg2IFNv QyBhbmQKPiArICogaW5jbHVkZXMgYW5hbG9nIGF1ZGlvIGNvZGVjLCBhbmFsb2cgVFYgZW5jb2Rl ciwgZXRoZXJuZXQgUEhZLCBlRnVzZQo+ICsgKiBhbmQgUlRDLgo+ICsgKgo+ICsgKiBDb3B5cmln aHQgKGMpIDIwMjAgSmVybmVqIFNrcmFiZWMgPGplcm5lai5za3JhYmVjQHNpb2wubmV0PgoKVGhp cyB1c3VhbGx5IGdvZXMgaGlnaGVyIGluIHRoZSBoZWFkZXIgY29tbWVudC4KCj4gKyAqLwo+ICsK PiArI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgo+ICsjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+ Cj4gKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KPiArI2luY2x1ZGUgPGxpbnV4L21mZC9jb3Jl Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9tZmQvYWMyMDAuaD4KPiArI2luY2x1ZGUgPGxpbnV4L21v ZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4KCkFscGhhYmV0aWNhbC4KCj4gKy8qIElu dGVycnVwdHMgKi8KPiArI2RlZmluZSBBQzIwMF9JUlFfUlRDICAwCj4gKyNkZWZpbmUgQUMyMDBf SVJRX0VQSFkgMQo+ICsjZGVmaW5lIEFDMjAwX0lSUV9UVkUgIDIKPiArCj4gKy8qIElSUSBlbmFi bGUgcmVnaXN0ZXIgKi8KPiArI2RlZmluZSBBQzIwMF9TWVNfSVJRX0VOQUJMRV9PVVRfRU4gQklU KDE1KQo+ICsjZGVmaW5lIEFDMjAwX1NZU19JUlFfRU5BQkxFX1JUQyAgICBCSVQoMTIpCj4gKyNk ZWZpbmUgQUMyMDBfU1lTX0lSUV9FTkFCTEVfRVBIWSAgIEJJVCg4KQo+ICsjZGVmaW5lIEFDMjAw X1NZU19JUlFfRU5BQkxFX1RWRSAgICBCSVQoNCkKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg cmVnbWFwX3JhbmdlX2NmZyBhYzIwMF9yYW5nZV9jZmdbXSA9IHsKPiArCXsKPiArCQkucmFuZ2Vf bWluID0gQUMyMDBfU1lTX1ZFUlNJT04sCj4gKwkJLnJhbmdlX21heCA9IEFDMjAwX0lDX0NIQVJB MSwKPiArCQkuc2VsZWN0b3JfcmVnID0gQUMyMDBfVFdJX1JFR19BRERSX0gsCj4gKwkJLnNlbGVj dG9yX21hc2sgPSAweGZmLAo+ICsJCS5zZWxlY3Rvcl9zaGlmdCA9IDAsCj4gKwkJLndpbmRvd19z dGFydCA9IDAsCj4gKwkJLndpbmRvd19sZW4gPSAyNTYsCj4gKwl9Cj4gK307Cj4gKwo+ICtzdGF0 aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWMyMDBfcmVnbWFwX2NvbmZpZyA9IHsKPiAr CS5yZWdfYml0cwk9IDgsCj4gKwkudmFsX2JpdHMJPSAxNiwKPiArCS5yYW5nZXMJCT0gYWMyMDBf cmFuZ2VfY2ZnLAo+ICsJLm51bV9yYW5nZXMJPSBBUlJBWV9TSVpFKGFjMjAwX3JhbmdlX2NmZyks Cj4gKwkubWF4X3JlZ2lzdGVyCT0gQUMyMDBfSUNfQ0hBUkExLAo+ICt9Owo+ICsKPiArc3RhdGlj IGNvbnN0IHN0cnVjdCByZWdtYXBfaXJxIGFjMjAwX3JlZ21hcF9pcnFzW10gPSB7Cj4gKwlSRUdN QVBfSVJRX1JFRyhBQzIwMF9JUlFfUlRDLCAgMCwgQUMyMDBfU1lTX0lSUV9FTkFCTEVfUlRDKSwK PiArCVJFR01BUF9JUlFfUkVHKEFDMjAwX0lSUV9FUEhZLCAwLCBBQzIwMF9TWVNfSVJRX0VOQUJM RV9FUEhZKSwKPiArCVJFR01BUF9JUlFfUkVHKEFDMjAwX0lSUV9UVkUsICAwLCBBQzIwMF9TWVNf SVJRX0VOQUJMRV9UVkUpLAo+ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBf aXJxX2NoaXAgYWMyMDBfcmVnbWFwX2lycV9jaGlwID0gewo+ICsJLm5hbWUJCQk9ICJhYzIwMF9p cnFfY2hpcCIsCj4gKwkuc3RhdHVzX2Jhc2UJCT0gQUMyMDBfU1lTX0lSUV9TVEFUVVMsCj4gKwku bWFza19iYXNlCQk9IEFDMjAwX1NZU19JUlFfRU5BQkxFLAo+ICsJLm1hc2tfaW52ZXJ0CQk9IHRy dWUsCj4gKwkuaXJxcwkJCT0gYWMyMDBfcmVnbWFwX2lycXMsCj4gKwkubnVtX2lycXMJCT0gQVJS QVlfU0laRShhYzIwMF9yZWdtYXBfaXJxcyksCj4gKwkubnVtX3JlZ3MJCT0gMSwKPiArfTsKPiAr Cj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgZXBoeV9yZXNvdXJjZVtdID0gewo+ICsJ REVGSU5FX1JFU19JUlEoQUMyMDBfSVJRX0VQSFkpLAo+ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0 IHN0cnVjdCBtZmRfY2VsbCBhYzIwMF9jZWxsc1tdID0gewo+ICsJewo+ICsJCS5uYW1lCQk9ICJh YzIwMC1lcGh5IiwKPiArCQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZXBoeV9yZXNvdXJj ZSksCj4gKwkJLnJlc291cmNlcwk9IGVwaHlfcmVzb3VyY2UsCj4gKwkJLm9mX2NvbXBhdGlibGUJ PSAieC1wb3dlcnMsYWMyMDAtZXBoeSIsCj4gKwl9LAo+ICt9OwoKV2hlcmUgYXJlIHRoZSByZXNl dCBvZiB0aGUgZGV2aWNlcz8KCj4gK3N0YXRpYyBpbnQgYWMyMDBfaTJjX3Byb2JlKHN0cnVjdCBp MmNfY2xpZW50ICppMmMsCj4gKwkJCSAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkK PiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyYy0+ZGV2Owo+ICsJc3RydWN0IGFjMjAw X2RldiAqYWMyMDA7CgpzdHJ1Y3QgYWMyMDBfZGRhdGEgKmRkYXRhOwoKPiArCWludCByZXQ7Cj4g Kwo+ICsJYWMyMDAgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmFjMjAwKSwgR0ZQX0tFUk5F TCk7Cj4gKwlpZiAoIWFjMjAwKQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsKPiArCWkyY19zZXRf Y2xpZW50ZGF0YShpMmMsIGFjMjAwKTsKPiArCj4gKwlhYzIwMC0+cmVnbWFwID0gZGV2bV9yZWdt YXBfaW5pdF9pMmMoaTJjLCAmYWMyMDBfcmVnbWFwX2NvbmZpZyk7Cj4gKwlpZiAoSVNfRVJSKGFj MjAwLT5yZWdtYXApKSB7Cj4gKwkJZGV2X2VycihkZXYsICJyZWdtYXAgaW5pdCBmYWlsZWRcbiIp Owo+ICsJCXJldHVybiBQVFJfRVJSKGFjMjAwLT5yZWdtYXApOwo+ICsJfQo+ICsKPiArCWFjMjAw LT5jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCBOVUxMKTsKPiArCWlmIChJU19FUlIoYWMyMDAtPmNs aykpIHsKPiArCQlkZXZfZXJyKGRldiwgIkNhbid0IG9idGFpbiB0aGUgY2xvY2shXG4iKTsKPiAr CQlyZXR1cm4gUFRSX0VSUihhYzIwMC0+Y2xrKTsKPiArCX0KPiArCj4gKwlyZXQgPSBjbGtfcHJl cGFyZV9lbmFibGUoYWMyMDAtPmNsayk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4g Kwo+ICsJLyogZG8gYSByZXNldCB0byBwdXQgY2hpcCBpbiBhIGtub3duIHN0YXRlICovCgpJZiB5 b3UgZGVmaW5lIHRoZSBtYWdpYyB2YWx1ZXMgaGVyZSwgdGhpcyBjb21tZW50IGJlY29tZSBzdXBl cmZsdW91cy4KCj4gKwlyZXQgPSByZWdtYXBfd3JpdGUoYWMyMDAtPnJlZ21hcCwgQUMyMDBfU1lT X0NPTlRST0wsIDApOwo+ICsJaWYgKHJldCkKPiArCQlnb3RvIGVycl9mcmVlX2NsazsKPiArCj4g KwlyZXQgPSByZWdtYXBfd3JpdGUoYWMyMDAtPnJlZ21hcCwgQUMyMDBfU1lTX0NPTlRST0wsIDEp Owo+ICsJaWYgKHJldCkKPiArCQlnb3RvIGVycl9mcmVlX2NsazsKPiArCj4gKwkvKiBlbmFibGUg aW50ZXJydXB0IHBpbiAqLwoKVGhpcyBjb21tZW50IGNhbiBiZSBkcm9wcGVkLgoKPiArCXJldCA9 IHJlZ21hcF93cml0ZShhYzIwMC0+cmVnbWFwLCBBQzIwMF9TWVNfSVJRX0VOQUJMRSwKPiArCQkJ ICAgQUMyMDBfU1lTX0lSUV9FTkFCTEVfT1VUX0VOKTsKPiArCWlmIChyZXQpCj4gKwkJZ290byBl cnJfZnJlZV9jbGs7Cj4gKwo+ICsJcmV0ID0gcmVnbWFwX2FkZF9pcnFfY2hpcChhYzIwMC0+cmVn bWFwLCBpMmMtPmlycSwgSVJRRl9PTkVTSE9ULCAwLAo+ICsJCQkJICAmYWMyMDBfcmVnbWFwX2ly cV9jaGlwLCAmYWMyMDAtPnJlZ21hcF9pcnFjKTsKPiArCWlmIChyZXQpCj4gKwkJZ290byBlcnJf ZnJlZV9jbGs7Cj4gKwo+ICsJcmV0ID0gZGV2bV9tZmRfYWRkX2RldmljZXMoZGV2LCBQTEFURk9S TV9ERVZJRF9OT05FLCBhYzIwMF9jZWxscywKPiArCQkJCSAgIEFSUkFZX1NJWkUoYWMyMDBfY2Vs bHMpLCBOVUxMLCAwLCBOVUxMKTsKPiArCWlmIChyZXQpIHsKPiArCQlkZXZfZXJyKGRldiwgImZh aWxlZCB0byBhZGQgTUZEIGRldmljZXM6ICVkXG4iLCByZXQpOwoKIkZhaWxlZCB0byByZWdpc3Rl ciBjaGlsZCBkZXZpY2VzIgoKPiArCQlnb3RvIGVycl9kZWxfaXJxX2NoaXA7Cj4gKwl9CgpEbyB5 b3Ugd2FudCB0byBsZWF2ZSB0aGUgY2xvY2sgcnVubmluZyB3aGVuIHlvdSBsZWF2ZT8KClNlZW1z IHdhc3RlZnVsLgoKPiArCXJldHVybiAwOwo+ICsKPiArZXJyX2RlbF9pcnFfY2hpcDoKPiArCXJl Z21hcF9kZWxfaXJxX2NoaXAoaTJjLT5pcnEsIGFjMjAwLT5yZWdtYXBfaXJxYyk7CgpVc2UgdGhl IGRldm1fKiB2ZXJzaW9uLCB0aGVuIHlvdSBkbyBub3QgaGF2ZSB0byBjbGVhciB1cC4KCj4gK2Vy cl9mcmVlX2NsazoKPiArCWNsa19kaXNhYmxlX3VucHJlcGFyZShhYzIwMC0+Y2xrKTsKPiArCj4g KwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGFjMjAwX2kyY19yZW1vdmUoc3Ry dWN0IGkyY19jbGllbnQgKmkyYykKPiArewo+ICsJc3RydWN0IGFjMjAwX2RldiAqYWMyMDAgPSBp MmNfZ2V0X2NsaWVudGRhdGEoaTJjKTsKPiArCj4gKwkvKiBwdXQgY2hpcCBpbiByZXNldCBzdGF0 ZSAqLwoKVXNlIGRlZmluZXMsIHRoZW4gcmVtb3ZlIHRoZSBjb21tZW50LgoKPiArCXJlZ21hcF93 cml0ZShhYzIwMC0+cmVnbWFwLCBBQzIwMF9TWVNfQ09OVFJPTCwgMCk7Cj4gKwo+ICsJbWZkX3Jl bW92ZV9kZXZpY2VzKCZpMmMtPmRldik7CgpVc2UgZGV2bV8qIGluc3RlYWQuCgo+ICsJcmVnbWFw X2RlbF9pcnFfY2hpcChpMmMtPmlycSwgYWMyMDAtPnJlZ21hcF9pcnFjKTsKClVzZSBkZXZtXyog aW5zdGVhZC4KCj4gKwljbGtfZGlzYWJsZV91bnByZXBhcmUoYWMyMDAtPmNsayk7Cj4gKwo+ICsJ cmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBh YzIwMF9pZHNbXSA9IHsKPiArCXsgImFjMjAwIiwgfSwKPiArCXsgLyogc2VudGluZWwgKi8gfQoK Tm8gbmVlZCBmb3IgdGhpcyBjb21tZW50LgoKSW4gZmFjdCwgbm8gbmVlZCBmb3IgdGhpcyB0YWJs ZS4gIEl0IGNhbiBiZSByZW1vdmVkLgoKPiArfTsKPiArTU9EVUxFX0RFVklDRV9UQUJMRShpMmMs IGFjMjAwX2lkcyk7Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhYzIw MF9vZl9tYXRjaFtdID0gewo+ICsJeyAuY29tcGF0aWJsZSA9ICJ4LXBvd2VycyxhYzIwMCIgfSwK PiArCXsgLyogc2VudGluZWwgKi8gfQoKTm8gbmVlZCBmb3IgdGhpcyBjb21tZW50LgoKPiArfTsK PiArTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYWMyMDBfb2ZfbWF0Y2gpOwo+ICsKPiArc3RhdGlj IHN0cnVjdCBpMmNfZHJpdmVyIGFjMjAwX2kyY19kcml2ZXIgPSB7Cj4gKwkuZHJpdmVyID0gewo+ ICsJCS5uYW1lCT0gImFjMjAwIiwKPiArCQkub2ZfbWF0Y2hfdGFibGUJPSBvZl9tYXRjaF9wdHIo YWMyMDBfb2ZfbWF0Y2gpLAo+ICsJfSwKPiArCS5wcm9iZQk9IGFjMjAwX2kyY19wcm9iZSwKPiAr CS5yZW1vdmUgPSBhYzIwMF9pMmNfcmVtb3ZlLAo+ICsJLmlkX3RhYmxlID0gYWMyMDBfaWRzLAo+ ICt9Owo+ICttb2R1bGVfaTJjX2RyaXZlcihhYzIwMF9pMmNfZHJpdmVyKTsKPiArCj4gK01PRFVM RV9ERVNDUklQVElPTigiTUZEIGNvcmUgZHJpdmVyIGZvciBBQzIwMCIpOwoKIlBhcmVudCBkcml2 ZXIgLi4uIgoKPiArTU9EVUxFX0FVVEhPUigiSmVybmVqIFNrcmFiZWMgPGplcm5lai5za3JhYmVj QHNpb2wubmV0PiIpOwo+ICtNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cj4gZGlmZiAtLWdpdCBh L2luY2x1ZGUvbGludXgvbWZkL2FjMjAwLmggYi9pbmNsdWRlL2xpbnV4L21mZC9hYzIwMC5oCj4g bmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLmY3NWJhZjBkOTEwYwo+ IC0tLSAvZGV2L251bGwKPiArKysgYi9pbmNsdWRlL2xpbnV4L21mZC9hYzIwMC5oCj4gQEAgLTAs MCArMSwyMTAgQEAKPiArLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAq Lwo+ICsvKgo+ICsgKiBBQzIwMCByZWdpc3RlciBsaXN0Cj4gKyAqCj4gKyAqIENvcHlyaWdodCAo QykgMjAxOSBKZXJuZWogU2tyYWJlYyA8amVybmVqLnNrcmFiZWNAc2lvbC5uZXQ+CgpUaGlzIHVz dWFsbHkgc2l0cyBoaWdoZXIuCgo+ICsgKi8KPiArCj4gKyNpZm5kZWYgX19MSU5VWF9NRkRfQUMy MDBfSAo+ICsjZGVmaW5lIF9fTElOVVhfTUZEX0FDMjAwX0gKPiArCj4gKyNpbmNsdWRlIDxsaW51 eC9jbGsuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgo+ICsKPiArLyogaW50ZXJmYWNl IHJlZ2lzdGVycyAoY2FuIGJlIGFjY2Vzc2VkIGZyb20gYW55IHBhZ2UpICovCgpQbGVhc2UgdXNl IGNvcnJlY3QgZ3JhbW1hciBpbiBjb21tZW50cy4KCiJJbnRlcmZhY2UiCgo+ICsjZGVmaW5lIEFD MjAwX1RXSV9DSEFOR0VfVE9fUlNCCQkweDNFCj4gKyNkZWZpbmUgQUMyMDBfVFdJX1BBRF9ERUxB WQkJMHhDNAo+ICsjZGVmaW5lIEFDMjAwX1RXSV9SRUdfQUREUl9ICQkweEZFCj4gKwo+ICsvKiBH ZW5lcmFsIHJlZ2lzdGVycyAqLwo+ICsjZGVmaW5lIEFDMjAwX1NZU19WRVJTSU9OCQkweDAwMDAK PiArI2RlZmluZSBBQzIwMF9TWVNfQ09OVFJPTAkJMHgwMDAyCj4gKyNkZWZpbmUgQUMyMDBfU1lT X0lSUV9FTkFCTEUJCTB4MDAwNAo+ICsjZGVmaW5lIEFDMjAwX1NZU19JUlFfU1RBVFVTCQkweDAw MDYKPiArI2RlZmluZSBBQzIwMF9TWVNfQ0xLX0NUTAkJMHgwMDA4Cj4gKyNkZWZpbmUgQUMyMDBf U1lTX0RMRE9fT1NDX0NUTAkJMHgwMDBBCj4gKyNkZWZpbmUgQUMyMDBfU1lTX1BMTF9DVEwwCQkw eDAwMEMKPiArI2RlZmluZSBBQzIwMF9TWVNfUExMX0NUTDEJCTB4MDAwRQo+ICsjZGVmaW5lIEFD MjAwX1NZU19BVURJT19DVEwwCQkweDAwMTAKPiArI2RlZmluZSBBQzIwMF9TWVNfQVVESU9fQ1RM MQkJMHgwMDEyCj4gKyNkZWZpbmUgQUMyMDBfU1lTX0VQSFlfQ1RMMAkJMHgwMDE0Cj4gKyNkZWZp bmUgQUMyMDBfU1lTX0VQSFlfQ1RMMQkJMHgwMDE2Cj4gKyNkZWZpbmUgQUMyMDBfU1lTX1RWRV9D VEwwCQkweDAwMTgKPiArI2RlZmluZSBBQzIwMF9TWVNfVFZFX0NUTDEJCTB4MDAxQQo+ICsKPiAr LyogQXVkaW8gQ29kZWMgcmVnaXN0ZXJzICovCj4gKyNkZWZpbmUgQUMyMDBfQUNfU1lTX0NMS19D VEwJCTB4MjAwMAo+ICsjZGVmaW5lIEFDMjAwX1NZU19NT0RfUlNUCQkweDIwMDIKPiArI2RlZmlu ZSBBQzIwMF9TWVNfU0FNUF9DVEwJCTB4MjAwNAo+ICsjZGVmaW5lIEFDMjAwX0kyU19DVEwJCQkw eDIxMDAKPiArI2RlZmluZSBBQzIwMF9JMlNfQ0xLCQkJMHgyMTAyCj4gKyNkZWZpbmUgQUMyMDBf STJTX0ZNVDAJCQkweDIxMDQKPiArI2RlZmluZSBBQzIwMF9JMlNfRk1UMQkJCTB4MjEwOAo+ICsj ZGVmaW5lIEFDMjAwX0kyU19NSVhfU1JDCQkweDIxMTQKPiArI2RlZmluZSBBQzIwMF9JMlNfTUlY X0dBSU4JCTB4MjExNgo+ICsjZGVmaW5lIEFDMjAwX0kyU19EQUNEQVRfRFZDCQkweDIxMTgKPiAr I2RlZmluZSBBQzIwMF9JMlNfQURDREFUX0RWQwkJMHgyMTFBCj4gKyNkZWZpbmUgQUMyMDBfQUNf REFDX0RQQwkJMHgyMjAwCj4gKyNkZWZpbmUgQUMyMDBfQUNfREFDX01JWF9TUkMJCTB4MjIwMgo+ ICsjZGVmaW5lIEFDMjAwX0FDX0RBQ19NSVhfR0FJTgkJMHgyMjA0Cj4gKyNkZWZpbmUgQUMyMDBf REFDQV9PTUlYRVJfQ1RSTAkJMHgyMjIwCj4gKyNkZWZpbmUgQUMyMDBfT01JWEVSX1NSCQkJMHgy MjIyCj4gKyNkZWZpbmUgQUMyMDBfTElORU9VVF9DVFJMCQkweDIyMjQKPiArI2RlZmluZSBBQzIw MF9BQ19BRENfRFBDCQkweDIzMDAKPiArI2RlZmluZSBBQzIwMF9NQklBU19DVFJMCQkweDIzMTAK PiArI2RlZmluZSBBQzIwMF9BRENfTUlDX0NUUkwJCTB4MjMyMAo+ICsjZGVmaW5lIEFDMjAwX0FE Q01JWEVSX1NSCQkweDIzMjIKPiArI2RlZmluZSBBQzIwMF9BTkFMT0dfVFVOSU5HMAkJMHgyMzJB Cj4gKyNkZWZpbmUgQUMyMDBfQU5BTE9HX1RVTklORzEJCTB4MjMyQwo+ICsjZGVmaW5lIEFDMjAw X0FDX0FHQ19TRUwJCTB4MjQ4MAo+ICsjZGVmaW5lIEFDMjAwX0FEQ19EQVBMQ1RSTAkJMHgyNTAw Cj4gKyNkZWZpbmUgQUMyMDBfQURDX0RBUFJDVFJMCQkweDI1MDIKPiArI2RlZmluZSBBQzIwMF9B RENfREFQTFNUQQkJMHgyNTA0Cj4gKyNkZWZpbmUgQUMyMDBfQURDX0RBUFJTVEEJCTB4MjUwNgo+ ICsjZGVmaW5lIEFDMjAwX0FEQ19EQVBMVEwJCTB4MjUwOAo+ICsjZGVmaW5lIEFDMjAwX0FEQ19E QVBSVEwJCTB4MjUwQQo+ICsjZGVmaW5lIEFDMjAwX0FEQ19EQVBMSEFDCQkweDI1MEMKPiArI2Rl ZmluZSBBQzIwMF9BRENfREFQTExBQwkJMHgyNTBFCj4gKyNkZWZpbmUgQUMyMDBfQURDX0RBUFJI QUMJCTB4MjUxMAo+ICsjZGVmaW5lIEFDMjAwX0FEQ19EQVBSTEFDCQkweDI1MTIKPiArI2RlZmlu ZSBBQzIwMF9BRENfREFQTERUCQkweDI1MTQKPiArI2RlZmluZSBBQzIwMF9BRENfREFQTEFUCQkw eDI1MTYKPiArI2RlZmluZSBBQzIwMF9BRENfREFQUkRUCQkweDI1MTgKPiArI2RlZmluZSBBQzIw MF9BRENfREFQUkFUCQkweDI1MUEKPiArI2RlZmluZSBBQzIwMF9BRENfREFQTlRICQkweDI1MUMK PiArI2RlZmluZSBBQzIwMF9BRENfREFQTEhOQUMJCTB4MjUxRQo+ICsjZGVmaW5lIEFDMjAwX0FE Q19EQVBMTE5BQwkJMHgyNTIwCj4gKyNkZWZpbmUgQUMyMDBfQURDX0RBUFJITkFDCQkweDI1MjIK PiArI2RlZmluZSBBQzIwMF9BRENfREFQUkxOQUMJCTB4MjUyNAo+ICsjZGVmaW5lIEFDMjAwX0FD X0RBUEhIUEZDCQkweDI1MjYKPiArI2RlZmluZSBBQzIwMF9BQ19EQVBMSFBGQwkJMHgyNTI4Cj4g KyNkZWZpbmUgQUMyMDBfQUNfREFQT1BUCQkJMHgyNTJBCj4gKyNkZWZpbmUgQUMyMDBfQUNfREFD X0RBUENUUkwJCTB4MzAwMAo+ICsjZGVmaW5lIEFDMjAwX0FDX0RSQ19ISFBGQwkJMHgzMDAyCj4g KyNkZWZpbmUgQUMyMDBfQUNfRFJDX0xIUEZDCQkweDMwMDQKPiArI2RlZmluZSBBQzIwMF9BQ19E UkNfQ1RSTAkJMHgzMDA2Cj4gKyNkZWZpbmUgQUMyMDBfQUNfRFJDX0xQRkhBVAkJMHgzMDA4Cj4g KyNkZWZpbmUgQUMyMDBfQUNfRFJDX0xQRkxBVAkJMHgzMDBBCj4gKyNkZWZpbmUgQUMyMDBfQUNf RFJDX1JQRkhBVAkJMHgzMDBDCj4gKyNkZWZpbmUgQUMyMDBfQUNfRFJDX1JQRkxBVAkJMHgzMDBF Cj4gKyNkZWZpbmUgQUMyMDBfQUNfRFJDX0xQRkhSVAkJMHgzMDEwCj4gKyNkZWZpbmUgQUMyMDBf QUNfRFJDX0xQRkxSVAkJMHgzMDEyCj4gKyNkZWZpbmUgQUMyMDBfQUNfRFJDX1JQRkhSVAkJMHgz MDE0Cj4gKyNkZWZpbmUgQUMyMDBfQUNfRFJDX1JQRkxSVAkJMHgzMDE2Cj4gKyNkZWZpbmUgQUMy MDBfQUNfRFJDX0xSTVNIQVQJCTB4MzAxOAo+ICsjZGVmaW5lIEFDMjAwX0FDX0RSQ19MUk1TTEFU CQkweDMwMUEKPiArI2RlZmluZSBBQzIwMF9BQ19EUkNfUlJNU0hBVAkJMHgzMDFDCj4gKyNkZWZp bmUgQUMyMDBfQUNfRFJDX1JSTVNMQVQJCTB4MzAxRQo+ICsjZGVmaW5lIEFDMjAwX0FDX0RSQ19I Q1QJCTB4MzAyMAo+ICsjZGVmaW5lIEFDMjAwX0FDX0RSQ19MQ1QJCTB4MzAyMgo+ICsjZGVmaW5l IEFDMjAwX0FDX0RSQ19IS0MJCTB4MzAyNAo+ICsjZGVmaW5lIEFDMjAwX0FDX0RSQ19MS0MJCTB4 MzAyNgo+ICsjZGVmaW5lIEFDMjAwX0FDX0RSQ19IT1BDCQkweDMwMjgKPiArI2RlZmluZSBBQzIw MF9BQ19EUkNfTE9QQwkJMHgzMDJBCj4gKyNkZWZpbmUgQUMyMDBfQUNfRFJDX0hMVAkJMHgzMDJD Cj4gKyNkZWZpbmUgQUMyMDBfQUNfRFJDX0xMVAkJMHgzMDJFCj4gKyNkZWZpbmUgQUMyMDBfQUNf RFJDX0hLSQkJMHgzMDMwCj4gKyNkZWZpbmUgQUMyMDBfQUNfRFJDX0xLSQkJMHgzMDMyCj4gKyNk ZWZpbmUgQUMyMDBfQUNfRFJDX0hPUEwJCTB4MzAzNAo+ICsjZGVmaW5lIEFDMjAwX0FDX0RSQ19M T1BMCQkweDMwMzYKPiArI2RlZmluZSBBQzIwMF9BQ19EUkNfSEVUCQkweDMwMzgKPiArI2RlZmlu ZSBBQzIwMF9BQ19EUkNfTEVUCQkweDMwM0EKPiArI2RlZmluZSBBQzIwMF9BQ19EUkNfSEtFCQkw eDMwM0MKPiArI2RlZmluZSBBQzIwMF9BQ19EUkNfTEtFCQkweDMwM0UKPiArI2RlZmluZSBBQzIw MF9BQ19EUkNfSE9QRQkJMHgzMDQwCj4gKyNkZWZpbmUgQUMyMDBfQUNfRFJDX0xPUEUJCTB4MzA0 Mgo+ICsjZGVmaW5lIEFDMjAwX0FDX0RSQ19IS04JCTB4MzA0NAo+ICsjZGVmaW5lIEFDMjAwX0FD X0RSQ19MS04JCTB4MzA0Ngo+ICsjZGVmaW5lIEFDMjAwX0FDX0RSQ19TRkhBVAkJMHgzMDQ4Cj4g KyNkZWZpbmUgQUMyMDBfQUNfRFJDX1NGTEFUCQkweDMwNEEKPiArI2RlZmluZSBBQzIwMF9BQ19E UkNfU0ZIUlQJCTB4MzA0Qwo+ICsjZGVmaW5lIEFDMjAwX0FDX0RSQ19TRkxSVAkJMHgzMDRFCj4g KyNkZWZpbmUgQUMyMDBfQUNfRFJDX01YR0hTCQkweDMwNTAKPiArI2RlZmluZSBBQzIwMF9BQ19E UkNfTVhHTFMJCTB4MzA1Mgo+ICsjZGVmaW5lIEFDMjAwX0FDX0RSQ19NTkdIUwkJMHgzMDU0Cj4g KyNkZWZpbmUgQUMyMDBfQUNfRFJDX01OR0xTCQkweDMwNTYKPiArI2RlZmluZSBBQzIwMF9BQ19E UkNfRVBTSEMJCTB4MzA1OAo+ICsjZGVmaW5lIEFDMjAwX0FDX0RSQ19FUFNMQwkJMHgzMDVBCj4g KyNkZWZpbmUgQUMyMDBfQUNfRFJDX0hQRkhHQUlOCQkweDMwNUUKPiArI2RlZmluZSBBQzIwMF9B Q19EUkNfSFBGTEdBSU4JCTB4MzA2MAo+ICsjZGVmaW5lIEFDMjAwX0FDX0RSQ19CSVNUQ1IJCTB4 MzEwMAo+ICsjZGVmaW5lIEFDMjAwX0FDX0RSQ19CSVNUU1QJCTB4MzEwMgo+ICsKPiArLyogVFZF IHJlZ2lzdGVycyAqLwo+ICsjZGVmaW5lIEFDMjAwX1RWRV9DVEwwCQkJMHg0MDAwCj4gKyNkZWZp bmUgQUMyMDBfVFZFX0NUTDEJCQkweDQwMDIKPiArI2RlZmluZSBBQzIwMF9UVkVfTU9EMAkJCTB4 NDAwNAo+ICsjZGVmaW5lIEFDMjAwX1RWRV9NT0QxCQkJMHg0MDA2Cj4gKyNkZWZpbmUgQUMyMDBf VFZFX0RBQ19DRkcwCQkweDQwMDgKPiArI2RlZmluZSBBQzIwMF9UVkVfREFDX0NGRzEJCTB4NDAw QQo+ICsjZGVmaW5lIEFDMjAwX1RWRV9ZQ19ERUxBWQkJMHg0MDBDCj4gKyNkZWZpbmUgQUMyMDBf VFZFX1lDX0ZJTFRFUgkJMHg0MDBFCj4gKyNkZWZpbmUgQUMyMDBfVFZFX0JVUlNUX0ZSUTAJCTB4 NDAxMAo+ICsjZGVmaW5lIEFDMjAwX1RWRV9CVVJTVF9GUlExCQkweDQwMTIKPiArI2RlZmluZSBB QzIwMF9UVkVfRlJPTlRfUE9SQ0gJCTB4NDAxNAo+ICsjZGVmaW5lIEFDMjAwX1RWRV9CQUNLX1BP UkNICQkweDQwMTYKPiArI2RlZmluZSBBQzIwMF9UVkVfVE9UQUxfTElORQkJMHg0MDFDCj4gKyNk ZWZpbmUgQUMyMDBfVFZFX0ZJUlNUX0FDVElWRQkJMHg0MDFFCj4gKyNkZWZpbmUgQUMyMDBfVFZF X0JMQUNLX0xFVkVMCQkweDQwMjAKPiArI2RlZmluZSBBQzIwMF9UVkVfQkxBTktfTEVWRUwJCTB4 NDAyMgo+ICsjZGVmaW5lIEFDMjAwX1RWRV9QTFVHX0VOCQkweDQwMzAKPiArI2RlZmluZSBBQzIw MF9UVkVfUExVR19JUlFfRU4JCTB4NDAzMgo+ICsjZGVmaW5lIEFDMjAwX1RWRV9QTFVHX0lSUV9T VEEJCTB4NDAzNAo+ICsjZGVmaW5lIEFDMjAwX1RWRV9QTFVHX1NUQQkJMHg0MDM4Cj4gKyNkZWZp bmUgQUMyMDBfVFZFX1BMVUdfREVCT1VOQ0UJCTB4NDA0MAo+ICsjZGVmaW5lIEFDMjAwX1RWRV9E QUNfVEVTVAkJMHg0MDQyCj4gKyNkZWZpbmUgQUMyMDBfVFZFX1BMVUdfUFVMU0VfTEVWRUwJMHg0 MEY0Cj4gKyNkZWZpbmUgQUMyMDBfVFZFX1BMVUdfUFVMU0VfU1RBUlQJMHg0MEY4Cj4gKyNkZWZp bmUgQUMyMDBfVFZFX1BMVUdfUFVMU0VfUEVSSU9ECTB4NDBGQQo+ICsjZGVmaW5lIEFDMjAwX1RW RV9JRl9DVEwJCTB4NTAwMAo+ICsjZGVmaW5lIEFDMjAwX1RWRV9JRl9USU0wCQkweDUwMDgKPiAr I2RlZmluZSBBQzIwMF9UVkVfSUZfVElNMQkJMHg1MDBBCj4gKyNkZWZpbmUgQUMyMDBfVFZFX0lG X1RJTTIJCTB4NTAwQwo+ICsjZGVmaW5lIEFDMjAwX1RWRV9JRl9USU0zCQkweDUwMEUKPiArI2Rl ZmluZSBBQzIwMF9UVkVfSUZfU1lOQzAJCTB4NTAxMAo+ICsjZGVmaW5lIEFDMjAwX1RWRV9JRl9T WU5DMQkJMHg1MDEyCj4gKyNkZWZpbmUgQUMyMDBfVFZFX0lGX1NZTkMyCQkweDUwMTQKPiArI2Rl ZmluZSBBQzIwMF9UVkVfSUZfVElNNAkJMHg1MDE2Cj4gKyNkZWZpbmUgQUMyMDBfVFZFX0lGX1NU QVRVUwkJMHg1MDE4Cj4gKwo+ICsvKiBFUEhZIHJlZ2lzdGVycyAqLwo+ICsjZGVmaW5lIEFDMjAw X0VQSFlfQ1RMCQkJMHg2MDAwCj4gKyNkZWZpbmUgQUMyMDBfRVBIWV9CSVNUCQkJMHg2MDAyCj4g Kwo+ICsvKiBlRnVzZSByZWdpc3RlcnMgKDB4ODAwMCAtIDB4OUZGRiwgbGF5b3V0IHVua25vd24p ICovCj4gKwo+ICsvKiBSVEMgcmVnaXN0ZXJzICovCj4gKyNkZWZpbmUgQUMyMDBfTE9TQ19DVFJM MAkJMHhBMDAwCj4gKyNkZWZpbmUgQUMyMDBfTE9TQ19DVFJMMQkJMHhBMDAyCj4gKyNkZWZpbmUg QUMyMDBfTE9TQ19BVVRPX1NXVF9TVEEJCTB4QTAwNAo+ICsjZGVmaW5lIEFDMjAwX0lOVE9TQ19D TEtfUFJFU0NBTAkweEEwMDgKPiArI2RlZmluZSBBQzIwMF9SVENfWVlfTU1fREQwCQkweEEwMTAK PiArI2RlZmluZSBBQzIwMF9SVENfWVlfTU1fREQxCQkweEEwMTIKPiArI2RlZmluZSBBQzIwMF9S VENfSEhfTU1fU1MwCQkweEEwMTQKPiArI2RlZmluZSBBQzIwMF9SVENfSEhfTU1fU1MxCQkweEEw MTYKPiArI2RlZmluZSBBQzIwMF9BTEFSTTBfQ1VSX1ZMVTAJCTB4QTAyNAo+ICsjZGVmaW5lIEFD MjAwX0FMQVJNMF9DVVJfVkxVMQkJMHhBMDI2Cj4gKyNkZWZpbmUgQUMyMDBfQUxBUk0wX0VOQUJM RQkJMHhBMDI4Cj4gKyNkZWZpbmUgQUMyMDBfQUxBUk0wX0lSUV9FTgkJMHhBMDJDCj4gKyNkZWZp bmUgQUMyMDBfQUxBUk0wX0lSUV9TVEEJCTB4QTAzMAo+ICsjZGVmaW5lIEFDMjAwX0FMQVJNMV9X S19ISF9NTV9TUzAJMHhBMDQwCj4gKyNkZWZpbmUgQUMyMDBfQUxBUk0xX1dLX0hIX01NX1NTMQkw eEEwNDIKPiArI2RlZmluZSBBQzIwMF9BTEFSTTFfRU5BQkxFCQkweEEwNDQKPiArI2RlZmluZSBB QzIwMF9BTEFSTTFfSVJRX0VOCQkweEEwNDgKPiArI2RlZmluZSBBQzIwMF9BTEFSTTFfSVJRX1NU QQkJMHhBMDRDCj4gKyNkZWZpbmUgQUMyMDBfQUxBUk1fQ09ORklHCQkweEEwNTAKPiArI2RlZmlu ZSBBQzIwMF9MT1NDX09VVF9HQVRJTkcJCTB4QTA2MAo+ICsjZGVmaW5lIEFDMjAwX0dQX0RBVEEo eCkJCSgweEExMDAgKyAoeCkgKiAyKQo+ICsjZGVmaW5lIEFDMjAwX1JUQ19ERUIJCQkweEExNzAK PiArI2RlZmluZSBBQzIwMF9HUExfSE9MRF9PVVRQVVQJCTB4QTE4MAo+ICsjZGVmaW5lIEFDMjAw X1ZERF9SVEMJCQkweEExOTAKPiArI2RlZmluZSBBQzIwMF9JQ19DSEFSQTAJCQkweEExRjAKPiAr I2RlZmluZSBBQzIwMF9JQ19DSEFSQTEJCQkweEExRjIKPiArCj4gK3N0cnVjdCBhYzIwMF9kZXYg ewo+ICsJc3RydWN0IGNsawkJCSpjbGs7Cj4gKwlzdHJ1Y3QgcmVnbWFwCQkJKnJlZ21hcDsKPiAr CXN0cnVjdCByZWdtYXBfaXJxX2NoaXBfZGF0YQkqcmVnbWFwX2lycWM7Cj4gK307Cj4gKwo+ICsj ZW5kaWYgLyogX19MSU5VWF9NRkRfQUMyMDBfSCAqLwoKLS0gCkxlZSBKb25lcyBb5p2O55C85pav XQpMaW5hcm8gU2VydmljZXMgVGVjaG5pY2FsIExlYWQKTGluYXJvLm9yZyDilIIgT3BlbiBzb3Vy Y2Ugc29mdHdhcmUgZm9yIEFSTSBTb0NzCkZvbGxvdyBMaW5hcm86IEZhY2Vib29rIHwgVHdpdHRl ciB8IEJsb2cKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f CmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5m cmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xp bnV4LWFybS1rZXJuZWwK 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=-6.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,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 310C5C2BA1A for ; Fri, 24 Apr 2020 08:05:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id EEDC620774 for ; Fri, 24 Apr 2020 08:05:22 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="jMKF0/4E" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726056AbgDXIFW (ORCPT ); Fri, 24 Apr 2020 04:05:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38970 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726028AbgDXIFW (ORCPT ); Fri, 24 Apr 2020 04:05:22 -0400 Received: from mail-wm1-x344.google.com (mail-wm1-x344.google.com [IPv6:2a00:1450:4864:20::344]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BDA29C09B046 for ; Fri, 24 Apr 2020 01:05:21 -0700 (PDT) Received: by mail-wm1-x344.google.com with SMTP id z6so9644464wml.2 for ; Fri, 24 Apr 2020 01:05:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=WmaSZtcJ97CVuu5ovBVXDQ/oN+gMvGID2LE/mRUyMFg=; b=jMKF0/4ElvJJU7ACf8LJ4xPnX+osyHWbnXvCkZLDHI2ozVzE73WQ1ti40GmhmeQaf4 W9d3u+Aq//ipqx5TPvpM0NqfkN+zhE5FqT5ZFFLJfeQEjbfeBxd+Ec+RCC1HWKrzeyBY tavYHXqgaU565PNno3ZyaLrtBJorwTriaG1N+LmnXJgQq2vJ7rysJHQSiMAreUdHwbeA iTB7d9JUrSt7OLQBpbRrlzf/icJxoRlONAW8+x3ndfwlF6G6yS9uv2iH2FQcFPL2l9zp vdCMQgjrw7hsYH99BsSLpgByq5izD+jxpJVsxD+iYbgVfl0wBfGn7bGmjephUqM3u80K b4VQ== 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=WmaSZtcJ97CVuu5ovBVXDQ/oN+gMvGID2LE/mRUyMFg=; b=CsGKmAKlH/a7WsMAb/h1+9B3qNpBgkbIxgBpv4Xtcfwax5HJrNXCm/3wdR4Xo8/IfU gPH7soMbSSDvL9osfPcbxuiXbqAHAvQB+G1F00enoYOqBIVRL6817nNK2C4UlnodSuDo v0Uo8Lyiu3u0SMy4scWDJruVGlJCVsxIHYya5b3EkL3VHO7Bs+TgbC7aNBuw5gNAgtO+ S+EgHXigMVyy2XWwV2UuKnn5R7ijh1yV1vXvJGqAuWklKkXfU+AeUCIO2uKvnUBsdf25 iQvmpju7RBOBH3mIly1fcLWEHo/FoPx+zXf8Tg3uR32W0UrFrDVaJEGwLSupEl+iYbwV cO5A== X-Gm-Message-State: AGi0PuYRg7BpLcz/WUEFlNkTaqj6jww70iPNyOlGlULwQcQfGtoRJZU+ XbG7uhlFWtV/fDMmGBhEV63VOA== X-Google-Smtp-Source: APiQypKfRbQHOEb26CmLxcxK7PdDhRB4YNVM3ll52lyYv4/YuYOGq4FejHAjcQ9F2GuTU8hNHZDCuw== X-Received: by 2002:a1c:750a:: with SMTP id o10mr8535498wmc.124.1587715520195; Fri, 24 Apr 2020 01:05:20 -0700 (PDT) Received: from dell ([2.31.163.63]) by smtp.gmail.com with ESMTPSA id d7sm6958518wrn.78.2020.04.24.01.05.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Apr 2020 01:05:18 -0700 (PDT) Date: Fri, 24 Apr 2020 09:05:17 +0100 From: Lee Jones To: Jernej Skrabec Cc: robh+dt@kernel.org, andrew@lunn.ch, f.fainelli@gmail.com, hkallweit1@gmail.com, mripard@kernel.org, wens@csie.org, linux@armlinux.org.uk, davem@davemloft.net, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org Subject: Re: [RFC PATCH 1/4] mfd: Add support for AC200 Message-ID: <20200424080517.GO3612@dell> References: <20200416185758.1388148-1-jernej.skrabec@siol.net> <20200416185758.1388148-2-jernej.skrabec@siol.net> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20200416185758.1388148-2-jernej.skrabec@siol.net> Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org On Thu, 16 Apr 2020, Jernej Skrabec wrote: > This adds support for AC200 multi functional IC. It can be packaged > standalone or copackaged with SoC like Allwinner H6. > > It has analog audio codec, CVBS encoder, RTC and Fast Ethernet PHY. > Documentation also mention eFuses, but it seems that it's not used in > copackaged variant. > > Signed-off-by: Jernej Skrabec > --- > drivers/mfd/Kconfig | 9 ++ > drivers/mfd/Makefile | 1 + > drivers/mfd/ac200.c | 188 ++++++++++++++++++++++++++++++++++ > include/linux/mfd/ac200.h | 210 ++++++++++++++++++++++++++++++++++++++ > 4 files changed, 408 insertions(+) > create mode 100644 drivers/mfd/ac200.c > create mode 100644 include/linux/mfd/ac200.h > > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig > index 0a59249198d3..1d6b7f3ae193 100644 > --- a/drivers/mfd/Kconfig > +++ b/drivers/mfd/Kconfig > @@ -178,6 +178,15 @@ config MFD_AC100 > This driver include only the core APIs. You have to select individual > components like codecs or RTC under the corresponding menus. > > +config MFD_AC200 > + tristate "X-Powers AC200" > + select MFD_CORE > + depends on I2C > + help > + If you say Y here you get support for the X-Powers AC200 IC. Please describe the IC here. > + This driver include only the core APIs. You have to select individual > + components like Ethernet PHY or RTC under the corresponding menus. > + > config MFD_AXP20X > tristate > select MFD_CORE > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile > index f935d10cbf0f..a20407290d6f 100644 > --- a/drivers/mfd/Makefile > +++ b/drivers/mfd/Makefile > @@ -142,6 +142,7 @@ obj-$(CONFIG_MFD_DA9052_SPI) += da9052-spi.o > obj-$(CONFIG_MFD_DA9052_I2C) += da9052-i2c.o > > obj-$(CONFIG_MFD_AC100) += ac100.o > +obj-$(CONFIG_MFD_AC200) += ac200.o > obj-$(CONFIG_MFD_AXP20X) += axp20x.o > obj-$(CONFIG_MFD_AXP20X_I2C) += axp20x-i2c.o > obj-$(CONFIG_MFD_AXP20X_RSB) += axp20x-rsb.o > diff --git a/drivers/mfd/ac200.c b/drivers/mfd/ac200.c > new file mode 100644 > index 000000000000..cf2710b84879 > --- /dev/null > +++ b/drivers/mfd/ac200.c > @@ -0,0 +1,188 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * MFD core driver for X-Powers' AC200 IC > + * > + * The AC200 is a chip which is co-packaged with Allwinner H6 SoC and > + * includes analog audio codec, analog TV encoder, ethernet PHY, eFuse > + * and RTC. > + * > + * Copyright (c) 2020 Jernej Skrabec This usually goes higher in the header comment. > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include Alphabetical. > +/* Interrupts */ > +#define AC200_IRQ_RTC 0 > +#define AC200_IRQ_EPHY 1 > +#define AC200_IRQ_TVE 2 > + > +/* IRQ enable register */ > +#define AC200_SYS_IRQ_ENABLE_OUT_EN BIT(15) > +#define AC200_SYS_IRQ_ENABLE_RTC BIT(12) > +#define AC200_SYS_IRQ_ENABLE_EPHY BIT(8) > +#define AC200_SYS_IRQ_ENABLE_TVE BIT(4) > + > +static const struct regmap_range_cfg ac200_range_cfg[] = { > + { > + .range_min = AC200_SYS_VERSION, > + .range_max = AC200_IC_CHARA1, > + .selector_reg = AC200_TWI_REG_ADDR_H, > + .selector_mask = 0xff, > + .selector_shift = 0, > + .window_start = 0, > + .window_len = 256, > + } > +}; > + > +static const struct regmap_config ac200_regmap_config = { > + .reg_bits = 8, > + .val_bits = 16, > + .ranges = ac200_range_cfg, > + .num_ranges = ARRAY_SIZE(ac200_range_cfg), > + .max_register = AC200_IC_CHARA1, > +}; > + > +static const struct regmap_irq ac200_regmap_irqs[] = { > + REGMAP_IRQ_REG(AC200_IRQ_RTC, 0, AC200_SYS_IRQ_ENABLE_RTC), > + REGMAP_IRQ_REG(AC200_IRQ_EPHY, 0, AC200_SYS_IRQ_ENABLE_EPHY), > + REGMAP_IRQ_REG(AC200_IRQ_TVE, 0, AC200_SYS_IRQ_ENABLE_TVE), > +}; > + > +static const struct regmap_irq_chip ac200_regmap_irq_chip = { > + .name = "ac200_irq_chip", > + .status_base = AC200_SYS_IRQ_STATUS, > + .mask_base = AC200_SYS_IRQ_ENABLE, > + .mask_invert = true, > + .irqs = ac200_regmap_irqs, > + .num_irqs = ARRAY_SIZE(ac200_regmap_irqs), > + .num_regs = 1, > +}; > + > +static const struct resource ephy_resource[] = { > + DEFINE_RES_IRQ(AC200_IRQ_EPHY), > +}; > + > +static const struct mfd_cell ac200_cells[] = { > + { > + .name = "ac200-ephy", > + .num_resources = ARRAY_SIZE(ephy_resource), > + .resources = ephy_resource, > + .of_compatible = "x-powers,ac200-ephy", > + }, > +}; Where are the reset of the devices? > +static int ac200_i2c_probe(struct i2c_client *i2c, > + const struct i2c_device_id *id) > +{ > + struct device *dev = &i2c->dev; > + struct ac200_dev *ac200; struct ac200_ddata *ddata; > + int ret; > + > + ac200 = devm_kzalloc(dev, sizeof(*ac200), GFP_KERNEL); > + if (!ac200) > + return -ENOMEM; > + > + i2c_set_clientdata(i2c, ac200); > + > + ac200->regmap = devm_regmap_init_i2c(i2c, &ac200_regmap_config); > + if (IS_ERR(ac200->regmap)) { > + dev_err(dev, "regmap init failed\n"); > + return PTR_ERR(ac200->regmap); > + } > + > + ac200->clk = devm_clk_get(dev, NULL); > + if (IS_ERR(ac200->clk)) { > + dev_err(dev, "Can't obtain the clock!\n"); > + return PTR_ERR(ac200->clk); > + } > + > + ret = clk_prepare_enable(ac200->clk); > + if (ret) > + return ret; > + > + /* do a reset to put chip in a known state */ If you define the magic values here, this comment become superfluous. > + ret = regmap_write(ac200->regmap, AC200_SYS_CONTROL, 0); > + if (ret) > + goto err_free_clk; > + > + ret = regmap_write(ac200->regmap, AC200_SYS_CONTROL, 1); > + if (ret) > + goto err_free_clk; > + > + /* enable interrupt pin */ This comment can be dropped. > + ret = regmap_write(ac200->regmap, AC200_SYS_IRQ_ENABLE, > + AC200_SYS_IRQ_ENABLE_OUT_EN); > + if (ret) > + goto err_free_clk; > + > + ret = regmap_add_irq_chip(ac200->regmap, i2c->irq, IRQF_ONESHOT, 0, > + &ac200_regmap_irq_chip, &ac200->regmap_irqc); > + if (ret) > + goto err_free_clk; > + > + ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_NONE, ac200_cells, > + ARRAY_SIZE(ac200_cells), NULL, 0, NULL); > + if (ret) { > + dev_err(dev, "failed to add MFD devices: %d\n", ret); "Failed to register child devices" > + goto err_del_irq_chip; > + } Do you want to leave the clock running when you leave? Seems wasteful. > + return 0; > + > +err_del_irq_chip: > + regmap_del_irq_chip(i2c->irq, ac200->regmap_irqc); Use the devm_* version, then you do not have to clear up. > +err_free_clk: > + clk_disable_unprepare(ac200->clk); > + > + return ret; > +} > + > +static int ac200_i2c_remove(struct i2c_client *i2c) > +{ > + struct ac200_dev *ac200 = i2c_get_clientdata(i2c); > + > + /* put chip in reset state */ Use defines, then remove the comment. > + regmap_write(ac200->regmap, AC200_SYS_CONTROL, 0); > + > + mfd_remove_devices(&i2c->dev); Use devm_* instead. > + regmap_del_irq_chip(i2c->irq, ac200->regmap_irqc); Use devm_* instead. > + clk_disable_unprepare(ac200->clk); > + > + return 0; > +} > + > +static const struct i2c_device_id ac200_ids[] = { > + { "ac200", }, > + { /* sentinel */ } No need for this comment. In fact, no need for this table. It can be removed. > +}; > +MODULE_DEVICE_TABLE(i2c, ac200_ids); > + > +static const struct of_device_id ac200_of_match[] = { > + { .compatible = "x-powers,ac200" }, > + { /* sentinel */ } No need for this comment. > +}; > +MODULE_DEVICE_TABLE(of, ac200_of_match); > + > +static struct i2c_driver ac200_i2c_driver = { > + .driver = { > + .name = "ac200", > + .of_match_table = of_match_ptr(ac200_of_match), > + }, > + .probe = ac200_i2c_probe, > + .remove = ac200_i2c_remove, > + .id_table = ac200_ids, > +}; > +module_i2c_driver(ac200_i2c_driver); > + > +MODULE_DESCRIPTION("MFD core driver for AC200"); "Parent driver ..." > +MODULE_AUTHOR("Jernej Skrabec "); > +MODULE_LICENSE("GPL v2"); > diff --git a/include/linux/mfd/ac200.h b/include/linux/mfd/ac200.h > new file mode 100644 > index 000000000000..f75baf0d910c > --- /dev/null > +++ b/include/linux/mfd/ac200.h > @@ -0,0 +1,210 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +/* > + * AC200 register list > + * > + * Copyright (C) 2019 Jernej Skrabec This usually sits higher. > + */ > + > +#ifndef __LINUX_MFD_AC200_H > +#define __LINUX_MFD_AC200_H > + > +#include > +#include > + > +/* interface registers (can be accessed from any page) */ Please use correct grammar in comments. "Interface" > +#define AC200_TWI_CHANGE_TO_RSB 0x3E > +#define AC200_TWI_PAD_DELAY 0xC4 > +#define AC200_TWI_REG_ADDR_H 0xFE > + > +/* General registers */ > +#define AC200_SYS_VERSION 0x0000 > +#define AC200_SYS_CONTROL 0x0002 > +#define AC200_SYS_IRQ_ENABLE 0x0004 > +#define AC200_SYS_IRQ_STATUS 0x0006 > +#define AC200_SYS_CLK_CTL 0x0008 > +#define AC200_SYS_DLDO_OSC_CTL 0x000A > +#define AC200_SYS_PLL_CTL0 0x000C > +#define AC200_SYS_PLL_CTL1 0x000E > +#define AC200_SYS_AUDIO_CTL0 0x0010 > +#define AC200_SYS_AUDIO_CTL1 0x0012 > +#define AC200_SYS_EPHY_CTL0 0x0014 > +#define AC200_SYS_EPHY_CTL1 0x0016 > +#define AC200_SYS_TVE_CTL0 0x0018 > +#define AC200_SYS_TVE_CTL1 0x001A > + > +/* Audio Codec registers */ > +#define AC200_AC_SYS_CLK_CTL 0x2000 > +#define AC200_SYS_MOD_RST 0x2002 > +#define AC200_SYS_SAMP_CTL 0x2004 > +#define AC200_I2S_CTL 0x2100 > +#define AC200_I2S_CLK 0x2102 > +#define AC200_I2S_FMT0 0x2104 > +#define AC200_I2S_FMT1 0x2108 > +#define AC200_I2S_MIX_SRC 0x2114 > +#define AC200_I2S_MIX_GAIN 0x2116 > +#define AC200_I2S_DACDAT_DVC 0x2118 > +#define AC200_I2S_ADCDAT_DVC 0x211A > +#define AC200_AC_DAC_DPC 0x2200 > +#define AC200_AC_DAC_MIX_SRC 0x2202 > +#define AC200_AC_DAC_MIX_GAIN 0x2204 > +#define AC200_DACA_OMIXER_CTRL 0x2220 > +#define AC200_OMIXER_SR 0x2222 > +#define AC200_LINEOUT_CTRL 0x2224 > +#define AC200_AC_ADC_DPC 0x2300 > +#define AC200_MBIAS_CTRL 0x2310 > +#define AC200_ADC_MIC_CTRL 0x2320 > +#define AC200_ADCMIXER_SR 0x2322 > +#define AC200_ANALOG_TUNING0 0x232A > +#define AC200_ANALOG_TUNING1 0x232C > +#define AC200_AC_AGC_SEL 0x2480 > +#define AC200_ADC_DAPLCTRL 0x2500 > +#define AC200_ADC_DAPRCTRL 0x2502 > +#define AC200_ADC_DAPLSTA 0x2504 > +#define AC200_ADC_DAPRSTA 0x2506 > +#define AC200_ADC_DAPLTL 0x2508 > +#define AC200_ADC_DAPRTL 0x250A > +#define AC200_ADC_DAPLHAC 0x250C > +#define AC200_ADC_DAPLLAC 0x250E > +#define AC200_ADC_DAPRHAC 0x2510 > +#define AC200_ADC_DAPRLAC 0x2512 > +#define AC200_ADC_DAPLDT 0x2514 > +#define AC200_ADC_DAPLAT 0x2516 > +#define AC200_ADC_DAPRDT 0x2518 > +#define AC200_ADC_DAPRAT 0x251A > +#define AC200_ADC_DAPNTH 0x251C > +#define AC200_ADC_DAPLHNAC 0x251E > +#define AC200_ADC_DAPLLNAC 0x2520 > +#define AC200_ADC_DAPRHNAC 0x2522 > +#define AC200_ADC_DAPRLNAC 0x2524 > +#define AC200_AC_DAPHHPFC 0x2526 > +#define AC200_AC_DAPLHPFC 0x2528 > +#define AC200_AC_DAPOPT 0x252A > +#define AC200_AC_DAC_DAPCTRL 0x3000 > +#define AC200_AC_DRC_HHPFC 0x3002 > +#define AC200_AC_DRC_LHPFC 0x3004 > +#define AC200_AC_DRC_CTRL 0x3006 > +#define AC200_AC_DRC_LPFHAT 0x3008 > +#define AC200_AC_DRC_LPFLAT 0x300A > +#define AC200_AC_DRC_RPFHAT 0x300C > +#define AC200_AC_DRC_RPFLAT 0x300E > +#define AC200_AC_DRC_LPFHRT 0x3010 > +#define AC200_AC_DRC_LPFLRT 0x3012 > +#define AC200_AC_DRC_RPFHRT 0x3014 > +#define AC200_AC_DRC_RPFLRT 0x3016 > +#define AC200_AC_DRC_LRMSHAT 0x3018 > +#define AC200_AC_DRC_LRMSLAT 0x301A > +#define AC200_AC_DRC_RRMSHAT 0x301C > +#define AC200_AC_DRC_RRMSLAT 0x301E > +#define AC200_AC_DRC_HCT 0x3020 > +#define AC200_AC_DRC_LCT 0x3022 > +#define AC200_AC_DRC_HKC 0x3024 > +#define AC200_AC_DRC_LKC 0x3026 > +#define AC200_AC_DRC_HOPC 0x3028 > +#define AC200_AC_DRC_LOPC 0x302A > +#define AC200_AC_DRC_HLT 0x302C > +#define AC200_AC_DRC_LLT 0x302E > +#define AC200_AC_DRC_HKI 0x3030 > +#define AC200_AC_DRC_LKI 0x3032 > +#define AC200_AC_DRC_HOPL 0x3034 > +#define AC200_AC_DRC_LOPL 0x3036 > +#define AC200_AC_DRC_HET 0x3038 > +#define AC200_AC_DRC_LET 0x303A > +#define AC200_AC_DRC_HKE 0x303C > +#define AC200_AC_DRC_LKE 0x303E > +#define AC200_AC_DRC_HOPE 0x3040 > +#define AC200_AC_DRC_LOPE 0x3042 > +#define AC200_AC_DRC_HKN 0x3044 > +#define AC200_AC_DRC_LKN 0x3046 > +#define AC200_AC_DRC_SFHAT 0x3048 > +#define AC200_AC_DRC_SFLAT 0x304A > +#define AC200_AC_DRC_SFHRT 0x304C > +#define AC200_AC_DRC_SFLRT 0x304E > +#define AC200_AC_DRC_MXGHS 0x3050 > +#define AC200_AC_DRC_MXGLS 0x3052 > +#define AC200_AC_DRC_MNGHS 0x3054 > +#define AC200_AC_DRC_MNGLS 0x3056 > +#define AC200_AC_DRC_EPSHC 0x3058 > +#define AC200_AC_DRC_EPSLC 0x305A > +#define AC200_AC_DRC_HPFHGAIN 0x305E > +#define AC200_AC_DRC_HPFLGAIN 0x3060 > +#define AC200_AC_DRC_BISTCR 0x3100 > +#define AC200_AC_DRC_BISTST 0x3102 > + > +/* TVE registers */ > +#define AC200_TVE_CTL0 0x4000 > +#define AC200_TVE_CTL1 0x4002 > +#define AC200_TVE_MOD0 0x4004 > +#define AC200_TVE_MOD1 0x4006 > +#define AC200_TVE_DAC_CFG0 0x4008 > +#define AC200_TVE_DAC_CFG1 0x400A > +#define AC200_TVE_YC_DELAY 0x400C > +#define AC200_TVE_YC_FILTER 0x400E > +#define AC200_TVE_BURST_FRQ0 0x4010 > +#define AC200_TVE_BURST_FRQ1 0x4012 > +#define AC200_TVE_FRONT_PORCH 0x4014 > +#define AC200_TVE_BACK_PORCH 0x4016 > +#define AC200_TVE_TOTAL_LINE 0x401C > +#define AC200_TVE_FIRST_ACTIVE 0x401E > +#define AC200_TVE_BLACK_LEVEL 0x4020 > +#define AC200_TVE_BLANK_LEVEL 0x4022 > +#define AC200_TVE_PLUG_EN 0x4030 > +#define AC200_TVE_PLUG_IRQ_EN 0x4032 > +#define AC200_TVE_PLUG_IRQ_STA 0x4034 > +#define AC200_TVE_PLUG_STA 0x4038 > +#define AC200_TVE_PLUG_DEBOUNCE 0x4040 > +#define AC200_TVE_DAC_TEST 0x4042 > +#define AC200_TVE_PLUG_PULSE_LEVEL 0x40F4 > +#define AC200_TVE_PLUG_PULSE_START 0x40F8 > +#define AC200_TVE_PLUG_PULSE_PERIOD 0x40FA > +#define AC200_TVE_IF_CTL 0x5000 > +#define AC200_TVE_IF_TIM0 0x5008 > +#define AC200_TVE_IF_TIM1 0x500A > +#define AC200_TVE_IF_TIM2 0x500C > +#define AC200_TVE_IF_TIM3 0x500E > +#define AC200_TVE_IF_SYNC0 0x5010 > +#define AC200_TVE_IF_SYNC1 0x5012 > +#define AC200_TVE_IF_SYNC2 0x5014 > +#define AC200_TVE_IF_TIM4 0x5016 > +#define AC200_TVE_IF_STATUS 0x5018 > + > +/* EPHY registers */ > +#define AC200_EPHY_CTL 0x6000 > +#define AC200_EPHY_BIST 0x6002 > + > +/* eFuse registers (0x8000 - 0x9FFF, layout unknown) */ > + > +/* RTC registers */ > +#define AC200_LOSC_CTRL0 0xA000 > +#define AC200_LOSC_CTRL1 0xA002 > +#define AC200_LOSC_AUTO_SWT_STA 0xA004 > +#define AC200_INTOSC_CLK_PRESCAL 0xA008 > +#define AC200_RTC_YY_MM_DD0 0xA010 > +#define AC200_RTC_YY_MM_DD1 0xA012 > +#define AC200_RTC_HH_MM_SS0 0xA014 > +#define AC200_RTC_HH_MM_SS1 0xA016 > +#define AC200_ALARM0_CUR_VLU0 0xA024 > +#define AC200_ALARM0_CUR_VLU1 0xA026 > +#define AC200_ALARM0_ENABLE 0xA028 > +#define AC200_ALARM0_IRQ_EN 0xA02C > +#define AC200_ALARM0_IRQ_STA 0xA030 > +#define AC200_ALARM1_WK_HH_MM_SS0 0xA040 > +#define AC200_ALARM1_WK_HH_MM_SS1 0xA042 > +#define AC200_ALARM1_ENABLE 0xA044 > +#define AC200_ALARM1_IRQ_EN 0xA048 > +#define AC200_ALARM1_IRQ_STA 0xA04C > +#define AC200_ALARM_CONFIG 0xA050 > +#define AC200_LOSC_OUT_GATING 0xA060 > +#define AC200_GP_DATA(x) (0xA100 + (x) * 2) > +#define AC200_RTC_DEB 0xA170 > +#define AC200_GPL_HOLD_OUTPUT 0xA180 > +#define AC200_VDD_RTC 0xA190 > +#define AC200_IC_CHARA0 0xA1F0 > +#define AC200_IC_CHARA1 0xA1F2 > + > +struct ac200_dev { > + struct clk *clk; > + struct regmap *regmap; > + struct regmap_irq_chip_data *regmap_irqc; > +}; > + > +#endif /* __LINUX_MFD_AC200_H */ -- Lee Jones [李琼斯] Linaro Services Technical Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog