From patchwork Sat Nov 26 18:06:24 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Masahiro Yamada X-Patchwork-Id: 84304 Delivered-To: patch@linaro.org Received: by 10.182.1.168 with SMTP id 8csp788130obn; Sat, 26 Nov 2016 10:14:36 -0800 (PST) X-Received: by 10.99.67.7 with SMTP id q7mr25031997pga.45.1480184076598; Sat, 26 Nov 2016 10:14:36 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s3si49438657pfe.68.2016.11.26.10.14.36; Sat, 26 Nov 2016 10:14:36 -0800 (PST) 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=@nifty.com; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753450AbcKZSOY (ORCPT + 25 others); Sat, 26 Nov 2016 13:14:24 -0500 Received: from conuserg-11.nifty.com ([210.131.2.78]:48186 "EHLO conuserg-11.nifty.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753190AbcKZSIW (ORCPT ); Sat, 26 Nov 2016 13:08:22 -0500 Received: from grover.sesame (FL1-111-169-71-157.osk.mesh.ad.jp [111.169.71.157]) (authenticated) by conuserg-11.nifty.com with ESMTP id uAQI6UfA018512; Sun, 27 Nov 2016 03:07:03 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conuserg-11.nifty.com uAQI6UfA018512 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.com; s=dec2015msa; t=1480183624; bh=UwPgN61EAHCTKgKAs0QUtS5wqv8IcaO8GI0GWBL/TOI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PwrQNzPSkADjfX9R1Mcv6TuwEQQeXop0a9W4nvIHZj/WWXpldbmMrS6YhdqRGv90M 7+tcpzXyVJliNLeKo5/vm0WCPC/7rOiP/ZRFAUrE7hgL9h5HJPvOUmy4L4JMJMYKyz AyRn/bzdq6udRch1gpjs7yPJswZQIMp8KvPkxiA1jF+0TP2MKqzYS9O2MEtP0bnVjQ q/RSa9A92pTiEtsTmhx74SRQhpfYej1ie2qOB7R279na93XC4d30F2DpVBKrylfgbk ta5bA90M0tu/U64iKghKcODgZZAdXMSmAiiS0UgsacdrBnSjDyPOpvhLzvHksikyFB OGfpOrUauQf1Q== X-Nifty-SrcIP: [111.169.71.157] From: Masahiro Yamada To: linux-mtd@lists.infradead.org Cc: Masahiro Yamada , linux-kernel@vger.kernel.org, Boris Brezillon , Marek Vasut , Brian Norris , Richard Weinberger , David Woodhouse , Cyrille Pitchen Subject: [PATCH 38/39] mtd: nand: denali: remove Toshiba, Hynix specific fixup code Date: Sun, 27 Nov 2016 03:06:24 +0900 Message-Id: <1480183585-592-39-git-send-email-yamada.masahiro@socionext.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1480183585-592-1-git-send-email-yamada.masahiro@socionext.com> References: <1480183585-592-1-git-send-email-yamada.masahiro@socionext.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The Denali IP can automatically detect device parameters such as page size, device width, etc. and this driver currently relies on it. However, this hardware function is problematic. [1] Due to a hardware bug, various misdetected cases are known. That is why get_toshiba_nand_para(), get_hynix_nand_para() exist to fix the misdetected parameters. It is not realistic to add a new NAND device to the *black list* every time we are hit by a misdetected case. We would never be able to guarantee that all the cases are covered. [2] Because this feature is unreliable, it is disabled on some platforms. The nand_scan_ident() sets device parameters such as mtd->writesize, mtd->erasesize, etc. in a more tested way. We should not set the hardware registers in a different, unreliable way. Instead, set the parameters from nand_scan_ident() back to the registers. Signed-off-by: Masahiro Yamada --- drivers/mtd/nand/denali.c | 39 ++++++--------------------------------- 1 file changed, 6 insertions(+), 33 deletions(-) -- 2.7.4 diff --git a/drivers/mtd/nand/denali.c b/drivers/mtd/nand/denali.c index df174ca..1aa19ec 100644 --- a/drivers/mtd/nand/denali.c +++ b/drivers/mtd/nand/denali.c @@ -338,35 +338,6 @@ static void get_samsung_nand_para(struct denali_nand_info *denali, u8 device_id) } } -static void get_toshiba_nand_para(struct denali_nand_info *denali) -{ - /* - * Workaround to fix a controller bug which reports a wrong - * spare area size for some kind of Toshiba NAND device - */ - if ((ioread32(denali->flash_reg + DEVICE_MAIN_AREA_SIZE) == 4096) && - (ioread32(denali->flash_reg + DEVICE_SPARE_AREA_SIZE) == 64)) - iowrite32(216, denali->flash_reg + DEVICE_SPARE_AREA_SIZE); -} - -static void get_hynix_nand_para(struct denali_nand_info *denali, u8 device_id) -{ - switch (device_id) { - case 0xD5: /* Hynix H27UAG8T2A, H27UBG8U5A or H27UCG8VFA */ - case 0xD7: /* Hynix H27UDG8VEM, H27UCG8UDM or H27UCG8V5A */ - iowrite32(128, denali->flash_reg + PAGES_PER_BLOCK); - iowrite32(4096, denali->flash_reg + DEVICE_MAIN_AREA_SIZE); - iowrite32(224, denali->flash_reg + DEVICE_SPARE_AREA_SIZE); - iowrite32(0, denali->flash_reg + DEVICE_WIDTH); - break; - default: - dev_warn(denali->dev, - "Unknown Hynix NAND (Device ID: 0x%x).\n" - "Will use default parameter values instead.\n", - device_id); - } -} - /* * determines how many NAND chips are connected to the controller. Note for * Intel CE4100 devices we don't support more than one device. @@ -468,10 +439,6 @@ static u16 denali_nand_timing_set(struct denali_nand_info *denali) return FAIL; } else if (maf_id == 0xEC) { /* Samsung NAND */ get_samsung_nand_para(denali, device_id); - } else if (maf_id == 0x98) { /* Toshiba NAND */ - get_toshiba_nand_para(denali); - } else if (maf_id == 0xAD) { /* Hynix NAND */ - get_hynix_nand_para(denali, device_id); } dev_info(denali->dev, @@ -1661,6 +1628,12 @@ int denali_init(struct denali_nand_info *denali) chip->ecc.strength); iowrite32(chip->ecc.strength, denali->flash_reg + ECC_CORRECTION); + iowrite32(mtd->erasesize / mtd->writesize, + denali->flash_reg + PAGES_PER_BLOCK); + iowrite32(denali->nand.options & NAND_BUSWIDTH_16 ? 1 : 0, + denali->flash_reg + DEVICE_WIDTH); + iowrite32(mtd->writesize, denali->flash_reg + DEVICE_MAIN_AREA_SIZE); + iowrite32(mtd->oobsize, denali->flash_reg + DEVICE_SPARE_AREA_SIZE); mtd_set_ooblayout(mtd, &denali_ooblayout_ops);