1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * OMAP GPMC Platform data 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2014 Texas Instruments, Inc. - https://www.ti.com 6*4882a593Smuzhiyun * Roger Quadros <rogerq@ti.com> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef _GPMC_OMAP_H_ 10*4882a593Smuzhiyun #define _GPMC_OMAP_H_ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* Maximum Number of Chip Selects */ 13*4882a593Smuzhiyun #define GPMC_CS_NUM 8 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* bool type time settings */ 16*4882a593Smuzhiyun struct gpmc_bool_timings { 17*4882a593Smuzhiyun bool cycle2cyclediffcsen; 18*4882a593Smuzhiyun bool cycle2cyclesamecsen; 19*4882a593Smuzhiyun bool we_extra_delay; 20*4882a593Smuzhiyun bool oe_extra_delay; 21*4882a593Smuzhiyun bool adv_extra_delay; 22*4882a593Smuzhiyun bool cs_extra_delay; 23*4882a593Smuzhiyun bool time_para_granularity; 24*4882a593Smuzhiyun }; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /* 27*4882a593Smuzhiyun * Note that all values in this struct are in nanoseconds except sync_clk 28*4882a593Smuzhiyun * (which is in picoseconds), while the register values are in gpmc_fck cycles. 29*4882a593Smuzhiyun */ 30*4882a593Smuzhiyun struct gpmc_timings { 31*4882a593Smuzhiyun /* Minimum clock period for synchronous mode (in picoseconds) */ 32*4882a593Smuzhiyun u32 sync_clk; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* Chip-select signal timings corresponding to GPMC_CS_CONFIG2 */ 35*4882a593Smuzhiyun u32 cs_on; /* Assertion time */ 36*4882a593Smuzhiyun u32 cs_rd_off; /* Read deassertion time */ 37*4882a593Smuzhiyun u32 cs_wr_off; /* Write deassertion time */ 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* ADV signal timings corresponding to GPMC_CONFIG3 */ 40*4882a593Smuzhiyun u32 adv_on; /* Assertion time */ 41*4882a593Smuzhiyun u32 adv_rd_off; /* Read deassertion time */ 42*4882a593Smuzhiyun u32 adv_wr_off; /* Write deassertion time */ 43*4882a593Smuzhiyun u32 adv_aad_mux_on; /* ADV assertion time for AAD */ 44*4882a593Smuzhiyun u32 adv_aad_mux_rd_off; /* ADV read deassertion time for AAD */ 45*4882a593Smuzhiyun u32 adv_aad_mux_wr_off; /* ADV write deassertion time for AAD */ 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun /* WE signals timings corresponding to GPMC_CONFIG4 */ 48*4882a593Smuzhiyun u32 we_on; /* WE assertion time */ 49*4882a593Smuzhiyun u32 we_off; /* WE deassertion time */ 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun /* OE signals timings corresponding to GPMC_CONFIG4 */ 52*4882a593Smuzhiyun u32 oe_on; /* OE assertion time */ 53*4882a593Smuzhiyun u32 oe_off; /* OE deassertion time */ 54*4882a593Smuzhiyun u32 oe_aad_mux_on; /* OE assertion time for AAD */ 55*4882a593Smuzhiyun u32 oe_aad_mux_off; /* OE deassertion time for AAD */ 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun /* Access time and cycle time timings corresponding to GPMC_CONFIG5 */ 58*4882a593Smuzhiyun u32 page_burst_access; /* Multiple access word delay */ 59*4882a593Smuzhiyun u32 access; /* Start-cycle to first data valid delay */ 60*4882a593Smuzhiyun u32 rd_cycle; /* Total read cycle time */ 61*4882a593Smuzhiyun u32 wr_cycle; /* Total write cycle time */ 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun u32 bus_turnaround; 64*4882a593Smuzhiyun u32 cycle2cycle_delay; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun u32 wait_monitoring; 67*4882a593Smuzhiyun u32 clk_activation; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun /* The following are only on OMAP3430 */ 70*4882a593Smuzhiyun u32 wr_access; /* WRACCESSTIME */ 71*4882a593Smuzhiyun u32 wr_data_mux_bus; /* WRDATAONADMUXBUS */ 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun struct gpmc_bool_timings bool_timings; 74*4882a593Smuzhiyun }; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* Device timings in picoseconds */ 77*4882a593Smuzhiyun struct gpmc_device_timings { 78*4882a593Smuzhiyun u32 t_ceasu; /* address setup to CS valid */ 79*4882a593Smuzhiyun u32 t_avdasu; /* address setup to ADV valid */ 80*4882a593Smuzhiyun /* XXX: try to combine t_avdp_r & t_avdp_w. Issue is 81*4882a593Smuzhiyun * of tusb using these timings even for sync whilst 82*4882a593Smuzhiyun * ideally for adv_rd/(wr)_off it should have considered 83*4882a593Smuzhiyun * t_avdh instead. This indirectly necessitates r/w 84*4882a593Smuzhiyun * variations of t_avdp as it is possible to have one 85*4882a593Smuzhiyun * sync & other async 86*4882a593Smuzhiyun */ 87*4882a593Smuzhiyun u32 t_avdp_r; /* ADV low time (what about t_cer ?) */ 88*4882a593Smuzhiyun u32 t_avdp_w; 89*4882a593Smuzhiyun u32 t_aavdh; /* address hold time */ 90*4882a593Smuzhiyun u32 t_oeasu; /* address setup to OE valid */ 91*4882a593Smuzhiyun u32 t_aa; /* access time from ADV assertion */ 92*4882a593Smuzhiyun u32 t_iaa; /* initial access time */ 93*4882a593Smuzhiyun u32 t_oe; /* access time from OE assertion */ 94*4882a593Smuzhiyun u32 t_ce; /* access time from CS asertion */ 95*4882a593Smuzhiyun u32 t_rd_cycle; /* read cycle time */ 96*4882a593Smuzhiyun u32 t_cez_r; /* read CS deassertion to high Z */ 97*4882a593Smuzhiyun u32 t_cez_w; /* write CS deassertion to high Z */ 98*4882a593Smuzhiyun u32 t_oez; /* OE deassertion to high Z */ 99*4882a593Smuzhiyun u32 t_weasu; /* address setup to WE valid */ 100*4882a593Smuzhiyun u32 t_wpl; /* write assertion time */ 101*4882a593Smuzhiyun u32 t_wph; /* write deassertion time */ 102*4882a593Smuzhiyun u32 t_wr_cycle; /* write cycle time */ 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun u32 clk; 105*4882a593Smuzhiyun u32 t_bacc; /* burst access valid clock to output delay */ 106*4882a593Smuzhiyun u32 t_ces; /* CS setup time to clk */ 107*4882a593Smuzhiyun u32 t_avds; /* ADV setup time to clk */ 108*4882a593Smuzhiyun u32 t_avdh; /* ADV hold time from clk */ 109*4882a593Smuzhiyun u32 t_ach; /* address hold time from clk */ 110*4882a593Smuzhiyun u32 t_rdyo; /* clk to ready valid */ 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun u32 t_ce_rdyz; /* XXX: description ?, or use t_cez instead */ 113*4882a593Smuzhiyun u32 t_ce_avd; /* CS on to ADV on delay */ 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun /* XXX: check the possibility of combining 116*4882a593Smuzhiyun * cyc_aavhd_oe & cyc_aavdh_we 117*4882a593Smuzhiyun */ 118*4882a593Smuzhiyun u8 cyc_aavdh_oe;/* read address hold time in cycles */ 119*4882a593Smuzhiyun u8 cyc_aavdh_we;/* write address hold time in cycles */ 120*4882a593Smuzhiyun u8 cyc_oe; /* access time from OE assertion in cycles */ 121*4882a593Smuzhiyun u8 cyc_wpl; /* write deassertion time in cycles */ 122*4882a593Smuzhiyun u32 cyc_iaa; /* initial access time in cycles */ 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun /* extra delays */ 125*4882a593Smuzhiyun bool ce_xdelay; 126*4882a593Smuzhiyun bool avd_xdelay; 127*4882a593Smuzhiyun bool oe_xdelay; 128*4882a593Smuzhiyun bool we_xdelay; 129*4882a593Smuzhiyun }; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun #define GPMC_BURST_4 4 /* 4 word burst */ 132*4882a593Smuzhiyun #define GPMC_BURST_8 8 /* 8 word burst */ 133*4882a593Smuzhiyun #define GPMC_BURST_16 16 /* 16 word burst */ 134*4882a593Smuzhiyun #define GPMC_DEVWIDTH_8BIT 1 /* 8-bit device width */ 135*4882a593Smuzhiyun #define GPMC_DEVWIDTH_16BIT 2 /* 16-bit device width */ 136*4882a593Smuzhiyun #define GPMC_MUX_AAD 1 /* Addr-Addr-Data multiplex */ 137*4882a593Smuzhiyun #define GPMC_MUX_AD 2 /* Addr-Data multiplex */ 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun struct gpmc_settings { 140*4882a593Smuzhiyun bool burst_wrap; /* enables wrap bursting */ 141*4882a593Smuzhiyun bool burst_read; /* enables read page/burst mode */ 142*4882a593Smuzhiyun bool burst_write; /* enables write page/burst mode */ 143*4882a593Smuzhiyun bool device_nand; /* device is NAND */ 144*4882a593Smuzhiyun bool sync_read; /* enables synchronous reads */ 145*4882a593Smuzhiyun bool sync_write; /* enables synchronous writes */ 146*4882a593Smuzhiyun bool wait_on_read; /* monitor wait on reads */ 147*4882a593Smuzhiyun bool wait_on_write; /* monitor wait on writes */ 148*4882a593Smuzhiyun u32 burst_len; /* page/burst length */ 149*4882a593Smuzhiyun u32 device_width; /* device bus width (8 or 16 bit) */ 150*4882a593Smuzhiyun u32 mux_add_data; /* multiplex address & data */ 151*4882a593Smuzhiyun u32 wait_pin; /* wait-pin to be used */ 152*4882a593Smuzhiyun }; 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun /* Data for each chip select */ 155*4882a593Smuzhiyun struct gpmc_omap_cs_data { 156*4882a593Smuzhiyun bool valid; /* data is valid */ 157*4882a593Smuzhiyun bool is_nand; /* device within this CS is NAND */ 158*4882a593Smuzhiyun struct gpmc_settings *settings; 159*4882a593Smuzhiyun struct gpmc_device_timings *device_timings; 160*4882a593Smuzhiyun struct gpmc_timings *gpmc_timings; 161*4882a593Smuzhiyun struct platform_device *pdev; /* device within this CS region */ 162*4882a593Smuzhiyun unsigned int pdata_size; 163*4882a593Smuzhiyun }; 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun struct gpmc_omap_platform_data { 166*4882a593Smuzhiyun struct gpmc_omap_cs_data cs[GPMC_CS_NUM]; 167*4882a593Smuzhiyun }; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun #endif /* _GPMC_OMAP_H */ 170