+#ifdef DEBUG
+#define dump_reg(b, r) __dump_reg(&b->r, #r)
+static inline void __dump_reg(void *addr, const char *name)
+{
+ printf("%16s[%p]=%08x\n", name, addr, readl(addr));
+}
+
+#define dump_bch_reg(n) __dump_reg(&bch_regs->hw_bch_##n, #n)
+#define dump_gpmi_reg(n) __dump_reg(&gpmi_regs->hw_gpmi_##n, #n)
+static inline void dump_regs(void)
+{
+ printf("BCH:\n");
+ dump_bch_reg(ctrl);
+ dump_bch_reg(status0);
+ dump_bch_reg(mode);
+ dump_bch_reg(debug0);
+ dump_bch_reg(dbgkesread);
+ dump_bch_reg(dbgcsferead);
+ dump_bch_reg(dbgsyndegread);
+ dump_bch_reg(dbgahbmread);
+ dump_bch_reg(blockname);
+ dump_bch_reg(version);
+
+ printf("\nGPMI:\n");
+ dump_gpmi_reg(ctrl0);
+ dump_gpmi_reg(eccctrl);
+ dump_gpmi_reg(ecccount);
+ dump_gpmi_reg(payload);
+ dump_gpmi_reg(auxiliary);
+ dump_gpmi_reg(ctrl1);
+ dump_gpmi_reg(data);
+ dump_gpmi_reg(stat);
+ dump_gpmi_reg(debug);
+ dump_gpmi_reg(version);
+ dump_gpmi_reg(debug2);
+ dump_gpmi_reg(debug3);
+}
+
+static inline int dbg_addr(void *addr)
+{
+ if (((unsigned long)addr & ~0xfff) == BCH_BASE_ADDRESS)
+ return 1;
+ return 1;
+}
+
+static inline u32 mxs_readl(void *addr,
+ const char *fn, int ln)
+{
+ u32 val = readl(addr);
+ static void *last_addr;
+ static u32 last_val;
+
+ if (!dbg_addr(addr))
+ return val;
+
+ if (addr != last_addr || last_val != val) {
+ printf("%s@%d: Read %08x from %p\n", fn, ln, val, addr);
+ last_addr = addr;
+ last_val = val;
+ }
+ return val;
+}
+
+static inline void mxs_writel(u32 val, void *addr,
+ const char *fn, int ln)
+{
+ if (dbg_addr(addr))
+ printf("%s@%d: Writing %08x to %p...", fn, ln, val, addr);
+ writel(val, addr);
+ if (dbg_addr(addr))
+ printf(" result: %08x\n", readl(addr));
+}
+
+#undef readl
+#define readl(a) mxs_readl(a, __func__, __LINE__)
+
+#undef writel
+#define writel(v, a) mxs_writel(v, a, __func__, __LINE__)
+static inline void memdump(const void *addr, size_t len)
+{
+ const char *buf = addr;
+ int i;
+
+ for (i = 0; i < len; i++) {
+ if (i % 16 == 0) {
+ if (i > 0)
+ printf("\n");
+ printf("%p:", &buf[i]);
+ }
+ printf(" %02x", buf[i]);
+ }
+ printf("\n");
+}
+#else
+static inline void memdump(void *addr, size_t len)
+{
+}
+
+static inline void dump_regs(void)
+{
+}
+#endif
+
+static struct nand_ecclayout fake_ecc_layout;
+static int chunk_data_size = MXS_NAND_CHUNK_DATA_CHUNK_SIZE;
+static int galois_field = 13;