Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752575AbbEKX0F (ORCPT ); Mon, 11 May 2015 19:26:05 -0400 Received: from mail-pd0-f182.google.com ([209.85.192.182]:34318 "EHLO mail-pd0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751330AbbEKX0A (ORCPT ); Mon, 11 May 2015 19:26:00 -0400 Date: Mon, 11 May 2015 16:25:56 -0700 From: Brian Norris To: linux-mtd@lists.infradead.org Cc: Dmitry Torokhov , Anatol Pomazao , Ray Jui , Corneliu Doban , Jonathan Richardson , Scott Branden , Florian Fainelli , =?utf-8?B?UmFmYcWCIE1pxYJlY2tp?= , bcm-kernel-feedback-list@broadcom.com, Dan Ehrenberg , Gregory Fong , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Kevin Cernekee Subject: Re: [PATCH v3 01/10] mtd: nand: add common DT init code Message-ID: <20150511232556.GL32500@ld-irv-0074> References: <1430935194-7579-1-git-send-email-computersforpeace@gmail.com> <1430935194-7579-2-git-send-email-computersforpeace@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1430935194-7579-2-git-send-email-computersforpeace@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4116 Lines: 127 On Wed, May 06, 2015 at 10:59:45AM -0700, Brian Norris wrote: > These are already-documented common bindings for NAND chips. Let's > handle them in nand_base. > > If NAND controller drivers need to act on this data before bringing up > the NAND chip (e.g., fill out ECC callback functions, change HW modes, > etc.), then they can do so between calling nand_scan_ident() and > nand_scan_tail(). > > Signed-off-by: Brian Norris Pushed just this patch to l2-mtd.git, since it's relatively uncontroversial and hasn't changed across the first three revisions. It should be of benefit to a few other driver writers out there that I've reviewed. Brian > --- > drivers/mtd/nand/nand_base.c | 41 +++++++++++++++++++++++++++++++++++++++++ > include/linux/mtd/nand.h | 5 +++++ > 2 files changed, 46 insertions(+) > > diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c > index c2e1232cd45c..c6cf775ee431 100644 > --- a/drivers/mtd/nand/nand_base.c > +++ b/drivers/mtd/nand/nand_base.c > @@ -48,6 +48,7 @@ > #include > #include > #include > +#include > > /* Define default oob placement schemes for large and small page devices */ > static struct nand_ecclayout nand_oob_8 = { > @@ -3798,6 +3799,39 @@ ident_done: > return type; > } > > +static int nand_dt_init(struct mtd_info *mtd, struct nand_chip *chip, > + struct device_node *dn) > +{ > + int ecc_mode, ecc_strength, ecc_step; > + > + if (of_get_nand_bus_width(dn) == 16) > + chip->options |= NAND_BUSWIDTH_16; > + > + if (of_get_nand_on_flash_bbt(dn)) > + chip->bbt_options |= NAND_BBT_USE_FLASH; > + > + ecc_mode = of_get_nand_ecc_mode(dn); > + ecc_strength = of_get_nand_ecc_strength(dn); > + ecc_step = of_get_nand_ecc_step_size(dn); > + > + if ((ecc_step >= 0 && !(ecc_strength >= 0)) || > + (!(ecc_step >= 0) && ecc_strength >= 0)) { > + pr_err("must set both strength and step size in DT\n"); > + return -EINVAL; > + } > + > + if (ecc_mode >= 0) > + chip->ecc.mode = ecc_mode; > + > + if (ecc_strength >= 0) > + chip->ecc.strength = ecc_strength; > + > + if (ecc_step > 0) > + chip->ecc.size = ecc_step; > + > + return 0; > +} > + > /** > * nand_scan_ident - [NAND Interface] Scan for the NAND device > * @mtd: MTD device structure > @@ -3815,6 +3849,13 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips, > int i, nand_maf_id, nand_dev_id; > struct nand_chip *chip = mtd->priv; > struct nand_flash_dev *type; > + int ret; > + > + if (chip->dn) { > + ret = nand_dt_init(mtd, chip, chip->dn); > + if (ret) > + return ret; > + } > > /* Set the default functions */ > nand_set_defaults(chip, chip->options & NAND_BUSWIDTH_16); > diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h > index 3d4ea7eb2b68..e0f40e12a2c8 100644 > --- a/include/linux/mtd/nand.h > +++ b/include/linux/mtd/nand.h > @@ -26,6 +26,8 @@ > > struct mtd_info; > struct nand_flash_dev; > +struct device_node; > + > /* Scan and identify a NAND device */ > extern int nand_scan(struct mtd_info *mtd, int max_chips); > /* > @@ -542,6 +544,7 @@ struct nand_buffers { > * flash device > * @IO_ADDR_W: [BOARDSPECIFIC] address to write the 8 I/O lines of the > * flash device. > + * @dn: [BOARDSPECIFIC] device node describing this instance > * @read_byte: [REPLACEABLE] read one byte from the chip > * @read_word: [REPLACEABLE] read one word from the chip > * @write_byte: [REPLACEABLE] write a single byte to the chip on the > @@ -644,6 +647,8 @@ struct nand_chip { > void __iomem *IO_ADDR_R; > void __iomem *IO_ADDR_W; > > + struct device_node *dn; > + > uint8_t (*read_byte)(struct mtd_info *mtd); > u16 (*read_word)(struct mtd_info *mtd); > void (*write_byte)(struct mtd_info *mtd, uint8_t byte); > -- > 1.9.1 > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/