From patchwork Thu May 1 09:56:11 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 29447 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-oa0-f69.google.com (mail-oa0-f69.google.com [209.85.219.69]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id D2A63203F3 for ; Thu, 1 May 2014 09:57:16 +0000 (UTC) Received: by mail-oa0-f69.google.com with SMTP id i7sf15460239oag.8 for ; Thu, 01 May 2014 02:57:16 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:x-original-sender :x-original-authentication-results:precedence:mailing-list:list-id :list-post:list-help:list-archive:list-unsubscribe; bh=QBsvFXt3FclZCF+2KMxHOSVhLk6lW4gPA8Vr5itZ+fM=; b=WkSjjTM0vly3lH8kzVKcvojAz10ztGLp80cih2QBIaL/MIoopVIDrpSrFo3F3o0bXt R33jpGGIPZn6mYhGqBT42SjYuDzEvsoKHtl9R9HcLZv6+IJ/c8bq+HGQ77MNrEwESVEN tGHaEqPdJd5/7jI4xkBCIF+D+Hot0dGqacnDYdmHpPPe0ssAm2fU26rW8C9nw3M+eyEt 4tyZ9xZUIcc1oLdVKPfRcnf+8Eizf24byUkfzn/G7XYzDCHk+KQf4lnAZYgUXL2ya3Tg YB4NHy+I0DPyY2cGoaTXdUq1QgLMNhHbXwu28kLwL8P6nr4efkbdPHIF/vDJhhjTUwlh LDlw== X-Gm-Message-State: ALoCoQmohqL9jzFDd0CmqeDPpKH28Snlj2FnJs7dGm0omH6ptRQmt7IZMHxt020KzOXXK6Ms3sXg X-Received: by 10.50.136.198 with SMTP id qc6mr833011igb.4.1398938236422; Thu, 01 May 2014 02:57:16 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.95.84 with SMTP id h78ls975201qge.54.gmail; Thu, 01 May 2014 02:57:16 -0700 (PDT) X-Received: by 10.52.229.97 with SMTP id sp1mr6786254vdc.23.1398938236311; Thu, 01 May 2014 02:57:16 -0700 (PDT) Received: from mail-ve0-f173.google.com (mail-ve0-f173.google.com [209.85.128.173]) by mx.google.com with ESMTPS id up2si5961789vec.158.2014.05.01.02.57.16 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 01 May 2014 02:57:16 -0700 (PDT) Received-SPF: none (google.com: patch+caf_=patchwork-forward=linaro.org@linaro.org does not designate permitted sender hosts) client-ip=209.85.128.173; Received: by mail-ve0-f173.google.com with SMTP id pa12so2651280veb.18 for ; Thu, 01 May 2014 02:57:16 -0700 (PDT) X-Received: by 10.58.46.207 with SMTP id x15mr8411114vem.17.1398938236246; Thu, 01 May 2014 02:57:16 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patches@linaro.org Received: by 10.220.221.72 with SMTP id ib8csp12883vcb; Thu, 1 May 2014 02:57:15 -0700 (PDT) X-Received: by 10.180.126.33 with SMTP id mv1mr1571942wib.6.1398938235259; Thu, 01 May 2014 02:57:15 -0700 (PDT) Received: from mail-wi0-f172.google.com (mail-wi0-f172.google.com [209.85.212.172]) by mx.google.com with ESMTPS id ei9si577215wid.40.2014.05.01.02.57.14 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 01 May 2014 02:57:15 -0700 (PDT) Received-SPF: none (google.com: lee.jones@linaro.org does not designate permitted sender hosts) client-ip=209.85.212.172; Received: by mail-wi0-f172.google.com with SMTP id hi2so407204wib.11 for ; Thu, 01 May 2014 02:57:14 -0700 (PDT) X-Received: by 10.180.212.48 with SMTP id nh16mr1438338wic.49.1398938234724; Thu, 01 May 2014 02:57:14 -0700 (PDT) Received: from lee--X1.home (host109-148-238-223.range109-148.btcentralplus.com. [109.148.238.223]) by mx.google.com with ESMTPSA id bj5sm2696494wib.3.2014.05.01.02.57.12 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 01 May 2014 02:57:13 -0700 (PDT) From: Lee Jones To: linux-kernel@vger.kernel.org Cc: computersforpeace@gmail.com, linux-mtd@lists.infradead.org, kernel@stlinux.com, Lee Jones Subject: [PATCH 04/47] mtd: nand: adding ST's BCH NAND Controller driver Date: Thu, 1 May 2014 10:56:11 +0100 Message-Id: <1398938214-17847-5-git-send-email-lee.jones@linaro.org> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1398938214-17847-1-git-send-email-lee.jones@linaro.org> References: <1398938214-17847-1-git-send-email-lee.jones@linaro.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: patch+caf_=patchwork-forward=linaro.org@linaro.org does not designate permitted sender hosts) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Precedence: list Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org List-ID: X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , 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 | 7 ++ drivers/mtd/nand/Makefile | 1 + drivers/mtd/nand/stm_nand_bch.c | 146 ++++++++++++++++++++++++++++++++++++++++ include/linux/mtd/stm_nand.h | 33 +++++++++ 4 files changed, 187 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..7b1352a 100644 --- a/drivers/mtd/nand/Kconfig +++ b/drivers/mtd/nand/Kconfig @@ -510,4 +510,11 @@ 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 + depends on OF + 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..09a7fdb --- /dev/null +++ b/drivers/mtd/nand/stm_nand_bch.c @@ -0,0 +1,146 @@ +/* + * 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; + + 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 */