[U-Boot] [PATCH 1/4] onenand:samsung Target dependent OneNAND chip probe function

Marek Vasut marek.vasut at gmail.com
Sun Nov 20 01:06:09 CET 2011


> Separate callback for probing OneNAND memory chip.
> If no special function is defined, default implementation will be used.
> 
> This approach gives more flexibility for OneNAND device probing.
> 
> Signed-off-by: Lukasz Majewski <l.majewski at samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park at samsung.com>
> ---
>  ./tools/checkpatch.pl -
> total: 0 errors, 0 warnings, 108 lines checked
> 
> NOTE: Ignored message types: COMPLEX_MACRO CONSIDER_KSTRTO MINMAX
> MULTISTATEMENT_MACRO_USE_DO_WHILE
> 
> ---
>  drivers/mtd/onenand/onenand_base.c  |   43
> +++++++++++++++++++++++++++++----- drivers/mtd/onenand/samsung.c       |  
> 10 ++++++++
>  include/linux/mtd/onenand.h         |    1 +
>  include/linux/mtd/samsung_onenand.h |    2 +
>  4 files changed, 49 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/mtd/onenand/onenand_base.c
> b/drivers/mtd/onenand/onenand_base.c index 24e02c2..a557d48 100644
> --- a/drivers/mtd/onenand/onenand_base.c
> +++ b/drivers/mtd/onenand/onenand_base.c
> @@ -2505,23 +2505,24 @@ out:
>  }
> 
>  /**
> - * onenand_probe - [OneNAND Interface] Probe the OneNAND device
> + * onenand_chip_probe - [OneNAND Interface] Probe the OneNAND chip
>   * @param mtd		MTD device structure
>   *
>   * OneNAND detection method:
>   *   Compare the the values from command with ones from register
>   */
> -static int onenand_probe(struct mtd_info *mtd)
> +static int onenand_chip_probe(struct mtd_info *mtd)
>  {
>  	struct onenand_chip *this = mtd->priv;
> -	int bram_maf_id, bram_dev_id, maf_id, dev_id, ver_id;
> -	int density;
> +	int bram_maf_id, bram_dev_id, maf_id, dev_id;
>  	int syscfg;
> 
>  	/* Save system configuration 1 */
>  	syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1);
> +
>  	/* Clear Sync. Burst Read mode to read BootRAM */
> -	this->write_word((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ), this->base +
> ONENAND_REG_SYS_CFG1); +	this->write_word((syscfg &
> ~ONENAND_SYS_CFG1_SYNC_READ),
> +			 this->base + ONENAND_REG_SYS_CFG1);
> 
>  	/* Send the command for reading device ID from BootRAM */
>  	this->write_word(ONENAND_CMD_READID, this->base + ONENAND_BOOTRAM);
> @@ -2546,13 +2547,38 @@ static int onenand_probe(struct mtd_info *mtd)
>  	/* Read manufacturer and device IDs from Register */
>  	maf_id = this->read_word(this->base + ONENAND_REG_MANUFACTURER_ID);
>  	dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID);
> -	ver_id = this->read_word(this->base + ONENAND_REG_VERSION_ID);
> -	this->technology = this->read_word(this->base + ONENAND_REG_TECHNOLOGY);
> 
>  	/* Check OneNAND device */
>  	if (maf_id != bram_maf_id || dev_id != bram_dev_id)
>  		return -ENXIO;
> 
> +	return 0;
> +}
> +
> +/**
> + * onenand_probe - [OneNAND Interface] Probe the OneNAND device
> + * @param mtd		MTD device structure
> + *
> + * OneNAND detection method:
> + *   Compare the the values from command with ones from register
> + */
> +int onenand_probe(struct mtd_info *mtd)
> +{
> +	struct onenand_chip *this = mtd->priv;
> +	int maf_id, dev_id, ver_id;
> +	int density;
> +	int ret;
> +
> +	ret = this->chip_probe(mtd);
> +	if (ret)
> +		return ret;
> +
> +	/* Read manufacturer and device IDs from Register */
> +	maf_id = this->read_word(this->base + ONENAND_REG_MANUFACTURER_ID);
> +	dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID);
> +	ver_id = this->read_word(this->base + ONENAND_REG_VERSION_ID);
> +	this->technology = this->read_word(this->base + ONENAND_REG_TECHNOLOGY);
> +
>  	/* Flash device information */
>  	mtd->name = onenand_print_device_info(dev_id, ver_id);
>  	this->device_id = dev_id;
> @@ -2659,6 +2685,9 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)
>  	if (!this->write_bufferram)
>  		this->write_bufferram = onenand_write_bufferram;
> 
> +	if (!this->chip_probe)
> +		this->chip_probe = onenand_chip_probe;
> +
>  	if (!this->block_markbad)
>  		this->block_markbad = onenand_default_block_markbad;
>  	if (!this->scan_bbt)
> diff --git a/drivers/mtd/onenand/samsung.c b/drivers/mtd/onenand/samsung.c
> index 20b4912..1f4bd81 100644
> --- a/drivers/mtd/onenand/samsung.c
> +++ b/drivers/mtd/onenand/samsung.c
> @@ -590,6 +590,16 @@ static void s3c_set_width_regs(struct onenand_chip
> *this) }
>  #endif
> 
> +int s5pc110_chip_probe(struct mtd_info *mtd)
> +{
> +	return 0;
> +}
> +
> +int s5pc210_chip_probe(struct mtd_info *mtd)
> +{
> +	return 0;
> +}
> +

Will there be a problem if you used the default chip_probe() method from the 
driver ?

>  void s3c_onenand_init(struct mtd_info *mtd)
>  {
>  	struct onenand_chip *this = mtd->priv;
> diff --git a/include/linux/mtd/onenand.h b/include/linux/mtd/onenand.h
> index 5465562..dea42f4 100644
> --- a/include/linux/mtd/onenand.h
> +++ b/include/linux/mtd/onenand.h
> @@ -101,6 +101,7 @@ struct onenand_chip {
>  				size_t count);
>  	unsigned short (*read_word) (void __iomem *addr);
>  	void (*write_word) (unsigned short value, void __iomem *addr);
> +	int (*chip_probe)(struct mtd_info *mtd);
>  	void (*mmcontrol) (struct mtd_info *mtd, int sync_read);
>  	int (*block_markbad)(struct mtd_info *mtd, loff_t ofs);
>  	int (*scan_bbt)(struct mtd_info *mtd);
> diff --git a/include/linux/mtd/samsung_onenand.h
> b/include/linux/mtd/samsung_onenand.h index 021fa27..ddb29bb 100644
> --- a/include/linux/mtd/samsung_onenand.h
> +++ b/include/linux/mtd/samsung_onenand.h
> @@ -127,5 +127,7 @@ struct samsung_onenand {
> 
>  /* common initialize function */
>  extern void s3c_onenand_init(struct mtd_info *);
> +extern int s5pc110_chip_probe(struct mtd_info *);
> +extern int s5pc210_chip_probe(struct mtd_info *);
> 
>  #endif


More information about the U-Boot mailing list