From patchwork Tue Mar 25 08:19:21 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 26981 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-oa0-f72.google.com (mail-oa0-f72.google.com [209.85.219.72]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id B801320062 for ; Tue, 25 Mar 2014 08:22:41 +0000 (UTC) Received: by mail-oa0-f72.google.com with SMTP id eb12sf504810oac.3 for ; Tue, 25 Mar 2014 01:22:41 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:subject:date:message-id :in-reply-to:references:cc:precedence:list-id:list-unsubscribe :list-archive:list-post:list-help:list-subscribe:mime-version:sender :errors-to:x-original-sender:x-original-authentication-results :mailing-list:content-type:content-transfer-encoding; bh=a7poeCipK2AgaNH6qTu6cYxEZ612OvkhyRMTq5JM0Zs=; b=adLfYAPe0eeOd80qORnWonBITQgKruLv6zAQo/rgutCY9jU6GDn5SVdHzeY31ocCTu /ttRD20uWqb0O10/hh+kyZtwCrlYtSFbIgCCOePNPqe/h5dmZl7SCcf0gLXeNADVjMb1 wPb9XBzZ2eOO8lZN4B47A06WCFHce+XVyQJEkSPSnUtYW9uSTQmMH+KuLjmDN2axwjPU ADASudiIg8K3YXQTK5h6/6Pvb+Xd8j6bLoNGlMtvPIsYnNiHabP0NOoe6fCLTxVVMUm6 XgRnwHQ/wtAvHMw0aRaPIDsnm+5VJ+pVAXOGNKp/4Cj1812PpqbYhvesV11e/VGRQtNk +68w== X-Gm-Message-State: ALoCoQlNEjaEokXARQMdgtGoeKztmYya0d5PbocA4gQjwwT8hsSwWotVOW/n7lQ9l79dCFPojvni X-Received: by 10.182.66.193 with SMTP id h1mr4778137obt.47.1395735761263; Tue, 25 Mar 2014 01:22:41 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.20.22 with SMTP id 22ls118142qgi.63.gmail; Tue, 25 Mar 2014 01:22:41 -0700 (PDT) X-Received: by 10.58.229.167 with SMTP id sr7mr52585806vec.7.1395735761158; Tue, 25 Mar 2014 01:22:41 -0700 (PDT) Received: from mail-vc0-f169.google.com (mail-vc0-f169.google.com [209.85.220.169]) by mx.google.com with ESMTPS id fn10si3670503vdc.63.2014.03.25.01.22.41 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 25 Mar 2014 01:22:41 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.220.169 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) client-ip=209.85.220.169; Received: by mail-vc0-f169.google.com with SMTP id ik5so138946vcb.28 for ; Tue, 25 Mar 2014 01:22:41 -0700 (PDT) X-Received: by 10.58.220.161 with SMTP id px1mr55343019vec.13.1395735761058; Tue, 25 Mar 2014 01:22:41 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.220.78.9 with SMTP id i9csp285367vck; Tue, 25 Mar 2014 01:22:40 -0700 (PDT) X-Received: by 10.180.100.70 with SMTP id ew6mr19864666wib.57.1395735759654; Tue, 25 Mar 2014 01:22:39 -0700 (PDT) Received: from casper.infradead.org (casper.infradead.org. [2001:770:15f::2]) by mx.google.com with ESMTPS id j8si12196425wiv.53.2014.03.25.01.22.39 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Mar 2014 01:22:39 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-mtd-bounces+patch=linaro.org@lists.infradead.org designates 2001:770:15f::2 as permitted sender) client-ip=2001:770:15f::2; Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1WSMcS-0008PD-1d; Tue, 25 Mar 2014 08:22:00 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1WSMcA-0002IB-KL; Tue, 25 Mar 2014 08:21:42 +0000 Received: from mail-we0-f172.google.com ([74.125.82.172]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1WSMbH-00025l-Dd for linux-mtd@lists.infradead.org; Tue, 25 Mar 2014 08:21:21 +0000 Received: by mail-we0-f172.google.com with SMTP id t61so78662wes.17 for ; Tue, 25 Mar 2014 01:20:25 -0700 (PDT) X-Received: by 10.180.72.230 with SMTP id g6mr19840628wiv.55.1395735625808; Tue, 25 Mar 2014 01:20:25 -0700 (PDT) Received: from lee--X1.home (host109-148-113-193.range109-148.btcentralplus.com. [109.148.113.193]) by mx.google.com with ESMTPSA id k4sm5567676wib.19.2014.03.25.01.20.23 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 25 Mar 2014 01:20:25 -0700 (PDT) From: Lee Jones To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [RFC 04/47] mtd: nand: adding ST's BCH NAND Controller driver Date: Tue, 25 Mar 2014 08:19:21 +0000 Message-Id: <1395735604-26706-5-git-send-email-lee.jones@linaro.org> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1395735604-26706-1-git-send-email-lee.jones@linaro.org> References: <1395735604-26706-1-git-send-email-lee.jones@linaro.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20140325_042048_096867_7F264C98 X-CRM114-Status: GOOD ( 19.95 ) X-Spam-Score: -2.6 (--) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (-2.6 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at http://www.dnswl.org/, low trust [74.125.82.172 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] Cc: angus.clark@st.com, kernel@stlinux.com, lee.jones@linaro.org, linux-mtd@lists.infradead.org, pekon@ti.com, computersforpeace@gmail.com, dwmw2@infradead.org X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: , List-Help: , List-Subscribe: , MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+patch=linaro.org@lists.infradead.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: lee.jones@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.220.169 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 First introduction of the driver. Includes the basic device struct (some functionality isn't utilised as of yet) and supplies some of the important resources required for basic running of the Controller. Signed-off-by: Lee Jones --- drivers/mtd/nand/Kconfig | 6 ++ drivers/mtd/nand/Makefile | 1 + drivers/mtd/nand/stm_nand_bch.c | 151 ++++++++++++++++++++++++++++++++++++++++ include/linux/mtd/stm_nand.h | 33 +++++++++ 4 files changed, 191 insertions(+) create mode 100644 drivers/mtd/nand/stm_nand_bch.c create mode 100644 include/linux/mtd/stm_nand.h diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig index 93ae6a6..2bf972c 100644 --- a/drivers/mtd/nand/Kconfig +++ b/drivers/mtd/nand/Kconfig @@ -510,4 +510,10 @@ config MTD_NAND_XWAY Enables support for NAND Flash chips on Lantiq XWAY SoCs. NAND is attached to the External Bus Unit (EBU). +config MTD_NAND_STM_BCH + tristate "STMicroelectronics: NANDi BCH Controller" + depends on ARM + help + Adds support for the STMicroelectronics NANDi BCH Controller. + endif # MTD_NAND diff --git a/drivers/mtd/nand/Makefile b/drivers/mtd/nand/Makefile index 542b568..94e7737 100644 --- a/drivers/mtd/nand/Makefile +++ b/drivers/mtd/nand/Makefile @@ -46,6 +46,7 @@ obj-$(CONFIG_MTD_NAND_NUC900) += nuc900_nand.o obj-$(CONFIG_MTD_NAND_MPC5121_NFC) += mpc5121_nfc.o obj-$(CONFIG_MTD_NAND_RICOH) += r852.o obj-$(CONFIG_MTD_NAND_JZ4740) += jz4740_nand.o +obj-$(CONFIG_MTD_NAND_STM_BCH) += stm_nand_bch.o obj-$(CONFIG_MTD_NAND_GPMI_NAND) += gpmi-nand/ obj-$(CONFIG_MTD_NAND_XWAY) += xway_nand.o obj-$(CONFIG_MTD_NAND_BCM47XXNFLASH) += bcm47xxnflash/ diff --git a/drivers/mtd/nand/stm_nand_bch.c b/drivers/mtd/nand/stm_nand_bch.c new file mode 100644 index 0000000..bd11070 --- /dev/null +++ b/drivers/mtd/nand/stm_nand_bch.c @@ -0,0 +1,151 @@ +/* + * drivers/mtd/nand/stm_nand_bch.c + * + * Support for STMicroelectronics NANDi BCH Controller + * + * Copyright (c) 2014 STMicroelectronics Limited + * Author: Angus Clark + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +/* NANDi Controller (Hamming/BCH) */ +struct nandi_controller { + void __iomem *base; /* Controller base*/ + void __iomem *dma; /* DMA control base */ + /* IRQ-triggered Completions: */ + struct completion seq_completed; /* SEQ Over */ + struct completion rbn_completed; /* RBn */ + + struct device *dev; + + int bch_ecc_mode; /* ECC mode */ + bool extra_addr; /* Extra address cycle */ + + /* + * The threshold at which the number of corrected bit-flips per sector + * is deemed to have reached an excessive level (triggers '-EUCLEAN' + * return code). + */ + int bitflip_threshold; + + uint32_t page_shift; /* Some working variables */ + uint32_t block_shift; + uint32_t blocks_per_device; + uint32_t sectors_per_page; + + uint8_t *buf; /* Some buffers to use */ + uint8_t *page_buf; + uint8_t *oob_buf; + uint32_t *buf_list; + + int cached_page; /* page number of page in */ + /* 'page_buf' */ +}; + +static int remap_named_resource(struct platform_device *pdev, + char *name, + void __iomem **io_ptr) +{ + struct resource *res, *mem; + resource_size_t size; + void __iomem *p; + + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, name); + if (!res) + return -ENXIO; + + size = resource_size(res); + + mem = devm_request_mem_region(&pdev->dev, res->start, size, name); + if (!mem) + return -EBUSY; + + p = devm_ioremap_nocache(&pdev->dev, res->start, size); + if (!p) + return -ENOMEM; + + *io_ptr = p; + + return 0; +} + +static struct nandi_controller * +nandi_init_resources(struct platform_device *pdev) +{ + struct nandi_controller *nandi; + int err; + + nandi = devm_kzalloc(&pdev->dev, sizeof(*nandi), GFP_KERNEL); + if (!nandi) { + dev_err(&pdev->dev, + "failed to allocate NANDi controller data\n"); + return ERR_PTR(-ENOMEM); + } + + nandi->dev = &pdev->dev; + + err = remap_named_resource(pdev, "nand_mem", &nandi->base); + if (err) + return ERR_PTR(err); + + err = remap_named_resource(pdev, "nand_dma", &nandi->dma); + if (err) + return ERR_PTR(err); + + platform_set_drvdata(pdev, nandi); + + return nandi; +} + +static int stm_nand_bch_probe(struct platform_device *pdev) +{ + struct stm_plat_nand_bch_data *pdata = pdev->dev.platform_data; + struct nandi_controller *nandi; + + if (!pdata) { + dev_err(&pdev->dev, "no platform data found\n"); + return -EINVAL; + } + + nandi = nandi_init_resources(pdev); + if (IS_ERR(nandi)) { + dev_err(&pdev->dev, "failed to initialise NANDi resources\n"); + return PTR_ERR(nandi); + } + + init_completion(&nandi->seq_completed); + init_completion(&nandi->rbn_completed); + + return 0; +} + +static int stm_nand_bch_remove(struct platform_device *pdev) +{ + return 0; +} + +static struct platform_driver stm_nand_bch_driver = { + .probe = stm_nand_bch_probe , + .remove = stm_nand_bch_remove, + .driver = { + .name = "stm-nand-bch", + .owner = THIS_MODULE, + }, +}; +module_platform_driver(stm_nand_bch_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Angus Clark"); +MODULE_DESCRIPTION("STM NAND BCH driver"); diff --git a/include/linux/mtd/stm_nand.h b/include/linux/mtd/stm_nand.h new file mode 100644 index 0000000..9210d5c --- /dev/null +++ b/include/linux/mtd/stm_nand.h @@ -0,0 +1,33 @@ +/* + * include/linux/mtd/stm_mtd.h + * + * Support for STMicroelectronics NAND Controllers + * + * Copyright (c) 2014 STMicroelectronics Limited + * Author: Angus Clark + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#ifndef __LINUX_STM_NAND_H +#define __LINUX_STM_NAND_H + +struct stm_plat_nand_bch_data { + struct stm_nand_bank_data *bank; + enum stm_nand_bch_ecc_config bch_ecc_cfg; + + /* The threshold at which the number of corrected bit-flips per sector + * is deemed to have reached an excessive level (triggers '-EUCLEAN' to + * be returned to the caller). The value should be in the range 1 to + * where is 18 or 30, depending on the BCH + * ECC mode in operation. A value of 0 is interpreted by the driver as + * . + */ + unsigned int bch_bitflip_threshold; + bool flashss; +}; + +#endif /* __LINUX_STM_NAND_H */