/* * Static Memory Controller for AT32 chips * * Copyright (C) 2006 Atmel Corporation * * Inspired by the OMAP2 General-Purpose Memory Controller interface * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #ifndef __ARCH_AT32AP_SMC_H #define __ARCH_AT32AP_SMC_H /* * All timing parameters are in nanoseconds. */ struct smc_timing { /* Delay from address valid to assertion of given strobe */ int ncs_read_setup; int nrd_setup; int ncs_write_setup; int nwe_setup; /* Pulse length of given strobe */ int ncs_read_pulse; int nrd_pulse; int ncs_write_pulse; int nwe_pulse; /* Total cycle length of given operation */ int read_cycle; int write_cycle; /* Minimal recovery times, will extend cycle if needed */ int ncs_read_recover; int nrd_recover; int ncs_write_recover; int nwe_recover; }; /* * All timing parameters are in clock cycles. */ struct smc_config { /* Delay from address valid to assertion of given strobe */ u8 ncs_read_setup; u8 nrd_setup; u8 ncs_write_setup; u8 nwe_setup; /* Pulse length of given strobe */ u8 ncs_read_pulse; u8 nrd_pulse; u8 ncs_write_pulse; u8 nwe_pulse; /* Total cycle length of given operation */ u8 read_cycle; u8 write_cycle; /* Bus width in bytes */ u8 bus_width; /* * 0: Data is sampled on rising edge of NCS * 1: Data is sampled on rising edge of NRD */ unsigned int nrd_controlled:1; /* * 0: Data is driven on falling edge of NCS * 1: Data is driven on falling edge of NWR */ unsigned int nwe_controlled:1; /* * 0: NWAIT is disabled * 1: Reserved * 2: NWAIT is frozen mode * 3: NWAIT in ready mode */ unsigned int nwait_mode:2; /* * 0: Byte select access type * 1: Byte write access type */ unsigned int byte_write:1; /* * Number of clock cycles before data is released after * the rising edge of the read controlling signal * * Total cycles from SMC is tdf_cycles + 1 */ unsigned int tdf_cycles:4; /* * 0: TDF optimization disabled * 1: TDF optimization enabled */ unsigned int tdf_mode:1; }; extern void smc_set_timing(struct smc_config *config, const struct smc_timing *timing); extern int smc_set_configuration(int cs, const struct smc_config *config); extern struct smc_config *smc_get_configuration(int cs); #endif /* __ARCH_AT32AP_SMC_H */