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=-1.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,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 678C1C43219 for ; Mon, 29 Apr 2019 12:23:51 +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 250E42087B for ; Mon, 29 Apr 2019 12:23:51 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="HJ76S9S6" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 250E42087B Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mtd-bounces+linux-mtd=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: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=SXhYx1M2yo/+2Z68dWztAeYNHQjDrnFVASPAPqFpXdw=; b=HJ76S9S6lLRTtR 5C6rImFGXLVhCMTAQ1FKXMqtrd8qwtlNiN3E063jjKM0FsI884PpAdD830/+AhdRaZKq05a5b56uX oDOo8gqDfKBjpgoeMyypBOa7AYHNEmJi88Bqwl1hbC5q0knR1B8j8elN0PgkrA42k6r9cHY1depcp skEwjTiwIDiSDnDo9I9ZxT8QCFmjHtrGJEna7KlTVFfVYfFDaLg+p+rI1jLyRugpPAjJgxH7InZsW EyX+wZQfQQulh+Bi1lWZjdzIlueNds/zOu/cGveDB6I/ncxAVvBIZBDEGNiNzgNNj0D7qjatrZdx3 aPH0xwB9ySVOKirNy+KA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1hL5Jz-0001oy-7Z; Mon, 29 Apr 2019 12:23:47 +0000 Received: from relay9-d.mail.gandi.net ([217.70.183.199]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1hL5Jv-0001o2-8W for linux-mtd@lists.infradead.org; Mon, 29 Apr 2019 12:23:45 +0000 X-Originating-IP: 90.88.147.33 Received: from xps13 (aaubervilliers-681-1-27-33.w90-88.abo.wanadoo.fr [90.88.147.33]) (Authenticated sender: miquel.raynal@bootlin.com) by relay9-d.mail.gandi.net (Postfix) with ESMTPSA id 07C55FF810; Mon, 29 Apr 2019 12:23:33 +0000 (UTC) Date: Mon, 29 Apr 2019 14:23:32 +0200 From: Miquel Raynal To: Naga Sureshkumar Relli Subject: Re: [LINUX PATCH v14] mtd: rawnand: pl353: Add basic driver for arm pl353 smc nand interface Message-ID: <20190429142332.27a2cba5@xps13> In-Reply-To: References: <1555326613-26739-1-git-send-email-naga.sureshkumar.relli@xilinx.com> <20190425112338.dipgmqqfuj45gx6s@laureti-dev> Organization: Bootlin X-Mailer: Claws Mail 3.17.1 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190429_052343_605306_F4CE1A28 X-CRM114-Status: GOOD ( 36.17 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "bbrezillon@kernel.org" , Helmut Grohne , "richard@nod.at" , "linux-kernel@vger.kernel.org" , "marek.vasut@gmail.com" , "linux-mtd@lists.infradead.org" , "nagasureshkumarrelli@gmail.com" , Michal Simek , "computersforpeace@gmail.com" , "dwmw2@infradead.org" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org SGkgTmFnYSwKCj4gPiA+ICsJdTMyIGFkZHJzOwo+ID4gPiArCXUzMiBuYWRkcnM7Cj4gPiA+ICsJ dTMyIGFkZHI1Owo+ID4gPiArCXUzMiBhZGRyNjsgIAo+ID4gCj4gPiBXaHkgYXJlIGFkZHI1IGFu ZCBhZGRyNiB1MzI/IFlvdSBvbmx5IGV2ZXIgc3RvcmUgdTggdmFsdWVzIGluIGhlcmUuIEhvdyBh Ym91dCBtZXJnaW5nCj4gPiB0aGVtIGludG8gYW4gdTE2IGFkZHI1Nj8gRG9pbmcgc28gd291bGQg bWFrZSB0aGUgYWNjZXNzIGluIHBsMzUzX25hbmRfZXhlY19vcF9jbWQKPiA+IHNpbXBsZXIgYW5k IG1vdmUgYSBsaXR0bGUgY29tcGxleGl0eSBpbnRvIHBsMzUzX25mY19wYXJzZV9pbnN0cnVjdGlv bnMuICAKPiBXaWxsIHRyeSB0aGlzLiBCdXQgSSBkb24ndCBzZWUgYW55IGNvbXBsZXggbG9naWMg aW52b2x2ZWQgdXNpbmcgYWRkcjUgYW5kIGFkZHI2LgoKVGhpcyBpcyBhIHJlbGljIG9mIGEgdG9v IHF1aWNrIGNvcHkgZnJvbSBtYXJ2ZWxsX25hbmQuYy4gUGxlYXNlIG1hdGNoCnRoZSBzdHJ1Y3R1 cmUgd2l0aCB5b3VyIGNvbnRyb2xsZXIgbWVtb3J5IGxheW91dCBpbnN0ZWFkLgoKPiA+ID4gKwlj b25zdCBzdHJ1Y3QgbmFuZF9vcF9pbnN0ciAqZGF0YV9pbnN0cjsgfTsKPiA+ID4gKwo+ID4gPiAr LyoqCj4gPiA+ICsgKiBzdHJ1Y3QgcGwzNTNfbmFuZF9jb250cm9sbGVyIC0gRGVmaW5lcyB0aGUg TkFORCBmbGFzaCBjb250cm9sbGVyIGRyaXZlcgo+ID4gPiArICoJCQkJICBpbnN0YW5jZQo+ID4g PiArICogQGNoaXA6CQlOQU5EIGNoaXAgaW5mb3JtYXRpb24gc3RydWN0dXJlCj4gPiA+ICsgKiBA ZGV2OgkJUGFyZW50IGRldmljZSAodXNlZCB0byBwcmludCBlcnJvciBtZXNzYWdlcykKPiA+ID4g KyAqIEByZWdzOgkJVmlydHVhbCBhZGRyZXNzIG9mIHRoZSBOQU5EIGZsYXNoIGRldmljZQo+ID4g PiArICogQGJ1Zl9hZGRyOgkJVmlydHVhbCBhZGRyZXNzIG9mIHRoZSBOQU5EIGZsYXNoIGRldmlj ZSBmb3IKPiA+ID4gKyAqCQkJZGF0YSByZWFkL3dyaXRlcwo+ID4gPiArICogQGFkZHJfY3ljbGVz OglBZGRyZXNzIGN5Y2xlcwo+ID4gPiArICogQG1jbGs6CQlNZW1vcnkgY29udHJvbGxlciBjbG9j awo+ID4gPiArICogQGJ1c3dpZHRoOgkJQnVzIHdpZHRoIDggb3IgMTYKPiA+ID4gKyAqLwo+ID4g PiArc3RydWN0IHBsMzUzX25hbmRfY29udHJvbGxlciB7Cj4gPiA+ICsJc3RydWN0IG5hbmRfY29u dHJvbGxlciBjb250cm9sbGVyOwo+ID4gPiArCXN0cnVjdCBuYW5kX2NoaXAgY2hpcDsKPiA+ID4g KwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cj4gPiA+ICsJdm9pZCBfX2lvbWVtICpyZWdzOwo+ID4gPiAr CXZvaWQgX19pb21lbSAqYnVmX2FkZHI7ICAKPiA+IAo+ID4gSSBmaW5kIHRoZSB1c2Ugb2YgYnVm X2FkZHIgdW5mb3J0dW5hdGUuIEl0IGlzIGNvbnN1bWVkIGJ5IHR3byBmdW5jdGlvbnMKPiA+IHBs MzUzX25hbmRfcmVhZF9kYXRhX29wIGFuZCBwbDM1M19uYW5kX3dyaXRlX2RhdGFfb3AuIEFsbCBv dGhlciBmdW5jdGlvbnMgdXBkYXRlIGl0cwo+ID4gdmFsdWUuIFNlbWFudGljYWxseSwgaXRzIHZh bHVlIGlzIHJlZ3MgKyBzb21lIGZsYWdzLiBGb3IgdGhlIHVwZGF0ZXJzIHRoYXQgbWVhbnMgYSBj b21wbGV4IGxvZ2ljCj4gPiB3aGVyZSB0aGV5IGZpcnN0IGhhdmUgdG8gc3VidHJhY3QgcmVnLCB0 aGVuIGNoYW5nZSBmbGFncyBhbmQgYWRkIHJlZyBhZ2Fpbi4gVG8gbWFrZSBtYXR0ZXJzCj4gPiB3 b3JzZSwgdGhpcyBjb21wdXRhdGlvbiBpbnZvbHZlcyBfX2ZvcmNlIGNhc3RzIGJldHdlZW4gbG9u ZyBhbmQgX19pb21lbSAod2hpY2ggeWllbGRlZAo+ID4gY29tcGxhaW50cyBpbiBlYXJsaWVyIHJl dmlld3MpLiAgSSB0aGluayBpdCB3b3VsZCBzaW1wbGlmeSB0aGUgY29kZSBpZiB5b3UgcmVwbGFj ZWQgYnVmX2FkZHIgd2l0aAo+ID4gc29tZXRoaW5nIGxpa2UgYWRkcl9mbGFncyBhbmQgdGhlbiBj b21wdXRlIGJ1Zl9hZGRyIGFzIHJlZ3MgKyBhZGRyX2ZsYWdzIGluIHRob3NlIHR3bwo+ID4gY29u c3VtZXJzLiBXaGF0IGRvIHlvdSB0aGluaz8gIAo+IFRoaXMgZGVmaW5pdGVseSBzaW1wbGlmaWVz IHRoZSBkcml2ZXIgbG9naWMsIHdlIGhhdmUgdG8gZG8gdGhhdC4KPiBJIHRyaWVkIGl0IHByZXZp b3VzbHksIHJlZ2FyZGluZyBfX2ZvcmNlIGFuZCBfX2lvbWVtIGNhc3RpbmcgY2hhbmdlcywgYnV0 IHRoZSBkcml2ZXIgZnVuY3Rpb25hbGl0eSB3YXMgYnJva2VuCj4gV2l0aCB0aGlzIHVwZGF0ZS4K PiBMZXQgbWUgdXBkYXRlIGl0IGFuZCBjaGVjayBpdCBhZ2Fpbi4KPiBCdXQganVzdCB3YW50ZWQg dG8ga25vdywgZG8geW91IHNlZSBpc3N1ZXMgd2l0aCB0aGVzZSBfX2ZvcmNlIGFuZCBfX2lvbWVt IGNhc3RpbmdzPwo+ID4gICAKPiA+ID4gKwl1OCBhZGRyX2N5Y2xlczsKPiA+ID4gKwlzdHJ1Y3Qg Y2xrICptY2xrOyAgCj4gPiAKPiA+IEFsbCB5b3UgbmVlZCBoZXJlIGlzIHRoZSBtZW1vcnkgY2xv Y2sgZnJlcXVlbmN5LiBXb3VsZG4ndCBpdCBiZSBlYXNpZXIgdG8gZXh0cmFjdCB0aGF0Cj4gPiBm cmVxdWVuY3kgb25jZSBkdXJpbmcgcHJvYmUgYW5kIHN0b3JlIGl0IGhlcmU/IFRoYXQgYXNzdW1l cyBhIGNvbnN0YW50IGZyZXF1ZW5jeSwgYnV0IGlmIHRoZQo+ID4gZnJlcXVlbmN5IGlzbid0IGNv bnN0YW50LCB5b3UgaGF2ZSBhIHJhY2UgY29uZGl0aW9uLiAgCj4gVGhhdCBpcyB3aGF0IHdlIGFy ZSBkb2luZyBpbiB0aGUgcHJvYmUuCj4gSW4gdGhlIHByb2JlLCB3ZSBhcmUgZ2V0dGluZyBtY2xr IHVzaW5nIG9mX2Nsa19nZXQoKSBhbmQgdGhlbiB3ZSBhcmUgZ2V0dGluZyB0aGUgYWN0dWFsIGZy ZXF1ZW5jeQo+IFVzaW5nIGNsa19nZXRfcmF0ZSgpLgo+IEFuZCB0aGlzIGlzIGNvbnN0YW50IGZy ZXF1ZW5jeSBvbmx5KGdldHRpbmcgZnJvbSBkdHMpCgpXaGF0IEhlbG11dCBwcm9wb3NlcyBpcywg SSB0aGluaywgc2F2aW5nIHRoZSBjbG9jayBmcmVxdWVuY3kgdG8gYXZvaWQKcmVxdWVzdGluZyBp dCBldmVyeXRpbWUgeW91IHdhbnQgdG8gdXNlIGl0IChpZiB0aGlzIGlzIGRvbmUgbWFueSB0aW1l cykuCgpbLi4uXQoKPiA+ID4gKwo+ID4gPiArCW9vYnJlZ2lvbi0+b2Zmc2V0ID0gKHNlY3Rpb24g KiBjaGlwLT5lY2MuYnl0ZXMpICsgMjsKPiA+ID4gKwlvb2JyZWdpb24tPmxlbmd0aCA9IDUwOwo+ ID4gPiArCj4gPiA+ICsJcmV0dXJuIDA7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBj b25zdCBzdHJ1Y3QgbXRkX29vYmxheW91dF9vcHMgcGwzNTNfZWNjX29vYmxheW91dDY0X29wcyA9 IHsKPiA+ID4gKwkuZWNjID0gcGwzNTNfZWNjX29vYmxheW91dDY0X2VjYywKPiA+ID4gKwkuZnJl ZSA9IHBsMzUzX2VjY19vb2JsYXlvdXQ2NF9mcmVlLAo+ID4gPiArfTsKPiA+ID4gKwo+ID4gPiAr LyogR2VuZXJpYyBmbGFzaCBiYnQgZGVjcmlwdG9ycyAqLwo+ID4gPiArc3RhdGljIHU4IGJidF9w YXR0ZXJuW10gPSB7ICdCJywgJ2InLCAndCcsICcwJyB9OyBzdGF0aWMgdTgKPiA+ID4gK21pcnJv cl9wYXR0ZXJuW10gPSB7ICcxJywgJ3QnLCAnYicsICdCJyB9Owo+ID4gPiArCj4gPiA+ICtzdGF0 aWMgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyIGJidF9tYWluX2Rlc2NyID0gewo+ID4gPiArCS5vcHRp b25zID0gTkFORF9CQlRfTEFTVEJMT0NLIHwgTkFORF9CQlRfQ1JFQVRFIHwgIAo+ID4gTkFORF9C QlRfV1JJVEUgIAo+ID4gPiArCQl8IE5BTkRfQkJUXzJCSVQgfCBOQU5EX0JCVF9WRVJTSU9OIHwg TkFORF9CQlRfUEVSQ0hJUCwKPiA+ID4gKwkub2ZmcyA9IDQsCj4gPiA+ICsJLmxlbiA9IDQsCj4g PiA+ICsJLnZlcm9mZnMgPSAyMCwKPiA+ID4gKwkubWF4YmxvY2tzID0gNCwKPiA+ID4gKwkucGF0 dGVybiA9IGJidF9wYXR0ZXJuICAKPiA+IAo+ID4gSSBoYXZlIGEgZ2VuZXJhbCBxdWVzdGlvbiBj b25jZXJuaW5nIHRoZSBuYW5kIGZyYW1ld29yayBoZXJlLiBUaGUgcGF0dGVybiBtZW1iZXIgaW4g c3RydWN0Cj4gPiBuYW5kX2JidF9kZXNjciBpcyBub3QgZGVjbGFyZWQgY29uc3QuCj4gPiBUaGVy ZWZvcmUsIGJidF9wYXR0ZXJuIGNhbm5vdCBiZSBjb25zdCBoZXJlLiBBcyBmYXIgYXMgSSBsb29r ZWQsIGFsbCBhY2Nlc3NlcyBvZiBwYXR0ZXJuIHVzZSBpdAo+ID4gd2l0aCBtZW1jbXAgb3IgYXMg c291cmNlIGZvciBtZW1jcHkuIEFsc28gdGhlIGRpc2tvbmNoaXAuYyBkcml2ZXIgYXNzaWducyBh IHN0cmluZyBjb25zdGFudAo+ID4gaGVyZS4gVGhpcyBzdWdnZXN0cywgdGhhdCBwYXR0ZXJuIHNo b3VsZCBiZSBkZWNsYXJlZCBjb25zdCBvciB0aGF0IGRpc2tvbmNoaXAuYyBpcyBkb2luZyBpdAo+ ID4gd3JvbmcuICAKPiBNYXkgYmUgTWlxdWVsIGNhbiBjb21tZW50IG9uIHRoaXMuCgpJIGRpZCBu b3QgY2hlY2sgZGlza29uY2hpcC5jJ3MgaW1wbGVtZW50YXRpb24gYnV0IHR1cm5pbmcgaXQgaW50 byBjb25zdApzZWVtcyByZWFzb25hYmxlIHRvIG1lLiBIb3dldmVyIGluIHRoZSBzY29wZSBvZiB0 aGlzIGRyaXZlciwgTmFnYSwgeW91CmNhbiBrZWVwIGl0IGFzIGl0IGlzIHJpZ2h0IG5vdy4KCj4g PiAgIAo+ID4gPiArfTsKPiA+ID4gKwo+ID4gPiArc3RhdGljIHN0cnVjdCBuYW5kX2JidF9kZXNj ciBiYnRfbWlycm9yX2Rlc2NyID0gewo+ID4gPiArCS5vcHRpb25zID0gTkFORF9CQlRfTEFTVEJM T0NLIHwgTkFORF9CQlRfQ1JFQVRFIHwgIAo+ID4gTkFORF9CQlRfV1JJVEUgIAo+ID4gPiArCQl8 IE5BTkRfQkJUXzJCSVQgfCBOQU5EX0JCVF9WRVJTSU9OIHwgTkFORF9CQlRfUEVSQ0hJUCwKPiA+ ID4gKwkub2ZmcyA9IDQsCj4gPiA+ICsJLmxlbiA9IDQsCj4gPiA+ICsJLnZlcm9mZnMgPSAyMCwK PiA+ID4gKwkubWF4YmxvY2tzID0gNCwKPiA+ID4gKwkucGF0dGVybiA9IG1pcnJvcl9wYXR0ZXJu Cj4gPiA+ICt9Owo+ID4gPiArCj4gPiA+ICtzdGF0aWMgdm9pZCBwbDM1M19uZmNfZm9yY2VfYnl0 ZV9hY2Nlc3Moc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKPiA+ID4gKwkJCQkJYm9vbCBmb3JjZV84 Yml0KQo+ID4gPiArewo+ID4gPiArCWludCByZXQ7Cj4gPiA+ICsJc3RydWN0IHBsMzUzX25hbmRf Y29udHJvbGxlciAqeG5mYyA9Cj4gPiA+ICsJCWNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgcGwz NTNfbmFuZF9jb250cm9sbGVyLCBjaGlwKTsKPiA+ID4gKwo+ID4gPiArCWlmICh4bmZjLT5idXN3 aWR0aCA9PSA4KSAgCj4gPiAKPiA+IFRoaXMgYnVzd2lkdGggbWVtYmVyIGlzIG5ldmVyIGFzc2ln bmVkIGFueXdoZXJlLiBUaHVzIHRoZSB2YWx1ZSBpcyBhbHdheXMgMCBhbmQgdGhpcwo+ID4gY29t cGFyaXNvbiBhbHdheXMgZmFpbHMuICAKPiBObywgaW4gdGhlIHByb2JlIHdlIHNob3VsZCB1cGRh dGUgdGhpcywgYnkgcmVhZGluZyBpdCBmcm9tIGR0cy4KPiBVbmZvcnR1bmF0ZWx5LCB0aGUgYXNz aWdubWVudCB3YXMgcmVtb3ZlZCwgZHVyaW5nIGNoZWNrcGF0Y2ggY2xlYW4gdXAoaXRzIG15IGVk aXRvciBpc3N1ZSkuCj4gSSB3aWxsIHVwZGF0ZSBpdC4gCgpUaGlzIGFuc3dlciBpcyBzY2FyeSwg dGhlcmUgYXJlIHByb2JhYmx5IG1hbnkgb3RoZXIgcGxhY2VzIHdoZXJlIHlvdQpkZWxldGVkIHVz ZWZ1bCBjb2RlIHRoZW4/CgoKClsuLi5dCgo+ID4gPiArLyogTkFORCBmcmFtZXdvcmsgLT5leGVj X29wKCkgaG9va3MgYW5kIHJlbGF0ZWQgaGVscGVycyAqLwpzdGF0aWMKPiA+ID4gK3ZvaWQgcGwz NTNfbmZjX3BhcnNlX2luc3RydWN0aW9ucyhzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAo+ID4gPiAr CQkJCQkgY29uc3Qgc3RydWN0IG5hbmRfc3Vib3AgKnN1Ym9wLAo+ID4gPiArCQkJCQkgc3RydWN0 IHBsMzUzX25mY19vcCAqbmZjX29wKQo+ID4gPiArewo+ID4gPiArCWNvbnN0IHN0cnVjdCBuYW5k X29wX2luc3RyICppbnN0ciA9IE5VTEw7Cj4gPiA+ICsJdW5zaWduZWQgaW50IG9wX2lkLCBvZmZz ZXQsIG5hZGRyczsKPiA+ID4gKwlpbnQgaTsKPiA+ID4gKwljb25zdCB1OCAqYWRkcnM7Cj4gPiA+ ICsKPiA+ID4gKwltZW1zZXQobmZjX29wLCAwLCBzaXplb2Yoc3RydWN0IHBsMzUzX25mY19vcCkp Owo+ID4gPiArCWZvciAob3BfaWQgPSAwOyBvcF9pZCA8IHN1Ym9wLT5uaW5zdHJzOyBvcF9pZCsr KSB7Cj4gPiA+ICsJCWluc3RyID0gJnN1Ym9wLT5pbnN0cnNbb3BfaWRdOwo+ID4gPiArCj4gPiA+ ICsJCXN3aXRjaCAoaW5zdHItPnR5cGUpIHsKPiA+ID4gKwkJY2FzZSBOQU5EX09QX0NNRF9JTlNU UjoKPiA+ID4gKwkJCWlmIChvcF9pZCkKPiA+ID4gKwkJCQluZmNfb3AtPmNtbmRzWzFdID0gaW5z dHItPmN0eC5jbWQub3Bjb2RlOwo+ID4gPiArCQkJZWxzZQo+ID4gPiArCQkJCW5mY19vcC0+Y21u ZHNbMF0gPSBpbnN0ci0+Y3R4LmNtZC5vcGNvZGU7Cj4gPiA+ICsJCQluZmNfb3AtPmNsZV9hbGVf ZGVsYXlfbnMgPSBpbnN0ci0+ZGVsYXlfbnM7Cj4gPiA+ICsJCQlicmVhazsKPiA+ID4gKwo+ID4g PiArCQljYXNlIE5BTkRfT1BfQUREUl9JTlNUUjoKPiA+ID4gKwkJCW9mZnNldCA9IG5hbmRfc3Vi b3BfZ2V0X2FkZHJfc3RhcnRfb2ZmKHN1Ym9wLCBvcF9pZCk7Cj4gPiA+ICsJCQluYWRkcnMgPSBu YW5kX3N1Ym9wX2dldF9udW1fYWRkcl9jeWMoc3Vib3AsIG9wX2lkKTsKPiA+ID4gKwkJCWFkZHJz ID0gJmluc3RyLT5jdHguYWRkci5hZGRyc1tvZmZzZXRdOwo+ID4gPiArCQkJbmZjX29wLT5hZGRy cyA9IGluc3RyLT5jdHguYWRkci5hZGRyc1tvZmZzZXRdOwo+ID4gPiArCQkJZm9yIChpID0gMDsg aSA8IG1pbl90KHVuc2lnbmVkIGludCwgNCwgbmFkZHJzKTsgaSsrKSB7Cj4gPiA+ICsJCQkJbmZj X29wLT5hZGRycyB8PSBpbnN0ci0+Y3R4LmFkZHIuYWRkcnNbaV0gPDwgIAo+ID4gCj4gPiBJIGRv bid0IHF1aXRlIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGNvZGUgZG9lcywgYnV0IGl0IGxvb2tzIHN0 cmFuZ2UgdG8gbWUuIEkgY29tcGFyZWQgaXQgdG8gb3RoZXIKPiA+IGRyaXZlcnMuIFRoZSBjb2Rl IGhlcmUgaXMgcXVpdGUgc2ltaWxhciB0byBtYXJ2ZWxsX25hbmQuYy4gSXQgc2VlbXMgbGlrZSB3 ZSBhcmUgY29weWluZyBhCj4gPiB2YXJ5aW5nIG51bWJlciAoMCB0byA2KSBvZiBhZGRyZXNzZXMg ZnJvbSB0aGUgYnVmZmVyIGluc3RyLT5jdHguYWRkci5hZGRycy4gSG93ZXZlciB0aGVpcgo+ID4g aW5kaWNlcyBhcmUgc3BlY2lhbDogMCwgMSwgMiwgMywgb2Zmc2V0ICsgNCwgb2Zmc2V0ICsgNS4g VGhpcyBpcyBub24tY29uc2VjdXRpdmUgYW5kIGRpZmZlcmVudCBmcm9tCj4gPiBtYXJ2ZWxsX25h bmQuYyBpbiB0aGlzIHJlZ2FyZC4gQ291bGQgaXQgYmUgdGhhdCB5b3UgcmVhbGx5IG1lYW50IGlu ZGV4IG9mZnNldCtpIGhlcmU/ICAKPiBJIGRpZG4ndCBnZXQsIHdoYXQgeW91IGFyZSBzYXlpbmcg aGVyZS4KPiBJdCBpcyBhYm91dCB1cGRhdGluZyBwYWdlIGFuZCBjb2x1bW4gYWRkcmVzc2VzLgo+ IEFyZSB5b3UgYXNraW5nIG1lIHRvIHJlbW92ZSBuZmNfb3AtPmFkZHJzID0gaW5zdHItPmN0eC5h ZGRyLmFkZHJzW29mZnNldF07IGJlZm9yZSBmb3IgbG9vcD8KPiAKPiA+ICAgCj4gPiA+ICsJCQkJ CQkgKDggKiBpKTsKPiA+ID4gKwkJCX0KPiA+ID4gKwo+ID4gPiArCQkJaWYgKG5hZGRycyA+PSA1 KQo+ID4gPiArCQkJCW5mY19vcC0+YWRkcjUgPSBhZGRyc1s0XTsKPiA+ID4gKwkJCWlmIChuYWRk cnMgPj0gNikKPiA+ID4gKwkJCQluZmNfb3AtPmFkZHI2ID0gYWRkcnNbNV07CgpBbHNvLCB5b3Ug cHJvYmFibHkgZG9uJ3QgbmVlZCBhZGRyNSBhbmQgYWRkcjYgaGVyZSwgdGhleSB3ZXJlIG5lZWRl ZCBpbgptYXJ2ZWxsX25hbmQuYyBiZWNhdXNlIGFkZHJlc3NlcyBhcmUgc3RvcmVkIGluIHRocmVl IGRpZmZlcmVudApyZWdpc3RlcnMgYW5kIGFyZSBsaW1pdGVkIHRvIDYgY3ljbGVzLCBidXQgdGhp cyBpcyBwcm9iYWJseSBub3QgdGhlCmNhc2UgaW4geW91ciBkcml2ZXIuCgo+ID4gPiArCQkJbmZj X29wLT5uYWRkcnMgPSBuYW5kX3N1Ym9wX2dldF9udW1fYWRkcl9jeWMoc3Vib3AsCj4gPiA+ICsJ CQkJCQkJCSAgICAgb3BfaWQpOwo+ID4gPiArCQkJbmZjX29wLT5jbGVfYWxlX2RlbGF5X25zID0g aW5zdHItPmRlbGF5X25zOwo+ID4gPiArCQkJYnJlYWs7Cj4gPiA+ICsKPiA+ID4gKwkJY2FzZSBO QU5EX09QX0RBVEFfSU5fSU5TVFI6Cj4gPiA+ICsJCQluZmNfb3AtPmRhdGFfaW5zdHIgPSBpbnN0 cjsKPiA+ID4gKwkJCW5mY19vcC0+ZGF0YV9pbnN0cl9pZHggPSBvcF9pZDsKPiA+ID4gKwkJCWJy ZWFrOwo+ID4gPiArCj4gPiA+ICsJCWNhc2UgTkFORF9PUF9EQVRBX09VVF9JTlNUUjoKPiA+ID4g KwkJCW5mY19vcC0+ZGF0YV9pbnN0ciA9IGluc3RyOwo+ID4gPiArCQkJbmZjX29wLT5kYXRhX2lu c3RyX2lkeCA9IG9wX2lkOwo+ID4gPiArCQkJYnJlYWs7Cj4gPiA+ICsKPiA+ID4gKwkJY2FzZSBO QU5EX09QX1dBSVRSRFlfSU5TVFI6Cj4gPiA+ICsJCQluZmNfb3AtPnJkeV90aW1lb3V0X21zID0g aW5zdHItPmN0eC53YWl0cmR5LnRpbWVvdXRfbXM7Cj4gPiA+ICsJCQluZmNfb3AtPnJkeV9kZWxh eV9ucyA9IGluc3RyLT5kZWxheV9uczsKPiA+ID4gKwkJCWJyZWFrOwo+ID4gPiArCQl9Cj4gPiA+ ICsJfQo+ID4gPiArfQo+ID4gPiArCj4gPiA+ICtzdGF0aWMgdm9pZCBjb25kX2RlbGF5KHVuc2ln bmVkIGludCBucykgewo+ID4gPiArCWlmICghbnMpCj4gPiA+ICsJCXJldHVybjsKPiA+ID4gKwo+ ID4gPiArCWlmIChucyA8IDEwMDAwKQo+ID4gPiArCQluZGVsYXkobnMpOwo+ID4gPiArCWVsc2UK PiA+ID4gKwkJdWRlbGF5KERJVl9ST1VORF9VUChucywgMTAwMCkpOwo+ID4gPiArfSAgCj4gPiAK ClsuLi5dCgo+ID4gPiArCj4gPiA+ICsJd3JpdGVsX3JlbGF4ZWQoY21kX3BoYXNlX2RhdGEsICh2 b2lkIF9faW9tZW0gKiBfX2ZvcmNlKWNtZF9waGFzZV9hZGRyKTsKPiA+ID4gKwlpZiAoIW5mY19v cC5kYXRhX2luc3RyKSB7Cj4gPiA+ICsJCWlmIChuZmNfb3AucmR5X3RpbWVvdXRfbXMpIHsKPiA+ ID4gKwkJCWlmIChwbDM1M193YWl0X2Zvcl9kZXZfcmVhZHkoY2hpcCkpCj4gPiA+ICsJCQkJcmV0 dXJuIC1FVElNRURPVVQ7Cj4gPiA+ICsJCX0KPiA+ID4gKwo+ID4gPiArCQlyZXR1cm4gMDsKPiA+ ID4gKwl9Cj4gPiA+ICsKPiA+ID4gKwlyZWFkaW5nID0gKG5mY19vcC5kYXRhX2luc3RyLT50eXBl ID09IE5BTkRfT1BfREFUQV9JTl9JTlNUUik7Cj4gPiA+ICsJaWYgKCFyZWFkaW5nKSB7Cj4gPiA+ ICsJCWxlbiA9IG5hbmRfc3Vib3BfZ2V0X2RhdGFfbGVuKHN1Ym9wLCBvcF9pZCk7Cj4gPiA+ICsJ CXBsMzUzX25hbmRfd3JpdGVfZGF0YV9vcChjaGlwLCBpbnN0ci0+Y3R4LmRhdGEuYnVmLm91dCwK PiA+ID4gKwkJCQkJIGxlbiwgaW5zdHItPmN0eC5kYXRhLmZvcmNlXzhiaXQpOwo+ID4gPiArCQlp ZiAobmZjX29wLnJkeV90aW1lb3V0X21zKSB7Cj4gPiA+ICsJCQlpZiAocGwzNTNfd2FpdF9mb3Jf ZGV2X3JlYWR5KGNoaXApKQo+ID4gPiArCQkJCXJldHVybiAtRVRJTUVET1VUOwo+ID4gPiArCQl9 Cj4gPiA+ICsKPiA+ID4gKwkJY29uZF9kZWxheShuZmNfb3AucmR5X2RlbGF5X25zKTsKPiA+ID4g Kwl9Cj4gPiA+ICsKPiA+ID4gKwlpZiAocmVhZGluZykgeyAgCj4gPiAKPiA+IFlvdSBjb3VsZCB1 c2UgYW4gZWxzZSBicmFuY2ggaW5zdGVhZCBvZiBpbnZlcnRpbmcgdGhlIGNvbmRpdGlvbiBoZXJl Lgo+ID4gV2hlbiBNaXF1ZWwgY29tcGxhaW5lZCBhYm91dCB0aGlzIGluIHYxMywgeW91IHNhaWQg eW91J2QgY2hhbmdlIGl0LCBidXQgeW91IGRpZG4ndC4gIAo+IFNvcnJ5IGZvciB0aGF0LiBJIHdp bGwgY2hhbmdlIGl0LgoKWWVzIHBsZWFzZSwgYmUgY2FyZWZ1bCBhbmQgbm90IGluIGEgaHVycnkg d2hlbiByZS1wb3N0aW5nLCBpdCBhbHJlYWR5CnRha2VzIHF1aXRlIHNvbWUgdGltZSB0byByZXZp ZXcgdGhlIGVudGlyZSBkcml2ZXIuCgpUaGFua3MsCk1pcXXDqGwKCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eCBNVEQgZGlzY3Vzc2lv biBtYWlsaW5nIGxpc3QKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5m by9saW51eC1tdGQvCg== 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=-1.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,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 20AE6C43219 for ; Mon, 29 Apr 2019 12:23:40 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D8C4520673 for ; Mon, 29 Apr 2019 12:23:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728061AbfD2MXi convert rfc822-to-8bit (ORCPT ); Mon, 29 Apr 2019 08:23:38 -0400 Received: from relay9-d.mail.gandi.net ([217.70.183.199]:36761 "EHLO relay9-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727710AbfD2MXi (ORCPT ); Mon, 29 Apr 2019 08:23:38 -0400 X-Originating-IP: 90.88.147.33 Received: from xps13 (aaubervilliers-681-1-27-33.w90-88.abo.wanadoo.fr [90.88.147.33]) (Authenticated sender: miquel.raynal@bootlin.com) by relay9-d.mail.gandi.net (Postfix) with ESMTPSA id 07C55FF810; Mon, 29 Apr 2019 12:23:33 +0000 (UTC) Date: Mon, 29 Apr 2019 14:23:32 +0200 From: Miquel Raynal To: Naga Sureshkumar Relli Cc: Helmut Grohne , "bbrezillon@kernel.org" , "richard@nod.at" , "dwmw2@infradead.org" , "computersforpeace@gmail.com" , "marek.vasut@gmail.com" , "linux-mtd@lists.infradead.org" , "linux-kernel@vger.kernel.org" , Michal Simek , "nagasureshkumarrelli@gmail.com" Subject: Re: [LINUX PATCH v14] mtd: rawnand: pl353: Add basic driver for arm pl353 smc nand interface Message-ID: <20190429142332.27a2cba5@xps13> In-Reply-To: References: <1555326613-26739-1-git-send-email-naga.sureshkumar.relli@xilinx.com> <20190425112338.dipgmqqfuj45gx6s@laureti-dev> Organization: Bootlin X-Mailer: Claws Mail 3.17.1 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Naga, > > > + u32 addrs; > > > + u32 naddrs; > > > + u32 addr5; > > > + u32 addr6; > > > > Why are addr5 and addr6 u32? You only ever store u8 values in here. How about merging > > them into an u16 addr56? Doing so would make the access in pl353_nand_exec_op_cmd > > simpler and move a little complexity into pl353_nfc_parse_instructions. > Will try this. But I don't see any complex logic involved using addr5 and addr6. This is a relic of a too quick copy from marvell_nand.c. Please match the structure with your controller memory layout instead. > > > + const struct nand_op_instr *data_instr; }; > > > + > > > +/** > > > + * struct pl353_nand_controller - Defines the NAND flash controller driver > > > + * instance > > > + * @chip: NAND chip information structure > > > + * @dev: Parent device (used to print error messages) > > > + * @regs: Virtual address of the NAND flash device > > > + * @buf_addr: Virtual address of the NAND flash device for > > > + * data read/writes > > > + * @addr_cycles: Address cycles > > > + * @mclk: Memory controller clock > > > + * @buswidth: Bus width 8 or 16 > > > + */ > > > +struct pl353_nand_controller { > > > + struct nand_controller controller; > > > + struct nand_chip chip; > > > + struct device *dev; > > > + void __iomem *regs; > > > + void __iomem *buf_addr; > > > > I find the use of buf_addr unfortunate. It is consumed by two functions > > pl353_nand_read_data_op and pl353_nand_write_data_op. All other functions update its > > value. Semantically, its value is regs + some flags. For the updaters that means a complex logic > > where they first have to subtract reg, then change flags and add reg again. To make matters > > worse, this computation involves __force casts between long and __iomem (which yielded > > complaints in earlier reviews). I think it would simplify the code if you replaced buf_addr with > > something like addr_flags and then compute buf_addr as regs + addr_flags in those two > > consumers. What do you think? > This definitely simplifies the driver logic, we have to do that. > I tried it previously, regarding __force and __iomem casting changes, but the driver functionality was broken > With this update. > Let me update it and check it again. > But just wanted to know, do you see issues with these __force and __iomem castings? > > > > > + u8 addr_cycles; > > > + struct clk *mclk; > > > > All you need here is the memory clock frequency. Wouldn't it be easier to extract that > > frequency once during probe and store it here? That assumes a constant frequency, but if the > > frequency isn't constant, you have a race condition. > That is what we are doing in the probe. > In the probe, we are getting mclk using of_clk_get() and then we are getting the actual frequency > Using clk_get_rate(). > And this is constant frequency only(getting from dts) What Helmut proposes is, I think, saving the clock frequency to avoid requesting it everytime you want to use it (if this is done many times). [...] > > > + > > > + oobregion->offset = (section * chip->ecc.bytes) + 2; > > > + oobregion->length = 50; > > > + > > > + return 0; > > > +} > > > + > > > +static const struct mtd_ooblayout_ops pl353_ecc_ooblayout64_ops = { > > > + .ecc = pl353_ecc_ooblayout64_ecc, > > > + .free = pl353_ecc_ooblayout64_free, > > > +}; > > > + > > > +/* Generic flash bbt decriptors */ > > > +static u8 bbt_pattern[] = { 'B', 'b', 't', '0' }; static u8 > > > +mirror_pattern[] = { '1', 't', 'b', 'B' }; > > > + > > > +static struct nand_bbt_descr bbt_main_descr = { > > > + .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | > > NAND_BBT_WRITE > > > + | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP, > > > + .offs = 4, > > > + .len = 4, > > > + .veroffs = 20, > > > + .maxblocks = 4, > > > + .pattern = bbt_pattern > > > > I have a general question concerning the nand framework here. The pattern member in struct > > nand_bbt_descr is not declared const. > > Therefore, bbt_pattern cannot be const here. As far as I looked, all accesses of pattern use it > > with memcmp or as source for memcpy. Also the diskonchip.c driver assigns a string constant > > here. This suggests, that pattern should be declared const or that diskonchip.c is doing it > > wrong. > May be Miquel can comment on this. I did not check diskonchip.c's implementation but turning it into const seems reasonable to me. However in the scope of this driver, Naga, you can keep it as it is right now. > > > > > +}; > > > + > > > +static struct nand_bbt_descr bbt_mirror_descr = { > > > + .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | > > NAND_BBT_WRITE > > > + | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP, > > > + .offs = 4, > > > + .len = 4, > > > + .veroffs = 20, > > > + .maxblocks = 4, > > > + .pattern = mirror_pattern > > > +}; > > > + > > > +static void pl353_nfc_force_byte_access(struct nand_chip *chip, > > > + bool force_8bit) > > > +{ > > > + int ret; > > > + struct pl353_nand_controller *xnfc = > > > + container_of(chip, struct pl353_nand_controller, chip); > > > + > > > + if (xnfc->buswidth == 8) > > > > This buswidth member is never assigned anywhere. Thus the value is always 0 and this > > comparison always fails. > No, in the probe we should update this, by reading it from dts. > Unfortunately, the assignment was removed, during checkpatch clean up(its my editor issue). > I will update it. This answer is scary, there are probably many other places where you deleted useful code then? [...] > > > +/* NAND framework ->exec_op() hooks and related helpers */ static > > > +void pl353_nfc_parse_instructions(struct nand_chip *chip, > > > + const struct nand_subop *subop, > > > + struct pl353_nfc_op *nfc_op) > > > +{ > > > + const struct nand_op_instr *instr = NULL; > > > + unsigned int op_id, offset, naddrs; > > > + int i; > > > + const u8 *addrs; > > > + > > > + memset(nfc_op, 0, sizeof(struct pl353_nfc_op)); > > > + for (op_id = 0; op_id < subop->ninstrs; op_id++) { > > > + instr = &subop->instrs[op_id]; > > > + > > > + switch (instr->type) { > > > + case NAND_OP_CMD_INSTR: > > > + if (op_id) > > > + nfc_op->cmnds[1] = instr->ctx.cmd.opcode; > > > + else > > > + nfc_op->cmnds[0] = instr->ctx.cmd.opcode; > > > + nfc_op->cle_ale_delay_ns = instr->delay_ns; > > > + break; > > > + > > > + case NAND_OP_ADDR_INSTR: > > > + offset = nand_subop_get_addr_start_off(subop, op_id); > > > + naddrs = nand_subop_get_num_addr_cyc(subop, op_id); > > > + addrs = &instr->ctx.addr.addrs[offset]; > > > + nfc_op->addrs = instr->ctx.addr.addrs[offset]; > > > + for (i = 0; i < min_t(unsigned int, 4, naddrs); i++) { > > > + nfc_op->addrs |= instr->ctx.addr.addrs[i] << > > > > I don't quite understand what this code does, but it looks strange to me. I compared it to other > > drivers. The code here is quite similar to marvell_nand.c. It seems like we are copying a > > varying number (0 to 6) of addresses from the buffer instr->ctx.addr.addrs. However their > > indices are special: 0, 1, 2, 3, offset + 4, offset + 5. This is non-consecutive and different from > > marvell_nand.c in this regard. Could it be that you really meant index offset+i here? > I didn't get, what you are saying here. > It is about updating page and column addresses. > Are you asking me to remove nfc_op->addrs = instr->ctx.addr.addrs[offset]; before for loop? > > > > > > + (8 * i); > > > + } > > > + > > > + if (naddrs >= 5) > > > + nfc_op->addr5 = addrs[4]; > > > + if (naddrs >= 6) > > > + nfc_op->addr6 = addrs[5]; Also, you probably don't need addr5 and addr6 here, they were needed in marvell_nand.c because addresses are stored in three different registers and are limited to 6 cycles, but this is probably not the case in your driver. > > > + nfc_op->naddrs = nand_subop_get_num_addr_cyc(subop, > > > + op_id); > > > + nfc_op->cle_ale_delay_ns = instr->delay_ns; > > > + break; > > > + > > > + case NAND_OP_DATA_IN_INSTR: > > > + nfc_op->data_instr = instr; > > > + nfc_op->data_instr_idx = op_id; > > > + break; > > > + > > > + case NAND_OP_DATA_OUT_INSTR: > > > + nfc_op->data_instr = instr; > > > + nfc_op->data_instr_idx = op_id; > > > + break; > > > + > > > + case NAND_OP_WAITRDY_INSTR: > > > + nfc_op->rdy_timeout_ms = instr->ctx.waitrdy.timeout_ms; > > > + nfc_op->rdy_delay_ns = instr->delay_ns; > > > + break; > > > + } > > > + } > > > +} > > > + > > > +static void cond_delay(unsigned int ns) { > > > + if (!ns) > > > + return; > > > + > > > + if (ns < 10000) > > > + ndelay(ns); > > > + else > > > + udelay(DIV_ROUND_UP(ns, 1000)); > > > +} > > [...] > > > + > > > + writel_relaxed(cmd_phase_data, (void __iomem * __force)cmd_phase_addr); > > > + if (!nfc_op.data_instr) { > > > + if (nfc_op.rdy_timeout_ms) { > > > + if (pl353_wait_for_dev_ready(chip)) > > > + return -ETIMEDOUT; > > > + } > > > + > > > + return 0; > > > + } > > > + > > > + reading = (nfc_op.data_instr->type == NAND_OP_DATA_IN_INSTR); > > > + if (!reading) { > > > + len = nand_subop_get_data_len(subop, op_id); > > > + pl353_nand_write_data_op(chip, instr->ctx.data.buf.out, > > > + len, instr->ctx.data.force_8bit); > > > + if (nfc_op.rdy_timeout_ms) { > > > + if (pl353_wait_for_dev_ready(chip)) > > > + return -ETIMEDOUT; > > > + } > > > + > > > + cond_delay(nfc_op.rdy_delay_ns); > > > + } > > > + > > > + if (reading) { > > > > You could use an else branch instead of inverting the condition here. > > When Miquel complained about this in v13, you said you'd change it, but you didn't. > Sorry for that. I will change it. Yes please, be careful and not in a hurry when re-posting, it already takes quite some time to review the entire driver. Thanks, Miquèl