[ PATCH V2 0/7] add the GPMI controller driver for IMX23/IMX28
Huang Shijie
b32955 at freescale.com
Mon Mar 28 03:38:51 EDT 2011
Hi:
> Hi,
>
> Huang Shijie writes:
>> Hi:
>>> Hi,
>>>
>>> Huang Shijie writes:
>>>> The general-purpose media interface(GPMI) controller is a flexible interface
>>>> to up to several NAND flashs.
>>>>
>>>> The Bose Ray-Choudhury Hocquenghem(BCH) module is a hardware ECC accelerator.
>>>>
>>>> With the help of BCH, the GPMI controller can choose to do the hardware ECC or
>>>> not.
>>>>
>>>> This driver is based the Shawn Guo's DMA patches for IMX23/IMX28,
>>>> please refer to :
>>>> http://git.infradead.org/users/vkoul/slave-dma.git/commit/a580b8c5429a624d120cd603e1498bf676e2b4da
>>>>
>>>> v1 --> v2:
>>>> [0] merge the common files into the gpmi-nfc-main.c
>>>> [1] change the code to get the clock.
>>>> [2] remove the timing in the nand_device_info{}
>>>> [3] fix DMA errors
>>>> [4] add the nand_device_info.[ch] to generic code
>>>> [5] use the chip->onfi_version for the ONFI nand
>>>> [6] useless init
>>>> [7] others
>>>>
>>>> Huang Shijie (7):
>>>> ARM: add GPMI support for imx23/imx28
>>>> dmaengine: change the flags of request_irq()
>>>> MTD : add the database for the NANDs
>>>> MTD : add the common code for GPMI controller driver
>>>> MTD : add GPMI support for imx23
>>>> MTD : add GPMI support for imx28
>>>> MTD : add GPMI driver in the config and Makefile
>>>>
>>>> arch/arm/mach-mxs/Kconfig | 2 +
>>>> arch/arm/mach-mxs/clock-mx23.c | 3 +
>>>> arch/arm/mach-mxs/clock-mx28.c | 3 +
>>>> arch/arm/mach-mxs/devices-mx23.h | 3 +
>>>> arch/arm/mach-mxs/devices-mx28.h | 3 +
>>>> arch/arm/mach-mxs/devices/Kconfig | 3 +
>>>> arch/arm/mach-mxs/devices/Makefile | 1 +
>>>> arch/arm/mach-mxs/devices/platform-gpmi.c | 140 ++
>>>> arch/arm/mach-mxs/include/mach/devices-common.h | 4 +
>>>> arch/arm/mach-mxs/include/mach/gpmi-nfc.h | 62 +
>>>> arch/arm/mach-mxs/mach-mx23evk.c | 37 +
>>>> arch/arm/mach-mxs/mach-mx28evk.c | 37 +
>>>> drivers/dma/mxs-dma.c | 2 +-
>>>> drivers/mtd/nand/Kconfig | 10 +
>>>> drivers/mtd/nand/Makefile | 1 +
>>>> drivers/mtd/nand/gpmi-nfc/Makefile | 7 +
>>>> drivers/mtd/nand/gpmi-nfc/bch-regs-imx23.h | 342 ++++
>>>> drivers/mtd/nand/gpmi-nfc/bch-regs-imx28.h | 342 ++++
>>>>
>>> Those two files are identical except for the file name included in the
>>> comment.
>>> If a new SoC with differences in the register layout pops up, that
>>> should be handled by using namespace prefixes for the definitions
>>> rather than by adding new files.
>>>
>> I ever thought to merge the headers into one file, such as
>> "bch-regs-imx23_imx28.h".
>> But what about the imx508? Do i have to split the header in future.
>> Or add a separate file such as "bch-regs-imx508.h"?
>>
> If it is so much different from the others, that might be necessary.
> Otherwise you could use the same approach as proposed for i.MX23 and
> i.MX28.
>
ok. thanks.
>>>> drivers/mtd/nand/gpmi-nfc/gpmi-regs-imx23.h | 381 ++++
>>>> drivers/mtd/nand/gpmi-nfc/gpmi-regs-imx28.h | 370 ++++
>>>>
>>> These files differ only in a few definitions. They should be combined
>>> into one file and the differences sorted out using appropriate
>>> namespace prefixes like:
>>> |#define MX23_BP_GPMI_CTRL0_LOCK_CS 22
>>> |#define MX23_BM_GPMI_CTRL0_LOCK_CS (1<< MX23_BP_GPMI_CTRL0_LOCK_CS)
>>> |#define BP_GPMI_CTRL0_CS 20
>>> |#define MX23_BM_GPMI_CTRL0_CS (3<< BP_GPMI_CTRL0_CS)
>>> |#define MX28_BM_GPMI_CTRL0_CS (7<< BP_GPMI_CTRL0_CS)
>>>
>>> The code could either use if clauses checking the platform_id to
>>> decide which definition to use, or use hooked functions and initialize
>>> the function pointers depending on the platform_id.
>>>
>> The same issue with the imx508.
>>
>>> Also, I prefer notations like '(1<< 22)' over '0x00400000' for bit
>>> masks, because that makes it easier to match the definition with the
>>> bit numbers given in the documentation.
>>>
>>> Further the 'RSVD' entries should be removed from the register
>>> definitions (even if they are generated from the XML).
>>>
>> thanks. I will modify it in next version.
>>>> drivers/mtd/nand/gpmi-nfc/hal-imx23.c | 555 +++++
>>>> drivers/mtd/nand/gpmi-nfc/hal-imx28.c | 503 +++++
>>>>
>>> These files are more or less identical. The code should be moved to
>>> the main file and the differences sorted out using the platform_ids.
>>>
>> In actually, the two files are identical.
>>
>> It's a big headache to me.
>>
>> Do i have to sacrifice the logic clearness for reducing some code to
>> make the less code lines?
>>
> It's not (only) code size, but maintainability. If you have duplicated
> code it's harder to keep it in sync when something has to be changed.
> You will not maintain the code forever, so it's important that others
> can understand the code easily.
>
ok.
But I am sure that I will _SUPPORT_ the driver for several years. :)
>> If I merge the code to the main file, the main file will become bigger.
>>
> But much easier to handle. You can find all functions in one file and
> do not have to search several files when looking for a specific
> function.
>
sorry.
I do not think it is a good solution to package all the code in a
file. Every one thinks in different ways.
>> And I have to add the imx508 code in the main file too in future.
>>
>> What's more, the GPMI will be the only NAND controller for the IMX cpu,
>> even in the imx6x,
>> What should i do about the imx6x? still add it in the main file?
>>
> Why not? If it's so much different that this is not feasible, there is
> no point in merging it into the current driver anyway. In this case it
> would probably be better to create a completely new driver for it.
>
If i create a new driver, there will be more duplicated code. Because the
new driver can share all the code except that it should have its own
hal-imxXX.c file.
>> An acceptable solution is merge:
>> [1] merge the imx23/imx28 into one separate file, such as hal-imx23-imx28.c
>> [2] add the hal-imx508.c or hal-imx6x.c in future.
>>
>> What about the solution? I really reluctant to merge them in the main file.
>>
> I would keep as many functions identical as possible. If there are
> simple differences like those between i.MX23 and i.MX28 they should be
> handled by if clauses inside the affected functions or by hooking
> individual functions depending on the platform_id.
> You should have a look at the i.MX CSPI driver (drivers/spi/spi_imx.c)
> which handles a variety of chips from i.MX1 thru i.MX51 in this way.
>
The i.MX cspi driver is just a small driver. GPMI driver is much bigger
then it.
But still thanks.
> Lothar Waßmann
Best Regards
Huang Shijie
More information about the linux-mtd
mailing list