]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ENGR00139247-3 MTD : add GPMI driver for IMX6Q
authorHuang Shijie <b32955@freescale.com>
Thu, 21 Jul 2011 09:28:47 +0000 (17:28 +0800)
committerOliver Wendt <ow@karo-electronics.de>
Mon, 30 Sep 2013 12:09:26 +0000 (14:09 +0200)
add the gpmi driver for imx6q.

Signed-off-by: Huang Shijie <b32955@freescale.com>
drivers/mtd/nand/Kconfig
drivers/mtd/nand/gpmi-nfc/Makefile
drivers/mtd/nand/gpmi-nfc/gpmi-nfc.c
drivers/mtd/nand/gpmi-nfc/gpmi-nfc.h
drivers/mtd/nand/gpmi-nfc/hal-mx50.c

index 88dec53eb65c675e3aae63cf08f93e67ac99df00..01ccf52bf5dc736798f21390329d89ac4b0e59ee 100644 (file)
@@ -425,7 +425,7 @@ config MTD_NAND_NANDSIM
 
 config MTD_NAND_GPMI_NFC
         bool "GPMI NAND Flash Controller driver"
-        depends on MTD_NAND && (SOC_IMX23 || SOC_IMX28 || SOC_IMX50)
+        depends on MTD_NAND && (SOC_IMX23 || SOC_IMX28 || SOC_IMX50 || SOC_IMX6Q)
        select MTD_PARTITIONS
        select MTD_CMDLINE_PARTS
         help
index 2b32cf622a3cfcecc7a98ab21513ca4f0d12da28..b3c3369446eb0c67e7a2d30ee3d612aedb18c2fb 100644 (file)
@@ -3,3 +3,4 @@ gpmi_nfc-objs += gpmi-nfc.o
 obj-$(CONFIG_SOC_IMX23) += hal-mxs.o
 obj-$(CONFIG_SOC_IMX28) += hal-mxs.o
 obj-$(CONFIG_SOC_IMX50) += hal-mx50.o
+obj-$(CONFIG_SOC_IMX6Q) += hal-mx50.o
index e4edf5dfdc26f0618a9e92dabf489cd1c0772c70..2be4036ca0c6ffc5ff74a15cc47147185982029a 100644 (file)
@@ -377,6 +377,23 @@ static void dma_irq_callback(void *param)
        }
 }
 
+/* This is very useful! */
+void gpmi_show_regs(struct gpmi_nfc_data *this)
+{
+       struct resources *r = &this->resources;
+       u32 reg;
+       int i;
+       int n;
+
+       n = 0xc0 / 0x10 + 1;
+
+       pr_info("-------------- Show GPMI registers ----------\n");
+       for (i = 0; i <= n; i++) {
+               reg = __raw_readl(r->gpmi_regs + i * 0x10);
+               pr_info("offset 0x%.3x : 0x%.8x\n", i * 0x10, reg);
+       }
+       pr_info("-------------- Show GPMI registers end ----------\n");
+}
 int start_dma_without_bch_irq(struct gpmi_nfc_data *this,
                                struct dma_async_tx_descriptor *desc)
 {
@@ -393,8 +410,11 @@ int start_dma_without_bch_irq(struct gpmi_nfc_data *this,
        err = wait_for_completion_timeout(&nfc->dma_done,
                                        msecs_to_jiffies(1000));
        err = (!err) ? -ETIMEDOUT : 0;
-       if (err)
+       if (err) {
                pr_info("DMA timeout!!!\n");
+               gpmi_show_regs(this);
+               panic("----------------");
+       }
        return err;
 }
 
@@ -1148,8 +1168,8 @@ static int __devinit set_up_nfc_hal(struct gpmi_nfc_data *this)
        if (GPMI_IS_MX23(this) || GPMI_IS_MX28(this))
                nfc = &gpmi_nfc_hal_imx23_imx28;
 #endif
-#if defined(CONFIG_SOC_IMX50)
-       if (GPMI_IS_MX50(this))
+#if defined(CONFIG_SOC_IMX50) || defined(CONFIG_SOC_IMX6Q)
+       if (GPMI_IS_MX50(this) || GPMI_IS_MX6Q(this))
                nfc = &gpmi_nfc_hal_mx50;
 #endif
        BUG_ON(nfc == NULL);
@@ -1380,6 +1400,7 @@ static void mil_cmd_ctrl(struct mtd_info *mtd, int data, unsigned int ctrl)
        mil->command_length = 0;
 }
 
+
 static int mil_dev_ready(struct mtd_info *mtd)
 {
        struct nand_chip *nand = mtd->priv;
@@ -2437,6 +2458,9 @@ static const struct platform_device_id gpmi_ids[] = {
        }, {
                .name = "imx50-gpmi-nfc",
                .driver_data = IS_MX50,
+       }, {
+               .name = "imx6q-gpmi-nfc",
+               .driver_data = IS_MX6Q,
        }, {},
 };
 
@@ -2473,6 +2497,7 @@ static void __exit gpmi_nfc_exit(void)
 static int __init gpmi_debug_setup(char *__unused)
 {
        gpmi_debug = GPMI_DEBUG_INIT;
+       enable_gpmi_nand = true;
        return 1;
 }
 __setup("gpmi_debug_init", gpmi_debug_setup);
index dfa9cd160520d522d93b99cf4e449f32150f9774..bdf13c298464bf01601489c42fc6eea1136c83d7 100644 (file)
@@ -491,7 +491,9 @@ extern int gpmi_debug;
 #define IS_MX23                        0x1
 #define IS_MX28                        0x2
 #define IS_MX50                        0x4
+#define IS_MX6Q                        0x8
 #define GPMI_IS_MX23(x)                ((x)->pdev->id_entry->driver_data == IS_MX23)
 #define GPMI_IS_MX28(x)                ((x)->pdev->id_entry->driver_data == IS_MX28)
 #define GPMI_IS_MX50(x)                ((x)->pdev->id_entry->driver_data == IS_MX50)
+#define GPMI_IS_MX6Q(x)                ((x)->pdev->id_entry->driver_data == IS_MX6Q)
 #endif
index 4230e8b59a2cda567817c0f3b6e0d683f95e6bd7..ee0d318c4893ed762146e79ff625eb21ce6420b3 100644 (file)
@@ -299,6 +299,10 @@ static inline bool is_board_support_ddr(struct gpmi_nfc_data *this)
 /* To check if we need to initialize something else*/
 static int extra_init(struct gpmi_nfc_data *this)
 {
+       /* mx6q do not need the extra clocks, while the mx50 needs. */
+       if (GPMI_IS_MX6Q(this))
+               return 0;
+
        ddr_clk = clk_get(NULL, "ddr_clk");
        if (IS_ERR(ddr_clk)) {
                printk(KERN_ERR "The ddr clock is gone!");