110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie/* 210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * Freescale GPMI NAND Flash Driver 310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * 410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * Copyright (C) 2010-2011 Freescale Semiconductor, Inc. 510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * Copyright (C) 2008 Embedded Alley Solutions, Inc. 610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * 710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * This program is free software; you can redistribute it and/or modify 810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * it under the terms of the GNU General Public License as published by 910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * the Free Software Foundation; either version 2 of the License, or 1010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * (at your option) any later version. 1110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * 1210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * This program is distributed in the hope that it will be useful, 1310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * but WITHOUT ANY WARRANTY; without even the implied warranty of 1410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * GNU General Public License for more details. 1610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie */ 1710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie#ifndef __DRIVERS_MTD_NAND_GPMI_NAND_H 1810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie#define __DRIVERS_MTD_NAND_GPMI_NAND_H 1910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 2010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie#include <linux/mtd/nand.h> 2110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie#include <linux/platform_device.h> 2210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie#include <linux/dma-mapping.h> 235fac0e18bd3dbd7e23276efa0e5d2b945b1165e8Shawn Guo#include <linux/dmaengine.h> 2410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 25ff506172a30080963853dc0d259566c82fe8626cHuang Shijie#define GPMI_CLK_MAX 5 /* MX6Q needs five clocks */ 2610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijiestruct resources { 27513d57e1db53870cdc11e60df77c57c8b3897fdfHuang Shijie void __iomem *gpmi_regs; 28513d57e1db53870cdc11e60df77c57c8b3897fdfHuang Shijie void __iomem *bch_regs; 2910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie unsigned int dma_low_channel; 3010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie unsigned int dma_high_channel; 31ff506172a30080963853dc0d259566c82fe8626cHuang Shijie struct clk *clock[GPMI_CLK_MAX]; 3210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie}; 3310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 3410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie/** 3510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * struct bch_geometry - BCH geometry description. 3610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @gf_len: The length of Galois Field. (e.g., 13 or 14) 3710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @ecc_strength: A number that describes the strength of the ECC 3810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * algorithm. 3910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @page_size: The size, in bytes, of a physical page, including 4010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * both data and OOB. 4110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @metadata_size: The size, in bytes, of the metadata. 4210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @ecc_chunk_size: The size, in bytes, of a single ECC chunk. Note 4310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * the first chunk in the page includes both data and 4410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * metadata, so it's a bit larger than this value. 4510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @ecc_chunk_count: The number of ECC chunks in the page, 4610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @payload_size: The size, in bytes, of the payload buffer. 4710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @auxiliary_size: The size, in bytes, of the auxiliary buffer. 4810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @auxiliary_status_offset: The offset into the auxiliary buffer at which 4910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * the ECC status appears. 5010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @block_mark_byte_offset: The byte offset in the ECC-based page view at 5110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * which the underlying physical block mark appears. 5210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @block_mark_bit_offset: The bit offset into the ECC-based page view at 5310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * which the underlying physical block mark appears. 5410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie */ 5510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijiestruct bch_geometry { 5610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie unsigned int gf_len; 5710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie unsigned int ecc_strength; 5810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie unsigned int page_size; 5910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie unsigned int metadata_size; 6010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie unsigned int ecc_chunk_size; 6110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie unsigned int ecc_chunk_count; 6210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie unsigned int payload_size; 6310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie unsigned int auxiliary_size; 6410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie unsigned int auxiliary_status_offset; 6510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie unsigned int block_mark_byte_offset; 6610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie unsigned int block_mark_bit_offset; 6710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie}; 6810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 6910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie/** 7010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * struct boot_rom_geometry - Boot ROM geometry description. 7110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @stride_size_in_pages: The size of a boot block stride, in pages. 7210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @search_area_stride_exponent: The logarithm to base 2 of the size of a 7310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * search area in boot block strides. 7410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie */ 7510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijiestruct boot_rom_geometry { 7610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie unsigned int stride_size_in_pages; 7710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie unsigned int search_area_stride_exponent; 7810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie}; 7910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 8010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie/* DMA operations types */ 8110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijieenum dma_ops_type { 8210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie DMA_FOR_COMMAND = 1, 8310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie DMA_FOR_READ_DATA, 8410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie DMA_FOR_WRITE_DATA, 8510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie DMA_FOR_READ_ECC_PAGE, 8610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie DMA_FOR_WRITE_ECC_PAGE 8710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie}; 8810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 8910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie/** 9010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * struct nand_timing - Fundamental timing attributes for NAND. 9110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @data_setup_in_ns: The data setup time, in nanoseconds. Usually the 9210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * maximum of tDS and tWP. A negative value 9310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * indicates this characteristic isn't known. 9410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @data_hold_in_ns: The data hold time, in nanoseconds. Usually the 9510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * maximum of tDH, tWH and tREH. A negative value 9610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * indicates this characteristic isn't known. 9710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @address_setup_in_ns: The address setup time, in nanoseconds. Usually 9810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * the maximum of tCLS, tCS and tALS. A negative 9910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * value indicates this characteristic isn't known. 10010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @gpmi_sample_delay_in_ns: A GPMI-specific timing parameter. A negative value 10110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * indicates this characteristic isn't known. 10210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @tREA_in_ns: tREA, in nanoseconds, from the data sheet. A 10310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * negative value indicates this characteristic isn't 10410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * known. 10510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @tRLOH_in_ns: tRLOH, in nanoseconds, from the data sheet. A 10610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * negative value indicates this characteristic isn't 10710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * known. 10810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @tRHOH_in_ns: tRHOH, in nanoseconds, from the data sheet. A 10910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * negative value indicates this characteristic isn't 11010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * known. 11110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie */ 11210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijiestruct nand_timing { 11310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie int8_t data_setup_in_ns; 11410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie int8_t data_hold_in_ns; 11510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie int8_t address_setup_in_ns; 11610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie int8_t gpmi_sample_delay_in_ns; 11710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie int8_t tREA_in_ns; 11810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie int8_t tRLOH_in_ns; 11910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie int8_t tRHOH_in_ns; 12010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie}; 12110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 1226189cccbe8d16d0ef175bd0dca18e3824ca01174Huang Shijieenum gpmi_type { 1236189cccbe8d16d0ef175bd0dca18e3824ca01174Huang Shijie IS_MX23, 1246189cccbe8d16d0ef175bd0dca18e3824ca01174Huang Shijie IS_MX28, 12591f5498ebfb2352ed6b5eb2780adcfe019961565Huang Shijie IS_MX6Q, 12691f5498ebfb2352ed6b5eb2780adcfe019961565Huang Shijie IS_MX6SX 1276189cccbe8d16d0ef175bd0dca18e3824ca01174Huang Shijie}; 1286189cccbe8d16d0ef175bd0dca18e3824ca01174Huang Shijie 1296189cccbe8d16d0ef175bd0dca18e3824ca01174Huang Shijiestruct gpmi_devdata { 1306189cccbe8d16d0ef175bd0dca18e3824ca01174Huang Shijie enum gpmi_type type; 1316189cccbe8d16d0ef175bd0dca18e3824ca01174Huang Shijie int bch_max_ecc_strength; 1326189cccbe8d16d0ef175bd0dca18e3824ca01174Huang Shijie int max_chain_delay; /* See the async EDO mode */ 1336189cccbe8d16d0ef175bd0dca18e3824ca01174Huang Shijie}; 1346189cccbe8d16d0ef175bd0dca18e3824ca01174Huang Shijie 13510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijiestruct gpmi_nand_data { 136995fbbf563fcec058a1135bdd112ac969c817e65Huang Shijie /* flags */ 137995fbbf563fcec058a1135bdd112ac969c817e65Huang Shijie#define GPMI_ASYNC_EDO_ENABLED (1 << 0) 1389c95f11b9e743aa6134134a6dcf866a9d5661972Huang Shijie#define GPMI_TIMING_INIT_OK (1 << 1) 139995fbbf563fcec058a1135bdd112ac969c817e65Huang Shijie int flags; 1406189cccbe8d16d0ef175bd0dca18e3824ca01174Huang Shijie const struct gpmi_devdata *devdata; 141995fbbf563fcec058a1135bdd112ac969c817e65Huang Shijie 14210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie /* System Interface */ 14310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie struct device *dev; 14410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie struct platform_device *pdev; 14510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 14610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie /* Resources */ 14710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie struct resources resources; 14810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 14910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie /* Flash Hardware */ 15010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie struct nand_timing timing; 151995fbbf563fcec058a1135bdd112ac969c817e65Huang Shijie int timing_mode; 15210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 15310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie /* BCH */ 15410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie struct bch_geometry bch_geometry; 15510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie struct completion bch_done; 15610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 15710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie /* NAND Boot issue */ 15810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie bool swap_block_mark; 15910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie struct boot_rom_geometry rom_geometry; 16010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 16110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie /* MTD / NAND */ 16210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie struct nand_chip nand; 16310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie struct mtd_info mtd; 16410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 16510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie /* General-use Variables */ 16610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie int current_chip; 16710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie unsigned int command_length; 16810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 16910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie /* passed from upper layer */ 17010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie uint8_t *upper_buf; 17110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie int upper_len; 17210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 17310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie /* for DMA operations */ 17410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie bool direct_dma_map_ok; 17510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 17610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie struct scatterlist cmd_sgl; 17710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie char *cmd_buffer; 17810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 17910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie struct scatterlist data_sgl; 18010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie char *data_buffer_dma; 18110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 18210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie void *page_buffer_virt; 18310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie dma_addr_t page_buffer_phys; 18410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie unsigned int page_buffer_size; 18510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 18610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie void *payload_virt; 18710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie dma_addr_t payload_phys; 18810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 18910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie void *auxiliary_virt; 19010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie dma_addr_t auxiliary_phys; 19110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 19210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie /* DMA channels */ 19310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie#define DMA_CHANS 8 19410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie struct dma_chan *dma_chans[DMA_CHANS]; 19510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie enum dma_ops_type last_dma_type; 19610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie enum dma_ops_type dma_type; 19710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie struct completion dma_done; 19810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 19910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie /* private */ 20010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie void *private; 20110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie}; 20210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 20310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie/** 20410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * struct gpmi_nfc_hardware_timing - GPMI hardware timing parameters. 20510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @data_setup_in_cycles: The data setup time, in cycles. 20610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @data_hold_in_cycles: The data hold time, in cycles. 20710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @address_setup_in_cycles: The address setup time, in cycles. 208ddab3838aa3332ed2c8ea96accbed5218a2a72b7Huang Shijie * @device_busy_timeout: The timeout waiting for NAND Ready/Busy, 209ddab3838aa3332ed2c8ea96accbed5218a2a72b7Huang Shijie * this value is the number of cycles multiplied 210ddab3838aa3332ed2c8ea96accbed5218a2a72b7Huang Shijie * by 4096. 21110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @use_half_periods: Indicates the clock is running slowly, so the 21210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * NFC DLL should use half-periods. 21310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @sample_delay_factor: The sample delay factor. 214d37e02d8f3a892b57738f1c1431779d5939214d1Huang Shijie * @wrn_dly_sel: The delay on the GPMI write strobe. 21510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie */ 21610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijiestruct gpmi_nfc_hardware_timing { 217ddab3838aa3332ed2c8ea96accbed5218a2a72b7Huang Shijie /* for HW_GPMI_TIMING0 */ 21810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie uint8_t data_setup_in_cycles; 21910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie uint8_t data_hold_in_cycles; 22010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie uint8_t address_setup_in_cycles; 221ddab3838aa3332ed2c8ea96accbed5218a2a72b7Huang Shijie 222ddab3838aa3332ed2c8ea96accbed5218a2a72b7Huang Shijie /* for HW_GPMI_TIMING1 */ 223ddab3838aa3332ed2c8ea96accbed5218a2a72b7Huang Shijie uint16_t device_busy_timeout; 224ddab3838aa3332ed2c8ea96accbed5218a2a72b7Huang Shijie#define GPMI_DEFAULT_BUSY_TIMEOUT 0x500 /* default busy timeout value.*/ 225ddab3838aa3332ed2c8ea96accbed5218a2a72b7Huang Shijie 226ddab3838aa3332ed2c8ea96accbed5218a2a72b7Huang Shijie /* for HW_GPMI_CTRL1 */ 22710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie bool use_half_periods; 22810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie uint8_t sample_delay_factor; 229d37e02d8f3a892b57738f1c1431779d5939214d1Huang Shijie uint8_t wrn_dly_sel; 23010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie}; 23110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 23210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie/** 23310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * struct timing_threshod - Timing threshold 23410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @max_data_setup_cycles: The maximum number of data setup cycles that 23510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * can be expressed in the hardware. 23610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @internal_data_setup_in_ns: The time, in ns, that the NFC hardware requires 23710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * for data read internal setup. In the Reference 23810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * Manual, see the chapter "High-Speed NAND 23910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * Timing" for more details. 24010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @max_sample_delay_factor: The maximum sample delay factor that can be 24110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * expressed in the hardware. 24210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @max_dll_clock_period_in_ns: The maximum period of the GPMI clock that the 24310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * sample delay DLL hardware can possibly work 24410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * with (the DLL is unusable with longer periods). 24510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * If the full-cycle period is greater than HALF 24610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * this value, the DLL must be configured to use 24710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * half-periods. 24810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @max_dll_delay_in_ns: The maximum amount of delay, in ns, that the 24910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * DLL can implement. 25010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * @clock_frequency_in_hz: The clock frequency, in Hz, during the current 25110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * I/O transaction. If no I/O transaction is in 25210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * progress, this is the clock frequency during 25310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie * the most recent I/O transaction. 25410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie */ 25510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijiestruct timing_threshod { 25610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie const unsigned int max_chip_count; 25710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie const unsigned int max_data_setup_cycles; 25810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie const unsigned int internal_data_setup_in_ns; 25910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie const unsigned int max_sample_delay_factor; 26010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie const unsigned int max_dll_clock_period_in_ns; 26110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie const unsigned int max_dll_delay_in_ns; 26210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie unsigned long clock_frequency_in_hz; 26310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 26410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie}; 26510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 26610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie/* Common Services */ 26710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijieextern int common_nfc_set_geometry(struct gpmi_nand_data *); 26810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijieextern struct dma_chan *get_dma_chan(struct gpmi_nand_data *); 26910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijieextern void prepare_data_dma(struct gpmi_nand_data *, 27010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie enum dma_data_direction dr); 27110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijieextern int start_dma_without_bch_irq(struct gpmi_nand_data *, 27210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie struct dma_async_tx_descriptor *); 27310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijieextern int start_dma_with_bch_irq(struct gpmi_nand_data *, 27410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie struct dma_async_tx_descriptor *); 27510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 27610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie/* GPMI-NAND helper function library */ 27710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijieextern int gpmi_init(struct gpmi_nand_data *); 278995fbbf563fcec058a1135bdd112ac969c817e65Huang Shijieextern int gpmi_extra_init(struct gpmi_nand_data *); 27910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijieextern void gpmi_clear_bch(struct gpmi_nand_data *); 28010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijieextern void gpmi_dump_info(struct gpmi_nand_data *); 28110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijieextern int bch_set_geometry(struct gpmi_nand_data *); 28210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijieextern int gpmi_is_ready(struct gpmi_nand_data *, unsigned chip); 28310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijieextern int gpmi_send_command(struct gpmi_nand_data *); 28410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijieextern void gpmi_begin(struct gpmi_nand_data *); 28510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijieextern void gpmi_end(struct gpmi_nand_data *); 28610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijieextern int gpmi_read_data(struct gpmi_nand_data *); 28710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijieextern int gpmi_send_data(struct gpmi_nand_data *); 28810a2bcae99267b28e058b089fda30de7397b69f5Huang Shijieextern int gpmi_send_page(struct gpmi_nand_data *, 28910a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie dma_addr_t payload, dma_addr_t auxiliary); 29010a2bcae99267b28e058b089fda30de7397b69f5Huang Shijieextern int gpmi_read_page(struct gpmi_nand_data *, 29110a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie dma_addr_t payload, dma_addr_t auxiliary); 29210a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 29310a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie/* BCH : Status Block Completion Codes */ 29410a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie#define STATUS_GOOD 0x00 29510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie#define STATUS_ERASED 0xff 29610a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie#define STATUS_UNCORRECTABLE 0xfe 29710a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie 2986189cccbe8d16d0ef175bd0dca18e3824ca01174Huang Shijie/* Use the devdata to distinguish different Archs. */ 2996189cccbe8d16d0ef175bd0dca18e3824ca01174Huang Shijie#define GPMI_IS_MX23(x) ((x)->devdata->type == IS_MX23) 3006189cccbe8d16d0ef175bd0dca18e3824ca01174Huang Shijie#define GPMI_IS_MX28(x) ((x)->devdata->type == IS_MX28) 3016189cccbe8d16d0ef175bd0dca18e3824ca01174Huang Shijie#define GPMI_IS_MX6Q(x) ((x)->devdata->type == IS_MX6Q) 30291f5498ebfb2352ed6b5eb2780adcfe019961565Huang Shijie#define GPMI_IS_MX6SX(x) ((x)->devdata->type == IS_MX6SX) 30391f5498ebfb2352ed6b5eb2780adcfe019961565Huang Shijie 30491f5498ebfb2352ed6b5eb2780adcfe019961565Huang Shijie#define GPMI_IS_MX6(x) (GPMI_IS_MX6Q(x) || GPMI_IS_MX6SX(x)) 30510a2bcae99267b28e058b089fda30de7397b69f5Huang Shijie#endif 306