public inbox for linux-mtd@lists.infradead.org
 help / color / mirror / Atom feed
From: Lee Jones <lee.jones@linaro.org>
To: linux-kernel@vger.kernel.org
Cc: Lee Jones <lee.jones@linaro.org>,
	computersforpeace@gmail.com, linux-mtd@lists.infradead.org,
	kernel@stlinux.com
Subject: [PATCH 44/47] mtd: nand: mtd_nand_bch: add remaining FLEX functions
Date: Thu,  1 May 2014 10:56:51 +0100	[thread overview]
Message-ID: <1398938214-17847-45-git-send-email-lee.jones@linaro.org> (raw)
In-Reply-To: <1398938214-17847-1-git-send-email-lee.jones@linaro.org>

Including a dummy function for selecting chips which isn't supported by
our driver, the wait function as requested by the NAND sub system, a read
Byte function also requested by NAND and finally a command function which
provides a partial implementation of MTD/NAND Interface, based on
Hamming-FLEX operation which allows us to make use of nand_base.c functions
where possible (i.e.nand_scan_ident()).

Signed-off-by: Lee Jones <lee.jones@linaro.org>
---
 drivers/mtd/nand/stm_nand_bch.c | 101 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 101 insertions(+)

diff --git a/drivers/mtd/nand/stm_nand_bch.c b/drivers/mtd/nand/stm_nand_bch.c
index ba6ac8f..89f1263 100644
--- a/drivers/mtd/nand/stm_nand_bch.c
+++ b/drivers/mtd/nand/stm_nand_bch.c
@@ -770,6 +770,103 @@ static void flex_addr(struct nandi_controller *nandi,
 	writel(addr, nandi->base + NANDHAM_FLEX_ADD);
 }
 
+/*
+ * Partial implementation of MTD/NAND Interface, based on Hamming-FLEX
+ * operation.
+ *
+ * Allows us to make use of nand_base.c functions where possible
+ * (e.g. nand_scan_ident() and friends).
+ */
+static void flex_command_lp(struct mtd_info *mtd, unsigned int command,
+			    int column, int page)
+{
+	struct nand_chip *chip = mtd->priv;
+	struct nandi_controller *nandi = chip->priv;
+
+	emiss_nandi_select(STM_NANDI_HAMMING);
+
+	switch (command) {
+	case NAND_CMD_READOOB:
+		/* Emulate NAND_CMD_READOOB */
+		column += mtd->writesize;
+		command = NAND_CMD_READ0;
+		break;
+	case NAND_CMD_READ0:
+	case NAND_CMD_ERASE1:
+	case NAND_CMD_SEQIN:
+	case NAND_CMD_RESET:
+	case NAND_CMD_PARAM:
+		/* Prime RBn wait */
+		nandi_enable_interrupts(nandi, NAND_INT_RBN);
+		reinit_completion(&nandi->rbn_completed);
+		break;
+	case NAND_CMD_READID:
+	case NAND_CMD_STATUS:
+	case NAND_CMD_ERASE2:
+		break;
+	default:
+		/* Catch unexpected commands */
+		BUG();
+	}
+
+	/*
+	 * Command Cycle
+	 */
+	flex_cmd(nandi, command);
+
+	/*
+	 * Address Cycles
+	 */
+	if (column != -1)
+		flex_addr(nandi, column,
+			  (command == NAND_CMD_READID) ? 1 : 2);
+
+	if (page != -1)
+		flex_addr(nandi, page, nandi->extra_addr ? 3 : 2);
+
+	/* Complete 'READ0' command */
+	if (command == NAND_CMD_READ0)
+		flex_cmd(nandi, NAND_CMD_READSTART);
+
+	/* Wait for RBn, if required                        */
+	/* (Note, other commands may handle wait elsewhere) */
+	if (command == NAND_CMD_RESET ||
+	    command == NAND_CMD_READ0 ||
+	    command == NAND_CMD_PARAM) {
+		flex_wait_rbn(nandi);
+		nandi_disable_interrupts(nandi, NAND_INT_RBN);
+	}
+}
+
+static uint8_t flex_read_byte(struct mtd_info *mtd)
+{
+	struct nand_chip *chip = mtd->priv;
+	struct nandi_controller *nandi = chip->priv;
+
+	emiss_nandi_select(STM_NANDI_HAMMING);
+
+	return (uint8_t)(readl(nandi->base + NANDHAM_FLEX_DATA) & 0xff);
+}
+
+static int flex_wait_func(struct mtd_info *mtd, struct nand_chip *chip)
+{
+	struct nandi_controller *nandi = chip->priv;
+
+	emiss_nandi_select(STM_NANDI_HAMMING);
+
+	flex_wait_rbn(nandi);
+
+	flex_cmd(nandi, NAND_CMD_STATUS);
+
+	return (int)(readl(nandi->base + NANDHAM_FLEX_DATA) & 0xff);
+}
+
+/* Multi-CS devices not supported */
+static void flex_select_chip(struct mtd_info *mtd, int chipnr)
+{
+
+}
+
 static void flex_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
 {
 	struct nand_chip *chip = mtd->priv;
@@ -1485,6 +1582,10 @@ static void nandi_set_mtd_defaults(struct nandi_controller *nandi,
 	chip->ecc.layout = &info->ecclayout;
 	chip->options |= NAND_NO_SUBPAGE_WRITE;
 
+	chip->cmdfunc = flex_command_lp;
+	chip->read_byte = flex_read_byte;
+	chip->select_chip = flex_select_chip;
+	chip->waitfunc = flex_wait_func;
 	chip->read_buf = flex_read_buf;
 	chip->write_buf = flex_write_buf;
 
-- 
1.8.3.2

  parent reply	other threads:[~2014-05-01  9:58 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-01  9:56 [PATCH 00/47] mtd: nand: Add new driver supporting ST's BCH h/w Lee Jones
2014-05-01  9:56 ` [PATCH 01/47] ARM: sti: Add BCH (NAND Flash) Controller support for STiH41x (Orly) SoCs Lee Jones
2014-05-01  9:56 ` [PATCH 02/47] mtd: nand: stm_nand_bch: provide Device Tree documentation Lee Jones
2014-05-01  9:56 ` [PATCH 03/47] mtd: nand: add shared register defines for ST's NAND Controller drivers Lee Jones
2014-05-01  9:56 ` [PATCH 04/47] mtd: nand: adding ST's BCH NAND Controller driver Lee Jones
2014-05-01  9:56 ` [PATCH 05/47] mtd: nand: add ONFI NAND Timing Mode Specifications Lee Jones
2014-05-01  9:56 ` [PATCH 06/47] mtd: nand: stm_nand_bch: IRQ support for ST's BCH NAND Controller driver Lee Jones
2014-05-01  9:56 ` [PATCH 07/47] mtd: nand: stm_nand_bch: change between BCH and Hamming modes Lee Jones
2014-05-01  9:56 ` [PATCH 08/47] mtd: nand: stm_nand_bch: initialise the BCH Controller Lee Jones
2014-05-01  9:56 ` [PATCH 09/47] mtd: nand: stm_nand_bch: supply clock support Lee Jones
2014-05-01  9:56 ` [PATCH 10/47] mtd: nand: stm_nand_bch: introduce and initialise some important data structures Lee Jones
2014-05-01  9:56 ` [PATCH 11/47] mtd: nand: stm_nand_bch: initialise the Hamming Controller Lee Jones
2014-05-01  9:56 ` [PATCH 12/47] mtd: nand: stm_nand_bch: add Power Management Lee Jones
2014-05-01  9:56 ` [PATCH 13/47] mtd: nand: stm_nand_bch: scan for NAND devices Lee Jones
2014-05-01  9:56 ` [PATCH 14/47] mtd: nand: stm_nand_bch: provide Device Tree support Lee Jones
2014-05-01  9:56 ` [PATCH 15/47] mtd: nand: stm_nand_bch: configure BCH and FLEX by ONFI timing mode Lee Jones
2014-05-01  9:56 ` [PATCH 16/47] mtd: nand: stm_nand_bch: add compatible page size check Lee Jones
2014-05-01  9:56 ` [PATCH 17/47] mtd: nand: stm_nand_bch: derive some working variables for latter use Lee Jones
2014-05-01  9:56 ` [PATCH 18/47] mtd: nand: stm_nand_bch: automatically set EEC mode if requested Lee Jones
2014-05-01  9:56 ` [PATCH 19/47] mtd: nand: stm_nand_bch: ensure configuration is compatible with this driver Lee Jones
2014-05-01  9:56 ` [PATCH 20/47] mtd: nand: stm_nand_bch: configure BCH read/write/erase programs Lee Jones
2014-05-01  9:56 ` [PATCH 21/47] mtd: nand: stm_nand_bch: initialise working buffers Lee Jones
2014-05-01  9:56 ` [PATCH 22/47] mtd: nand: stm_nand_bch: provide shared BCH operations Lee Jones
2014-05-01  9:56 ` [PATCH 23/47] mtd: nand: stm_nand_bch: erase one block (BCH) Lee Jones
2014-05-01  9:56 ` [PATCH 24/47] mtd: nand: stm_nand_bch: check erased page for zeros Lee Jones
2014-05-01  9:56 ` [PATCH 25/47] mtd: nand: stm_nand_bch: provide read functionality (BCH) Lee Jones
2014-05-01  9:56 ` [PATCH 26/47] mtd: nand: stm_nand_bch: provide write " Lee Jones
2014-05-01  9:56 ` [PATCH 27/47] mtd: nand: stm_nand_bch: find IBBT signature Lee Jones
2014-05-01  9:56 ` [PATCH 28/47] mtd: nand: stm_nand_bch: bad block marking helpers Lee Jones
2014-05-01  9:56 ` [PATCH 29/47] mtd: nand: stm_nand_bch: populate IBBT BCH Header Lee Jones
2014-05-01  9:56 ` [PATCH 30/47] mtd: nand: stm_nand_bch: write IBBT to Flash Lee Jones
2014-05-01  9:56 ` [PATCH 31/47] mtd: nand: stm_nand_bch: update flash-resident BBT(s) Lee Jones
2014-05-01  9:56 ` [PATCH 32/47] mtd: nand: stm_nand_bch: add Hamming-FLEX operations Lee Jones
2014-05-01  9:56 ` [PATCH 33/47] mtd: nand: stm_nand_bch: read and write raw (FLEX) Lee Jones
2014-05-01  9:56 ` [PATCH 34/47] mtd: nand: stm_nand_bch: scan block for BBM(s) according to specified BBT options Lee Jones
2014-05-01  9:56 ` [PATCH 35/47] mtd: nand: stm_nand_bch: scan for BBMs and build memory-resident BBT Lee Jones
2014-05-01  9:56 ` [PATCH 36/47] mtd: nand: stm_nand_bch: search for and load flash-resident BBT Lee Jones
2014-05-01  9:56 ` [PATCH 37/47] mtd: nand: stm_nand_bch: " Lee Jones
2014-05-01  9:56 ` [PATCH 38/47] mtd: nand: stm_nand_bch: dump bad blocks Lee Jones
2014-05-01  9:56 ` [PATCH 39/47] mtd: nand: stm_nand_bch: parse partitions and register an MTD device Lee Jones
2014-05-01  9:56 ` [PATCH 40/47] mtd: nand: stm_nand_bch: fetch the bit-flips threshold Lee Jones
2014-05-01  9:56 ` [PATCH 41/47] mtd: nand: stm_nand_bch: MTD erase (BCH) Lee Jones
2014-05-01  9:56 ` [PATCH 42/47] mtd: nand: stm_nand_bch: MTD mark and check for bad blocks (BCH) Lee Jones
2014-05-01  9:56 ` [PATCH 43/47] mtd: nand: stm_nand_bch: read and write buffers (FLEX) Lee Jones
2014-05-01  9:56 ` Lee Jones [this message]
2014-05-01  9:56 ` [PATCH 45/47] mtd: nand: stm_nand_bch: catch unhandled calls to read and write to the OOB Lee Jones
2014-05-01  9:56 ` [PATCH 46/47] mtd: nand: stm_nand_bch: finalise setup by calling and_scan_tail() Lee Jones
2014-05-01  9:56 ` [PATCH 47/47] mtd: nand: catch unsupported framework call-backs Lee Jones

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1398938214-17847-45-git-send-email-lee.jones@linaro.org \
    --to=lee.jones@linaro.org \
    --cc=computersforpeace@gmail.com \
    --cc=kernel@stlinux.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mtd@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox