Linux 4.11
[sfrench/cifs-2.6.git] / arch / avr32 / mach-at32ap / include / mach / smc.h
1 /*
2  * Static Memory Controller for AT32 chips
3  *
4  * Copyright (C) 2006 Atmel Corporation
5  *
6  * Inspired by the OMAP2 General-Purpose Memory Controller interface
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  */
12 #ifndef __ARCH_AT32AP_SMC_H
13 #define __ARCH_AT32AP_SMC_H
14
15 /*
16  * All timing parameters are in nanoseconds.
17  */
18 struct smc_timing {
19         /* Delay from address valid to assertion of given strobe */
20         int ncs_read_setup;
21         int nrd_setup;
22         int ncs_write_setup;
23         int nwe_setup;
24
25         /* Pulse length of given strobe */
26         int ncs_read_pulse;
27         int nrd_pulse;
28         int ncs_write_pulse;
29         int nwe_pulse;
30
31         /* Total cycle length of given operation */
32         int read_cycle;
33         int write_cycle;
34
35         /* Minimal recovery times, will extend cycle if needed */
36         int ncs_read_recover;
37         int nrd_recover;
38         int ncs_write_recover;
39         int nwe_recover;
40 };
41
42 /*
43  * All timing parameters are in clock cycles.
44  */
45 struct smc_config {
46
47         /* Delay from address valid to assertion of given strobe */
48         u8              ncs_read_setup;
49         u8              nrd_setup;
50         u8              ncs_write_setup;
51         u8              nwe_setup;
52
53         /* Pulse length of given strobe */
54         u8              ncs_read_pulse;
55         u8              nrd_pulse;
56         u8              ncs_write_pulse;
57         u8              nwe_pulse;
58
59         /* Total cycle length of given operation */
60         u8              read_cycle;
61         u8              write_cycle;
62
63         /* Bus width in bytes */
64         u8              bus_width;
65
66         /*
67          * 0: Data is sampled on rising edge of NCS
68          * 1: Data is sampled on rising edge of NRD
69          */
70         unsigned int    nrd_controlled:1;
71
72         /*
73          * 0: Data is driven on falling edge of NCS
74          * 1: Data is driven on falling edge of NWR
75          */
76         unsigned int    nwe_controlled:1;
77
78         /*
79          * 0: NWAIT is disabled
80          * 1: Reserved
81          * 2: NWAIT is frozen mode
82          * 3: NWAIT in ready mode
83          */
84         unsigned int    nwait_mode:2;
85
86         /*
87          * 0: Byte select access type
88          * 1: Byte write access type
89          */
90         unsigned int    byte_write:1;
91
92         /*
93          * Number of clock cycles before data is released after
94          * the rising edge of the read controlling signal
95          *
96          * Total cycles from SMC is tdf_cycles + 1
97          */
98         unsigned int    tdf_cycles:4;
99
100         /*
101          * 0: TDF optimization disabled
102          * 1: TDF optimization enabled
103          */
104         unsigned int    tdf_mode:1;
105 };
106
107 extern void smc_set_timing(struct smc_config *config,
108                            const struct smc_timing *timing);
109
110 extern int smc_set_configuration(int cs, const struct smc_config *config);
111 extern struct smc_config *smc_get_configuration(int cs);
112
113 #endif /* __ARCH_AT32AP_SMC_H */