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 /drivers/mtd/nand/cs553x_nand.c | |
| 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 'drivers/mtd/nand/cs553x_nand.c')
| -rw-r--r-- | drivers/mtd/nand/cs553x_nand.c | 34 | 
1 files changed, 16 insertions, 18 deletions
| diff --git a/drivers/mtd/nand/cs553x_nand.c b/drivers/mtd/nand/cs553x_nand.c index aec6045058c7..a65e4e0f57a1 100644 --- a/drivers/mtd/nand/cs553x_nand.c +++ b/drivers/mtd/nand/cs553x_nand.c @@ -97,7 +97,7 @@  static void cs553x_read_buf(struct mtd_info *mtd, u_char *buf, int len)  { -	struct nand_chip *this = mtd->priv; +	struct nand_chip *this = mtd_to_nand(mtd);  	while (unlikely(len > 0x800)) {  		memcpy_fromio(buf, this->IO_ADDR_R, 0x800); @@ -109,7 +109,7 @@ static void cs553x_read_buf(struct mtd_info *mtd, u_char *buf, int len)  static void cs553x_write_buf(struct mtd_info *mtd, const u_char *buf, int len)  { -	struct nand_chip *this = mtd->priv; +	struct nand_chip *this = mtd_to_nand(mtd);  	while (unlikely(len > 0x800)) {  		memcpy_toio(this->IO_ADDR_R, buf, 0x800); @@ -121,13 +121,13 @@ static void cs553x_write_buf(struct mtd_info *mtd, const u_char *buf, int len)  static unsigned char cs553x_read_byte(struct mtd_info *mtd)  { -	struct nand_chip *this = mtd->priv; +	struct nand_chip *this = mtd_to_nand(mtd);  	return readb(this->IO_ADDR_R);  }  static void cs553x_write_byte(struct mtd_info *mtd, u_char byte)  { -	struct nand_chip *this = mtd->priv; +	struct nand_chip *this = mtd_to_nand(mtd);  	int i = 100000;  	while (i && readb(this->IO_ADDR_R + MM_NAND_STS) & CS_NAND_CTLR_BUSY) { @@ -140,7 +140,7 @@ static void cs553x_write_byte(struct mtd_info *mtd, u_char byte)  static void cs553x_hwcontrol(struct mtd_info *mtd, int cmd,  			     unsigned int ctrl)  { -	struct nand_chip *this = mtd->priv; +	struct nand_chip *this = mtd_to_nand(mtd);  	void __iomem *mmio_base = this->IO_ADDR_R;  	if (ctrl & NAND_CTRL_CHANGE) {  		unsigned char ctl = (ctrl & ~NAND_CTRL_CHANGE ) ^ 0x01; @@ -152,7 +152,7 @@ static void cs553x_hwcontrol(struct mtd_info *mtd, int cmd,  static int cs553x_device_ready(struct mtd_info *mtd)  { -	struct nand_chip *this = mtd->priv; +	struct nand_chip *this = mtd_to_nand(mtd);  	void __iomem *mmio_base = this->IO_ADDR_R;  	unsigned char foo = readb(mmio_base + MM_NAND_STS); @@ -161,7 +161,7 @@ static int cs553x_device_ready(struct mtd_info *mtd)  static void cs_enable_hwecc(struct mtd_info *mtd, int mode)  { -	struct nand_chip *this = mtd->priv; +	struct nand_chip *this = mtd_to_nand(mtd);  	void __iomem *mmio_base = this->IO_ADDR_R;  	writeb(0x07, mmio_base + MM_NAND_ECC_CTL); @@ -170,7 +170,7 @@ static void cs_enable_hwecc(struct mtd_info *mtd, int mode)  static int cs_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code)  {  	uint32_t ecc; -	struct nand_chip *this = mtd->priv; +	struct nand_chip *this = mtd_to_nand(mtd);  	void __iomem *mmio_base = this->IO_ADDR_R;  	ecc = readl(mmio_base + MM_NAND_STS); @@ -197,17 +197,15 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr)  	}  	/* Allocate memory for MTD device structure and private data */ -	new_mtd = kzalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), GFP_KERNEL); -	if (!new_mtd) { +	this = kzalloc(sizeof(struct nand_chip), GFP_KERNEL); +	if (!this) {  		err = -ENOMEM;  		goto out;  	} -	/* Get pointer to private data */ -	this = (struct nand_chip *)(&new_mtd[1]); +	new_mtd = nand_to_mtd(this);  	/* Link the private data with the MTD structure */ -	new_mtd->priv = this;  	new_mtd->owner = THIS_MODULE;  	/* map physical address */ @@ -257,7 +255,7 @@ out_free:  out_ior:  	iounmap(this->IO_ADDR_R);  out_mtd: -	kfree(new_mtd); +	kfree(this);  out:  	return err;  } @@ -337,19 +335,19 @@ static void __exit cs553x_cleanup(void)  		if (!mtd)  			continue; -		this = cs553x_mtd[i]->priv; +		this = mtd_to_nand(mtd);  		mmio_base = this->IO_ADDR_R;  		/* Release resources, unregister device */ -		nand_release(cs553x_mtd[i]); -		kfree(cs553x_mtd[i]->name); +		nand_release(mtd); +		kfree(mtd->name);  		cs553x_mtd[i] = NULL;  		/* unmap physical address */  		iounmap(mmio_base);  		/* Free the MTD device structure */ -		kfree(mtd); +		kfree(this);  	}  } | 
