Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp2832388pxv; Mon, 12 Jul 2021 03:03:44 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwCScaOgngwFpGn3dAUO/LvatSmVdbSRnjyaEQnWZ19aBNo4RzXSF+SY+YRU+3BVTjjIEsc X-Received: by 2002:a05:6638:380b:: with SMTP id i11mr43472949jav.57.1626084224495; Mon, 12 Jul 2021 03:03:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626084224; cv=none; d=google.com; s=arc-20160816; b=hWillPHoZ7dZRnsNxYzQG/6rPXALcMBnXBWUct/kW8ZAKh6zc0VsqIVXxay3T2KnIR L+zlQwjG9iijn9pojmJOjzkoDjAWC84eG0+lWDjwLwOp1LR91VaUFner2XYQzmk3VVsd lfZAkQTuqrJn2Yi85awK7xSbeVnsfu/GP0WmFkxWV8V3IXjFCgXVj6TvaMzM8gZT9GyS yLN1WxEIvLPYmuOONdCWOYSQRI2330MuIs/DpoMmQTQxdAj2he+Q1YxP6uiTYArbnIA1 6I0qzmB5JkybN2txs0LTCofP9+N1IBEpzAEPxz9GaGNfPcuaYod2qP8be6GUnqGsJl/A 7Lsw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=52iMFj86idwz83LWaAEidDY5KUXXOj7I3+GmZ1+1Nlk=; b=HS9v9iq5IlHS7109J1yP25/ljU1VfG/i+mdpX0X86XzWuR7QBP8rx/f8paTFwSSlMx xLcJ0B71K17IdaLi0s3oVmRyhcB88AqD496fDGQnu4vq1vvZOAVwtc1K/rW0giEp2BxA mNgEaNIzcMrZu3qhk3/Bd9VcadqP2xGOa6W/Nj2Bfhqg+RLUeQtJ5xdXiFTG9OBJw2OP a4MOlIVNjisWi/MoQAJj973Yjz3kEu1MBZ5vuVPyXP0zfBH3UV3xmqpTxIlKqfOgCo2l bo5jRR/5KBJ4j9rrhlNOH6rieLRIqlYNPuEoK4X8XXp7pnxRrfaCT2TZS0jzf0RPt5GX 3X9g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=Kou9tyfy; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id q4si7363513ils.118.2021.07.12.03.03.32; Mon, 12 Jul 2021 03:03:44 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=Kou9tyfy; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344376AbhGLHUb (ORCPT + 99 others); Mon, 12 Jul 2021 03:20:31 -0400 Received: from mail.kernel.org ([198.145.29.99]:49170 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239205AbhGLGtb (ORCPT ); Mon, 12 Jul 2021 02:49:31 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 64BA861106; Mon, 12 Jul 2021 06:46:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626072399; bh=sEwMg+eoMcrVaD1eHQgAKL9veI66PO3MnXlMlxX3Mew=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Kou9tyfyAlWIXQ9Av0+hzJXcFzUsOHdqUV5OMvp07Zns33YNZ9oNnB9r3PU7l/f35 Ifj+U8Y6TWjoK8DHv2OaLJGYgyll6+skEQd9XZuGx/Phaaac2V4cOURXJpcUZK2D5a HnyP+EUOUBEQ6B6xgAws/NH4tb1vqllpBdQUE2rE= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Miquel Raynal , Sasha Levin Subject: [PATCH 5.10 474/593] mtd: rawnand: arasan: Ensure proper configuration for the asserted target Date: Mon, 12 Jul 2021 08:10:34 +0200 Message-Id: <20210712060942.263932704@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210712060843.180606720@linuxfoundation.org> References: <20210712060843.180606720@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Miquel Raynal [ Upstream commit b5437c7b682c9a505065b4ab4716cdc951dc3c7c ] The controller being always asserting one CS or the other, there is no need to actually select the right target before doing a page read/write. However, the anfc_select_target() helper actually also changes the timing configuration and clock in the case were two different NAND chips with different timing requirements would be used. In this situation, we must ensure proper configuration of the controller by calling it. As a consequence of this change, the anfc_select_target() helper is being moved earlier in the driver. Fixes: 88ffef1b65cf ("mtd: rawnand: arasan: Support the hardware BCH ECC engine") Signed-off-by: Miquel Raynal Link: https://lore.kernel.org/linux-mtd/20210526093242.183847-4-miquel.raynal@bootlin.com Signed-off-by: Sasha Levin --- drivers/mtd/nand/raw/arasan-nand-controller.c | 90 ++++++++++++------- 1 file changed, 57 insertions(+), 33 deletions(-) diff --git a/drivers/mtd/nand/raw/arasan-nand-controller.c b/drivers/mtd/nand/raw/arasan-nand-controller.c index fbb4ea751be8..0ee3192916d9 100644 --- a/drivers/mtd/nand/raw/arasan-nand-controller.c +++ b/drivers/mtd/nand/raw/arasan-nand-controller.c @@ -272,6 +272,37 @@ static int anfc_pkt_len_config(unsigned int len, unsigned int *steps, return 0; } +static int anfc_select_target(struct nand_chip *chip, int target) +{ + struct anand *anand = to_anand(chip); + struct arasan_nfc *nfc = to_anfc(chip->controller); + int ret; + + /* Update the controller timings and the potential ECC configuration */ + writel_relaxed(anand->timings, nfc->base + DATA_INTERFACE_REG); + + /* Update clock frequency */ + if (nfc->cur_clk != anand->clk) { + clk_disable_unprepare(nfc->controller_clk); + ret = clk_set_rate(nfc->controller_clk, anand->clk); + if (ret) { + dev_err(nfc->dev, "Failed to change clock rate\n"); + return ret; + } + + ret = clk_prepare_enable(nfc->controller_clk); + if (ret) { + dev_err(nfc->dev, + "Failed to re-enable the controller clock\n"); + return ret; + } + + nfc->cur_clk = anand->clk; + } + + return 0; +} + /* * When using the embedded hardware ECC engine, the controller is in charge of * feeding the engine with, first, the ECC residue present in the data array. @@ -400,6 +431,18 @@ static int anfc_read_page_hw_ecc(struct nand_chip *chip, u8 *buf, return 0; } +static int anfc_sel_read_page_hw_ecc(struct nand_chip *chip, u8 *buf, + int oob_required, int page) +{ + int ret; + + ret = anfc_select_target(chip, chip->cur_cs); + if (ret) + return ret; + + return anfc_read_page_hw_ecc(chip, buf, oob_required, page); +}; + static int anfc_write_page_hw_ecc(struct nand_chip *chip, const u8 *buf, int oob_required, int page) { @@ -460,6 +503,18 @@ static int anfc_write_page_hw_ecc(struct nand_chip *chip, const u8 *buf, return ret; } +static int anfc_sel_write_page_hw_ecc(struct nand_chip *chip, const u8 *buf, + int oob_required, int page) +{ + int ret; + + ret = anfc_select_target(chip, chip->cur_cs); + if (ret) + return ret; + + return anfc_write_page_hw_ecc(chip, buf, oob_required, page); +}; + /* NAND framework ->exec_op() hooks and related helpers */ static int anfc_parse_instructions(struct nand_chip *chip, const struct nand_subop *subop, @@ -752,37 +807,6 @@ static const struct nand_op_parser anfc_op_parser = NAND_OP_PARSER( NAND_OP_PARSER_PAT_WAITRDY_ELEM(false)), ); -static int anfc_select_target(struct nand_chip *chip, int target) -{ - struct anand *anand = to_anand(chip); - struct arasan_nfc *nfc = to_anfc(chip->controller); - int ret; - - /* Update the controller timings and the potential ECC configuration */ - writel_relaxed(anand->timings, nfc->base + DATA_INTERFACE_REG); - - /* Update clock frequency */ - if (nfc->cur_clk != anand->clk) { - clk_disable_unprepare(nfc->controller_clk); - ret = clk_set_rate(nfc->controller_clk, anand->clk); - if (ret) { - dev_err(nfc->dev, "Failed to change clock rate\n"); - return ret; - } - - ret = clk_prepare_enable(nfc->controller_clk); - if (ret) { - dev_err(nfc->dev, - "Failed to re-enable the controller clock\n"); - return ret; - } - - nfc->cur_clk = anand->clk; - } - - return 0; -} - static int anfc_check_op(struct nand_chip *chip, const struct nand_operation *op) { @@ -1006,8 +1030,8 @@ static int anfc_init_hw_ecc_controller(struct arasan_nfc *nfc, if (!anand->bch) return -EINVAL; - ecc->read_page = anfc_read_page_hw_ecc; - ecc->write_page = anfc_write_page_hw_ecc; + ecc->read_page = anfc_sel_read_page_hw_ecc; + ecc->write_page = anfc_sel_write_page_hw_ecc; return 0; } -- 2.30.2