diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-01-13 22:25:54 +0300 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-01-13 22:25:54 +0300 | 
| commit | ac53b2e053fffc74372da94e734b92f37e70d32c (patch) | |
| tree | cda82af0fcded5d230e9f56104d3988b7a75c8aa /include/linux/mtd/nand.h | |
| parent | cf09112d160e6db21ff8427ce696f819b957423b (diff) | |
| parent | 9146cbd52b11d4ade62dba8f238ec5e421c3fa2b (diff) | |
| download | linux-ac53b2e053fffc74372da94e734b92f37e70d32c.tar.xz | |
Merge tag 'for-linus-20160112' of git://git.infradead.org/linux-mtd
Pull MTD updates from Brian Norris:
 "Generic MTD:
   - populate the MTD device 'of_node' field (and get a proper 'of_node'
     symlink in sysfs)
     This yielded some new helper functions, and changes across a
     variety of drivers
   - partitioning cleanups, to prepare for better device-tree based
     partitioning in the future
     Eliminate a lot of boilerplate for drivers that want to use
     OF-based partition parsing
     The DT bindings for this didn't settle yet, so most non-cleanup
     portions are deferred for a future release
  NAND:
   - embed a struct mtd_info inside struct nand_chip
     This is really long overdue; too many drivers have to do the same
     silly boilerplate to allocate and link up two "independent"
     structs, when in fact, everyone is assuming there is an exact 1:1
     relationship between a NAND chips struct and its underlying MTD.
     This aids improved helpers and should make certain abstractions
     easier in the future.
     Also causes a lot of churn, helped along by some automated code
     transformations
   - add more core support for detecting (and "correcting") bitflips in
     erased pages; requires opt-in by drivers, but at least we kill a
     few bad implementations and hopefully stave off future ones
   - pxa3xx_nand: cleanups, a few fixes, and PM improvements
   - new JZ4780 NAND driver
  SPI NOR:
   - provide default erase function, for controllers that just want to
     send the SECTOR_ERASE command directly
   - fix some module auto-loading issues with device tree
     ("jedec,spi-nor")
   - error handling fixes
   - new Mediatek QSPI flash driver
  Other:
   - cfi: force valid geometry Kconfig (finally!)
     This one used to trip up randconfigs occasionally, since bots
     aren't deterred by big scary "advanced configuration" menus
  More? Probably. See the commit logs"
* tag 'for-linus-20160112' of git://git.infradead.org/linux-mtd: (168 commits)
  mtd: jz4780_nand: replace if/else blocks with switch/case
  mtd: nand: jz4780: Update ecc correction error codes
  mtd: nandsim: use nand_get_controller_data()
  mtd: jz4780_nand: remove useless mtd->priv = chip assignment
  staging: mt29f_spinand: make use of nand_set/get_controller_data() helpers
  mtd: nand: make use of nand_set/get_controller_data() helpers
  ARM: make use of nand_set/get_controller_data() helpers
  mtd: nand: add helpers to access ->priv
  mtd: nand: jz4780: driver for NAND devices on JZ4780 SoCs
  mtd: nand: jz4740: remove custom 'erased check' implementation
  mtd: nand: diskonchip: remove custom 'erased check' implementation
  mtd: nand: davinci: remove custom 'erased check' implementation
  mtd: nand: use nand_check_erased_ecc_chunk in default ECC read functions
  mtd: nand: return consistent error codes in ecc.correct() implementations
  doc: dt: mtd: new binding for jz4780-{nand,bch}
  mtd: cfi_cmdset_0001: fixing memory leak and handling failed kmalloc
  mtd: spi-nor: wait until lock/unlock operations are ready
  mtd: tests: consolidate kmalloc/memset 0 call to kzalloc
  jffs2: use to_delayed_work
  mtd: nand: assign reasonable default name for NAND drivers
  ...
Diffstat (limited to 'include/linux/mtd/nand.h')
| -rw-r--r-- | include/linux/mtd/nand.h | 71 | 
1 files changed, 54 insertions, 17 deletions
| diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index 5a9d1d4c2487..bdd68e22b5a5 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h @@ -129,6 +129,14 @@ typedef enum {  /* Enable Hardware ECC before syndrome is read back from flash */  #define NAND_ECC_READSYN	2 +/* + * Enable generic NAND 'page erased' check. This check is only done when + * ecc.correct() returns -EBADMSG. + * Set this flag if your implementation does not fix bitflips in erased + * pages and you want to rely on the default implementation. + */ +#define NAND_ECC_GENERIC_ERASED_CHECK	BIT(0) +  /* Bit mask for flags passed to do_nand_read_ecc */  #define NAND_GET_DEVICE		0x80 @@ -276,15 +284,15 @@ struct nand_onfi_params {  	__le16 t_r;  	__le16 t_ccs;  	__le16 src_sync_timing_mode; -	__le16 src_ssync_features; +	u8 src_ssync_features;  	__le16 clk_pin_capacitance_typ;  	__le16 io_pin_capacitance_typ;  	__le16 input_pin_capacitance_typ;  	u8 input_pin_capacitance_max;  	u8 driver_strength_support;  	__le16 t_int_r; -	__le16 t_ald; -	u8 reserved4[7]; +	__le16 t_adl; +	u8 reserved4[8];  	/* vendor */  	__le16 vendor_revision; @@ -407,7 +415,7 @@ struct nand_jedec_params {  	__le16 input_pin_capacitance_typ;  	__le16 clk_pin_capacitance_typ;  	u8 driver_strength_support; -	__le16 t_ald; +	__le16 t_adl;  	u8 reserved4[36];  	/* ECC and endurance block */ @@ -451,12 +459,19 @@ struct nand_hw_control {   * @total:	total number of ECC bytes per page   * @prepad:	padding information for syndrome based ECC generators   * @postpad:	padding information for syndrome based ECC generators + * @options:	ECC specific options (see NAND_ECC_XXX flags defined above)   * @layout:	ECC layout control struct pointer   * @priv:	pointer to private ECC control data   * @hwctl:	function to control hardware ECC generator. Must only   *		be provided if an hardware ECC is available   * @calculate:	function for ECC calculation or readback from ECC hardware - * @correct:	function for ECC correction, matching to ECC generator (sw/hw) + * @correct:	function for ECC correction, matching to ECC generator (sw/hw). + *		Should return a positive number representing the number of + *		corrected bitflips, -EBADMSG if the number of bitflips exceed + *		ECC strength, or any other error code if the error is not + *		directly related to correction. + *		If -EBADMSG is returned the input buffers should be left + *		untouched.   * @read_page_raw:	function to read a raw page without ECC. This function   *			should hide the specific layout used by the ECC   *			controller and always return contiguous in-band and @@ -494,6 +509,7 @@ struct nand_ecc_ctrl {  	int strength;  	int prepad;  	int postpad; +	unsigned int options;  	struct nand_ecclayout	*layout;  	void *priv;  	void (*hwctl)(struct mtd_info *mtd, int mode); @@ -540,11 +556,11 @@ struct nand_buffers {  /**   * struct nand_chip - NAND Private Flash Chip Data + * @mtd:		MTD device registered to the MTD framework   * @IO_ADDR_R:		[BOARDSPECIFIC] address to read the 8 I/O lines of the   *			flash device   * @IO_ADDR_W:		[BOARDSPECIFIC] address to write the 8 I/O lines of the   *			flash device. - * @flash_node:		[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 @@ -640,11 +656,10 @@ struct nand_buffers {   */  struct nand_chip { +	struct mtd_info mtd;  	void __iomem *IO_ADDR_R;  	void __iomem *IO_ADDR_W; -	struct device_node *flash_node; -  	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); @@ -719,6 +734,37 @@ struct nand_chip {  	void *priv;  }; +static inline void nand_set_flash_node(struct nand_chip *chip, +				       struct device_node *np) +{ +	mtd_set_of_node(&chip->mtd, np); +} + +static inline struct device_node *nand_get_flash_node(struct nand_chip *chip) +{ +	return mtd_get_of_node(&chip->mtd); +} + +static inline struct nand_chip *mtd_to_nand(struct mtd_info *mtd) +{ +	return container_of(mtd, struct nand_chip, mtd); +} + +static inline struct mtd_info *nand_to_mtd(struct nand_chip *chip) +{ +	return &chip->mtd; +} + +static inline void *nand_get_controller_data(struct nand_chip *chip) +{ +	return chip->priv; +} + +static inline void nand_set_controller_data(struct nand_chip *chip, void *priv) +{ +	chip->priv = priv; +} +  /*   * NAND Flash Manufacturer ID Codes   */ @@ -907,15 +953,6 @@ struct platform_nand_data {  	struct platform_nand_ctrl ctrl;  }; -/* Some helpers to access the data structures */ -static inline -struct platform_nand_chip *get_platform_nandchip(struct mtd_info *mtd) -{ -	struct nand_chip *chip = mtd->priv; - -	return chip->priv; -} -  /* return the supported features. */  static inline int onfi_feature(struct nand_chip *chip)  { | 
