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=-11.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS 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 CD61DC2D0EF for ; Fri, 17 Apr 2020 17:15:29 +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 9B4202078E for ; Fri, 17 Apr 2020 17:15:29 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="mVXZJJ2n" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9B4202078E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=siol.net 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:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=xp/qUI7JXZGXRqtBrSutjZeca5mNr58vgoPLTV6gr2s=; b=mVXZJJ2nmLWJBb JP++CIN/QsHrHko/YLOcZwtyW7BHzzGC/Mxq+Vg3QR+YbV3Tr1xGEuo/cNjG7jZwJvTB/FiDULG+c uktwUWC95u4BBsTEMaWfJT6zCtq3/wu0t+XG6Nxjh8TVOPjXgPBaygL01P9WsbgjJveYnQv4EPyDk BVsT+xp43au8RIcxW1BbIQg8ik+XrRkF8sP4DY7AO3YpANYg1N/LsIm53IUNHPJUoXWocrh+uekOW q2fw/CbxEdGYpHON0NSAU56zC9SMCt1sd+8bl7xfY9eDoVw/1KvsiDjruXhWVfW/CHzLO1QP9qQmf Zv8Bu4ARbxgSIxXzj/lQ==; 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 1jPUaM-0005I9-3n; Fri, 17 Apr 2020 17:15:26 +0000 Received: from mailoutvs19.siol.net ([185.57.226.210] helo=mail.siol.net) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jPUaH-0005Go-2P for linux-arm-kernel@lists.infradead.org; Fri, 17 Apr 2020 17:15:24 +0000 Received: from localhost (localhost [127.0.0.1]) by mail.siol.net (Postfix) with ESMTP id 99F9D524C3A; Fri, 17 Apr 2020 19:15:14 +0200 (CEST) X-Virus-Scanned: amavisd-new at psrvmta09.zcs-production.pri Received: from mail.siol.net ([127.0.0.1]) by localhost (psrvmta09.zcs-production.pri [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id b6KrGSb_97M0; Fri, 17 Apr 2020 19:15:13 +0200 (CEST) Received: from mail.siol.net (localhost [127.0.0.1]) by mail.siol.net (Postfix) with ESMTPS id AF4AA524C39; Fri, 17 Apr 2020 19:15:13 +0200 (CEST) Received: from jernej-laptop.localnet (cpe-194-152-20-232.static.triera.net [194.152.20.232]) (Authenticated sender: jernej.skrabec@siol.net) by mail.siol.net (Postfix) with ESMTPA id DD577524C3B; Fri, 17 Apr 2020 19:15:12 +0200 (CEST) From: Jernej =?utf-8?B?xaBrcmFiZWM=?= To: robh+dt@kernel.org, andrew@lunn.ch, f.fainelli@gmail.com, Heiner Kallweit Subject: Re: [RFC PATCH 2/4] net: phy: Add support for AC200 EPHY Date: Fri, 17 Apr 2020 19:15:12 +0200 Message-ID: <4409454.rnE6jSC6OK@jernej-laptop> In-Reply-To: <1d03b2a8-fed5-5de8-6326-81b7436637da@gmail.com> References: <20200416185758.1388148-1-jernej.skrabec@siol.net> <3035405.oiGErgHkdL@jernej-laptop> <1d03b2a8-fed5-5de8-6326-81b7436637da@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200417_101521_422473_AF66165B X-CRM114-Status: GOOD ( 36.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, netdev@vger.kernel.org, linux@armlinux.org.uk, mripard@kernel.org, linux-kernel@vger.kernel.org, wens@csie.org, lee.jones@linaro.org, davem@davemloft.net, linux-arm-kernel@lists.infradead.org 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 RG5lIHBldGVrLCAxNy4gYXByaWwgMjAyMCBvYiAxODoyOTowNCBDRVNUIGplIEhlaW5lciBLYWxs d2VpdCBuYXBpc2FsKGEpOgo+IE9uIDE3LjA0LjIwMjAgMTg6MDMsIEplcm5laiDFoGtyYWJlYyB3 cm90ZToKPiA+IERuZSDEjWV0cnRlaywgMTYuIGFwcmlsIDIwMjAgb2IgMjI6MTg6NTIgQ0VTVCBq ZSBIZWluZXIgS2FsbHdlaXQgCm5hcGlzYWwoYSk6Cj4gPj4gT24gMTYuMDQuMjAyMCAyMDo1Nywg SmVybmVqIFNrcmFiZWMgd3JvdGU6Cj4gPj4+IEFDMjAwIE1GRCBJQyBzdXBwb3J0cyBGYXN0IEV0 aGVybmV0IFBIWS4gQWRkIGEgZHJpdmVyIGZvciBpdC4KPiA+Pj4gCj4gPj4+IFNpZ25lZC1vZmYt Ynk6IEplcm5laiBTa3JhYmVjIDxqZXJuZWouc2tyYWJlY0BzaW9sLm5ldD4KPiA+Pj4gLS0tCj4g Pj4+IAo+ID4+PiAgZHJpdmVycy9uZXQvcGh5L0tjb25maWcgIHwgICA3ICsrCj4gPj4+ICBkcml2 ZXJzL25ldC9waHkvTWFrZWZpbGUgfCAgIDEgKwo+ID4+PiAgZHJpdmVycy9uZXQvcGh5L2FjMjAw LmMgIHwgMjA2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ID4+PiAg MyBmaWxlcyBjaGFuZ2VkLCAyMTQgaW5zZXJ0aW9ucygrKQo+ID4+PiAgY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvbmV0L3BoeS9hYzIwMC5jCj4gPj4+IAo+ID4+PiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9uZXQvcGh5L0tjb25maWcgYi9kcml2ZXJzL25ldC9waHkvS2NvbmZpZwo+ID4+PiBpbmRl eCAzZmEzM2QyN2VlYmEuLjE2YWY2OWY2OWVhZiAxMDA2NDQKPiA+Pj4gLS0tIGEvZHJpdmVycy9u ZXQvcGh5L0tjb25maWcKPiA+Pj4gKysrIGIvZHJpdmVycy9uZXQvcGh5L0tjb25maWcKPiA+Pj4g QEAgLTI4OCw2ICsyODgsMTMgQEAgY29uZmlnIEFESU5fUEhZCj4gPj4+IAo+ID4+PiAgCSAgLSBB RElOMTMwMCAtIFJvYnVzdCxJbmR1c3RyaWFsLCBMb3cgTGF0ZW5jeSAxMC8xMDAvMTAwMCBHaWdh Yml0Cj4gPj4+ICAJICAKPiA+Pj4gIAkgICAgRXRoZXJuZXQgUEhZCj4gPj4+IAo+ID4+PiArY29u ZmlnIEFDMjAwX1BIWQo+ID4+PiArCXRyaXN0YXRlICJBQzIwMCBFUEhZIgo+ID4+PiArCWRlcGVu ZHMgb24gTlZNRU0KPiA+Pj4gKwlkZXBlbmRzIG9uIE9GCj4gPj4+ICsJaGVscAo+ID4+PiArCSAg RmFzdCBldGhlcm5ldCBQSFkgYXMgZm91bmQgaW4gWC1Qb3dlcnMgQUMyMDAgbXVsdGktZnVuY3Rp b24KPiA+IAo+ID4gZGV2aWNlLgo+ID4gCj4gPj4+ICsKPiA+Pj4gCj4gPj4+ICBjb25maWcgQU1E X1BIWQo+ID4+PiAgCj4gPj4+ICAJdHJpc3RhdGUgIkFNRCBQSFlzIgo+ID4+PiAgCS0tLWhlbHAt LS0KPiA+Pj4gCj4gPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvTWFrZWZpbGUgYi9k cml2ZXJzL25ldC9waHkvTWFrZWZpbGUKPiA+Pj4gaW5kZXggMmY1YzcwOTNhNjViLi5iMGM1Yjkx OTAwZmEgMTAwNjQ0Cj4gPj4+IC0tLSBhL2RyaXZlcnMvbmV0L3BoeS9NYWtlZmlsZQo+ID4+PiAr KysgYi9kcml2ZXJzL25ldC9waHkvTWFrZWZpbGUKPiA+Pj4gQEAgLTUzLDYgKzUzLDcgQEAgb2Jq LSQoQ09ORklHX1NGUCkJCSs9IHNmcC5vCj4gPj4+IAo+ID4+PiAgc2ZwLW9iai0kKENPTkZJR19T RlApCQkrPSBzZnAtYnVzLm8KPiA+Pj4gIG9iai15CQkJCSs9ICQoc2ZwLW9iai15KSAkKHNmcC1v YmotbSkKPiA+Pj4gCj4gPj4+ICtvYmotJChDT05GSUdfQUMyMDBfUEhZKQkJKz0gYWMyMDAubwo+ ID4+PiAKPiA+Pj4gIG9iai0kKENPTkZJR19BRElOX1BIWSkJCSs9IGFkaW4ubwo+ID4+PiAgb2Jq LSQoQ09ORklHX0FNRF9QSFkpCQkrPSBhbWQubwo+ID4+PiAgYXF1YW50aWEtb2JqcwkJCSs9IGFx dWFudGlhX21haW4ubwo+ID4+PiAKPiA+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9h YzIwMC5jIGIvZHJpdmVycy9uZXQvcGh5L2FjMjAwLmMKPiA+Pj4gbmV3IGZpbGUgbW9kZSAxMDA2 NDQKPiA+Pj4gaW5kZXggMDAwMDAwMDAwMDAwLi4zZDc4NTZmZjhmOTEKPiA+Pj4gLS0tIC9kZXYv bnVsbAo+ID4+PiArKysgYi9kcml2ZXJzL25ldC9waHkvYWMyMDAuYwo+ID4+PiBAQCAtMCwwICsx LDIwNiBAQAo+ID4+PiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCj4gPj4+ ICsvKioKPiA+Pj4gKyAqIERyaXZlciBmb3IgQUMyMDAgRXRoZXJuZXQgUEhZCj4gPj4+ICsgKgo+ ID4+PiArICogQ29weXJpZ2h0IChjKSAyMDIwIEplcm5laiBTa3JhYmVjIDxqZXJuZWouc2tyYWJl Y0BzaW9sLm5ldD4KPiA+Pj4gKyAqLwo+ID4+PiArCj4gPj4+ICsjaW5jbHVkZSA8bGludXgva2Vy bmVsLmg+Cj4gPj4+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gPj4+ICsjaW5jbHVkZSA8 bGludXgvbWZkL2FjMjAwLmg+Cj4gPj4+ICsjaW5jbHVkZSA8bGludXgvbnZtZW0tY29uc3VtZXIu aD4KPiA+Pj4gKyNpbmNsdWRlIDxsaW51eC9vZi5oPgo+ID4+PiArI2luY2x1ZGUgPGxpbnV4L3Bo eS5oPgo+ID4+PiArI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+ID4+PiArCj4g Pj4+ICsjZGVmaW5lIEFDMjAwX0VQSFlfSUQJCQkweDAwNDQxNDAwCj4gPj4+ICsjZGVmaW5lIEFD MjAwX0VQSFlfSURfTUFTSwkJMHgwZmZmZmZmMAo+ID4+PiArCj4gPj4gCj4gPj4gWW91IGNvdWxk IHVzZSBQSFlfSURfTUFUQ0hfTU9ERUwoKSBoZXJlLgo+ID4gCj4gPiBPay4KPiA+IAo+ID4+PiAr LyogbWFjcm9zIGZvciBzeXN0ZW0gZXBoeSBjb250cm9sIDAgcmVnaXN0ZXIgKi8KPiA+Pj4gKyNk ZWZpbmUgQUMyMDBfRVBIWV9SRVNFVF9JTlZBTElECUJJVCgwKQo+ID4+PiArI2RlZmluZSBBQzIw MF9FUEhZX1NZU0NMS19HQVRJTkcJQklUKDEpCj4gPj4+ICsKPiA+Pj4gKy8qIG1hY3JvcyBmb3Ig c3lzdGVtIGVwaHkgY29udHJvbCAxIHJlZ2lzdGVyICovCj4gPj4+ICsjZGVmaW5lIEFDMjAwX0VQ SFlfRV9FUEhZX01JSV9JT19FTglCSVQoMCkKPiA+Pj4gKyNkZWZpbmUgQUMyMDBfRVBIWV9FX0xO S19MRURfSU9fRU4JQklUKDEpCj4gPj4+ICsjZGVmaW5lIEFDMjAwX0VQSFlfRV9TUERfTEVEX0lP X0VOCUJJVCgyKQo+ID4+PiArI2RlZmluZSBBQzIwMF9FUEhZX0VfRFBYX0xFRF9JT19FTglCSVQo MykKPiA+Pj4gKwo+ID4+PiArLyogbWFjcm9zIGZvciBlcGh5IGNvbnRyb2wgcmVnaXN0ZXIgKi8K PiA+Pj4gKyNkZWZpbmUgQUMyMDBfRVBIWV9TSFVURE9XTgkJQklUKDApCj4gPj4+ICsjZGVmaW5l IEFDMjAwX0VQSFlfTEVEX1BPTAkJQklUKDEpCj4gPj4+ICsjZGVmaW5lIEFDMjAwX0VQSFlfQ0xL X1NFTAkJQklUKDIpCj4gPj4+ICsjZGVmaW5lIEFDMjAwX0VQSFlfQUREUih4KQkJKCgoeCkgJiAw eDFGKSA8PCA0KQo+ID4+PiArI2RlZmluZSBBQzIwMF9FUEhZX1hNSUlfU0VMCQlCSVQoMTEpCj4g Pj4+ICsjZGVmaW5lIEFDMjAwX0VQSFlfQ0FMSUIoeCkJCSgoKHgpICYgMHhGKSA8PCAxMikKPiA+ Pj4gKwo+ID4+PiArc3RydWN0IGFjMjAwX2VwaHlfZGV2IHsKPiA+Pj4gKwlzdHJ1Y3QgcGh5X2Ry aXZlcgkqZXBoeTsKPiA+PiAKPiA+PiBXaHkgZW1iZWRkaW5nIGEgcG9pbnRlciBhbmQgbm90IGEg c3RydWN0IHBoeV9kcml2ZXIgZGlyZWN0bHk/Cj4gPj4gVGhlbiB5b3UgY291bGQgb21pdCB0aGUg c2VwYXJhdGUgYWxsb2NhdGlvbi4KPiA+IAo+ID4gUmlnaHQuCj4gPiAKPiA+PiBlcGh5IGlzIG5v dCB0aGUgYmVzdCBuYW1pbmcuIEl0IG1heSBiZSByZWFkIGFzIGEgcGh5X2RldmljZS4KPiA+PiBC ZXR0ZXIgdXNlIHBoeWRydi4KPiA+IAo+ID4gT2suCj4gPiAKPiA+Pj4gKwlzdHJ1Y3QgcmVnbWFw CQkqcmVnbWFwOwo+ID4+PiArfTsKPiA+Pj4gKwo+ID4+PiArc3RhdGljIGNoYXIgKmFjMjAwX3Bo eV9uYW1lID0gIkFDMjAwIEVQSFkiOwo+ID4+PiArCj4gPj4gCj4gPj4gV2h5IG5vdCB1c2luZyB0 aGUgbmFtZSBkaXJlY3RseSBpbiB0aGUgYXNzaWdubWVudD8KPiA+IAo+ID4gcGh5X2RyaXZlci0+ bmFtZSBpcyBwb2ludGVyLiBXb3VsZG4ndCB0aGF0IG1lYW4gdGhhdCBzdHJpbmcgaXMgYWxsb2Nh dGVkCj4gPiBvbgo+ID4gc3RhY2sgYW5kIG5leHQgdGltZSBwb2ludGVyIGlzIHVzZWQsIGl0IHdp bGwgcmV0dXJuIGdhcmJhZ2U/Cj4gCj4gTm8sIGl0J3Mgbm90IG9uIHRoZSBzdGFjay4gTm8gcHJv YmxlbSBoZXJlLgo+IAo+ID4+IEFuZCBiZXR0ZXIgbmFtaW5nOiAiQUMyMDAgRmFzdCBFdGhlcm5l dCIKPiA+IAo+ID4gT2suCj4gPiAKPiA+Pj4gK3N0YXRpYyBpbnQgYWMyMDBfZXBoeV9jb25maWdf aW5pdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQo+ID4+PiArewo+ID4+PiArCWNvbnN0IHN0 cnVjdCBhYzIwMF9lcGh5X2RldiAqcHJpdiA9IHBoeWRldi0+ZHJ2LT5kcml2ZXJfZGF0YTsKPiA+ Pj4gKwl1bnNpZ25lZCBpbnQgdmFsdWU7Cj4gPj4+ICsJaW50IHJldDsKPiA+Pj4gKwo+ID4+PiAr CXBoeV93cml0ZShwaHlkZXYsIDB4MWYsIDB4MDEwMCk7CS8qIFN3aXRjaCB0byBQYWdlIDEgKi8K PiA+Pj4gKwlwaHlfd3JpdGUocGh5ZGV2LCAweDEyLCAweDQ4MjQpOwkvKiBEaXNhYmxlIEFQUyAq Lwo+ID4+PiArCj4gPj4+ICsJcGh5X3dyaXRlKHBoeWRldiwgMHgxZiwgMHgwMjAwKTsJLyogU3dp dGNoIHRvIFBhZ2UgMiAqLwo+ID4+PiArCXBoeV93cml0ZShwaHlkZXYsIDB4MTgsIDB4MDAwMCk7 CS8qIFBIWUFGRSBUUlggb3B0aW1pemF0aW9uICovCj4gPj4+ICsKPiA+Pj4gKwlwaHlfd3JpdGUo cGh5ZGV2LCAweDFmLCAweDA2MDApOwkvKiBTd2l0Y2ggdG8gUGFnZSA2ICovCj4gPj4+ICsJcGh5 X3dyaXRlKHBoeWRldiwgMHgxNCwgMHg3MDhmKTsJLyogUEhZQUZFIFRYIG9wdGltaXphdGlvbiAq Lwo+ID4+PiArCXBoeV93cml0ZShwaHlkZXYsIDB4MTMsIDB4RjAwMCk7CS8qIFBIWUFGRSBSWCBv cHRpbWl6YXRpb24gKi8KPiA+Pj4gKwlwaHlfd3JpdGUocGh5ZGV2LCAweDE1LCAweDE1MzApOwo+ ID4+PiArCj4gPj4+ICsJcGh5X3dyaXRlKHBoeWRldiwgMHgxZiwgMHgwODAwKTsJLyogU3dpdGNo IHRvIFBhZ2UgNiAqLwo+ID4+PiArCXBoeV93cml0ZShwaHlkZXYsIDB4MTgsIDB4MDBiYyk7CS8q IFBIWUFGRSBUUlggb3B0aW1pemF0aW9uICovCj4gPj4+ICsKPiA+Pj4gKwlwaHlfd3JpdGUocGh5 ZGV2LCAweDFmLCAweDAxMDApOwkvKiBzd2l0Y2ggdG8gcGFnZSAxICovCj4gPj4+ICsJcGh5X2Ns ZWFyX2JpdHMocGh5ZGV2LCAweDE3LCBCSVQoMykpOwkvKiBkaXNhYmxlIGludGVsbGlnZW50Cj4g PiAKPiA+IElFRUUgKi8KPiA+IAo+ID4+PiArCj4gPj4+ICsJLyogbmV4dCB0d28gYmxvY2tzIGRp c2FibGUgODAyLjNheiBJRUVFICovCj4gPj4+ICsJcGh5X3dyaXRlKHBoeWRldiwgMHgxZiwgMHgw MjAwKTsJLyogc3dpdGNoIHRvIHBhZ2UgMiAqLwo+ID4+PiArCXBoeV93cml0ZShwaHlkZXYsIDB4 MTgsIDB4MDAwMCk7Cj4gPj4+ICsKPiA+Pj4gKwlwaHlfd3JpdGUocGh5ZGV2LCAweDFmLCAweDAw MDApOwkvKiBzd2l0Y2ggdG8gcGFnZSAwICovCj4gPj4+ICsJcGh5X2NsZWFyX2JpdHNfbW1kKHBo eWRldiwgMHg3LCAweDNjLCBCSVQoMSkpOwo+ID4+IAo+ID4+IEJldHRlciB1c2UgdGhlIGZvbGxv d2luZzoKPiA+PiBwaHlfd3JpdGVfbW1kKHBoeWRldiwgTURJT19NTURfQU4sIE1ESU9fQU5fRUVF X0FEViwgMHgwMDAwKTsKPiA+PiBJdCBtYWtlcyBjbGVhciB0aGF0IHlvdSBkaXNhYmxlIGFkdmVy dGlzaW5nIEVFRSBjb21wbGV0ZWx5Lgo+ID4gCj4gPiBPay4KPiA+IAo+ID4+PiArCj4gPj4+ICsJ aWYgKHBoeWRldi0+aW50ZXJmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJKQo+ID4+PiAr CQl2YWx1ZSA9IEFDMjAwX0VQSFlfWE1JSV9TRUw7Cj4gPj4+ICsJZWxzZQo+ID4+PiArCQl2YWx1 ZSA9IDA7Cj4gPj4+ICsKPiA+Pj4gKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocHJpdi0+cmVn bWFwLCBBQzIwMF9FUEhZX0NUTCwKPiA+Pj4gKwkJCQkgQUMyMDBfRVBIWV9YTUlJX1NFTCwgdmFs dWUpOwo+ID4+PiArCWlmIChyZXQpCj4gPj4+ICsJCXJldHVybiByZXQ7Cj4gPj4+ICsKPiA+PiAK PiA+PiBJIGhhZCBhIGJyaWVmIGxvb2sgYXQgdGhlIHNwZWMsIGFuZCBpdCdzIG5vdCBmdWxseSBj bGVhcgo+ID4+IHRvIG1lIHdoYXQgdGhpcyByZWdpc3RlciBzZXR0aW5nIGRvZXMuIERvZXMgaXQg YWZmZWN0IHRoZQo+ID4+IE1BQyBzaWRlIGFuZC9vciB0aGUgUEhZIHNpZGU/Cj4gPiAKPiA+IEl0 J3MgbXkgdW5kZXJzdGFuZGluZyB0aGF0IGl0IHNlbGVjdHMgaW50ZXJmYWNlIG1vZGUgb24gUEhZ LiBCZXNpZGVzCj4gPiBkYXRhc2hlZXQgbWVudGlvbmVkIGluIGNvdmVyIGxldHRlciwgQlNQIGRy aXZlcnMgKG9uZSBmb3IgTUZEIGFuZCBvbmUgZm9yCj4gPiBQSFkpIGFyZSB0aGUgb25seSBvdGhl ciBzb3VyY2Ugb2YgaW5mb3JtYXRpb24uIEJTUCBQSFkgZHJpdmVyIGlzIGxvY2F0ZWQKPiA+IGhl cmU6Cj4gPiBodHRwczovL2dpdGh1Yi5jb20vQWxsd2lubmVyLUhvbWxldC9INi1CU1A0LjktbGlu dXgvYmxvYi9tYXN0ZXIvZHJpdmVycy9uZQo+ID4gdC8gcGh5L3N1bnhpLWVwaHkuYwo+ID4gCj4g Pj4gSWYgaXQgYWZmZWN0cyB0aGUgUEhZIHNpZGUsIHRoZW4gSSdkIGV4cGVjdCB0aGF0IHRoZSBj aGlwCj4gPj4gaGFzIHRvIHRhbGsgdG8gdGhlIFBIWSB2aWEgdGhlIE1ESU8gYnVzLiBNZWFucyB0 aGVyZSBzaG91bGQKPiA+PiBiZSBhIFBIWSByZWdpc3RlciBmb3Igc2V0dGluZyBNSUkgdnMuIFJN SUkuCj4gPj4gSW4gdGhpcyBjYXNlIHRoZSBzZXR1cCBjb3VsZCBiZSB2ZXJ5IG11Y2ggc2ltcGxp ZmllZC4KPiA+PiBUaGVuIHRoZSBQSFkgZHJpdmVyIHdvdWxkbid0IGhhdmUgdG8gYmUgZW1iZWRk ZWQgaW4gdGhlCj4gPj4gcGxhdGZvcm0gZHJpdmVyLgo+ID4gCj4gPiBBY3R1YWxseSwgUEhZIGhh cyB0byBiZSBjb25maWd1cmVkIGZpcnN0IHRocm91Z2ggSTJDIGFuZCB0aGVuIHRocm91Z2gKPiA+ IE1ESU8uIEkyQyBpcyB1c2VkIHRvIGVuYWJsZSBpdCAocG93ZXIgaXQgdXApLCBjb25maWd1cmUg TEVEIHBvbGFyaXR5LCBzZXQKPiA+IFBIWSBhZGRyZXNzLCB3cml0ZSBjYWxpYnJhdGlvbiB2YWx1 ZSBzdG9yZWQgZWxzZXdoZXJlLgo+ID4gCj4gPiBCYXNlZCBvbiBhbGwgYXZhaWxhYmxlIGRvY3Vt ZW50YXRpb24gSSBoYXZlIChjb2RlIGFuZCBkYXRhc2hlZXQpLCB0aGlzIEkyQwo+ID4gcmVnaXN0 ZXIgaXMgdGhlIG9ubHkgd2F5IHRvIHNlbGVjdCBNSUkgb3IgUk1JSSBtb2RlLgo+IAo+IFRoZW4g aG93IGFuZCB3aGVyZSBpcyB0aGUgUEhZIGludGVyZmFjZSBtb2RlIGNvbmZpZ3VyZWQgb24gdGhl IE1BQyBzaWRlPwo+IElmIHRoZXJlIGlzIG5vIHN1Y2ggc2V0dGluZywgdGhlbiBJJ2QgYXNzdW1l IHRoYXQgdGhpcyByZWdpc3RlciBiaXQKPiBjb25maWd1cmVzIGJvdGggc2lkZXMuIFRoaXMgbGVh ZHMgdG8gdGhlIHF1ZXN0aW9uIHdoZXRoZXIgdGhlIGludGVyZmFjZQo+IG1vZGUgcmVhbGx5IG5l ZWRzIHRvIGJlIHNldCBpbiB0aGUgUEhZIGRyaXZlcidzIGNvbmZpZ19pbml0KCkuCj4gSWYgd2Ug Y291bGQgYXZvaWQgdGhpcywgdGhlbiB5b3UgY291bGQgbWFrZSB0aGUgUEhZIGRyaXZlciBzdGF0 aWMuCgpDaGVjayBwYXRjaCA0LiBUaGVyZSBpcyBlbWFjIG5vZGUgYWRkZWQgd2l0aCBwcm9wZXJ0 eSBwaHktbW9kZSA9ICJybWlpIjsgCkFDMjAwIGFuZCBINiBhcmUgaW50ZXJuYWxseSBjb25uZWN0 ZWQgdGhyb3VnaCBSTUlJIGludGVyZmFjZS4KCk5vdGUgdGhhdCBNQUMgaGFzIG11bHRpcGxleGVk IGludGVyZmFjZSBhbmQgY2FuIGVpdGhlciB1c2VzIHRoaXMgY29wYWNrYWdlZCAKUEhZIG9yIGV4 dGVybmFsIFBIWS4gRXh0ZXJuYWwgUEhZIHVzdWFsbHkgdXNlcyBSR01JSSBpbnRlcmZhY2UuCgpJ biA5OSUgY2FzZXMsIHRoaXMgUEhZIGRyaXZlciB3aWxsIGJlIHVzZWQgZm9yIGNvcGFja2FnZWQg QUMyMDAgd2l0aCBINiBTb0MsIAp3aGljaCBtZWFucyBpdCB3aWxsIGJlIHVzZWQgaW4gUk1JSSBt b2RlLiBFdmVuIGlmIHNvbWVvbmUgdXNlcyBzdGFuZGFsb25lIApBQzIwMCBJQyB3aXRoIG1haW5s aW5lIExpbnV4LCB3aWxsIHByb2JhYmx5IHN0aWxsIHVzZSBSTUlJLiBCdXQgdGhlcmUgaXMgc3Rp bGwgCnZlcnkgc21hbGwgY2hhbmNlIHRoYXQgc29tZW9uZSB3aWxsIHVzZSBpdCBpbiBNSUkgbW9k ZS4KCkFueXdheSwgaWYgdGhhdCBzcGVjaWFsIHNldHRpbmcgZm9yIEg2IHByb3ZlcyBpbXBvcnRh bnQsIHdlIHdpbGwgc3RpbGwgbmVlZCBhIAp3YXkgdG8gY29udmV5IHRoYXQgaW5mb3JtYXRpb24g ZnJvbSBwbGF0Zm9ybSBkcml2ZXIgdG8gUEhZLiBFYXNpZXN0IHdheSB0byBkbyAKdGhhdCBpcyB0 aHJvdWdoIGRyaXZlcl9kYXRhLgoKPiAKPiBZb3UgY291bGQgc2V0IHRoZSBQSFkgaW50ZXJmYWNl IG1vZGUgYXMgc29vbiBhcyB0aGUgUEhZIGludGVyZmFjZSBtb2RlCj4gaXMgcmVhZCBmcm9tIERU LiBTbyB3aHkgbm90IHNldCB0aGUgaW50ZXJmYWNlIG1vZGUgYXQgdGhlIHBsYWNlIHdoZXJlCj4g eW91IGNvbmZpZ3VyZSB0aGUgb3RoZXIgdmFsdWVzIGxpa2UgUEhZIGFkZHJlc3M/CgpQSFkgaW50 ZXJmYWNlIG1vZGUgaXMgYWN0dWFsbHkgc2V0IG9uIE1BQyBzaWRlIGluIERULiBUaGlzIFBIWSBo YXMgYWN1dGFsbHkgCnByb2dyYW1tYWJsZSBQSFkgYWRkcmVzcyB0aHJvdWdoIEkyQy4gQ3VycmVu dGx5IEkgaGFyZGNvZGVkIGl0IHRvIDEuCgpBcyBJIGV4cGxhaW5lZCBpbiBjb3ZlciBsZXR0ZXIs IEkgZG9uJ3QgcmVhbGx5IGtub3cgaG93IHRvIHByb3Blcmx5IHByZXNlbnQgCnRoaXMgZGV2aWNl IGluIERULiBCYXNlZCBvbiBjdXJyZW50IERUIGRvY3VtZW50YXRpb24sIFBIWSBub2RlIHdvdWxk IGhhdmUgdG8gCmJlIGNoaWxkIG5vZGUgb2YgbWRpbyBidXMgbm9kZSBhbmQgTUZEIG5vZGUgYXQg dGhlIHNhbWUgdGltZSB3aGljaCBpcyBub3QgCnBvc3NpYmxlLgoKPiAKPiA+Pj4gKwkvKiBGSVhN RTogVGhpcyBpcyBINiBzcGVjaWZpYyAqLwo+ID4+PiArCXBoeV9zZXRfYml0cyhwaHlkZXYsIDB4 MTMsIEJJVCgxMikpOwo+ID4+PiArCj4gPj4gCj4gPj4gVGhpcyBzZWVtcyB0byBpbmRpY2F0ZSB0 aGF0IHRoZSBzYW1lIFBIWSBpcyB1c2VkIGluIGEgc2xpZ2h0bHkKPiA+PiBkaWZmZXJlbnQgdmVy c2lvbiB3aXRoIG90aGVyIEh4IG1vZGVscy4gRG8gdGhleSB1c2UgZGlmZmVyZW50Cj4gPj4gUEhZ IElEJ3M/Cj4gPiAKPiA+IFNpdHVhdGlvbiBpcyBhIGJpdCBjb21wbGljYXRlZC4gU2FtZSBQSFks IGF0IGxlYXN0IHdpdGggc2FtZSBQSFkgSUQsIGlzCj4gPiB1c2VkIGluIGRpZmZlcmVudCB3YXlz Lgo+ID4gMS4gYXMgcGFydCBvZiBzdGFuZGFsb25lIEFDMjAwIE1GRCBJQwo+ID4gMi4gYXMgcGFy dCBvZiBBQzIwMCB3YWZlciBjb3BhY2thZ2VkIHdpdGggSDYgU29DIHdhZmVyIGluIHNhbWUgcGFj a2FnZS4KPiA+IFRoaXMgaW4gdGhlb3J5IHNob3VsZG4ndCBiZSBhbnkgZGlmZmVyZW50IHRoYW4g c3RhbmRhbG9uZSBJQywgYnV0IGl0Cj4gPiBhcHBhcmVudGx5IGlzLCBiYXNlZCBvbiB0aGUgQlNQ IGRyaXZlciBjb2RlLgo+ID4gMy4gaW50ZWdyYXRlZCBkaXJlY3RseSBpbiBTb0NzIGxpa2UgSDMs IEg1IGFuZCBWM3MuIFRoZXJlIGlzIG5vIEkyQyBhY2Nlc3MKPiA+IHRvIGNvbmZpZ3VyYXRpb24g cmVnaXN0ZXIuIEluc3RlYWQsIGl0J3MgbWVtb3J5IG1hcHBlZCBhbmQgc2xpZ2h0bHkKPiA+IGRp ZmZlcmVudC4KPiA+IAo+ID4gSW4gYWxsIGNhc2VzIFBIWSBJRCBpcyBzYW1lLCBqdXN0IGdsdWUg bG9naWMgaXMgZGlmZmVyZW50Lgo+ID4gCj4gPiBJIGFza2VkIEFsbHdpbm5lciBpZiBhYm92ZSBz ZXR0aW5nIGlzIHJlYWxseSBuZWNlc3NhcnkgZm9yIEg2IGFuZCB3aGF0IGl0Cj4gPiBkb2VzLCBi dXQgSSBkaWRuJ3QgZ2V0IGFueSB1c2VmdWwgYW5zd2VyIGJhY2suCj4gPiAKPiA+IFNvIG1heWJl IGFub3RoZXIgY29tcGF0aWJsZSBpcyBuZWVkZWQgZm9yIEg2Lgo+ID4gCj4gPiBCZXN0IHJlZ2Fy ZHMsCj4gPiBKZXJuZWoKPiA+IAo+ID4+PiArCXJldHVybiAwOwo+ID4+PiArfQo+ID4+PiArCj4g Pj4+ICtzdGF0aWMgaW50IGFjMjAwX2VwaHlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAq cGRldikKPiA+Pj4gK3sKPiA+Pj4gKwlzdHJ1Y3QgYWMyMDBfZGV2ICphYzIwMCA9IGRldl9nZXRf ZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKPiA+Pj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAm cGRldi0+ZGV2Owo+ID4+PiArCXN0cnVjdCBhYzIwMF9lcGh5X2RldiAqcHJpdjsKPiA+Pj4gKwlz dHJ1Y3QgbnZtZW1fY2VsbCAqY2FsY2VsbDsKPiA+Pj4gKwlzdHJ1Y3QgcGh5X2RyaXZlciAqZXBo eTsKPiA+Pj4gKwl1MTYgKmNhbGRhdGEsIGNhbGliOwo+ID4+PiArCXNpemVfdCBjYWxsZW47Cj4g Pj4+ICsJaW50IHJldDsKPiA+Pj4gKwo+ID4+PiArCXByaXYgPSBkZXZtX2t6YWxsb2MoZGV2LCBz aXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKPiA+Pj4gKwlpZiAoIXByaXYpCj4gPj4+ICsJCXJl dHVybiAtRU5PTUVNOwo+ID4+PiArCj4gPj4+ICsJZXBoeSA9IGRldm1fa3phbGxvYyhkZXYsIHNp emVvZigqZXBoeSksIEdGUF9LRVJORUwpOwo+ID4+PiArCWlmICghZXBoeSkKPiA+Pj4gKwkJcmV0 dXJuIC1FTk9NRU07Cj4gPj4+ICsKPiA+Pj4gKwljYWxjZWxsID0gZGV2bV9udm1lbV9jZWxsX2dl dChkZXYsICJjYWxpYnJhdGlvbiIpOwo+ID4+PiArCWlmIChJU19FUlIoY2FsY2VsbCkpIHsKPiA+ Pj4gKwkJZGV2X2VycihkZXYsICJVbmFibGUgdG8gZmluZCBjYWxpYnJhdGlvbiBkYXRhIVxuIik7 Cj4gPj4+ICsJCXJldHVybiBQVFJfRVJSKGNhbGNlbGwpOwo+ID4+PiArCX0KPiA+Pj4gKwo+ID4+ PiArCWNhbGRhdGEgPSBudm1lbV9jZWxsX3JlYWQoY2FsY2VsbCwgJmNhbGxlbik7Cj4gPj4+ICsJ aWYgKElTX0VSUihjYWxkYXRhKSkgewo+ID4+PiArCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byBy ZWFkIGNhbGlicmF0aW9uIGRhdGEhXG4iKTsKPiA+Pj4gKwkJcmV0dXJuIFBUUl9FUlIoY2FsZGF0 YSk7Cj4gPj4+ICsJfQo+ID4+PiArCj4gPj4+ICsJaWYgKGNhbGxlbiAhPSAyKSB7Cj4gPj4+ICsJ CWRldl9lcnIoZGV2LCAiQ2FsaWJyYXRpb24gZGF0YSBoYXMgd3JvbmcgbGVuZ3RoOiAyICE9Cj4g PiAKPiA+ICV6dVxuIiwKPiA+IAo+ID4+PiArCQkJY2FsbGVuKTsKPiA+Pj4gKwkJa2ZyZWUoY2Fs ZGF0YSk7Cj4gPj4+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4+PiArCX0KPiA+Pj4gKwo+ID4+PiAr CWNhbGliID0gKmNhbGRhdGEgKyAzOwo+ID4+PiArCWtmcmVlKGNhbGRhdGEpOwo+ID4+PiArCj4g Pj4+ICsJZXBoeS0+cGh5X2lkID0gQUMyMDBfRVBIWV9JRDsKPiA+Pj4gKwllcGh5LT5waHlfaWRf bWFzayA9IEFDMjAwX0VQSFlfSURfTUFTSzsKPiA+Pj4gKwllcGh5LT5uYW1lID0gYWMyMDBfcGh5 X25hbWU7Cj4gPj4+ICsJZXBoeS0+ZHJpdmVyX2RhdGEgPSBwcml2Owo+ID4+PiArCWVwaHktPnNv ZnRfcmVzZXQgPSBnZW5waHlfc29mdF9yZXNldDsKPiA+Pj4gKwllcGh5LT5jb25maWdfaW5pdCA9 IGFjMjAwX2VwaHlfY29uZmlnX2luaXQ7Cj4gPj4+ICsJZXBoeS0+c3VzcGVuZCA9IGdlbnBoeV9z dXNwZW5kOwo+ID4+PiArCWVwaHktPnJlc3VtZSA9IGdlbnBoeV9yZXN1bWU7Cj4gPj4+ICsKPiA+ Pj4gKwlwcml2LT5lcGh5ID0gZXBoeTsKPiA+Pj4gKwlwcml2LT5yZWdtYXAgPSBhYzIwMC0+cmVn bWFwOwo+ID4+PiArCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOwo+ID4+PiArCj4g Pj4+ICsJcmV0ID0gcmVnbWFwX3dyaXRlKGFjMjAwLT5yZWdtYXAsIEFDMjAwX1NZU19FUEhZX0NU TDAsCj4gPj4+ICsJCQkgICBBQzIwMF9FUEhZX1JFU0VUX0lOVkFMSUQgfAo+ID4+PiArCQkJICAg QUMyMDBfRVBIWV9TWVNDTEtfR0FUSU5HKTsKPiA+Pj4gKwlpZiAocmV0KQo+ID4+PiArCQlyZXR1 cm4gcmV0Owo+ID4+PiArCj4gPj4+ICsJcmV0ID0gcmVnbWFwX3dyaXRlKGFjMjAwLT5yZWdtYXAs IEFDMjAwX1NZU19FUEhZX0NUTDEsCj4gPj4+ICsJCQkgICBBQzIwMF9FUEhZX0VfRVBIWV9NSUlf SU9fRU4gfAo+ID4+PiArCQkJICAgQUMyMDBfRVBIWV9FX0xOS19MRURfSU9fRU4gfAo+ID4+PiAr CQkJICAgQUMyMDBfRVBIWV9FX1NQRF9MRURfSU9fRU4gfAo+ID4+PiArCQkJICAgQUMyMDBfRVBI WV9FX0RQWF9MRURfSU9fRU4pOwo+ID4+PiArCWlmIChyZXQpCj4gPj4+ICsJCXJldHVybiByZXQ7 Cj4gPj4+ICsKPiA+Pj4gKwlyZXQgPSByZWdtYXBfd3JpdGUoYWMyMDAtPnJlZ21hcCwgQUMyMDBf RVBIWV9DVEwsCj4gPj4+ICsJCQkgICBBQzIwMF9FUEhZX0xFRF9QT0wgfAo+ID4+PiArCQkJICAg QUMyMDBfRVBIWV9DTEtfU0VMIHwKPiA+Pj4gKwkJCSAgIEFDMjAwX0VQSFlfQUREUigxKSB8Cj4g Pj4+ICsJCQkgICBBQzIwMF9FUEhZX0NBTElCKGNhbGliKSk7Cj4gPj4+ICsJaWYgKHJldCkKPiA+ Pj4gKwkJcmV0dXJuIHJldDsKPiA+Pj4gKwo+ID4+PiArCXJldCA9IHBoeV9kcml2ZXJfcmVnaXN0 ZXIocHJpdi0+ZXBoeSwgVEhJU19NT0RVTEUpOwo+ID4+PiArCWlmIChyZXQpIHsKPiA+Pj4gKwkJ ZGV2X2VycihkZXYsICJVbmFibGUgdG8gcmVnaXN0ZXIgcGh5XG4iKTsKPiA+Pj4gKwkJcmV0dXJu IHJldDsKPiA+Pj4gKwl9Cj4gPj4+ICsKPiA+Pj4gKwlyZXR1cm4gMDsKPiA+Pj4gK30KPiA+Pj4g Kwo+ID4+PiArc3RhdGljIGludCBhYzIwMF9lcGh5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2 aWNlICpwZGV2KQo+ID4+PiArewo+ID4+PiArCXN0cnVjdCBhYzIwMF9lcGh5X2RldiAqcHJpdiA9 IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwo+ID4+PiArCj4gPj4+ICsJcGh5X2RyaXZlcl91 bnJlZ2lzdGVyKHByaXYtPmVwaHkpOwo+ID4+PiArCj4gPj4+ICsJcmVnbWFwX3dyaXRlKHByaXYt PnJlZ21hcCwgQUMyMDBfRVBIWV9DVEwsIEFDMjAwX0VQSFlfU0hVVERPV04pOwo+ID4+PiArCXJl Z21hcF93cml0ZShwcml2LT5yZWdtYXAsIEFDMjAwX1NZU19FUEhZX0NUTDEsIDApOwo+ID4+PiAr CXJlZ21hcF93cml0ZShwcml2LT5yZWdtYXAsIEFDMjAwX1NZU19FUEhZX0NUTDAsIDApOwo+ID4+ PiArCj4gPj4+ICsJcmV0dXJuIDA7Cj4gPj4+ICt9Cj4gPj4+ICsKPiA+Pj4gK3N0YXRpYyBjb25z dCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFjMjAwX2VwaHlfbWF0Y2hbXSA9IHsKPiA+Pj4gKwl7IC5j b21wYXRpYmxlID0gIngtcG93ZXJzLGFjMjAwLWVwaHkiIH0sCj4gPj4+ICsJeyAvKiBzZW50aW5l bCAqLyB9Cj4gPj4+ICt9Owo+ID4+PiArTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYWMyMDBfZXBo eV9tYXRjaCk7Cj4gPj4+ICsKPiA+Pj4gK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFj MjAwX2VwaHlfZHJpdmVyID0gewo+ID4+PiArCS5wcm9iZQkJPSBhYzIwMF9lcGh5X3Byb2JlLAo+ ID4+PiArCS5yZW1vdmUJCT0gYWMyMDBfZXBoeV9yZW1vdmUsCj4gPj4+ICsJLmRyaXZlcgkJPSB7 Cj4gPj4+ICsJCS5uYW1lCQk9ICJhYzIwMC1lcGh5IiwKPiA+Pj4gKwkJLm9mX21hdGNoX3RhYmxl CT0gYWMyMDBfZXBoeV9tYXRjaCwKPiA+Pj4gKwl9LAo+ID4+PiArfTsKPiA+Pj4gK21vZHVsZV9w bGF0Zm9ybV9kcml2ZXIoYWMyMDBfZXBoeV9kcml2ZXIpOwo+ID4+PiArCj4gPj4+ICtNT0RVTEVf QVVUSE9SKCJKZXJuZWogU2tyYWJlYyA8amVybmVqLnNrcmFiZWNAc2lvbC5uZXQ+Iik7Cj4gPj4+ ICtNT0RVTEVfREVTQ1JJUFRJT04oIkFDMjAwIEV0aGVybmV0IFBIWSBkcml2ZXIiKTsKPiA+Pj4g K01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCgoKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1h cm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcv bWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg== 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=-11.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS 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 4E382C38A2C for ; Fri, 17 Apr 2020 17:21:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1F4962078E for ; Fri, 17 Apr 2020 17:21:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729116AbgDQRVO convert rfc822-to-8bit (ORCPT ); Fri, 17 Apr 2020 13:21:14 -0400 Received: from mailoutvs59.siol.net ([185.57.226.250]:40114 "EHLO mail.siol.net" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728863AbgDQRVO (ORCPT ); Fri, 17 Apr 2020 13:21:14 -0400 Received: from localhost (localhost [127.0.0.1]) by mail.siol.net (Postfix) with ESMTP id 99F9D524C3A; Fri, 17 Apr 2020 19:15:14 +0200 (CEST) X-Virus-Scanned: amavisd-new at psrvmta09.zcs-production.pri Received: from mail.siol.net ([127.0.0.1]) by localhost (psrvmta09.zcs-production.pri [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id b6KrGSb_97M0; Fri, 17 Apr 2020 19:15:13 +0200 (CEST) Received: from mail.siol.net (localhost [127.0.0.1]) by mail.siol.net (Postfix) with ESMTPS id AF4AA524C39; Fri, 17 Apr 2020 19:15:13 +0200 (CEST) Received: from jernej-laptop.localnet (cpe-194-152-20-232.static.triera.net [194.152.20.232]) (Authenticated sender: jernej.skrabec@siol.net) by mail.siol.net (Postfix) with ESMTPA id DD577524C3B; Fri, 17 Apr 2020 19:15:12 +0200 (CEST) From: Jernej =?utf-8?B?xaBrcmFiZWM=?= To: robh+dt@kernel.org, andrew@lunn.ch, f.fainelli@gmail.com, Heiner Kallweit Cc: mripard@kernel.org, wens@csie.org, lee.jones@linaro.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 2/4] net: phy: Add support for AC200 EPHY Date: Fri, 17 Apr 2020 19:15:12 +0200 Message-ID: <4409454.rnE6jSC6OK@jernej-laptop> In-Reply-To: <1d03b2a8-fed5-5de8-6326-81b7436637da@gmail.com> References: <20200416185758.1388148-1-jernej.skrabec@siol.net> <3035405.oiGErgHkdL@jernej-laptop> <1d03b2a8-fed5-5de8-6326-81b7436637da@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8BIT Content-Type: text/plain; charset="UTF-8" Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Dne petek, 17. april 2020 ob 18:29:04 CEST je Heiner Kallweit napisal(a): > On 17.04.2020 18:03, Jernej Škrabec wrote: > > Dne četrtek, 16. april 2020 ob 22:18:52 CEST je Heiner Kallweit napisal(a): > >> On 16.04.2020 20:57, Jernej Skrabec wrote: > >>> AC200 MFD IC supports Fast Ethernet PHY. Add a driver for it. > >>> > >>> Signed-off-by: Jernej Skrabec > >>> --- > >>> > >>> drivers/net/phy/Kconfig | 7 ++ > >>> drivers/net/phy/Makefile | 1 + > >>> drivers/net/phy/ac200.c | 206 +++++++++++++++++++++++++++++++++++++++ > >>> 3 files changed, 214 insertions(+) > >>> create mode 100644 drivers/net/phy/ac200.c > >>> > >>> diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig > >>> index 3fa33d27eeba..16af69f69eaf 100644 > >>> --- a/drivers/net/phy/Kconfig > >>> +++ b/drivers/net/phy/Kconfig > >>> @@ -288,6 +288,13 @@ config ADIN_PHY > >>> > >>> - ADIN1300 - Robust,Industrial, Low Latency 10/100/1000 Gigabit > >>> > >>> Ethernet PHY > >>> > >>> +config AC200_PHY > >>> + tristate "AC200 EPHY" > >>> + depends on NVMEM > >>> + depends on OF > >>> + help > >>> + Fast ethernet PHY as found in X-Powers AC200 multi-function > > > > device. > > > >>> + > >>> > >>> config AMD_PHY > >>> > >>> tristate "AMD PHYs" > >>> ---help--- > >>> > >>> diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile > >>> index 2f5c7093a65b..b0c5b91900fa 100644 > >>> --- a/drivers/net/phy/Makefile > >>> +++ b/drivers/net/phy/Makefile > >>> @@ -53,6 +53,7 @@ obj-$(CONFIG_SFP) += sfp.o > >>> > >>> sfp-obj-$(CONFIG_SFP) += sfp-bus.o > >>> obj-y += $(sfp-obj-y) $(sfp-obj-m) > >>> > >>> +obj-$(CONFIG_AC200_PHY) += ac200.o > >>> > >>> obj-$(CONFIG_ADIN_PHY) += adin.o > >>> obj-$(CONFIG_AMD_PHY) += amd.o > >>> aquantia-objs += aquantia_main.o > >>> > >>> diff --git a/drivers/net/phy/ac200.c b/drivers/net/phy/ac200.c > >>> new file mode 100644 > >>> index 000000000000..3d7856ff8f91 > >>> --- /dev/null > >>> +++ b/drivers/net/phy/ac200.c > >>> @@ -0,0 +1,206 @@ > >>> +// SPDX-License-Identifier: GPL-2.0+ > >>> +/** > >>> + * Driver for AC200 Ethernet PHY > >>> + * > >>> + * Copyright (c) 2020 Jernej Skrabec > >>> + */ > >>> + > >>> +#include > >>> +#include > >>> +#include > >>> +#include > >>> +#include > >>> +#include > >>> +#include > >>> + > >>> +#define AC200_EPHY_ID 0x00441400 > >>> +#define AC200_EPHY_ID_MASK 0x0ffffff0 > >>> + > >> > >> You could use PHY_ID_MATCH_MODEL() here. > > > > Ok. > > > >>> +/* macros for system ephy control 0 register */ > >>> +#define AC200_EPHY_RESET_INVALID BIT(0) > >>> +#define AC200_EPHY_SYSCLK_GATING BIT(1) > >>> + > >>> +/* macros for system ephy control 1 register */ > >>> +#define AC200_EPHY_E_EPHY_MII_IO_EN BIT(0) > >>> +#define AC200_EPHY_E_LNK_LED_IO_EN BIT(1) > >>> +#define AC200_EPHY_E_SPD_LED_IO_EN BIT(2) > >>> +#define AC200_EPHY_E_DPX_LED_IO_EN BIT(3) > >>> + > >>> +/* macros for ephy control register */ > >>> +#define AC200_EPHY_SHUTDOWN BIT(0) > >>> +#define AC200_EPHY_LED_POL BIT(1) > >>> +#define AC200_EPHY_CLK_SEL BIT(2) > >>> +#define AC200_EPHY_ADDR(x) (((x) & 0x1F) << 4) > >>> +#define AC200_EPHY_XMII_SEL BIT(11) > >>> +#define AC200_EPHY_CALIB(x) (((x) & 0xF) << 12) > >>> + > >>> +struct ac200_ephy_dev { > >>> + struct phy_driver *ephy; > >> > >> Why embedding a pointer and not a struct phy_driver directly? > >> Then you could omit the separate allocation. > > > > Right. > > > >> ephy is not the best naming. It may be read as a phy_device. > >> Better use phydrv. > > > > Ok. > > > >>> + struct regmap *regmap; > >>> +}; > >>> + > >>> +static char *ac200_phy_name = "AC200 EPHY"; > >>> + > >> > >> Why not using the name directly in the assignment? > > > > phy_driver->name is pointer. Wouldn't that mean that string is allocated > > on > > stack and next time pointer is used, it will return garbage? > > No, it's not on the stack. No problem here. > > >> And better naming: "AC200 Fast Ethernet" > > > > Ok. > > > >>> +static int ac200_ephy_config_init(struct phy_device *phydev) > >>> +{ > >>> + const struct ac200_ephy_dev *priv = phydev->drv->driver_data; > >>> + unsigned int value; > >>> + int ret; > >>> + > >>> + phy_write(phydev, 0x1f, 0x0100); /* Switch to Page 1 */ > >>> + phy_write(phydev, 0x12, 0x4824); /* Disable APS */ > >>> + > >>> + phy_write(phydev, 0x1f, 0x0200); /* Switch to Page 2 */ > >>> + phy_write(phydev, 0x18, 0x0000); /* PHYAFE TRX optimization */ > >>> + > >>> + phy_write(phydev, 0x1f, 0x0600); /* Switch to Page 6 */ > >>> + phy_write(phydev, 0x14, 0x708f); /* PHYAFE TX optimization */ > >>> + phy_write(phydev, 0x13, 0xF000); /* PHYAFE RX optimization */ > >>> + phy_write(phydev, 0x15, 0x1530); > >>> + > >>> + phy_write(phydev, 0x1f, 0x0800); /* Switch to Page 6 */ > >>> + phy_write(phydev, 0x18, 0x00bc); /* PHYAFE TRX optimization */ > >>> + > >>> + phy_write(phydev, 0x1f, 0x0100); /* switch to page 1 */ > >>> + phy_clear_bits(phydev, 0x17, BIT(3)); /* disable intelligent > > > > IEEE */ > > > >>> + > >>> + /* next two blocks disable 802.3az IEEE */ > >>> + phy_write(phydev, 0x1f, 0x0200); /* switch to page 2 */ > >>> + phy_write(phydev, 0x18, 0x0000); > >>> + > >>> + phy_write(phydev, 0x1f, 0x0000); /* switch to page 0 */ > >>> + phy_clear_bits_mmd(phydev, 0x7, 0x3c, BIT(1)); > >> > >> Better use the following: > >> phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, 0x0000); > >> It makes clear that you disable advertising EEE completely. > > > > Ok. > > > >>> + > >>> + if (phydev->interface == PHY_INTERFACE_MODE_RMII) > >>> + value = AC200_EPHY_XMII_SEL; > >>> + else > >>> + value = 0; > >>> + > >>> + ret = regmap_update_bits(priv->regmap, AC200_EPHY_CTL, > >>> + AC200_EPHY_XMII_SEL, value); > >>> + if (ret) > >>> + return ret; > >>> + > >> > >> I had a brief look at the spec, and it's not fully clear > >> to me what this register setting does. Does it affect the > >> MAC side and/or the PHY side? > > > > It's my understanding that it selects interface mode on PHY. Besides > > datasheet mentioned in cover letter, BSP drivers (one for MFD and one for > > PHY) are the only other source of information. BSP PHY driver is located > > here: > > https://github.com/Allwinner-Homlet/H6-BSP4.9-linux/blob/master/drivers/ne > > t/ phy/sunxi-ephy.c > > > >> If it affects the PHY side, then I'd expect that the chip > >> has to talk to the PHY via the MDIO bus. Means there should > >> be a PHY register for setting MII vs. RMII. > >> In this case the setup could be very much simplified. > >> Then the PHY driver wouldn't have to be embedded in the > >> platform driver. > > > > Actually, PHY has to be configured first through I2C and then through > > MDIO. I2C is used to enable it (power it up), configure LED polarity, set > > PHY address, write calibration value stored elsewhere. > > > > Based on all available documentation I have (code and datasheet), this I2C > > register is the only way to select MII or RMII mode. > > Then how and where is the PHY interface mode configured on the MAC side? > If there is no such setting, then I'd assume that this register bit > configures both sides. This leads to the question whether the interface > mode really needs to be set in the PHY driver's config_init(). > If we could avoid this, then you could make the PHY driver static. Check patch 4. There is emac node added with property phy-mode = "rmii"; AC200 and H6 are internally connected through RMII interface. Note that MAC has multiplexed interface and can either uses this copackaged PHY or external PHY. External PHY usually uses RGMII interface. In 99% cases, this PHY driver will be used for copackaged AC200 with H6 SoC, which means it will be used in RMII mode. Even if someone uses standalone AC200 IC with mainline Linux, will probably still use RMII. But there is still very small chance that someone will use it in MII mode. Anyway, if that special setting for H6 proves important, we will still need a way to convey that information from platform driver to PHY. Easiest way to do that is through driver_data. > > You could set the PHY interface mode as soon as the PHY interface mode > is read from DT. So why not set the interface mode at the place where > you configure the other values like PHY address? PHY interface mode is actually set on MAC side in DT. This PHY has acutally programmable PHY address through I2C. Currently I hardcoded it to 1. As I explained in cover letter, I don't really know how to properly present this device in DT. Based on current DT documentation, PHY node would have to be child node of mdio bus node and MFD node at the same time which is not possible. > > >>> + /* FIXME: This is H6 specific */ > >>> + phy_set_bits(phydev, 0x13, BIT(12)); > >>> + > >> > >> This seems to indicate that the same PHY is used in a slightly > >> different version with other Hx models. Do they use different > >> PHY ID's? > > > > Situation is a bit complicated. Same PHY, at least with same PHY ID, is > > used in different ways. > > 1. as part of standalone AC200 MFD IC > > 2. as part of AC200 wafer copackaged with H6 SoC wafer in same package. > > This in theory shouldn't be any different than standalone IC, but it > > apparently is, based on the BSP driver code. > > 3. integrated directly in SoCs like H3, H5 and V3s. There is no I2C access > > to configuration register. Instead, it's memory mapped and slightly > > different. > > > > In all cases PHY ID is same, just glue logic is different. > > > > I asked Allwinner if above setting is really necessary for H6 and what it > > does, but I didn't get any useful answer back. > > > > So maybe another compatible is needed for H6. > > > > Best regards, > > Jernej > > > >>> + return 0; > >>> +} > >>> + > >>> +static int ac200_ephy_probe(struct platform_device *pdev) > >>> +{ > >>> + struct ac200_dev *ac200 = dev_get_drvdata(pdev->dev.parent); > >>> + struct device *dev = &pdev->dev; > >>> + struct ac200_ephy_dev *priv; > >>> + struct nvmem_cell *calcell; > >>> + struct phy_driver *ephy; > >>> + u16 *caldata, calib; > >>> + size_t callen; > >>> + int ret; > >>> + > >>> + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); > >>> + if (!priv) > >>> + return -ENOMEM; > >>> + > >>> + ephy = devm_kzalloc(dev, sizeof(*ephy), GFP_KERNEL); > >>> + if (!ephy) > >>> + return -ENOMEM; > >>> + > >>> + calcell = devm_nvmem_cell_get(dev, "calibration"); > >>> + if (IS_ERR(calcell)) { > >>> + dev_err(dev, "Unable to find calibration data!\n"); > >>> + return PTR_ERR(calcell); > >>> + } > >>> + > >>> + caldata = nvmem_cell_read(calcell, &callen); > >>> + if (IS_ERR(caldata)) { > >>> + dev_err(dev, "Unable to read calibration data!\n"); > >>> + return PTR_ERR(caldata); > >>> + } > >>> + > >>> + if (callen != 2) { > >>> + dev_err(dev, "Calibration data has wrong length: 2 != > > > > %zu\n", > > > >>> + callen); > >>> + kfree(caldata); > >>> + return -EINVAL; > >>> + } > >>> + > >>> + calib = *caldata + 3; > >>> + kfree(caldata); > >>> + > >>> + ephy->phy_id = AC200_EPHY_ID; > >>> + ephy->phy_id_mask = AC200_EPHY_ID_MASK; > >>> + ephy->name = ac200_phy_name; > >>> + ephy->driver_data = priv; > >>> + ephy->soft_reset = genphy_soft_reset; > >>> + ephy->config_init = ac200_ephy_config_init; > >>> + ephy->suspend = genphy_suspend; > >>> + ephy->resume = genphy_resume; > >>> + > >>> + priv->ephy = ephy; > >>> + priv->regmap = ac200->regmap; > >>> + platform_set_drvdata(pdev, priv); > >>> + > >>> + ret = regmap_write(ac200->regmap, AC200_SYS_EPHY_CTL0, > >>> + AC200_EPHY_RESET_INVALID | > >>> + AC200_EPHY_SYSCLK_GATING); > >>> + if (ret) > >>> + return ret; > >>> + > >>> + ret = regmap_write(ac200->regmap, AC200_SYS_EPHY_CTL1, > >>> + AC200_EPHY_E_EPHY_MII_IO_EN | > >>> + AC200_EPHY_E_LNK_LED_IO_EN | > >>> + AC200_EPHY_E_SPD_LED_IO_EN | > >>> + AC200_EPHY_E_DPX_LED_IO_EN); > >>> + if (ret) > >>> + return ret; > >>> + > >>> + ret = regmap_write(ac200->regmap, AC200_EPHY_CTL, > >>> + AC200_EPHY_LED_POL | > >>> + AC200_EPHY_CLK_SEL | > >>> + AC200_EPHY_ADDR(1) | > >>> + AC200_EPHY_CALIB(calib)); > >>> + if (ret) > >>> + return ret; > >>> + > >>> + ret = phy_driver_register(priv->ephy, THIS_MODULE); > >>> + if (ret) { > >>> + dev_err(dev, "Unable to register phy\n"); > >>> + return ret; > >>> + } > >>> + > >>> + return 0; > >>> +} > >>> + > >>> +static int ac200_ephy_remove(struct platform_device *pdev) > >>> +{ > >>> + struct ac200_ephy_dev *priv = platform_get_drvdata(pdev); > >>> + > >>> + phy_driver_unregister(priv->ephy); > >>> + > >>> + regmap_write(priv->regmap, AC200_EPHY_CTL, AC200_EPHY_SHUTDOWN); > >>> + regmap_write(priv->regmap, AC200_SYS_EPHY_CTL1, 0); > >>> + regmap_write(priv->regmap, AC200_SYS_EPHY_CTL0, 0); > >>> + > >>> + return 0; > >>> +} > >>> + > >>> +static const struct of_device_id ac200_ephy_match[] = { > >>> + { .compatible = "x-powers,ac200-ephy" }, > >>> + { /* sentinel */ } > >>> +}; > >>> +MODULE_DEVICE_TABLE(of, ac200_ephy_match); > >>> + > >>> +static struct platform_driver ac200_ephy_driver = { > >>> + .probe = ac200_ephy_probe, > >>> + .remove = ac200_ephy_remove, > >>> + .driver = { > >>> + .name = "ac200-ephy", > >>> + .of_match_table = ac200_ephy_match, > >>> + }, > >>> +}; > >>> +module_platform_driver(ac200_ephy_driver); > >>> + > >>> +MODULE_AUTHOR("Jernej Skrabec "); > >>> +MODULE_DESCRIPTION("AC200 Ethernet PHY driver"); > >>> +MODULE_LICENSE("GPL");