Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp1311998ybi; Thu, 30 May 2019 15:25:54 -0700 (PDT) X-Google-Smtp-Source: APXvYqzDMWLg7il0IDADluiWO9i1S+fYV63zHhfm1km0rs0/9wqgnnd2fYsOH7qnv4H/rQrSoH6R X-Received: by 2002:a17:90a:26a9:: with SMTP id m38mr5498082pje.50.1559255154038; Thu, 30 May 2019 15:25:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559255154; cv=none; d=google.com; s=arc-20160816; b=mo+fpNHOdKFDe+xGw+g4klD/A/vXckG0sFKTmScIFGmmKAsn8o7V5zm9amvnSYLuFW QW5mbWL0jyfmUVDcGKQoE9wJdhuh7aPtOpqrSSU195Rkfv8JgAgqPiQrwtL+HpUkmfTZ pOXRRBPwc8Y5oQN+3lgAIRfXd2ne/wnrOrWvoJiQ5RWoX66ODQs1JglQyaIUAsbW8rla J8Dp9+emzueDeF5rvzK5O8gUVOBW/f1a1c9DkdRTkEMbO2TszoteWaYVfrLf6vIikZlg 0+DlY9V+2yDzPqlvnumCXEQn5Mt2QcYwovScrcyhBJ67zgxfBw0WAtY8KUGpDhs6vN8b p9Yg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature; bh=T3N4h0dd1g4eImz2VJjO/VLzKH6Oo3mPTeCW7MahZFg=; b=OCensbZw+VZjzyR1KUTldmeNUP3Hj6ykFSAuTaz8Q3dtOvtZs9wI+YYjQH0a/nKj7Z A+I7kXaHnd657u2SMQ9OJ1KAhdDdwMykzD7hPsybnq5MhDVIr+4SPtvXWB3+ULg+ywjk CC++osihCQgCWc6L3yFeNW2EwWtxSIORhlWXNRyUT68GfGBdIjPn+upWJ7q0A2RrBMSO g8A31DSM938pP5nHch2pdq4X/aoqqQt5hol/awH7dXPWpmvBhv4Ar8jgijjwN1fpCPUq eLGtqrLbwSeBWY5Y6MWEOqeZJm43bbtrTRcJ6DNV5d5frrt2BcFp07Js6XzWlwf13lso guIQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=DJ2xQQj3; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f127si4559758pfa.221.2019.05.30.15.25.38; Thu, 30 May 2019 15:25:54 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=DJ2xQQj3; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726682AbfE3WXe (ORCPT + 99 others); Thu, 30 May 2019 18:23:34 -0400 Received: from mail-ed1-f65.google.com ([209.85.208.65]:40514 "EHLO mail-ed1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726045AbfE3WXe (ORCPT ); Thu, 30 May 2019 18:23:34 -0400 Received: by mail-ed1-f65.google.com with SMTP id r18so10317667edo.7 for ; Thu, 30 May 2019 15:23:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=T3N4h0dd1g4eImz2VJjO/VLzKH6Oo3mPTeCW7MahZFg=; b=DJ2xQQj3Wv5aqtiVGdC8ig1iBpw+w1kN+HslWeWF/gIuLsdA6EM5M94ErpdQHwj1LA qICkmzSQ7wUcLe8jcPoeKpyTI+LMO85ztQMH5nk+qNqwT5CRiieidfa0ApiKVpOIjZNa aZLHuoZjnodUIH4jQtz22KBnJq7Vg32jmamVkRO6Zjp4HdCcoMb5fG9Z03LikKwYFUPu l+PXZW55rIYg/2qZt0L3ZHV+KG6CWg7NLKkxNU4vIZ9dXQqLy4pIm9572myIapCcQslf d2cPv8NrR5l5buHFjSgkGTLsJchO8VM1FWBX0YPiNJ3QfrbQueRwOmFJgCwmBJtrIcfF 4nxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=T3N4h0dd1g4eImz2VJjO/VLzKH6Oo3mPTeCW7MahZFg=; b=D3I33d4h4rku6rEJxqM4qUm+aoAl/nNlkh/rKwK1S8asbLOf+ipklZw0iIkBuoNEzI 1yWV7MwJg4oh175Qf5+zfT/OJLIZfrFhwP1kvKjtkCGYnu7GbCsGJdM5mC7M1hIcYMA6 tSNuxNcyWN0KWmDtSfrKIANPwnk4i1pRR7Uz45EzogW0oqWPmtWIel1pC/JPCW9rK5D/ ad1FBBqeNdtnPXSq1buSRyEpPlUgVtcDWNcFbdS53or/iMSPC+SRl5wO9QJQfUunKX56 bJak28+nESvSlS/H1nKm9tHt/oJ5+Gxlk2MnDxndjuvsYpx6rf/rQ/+KpGsWsP3/dHI2 RoXw== X-Gm-Message-State: APjAAAVOYyzf/PiyIhKKHERmT826CX87gvEAeYDZYIJY96TwSuTQLTO/ AM3RH2b1tNfv5LZZCVsVyGYfAjDk X-Received: by 2002:a50:fb01:: with SMTP id d1mr7167712edq.267.1559251265570; Thu, 30 May 2019 14:21:05 -0700 (PDT) Received: from mail.broadcom.com ([192.19.231.250]) by smtp.gmail.com with ESMTPSA id h25sm597082ejz.10.2019.05.30.14.21.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 30 May 2019 14:21:04 -0700 (PDT) From: Kamal Dasu To: linux-mtd@lists.infradead.org Cc: bcm-kernel-feedback-list@broadcom.com, linux-kernel@vger.kernel.org, Kamal Dasu , Brian Norris , Miquel Raynal , Richard Weinberger , David Woodhouse , Marek Vasut , Vignesh Raghavendra Subject: [PATCH 1/3] mtd: nand: raw: brcmnand: Refactored code and introduced inline functions Date: Thu, 30 May 2019 17:20:35 -0400 Message-Id: <1559251257-12383-1-git-send-email-kdasu.kdev@gmail.com> X-Mailer: git-send-email 1.9.0.138.g2de3478 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Refactored NAND ECC and CMD address configuration code to use inline functions. Signed-off-by: Kamal Dasu --- drivers/mtd/nand/raw/brcmnand/brcmnand.c | 100 +++++++++++++++++++------------ 1 file changed, 62 insertions(+), 38 deletions(-) diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c b/drivers/mtd/nand/raw/brcmnand/brcmnand.c index ce0b8ff..77b7850 100644 --- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c +++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c @@ -588,6 +588,54 @@ static inline void brcmnand_write_fc(struct brcmnand_controller *ctrl, __raw_writel(val, ctrl->nand_fc + word * 4); } +static inline void brcmnand_clear_ecc_addr(struct brcmnand_controller *ctrl) +{ + + /* Clear error addresses */ + brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_ADDR, 0); + brcmnand_write_reg(ctrl, BRCMNAND_CORR_ADDR, 0); + brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_EXT_ADDR, 0); + brcmnand_write_reg(ctrl, BRCMNAND_CORR_EXT_ADDR, 0); +} + +static inline u64 brcmnand_get_uncorrecc_addr(struct brcmnand_controller *ctrl) +{ + u64 err_addr; + + err_addr = brcmnand_read_reg(ctrl, BRCMNAND_UNCORR_ADDR); + err_addr |= ((u64)(brcmnand_read_reg(ctrl, + BRCMNAND_UNCORR_EXT_ADDR) + & 0xffff) << 32); + + return err_addr; +} + +static inline u64 brcmnand_get_correcc_addr(struct brcmnand_controller *ctrl) +{ + u64 err_addr; + + err_addr = brcmnand_read_reg(ctrl, BRCMNAND_CORR_ADDR); + err_addr |= ((u64)(brcmnand_read_reg(ctrl, + BRCMNAND_CORR_EXT_ADDR) + & 0xffff) << 32); + + return err_addr; +} + +static inline void brcmnand_set_cmd_addr(struct mtd_info *mtd, u64 addr) +{ + struct nand_chip *chip = mtd_to_nand(mtd); + struct brcmnand_host *host = nand_get_controller_data(chip); + struct brcmnand_controller *ctrl = host->ctrl; + + brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS, + (host->cs << 16) | ((addr >> 32) & 0xffff)); + (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS); + brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, + lower_32_bits(addr)); + (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); +} + static inline u16 brcmnand_cs_offset(struct brcmnand_controller *ctrl, int cs, enum brcmnand_cs_reg reg) { @@ -1213,9 +1261,12 @@ static void brcmnand_send_cmd(struct brcmnand_host *host, int cmd) { struct brcmnand_controller *ctrl = host->ctrl; int ret; + u64 cmd_addr; + + cmd_addr = brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); + + dev_dbg(ctrl->dev, "send native cmd %d addr 0x%llx\n", cmd, cmd_addr); - dev_dbg(ctrl->dev, "send native cmd %d addr_lo 0x%x\n", cmd, - brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS)); BUG_ON(ctrl->cmd_pending != 0); ctrl->cmd_pending = cmd; @@ -1374,12 +1425,7 @@ static void brcmnand_cmdfunc(struct nand_chip *chip, unsigned command, if (!native_cmd) return; - brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS, - (host->cs << 16) | ((addr >> 32) & 0xffff)); - (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS); - brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, lower_32_bits(addr)); - (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); - + brcmnand_set_cmd_addr(mtd, addr); brcmnand_send_cmd(host, native_cmd); brcmnand_waitfunc(chip); @@ -1597,20 +1643,10 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip, struct brcmnand_controller *ctrl = host->ctrl; int i, j, ret = 0; - /* Clear error addresses */ - brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_ADDR, 0); - brcmnand_write_reg(ctrl, BRCMNAND_CORR_ADDR, 0); - brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_EXT_ADDR, 0); - brcmnand_write_reg(ctrl, BRCMNAND_CORR_EXT_ADDR, 0); - - brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS, - (host->cs << 16) | ((addr >> 32) & 0xffff)); - (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS); + brcmnand_clear_ecc_addr(ctrl); for (i = 0; i < trans; i++, addr += FC_BYTES) { - brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, - lower_32_bits(addr)); - (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); + brcmnand_set_cmd_addr(mtd, addr); /* SPARE_AREA_READ does not use ECC, so just use PAGE_READ */ brcmnand_send_cmd(host, CMD_PAGE_READ); brcmnand_waitfunc(chip); @@ -1630,21 +1666,15 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip, host->hwcfg.sector_size_1k); if (!ret) { - *err_addr = brcmnand_read_reg(ctrl, - BRCMNAND_UNCORR_ADDR) | - ((u64)(brcmnand_read_reg(ctrl, - BRCMNAND_UNCORR_EXT_ADDR) - & 0xffff) << 32); + *err_addr = brcmnand_get_uncorrecc_addr(ctrl); + if (*err_addr) ret = -EBADMSG; } if (!ret) { - *err_addr = brcmnand_read_reg(ctrl, - BRCMNAND_CORR_ADDR) | - ((u64)(brcmnand_read_reg(ctrl, - BRCMNAND_CORR_EXT_ADDR) - & 0xffff) << 32); + *err_addr = brcmnand_get_correcc_addr(ctrl); + if (*err_addr) ret = -EUCLEAN; } @@ -1711,7 +1741,7 @@ static int brcmnand_read(struct mtd_info *mtd, struct nand_chip *chip, dev_dbg(ctrl->dev, "read %llx -> %p\n", (unsigned long long)addr, buf); try_dmaread: - brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_COUNT, 0); + brcmnand_clear_ecc_addr(ctrl); if (has_flash_dma(ctrl) && !oob && flash_dma_buf_ok(buf)) { err = brcmnand_dma_trans(host, addr, buf, trans * FC_BYTES, @@ -1858,15 +1888,9 @@ static int brcmnand_write(struct mtd_info *mtd, struct nand_chip *chip, goto out; } - brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS, - (host->cs << 16) | ((addr >> 32) & 0xffff)); - (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS); - for (i = 0; i < trans; i++, addr += FC_BYTES) { /* full address MUST be set before populating FC */ - brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, - lower_32_bits(addr)); - (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); + brcmnand_set_cmd_addr(mtd, addr); if (buf) { brcmnand_soc_data_bus_prepare(ctrl->soc, false); -- 1.9.0.138.g2de3478