From patchwork Mon Apr 27 08:20:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris Brezillon X-Patchwork-Id: 1277404 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=KTQhdZuj; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 499d8W1Cw9z9sRf for ; Mon, 27 Apr 2020 18:23:39 +1000 (AEST) 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=SefBk8WO0kJ/m2cA1q0MWpkfubXxh2u8djUVw270Lyk=; b=KTQhdZujuZcFSp mYbiWANeIpvI5QeUQdLu92/fMsrK0A8vicAkqv/fdRtpqP4CMhVy6Oqg4+KLRWLap904jYjZs1Uxv mjRQgh2FXa4yY5a+2wLsKVq0R+ehRe1oWMVMdN+/ad+3mt+lXEdT/ZyieRYoAX33pcT8aprocwfZJ NuWzff6bJHBhgQLKT8aI5e3W1IQyovwxm1mWvbrUig69Goo9RLFUe4XVZJndqUeUM4B5KuKRnUSGc Rkdt3ZKQcaAJhsrw859fHmG/CLGnbyipRWMzvVnw08l57mh6aoC5ypZlU0+e7DvCF5vaLX2RVtTz3 lMfF5EMSHsAGTEqJ6blA==; 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 1jSz39-0000Sz-NR; Mon, 27 Apr 2020 08:23:35 +0000 Received: from bhuna.collabora.co.uk ([46.235.227.227]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jSz0G-00061Z-Jv for linux-mtd@lists.infradead.org; Mon, 27 Apr 2020 08:20:38 +0000 Received: from localhost.localdomain (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id 08D632A08BD; Mon, 27 Apr 2020 09:20:32 +0100 (BST) From: Boris Brezillon To: David Woodhouse , Miquel Raynal , linux-mtd@lists.infradead.org Subject: [PATCH 01/17] mtd: rawnand: cafe: Get rid of an inaccurate kernel doc header Date: Mon, 27 Apr 2020 10:20:11 +0200 Message-Id: <20200427082028.394719-2-boris.brezillon@collabora.com> X-Mailer: git-send-email 2.25.3 In-Reply-To: <20200427082028.394719-1-boris.brezillon@collabora.com> References: <20200427082028.394719-1-boris.brezillon@collabora.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200427_012036_823497_7080C1EA X-CRM114-Status: GOOD ( 10.87 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [46.235.227.227 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Weinberger , Boris Brezillon , Vignesh Raghavendra , Tudor Ambarus Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Driver files are not parsed for doc generation, and the cafe_nand_read_page() kernel-doc header was wrong, so let's get rid of it. Signed-off-by: Boris Brezillon Reviewed-by: Miquel Raynal --- drivers/mtd/nand/raw/cafe_nand.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c index 2a0df13df5f3..1296380a4996 100644 --- a/drivers/mtd/nand/raw/cafe_nand.c +++ b/drivers/mtd/nand/raw/cafe_nand.c @@ -357,13 +357,8 @@ static int cafe_nand_read_oob(struct nand_chip *chip, int page) return nand_read_oob_op(chip, page, 0, chip->oob_poi, mtd->oobsize); } -/** - * cafe_nand_read_page_syndrome - [REPLACEABLE] hardware ecc syndrome based page read - * @mtd: mtd info structure - * @chip: nand chip info structure - * @buf: buffer to store read data - * @oob_required: caller expects OOB data read to chip->oob_poi - * + +/* * The hw generator calculates the error syndrome automatically. Therefore * we need a special oob layout and handling. */ From patchwork Mon Apr 27 08:20:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris Brezillon X-Patchwork-Id: 1277406 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=WJCE7Wx/; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 499d9F4dWCz9sSc for ; Mon, 27 Apr 2020 18:24:17 +1000 (AEST) 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=ysfmTUw8wKOy6oYg2HaEZOku/KtG5QHiFx+DIg2gn3E=; b=WJCE7Wx/vHDsFy 1cbDvXiUsDa8S9qKbe3bPrjgIsx0xqy3bB+6XjuxMhYYBauIrVHB6iMtxQ3vaNwH4qhCerApcVU1+ /3aHMzJV/26S5/4D1kSWuWgOVmZkThpnHJe5Ns05GGCLWN9vD9eo2JN8HXWgGbIGp+bz8HmsmxRwK nD2rGsWCa4Msc6zF9oCovSCEYnpqS0tk0tI7wD+T2VNehQjId/XU3wjaCi1Vyf2o+ACaK7eHUqzIa hapSmct0tdOp6bJgcX95lGSzVL565//rrACYN9eBj8ccyxLN6UIOkv5gmASk+uEU1IdRyxmJD5jCn a1hlC8qNvunsgB8/3hgg==; 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 1jSz3m-0000zm-Qh; Mon, 27 Apr 2020 08:24:14 +0000 Received: from bhuna.collabora.co.uk ([2a00:1098:0:82:1000:25:2eeb:e3e3]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jSz0H-00061a-Ad for linux-mtd@lists.infradead.org; Mon, 27 Apr 2020 08:20:40 +0000 Received: from localhost.localdomain (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id 4BF0A2A08D5; Mon, 27 Apr 2020 09:20:32 +0100 (BST) From: Boris Brezillon To: David Woodhouse , Miquel Raynal , linux-mtd@lists.infradead.org Subject: [PATCH 02/17] mtd: rawnand: cafe: Rename cafe_nand_write_page_lowlevel() Date: Mon, 27 Apr 2020 10:20:12 +0200 Message-Id: <20200427082028.394719-3-boris.brezillon@collabora.com> X-Mailer: git-send-email 2.25.3 In-Reply-To: <20200427082028.394719-1-boris.brezillon@collabora.com> References: <20200427082028.394719-1-boris.brezillon@collabora.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200427_012037_505128_558917C8 X-CRM114-Status: GOOD ( 11.52 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Weinberger , Boris Brezillon , Vignesh Raghavendra , Tudor Ambarus Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Let's rename that one cafe_nand_write_page() to be consistent with other function names. Signed-off-by: Boris Brezillon Reviewed-by: Miquel Raynal --- drivers/mtd/nand/raw/cafe_nand.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c index 1296380a4996..03964e092243 100644 --- a/drivers/mtd/nand/raw/cafe_nand.c +++ b/drivers/mtd/nand/raw/cafe_nand.c @@ -525,9 +525,9 @@ static struct nand_bbt_descr cafe_bbt_mirror_descr_512 = { }; -static int cafe_nand_write_page_lowlevel(struct nand_chip *chip, - const uint8_t *buf, int oob_required, - int page) +static int cafe_nand_write_page(struct nand_chip *chip, + const uint8_t *buf, int oob_required, + int page) { struct mtd_info *mtd = nand_to_mtd(chip); struct cafe_priv *cafe = nand_get_controller_data(chip); @@ -628,7 +628,7 @@ static int cafe_nand_attach_chip(struct nand_chip *chip) cafe->nand.ecc.size = mtd->writesize; cafe->nand.ecc.bytes = 14; cafe->nand.ecc.strength = 4; - cafe->nand.ecc.write_page = cafe_nand_write_page_lowlevel; + cafe->nand.ecc.write_page = cafe_nand_write_page; cafe->nand.ecc.write_oob = cafe_nand_write_oob; cafe->nand.ecc.read_page = cafe_nand_read_page; cafe->nand.ecc.read_oob = cafe_nand_read_oob; From patchwork Mon Apr 27 08:20:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris Brezillon X-Patchwork-Id: 1277405 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=rBWGmWGH; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 499d8t6Rlvz9sRf for ; Mon, 27 Apr 2020 18:23:58 +1000 (AEST) 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=aBoQgcrgcz31Xlrbi0v9r8+l6rfmrWQRgef3bHxgtqs=; b=rBWGmWGHKMbtM5 jjRlJf90i8dYYdZ2Q86kJCpqCVwm+3RQd/BSFOpFOB+pEXo5KRvuiedtMxlw3YZ+w10dCB+puHbob anmd3KCFPUIQPAVx03dgEfaaULBDYOD7dvqzULC/wsYGAJumVxn8cdpjBRzXUYBjg5zoArADsCUCw 09aIfrwGHp4ictLcnfSD446HsMJg3IaD6ZFgTf9YAnCDPXyqrAwtBUvqfe3CaYyl35wFM9dhePOOu 3xw2v7VfkDQFcsbKGpJfPzTO2RkG2pZwdhHgvKOuLUXiZKAJ/t3QD+CDNRKQogsE57U0pBcswO+6p Vh2PpfxHF7InnxcBw2Lg==; 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 1jSz3U-0000kf-5c; Mon, 27 Apr 2020 08:23:56 +0000 Received: from bhuna.collabora.co.uk ([2a00:1098:0:82:1000:25:2eeb:e3e3]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jSz0I-00065h-BY for linux-mtd@lists.infradead.org; Mon, 27 Apr 2020 08:20:40 +0000 Received: from localhost.localdomain (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id 8F5AE2A0955; Mon, 27 Apr 2020 09:20:32 +0100 (BST) From: Boris Brezillon To: David Woodhouse , Miquel Raynal , linux-mtd@lists.infradead.org Subject: [PATCH 03/17] mtd: rawnand: cafe: Use a correct ECC mode and pass the ECC alg Date: Mon, 27 Apr 2020 10:20:13 +0200 Message-Id: <20200427082028.394719-4-boris.brezillon@collabora.com> X-Mailer: git-send-email 2.25.3 In-Reply-To: <20200427082028.394719-1-boris.brezillon@collabora.com> References: <20200427082028.394719-1-boris.brezillon@collabora.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200427_012038_669434_51559680 X-CRM114-Status: GOOD ( 13.52 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Weinberger , Boris Brezillon , Vignesh Raghavendra , Tudor Ambarus Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org The NAND_ECC_HW_SYNDROME name is a bit misleading. It's actually used for drivers that interleave data and ECC bytes inside a page, which is not the case here. Let's fix that and pass the ECC algorithm used by the ECC engine. Signed-off-by: Boris Brezillon Reviewed-by: Miquel Raynal --- drivers/mtd/nand/raw/cafe_nand.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c index 03964e092243..47aacfab8ecb 100644 --- a/drivers/mtd/nand/raw/cafe_nand.c +++ b/drivers/mtd/nand/raw/cafe_nand.c @@ -624,7 +624,8 @@ static int cafe_nand_attach_chip(struct nand_chip *chip) goto out_free_dma; } - cafe->nand.ecc.mode = NAND_ECC_HW_SYNDROME; + cafe->nand.ecc.mode = NAND_ECC_HW; + cafe->nand.ecc.algo = NAND_ECC_RS; cafe->nand.ecc.size = mtd->writesize; cafe->nand.ecc.bytes = 14; cafe->nand.ecc.strength = 4; From patchwork Mon Apr 27 08:20:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris Brezillon X-Patchwork-Id: 1277408 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=uYcKffuV; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 499d9n06gSz9sRf for ; Mon, 27 Apr 2020 18:24:45 +1000 (AEST) 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=8Y90itN93gZmCHFLKzgCZcuK3vK7XK9Qw37cl6UNTus=; b=uYcKffuV2IN4WR dvOrO8OgUhGE/zZTP5GTAMLd+/2lJxDmImitZAsvjMbQZcNKuE705knvWTT4NuuN3ljNuCoTWjxWA gYFzbY7Qk8Rjd1JS1S0tmK/0jmv2dIyXKL+eWggwBINxhwtbo3H6c9Jfwj4WPt+ElMZhFgOGtPvuX ecUGg7UTB+pnhOq551hTGyw3TUNPXgS0XaggmaEcmI5E+k3UMIKtkF+bYnZpWvWIprx4o8nkZylz/ 6mMYutixBFL3mXM50lJwyl6GtSyL/QIipN8qFX+DQ0MaxsN/CMxnFiLSRHY9L585NAYX5GKq+23Qi xNIyyg16YaWTz3kZDIzA==; 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 1jSz45-0001E5-SB; Mon, 27 Apr 2020 08:24:33 +0000 Received: from bhuna.collabora.co.uk ([2a00:1098:0:82:1000:25:2eeb:e3e3]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jSz0I-00066R-B1 for linux-mtd@lists.infradead.org; Mon, 27 Apr 2020 08:20:40 +0000 Received: from localhost.localdomain (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id 5B2AA2A098C; Mon, 27 Apr 2020 09:20:36 +0100 (BST) From: Boris Brezillon To: David Woodhouse , Miquel Raynal , linux-mtd@lists.infradead.org Subject: [PATCH 04/17] mtd: rawnand: cafe: Include linux/io.h instead of asm/io.h Date: Mon, 27 Apr 2020 10:20:14 +0200 Message-Id: <20200427082028.394719-5-boris.brezillon@collabora.com> X-Mailer: git-send-email 2.25.3 In-Reply-To: <20200427082028.394719-1-boris.brezillon@collabora.com> References: <20200427082028.394719-1-boris.brezillon@collabora.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200427_012038_680025_F3E615E8 X-CRM114-Status: GOOD ( 11.97 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Weinberger , Boris Brezillon , Vignesh Raghavendra , Tudor Ambarus Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Drivers should include the asm headers directly. Signed-off-by: Boris Brezillon Reviewed-by: Miquel Raynal --- drivers/mtd/nand/raw/cafe_nand.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c index 47aacfab8ecb..156a308b530b 100644 --- a/drivers/mtd/nand/raw/cafe_nand.c +++ b/drivers/mtd/nand/raw/cafe_nand.c @@ -23,7 +23,7 @@ #include #include #include -#include +#include #define CAFE_NAND_CTRL1 0x00 #define CAFE_NAND_CTRL2 0x04 From patchwork Mon Apr 27 08:20:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Boris Brezillon X-Patchwork-Id: 1277419 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=gn9nLDTL; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 499dDL6sNZz9sRf for ; Mon, 27 Apr 2020 18:26:58 +1000 (AEST) 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=EPaxZR7C16GT5RyyGHvwF3b8P7dtiVGGLjMwPIR5aDU=; b=gn9nLDTLf13sCV iGhP1bzkx7Mii2PaIJhgZ31UgEM5h7/Ge7TyHt13bjNp6FXIvoNngGrS7wO61qLeP7/v0EHrhJCnI E71N/fD0lHWKEFOL1zf8Fv0PFP877vs3pLuOudgBtn8VTDumIzEaD832pjs4d6faEaqRqlQhD6dd9 y6W0PH6U6K9koUI07LOJ/ulV2j0ngXzVK4DNFj+Lz+mx/temT8gzVJv7nKvBN3XTo1zlNNEQcdOJw FbPsr0keQQkbwem9clqMJoCZpifSTpoCQBaZWnIa54Y2zjyZNzst3A4RwQDzaN6slOUJcSidggkBO z89E38xb5L9ojJWWHxvQ==; 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 1jSz6C-0005J1-SS; Mon, 27 Apr 2020 08:26:44 +0000 Received: from bhuna.collabora.co.uk ([46.235.227.227]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jSz0K-000682-0D for linux-mtd@lists.infradead.org; Mon, 27 Apr 2020 08:20:45 +0000 Received: from localhost.localdomain (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id C8B822A088B; Mon, 27 Apr 2020 09:20:36 +0100 (BST) From: Boris Brezillon To: David Woodhouse , Miquel Raynal , linux-mtd@lists.infradead.org Subject: [PATCH 05/17] mtd: rawnand: cafe: Demistify register fields Date: Mon, 27 Apr 2020 10:20:15 +0200 Message-Id: <20200427082028.394719-6-boris.brezillon@collabora.com> X-Mailer: git-send-email 2.25.3 In-Reply-To: <20200427082028.394719-1-boris.brezillon@collabora.com> References: <20200427082028.394719-1-boris.brezillon@collabora.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200427_012040_330027_DC3B235F X-CRM114-Status: GOOD ( 19.74 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [46.235.227.227 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Weinberger , Boris Brezillon , Vignesh Raghavendra , Tudor Ambarus Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org The driver has a bunch of magic values. Let's define proper register fields based on the this spec http://wiki.laptop.org/images/5/5c/88ALP01_Datasheet_July_2007.pdf and use them. Signed-off-by: Boris Brezillon --- drivers/mtd/nand/raw/cafe_nand.c | 351 ++++++++++++++++++++++++------- 1 file changed, 270 insertions(+), 81 deletions(-) diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c index 156a308b530b..fbc18bc3d46b 100644 --- a/drivers/mtd/nand/raw/cafe_nand.c +++ b/drivers/mtd/nand/raw/cafe_nand.c @@ -9,6 +9,7 @@ * Copyright © 2006 David Woodhouse */ +#include #define DEBUG #include @@ -25,37 +26,127 @@ #include #include -#define CAFE_NAND_CTRL1 0x00 -#define CAFE_NAND_CTRL2 0x04 -#define CAFE_NAND_CTRL3 0x08 -#define CAFE_NAND_STATUS 0x0c -#define CAFE_NAND_IRQ 0x10 -#define CAFE_NAND_IRQ_MASK 0x14 -#define CAFE_NAND_DATA_LEN 0x18 -#define CAFE_NAND_ADDR1 0x1c -#define CAFE_NAND_ADDR2 0x20 -#define CAFE_NAND_TIMING1 0x24 -#define CAFE_NAND_TIMING2 0x28 -#define CAFE_NAND_TIMING3 0x2c -#define CAFE_NAND_NONMEM 0x30 -#define CAFE_NAND_ECC_RESULT 0x3C -#define CAFE_NAND_DMA_CTRL 0x40 -#define CAFE_NAND_DMA_ADDR0 0x44 -#define CAFE_NAND_DMA_ADDR1 0x48 -#define CAFE_NAND_ECC_SYN01 0x50 -#define CAFE_NAND_ECC_SYN23 0x54 -#define CAFE_NAND_ECC_SYN45 0x58 -#define CAFE_NAND_ECC_SYN67 0x5c -#define CAFE_NAND_READ_DATA 0x1000 -#define CAFE_NAND_WRITE_DATA 0x2000 +#define CAFE_NAND_CTRL1 0x00 +#define CAFE_NAND_CTRL1_HAS_CMD BIT(31) +#define CAFE_NAND_CTRL1_HAS_ADDR BIT(30) +#define CAFE_NAND_CTRL1_NUM_ADDR_CYC GENMASK(29, 27) +#define CAFE_NAND_CTRL1_HAS_DATA_IN BIT(26) +#define CAFE_NAND_CTRL1_HAS_DATA_OUT BIT(25) +#define CAFE_NAND_CTRL1_NUM_NONMEM_READ_HIGH GENMASK(24, 22) +#define CAFE_NAND_CTRL1_WAIT_BSY_AFTER_SEQ BIT(21) +#define CAFE_NAND_CTRL1_NUM_NONMEM_READ_LOW BIT(20) +#define CAFE_NAND_CTRL1_CE BIT(19) +#define CAFE_NAND_CTRL1_CMD GENMASK(7, 0) -#define CAFE_GLOBAL_CTRL 0x3004 -#define CAFE_GLOBAL_IRQ 0x3008 -#define CAFE_GLOBAL_IRQ_MASK 0x300c -#define CAFE_NAND_RESET 0x3034 +#define CAFE_NAND_CTRL2 0x04 +#define CAFE_NAND_CTRL2_AUTO_WRITE_ECC BIT(30) +#define CAFE_NAND_CTRL2_PAGE_SIZE GENMASK(29, 28) +#define CAFE_NAND_CTRL2_ECC_ALG_RS BIT(27) +#define CAFE_NAND_CTRL2_HAS_CMD2 BIT(8) +#define CAFE_NAND_CTRL2_CMD2 GENMASK(7, 0) -/* Missing from the datasheet: bit 19 of CTRL1 sets CE0 vs. CE1 */ -#define CTRL1_CHIPSELECT (1<<19) +#define CAFE_NAND_CTRL3 0x08 +#define CAFE_NAND_CTRL3_READ_BUSY_RESET BIT(31) +#define CAFE_NAND_CTRL3_WP BIT(30) + +#define CAFE_NAND_STATUS 0x0c +#define CAFE_NAND_STATUS_CONTROLLER_BUSY BIT(31) +#define CAFE_NAND_STATUS_FLASH_BUSY BIT(30) + +#define CAFE_NAND_IRQ 0x10 +#define CAFE_NAND_IRQ_MASK 0x14 +#define CAFE_NAND_IRQ_CMD_DONE BIT(31) +#define CAFE_NAND_IRQ_FLASH_RDY BIT(30) +#define CAFE_NAND_IRQ_DMA_DONE BIT(28) +#define CAFE_NAND_IRQ_BOOT_DONE BIT(27) + +#define CAFE_NAND_DATA_LEN 0x18 +#define CAFE_NAND_ADDR1 0x1c +#define CAFE_NAND_ADDR2 0x20 + +#define CAFE_NAND_TIMING1 0x24 +#define CAFE_NAND_TIMING1_TCLS GENMASK(31, 28) +#define CAFE_NAND_TIMING1_TCLH GENMASK(27, 24) +#define CAFE_NAND_TIMING1_TALS GENMASK(23, 20) +#define CAFE_NAND_TIMING1_TALH GENMASK(19, 16) +#define CAFE_NAND_TIMING1_TWB GENMASK(15, 8) +#define CAFE_NAND_TIMING1_TRB GENMASK(7, 0) + +#define CAFE_NAND_TIMING2 0x28 +#define CAFE_NAND_TIMING2_TRR GENMASK(31, 28) +#define CAFE_NAND_TIMING2_TREA GENMASK(27, 24) +#define CAFE_NAND_TIMING2_TDH GENMASK(23, 20) +#define CAFE_NAND_TIMING2_TDS GENMASK(19, 16) +#define CAFE_NAND_TIMING2_TRH GENMASK(15, 12) +#define CAFE_NAND_TIMING2_TRP GENMASK(11, 8) +#define CAFE_NAND_TIMING2_TWH GENMASK(7, 4) +#define CAFE_NAND_TIMING2_TWP GENMASK(3, 0) + +#define CAFE_NAND_TIMING3 0x2c +#define CAFE_NAND_TIMING3_TAR GENMASK(31, 28) +#define CAFE_NAND_TIMING3_TCLR GENMASK(27, 24) + +#define CAFE_NAND_NONMEM_READ_DATA 0x30 +#define CAFE_NAND_ECC_READ_CODE 0x38 + +#define CAFE_NAND_ECC_RESULT 0x3C +#define CAFE_NAND_ECC_RESULT_RS_ERRORS BIT(18) +#define CAFE_NAND_ECC_RESULT_STATUS GENMASK(17, 16) +#define CAFE_NAND_ECC_RESULT_NO_ERROR (0 << 16) +#define CAFE_NAND_ECC_RESULT_CORRECTABLE_ERRS (1 << 16) +#define CAFE_NAND_ECC_RESULT_UNCORRECTABLE_ERRS (2 << 16) +#define CAFE_NAND_ECC_RESULT_FAIL_BIT_LOC GENMASK(13, 0) + +#define CAFE_NAND_DMA_CTRL 0x40 +#define CAFE_NAND_DMA_CTRL_ENABLE BIT(31) +#define CAFE_NAND_DMA_CTRL_RESERVED BIT(30) +#define CAFE_NAND_DMA_CTRL_DATA_IN BIT(29) +#define CAFE_NAND_DMA_CTRL_DATA_LEN GENMASK(11, 0) + +#define CAFE_NAND_DMA_ADDR0 0x44 +#define CAFE_NAND_DMA_ADDR1 0x48 +#define CAFE_NAND_ECC_SYN_REG(x) (((x) / 2) + 0x50) +#define CAFE_NAND_ECC_SYN_FIELD(x) (((x) % 2) ? GENMASK(31, 16) : GENMASK(15, 0)) + +#define CAFE_NAND_CTRL4 0x60 +#define CAFE_NAND_CTRL4_NO_READ_DELAY BIT(8) + +#define CAFE_NAND_DRIVE_STRENGTH 0x64 +#define CAFE_NAND_DRIVE_STRENGTH_VAL GENMASK(4, 0) + +#define CAFE_NAND_READ_DATA 0x1000 +#define CAFE_NAND_WRITE_DATA 0x2000 + +#define CAFE_GLOBAL_CTRL 0x3004 +#define CAFE_GLOBAL_CCIC_CLK_ENABLE BIT(14) +#define CAFE_GLOBAL_SDH_CLK_ENABLE BIT(13) +#define CAFE_GLOBAL_NAND_CLK_ENABLE BIT(12) +#define CAFE_GLOBAL_CLKRUN_ENABLE_SET BIT(11) +#define CAFE_GLOBAL_CLKRUN_ENABLE_CLEAR BIT(10) +#define CAFE_GLOBAL_SW_IRQ_SET BIT(7) +#define CAFE_GLOBAL_SW_IRQ_CLEAR BIT(6) +#define CAFE_GLOBAL_STOP_MASTER_DONE BIT(5) +#define CAFE_GLOBAL_STOP_MASTER BIT(4) +#define CAFE_GLOBAL_MASTER_RESET_CLEAR BIT(3) +#define CAFE_GLOBAL_MASTER_RESET_SET BIT(2) +#define CAFE_GLOBAL_SW_RESET_CLEAR BIT(1) +#define CAFE_GLOBAL_SW_RESET_SET BIT(0) + +#define CAFE_GLOBAL_IRQ 0x3008 +#define CAFE_GLOBAL_IRQ_MASK 0x300c +#define CAFE_GLOBAL_IRQ_PCI_ERROR BIT(31) +#define CAFE_GLOBAL_IRQ_VPD_TWSI BIT(26) +#define CAFE_GLOBAL_IRQ_CCIC BIT(2) +#define CAFE_GLOBAL_IRQ_SDH BIT(1) +#define CAFE_GLOBAL_IRQ_NAND BIT(0) + +#define CAFE_GLOBAL_RESET 0x3034 +#define CAFE_GLOBAL_RESET_CCIC BIT(2) +#define CAFE_GLOBAL_RESET_SDH BIT(1) +#define CAFE_GLOBAL_RESET_NAND BIT(0) + +#define CAFE_FIELD_PREP(reg, field, val) FIELD_PREP(CAFE_##reg##_##field, val) +#define CAFE_FIELD_GET(reg, field, val) FIELD_GET(CAFE_##reg##_##field, val) struct cafe_priv { struct nand_chip nand; @@ -104,7 +195,8 @@ static const char *part_probes[] = { "cmdlinepart", "RedBoot", NULL }; static int cafe_device_ready(struct nand_chip *chip) { struct cafe_priv *cafe = nand_get_controller_data(chip); - int result = !!(cafe_readl(cafe, NAND_STATUS) & 0x40000000); + int result = !!(cafe_readl(cafe, NAND_STATUS) & + CAFE_NAND_STATUS_FLASH_BUSY); uint32_t irqs = cafe_readl(cafe, NAND_IRQ); cafe_writel(cafe, irqs, NAND_IRQ); @@ -164,16 +256,20 @@ static void cafe_nand_cmdfunc(struct nand_chip *chip, unsigned command, struct cafe_priv *cafe = nand_get_controller_data(chip); int adrbytes = 0; uint32_t ctl1; - uint32_t doneint = 0x80000000; + uint32_t doneint = CAFE_NAND_IRQ_CMD_DONE; cafe_dev_dbg(&cafe->pdev->dev, "cmdfunc %02x, 0x%x, 0x%x\n", command, column, page_addr); if (command == NAND_CMD_ERASE2 || command == NAND_CMD_PAGEPROG) { /* Second half of a command we already calculated */ - cafe_writel(cafe, cafe->ctl2 | 0x100 | command, NAND_CTRL2); + cafe_writel(cafe, + cafe->ctl2 | + CAFE_NAND_CTRL2_CMD2 | + CAFE_FIELD_PREP(NAND_CTRL2, CMD2, command), + NAND_CTRL2); ctl1 = cafe->ctl1; - cafe->ctl2 &= ~(1<<30); + cafe->ctl2 &= ~CAFE_NAND_CTRL2_AUTO_WRITE_ECC; cafe_dev_dbg(&cafe->pdev->dev, "Continue command, ctl1 %08x, #data %d\n", cafe->ctl1, cafe->nr_data); goto do_command; @@ -209,26 +305,29 @@ static void cafe_nand_cmdfunc(struct nand_chip *chip, unsigned command, cafe->data_pos = cafe->datalen = 0; /* Set command valid bit, mask in the chip select bit */ - ctl1 = 0x80000000 | command | (cafe->ctl1 & CTRL1_CHIPSELECT); + ctl1 = CAFE_NAND_CTRL1_HAS_CMD | + CAFE_FIELD_PREP(NAND_CTRL1, CMD, command) | + (cafe->ctl1 & CAFE_NAND_CTRL1_CE); /* Set RD or WR bits as appropriate */ if (command == NAND_CMD_READID || command == NAND_CMD_STATUS) { - ctl1 |= (1<<26); /* rd */ + ctl1 |= CAFE_NAND_CTRL1_HAS_DATA_IN; /* Always 5 bytes, for now */ cafe->datalen = 4; /* And one address cycle -- even for STATUS, since the controller doesn't work without */ adrbytes = 1; } else if (command == NAND_CMD_READ0 || command == NAND_CMD_READ1 || command == NAND_CMD_READOOB || command == NAND_CMD_RNDOUT) { - ctl1 |= 1<<26; /* rd */ + ctl1 |= CAFE_NAND_CTRL1_HAS_DATA_IN; /* For now, assume just read to end of page */ cafe->datalen = mtd->writesize + mtd->oobsize - column; } else if (command == NAND_CMD_SEQIN) - ctl1 |= 1<<25; /* wr */ + ctl1 |= CAFE_NAND_CTRL1_HAS_DATA_OUT; /* Set number of address bytes */ if (adrbytes) - ctl1 |= ((adrbytes-1)|8) << 27; + ctl1 |= CAFE_NAND_CTRL1_HAS_ADDR | + CAFE_FIELD_PREP(NAND_CTRL1, NUM_ADDR_CYC, adrbytes - 1); if (command == NAND_CMD_SEQIN || command == NAND_CMD_ERASE1) { /* Ignore the first command of a pair; the hardware @@ -240,9 +339,15 @@ static void cafe_nand_cmdfunc(struct nand_chip *chip, unsigned command, } /* RNDOUT and READ0 commands need a following byte */ if (command == NAND_CMD_RNDOUT) - cafe_writel(cafe, cafe->ctl2 | 0x100 | NAND_CMD_RNDOUTSTART, NAND_CTRL2); + cafe_writel(cafe, + cafe->ctl2 | CAFE_NAND_CTRL2_CMD2 | + CAFE_FIELD_PREP(NAND_CTRL2, CMD2, NAND_CMD_RNDOUTSTART), + NAND_CTRL2); else if (command == NAND_CMD_READ0 && mtd->writesize > 512) - cafe_writel(cafe, cafe->ctl2 | 0x100 | NAND_CMD_READSTART, NAND_CTRL2); + cafe_writel(cafe, + cafe->ctl2 | CAFE_NAND_CTRL2_CMD2 | + CAFE_FIELD_PREP(NAND_CTRL2, CMD2, NAND_CMD_READSTART), + NAND_CTRL2); do_command: cafe_dev_dbg(&cafe->pdev->dev, "dlen %x, ctl1 %x, ctl2 %x\n", @@ -250,16 +355,23 @@ static void cafe_nand_cmdfunc(struct nand_chip *chip, unsigned command, /* NB: The datasheet lies -- we really should be subtracting 1 here */ cafe_writel(cafe, cafe->datalen, NAND_DATA_LEN); - cafe_writel(cafe, 0x90000000, NAND_IRQ); - if (cafe->usedma && (ctl1 & (3<<25))) { - uint32_t dmactl = 0xc0000000 + cafe->datalen; + cafe_writel(cafe, CAFE_NAND_IRQ_CMD_DONE | CAFE_NAND_IRQ_DMA_DONE, + NAND_IRQ); + if (cafe->usedma && + (ctl1 & (CAFE_NAND_CTRL1_HAS_DATA_IN | + CAFE_NAND_CTRL1_HAS_DATA_OUT))) { + uint32_t dmactl = CAFE_NAND_DMA_CTRL_ENABLE | + CAFE_NAND_DMA_CTRL_RESERVED; + + dmactl |= CAFE_FIELD_PREP(NAND_DMA_CTRL, DATA_LEN, + cafe->datalen); /* If WR or RD bits set, set up DMA */ - if (ctl1 & (1<<26)) { + if (ctl1 & CAFE_NAND_CTRL1_HAS_DATA_IN) { /* It's a read */ - dmactl |= (1<<29); + dmactl |= CAFE_NAND_DMA_CTRL_DATA_IN; /* ... so it's done when the DMA is done, not just the command. */ - doneint = 0x10000000; + doneint = CAFE_NAND_IRQ_DMA_DONE; } cafe_writel(cafe, dmactl, NAND_DMA_CTRL); } @@ -295,7 +407,7 @@ static void cafe_nand_cmdfunc(struct nand_chip *chip, unsigned command, command, 500000-c, irqs, cafe_readl(cafe, NAND_IRQ)); } - WARN_ON(cafe->ctl2 & (1<<30)); + WARN_ON(cafe->ctl2 & CAFE_NAND_CTRL2_AUTO_WRITE_ECC); switch (command) { @@ -318,14 +430,14 @@ static void cafe_select_chip(struct nand_chip *chip, int chipnr) { struct cafe_priv *cafe = nand_get_controller_data(chip); + if (chipnr < 0 || chipnr > 1) + return; + cafe_dev_dbg(&cafe->pdev->dev, "select_chip %d\n", chipnr); /* Mask the appropriate bit into the stored value of ctl1 which will be used by cafe_nand_cmdfunc() */ - if (chipnr) - cafe->ctl1 |= CTRL1_CHIPSELECT; - else - cafe->ctl1 &= ~CTRL1_CHIPSELECT; + cafe->ctl1 |= CAFE_FIELD_PREP(NAND_CTRL1, CE, chipnr); } static irqreturn_t cafe_nand_interrupt(int irq, void *id) @@ -334,7 +446,9 @@ static irqreturn_t cafe_nand_interrupt(int irq, void *id) struct nand_chip *chip = mtd_to_nand(mtd); struct cafe_priv *cafe = nand_get_controller_data(chip); uint32_t irqs = cafe_readl(cafe, NAND_IRQ); - cafe_writel(cafe, irqs & ~0x90000000, NAND_IRQ); + cafe_writel(cafe, + irqs & ~(CAFE_NAND_IRQ_CMD_DONE | CAFE_NAND_IRQ_DMA_DONE), + NAND_IRQ); if (!irqs) return IRQ_NONE; @@ -368,25 +482,31 @@ static int cafe_nand_read_page(struct nand_chip *chip, uint8_t *buf, struct mtd_info *mtd = nand_to_mtd(chip); struct cafe_priv *cafe = nand_get_controller_data(chip); unsigned int max_bitflips = 0; + u32 ecc_result, status; cafe_dev_dbg(&cafe->pdev->dev, "ECC result %08x SYN1,2 %08x\n", cafe_readl(cafe, NAND_ECC_RESULT), - cafe_readl(cafe, NAND_ECC_SYN01)); + cafe_readl(cafe, NAND_ECC_SYN_REG(0))); nand_read_page_op(chip, page, 0, buf, mtd->writesize); chip->legacy.read_buf(chip, chip->oob_poi, mtd->oobsize); - if (checkecc && cafe_readl(cafe, NAND_ECC_RESULT) & (1<<18)) { + ecc_result = cafe_readl(cafe, NAND_ECC_RESULT); + status = CAFE_FIELD_GET(NAND_ECC_RESULT, STATUS, ecc_result); + if (checkecc && status == CAFE_NAND_ECC_RESULT_CORRECTABLE_ERRS) { unsigned short syn[8], pat[4]; int pos[4]; u8 *oob = chip->oob_poi; int i, n; for (i=0; i<8; i+=2) { - uint32_t tmp = cafe_readl(cafe, NAND_ECC_SYN01 + (i*2)); + uint32_t tmp = cafe_readl(cafe, NAND_ECC_SYN_REG(i)); + uint16_t idx; - syn[i] = cafe->rs->codec->index_of[tmp & 0xfff]; - syn[i+1] = cafe->rs->codec->index_of[(tmp >> 16) & 0xfff]; + idx = FIELD_GET(CAFE_NAND_ECC_SYN_FIELD(i), tmp); + syn[i] = cafe->rs->codec->index_of[idx]; + idx = FIELD_GET(CAFE_NAND_ECC_SYN_FIELD(i + 1), tmp); + syn[i+1] = cafe->rs->codec->index_of[idx]; } n = decode_rs16(cafe->rs, NULL, NULL, 1367, syn, 0, pos, 0, @@ -536,7 +656,7 @@ static int cafe_nand_write_page(struct nand_chip *chip, chip->legacy.write_buf(chip, chip->oob_poi, mtd->oobsize); /* Set up ECC autogeneration */ - cafe->ctl2 |= (1<<30); + cafe->ctl2 |= CAFE_NAND_CTRL2_AUTO_WRITE_ECC; return nand_prog_page_end_op(chip); } @@ -604,9 +724,9 @@ static int cafe_nand_attach_chip(struct nand_chip *chip) /* Restore the DMA flag */ cafe->usedma = usedma; - cafe->ctl2 = BIT(27); /* Reed-Solomon ECC */ - if (mtd->writesize == 2048) - cafe->ctl2 |= BIT(29); /* 2KiB page size */ + cafe->ctl2 = CAFE_NAND_CTRL2_ECC_ALG_RS | + CAFE_FIELD_PREP(NAND_CTRL2, PAGE_SIZE, + mtd->writesize / 512); /* Set up ECC according to the type of chip we found */ mtd_set_ooblayout(mtd, &cafe_ooblayout_ops); @@ -734,8 +854,8 @@ static int cafe_nand_probe(struct pci_dev *pdev, } /* Start off by resetting the NAND controller completely */ - cafe_writel(cafe, 1, NAND_RESET); - cafe_writel(cafe, 0, NAND_RESET); + cafe_writel(cafe, CAFE_GLOBAL_RESET_NAND, GLOBAL_RESET); + cafe_writel(cafe, 0, GLOBAL_RESET); cafe_writel(cafe, timing[0], NAND_TIMING1); cafe_writel(cafe, timing[1], NAND_TIMING2); @@ -751,17 +871,49 @@ static int cafe_nand_probe(struct pci_dev *pdev, /* Disable master reset, enable NAND clock */ ctrl = cafe_readl(cafe, GLOBAL_CTRL); - ctrl &= 0xffffeff0; - ctrl |= 0x00007000; - cafe_writel(cafe, ctrl | 0x05, GLOBAL_CTRL); - cafe_writel(cafe, ctrl | 0x0a, GLOBAL_CTRL); + ctrl &= ~(CAFE_GLOBAL_SW_RESET_SET | + CAFE_GLOBAL_SW_RESET_CLEAR | + CAFE_GLOBAL_MASTER_RESET_SET | + CAFE_GLOBAL_MASTER_RESET_CLEAR | + CAFE_GLOBAL_NAND_CLK_ENABLE); + ctrl |= CAFE_GLOBAL_NAND_CLK_ENABLE | + CAFE_GLOBAL_SDH_CLK_ENABLE | + CAFE_GLOBAL_CCIC_CLK_ENABLE; + cafe_writel(cafe, + ctrl | + CAFE_GLOBAL_MASTER_RESET_SET | + CAFE_GLOBAL_SW_RESET_SET, + GLOBAL_CTRL); + cafe_writel(cafe, + ctrl | + CAFE_GLOBAL_MASTER_RESET_CLEAR | + CAFE_GLOBAL_SW_RESET_CLEAR, + GLOBAL_CTRL); + cafe_writel(cafe, 0, NAND_DMA_CTRL); - cafe_writel(cafe, 0x7006, GLOBAL_CTRL); - cafe_writel(cafe, 0x700a, GLOBAL_CTRL); + cafe_writel(cafe, + CAFE_GLOBAL_NAND_CLK_ENABLE | + CAFE_GLOBAL_SDH_CLK_ENABLE | + CAFE_GLOBAL_CCIC_CLK_ENABLE | + CAFE_GLOBAL_MASTER_RESET_SET | + CAFE_GLOBAL_SW_RESET_CLEAR, + GLOBAL_CTRL); + cafe_writel(cafe, + CAFE_GLOBAL_NAND_CLK_ENABLE | + CAFE_GLOBAL_SDH_CLK_ENABLE | + CAFE_GLOBAL_CCIC_CLK_ENABLE | + CAFE_GLOBAL_MASTER_RESET_CLEAR | + CAFE_GLOBAL_SW_RESET_CLEAR, + GLOBAL_CTRL); /* Enable NAND IRQ in global IRQ mask register */ - cafe_writel(cafe, 0x80000007, GLOBAL_IRQ_MASK); + cafe_writel(cafe, + CAFE_GLOBAL_IRQ_PCI_ERROR | + CAFE_GLOBAL_IRQ_CCIC | + CAFE_GLOBAL_IRQ_SDH | + CAFE_GLOBAL_IRQ_NAND, + GLOBAL_IRQ_MASK); cafe_dev_dbg(&cafe->pdev->dev, "Control %x, IRQ mask %x\n", cafe_readl(cafe, GLOBAL_CTRL), cafe_readl(cafe, GLOBAL_IRQ_MASK)); @@ -788,7 +940,9 @@ static int cafe_nand_probe(struct pci_dev *pdev, nand_cleanup(&cafe->nand); out_irq: /* Disable NAND IRQ in global IRQ mask register */ - cafe_writel(cafe, ~1 & cafe_readl(cafe, GLOBAL_IRQ_MASK), GLOBAL_IRQ_MASK); + cafe_writel(cafe, + cafe_readl(cafe, GLOBAL_IRQ_MASK) & ~CAFE_GLOBAL_IRQ_NAND, + GLOBAL_IRQ_MASK); free_irq(pdev->irq, mtd); out_ior: pci_iounmap(pdev, cafe->mmio); @@ -805,7 +959,9 @@ static void cafe_nand_remove(struct pci_dev *pdev) struct cafe_priv *cafe = nand_get_controller_data(chip); /* Disable NAND IRQ in global IRQ mask register */ - cafe_writel(cafe, ~1 & cafe_readl(cafe, GLOBAL_IRQ_MASK), GLOBAL_IRQ_MASK); + cafe_writel(cafe, + cafe_readl(cafe, GLOBAL_IRQ_MASK) & ~CAFE_GLOBAL_IRQ_NAND, + GLOBAL_IRQ_MASK); free_irq(pdev->irq, mtd); nand_release(chip); free_rs(cafe->rs); @@ -830,8 +986,8 @@ static int cafe_nand_resume(struct pci_dev *pdev) struct cafe_priv *cafe = nand_get_controller_data(chip); /* Start off by resetting the NAND controller completely */ - cafe_writel(cafe, 1, NAND_RESET); - cafe_writel(cafe, 0, NAND_RESET); + cafe_writel(cafe, CAFE_GLOBAL_RESET_NAND, GLOBAL_RESET); + cafe_writel(cafe, 0, GLOBAL_RESET); cafe_writel(cafe, 0xffffffff, NAND_IRQ_MASK); /* Restore timing configuration */ @@ -841,13 +997,41 @@ static int cafe_nand_resume(struct pci_dev *pdev) /* Disable master reset, enable NAND clock */ ctrl = cafe_readl(cafe, GLOBAL_CTRL); - ctrl &= 0xffffeff0; - ctrl |= 0x00007000; - cafe_writel(cafe, ctrl | 0x05, GLOBAL_CTRL); - cafe_writel(cafe, ctrl | 0x0a, GLOBAL_CTRL); + ctrl &= ~(CAFE_GLOBAL_SW_RESET_SET | + CAFE_GLOBAL_SW_RESET_CLEAR | + CAFE_GLOBAL_MASTER_RESET_SET | + CAFE_GLOBAL_MASTER_RESET_CLEAR | + CAFE_GLOBAL_NAND_CLK_ENABLE); + ctrl |= CAFE_GLOBAL_NAND_CLK_ENABLE | + CAFE_GLOBAL_SDH_CLK_ENABLE | + CAFE_GLOBAL_CCIC_CLK_ENABLE; + cafe_writel(cafe, + ctrl | + CAFE_GLOBAL_MASTER_RESET_SET | + CAFE_GLOBAL_SW_RESET_SET, + GLOBAL_CTRL); + cafe_writel(cafe, + ctrl | + CAFE_GLOBAL_MASTER_RESET_CLEAR | + CAFE_GLOBAL_SW_RESET_CLEAR, + GLOBAL_CTRL); + cafe_writel(cafe, 0, NAND_DMA_CTRL); - cafe_writel(cafe, 0x7006, GLOBAL_CTRL); - cafe_writel(cafe, 0x700a, GLOBAL_CTRL); + + cafe_writel(cafe, + CAFE_GLOBAL_NAND_CLK_ENABLE | + CAFE_GLOBAL_SDH_CLK_ENABLE | + CAFE_GLOBAL_CCIC_CLK_ENABLE | + CAFE_GLOBAL_MASTER_RESET_SET | + CAFE_GLOBAL_SW_RESET_CLEAR, + GLOBAL_CTRL); + cafe_writel(cafe, + CAFE_GLOBAL_NAND_CLK_ENABLE | + CAFE_GLOBAL_SDH_CLK_ENABLE | + CAFE_GLOBAL_CCIC_CLK_ENABLE | + CAFE_GLOBAL_MASTER_RESET_CLEAR | + CAFE_GLOBAL_SW_RESET_CLEAR, + GLOBAL_CTRL); /* Set up DMA address */ cafe_writel(cafe, cafe->dmaaddr & 0xffffffff, NAND_DMA_ADDR0); @@ -858,7 +1042,12 @@ static int cafe_nand_resume(struct pci_dev *pdev) cafe_writel(cafe, 0, NAND_DMA_ADDR1); /* Enable NAND IRQ in global IRQ mask register */ - cafe_writel(cafe, 0x80000007, GLOBAL_IRQ_MASK); + cafe_writel(cafe, + CAFE_GLOBAL_IRQ_PCI_ERROR | + CAFE_GLOBAL_IRQ_CCIC | + CAFE_GLOBAL_IRQ_SDH | + CAFE_GLOBAL_IRQ_NAND, + GLOBAL_IRQ_MASK); return 0; } From patchwork Mon Apr 27 08:20:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris Brezillon X-Patchwork-Id: 1277418 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=S9BgCN2c; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 499dCq3d1Pz9sSq for ; Mon, 27 Apr 2020 18:26:31 +1000 (AEST) 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=7QJBE4EE+mtf5LmmHNojx+9XJpsAS2vTAw68y+UPBGA=; b=S9BgCN2cKm0Ab3 mVTjcDSWoor5a+F4fqoGlLd9t/gE6T+Xy03GPPdawnYki5rImKJt8YWBkY2yG2AWkm1ZNbnbdW9e5 ANX767ulFdaWNEpYm6lzVlG1XmwdlB/K8C9fO5rx5aACCkWya0bJNA420SvDfl29/jV/xMP0ZluM9 NfQNnbWdmX898mQmBUAGdTDCNOWiOLWmr+qfzilXhUaq5/aHz8z/9zC/Xl2sZOPU71AnYa7/1kEW6 OqQVI0A707xOCzYzM0XPJD6hpl3JydRoCqYmszrMRnQa2sW1p+k0P2ynSzuhDWBILPO9UOgxmadFb Tyxx8ryDxgM0xiAOBpyA==; 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 1jSz5w-00054f-UO; Mon, 27 Apr 2020 08:26:28 +0000 Received: from bhuna.collabora.co.uk ([2a00:1098:0:82:1000:25:2eeb:e3e3]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jSz0K-000681-0Y for linux-mtd@lists.infradead.org; Mon, 27 Apr 2020 08:20:43 +0000 Received: from localhost.localdomain (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id 222792A09B1; Mon, 27 Apr 2020 09:20:37 +0100 (BST) From: Boris Brezillon To: David Woodhouse , Miquel Raynal , linux-mtd@lists.infradead.org Subject: [PATCH 06/17] mtd: rawnand: cafe: Factor out the controller initialization logic Date: Mon, 27 Apr 2020 10:20:16 +0200 Message-Id: <20200427082028.394719-7-boris.brezillon@collabora.com> X-Mailer: git-send-email 2.25.3 In-Reply-To: <20200427082028.394719-1-boris.brezillon@collabora.com> References: <20200427082028.394719-1-boris.brezillon@collabora.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200427_012040_332615_68A2E416 X-CRM114-Status: GOOD ( 16.27 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Weinberger , Boris Brezillon , Vignesh Raghavendra , Tudor Ambarus Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org The same code is present in the probe and resume path. Let's create an init helper to factor that out. Signed-off-by: Boris Brezillon --- drivers/mtd/nand/raw/cafe_nand.c | 189 +++++++++++-------------------- 1 file changed, 67 insertions(+), 122 deletions(-) diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c index fbc18bc3d46b..863dd4a8dd42 100644 --- a/drivers/mtd/nand/raw/cafe_nand.c +++ b/drivers/mtd/nand/raw/cafe_nand.c @@ -774,12 +774,76 @@ static const struct nand_controller_ops cafe_nand_controller_ops = { .detach_chip = cafe_nand_detach_chip, }; +static void cafe_nand_init(struct cafe_priv *cafe) +{ + u32 ctrl; + + /* Start off by resetting the NAND controller completely */ + cafe_writel(cafe, CAFE_GLOBAL_RESET_NAND, GLOBAL_RESET); + cafe_writel(cafe, 0, GLOBAL_RESET); + cafe_writel(cafe, 0xffffffff, NAND_IRQ_MASK); + + /* Restore timing configuration */ + cafe_writel(cafe, timing[0], NAND_TIMING1); + cafe_writel(cafe, timing[1], NAND_TIMING2); + cafe_writel(cafe, timing[2], NAND_TIMING3); + + /* Disable master reset, enable NAND clock */ + ctrl = cafe_readl(cafe, GLOBAL_CTRL); + ctrl &= ~(CAFE_GLOBAL_SW_RESET_SET | + CAFE_GLOBAL_SW_RESET_CLEAR | + CAFE_GLOBAL_MASTER_RESET_SET | + CAFE_GLOBAL_MASTER_RESET_CLEAR | + CAFE_GLOBAL_NAND_CLK_ENABLE); + ctrl |= CAFE_GLOBAL_NAND_CLK_ENABLE | + CAFE_GLOBAL_SDH_CLK_ENABLE | + CAFE_GLOBAL_CCIC_CLK_ENABLE; + cafe_writel(cafe, + ctrl | + CAFE_GLOBAL_MASTER_RESET_SET | + CAFE_GLOBAL_SW_RESET_SET, + GLOBAL_CTRL); + cafe_writel(cafe, + ctrl | + CAFE_GLOBAL_MASTER_RESET_CLEAR | + CAFE_GLOBAL_SW_RESET_CLEAR, + GLOBAL_CTRL); + + cafe_writel(cafe, 0, NAND_DMA_CTRL); + + cafe_writel(cafe, + CAFE_GLOBAL_NAND_CLK_ENABLE | + CAFE_GLOBAL_SDH_CLK_ENABLE | + CAFE_GLOBAL_CCIC_CLK_ENABLE | + CAFE_GLOBAL_MASTER_RESET_SET | + CAFE_GLOBAL_SW_RESET_CLEAR, + GLOBAL_CTRL); + cafe_writel(cafe, + CAFE_GLOBAL_NAND_CLK_ENABLE | + CAFE_GLOBAL_SDH_CLK_ENABLE | + CAFE_GLOBAL_CCIC_CLK_ENABLE | + CAFE_GLOBAL_MASTER_RESET_CLEAR | + CAFE_GLOBAL_SW_RESET_CLEAR, + GLOBAL_CTRL); + + /* Set up DMA address */ + cafe_writel(cafe, lower_32_bits(cafe->dmaaddr), NAND_DMA_ADDR0); + cafe_writel(cafe, upper_32_bits(cafe->dmaaddr), NAND_DMA_ADDR1); + + /* Enable NAND IRQ in global IRQ mask register */ + cafe_writel(cafe, + CAFE_GLOBAL_IRQ_PCI_ERROR | + CAFE_GLOBAL_IRQ_CCIC | + CAFE_GLOBAL_IRQ_SDH | + CAFE_GLOBAL_IRQ_NAND, + GLOBAL_IRQ_MASK); +} + static int cafe_nand_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { struct mtd_info *mtd; struct cafe_priv *cafe; - uint32_t ctrl; int err = 0; /* Very old versions shared the same PCI ident for all three @@ -853,15 +917,8 @@ static int cafe_nand_probe(struct pci_dev *pdev, } } - /* Start off by resetting the NAND controller completely */ - cafe_writel(cafe, CAFE_GLOBAL_RESET_NAND, GLOBAL_RESET); - cafe_writel(cafe, 0, GLOBAL_RESET); + cafe_nand_init(cafe); - cafe_writel(cafe, timing[0], NAND_TIMING1); - cafe_writel(cafe, timing[1], NAND_TIMING2); - cafe_writel(cafe, timing[2], NAND_TIMING3); - - cafe_writel(cafe, 0xffffffff, NAND_IRQ_MASK); err = request_irq(pdev->irq, &cafe_nand_interrupt, IRQF_SHARED, "CAFE NAND", mtd); if (err) { @@ -869,55 +926,6 @@ static int cafe_nand_probe(struct pci_dev *pdev, goto out_ior; } - /* Disable master reset, enable NAND clock */ - ctrl = cafe_readl(cafe, GLOBAL_CTRL); - ctrl &= ~(CAFE_GLOBAL_SW_RESET_SET | - CAFE_GLOBAL_SW_RESET_CLEAR | - CAFE_GLOBAL_MASTER_RESET_SET | - CAFE_GLOBAL_MASTER_RESET_CLEAR | - CAFE_GLOBAL_NAND_CLK_ENABLE); - ctrl |= CAFE_GLOBAL_NAND_CLK_ENABLE | - CAFE_GLOBAL_SDH_CLK_ENABLE | - CAFE_GLOBAL_CCIC_CLK_ENABLE; - cafe_writel(cafe, - ctrl | - CAFE_GLOBAL_MASTER_RESET_SET | - CAFE_GLOBAL_SW_RESET_SET, - GLOBAL_CTRL); - cafe_writel(cafe, - ctrl | - CAFE_GLOBAL_MASTER_RESET_CLEAR | - CAFE_GLOBAL_SW_RESET_CLEAR, - GLOBAL_CTRL); - - cafe_writel(cafe, 0, NAND_DMA_CTRL); - - cafe_writel(cafe, - CAFE_GLOBAL_NAND_CLK_ENABLE | - CAFE_GLOBAL_SDH_CLK_ENABLE | - CAFE_GLOBAL_CCIC_CLK_ENABLE | - CAFE_GLOBAL_MASTER_RESET_SET | - CAFE_GLOBAL_SW_RESET_CLEAR, - GLOBAL_CTRL); - cafe_writel(cafe, - CAFE_GLOBAL_NAND_CLK_ENABLE | - CAFE_GLOBAL_SDH_CLK_ENABLE | - CAFE_GLOBAL_CCIC_CLK_ENABLE | - CAFE_GLOBAL_MASTER_RESET_CLEAR | - CAFE_GLOBAL_SW_RESET_CLEAR, - GLOBAL_CTRL); - - /* Enable NAND IRQ in global IRQ mask register */ - cafe_writel(cafe, - CAFE_GLOBAL_IRQ_PCI_ERROR | - CAFE_GLOBAL_IRQ_CCIC | - CAFE_GLOBAL_IRQ_SDH | - CAFE_GLOBAL_IRQ_NAND, - GLOBAL_IRQ_MASK); - cafe_dev_dbg(&cafe->pdev->dev, "Control %x, IRQ mask %x\n", - cafe_readl(cafe, GLOBAL_CTRL), - cafe_readl(cafe, GLOBAL_IRQ_MASK)); - /* Do not use the DMA during the NAND identification */ cafe->usedma = 0; @@ -980,74 +988,11 @@ MODULE_DEVICE_TABLE(pci, cafe_nand_tbl); static int cafe_nand_resume(struct pci_dev *pdev) { - uint32_t ctrl; struct mtd_info *mtd = pci_get_drvdata(pdev); struct nand_chip *chip = mtd_to_nand(mtd); struct cafe_priv *cafe = nand_get_controller_data(chip); - /* Start off by resetting the NAND controller completely */ - cafe_writel(cafe, CAFE_GLOBAL_RESET_NAND, GLOBAL_RESET); - cafe_writel(cafe, 0, GLOBAL_RESET); - cafe_writel(cafe, 0xffffffff, NAND_IRQ_MASK); - - /* Restore timing configuration */ - cafe_writel(cafe, timing[0], NAND_TIMING1); - cafe_writel(cafe, timing[1], NAND_TIMING2); - cafe_writel(cafe, timing[2], NAND_TIMING3); - - /* Disable master reset, enable NAND clock */ - ctrl = cafe_readl(cafe, GLOBAL_CTRL); - ctrl &= ~(CAFE_GLOBAL_SW_RESET_SET | - CAFE_GLOBAL_SW_RESET_CLEAR | - CAFE_GLOBAL_MASTER_RESET_SET | - CAFE_GLOBAL_MASTER_RESET_CLEAR | - CAFE_GLOBAL_NAND_CLK_ENABLE); - ctrl |= CAFE_GLOBAL_NAND_CLK_ENABLE | - CAFE_GLOBAL_SDH_CLK_ENABLE | - CAFE_GLOBAL_CCIC_CLK_ENABLE; - cafe_writel(cafe, - ctrl | - CAFE_GLOBAL_MASTER_RESET_SET | - CAFE_GLOBAL_SW_RESET_SET, - GLOBAL_CTRL); - cafe_writel(cafe, - ctrl | - CAFE_GLOBAL_MASTER_RESET_CLEAR | - CAFE_GLOBAL_SW_RESET_CLEAR, - GLOBAL_CTRL); - - cafe_writel(cafe, 0, NAND_DMA_CTRL); - - cafe_writel(cafe, - CAFE_GLOBAL_NAND_CLK_ENABLE | - CAFE_GLOBAL_SDH_CLK_ENABLE | - CAFE_GLOBAL_CCIC_CLK_ENABLE | - CAFE_GLOBAL_MASTER_RESET_SET | - CAFE_GLOBAL_SW_RESET_CLEAR, - GLOBAL_CTRL); - cafe_writel(cafe, - CAFE_GLOBAL_NAND_CLK_ENABLE | - CAFE_GLOBAL_SDH_CLK_ENABLE | - CAFE_GLOBAL_CCIC_CLK_ENABLE | - CAFE_GLOBAL_MASTER_RESET_CLEAR | - CAFE_GLOBAL_SW_RESET_CLEAR, - GLOBAL_CTRL); - - /* Set up DMA address */ - cafe_writel(cafe, cafe->dmaaddr & 0xffffffff, NAND_DMA_ADDR0); - if (sizeof(cafe->dmaaddr) > 4) - /* Shift in two parts to shut the compiler up */ - cafe_writel(cafe, (cafe->dmaaddr >> 16) >> 16, NAND_DMA_ADDR1); - else - cafe_writel(cafe, 0, NAND_DMA_ADDR1); - - /* Enable NAND IRQ in global IRQ mask register */ - cafe_writel(cafe, - CAFE_GLOBAL_IRQ_PCI_ERROR | - CAFE_GLOBAL_IRQ_CCIC | - CAFE_GLOBAL_IRQ_SDH | - CAFE_GLOBAL_IRQ_NAND, - GLOBAL_IRQ_MASK); + cafe_nand_init(cafe); return 0; } From patchwork Mon Apr 27 08:20:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris Brezillon X-Patchwork-Id: 1277410 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=UTnvsItc; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 499d9y2rwNz9sRf for ; Mon, 27 Apr 2020 18:24:54 +1000 (AEST) 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=UvppYe4jM+nSp1/PCrxPToRHji3++Jf3Dx8skhVh+V4=; b=UTnvsItcTGiI50 Kla4scCPgYc0iwaaMibq4Sybt4Xyy0hmVOQyAE9skkNuVl+Vt09I+SU+yCEMlNJ1jE1dTwTJJp4U+ 4pVZ1ERFZGXSohUR2B7n4JAU1Gr9ctgaarRkPOjMScArjYoZCKeoGgJT/VeyoZYLlfM2DS0MVKbQq 2Zm8mbUZeWy6fUodLY29T6psnvs7kW1Rb8gAh9pX+R+GJKVGUV/HrItHyFwDBJsleaC60FZ0npxfr GTb/becETZBL/gvtv7MhyVSC7OkpbD/oOkJ4SaDCM91Sl7v35QqTjINkzxy7xLz5KQ5HpcT/2nvu0 n5obQCIL2tLx2pCITyRg==; 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 1jSz4M-0001SL-4O; Mon, 27 Apr 2020 08:24:50 +0000 Received: from bhuna.collabora.co.uk ([2a00:1098:0:82:1000:25:2eeb:e3e3]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jSz0J-00068G-RO for linux-mtd@lists.infradead.org; Mon, 27 Apr 2020 08:20:44 +0000 Received: from localhost.localdomain (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id D40E52A09D3; Mon, 27 Apr 2020 09:20:37 +0100 (BST) From: Boris Brezillon To: David Woodhouse , Miquel Raynal , linux-mtd@lists.infradead.org Subject: [PATCH 07/17] mtd: rawnand: cafe: Get rid of the debug module param Date: Mon, 27 Apr 2020 10:20:17 +0200 Message-Id: <20200427082028.394719-8-boris.brezillon@collabora.com> X-Mailer: git-send-email 2.25.3 In-Reply-To: <20200427082028.394719-1-boris.brezillon@collabora.com> References: <20200427082028.394719-1-boris.brezillon@collabora.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200427_012040_172084_F6EDDF03 X-CRM114-Status: GOOD ( 15.01 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Weinberger , Boris Brezillon , Vignesh Raghavendra , Tudor Ambarus Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Dynamic prink already offers conditional debug traces enablement, let's not define a new way to do the same thing. Signed-off-by: Boris Brezillon Reviewed-by: Miquel Raynal --- drivers/mtd/nand/raw/cafe_nand.c | 59 ++++++++++++++------------------ 1 file changed, 25 insertions(+), 34 deletions(-) diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c index 863dd4a8dd42..55fa0bf2806a 100644 --- a/drivers/mtd/nand/raw/cafe_nand.c +++ b/drivers/mtd/nand/raw/cafe_nand.c @@ -10,10 +10,7 @@ */ #include -#define DEBUG - #include -#undef DEBUG #include #include #include @@ -170,9 +167,6 @@ module_param(usedma, int, 0644); static int skipbbt = 0; module_param(skipbbt, int, 0644); -static int debug = 0; -module_param(debug, int, 0644); - static int regdebug = 0; module_param(regdebug, int, 0644); @@ -185,9 +179,6 @@ module_param_array(timing, int, &numtimings, 0644); static const char *part_probes[] = { "cmdlinepart", "RedBoot", NULL }; -/* Hrm. Why isn't this already conditional on something in the struct device? */ -#define cafe_dev_dbg(dev, args...) do { if (debug) dev_dbg(dev, ##args); } while(0) - /* Make it easier to switch to PIO if we need to */ #define cafe_readl(cafe, addr) readl((cafe)->mmio + CAFE_##addr) #define cafe_writel(cafe, datum, addr) writel(datum, (cafe)->mmio + CAFE_##addr) @@ -201,7 +192,7 @@ static int cafe_device_ready(struct nand_chip *chip) cafe_writel(cafe, irqs, NAND_IRQ); - cafe_dev_dbg(&cafe->pdev->dev, "NAND device is%s ready, IRQ %x (%x) (%x,%x)\n", + dev_dbg(&cafe->pdev->dev, "NAND device is%s ready, IRQ %x (%x) (%x,%x)\n", result?"":" not", irqs, cafe_readl(cafe, NAND_IRQ), cafe_readl(cafe, GLOBAL_IRQ), cafe_readl(cafe, GLOBAL_IRQ_MASK)); @@ -220,7 +211,7 @@ static void cafe_write_buf(struct nand_chip *chip, const uint8_t *buf, int len) cafe->datalen += len; - cafe_dev_dbg(&cafe->pdev->dev, "Copy 0x%x bytes to write buffer. datalen 0x%x\n", + dev_dbg(&cafe->pdev->dev, "Copy 0x%x bytes to write buffer. datalen 0x%x\n", len, cafe->datalen); } @@ -233,8 +224,8 @@ static void cafe_read_buf(struct nand_chip *chip, uint8_t *buf, int len) else memcpy_fromio(buf, cafe->mmio + CAFE_NAND_READ_DATA + cafe->datalen, len); - cafe_dev_dbg(&cafe->pdev->dev, "Copy 0x%x bytes from position 0x%x in read buffer.\n", - len, cafe->datalen); + dev_dbg(&cafe->pdev->dev, "Copy 0x%x bytes from position 0x%x in read buffer.\n", + len, cafe->datalen); cafe->datalen += len; } @@ -244,7 +235,7 @@ static uint8_t cafe_read_byte(struct nand_chip *chip) uint8_t d; cafe_read_buf(chip, &d, 1); - cafe_dev_dbg(&cafe->pdev->dev, "Read %02x\n", d); + dev_dbg(&cafe->pdev->dev, "Read %02x\n", d); return d; } @@ -258,7 +249,7 @@ static void cafe_nand_cmdfunc(struct nand_chip *chip, unsigned command, uint32_t ctl1; uint32_t doneint = CAFE_NAND_IRQ_CMD_DONE; - cafe_dev_dbg(&cafe->pdev->dev, "cmdfunc %02x, 0x%x, 0x%x\n", + dev_dbg(&cafe->pdev->dev, "cmdfunc %02x, 0x%x, 0x%x\n", command, column, page_addr); if (command == NAND_CMD_ERASE2 || command == NAND_CMD_PAGEPROG) { @@ -270,8 +261,8 @@ static void cafe_nand_cmdfunc(struct nand_chip *chip, unsigned command, NAND_CTRL2); ctl1 = cafe->ctl1; cafe->ctl2 &= ~CAFE_NAND_CTRL2_AUTO_WRITE_ECC; - cafe_dev_dbg(&cafe->pdev->dev, "Continue command, ctl1 %08x, #data %d\n", - cafe->ctl1, cafe->nr_data); + dev_dbg(&cafe->pdev->dev, "Continue command, ctl1 %08x, #data %d\n", + cafe->ctl1, cafe->nr_data); goto do_command; } /* Reset ECC engine */ @@ -333,8 +324,8 @@ static void cafe_nand_cmdfunc(struct nand_chip *chip, unsigned command, /* Ignore the first command of a pair; the hardware deals with them both at once, later */ cafe->ctl1 = ctl1; - cafe_dev_dbg(&cafe->pdev->dev, "Setup for delayed command, ctl1 %08x, dlen %x\n", - cafe->ctl1, cafe->datalen); + dev_dbg(&cafe->pdev->dev, "Setup for delayed command, ctl1 %08x, dlen %x\n", + cafe->ctl1, cafe->datalen); return; } /* RNDOUT and READ0 commands need a following byte */ @@ -350,7 +341,7 @@ static void cafe_nand_cmdfunc(struct nand_chip *chip, unsigned command, NAND_CTRL2); do_command: - cafe_dev_dbg(&cafe->pdev->dev, "dlen %x, ctl1 %x, ctl2 %x\n", + dev_dbg(&cafe->pdev->dev, "dlen %x, ctl1 %x, ctl2 %x\n", cafe->datalen, ctl1, cafe_readl(cafe, NAND_CTRL2)); /* NB: The datasheet lies -- we really should be subtracting 1 here */ @@ -399,12 +390,12 @@ static void cafe_nand_cmdfunc(struct nand_chip *chip, unsigned command, break; udelay(1); if (!(c % 100000)) - cafe_dev_dbg(&cafe->pdev->dev, "Wait for ready, IRQ %x\n", irqs); + dev_dbg(&cafe->pdev->dev, "Wait for ready, IRQ %x\n", irqs); cpu_relax(); } cafe_writel(cafe, doneint, NAND_IRQ); - cafe_dev_dbg(&cafe->pdev->dev, "Command %x completed after %d usec, irqs %x (%x)\n", - command, 500000-c, irqs, cafe_readl(cafe, NAND_IRQ)); + dev_dbg(&cafe->pdev->dev, "Command %x completed after %d usec, irqs %x (%x)\n", + command, 500000-c, irqs, cafe_readl(cafe, NAND_IRQ)); } WARN_ON(cafe->ctl2 & CAFE_NAND_CTRL2_AUTO_WRITE_ECC); @@ -433,7 +424,7 @@ static void cafe_select_chip(struct nand_chip *chip, int chipnr) if (chipnr < 0 || chipnr > 1) return; - cafe_dev_dbg(&cafe->pdev->dev, "select_chip %d\n", chipnr); + dev_dbg(&cafe->pdev->dev, "select_chip %d\n", chipnr); /* Mask the appropriate bit into the stored value of ctl1 which will be used by cafe_nand_cmdfunc() */ @@ -452,7 +443,7 @@ static irqreturn_t cafe_nand_interrupt(int irq, void *id) if (!irqs) return IRQ_NONE; - cafe_dev_dbg(&cafe->pdev->dev, "irq, bits %x (%x)\n", irqs, cafe_readl(cafe, NAND_IRQ)); + dev_dbg(&cafe->pdev->dev, "irq, bits %x (%x)\n", irqs, cafe_readl(cafe, NAND_IRQ)); return IRQ_HANDLED; } @@ -484,9 +475,9 @@ static int cafe_nand_read_page(struct nand_chip *chip, uint8_t *buf, unsigned int max_bitflips = 0; u32 ecc_result, status; - cafe_dev_dbg(&cafe->pdev->dev, "ECC result %08x SYN1,2 %08x\n", - cafe_readl(cafe, NAND_ECC_RESULT), - cafe_readl(cafe, NAND_ECC_SYN_REG(0))); + dev_dbg(&cafe->pdev->dev, "ECC result %08x SYN1,2 %08x\n", + cafe_readl(cafe, NAND_ECC_RESULT), + cafe_readl(cafe, NAND_ECC_SYN_REG(0))); nand_read_page_op(chip, page, 0, buf, mtd->writesize); chip->legacy.read_buf(chip, chip->oob_poi, mtd->oobsize); @@ -718,8 +709,8 @@ static int cafe_nand_attach_chip(struct nand_chip *chip) cafe_writel(cafe, lower_32_bits(cafe->dmaaddr), NAND_DMA_ADDR0); cafe_writel(cafe, upper_32_bits(cafe->dmaaddr), NAND_DMA_ADDR1); - cafe_dev_dbg(&cafe->pdev->dev, "Set DMA address to %x (virt %p)\n", - cafe_readl(cafe, NAND_DMA_ADDR0), cafe->dmabuf); + dev_dbg(&cafe->pdev->dev, "Set DMA address to %x (virt %p)\n", + cafe_readl(cafe, NAND_DMA_ADDR0), cafe->dmabuf); /* Restore the DMA flag */ cafe->usedma = usedma; @@ -901,16 +892,16 @@ static int cafe_nand_probe(struct pci_dev *pdev, } if (numtimings == 3) { - cafe_dev_dbg(&cafe->pdev->dev, "Using provided timings (%08x %08x %08x)\n", - timing[0], timing[1], timing[2]); + dev_dbg(&cafe->pdev->dev, "Using provided timings (%08x %08x %08x)\n", + timing[0], timing[1], timing[2]); } else { timing[0] = cafe_readl(cafe, NAND_TIMING1); timing[1] = cafe_readl(cafe, NAND_TIMING2); timing[2] = cafe_readl(cafe, NAND_TIMING3); if (timing[0] | timing[1] | timing[2]) { - cafe_dev_dbg(&cafe->pdev->dev, "Timing registers already set (%08x %08x %08x)\n", - timing[0], timing[1], timing[2]); + dev_dbg(&cafe->pdev->dev, "Timing registers already set (%08x %08x %08x)\n", + timing[0], timing[1], timing[2]); } else { dev_warn(&cafe->pdev->dev, "Timing registers unset; using most conservative defaults\n"); timing[0] = timing[1] = timing[2] = 0xffffffff; From patchwork Mon Apr 27 08:20:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris Brezillon X-Patchwork-Id: 1277412 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=BtsTGO57; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 499dBh2x9kz9sSk for ; Mon, 27 Apr 2020 18:25:32 +1000 (AEST) 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=H4RhdOJZuzUGjql9cyQQ1jm/qPiiE/8MZwX5vLRjI+U=; b=BtsTGO57k7GZOj 6wfSfcl668NtDm6YgeJXM0xsY+mTa/iGVmg9yZceEpw/wog8hhR1i/sF4dD1ftBSr24iN4aNjLLIh oDdcZRbtut61htRjUFCcg8gYD5WGAhHRDmUqp/pZzohKtYjWa01BMyY/yd9M1sn3ksvJcHbkgl7xk UgXO5I812U4ztMD4HJK8PEmFg7ientgNfdsGQvi+WrbB+C8SdaRudbSMJMYQotUP2M9TElg+zo+9J Me7/1XgWgqb+RcdA51+iBy847gP7pcmNv0S94P05HtEsx0F42ibmBsRX09ySisdZRnyX1SYhX0DZQ fAv4GuP8q5LHdW0WPd/A==; 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 1jSz4n-0003h5-UP; Mon, 27 Apr 2020 08:25:17 +0000 Received: from bhuna.collabora.co.uk ([46.235.227.227]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jSz0J-00068N-RP for linux-mtd@lists.infradead.org; Mon, 27 Apr 2020 08:20:42 +0000 Received: from localhost.localdomain (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id 22F612A0A17; Mon, 27 Apr 2020 09:20:38 +0100 (BST) From: Boris Brezillon To: David Woodhouse , Miquel Raynal , linux-mtd@lists.infradead.org Subject: [PATCH 08/17] mtd: rawnand: cafe: Use devm_kzalloc and devm_request_irq() Date: Mon, 27 Apr 2020 10:20:18 +0200 Message-Id: <20200427082028.394719-9-boris.brezillon@collabora.com> X-Mailer: git-send-email 2.25.3 In-Reply-To: <20200427082028.394719-1-boris.brezillon@collabora.com> References: <20200427082028.394719-1-boris.brezillon@collabora.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200427_012040_050319_C8B94632 X-CRM114-Status: GOOD ( 12.44 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [46.235.227.227 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Weinberger , Boris Brezillon , Vignesh Raghavendra , Tudor Ambarus Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org This simplifies the error/remove path. Signed-off-by: Boris Brezillon Reviewed-by: Miquel Raynal --- drivers/mtd/nand/raw/cafe_nand.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c index 55fa0bf2806a..3eab57e63215 100644 --- a/drivers/mtd/nand/raw/cafe_nand.c +++ b/drivers/mtd/nand/raw/cafe_nand.c @@ -848,7 +848,7 @@ static int cafe_nand_probe(struct pci_dev *pdev, pci_set_master(pdev); - cafe = kzalloc(sizeof(*cafe), GFP_KERNEL); + cafe = devm_kzalloc(&pdev->dev, sizeof(*cafe), GFP_KERNEL); if (!cafe) return -ENOMEM; @@ -860,8 +860,7 @@ static int cafe_nand_probe(struct pci_dev *pdev, cafe->mmio = pci_iomap(pdev, 0, 0); if (!cafe->mmio) { dev_warn(&pdev->dev, "failed to iomap\n"); - err = -ENOMEM; - goto out_free_mtd; + return -ENOMEM; } cafe->rs = init_rs_non_canonical(12, &cafe_mul, 0, 1, 8); @@ -910,8 +909,8 @@ static int cafe_nand_probe(struct pci_dev *pdev, cafe_nand_init(cafe); - err = request_irq(pdev->irq, &cafe_nand_interrupt, IRQF_SHARED, - "CAFE NAND", mtd); + err = devm_request_irq(&pdev->dev, pdev->irq, cafe_nand_interrupt, + IRQF_SHARED, "CAFE NAND", mtd); if (err) { dev_warn(&pdev->dev, "Could not register IRQ %d\n", pdev->irq); goto out_ior; @@ -942,11 +941,8 @@ static int cafe_nand_probe(struct pci_dev *pdev, cafe_writel(cafe, cafe_readl(cafe, GLOBAL_IRQ_MASK) & ~CAFE_GLOBAL_IRQ_NAND, GLOBAL_IRQ_MASK); - free_irq(pdev->irq, mtd); out_ior: pci_iounmap(pdev, cafe->mmio); - out_free_mtd: - kfree(cafe); out: return err; } @@ -961,12 +957,10 @@ static void cafe_nand_remove(struct pci_dev *pdev) cafe_writel(cafe, cafe_readl(cafe, GLOBAL_IRQ_MASK) & ~CAFE_GLOBAL_IRQ_NAND, GLOBAL_IRQ_MASK); - free_irq(pdev->irq, mtd); nand_release(chip); free_rs(cafe->rs); pci_iounmap(pdev, cafe->mmio); dma_free_coherent(&cafe->pdev->dev, 2112, cafe->dmabuf, cafe->dmaaddr); - kfree(cafe); } static const struct pci_device_id cafe_nand_tbl[] = { From patchwork Mon Apr 27 08:20:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris Brezillon X-Patchwork-Id: 1277413 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=mo+Ufx8W; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 499dBn5XqFz9sRf for ; Mon, 27 Apr 2020 18:25:37 +1000 (AEST) 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=VGjR4+I55E+3CWUN5j5Bjlh0y6idRk3vTfTJcQF0r4M=; b=mo+Ufx8WbS1URs 6yxB1rsZQKvgE22/FWybZAwrhXrOG/TP7m2b1bWWNTjWaPt3KFqLLHd7ceOP6V+kLqTsRUVVonCh0 x218aObslG0RFxm6oGaEFQ5t55ZYdyx4OqtQOgGrj/ObT7ec/OZSBBZaT7V2ow+fniFGDXyuypSAK bIhxVo3IiUeLlgH/xuvQpgzL+GomrTd+MN81m2Eu4yQiHM5QexD8inqK/+KVmf0KzaU0/Gfu2HUuC JglqFcikKkBX6DRC1B8BAaNT9ZjAFVsltlHvOwNicckm8vrh9+KMmlTkLxSK/Cra6NzlSkbQ+6VRQ +LcT6OFsqWfQ15K9b3ow==; 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 1jSz54-0004KE-4n; Mon, 27 Apr 2020 08:25:34 +0000 Received: from bhuna.collabora.co.uk ([2a00:1098:0:82:1000:25:2eeb:e3e3]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jSz0L-0006Ap-Ex for linux-mtd@lists.infradead.org; Mon, 27 Apr 2020 08:20:45 +0000 Received: from localhost.localdomain (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id 65C052A0630; Mon, 27 Apr 2020 09:20:38 +0100 (BST) From: Boris Brezillon To: David Woodhouse , Miquel Raynal , linux-mtd@lists.infradead.org Subject: [PATCH 09/17] mtd: rawnand: cafe: Get rid of a useless label Date: Mon, 27 Apr 2020 10:20:19 +0200 Message-Id: <20200427082028.394719-10-boris.brezillon@collabora.com> X-Mailer: git-send-email 2.25.3 In-Reply-To: <20200427082028.394719-1-boris.brezillon@collabora.com> References: <20200427082028.394719-1-boris.brezillon@collabora.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200427_012041_662786_A3E75B1A X-CRM114-Status: GOOD ( 12.89 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Weinberger , Boris Brezillon , Vignesh Raghavendra , Tudor Ambarus Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org We can return 0 directly instead of branching to the out label. Signed-off-by: Boris Brezillon Reviewed-by: Miquel Raynal --- drivers/mtd/nand/raw/cafe_nand.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c index 3eab57e63215..348debbc04af 100644 --- a/drivers/mtd/nand/raw/cafe_nand.c +++ b/drivers/mtd/nand/raw/cafe_nand.c @@ -932,7 +932,7 @@ static int cafe_nand_probe(struct pci_dev *pdev, if (err) goto out_cleanup_nand; - goto out; + return 0; out_cleanup_nand: nand_cleanup(&cafe->nand); @@ -943,7 +943,6 @@ static int cafe_nand_probe(struct pci_dev *pdev, GLOBAL_IRQ_MASK); out_ior: pci_iounmap(pdev, cafe->mmio); - out: return err; } From patchwork Mon Apr 27 08:20:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris Brezillon X-Patchwork-Id: 1277416 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=HV17Z+ci; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 499dCQ1Wlkz9sRf for ; Mon, 27 Apr 2020 18:26:10 +1000 (AEST) 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=WGNmz03oyp9vo3Z02d1ha40xM6LqdRegYZGQBbsSiu4=; b=HV17Z+ciSwdVHW uXB4fIqaiKjQJw5aEVU76RsugRWJ6HVQIeA5dTNlElBr8ss8VyBHrFhwJzBNlTssXEPEDnSx3LUUI vKoHMMGPT5pf0mOAZ9Xs9/jZdYMxmM6GnXMrFeQ1ZxdjM1jgsqZJFbm18cF8Iwe9mNPzU0Pb358He IaQDQMhPBVgUvjIHki0PiMxYLvZgpwPZKdCMGu6YZlJUe4McR57yPa9rA+UVpQgzzRZIo3S8PwrE9 X+cNoaDGW+xWc555zb55mWZnpUeMx5grZqYWJhdEhx5wPV+7IGXVPi4SFNfO0e49VoWcAIsNso8xc zuAk3w931ZceUr8ypqfw==; 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 1jSz5b-0004nG-83; Mon, 27 Apr 2020 08:26:07 +0000 Received: from bhuna.collabora.co.uk ([2a00:1098:0:82:1000:25:2eeb:e3e3]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jSz0L-0006At-Ey for linux-mtd@lists.infradead.org; Mon, 27 Apr 2020 08:20:44 +0000 Received: from localhost.localdomain (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id 4A93B2A0B4F; Mon, 27 Apr 2020 09:20:39 +0100 (BST) From: Boris Brezillon To: David Woodhouse , Miquel Raynal , linux-mtd@lists.infradead.org Subject: [PATCH 10/17] mtd: rawnand: cafe: Explicitly inherit from nand_controller Date: Mon, 27 Apr 2020 10:20:20 +0200 Message-Id: <20200427082028.394719-11-boris.brezillon@collabora.com> X-Mailer: git-send-email 2.25.3 In-Reply-To: <20200427082028.394719-1-boris.brezillon@collabora.com> References: <20200427082028.394719-1-boris.brezillon@collabora.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200427_012041_661691_882F9EC5 X-CRM114-Status: GOOD ( 12.37 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Weinberger , Boris Brezillon , Vignesh Raghavendra , Tudor Ambarus Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Explicitly inherit from nand_controller instead of using the dummy controller object. Signed-off-by: Boris Brezillon Reviewed-by: Miquel Raynal --- drivers/mtd/nand/raw/cafe_nand.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c index 348debbc04af..2825489a71b8 100644 --- a/drivers/mtd/nand/raw/cafe_nand.c +++ b/drivers/mtd/nand/raw/cafe_nand.c @@ -146,6 +146,7 @@ #define CAFE_FIELD_GET(reg, field, val) FIELD_GET(CAFE_##reg##_##field, val) struct cafe_priv { + struct nand_controller base; struct nand_chip nand; struct pci_dev *pdev; void __iomem *mmio; @@ -920,7 +921,9 @@ static int cafe_nand_probe(struct pci_dev *pdev, cafe->usedma = 0; /* Scan to find existence of the device */ - cafe->nand.legacy.dummy_controller.ops = &cafe_nand_controller_ops; + nand_controller_init(&cafe->base); + cafe->base.ops = &cafe_nand_controller_ops; + cafe->nand.controller = &cafe->base; err = nand_scan(&cafe->nand, 2); if (err) goto out_irq; From patchwork Mon Apr 27 08:20:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris Brezillon X-Patchwork-Id: 1277420 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=aK/BLh2n; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 499dDW6P3Nz9sRf for ; Mon, 27 Apr 2020 18:27:07 +1000 (AEST) 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=20cB1nWaIre9AsGyae7NXSyAPvtjgJmUXEsVeJENvlU=; b=aK/BLh2nQq/3hO W9I7tma3uf6c2+O3mzNuZeBjDdOiitR/tBPJ8l6sfyKebogfybT5j5e44SxxaaSr3JTL3PkBu/BZA Kzq9ERXaFEmBjitRHI3kmPvNzYroya3TznkQzbOva8JFcxT3w9qwjufkLFcMDU/HPLEGyxxm0y6o6 G7TvBDZ1tiUeMSVPBURB0/dmnkqC5blnPuBp3V2TIzKUyQzApG4MpvM8deWEKovPJO7Y8ypXhEeUe GkbX/iz65WSZTJk6O20g1GH9o/n1VKk1hRIMXSEr1xR7wWfm2FNtRBb8cqI4kIdxBNVkun251hEk6 4Wysel4jspTG6InSf8yw==; 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 1jSz6V-0005YZ-Gp; Mon, 27 Apr 2020 08:27:03 +0000 Received: from bhuna.collabora.co.uk ([46.235.227.227]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jSz0L-0006B3-QY for linux-mtd@lists.infradead.org; Mon, 27 Apr 2020 08:20:47 +0000 Received: from localhost.localdomain (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id 8C91B2A0978; Mon, 27 Apr 2020 09:20:39 +0100 (BST) From: Boris Brezillon To: David Woodhouse , Miquel Raynal , linux-mtd@lists.infradead.org Subject: [PATCH 11/17] mtd: rawnand: cafe: Don't leave ECC enabled in the write path Date: Mon, 27 Apr 2020 10:20:21 +0200 Message-Id: <20200427082028.394719-12-boris.brezillon@collabora.com> X-Mailer: git-send-email 2.25.3 In-Reply-To: <20200427082028.394719-1-boris.brezillon@collabora.com> References: <20200427082028.394719-1-boris.brezillon@collabora.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200427_012042_330440_06E405CD X-CRM114-Status: GOOD ( 12.98 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [46.235.227.227 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Weinberger , Boris Brezillon , Vignesh Raghavendra , Tudor Ambarus Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org cafe_nand_write_page_lowlevel() sets the ECC auto-generation flag but never clears it, thus forcing the cafe_nand_cmdfunc() to clear it in certain circumstances. Let's just clear this flag in cafe_nand_write_page_lowlevel() instead. Signed-off-by: Boris Brezillon Reviewed-by: Miquel Raynal --- drivers/mtd/nand/raw/cafe_nand.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c index 2825489a71b8..31493a201a02 100644 --- a/drivers/mtd/nand/raw/cafe_nand.c +++ b/drivers/mtd/nand/raw/cafe_nand.c @@ -261,7 +261,6 @@ static void cafe_nand_cmdfunc(struct nand_chip *chip, unsigned command, CAFE_FIELD_PREP(NAND_CTRL2, CMD2, command), NAND_CTRL2); ctl1 = cafe->ctl1; - cafe->ctl2 &= ~CAFE_NAND_CTRL2_AUTO_WRITE_ECC; dev_dbg(&cafe->pdev->dev, "Continue command, ctl1 %08x, #data %d\n", cafe->ctl1, cafe->nr_data); goto do_command; @@ -643,6 +642,7 @@ static int cafe_nand_write_page(struct nand_chip *chip, { struct mtd_info *mtd = nand_to_mtd(chip); struct cafe_priv *cafe = nand_get_controller_data(chip); + int ret; nand_prog_page_begin_op(chip, page, 0, buf, mtd->writesize); chip->legacy.write_buf(chip, chip->oob_poi, mtd->oobsize); @@ -650,7 +650,14 @@ static int cafe_nand_write_page(struct nand_chip *chip, /* Set up ECC autogeneration */ cafe->ctl2 |= CAFE_NAND_CTRL2_AUTO_WRITE_ECC; - return nand_prog_page_end_op(chip); + ret = nand_prog_page_end_op(chip); + + /* + * And clear it before returning so that following write operations + * that do not involve ECC don't generate ECC bytes. + */ + cafe->ctl2 &= ~CAFE_NAND_CTRL2_AUTO_WRITE_ECC; + return ret; } /* F_2[X]/(X**6+X+1) */ From patchwork Mon Apr 27 08:20:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris Brezillon X-Patchwork-Id: 1277424 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=Woh2vlKu; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 499dFD4bWzz9sRf for ; Mon, 27 Apr 2020 18:27:44 +1000 (AEST) 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=x/RZNMx4gw9C+u5LWXTeMA7NzUYaimq8Kw3n282BIjg=; b=Woh2vlKu0xhm+7 cMuYAk+pWwBFNkoXJFjr0CeEkHxTl2oQ9n73T/hEUXa/O9AKJU98tM/91QqDIZEzEQOxQDFwdUoQr uLM/iKql60cMePk4fsClM449i36UErH6K+aW38Bcr/RtPloogGamakia/ff3LZ7c0SWbVP1Ybx7NP yEkIvVusvf5r4+uCmS2BQ/OtEOsXHBwpJoL0DOhgRSb9O7mo0Ys7qY/D+6fs7sdKCZUDnLI4OsiUU yQ/4kXaK7bTvX7teQyLXZT+iXGyc/4gLPNufJmhKms+LD0DtHXptZtQ/uvZpn3m57sskwvc+GUnPe 8nTVF2iBKm4xWVik90tw==; 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 1jSz76-00062O-Bk; Mon, 27 Apr 2020 08:27:40 +0000 Received: from bhuna.collabora.co.uk ([2a00:1098:0:82:1000:25:2eeb:e3e3]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jSz0L-0006B2-P9 for linux-mtd@lists.infradead.org; Mon, 27 Apr 2020 08:20:45 +0000 Received: from localhost.localdomain (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id CF4472A0A20; Mon, 27 Apr 2020 09:20:39 +0100 (BST) From: Boris Brezillon To: David Woodhouse , Miquel Raynal , linux-mtd@lists.infradead.org Subject: [PATCH 12/17] mtd: rawnand: cafe: Don't split things when reading/writing a page Date: Mon, 27 Apr 2020 10:20:22 +0200 Message-Id: <20200427082028.394719-13-boris.brezillon@collabora.com> X-Mailer: git-send-email 2.25.3 In-Reply-To: <20200427082028.394719-1-boris.brezillon@collabora.com> References: <20200427082028.394719-1-boris.brezillon@collabora.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200427_012041_955555_2A75A610 X-CRM114-Status: GOOD ( 12.51 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Weinberger , Boris Brezillon , Vignesh Raghavendra , Tudor Ambarus Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Calling nand_read_page_op(pagesize)/nand_prog_page_begin_op(pagesize) and expecting to get a pagesize+oobsize read from/written to the read/write buffer is fragile and only works because of hacks done in cmdfunc(). Let's read/write the page in one go, using the page cache buffer as a bounce buffer. Signed-off-by: Boris Brezillon --- drivers/mtd/nand/raw/cafe_nand.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c index 31493a201a02..edf65197604b 100644 --- a/drivers/mtd/nand/raw/cafe_nand.c +++ b/drivers/mtd/nand/raw/cafe_nand.c @@ -472,6 +472,7 @@ static int cafe_nand_read_page(struct nand_chip *chip, uint8_t *buf, { struct mtd_info *mtd = nand_to_mtd(chip); struct cafe_priv *cafe = nand_get_controller_data(chip); + void *pagebuf = nand_get_data_buf(chip); unsigned int max_bitflips = 0; u32 ecc_result, status; @@ -479,8 +480,11 @@ static int cafe_nand_read_page(struct nand_chip *chip, uint8_t *buf, cafe_readl(cafe, NAND_ECC_RESULT), cafe_readl(cafe, NAND_ECC_SYN_REG(0))); - nand_read_page_op(chip, page, 0, buf, mtd->writesize); - chip->legacy.read_buf(chip, chip->oob_poi, mtd->oobsize); + nand_read_page_op(chip, page, 0, pagebuf, + mtd->writesize + mtd->oobsize); + + if (buf != pagebuf) + memcpy(buf, pagebuf, mtd->writesize); ecc_result = cafe_readl(cafe, NAND_ECC_RESULT); status = CAFE_FIELD_GET(NAND_ECC_RESULT, STATUS, ecc_result); @@ -642,15 +646,17 @@ static int cafe_nand_write_page(struct nand_chip *chip, { struct mtd_info *mtd = nand_to_mtd(chip); struct cafe_priv *cafe = nand_get_controller_data(chip); + void *pagebuf = nand_get_data_buf(chip); int ret; - nand_prog_page_begin_op(chip, page, 0, buf, mtd->writesize); - chip->legacy.write_buf(chip, chip->oob_poi, mtd->oobsize); + if (pagebuf != buf) + memcpy(pagebuf, buf, mtd->writesize); /* Set up ECC autogeneration */ cafe->ctl2 |= CAFE_NAND_CTRL2_AUTO_WRITE_ECC; - ret = nand_prog_page_end_op(chip); + ret = nand_prog_page_op(chip, page, 0, pagebuf, + mtd->writesize + mtd->oobsize); /* * And clear it before returning so that following write operations From patchwork Mon Apr 27 08:20:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris Brezillon X-Patchwork-Id: 1277414 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=gOg5l8Bs; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 499dCG4jRpz9sRf for ; Mon, 27 Apr 2020 18:26:01 +1000 (AEST) 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=XyyTEUGblRoYolhYCp7k66slt0vIigOsk273n273wUs=; b=gOg5l8Bs8ai6oR zdp0hC7HoodXjAGqkYv9ccAq86TDp8eteiQcYnx361KFKYHWWzCLTnL+IlemRuK3o/CuZsbnjHbAe J0uNQLWXu431p1bUDCnD6+yNqKhVWJKqZNzS5CeJzzHRSzz86d4iedzitk7QV/7pX3GtfNg9omy5N vbCOXP0iQPLEze/mz0e7IT+c9Z4ybKxdXhLqL3UJ0ELVCqX3peWxtnYYX7fi3cJZApNIc3fWQaPh1 1RcKs4OAYGeLKrDg4NGuvDXe1Kx/DbaQzBC+CyRYWKvwj6003El4xGhhUkOZAavc6pz+XrTsb5Ofa OYAN6QBe/4+TFoNdoRQQ==; 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 1jSz5L-0004YX-6t; Mon, 27 Apr 2020 08:25:51 +0000 Received: from bhuna.collabora.co.uk ([2a00:1098:0:82:1000:25:2eeb:e3e3]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jSz0L-0006BE-Ui for linux-mtd@lists.infradead.org; Mon, 27 Apr 2020 08:20:46 +0000 Received: from localhost.localdomain (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id 2027E2A07FC; Mon, 27 Apr 2020 09:20:40 +0100 (BST) From: Boris Brezillon To: David Woodhouse , Miquel Raynal , linux-mtd@lists.infradead.org Subject: [PATCH 13/17] mtd: rawnand: cafe: Add exec_op() support Date: Mon, 27 Apr 2020 10:20:23 +0200 Message-Id: <20200427082028.394719-14-boris.brezillon@collabora.com> X-Mailer: git-send-email 2.25.3 In-Reply-To: <20200427082028.394719-1-boris.brezillon@collabora.com> References: <20200427082028.394719-1-boris.brezillon@collabora.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200427_012042_249255_A7AFD735 X-CRM114-Status: GOOD ( 16.69 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Weinberger , Boris Brezillon , Vignesh Raghavendra , Tudor Ambarus Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Implementing exec_op() will help us get rid of the legacy interface and should make drivers much cleaner too. Signed-off-by: Boris Brezillon --- drivers/mtd/nand/raw/cafe_nand.c | 137 ++++++++++++++++++++++++++++++- 1 file changed, 136 insertions(+), 1 deletion(-) diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c index edf65197604b..ada9c8b06a41 100644 --- a/drivers/mtd/nand/raw/cafe_nand.c +++ b/drivers/mtd/nand/raw/cafe_nand.c @@ -21,7 +21,7 @@ #include #include #include -#include +#include #define CAFE_NAND_CTRL1 0x00 #define CAFE_NAND_CTRL1_HAS_CMD BIT(31) @@ -774,9 +774,144 @@ static void cafe_nand_detach_chip(struct nand_chip *chip) dma_free_coherent(&cafe->pdev->dev, 2112, cafe->dmabuf, cafe->dmaaddr); } +static int cafe_nand_exec_subop(struct nand_chip *chip, + const struct nand_subop *subop) +{ + struct cafe_priv *cafe = nand_get_controller_data(chip); + u32 ctrl1 = 0, ctrl2 = cafe->ctl2, addr1 = 0, addr2 = 0; + const struct nand_op_instr *data_instr = NULL; + u32 status, wait = CAFE_NAND_IRQ_CMD_DONE; + bool waitrdy = false; + unsigned int i, j; + int ret; + + if (WARN_ON(subop->cs > 1)) + return -EINVAL; + + cafe->datalen = 0; + ctrl1 |= CAFE_FIELD_PREP(NAND_CTRL1, CE, subop->cs); + + for (i = 0; i < subop->ninstrs; i++) { + const struct nand_op_instr *instr = &subop->instrs[i]; + + switch (instr->type) { + case NAND_OP_CMD_INSTR: + if (WARN_ON((ctrl1 & CAFE_NAND_CTRL1_HAS_CMD) && + (ctrl2 & CAFE_NAND_CTRL2_HAS_CMD2))) + return -EINVAL; + + if (!(ctrl1 & CAFE_NAND_CTRL1_HAS_CMD)) + ctrl1 |= CAFE_NAND_CTRL1_HAS_CMD | + CAFE_FIELD_PREP(NAND_CTRL1, CMD, + instr->ctx.cmd.opcode); + else + ctrl2 |= CAFE_NAND_CTRL2_HAS_CMD2 | + CAFE_FIELD_PREP(NAND_CTRL2, CMD2, + instr->ctx.cmd.opcode); + break; + + case NAND_OP_ADDR_INSTR: + if (WARN_ON(instr->ctx.addr.naddrs > 5 || + !instr->ctx.addr.naddrs)) + return -EINVAL; + + for (j = 0; j < instr->ctx.addr.naddrs; j++) { + u32 addr = instr->ctx.addr.addrs[j]; + + if (j < 2) + addr1 |= addr << (8 * j); + else + addr2 |= addr << (8 * (j - 2)); + } + + ctrl1 |= CAFE_NAND_CTRL1_HAS_ADDR | + CAFE_FIELD_PREP(NAND_CTRL1, NUM_ADDR_CYC, + instr->ctx.addr.naddrs - 1); + cafe_writel(cafe, addr1, NAND_ADDR1); + if (instr->ctx.addr.naddrs > 2) + cafe_writel(cafe, addr2, NAND_ADDR2); + break; + + case NAND_OP_DATA_IN_INSTR: + data_instr = instr; + ctrl1 |= CAFE_NAND_CTRL1_HAS_DATA_IN; + break; + + case NAND_OP_DATA_OUT_INSTR: + data_instr = instr; + ctrl1 |= CAFE_NAND_CTRL1_HAS_DATA_OUT; + cafe_write_buf(chip, instr->ctx.data.buf.out, + instr->ctx.data.len); + break; + + case NAND_OP_WAITRDY_INSTR: + wait |= CAFE_NAND_IRQ_FLASH_RDY; + waitrdy = true; + break; + } + } + + if (data_instr) + cafe_writel(cafe, data_instr->ctx.data.len, NAND_DATA_LEN); + + if (cafe->usedma && data_instr) { + u32 dmactrl = CAFE_NAND_DMA_CTRL_ENABLE | + CAFE_NAND_DMA_CTRL_RESERVED; + + wait |= CAFE_NAND_IRQ_DMA_DONE; + dmactrl |= CAFE_FIELD_PREP(NAND_DMA_CTRL, DATA_LEN, + data_instr->ctx.data.len); + if (ctrl1 & CAFE_NAND_CTRL1_HAS_DATA_IN) + dmactrl |= CAFE_NAND_DMA_CTRL_DATA_IN; + + cafe_writel(cafe, dmactrl, NAND_DMA_CTRL); + } + + /* Clear the pending interrupts before starting the operation. */ + cafe_writel(cafe, wait, NAND_IRQ); + + cafe_writel(cafe, ctrl2, NAND_CTRL2); + cafe_writel(cafe, ctrl1, NAND_CTRL1); + + ret = readl_poll_timeout(cafe->mmio + CAFE_NAND_IRQ, status, + (status & wait) == wait, 1, USEC_PER_SEC); + if (ret) + return ret; + + if (ctrl1 & CAFE_NAND_DMA_CTRL_DATA_IN) + cafe_read_buf(chip, data_instr->ctx.data.buf.in, + data_instr->ctx.data.len); + + return 0; +} + +static const struct nand_op_parser cafe_nand_op_parser = NAND_OP_PARSER( + NAND_OP_PARSER_PATTERN(cafe_nand_exec_subop, + NAND_OP_PARSER_PAT_CMD_ELEM(true), + NAND_OP_PARSER_PAT_ADDR_ELEM(true, 5), + NAND_OP_PARSER_PAT_CMD_ELEM(true), + NAND_OP_PARSER_PAT_WAITRDY_ELEM(true), + NAND_OP_PARSER_PAT_DATA_IN_ELEM(true, 2112)), + NAND_OP_PARSER_PATTERN(cafe_nand_exec_subop, + NAND_OP_PARSER_PAT_CMD_ELEM(true), + NAND_OP_PARSER_PAT_ADDR_ELEM(true, 5), + NAND_OP_PARSER_PAT_CMD_ELEM(true), + NAND_OP_PARSER_PAT_DATA_IN_ELEM(true, 2112), + NAND_OP_PARSER_PAT_WAITRDY_ELEM(true)) +); + +static int cafe_nand_exec_op(struct nand_chip *chip, + const struct nand_operation *op, + bool check_only) +{ + return nand_op_parser_exec_op(chip, &cafe_nand_op_parser, op, + check_only); +} + static const struct nand_controller_ops cafe_nand_controller_ops = { .attach_chip = cafe_nand_attach_chip, .detach_chip = cafe_nand_detach_chip, + .exec_op = cafe_nand_exec_op, }; static void cafe_nand_init(struct cafe_priv *cafe) From patchwork Mon Apr 27 08:20:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris Brezillon X-Patchwork-Id: 1277423 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=uKHS8ZSX; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 499dF519jLz9sSk for ; Mon, 27 Apr 2020 18:27:37 +1000 (AEST) 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=yEEY+esP4AWag3Uy1pRSFbiqgfTuwxnlo00bS1lzOZo=; b=uKHS8ZSX1Q1CHL ZvinDK2TiLr9TkESzzQe6AW4jQHB8rziBB1SEPBrIUQkzZy7dvO+eWteyhvDlOqnStbd/lZOxokMT 2xt9ReTLhcVxvnFV58FmdFLy06MkG594jmMWKlYXTmbdA9IV0tuzzMPMSUshmFDX3uvoTphTCtdXi B/Q7iipy/1wN/y74AX9l1om3QgXygU7zzkgJ077hSDdrjHE0xu0KcmbuwSDi7ZoMNqLof1NZU5Ktk 0klc895enkG8SrlhM8vPWVMqNenyK8NX/ah7XdPJ71qV4X/QWa6cfLsErd2jL53cxSzg8ABKR9xkb gCGS3hweHtBS1dE9VuYg==; 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 1jSz6n-0005nx-Vx; Mon, 27 Apr 2020 08:27:21 +0000 Received: from bhuna.collabora.co.uk ([2a00:1098:0:82:1000:25:2eeb:e3e3]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jSz0L-0006BG-Pt for linux-mtd@lists.infradead.org; Mon, 27 Apr 2020 08:20:47 +0000 Received: from localhost.localdomain (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id 638C82A067A; Mon, 27 Apr 2020 09:20:40 +0100 (BST) From: Boris Brezillon To: David Woodhouse , Miquel Raynal , linux-mtd@lists.infradead.org Subject: [PATCH 14/17] mtd: rawnand: cafe: Get rid of the legacy interface implementation Date: Mon, 27 Apr 2020 10:20:24 +0200 Message-Id: <20200427082028.394719-15-boris.brezillon@collabora.com> X-Mailer: git-send-email 2.25.3 In-Reply-To: <20200427082028.394719-1-boris.brezillon@collabora.com> References: <20200427082028.394719-1-boris.brezillon@collabora.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200427_012042_113721_6B6B4E27 X-CRM114-Status: GOOD ( 22.20 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Weinberger , Boris Brezillon , Vignesh Raghavendra , Tudor Ambarus Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Now that exec_op() is implemented, we can safely get rid of all legacy hooks implementations. Signed-off-by: Boris Brezillon Reviewed-by: Miquel Raynal --- drivers/mtd/nand/raw/cafe_nand.c | 252 +------------------------------ 1 file changed, 6 insertions(+), 246 deletions(-) diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c index ada9c8b06a41..5b38d496d923 100644 --- a/drivers/mtd/nand/raw/cafe_nand.c +++ b/drivers/mtd/nand/raw/cafe_nand.c @@ -151,12 +151,7 @@ struct cafe_priv { struct pci_dev *pdev; void __iomem *mmio; struct rs_control *rs; - uint32_t ctl1; uint32_t ctl2; - int datalen; - int nr_data; - int data_pos; - int page_addr; bool usedma; dma_addr_t dmaaddr; unsigned char *dmabuf; @@ -184,36 +179,16 @@ static const char *part_probes[] = { "cmdlinepart", "RedBoot", NULL }; #define cafe_readl(cafe, addr) readl((cafe)->mmio + CAFE_##addr) #define cafe_writel(cafe, datum, addr) writel(datum, (cafe)->mmio + CAFE_##addr) -static int cafe_device_ready(struct nand_chip *chip) -{ - struct cafe_priv *cafe = nand_get_controller_data(chip); - int result = !!(cafe_readl(cafe, NAND_STATUS) & - CAFE_NAND_STATUS_FLASH_BUSY); - uint32_t irqs = cafe_readl(cafe, NAND_IRQ); - - cafe_writel(cafe, irqs, NAND_IRQ); - - dev_dbg(&cafe->pdev->dev, "NAND device is%s ready, IRQ %x (%x) (%x,%x)\n", - result?"":" not", irqs, cafe_readl(cafe, NAND_IRQ), - cafe_readl(cafe, GLOBAL_IRQ), cafe_readl(cafe, GLOBAL_IRQ_MASK)); - - return result; -} - - static void cafe_write_buf(struct nand_chip *chip, const uint8_t *buf, int len) { struct cafe_priv *cafe = nand_get_controller_data(chip); if (cafe->usedma) - memcpy(cafe->dmabuf + cafe->datalen, buf, len); + memcpy(cafe->dmabuf, buf, len); else - memcpy_toio(cafe->mmio + CAFE_NAND_WRITE_DATA + cafe->datalen, buf, len); + memcpy_toio(cafe->mmio + CAFE_NAND_WRITE_DATA, buf, len); - cafe->datalen += len; - - dev_dbg(&cafe->pdev->dev, "Copy 0x%x bytes to write buffer. datalen 0x%x\n", - len, cafe->datalen); + dev_dbg(&cafe->pdev->dev, "Copy 0x%x bytes to write buffer.\n", len); } static void cafe_read_buf(struct nand_chip *chip, uint8_t *buf, int len) @@ -221,214 +196,11 @@ static void cafe_read_buf(struct nand_chip *chip, uint8_t *buf, int len) struct cafe_priv *cafe = nand_get_controller_data(chip); if (cafe->usedma) - memcpy(buf, cafe->dmabuf + cafe->datalen, len); + memcpy(buf, cafe->dmabuf, len); else - memcpy_fromio(buf, cafe->mmio + CAFE_NAND_READ_DATA + cafe->datalen, len); + memcpy_fromio(buf, cafe->mmio + CAFE_NAND_READ_DATA, len); - dev_dbg(&cafe->pdev->dev, "Copy 0x%x bytes from position 0x%x in read buffer.\n", - len, cafe->datalen); - cafe->datalen += len; -} - -static uint8_t cafe_read_byte(struct nand_chip *chip) -{ - struct cafe_priv *cafe = nand_get_controller_data(chip); - uint8_t d; - - cafe_read_buf(chip, &d, 1); - dev_dbg(&cafe->pdev->dev, "Read %02x\n", d); - - return d; -} - -static void cafe_nand_cmdfunc(struct nand_chip *chip, unsigned command, - int column, int page_addr) -{ - struct mtd_info *mtd = nand_to_mtd(chip); - struct cafe_priv *cafe = nand_get_controller_data(chip); - int adrbytes = 0; - uint32_t ctl1; - uint32_t doneint = CAFE_NAND_IRQ_CMD_DONE; - - dev_dbg(&cafe->pdev->dev, "cmdfunc %02x, 0x%x, 0x%x\n", - command, column, page_addr); - - if (command == NAND_CMD_ERASE2 || command == NAND_CMD_PAGEPROG) { - /* Second half of a command we already calculated */ - cafe_writel(cafe, - cafe->ctl2 | - CAFE_NAND_CTRL2_CMD2 | - CAFE_FIELD_PREP(NAND_CTRL2, CMD2, command), - NAND_CTRL2); - ctl1 = cafe->ctl1; - dev_dbg(&cafe->pdev->dev, "Continue command, ctl1 %08x, #data %d\n", - cafe->ctl1, cafe->nr_data); - goto do_command; - } - /* Reset ECC engine */ - cafe_writel(cafe, 0, NAND_CTRL2); - - /* Emulate NAND_CMD_READOOB on large-page chips */ - if (mtd->writesize > 512 && - command == NAND_CMD_READOOB) { - column += mtd->writesize; - command = NAND_CMD_READ0; - } - - /* FIXME: Do we need to send read command before sending data - for small-page chips, to position the buffer correctly? */ - - if (column != -1) { - cafe_writel(cafe, column, NAND_ADDR1); - adrbytes = 2; - if (page_addr != -1) - goto write_adr2; - } else if (page_addr != -1) { - cafe_writel(cafe, page_addr & 0xffff, NAND_ADDR1); - page_addr >>= 16; - write_adr2: - cafe_writel(cafe, page_addr, NAND_ADDR2); - adrbytes += 2; - if (mtd->size > mtd->writesize << 16) - adrbytes++; - } - - cafe->data_pos = cafe->datalen = 0; - - /* Set command valid bit, mask in the chip select bit */ - ctl1 = CAFE_NAND_CTRL1_HAS_CMD | - CAFE_FIELD_PREP(NAND_CTRL1, CMD, command) | - (cafe->ctl1 & CAFE_NAND_CTRL1_CE); - - /* Set RD or WR bits as appropriate */ - if (command == NAND_CMD_READID || command == NAND_CMD_STATUS) { - ctl1 |= CAFE_NAND_CTRL1_HAS_DATA_IN; - /* Always 5 bytes, for now */ - cafe->datalen = 4; - /* And one address cycle -- even for STATUS, since the controller doesn't work without */ - adrbytes = 1; - } else if (command == NAND_CMD_READ0 || command == NAND_CMD_READ1 || - command == NAND_CMD_READOOB || command == NAND_CMD_RNDOUT) { - ctl1 |= CAFE_NAND_CTRL1_HAS_DATA_IN; - /* For now, assume just read to end of page */ - cafe->datalen = mtd->writesize + mtd->oobsize - column; - } else if (command == NAND_CMD_SEQIN) - ctl1 |= CAFE_NAND_CTRL1_HAS_DATA_OUT; - - /* Set number of address bytes */ - if (adrbytes) - ctl1 |= CAFE_NAND_CTRL1_HAS_ADDR | - CAFE_FIELD_PREP(NAND_CTRL1, NUM_ADDR_CYC, adrbytes - 1); - - if (command == NAND_CMD_SEQIN || command == NAND_CMD_ERASE1) { - /* Ignore the first command of a pair; the hardware - deals with them both at once, later */ - cafe->ctl1 = ctl1; - dev_dbg(&cafe->pdev->dev, "Setup for delayed command, ctl1 %08x, dlen %x\n", - cafe->ctl1, cafe->datalen); - return; - } - /* RNDOUT and READ0 commands need a following byte */ - if (command == NAND_CMD_RNDOUT) - cafe_writel(cafe, - cafe->ctl2 | CAFE_NAND_CTRL2_CMD2 | - CAFE_FIELD_PREP(NAND_CTRL2, CMD2, NAND_CMD_RNDOUTSTART), - NAND_CTRL2); - else if (command == NAND_CMD_READ0 && mtd->writesize > 512) - cafe_writel(cafe, - cafe->ctl2 | CAFE_NAND_CTRL2_CMD2 | - CAFE_FIELD_PREP(NAND_CTRL2, CMD2, NAND_CMD_READSTART), - NAND_CTRL2); - - do_command: - dev_dbg(&cafe->pdev->dev, "dlen %x, ctl1 %x, ctl2 %x\n", - cafe->datalen, ctl1, cafe_readl(cafe, NAND_CTRL2)); - - /* NB: The datasheet lies -- we really should be subtracting 1 here */ - cafe_writel(cafe, cafe->datalen, NAND_DATA_LEN); - cafe_writel(cafe, CAFE_NAND_IRQ_CMD_DONE | CAFE_NAND_IRQ_DMA_DONE, - NAND_IRQ); - if (cafe->usedma && - (ctl1 & (CAFE_NAND_CTRL1_HAS_DATA_IN | - CAFE_NAND_CTRL1_HAS_DATA_OUT))) { - uint32_t dmactl = CAFE_NAND_DMA_CTRL_ENABLE | - CAFE_NAND_DMA_CTRL_RESERVED; - - dmactl |= CAFE_FIELD_PREP(NAND_DMA_CTRL, DATA_LEN, - cafe->datalen); - /* If WR or RD bits set, set up DMA */ - if (ctl1 & CAFE_NAND_CTRL1_HAS_DATA_IN) { - /* It's a read */ - dmactl |= CAFE_NAND_DMA_CTRL_DATA_IN; - /* ... so it's done when the DMA is done, not just - the command. */ - doneint = CAFE_NAND_IRQ_DMA_DONE; - } - cafe_writel(cafe, dmactl, NAND_DMA_CTRL); - } - cafe->datalen = 0; - - if (unlikely(regdebug)) { - int i; - printk("About to write command %08x to register 0\n", ctl1); - for (i=4; i< 0x5c; i+=4) - printk("Register %x: %08x\n", i, readl(cafe->mmio + i)); - } - - cafe_writel(cafe, ctl1, NAND_CTRL1); - /* Apply this short delay always to ensure that we do wait tWB in - * any case on any machine. */ - ndelay(100); - - if (1) { - int c; - uint32_t irqs; - - for (c = 500000; c != 0; c--) { - irqs = cafe_readl(cafe, NAND_IRQ); - if (irqs & doneint) - break; - udelay(1); - if (!(c % 100000)) - dev_dbg(&cafe->pdev->dev, "Wait for ready, IRQ %x\n", irqs); - cpu_relax(); - } - cafe_writel(cafe, doneint, NAND_IRQ); - dev_dbg(&cafe->pdev->dev, "Command %x completed after %d usec, irqs %x (%x)\n", - command, 500000-c, irqs, cafe_readl(cafe, NAND_IRQ)); - } - - WARN_ON(cafe->ctl2 & CAFE_NAND_CTRL2_AUTO_WRITE_ECC); - - switch (command) { - - case NAND_CMD_CACHEDPROG: - case NAND_CMD_PAGEPROG: - case NAND_CMD_ERASE1: - case NAND_CMD_ERASE2: - case NAND_CMD_SEQIN: - case NAND_CMD_RNDIN: - case NAND_CMD_STATUS: - case NAND_CMD_RNDOUT: - cafe_writel(cafe, cafe->ctl2, NAND_CTRL2); - return; - } - nand_wait_ready(chip); - cafe_writel(cafe, cafe->ctl2, NAND_CTRL2); -} - -static void cafe_select_chip(struct nand_chip *chip, int chipnr) -{ - struct cafe_priv *cafe = nand_get_controller_data(chip); - - if (chipnr < 0 || chipnr > 1) - return; - - dev_dbg(&cafe->pdev->dev, "select_chip %d\n", chipnr); - - /* Mask the appropriate bit into the stored value of ctl1 - which will be used by cafe_nand_cmdfunc() */ - cafe->ctl1 |= CAFE_FIELD_PREP(NAND_CTRL1, CE, chipnr); + dev_dbg(&cafe->pdev->dev, "Copy 0x%x bytes from read buffer.\n", len); } static irqreturn_t cafe_nand_interrupt(int irq, void *id) @@ -788,7 +560,6 @@ static int cafe_nand_exec_subop(struct nand_chip *chip, if (WARN_ON(subop->cs > 1)) return -EINVAL; - cafe->datalen = 0; ctrl1 |= CAFE_FIELD_PREP(NAND_CTRL1, CE, subop->cs); for (i = 0; i < subop->ninstrs; i++) { @@ -1018,17 +789,6 @@ static int cafe_nand_probe(struct pci_dev *pdev, goto out_ior; } - cafe->nand.legacy.cmdfunc = cafe_nand_cmdfunc; - cafe->nand.legacy.dev_ready = cafe_device_ready; - cafe->nand.legacy.read_byte = cafe_read_byte; - cafe->nand.legacy.read_buf = cafe_read_buf; - cafe->nand.legacy.write_buf = cafe_write_buf; - cafe->nand.legacy.select_chip = cafe_select_chip; - cafe->nand.legacy.set_features = nand_get_set_features_notsupp; - cafe->nand.legacy.get_features = nand_get_set_features_notsupp; - - cafe->nand.legacy.chip_delay = 0; - /* Enable the following for a flash based bad block table */ cafe->nand.bbt_options = NAND_BBT_USE_FLASH; From patchwork Mon Apr 27 08:20:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris Brezillon X-Patchwork-Id: 1277427 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=bth0kF+N; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 499dFr45Q8z9sRf for ; Mon, 27 Apr 2020 18:28:16 +1000 (AEST) 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=lY6QreAt6C73DV4P1TXN6Z1XnXlOFAtPzMWr0w0ZRO8=; b=bth0kF+NSykxfT nGKV0fZ7a6ll17LdrkIyH7RdpeMdcg0diULghv0Brzh/CPxVsutkFSMZioQNNkCu7mzscxUskpnke Ql4XIflD6M2N933RVlmm7MYBQGLfU9c8dzfs3eS2jx/9VCGPlUJRT5BtIB6295KbllNGHjW8qLnOO 9785FTsIFsLkC7AhlvVktoAOtJCLFKU0TB/SI3BQEECvtlaX4Ge5l2QaLkbvTJdp+rs/+FHCdaTRg RhZ3w/B9wqj62gSwSV4eqrykYFmefXp+TzUUUMOP23DABxDg9a1tkiZ/8xtwFOr18ri0ZkV7Hyi/r Avaj5csaI+KydcNAY8dQ==; 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 1jSz7c-0006Up-IF; Mon, 27 Apr 2020 08:28:12 +0000 Received: from bhuna.collabora.co.uk ([2a00:1098:0:82:1000:25:2eeb:e3e3]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jSz0N-0006E3-UU for linux-mtd@lists.infradead.org; Mon, 27 Apr 2020 08:20:47 +0000 Received: from localhost.localdomain (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id A8EA32A08D5; Mon, 27 Apr 2020 09:20:40 +0100 (BST) From: Boris Brezillon To: David Woodhouse , Miquel Raynal , linux-mtd@lists.infradead.org Subject: [PATCH 15/17] mtd: rawnand: cafe: Adjust the cafe_{read, write}_buf() prototypes Date: Mon, 27 Apr 2020 10:20:25 +0200 Message-Id: <20200427082028.394719-16-boris.brezillon@collabora.com> X-Mailer: git-send-email 2.25.3 In-Reply-To: <20200427082028.394719-1-boris.brezillon@collabora.com> References: <20200427082028.394719-1-boris.brezillon@collabora.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200427_012044_230118_5C4E9738 X-CRM114-Status: GOOD ( 12.16 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Weinberger , Boris Brezillon , Vignesh Raghavendra , Tudor Ambarus Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Replace the uint8_t pointer by a void pointer and make the length unsigned so it matches what's passed through the nand instructions. Signed-off-by: Boris Brezillon Reviewed-by: Miquel Raynal --- drivers/mtd/nand/raw/cafe_nand.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c index 5b38d496d923..26495085f285 100644 --- a/drivers/mtd/nand/raw/cafe_nand.c +++ b/drivers/mtd/nand/raw/cafe_nand.c @@ -179,7 +179,8 @@ static const char *part_probes[] = { "cmdlinepart", "RedBoot", NULL }; #define cafe_readl(cafe, addr) readl((cafe)->mmio + CAFE_##addr) #define cafe_writel(cafe, datum, addr) writel(datum, (cafe)->mmio + CAFE_##addr) -static void cafe_write_buf(struct nand_chip *chip, const uint8_t *buf, int len) +static void cafe_write_buf(struct nand_chip *chip, const void *buf, + unsigned int len) { struct cafe_priv *cafe = nand_get_controller_data(chip); @@ -191,7 +192,7 @@ static void cafe_write_buf(struct nand_chip *chip, const uint8_t *buf, int len) dev_dbg(&cafe->pdev->dev, "Copy 0x%x bytes to write buffer.\n", len); } -static void cafe_read_buf(struct nand_chip *chip, uint8_t *buf, int len) +static void cafe_read_buf(struct nand_chip *chip, void *buf, unsigned int len) { struct cafe_priv *cafe = nand_get_controller_data(chip); From patchwork Mon Apr 27 08:20:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris Brezillon X-Patchwork-Id: 1277425 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=negIzHli; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 499dFg32X1z9sRf for ; Mon, 27 Apr 2020 18:28:07 +1000 (AEST) 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=sCY+rGi/V3Zl32rxbGubuZTfjrSHQHdmb6EkM6+2Dc8=; b=negIzHliug/KyI iOWe6DDcwHtzFEYz/omu5jlpTQbdIIWgPBgxMgouH7VxwRzqzTOWdw/CUXzdjZPCwB5VcSId6yTuL vfTvxdsjxKAIyODspDqUHEwQgNrFDdYu6LaG/tI5didU3NW5L+ZYyYxPGwdtqk7FdigslfoEwE7o+ /4uizWtO4S8L2spoPuMcUNCYVS7s76cs9dt90b7X3ZrPQXZp3XERqZkJFNJuh1cMa4yTBUR/GRWw1 1mcEjxT2/GQir0k+p4LdUUVHbVPRjYHc85M9SA1eEGJUV+JVTsxxUDt0SuKgLPXZuLmc0FpjY96KV pjEFxyT7Os6JZjgUqX/A==; 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 1jSz7L-0006Go-Fk; Mon, 27 Apr 2020 08:27:55 +0000 Received: from bhuna.collabora.co.uk ([2a00:1098:0:82:1000:25:2eeb:e3e3]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jSz0N-0006E4-US for linux-mtd@lists.infradead.org; Mon, 27 Apr 2020 08:20:48 +0000 Received: from localhost.localdomain (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id ED0192A08E5; Mon, 27 Apr 2020 09:20:40 +0100 (BST) From: Boris Brezillon To: David Woodhouse , Miquel Raynal , linux-mtd@lists.infradead.org Subject: [PATCH 16/17] mtd: rawnand: cafe: Handle non-32bit aligned reads/writes Date: Mon, 27 Apr 2020 10:20:26 +0200 Message-Id: <20200427082028.394719-17-boris.brezillon@collabora.com> X-Mailer: git-send-email 2.25.3 In-Reply-To: <20200427082028.394719-1-boris.brezillon@collabora.com> References: <20200427082028.394719-1-boris.brezillon@collabora.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200427_012044_238553_8E3CDF89 X-CRM114-Status: GOOD ( 13.41 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Weinberger , Boris Brezillon , Vignesh Raghavendra , Tudor Ambarus Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org The spec says the write/read buffers should be filled/read 32bits at a time. While most of the time the reads/writes are aligned on 4 bytes, we should make the implementation more robust to non-usual NAND operations. Signed-off-by: Boris Brezillon Reviewed-by: Miquel Raynal --- drivers/mtd/nand/raw/cafe_nand.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c index 26495085f285..955dc78c57be 100644 --- a/drivers/mtd/nand/raw/cafe_nand.c +++ b/drivers/mtd/nand/raw/cafe_nand.c @@ -184,10 +184,18 @@ static void cafe_write_buf(struct nand_chip *chip, const void *buf, { struct cafe_priv *cafe = nand_get_controller_data(chip); - if (cafe->usedma) + if (cafe->usedma) { memcpy(cafe->dmabuf, buf, len); - else - memcpy_toio(cafe->mmio + CAFE_NAND_WRITE_DATA, buf, len); + } else { + memcpy_toio(cafe->mmio + CAFE_NAND_WRITE_DATA, buf, + len & ~0x3); + if (len & 0x3) { + u32 tmp = 0; + + memcpy(&tmp, buf + (len & ~0x3), len & 0x3); + cafe_writel(cafe, tmp, NAND_WRITE_DATA); + } + } dev_dbg(&cafe->pdev->dev, "Copy 0x%x bytes to write buffer.\n", len); } @@ -196,10 +204,17 @@ static void cafe_read_buf(struct nand_chip *chip, void *buf, unsigned int len) { struct cafe_priv *cafe = nand_get_controller_data(chip); - if (cafe->usedma) + if (cafe->usedma) { memcpy(buf, cafe->dmabuf, len); - else - memcpy_fromio(buf, cafe->mmio + CAFE_NAND_READ_DATA, len); + } else { + memcpy_fromio(buf, cafe->mmio + CAFE_NAND_READ_DATA, + len & ~0x3); + if (len & 0x3) { + u32 tmp = cafe_readl(cafe, NAND_READ_DATA); + + memcpy(buf + (len & ~0x3), &tmp, len & 0x3); + } + } dev_dbg(&cafe->pdev->dev, "Copy 0x%x bytes from read buffer.\n", len); } From patchwork Mon Apr 27 08:20:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris Brezillon X-Patchwork-Id: 1277430 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=collabora.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20170209 header.b=EVPMVxZW; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 499dGD1FBJz9sRf for ; Mon, 27 Apr 2020 18:28:36 +1000 (AEST) 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=1SHTrjblSHBsFePcdqZ0CoNWGCepx/AOYK/YlOZ9rrE=; b=EVPMVxZWCGN9RG 3T8zvzDwLDzeiCjh+EWRf6Ja2K4Mp07fTExO3W81Ju+BTGq1fCHZw4/2a0VI2BT9Yjcmds3TLVIZ/ pR4GlzVDMS6OJV+rGmq1ppNRFMvi8RN+TabMOlcdxorJzddEbRSVKoXTZJwtoH7+/JKm9DKNZEbgG LGSs43s5nqE7o2ofwAj1NpQd0JHNOYmSPro7dk0ypxIT3hUwVS9Xyptf3T5ti4+zABea8SgAOSPi4 u3YUX6JAvSXbFMxh8Y7dCnTyF/A2LZ+hYKt6E/ilBCwZPT7rnADFJCu9+hzFY0hcAz5SI73LhDAtP urTyoi3chvfVjuYaW+cQ==; 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 1jSz7o-0006hz-Bz; Mon, 27 Apr 2020 08:28:24 +0000 Received: from bhuna.collabora.co.uk ([46.235.227.227]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jSz0P-0006Er-2K for linux-mtd@lists.infradead.org; Mon, 27 Apr 2020 08:20:50 +0000 Received: from localhost.localdomain (unknown [IPv6:2a01:e0a:2c:6930:5cf4:84a1:2763:fe0d]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: bbrezillon) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id 8E80E2A0B53; Mon, 27 Apr 2020 09:20:41 +0100 (BST) From: Boris Brezillon To: David Woodhouse , Miquel Raynal , linux-mtd@lists.infradead.org Subject: [PATCH 17/17] mtd: rawnand: s/uint{8,16,32}_t/u{8,16,32}/ Date: Mon, 27 Apr 2020 10:20:28 +0200 Message-Id: <20200427082028.394719-19-boris.brezillon@collabora.com> X-Mailer: git-send-email 2.25.3 In-Reply-To: <20200427082028.394719-1-boris.brezillon@collabora.com> References: <20200427082028.394719-1-boris.brezillon@collabora.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200427_012045_241682_6E3AC26F X-CRM114-Status: GOOD ( 14.17 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.4 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [46.235.227.227 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Weinberger , Boris Brezillon , Vignesh Raghavendra , Tudor Ambarus Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Replace uint{8,16,32}_t by u{8,16,32} to make checkpatch happy. Signed-off-by: Boris Brezillon --- drivers/mtd/nand/raw/cafe_nand.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c index 955dc78c57be..658c95804297 100644 --- a/drivers/mtd/nand/raw/cafe_nand.c +++ b/drivers/mtd/nand/raw/cafe_nand.c @@ -151,7 +151,7 @@ struct cafe_priv { struct pci_dev *pdev; void __iomem *mmio; struct rs_control *rs; - uint32_t ctl2; + u32 ctl2; bool usedma; dma_addr_t dmaaddr; unsigned char *dmabuf; @@ -224,7 +224,7 @@ static irqreturn_t cafe_nand_interrupt(int irq, void *id) struct mtd_info *mtd = id; struct nand_chip *chip = mtd_to_nand(mtd); struct cafe_priv *cafe = nand_get_controller_data(chip); - uint32_t irqs = cafe_readl(cafe, NAND_IRQ); + u32 irqs = cafe_readl(cafe, NAND_IRQ); cafe_writel(cafe, irqs & ~(CAFE_NAND_IRQ_CMD_DONE | CAFE_NAND_IRQ_DMA_DONE), NAND_IRQ); @@ -255,7 +255,7 @@ static int cafe_nand_read_oob(struct nand_chip *chip, int page) * The hw generator calculates the error syndrome automatically. Therefore * we need a special oob layout and handling. */ -static int cafe_nand_read_page(struct nand_chip *chip, uint8_t *buf, +static int cafe_nand_read_page(struct nand_chip *chip, u8 *buf, int oob_required, int page) { struct mtd_info *mtd = nand_to_mtd(chip); @@ -283,8 +283,8 @@ static int cafe_nand_read_page(struct nand_chip *chip, uint8_t *buf, int i, n; for (i=0; i<8; i+=2) { - uint32_t tmp = cafe_readl(cafe, NAND_ECC_SYN_REG(i)); - uint16_t idx; + u32 tmp = cafe_readl(cafe, NAND_ECC_SYN_REG(i)); + u16 idx; idx = FIELD_GET(CAFE_NAND_ECC_SYN_FIELD(i), tmp); syn[i] = cafe->rs->codec->index_of[idx]; @@ -380,11 +380,11 @@ static const struct mtd_ooblayout_ops cafe_ooblayout_ops = { /* Ick. The BBT code really ought to be able to work this bit out for itself from the above, at least for the 2KiB case */ -static uint8_t cafe_bbt_pattern_2048[] = { 'B', 'b', 't', '0' }; -static uint8_t cafe_mirror_pattern_2048[] = { '1', 't', 'b', 'B' }; +static u8 cafe_bbt_pattern_2048[] = { 'B', 'b', 't', '0' }; +static u8 cafe_mirror_pattern_2048[] = { '1', 't', 'b', 'B' }; -static uint8_t cafe_bbt_pattern_512[] = { 0xBB }; -static uint8_t cafe_mirror_pattern_512[] = { 0xBC }; +static u8 cafe_bbt_pattern_512[] = { 0xBB }; +static u8 cafe_mirror_pattern_512[] = { 0xBC }; static struct nand_bbt_descr cafe_bbt_main_descr_2048 = { @@ -429,7 +429,7 @@ static struct nand_bbt_descr cafe_bbt_mirror_descr_512 = { static int cafe_nand_write_page(struct nand_chip *chip, - const uint8_t *buf, int oob_required, + const u8 *buf, int oob_required, int page) { struct mtd_info *mtd = nand_to_mtd(chip);