[PATCH 5/7] add GPMI support for imx28

Huang Shijie b32955 at freescale.com
Tue Mar 22 23:11:48 EDT 2011


Hi Lothar:

    Thanks a lot for your carefully review.


> Hi,
>
> some general comments:
> - Why are you not using the existing nand_ids but inventing your own
>    database?
>
The nand_ids{} contains poor information for me.
Such as :
[1]The nand_ids does not have the enough information for the page 
size,oob size for some new NANDs.
    And you can not get the information from parsing the NAND ids, such 
as some Micron NANDs.

[2]I need the timing information of the NAND. The nand_ids DOES not have 
it. I have to
    read the datasheet of the NAND, and add it to my database.

[3]I need the information about the error Management for BCH.
    The BCH module needs to know the ECC information of the NAND, the 
nand_ids{} does not have it.
Different NANDs may have different ECC requires such as "Minimum 
required ECC".


> - What is the purpose of the 'rom_helpers'? To me it looks like they
>    are doing something that should be done in the mtd partition
>    handlers, not in the flash chip driver.
>
We have saled a lot products based the imx23 or imx28.
All the products support the nand boot mode by flashing the kernel to 
the kernel partitions of the nands.
In order to compliant to the old product, the layout of the nand is 
constraint to the current situation:
[1] first a boot partition for the kernel.
[2] the rest is for other uses, such as rootfs.

So I have to use the rom_helpers to split the kernel partition before 
the real MTD partition initializations.



> Huang Shijie writes:
>> These files contain the code to implement the GPMI in the imx28.
>>
>> Signed-off-by: Huang Shijie<b32955 at freescale.com>
>> ---
>>   drivers/mtd/nand/gpmi-nfc/bch-regs-imx28.h  |  557 +++++++++++++++++++++++++++
>>   drivers/mtd/nand/gpmi-nfc/gpmi-regs-imx28.h |  421 ++++++++++++++++++++
>>   drivers/mtd/nand/gpmi-nfc/hal-imx28.c       |  503 ++++++++++++++++++++++++
>>   drivers/mtd/nand/gpmi-nfc/rom-imx28.c       |   66 ++++
>>   4 files changed, 1547 insertions(+), 0 deletions(-)
>>   create mode 100644 drivers/mtd/nand/gpmi-nfc/bch-regs-imx28.h
>>   create mode 100644 drivers/mtd/nand/gpmi-nfc/gpmi-regs-imx28.h
>>   create mode 100644 drivers/mtd/nand/gpmi-nfc/hal-imx28.c
>>   create mode 100644 drivers/mtd/nand/gpmi-nfc/rom-imx28.c
>>
>> diff --git a/drivers/mtd/nand/gpmi-nfc/bch-regs-imx28.h b/drivers/mtd/nand/gpmi-nfc/bch-regs-imx28.h
>> new file mode 100644
>> index 0000000..692db08
>> --- /dev/null
>> +++ b/drivers/mtd/nand/gpmi-nfc/bch-regs-imx28.h
>> @@ -0,0 +1,557 @@
>> +/*
>> + * Freescale GPMI NFC NAND Flash Driver
>> + *
>> + * Copyright 2008-2010 Freescale Semiconductor, Inc. All Rights Reserved.
>> + *
>> + * This program is free software; you can redistribute it and/or modify
>> + * it under the terms of the GNU General Public License as published by
>> + * the Free Software Foundation; either version 2 of the License, or
>> + * (at your option) any later version.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with this program; if not, write to the Free Software
>> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
>> + *
>> + * Xml Revision: 2.5
>> + * Template revision: 26195
>> + */
>> +
>> +#ifndef __GPMI_NFC_BCH_REGS_H
>> +#define __GPMI_NFC_BCH_REGS_H
>> +
>> +/*============================================================================*/
>> +
>> +#define HW_BCH_CTRL	(0x00000000)
>> +#define HW_BCH_CTRL_SET	(0x00000004)
>> +#define HW_BCH_CTRL_CLR	(0x00000008)
>> +#define HW_BCH_CTRL_TOG	(0x0000000c)
>>
> No need for parens around bare numbers.
>
Ok. Frankly speaking, the file is auto created by some tools from the 
hardware info.
>> +#define BM_BCH_CTRL_SFTRST	0x80000000
>> +#define BV_BCH_CTRL_SFTRST__RUN   0x0
>> +#define BV_BCH_CTRL_SFTRST__RESET 0x1
>> +#define BM_BCH_CTRL_CLKGATE	0x40000000
>> +#define BV_BCH_CTRL_CLKGATE__RUN     0x0
>> +#define BV_BCH_CTRL_CLKGATE__NO_CLKS 0x1
>> +#define BP_BCH_CTRL_RSVD5	23
>> +#define BM_BCH_CTRL_RSVD5	0x3F800000
>> +#define BF_BCH_CTRL_RSVD5(v)  \
>> +		(((v)<<  23)&  BM_BCH_CTRL_RSVD5)
>> +#define BM_BCH_CTRL_DEBUGSYNDROME	0x00400000
>> +#define BP_BCH_CTRL_RSVD4	20
>> +#define BM_BCH_CTRL_RSVD4	0x00300000
>> +#define BF_BCH_CTRL_RSVD4(v)  \
>> +		(((v)<<  20)&  BM_BCH_CTRL_RSVD4)
>> +#define BP_BCH_CTRL_M2M_LAYOUT	18
>> +#define BM_BCH_CTRL_M2M_LAYOUT	0x000C0000
>> +#define BF_BCH_CTRL_M2M_LAYOUT(v)  \
>> +		(((v)<<  18)&  BM_BCH_CTRL_M2M_LAYOUT)
>> +#define BM_BCH_CTRL_M2M_ENCODE	0x00020000
>> +#define BM_BCH_CTRL_M2M_ENABLE	0x00010000
>> +#define BP_BCH_CTRL_RSVD3	11
>> +#define BM_BCH_CTRL_RSVD3	0x0000F800
>> +#define BF_BCH_CTRL_RSVD3(v)  \
>> +		(((v)<<  11)&  BM_BCH_CTRL_RSVD3)
>> +#define BM_BCH_CTRL_DEBUG_STALL_IRQ_EN	0x00000400
>> +#define BM_BCH_CTRL_RSVD2	0x00000200
>> +#define BM_BCH_CTRL_COMPLETE_IRQ_EN	0x00000100
>> +#define BP_BCH_CTRL_RSVD1	4
>> +#define BM_BCH_CTRL_RSVD1	0x000000F0
>> +#define BF_BCH_CTRL_RSVD1(v)  \
>> +		(((v)<<  4)&  BM_BCH_CTRL_RSVD1)
>> +#define BM_BCH_CTRL_BM_ERROR_IRQ	0x00000008
>> +#define BM_BCH_CTRL_DEBUG_STALL_IRQ	0x00000004
>> +#define BM_BCH_CTRL_RSVD0	0x00000002
>> +#define BM_BCH_CTRL_COMPLETE_IRQ	0x00000001
>> +
> [...]
> Messed up indentation. Also, use TAB instead of spaces for indentation.
>
ditto
>> diff --git a/drivers/mtd/nand/gpmi-nfc/gpmi-regs-imx28.h b/drivers/mtd/nand/gpmi-nfc/gpmi-regs-imx28.h
>> new file mode 100644
>> index 0000000..dcb3b7d
>> --- /dev/null
>> +++ b/drivers/mtd/nand/gpmi-nfc/gpmi-regs-imx28.h
>> @@ -0,0 +1,421 @@
>> +/*
>> + * Freescale GPMI NFC NAND Flash Driver
>> + *
>> + * Copyright 2008-2010 Freescale Semiconductor, Inc. All Rights Reserved.
>> + *
>> + * This program is free software; you can redistribute it and/or modify
>> + * it under the terms of the GNU General Public License as published by
>> + * the Free Software Foundation; either version 2 of the License, or
>> + * (at your option) any later version.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with this program; if not, write to the Free Software
>> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
>> + *
>> + * Xml Revision: 2.2
>> + * Template revision: 26195
>> + */
>> +
>> +#ifndef __GPMI_NFC_GPMI_REGS_H
>> +#define __GPMI_NFC_GPMI_REGS_H
>> +
>> +/*============================================================================*/
>> +
>> +#define HW_GPMI_CTRL0	(0x00000000)
>> +#define HW_GPMI_CTRL0_SET	(0x00000004)
>> +#define HW_GPMI_CTRL0_CLR	(0x00000008)
>> +#define HW_GPMI_CTRL0_TOG	(0x0000000c)
>> +
>> +#define BM_GPMI_CTRL0_SFTRST	0x80000000
>> +#define BV_GPMI_CTRL0_SFTRST__RUN   0x0
>> +#define BV_GPMI_CTRL0_SFTRST__RESET 0x1
>> +#define BM_GPMI_CTRL0_CLKGATE	0x40000000
>> +#define BV_GPMI_CTRL0_CLKGATE__RUN     0x0
>> +#define BV_GPMI_CTRL0_CLKGATE__NO_CLKS 0x1
>> +#define BM_GPMI_CTRL0_RUN	0x20000000
>> +#define BV_GPMI_CTRL0_RUN__IDLE 0x0
>> +#define BV_GPMI_CTRL0_RUN__BUSY 0x1
>> +#define BM_GPMI_CTRL0_DEV_IRQ_EN	0x10000000
>> +#define BM_GPMI_CTRL0_LOCK_CS	0x08000000
>> +#define BV_GPMI_CTRL0_LOCK_CS__DISABLED 0x0
>> +#define BV_GPMI_CTRL0_LOCK_CS__ENABLED  0x1
>> +#define BM_GPMI_CTRL0_UDMA	0x04000000
>> +#define BV_GPMI_CTRL0_UDMA__DISABLED 0x0
>> +#define BV_GPMI_CTRL0_UDMA__ENABLED  0x1
>> +#define BP_GPMI_CTRL0_COMMAND_MODE	24
>> +#define BM_GPMI_CTRL0_COMMAND_MODE	0x03000000
>> +#define BF_GPMI_CTRL0_COMMAND_MODE(v)  \
>> +		(((v)<<  24)&  BM_GPMI_CTRL0_COMMAND_MODE)
>> +#define BV_GPMI_CTRL0_COMMAND_MODE__WRITE            0x0
>> +#define BV_GPMI_CTRL0_COMMAND_MODE__READ             0x1
>> +#define BV_GPMI_CTRL0_COMMAND_MODE__READ_AND_COMPARE 0x2
>> +#define BV_GPMI_CTRL0_COMMAND_MODE__WAIT_FOR_READY   0x3
>> +#define BM_GPMI_CTRL0_WORD_LENGTH	0x00800000
>> +#define BV_GPMI_CTRL0_WORD_LENGTH__16_BIT 0x0
>> +#define BV_GPMI_CTRL0_WORD_LENGTH__8_BIT  0x1
>> +#define BP_GPMI_CTRL0_CS	20
>> +#define BM_GPMI_CTRL0_CS	0x00700000
>> +#define BF_GPMI_CTRL0_CS(v)  \
>> +		(((v)<<  20)&  BM_GPMI_CTRL0_CS)
>> +#define BP_GPMI_CTRL0_ADDRESS	17
>> +#define BM_GPMI_CTRL0_ADDRESS	0x000E0000
>> +#define BF_GPMI_CTRL0_ADDRESS(v)  \
>> +		(((v)<<  17)&  BM_GPMI_CTRL0_ADDRESS)
>> +#define BV_GPMI_CTRL0_ADDRESS__NAND_DATA 0x0
>> +#define BV_GPMI_CTRL0_ADDRESS__NAND_CLE  0x1
>> +#define BV_GPMI_CTRL0_ADDRESS__NAND_ALE  0x2
>> +#define BM_GPMI_CTRL0_ADDRESS_INCREMENT	0x00010000
>> +#define BV_GPMI_CTRL0_ADDRESS_INCREMENT__DISABLED 0x0
>> +#define BV_GPMI_CTRL0_ADDRESS_INCREMENT__ENABLED  0x1
>> +#define BP_GPMI_CTRL0_XFER_COUNT	0
>> +#define BM_GPMI_CTRL0_XFER_COUNT	0x0000FFFF
>> +#define BF_GPMI_CTRL0_XFER_COUNT(v)  \
>> +		(((v)<<  0)&  BM_GPMI_CTRL0_XFER_COUNT)
>>
> same as above.
>
>> diff --git a/drivers/mtd/nand/gpmi-nfc/hal-imx28.c b/drivers/mtd/nand/gpmi-nfc/hal-imx28.c
>> new file mode 100644
>> index 0000000..ff87d7f
>> --- /dev/null
>> +++ b/drivers/mtd/nand/gpmi-nfc/hal-imx28.c
>> @@ -0,0 +1,503 @@
>> +/*
>> + * Freescale GPMI NFC NAND Flash Driver
>> + *
>> + * Copyright (C) 2011 Freescale Semiconductor, Inc.
>> + * Copyright (C) 2008 Embedded Alley Solutions, Inc.
>> + *
>> + * This program is free software; you can redistribute it and/or modify
>> + * it under the terms of the GNU General Public License as published by
>> + * the Free Software Foundation; either version 2 of the License, or
>> + * (at your option) any later version.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License along
>> + * with this program; if not, write to the Free Software Foundation, Inc.,
>> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>> + */
>> +#include "gpmi-nfc.h"
>> +#include "gpmi-regs-imx28.h"
>> +#include "bch-regs-imx28.h"
>> +
> [...]
>> +static int send_command(struct gpmi_nfc_data *this)
>> +{
>> +	struct dma_chan *channel = get_dma_chan(this);
>> +	struct mil *mil	=&this->mil;
>> +	struct dma_async_tx_descriptor *desc;
>> +	struct scatterlist *sgl;
>> +	u32 pio[3];
>> +
>> +	/* [1] send out the PIO words */
>> +	pio[0] = BF_GPMI_CTRL0_COMMAND_MODE(BV_GPMI_CTRL0_COMMAND_MODE__WRITE)
>> +		| BM_GPMI_CTRL0_WORD_LENGTH
>> +		| BF_GPMI_CTRL0_CS(mil->current_chip)
>> +		| BF_GPMI_CTRL0_ADDRESS(BV_GPMI_CTRL0_ADDRESS__NAND_CLE)
>> +		| BM_GPMI_CTRL0_ADDRESS_INCREMENT
>> +		| BF_GPMI_CTRL0_XFER_COUNT(mil->command_length);
>> +	pio[1] = pio[2] = 0;
>> +	desc = channel->device->device_prep_slave_sg(channel,
>> +					(struct scatterlist *)pio,
>> +					ARRAY_SIZE(pio), DMA_NONE, 0);
>> +	if (!desc) {
>> +		log("step 1 error");
>> +		return -1;
>> +	}
>> +
>> +	/* [2] send out the COMMAND + ADDRESS string stored in @buffer */
>> +	sgl =&mil->cmd_sgl;
>> +
>> +	dma_map_sg(this->dev, sgl, 1, DMA_TO_DEVICE);
>> +	sgl->length = mil->command_length;
>>
> this has to be done _before_ dma_map_sg(). With CONFIG_DMA_API_DEBUG
> enabled you would get:
> |gpmi-nfc gpmi-nfc: DMA-API: device driver frees DMA memory with different size [device address=0x0000000046e10000] [map size=4096 bytes] [unmap size=1 bytes]
>
thanks.

Huang Shijie




More information about the linux-mtd mailing list