[U-Boot] [PATCH RFC] Add general nand functions

Scott Wood scottwood at freescale.com
Fri Sep 23 19:22:59 CEST 2011


On 09/23/2011 11:36 AM, Simon Schwarz wrote:
> Added a nand_base.h header that defines all prototypes of nand_base.c
> functions.

Just add the new prototypes to include/linux/mtd/nand.h (which gets
included by nand.h), that's the header that goes with
drivers/mtd/nand/nand_base.c.

> This is necessary because these functions were often copied
> in SPLs. 

You'd rather add new #includes to dozens of files, and keep duplicated
code around, than fix a few SPLs?  NACK.

> It was necessary to also add nand_interface.c. 

You maen nand_interface.h?

> This now defines static
> inline functions former defined in nand.h - theses functions had name
> conflicts with these in nand_base.c/h.

If we have two functions with the same name that do different things,
change the name of the one in nand.h.

> diff --git a/arch/blackfin/lib/board.c b/arch/blackfin/lib/board.c
> index bfdb586..4568820 100644
> --- a/arch/blackfin/lib/board.c
> +++ b/arch/blackfin/lib/board.c
> @@ -25,7 +25,8 @@
>  #include <kgdb.h>
>  
>  #ifdef CONFIG_CMD_NAND
> -#include <nand.h>	/* cannot even include nand.h if it isnt configured */
> +#include <nand.h>
> +#include <nand_interface.h>	/* cannot even include nand.h if it isnt configured */


I don't think it's still true that you can't include nand.h if it isn't
configured, BTW.

> diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
> index e7dfcb1..3fe0935 100644
> --- a/drivers/mtd/nand/nand_base.c
> +++ b/drivers/mtd/nand/nand_base.c
> @@ -51,6 +51,8 @@
>  #include <asm/io.h>
>  #include <asm/errno.h>
>  
> +#include <nand_base.h>

Wait, there's *two* new headers?

> +/* nand_base.c Standard implementation of nand functions */
> +void nand_release_device (struct mtd_info *mtd);
> +uint8_t nand_read_byte(struct mtd_info *mtd);
> +uint8_t nand_read_byte16(struct mtd_info *mtd);
> +u16 nand_read_word(struct mtd_info *mtd);
> +void nand_select_chip(struct mtd_info *mtd, int chipnr);
> +void nand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len);
> +void nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len);
> +int nand_verify_buf(struct mtd_info *mtd, const uint8_t *buf, int len);
> +void nand_write_buf16(struct mtd_info *mtd, const uint8_t *buf, int len);
> +void nand_read_buf16(struct mtd_info *mtd, uint8_t *buf, int len);
> +int nand_verify_buf16(struct mtd_info *mtd, const uint8_t *buf, int len);
> +int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip);
> +int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs);
> +int nand_check_wp(struct mtd_info *mtd);
> +int nand_block_checkbad(struct mtd_info *mtd, loff_t ofs, int getchip,
> +		int allowbbt);
> +void nand_wait_ready(struct mtd_info *mtd);
> +void nand_command(struct mtd_info *mtd, unsigned int command, int column,
> +		int page_addr);
> +void nand_command_lp(struct mtd_info *mtd, unsigned int command, int column,
> +		 int page_addr);
> +int nand_get_device (struct nand_chip *this, struct mtd_info *mtd,
> +		int new_state);
> +int nand_wait(struct mtd_info *mtd, struct nand_chip *this);
> +int nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
> +		uint8_t *buf, int page);
> +static int nand_read_page_raw_syndrome(struct mtd_info *mtd,
> +		struct nand_chip *chip, uint8_t *buf, int page);
> +int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
> +		uint32_t data_offs, uint32_t readlen, uint8_t *bufpoi);
> +int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
> +		uint8_t *buf, int page);
> +int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
> +		uint32_t data_offs, uint32_t readlen, uint8_t *bufpoi);
> +int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
> +		uint8_t *buf, int page);
> +int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,
> +		struct nand_chip *chip, uint8_t *buf, int page);
> +int nand_read_page_syndrome(struct mtd_info *mtd,
> +		struct nand_chip *chip, uint8_t *buf, int page);
> +uint8_t *nand_transfer_oob(struct nand_chip *chip, uint8_t *oob,
> +		struct mtd_oob_ops *ops, size_t len);
> +int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
> +		struct mtd_oob_ops *ops);
> +int nand_read_oob_std(struct mtd_info *mtd, struct nand_chip *chip,
> +		int page, int sndcmd);
> +int nand_read_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
> +		int page, int sndcmd);
> +int nand_write_oob_std(struct mtd_info *mtd, struct nand_chip *chip,
> +		int page);
> +int nand_write_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
> +		int page);
> +int nand_do_read_oob(struct mtd_info *mtd, loff_t from,
> +		struct mtd_oob_ops *ops);
> +int nand_read_oob(struct mtd_info *mtd, loff_t from, struct mtd_oob_ops *ops);
> +void nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
> +		const uint8_t *buf);
> +void nand_write_page_raw_syndrome(struct mtd_info *mtd,
> +		struct nand_chip *chip, const uint8_t *buf);
> +void nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
> +		const uint8_t *buf);
> +void nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
> +		const uint8_t *buf);
> +void nand_write_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
> +		const uint8_t *buf);
> +int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
> +		const uint8_t *buf, int page, int cached, int raw);
> +uint8_t *nand_fill_oob(struct nand_chip *chip, uint8_t *oob,
> +		struct mtd_oob_ops *ops);
> +int nand_do_write_ops(struct mtd_info *mtd, loff_t to,
> +		struct mtd_oob_ops *ops);
> +int nand_do_write_oob(struct mtd_info *mtd, loff_t to, struct mtd_oob_ops *ops);
> +int nand_write_oob(struct mtd_info *mtd, loff_t to, struct mtd_oob_ops *ops);
> +void single_erase_cmd(struct mtd_info *mtd, int page);
> +void multi_erase_cmd(struct mtd_info *mtd, int page);
> +int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
> +		int allowbbt);
> +int nand_read(struct mtd_info *mtd, loff_t from, size_t len,
> +		size_t *retlen, uint8_t *buf);
> +int nand_write(struct mtd_info *mtd, loff_t to, size_t len,
> +		size_t *retlen, const uint8_t *buf);
> +int nand_erase(struct mtd_info *mtd, struct erase_info *instr);
> +void nand_sync(struct mtd_info *mtd);
> +int nand_block_isbad(struct mtd_info *mtd, loff_t offs);
> +int nand_block_markbad(struct mtd_info *mtd, loff_t ofs);
> +void nand_set_defaults(struct nand_chip *chip, int busw);
> +u16 onfi_crc16(u16 crc, u8 const *p, size_t len);
> +int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip,
> +		int *busw);
> +void nand_flash_detect_non_onfi(struct mtd_info *mtd, struct nand_chip *chip,
> +		const struct nand_flash_dev *type, int *busw);
> +const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
> +		struct nand_chip *chip, int busw, int *maf_id, int *dev_id,
> +		const struct nand_flash_dev *type);
> +int nand_scan_ident(struct mtd_info *mtd, int maxchips,
> +		const struct nand_flash_dev *table);
> +int nand_scan_tail(struct mtd_info *mtd);
> +int nand_scan(struct mtd_info *mtd, int maxchips);
> +void nand_release(struct mtd_info *mtd);

Can we limit the scope of this to functions (or classes thereof -- if we
export one buffer function might as well export all the variants) that
we actually need from a current SPL?

> diff --git a/nand_spl/board/samsung/smdk6400/Makefile b/nand_spl/board/samsung/smdk6400/Makefile
> index 2f9c307..32ea116 100644
> --- a/nand_spl/board/samsung/smdk6400/Makefile
> +++ b/nand_spl/board/samsung/smdk6400/Makefile
> @@ -33,12 +33,12 @@ nandobj	:= $(OBJTREE)/nand_spl/
>  
>  LDSCRIPT= $(TOPDIR)/nand_spl/board/$(BOARDDIR)/u-boot.lds
>  LDFLAGS := -T $(nandobj)u-boot.lds -Ttext $(CONFIG_SYS_TEXT_BASE) $(LDFLAGS) \
> -	   $(LDFLAGS_FINAL)
> +	   $(LDFLAGS_FINAL) -gc-sections
>  AFLAGS	+= -DCONFIG_NAND_SPL
> -CFLAGS	+= -DCONFIG_NAND_SPL
> +CFLAGS	+= -DCONFIG_NAND_SPL -ffunction-sections 

Are gc-sections/function-sections not already being set?

>  SOBJS	= start.o cpu_init.o lowlevel_init.o
> -COBJS	= nand_boot.o nand_ecc.o s3c64xx.o smdk6400_nand_spl.o
> +COBJS	= nand_boot.o nand_ecc.o s3c64xx.o smdk6400_nand_spl.o nand_base.o
>  
>  SRCS	:= $(addprefix $(obj),$(SOBJS:.o=.S) $(COBJS:.o=.c))
>  OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS))
> @@ -98,6 +98,10 @@ $(obj)smdk6400_nand_spl.c:
>  	@rm -f $@
>  	@ln -s $(TOPDIR)/board/samsung/smdk6400/smdk6400_nand_spl.c $@
>  
> +$(obj)nand_base.c:
> +	@rm -f $@
> +	@ln -s $(TOPDIR)/drivers/mtd/nand/nand_base.c $@

This is a separate (albeit dependent) change from the NAND function
exporting, BTW.

-Scott



More information about the U-Boot mailing list