1
2
3
4
5
6
7
8
9
10
11#define GPMC_CS_NUM 8
12
13#define GPMC_CONFIG_WP 0x00000005
14
15#define GPMC_IRQ_FIFOEVENTENABLE 0x01
16#define GPMC_IRQ_COUNT_EVENT 0x02
17
18#define GPMC_BURST_4 4
19#define GPMC_BURST_8 8
20#define GPMC_BURST_16 16
21#define GPMC_DEVWIDTH_8BIT 1
22#define GPMC_DEVWIDTH_16BIT 2
23#define GPMC_MUX_AAD 1
24#define GPMC_MUX_AD 2
25
26
27struct gpmc_bool_timings {
28 bool cycle2cyclediffcsen;
29 bool cycle2cyclesamecsen;
30 bool we_extra_delay;
31 bool oe_extra_delay;
32 bool adv_extra_delay;
33 bool cs_extra_delay;
34 bool time_para_granularity;
35};
36
37
38
39
40
41struct gpmc_timings {
42
43 u32 sync_clk;
44
45
46 u32 cs_on;
47 u32 cs_rd_off;
48 u32 cs_wr_off;
49
50
51 u32 adv_on;
52 u32 adv_rd_off;
53 u32 adv_wr_off;
54
55
56 u32 we_on;
57 u32 we_off;
58
59
60 u32 oe_on;
61 u32 oe_off;
62
63
64 u32 page_burst_access;
65 u32 access;
66 u32 rd_cycle;
67 u32 wr_cycle;
68
69 u32 bus_turnaround;
70 u32 cycle2cycle_delay;
71
72 u32 wait_monitoring;
73 u32 clk_activation;
74
75
76 u32 wr_access;
77 u32 wr_data_mux_bus;
78
79 struct gpmc_bool_timings bool_timings;
80};
81
82
83struct gpmc_device_timings {
84 u32 t_ceasu;
85 u32 t_avdasu;
86
87
88
89
90
91
92
93 u32 t_avdp_r;
94 u32 t_avdp_w;
95 u32 t_aavdh;
96 u32 t_oeasu;
97 u32 t_aa;
98 u32 t_iaa;
99 u32 t_oe;
100 u32 t_ce;
101 u32 t_rd_cycle;
102 u32 t_cez_r;
103 u32 t_cez_w;
104 u32 t_oez;
105 u32 t_weasu;
106 u32 t_wpl;
107 u32 t_wph;
108 u32 t_wr_cycle;
109
110 u32 clk;
111 u32 t_bacc;
112 u32 t_ces;
113 u32 t_avds;
114 u32 t_avdh;
115 u32 t_ach;
116 u32 t_rdyo;
117
118 u32 t_ce_rdyz;
119 u32 t_ce_avd;
120
121
122
123
124 u8 cyc_aavdh_oe;
125 u8 cyc_aavdh_we;
126 u8 cyc_oe;
127 u8 cyc_wpl;
128 u32 cyc_iaa;
129
130
131 bool ce_xdelay;
132 bool avd_xdelay;
133 bool oe_xdelay;
134 bool we_xdelay;
135};
136
137struct gpmc_settings {
138 bool burst_wrap;
139 bool burst_read;
140 bool burst_write;
141 bool device_nand;
142 bool sync_read;
143 bool sync_write;
144 bool wait_on_read;
145 bool wait_on_write;
146 u32 burst_len;
147 u32 device_width;
148 u32 mux_add_data;
149 u32 wait_pin;
150};
151
152extern int gpmc_calc_timings(struct gpmc_timings *gpmc_t,
153 struct gpmc_settings *gpmc_s,
154 struct gpmc_device_timings *dev_t);
155
156struct gpmc_nand_regs;
157struct device_node;
158
159extern void gpmc_update_nand_reg(struct gpmc_nand_regs *reg, int cs);
160extern int gpmc_get_client_irq(unsigned irq_config);
161
162extern unsigned int gpmc_ticks_to_ns(unsigned int ticks);
163
164extern void gpmc_cs_write_reg(int cs, int idx, u32 val);
165extern int gpmc_calc_divider(unsigned int sync_clk);
166extern int gpmc_cs_set_timings(int cs, const struct gpmc_timings *t,
167 const struct gpmc_settings *s);
168extern int gpmc_cs_program_settings(int cs, struct gpmc_settings *p);
169extern int gpmc_cs_request(int cs, unsigned long size, unsigned long *base);
170extern void gpmc_cs_free(int cs);
171extern int gpmc_configure(int cmd, int wval);
172extern void gpmc_read_settings_dt(struct device_node *np,
173 struct gpmc_settings *p);
174
175extern void omap3_gpmc_save_context(void);
176extern void omap3_gpmc_restore_context(void);
177
178struct gpmc_timings;
179struct omap_nand_platform_data;
180struct omap_onenand_platform_data;
181
182#if IS_ENABLED(CONFIG_MTD_NAND_OMAP2)
183extern int gpmc_nand_init(struct omap_nand_platform_data *d,
184 struct gpmc_timings *gpmc_t);
185#else
186static inline int gpmc_nand_init(struct omap_nand_platform_data *d,
187 struct gpmc_timings *gpmc_t)
188{
189 return 0;
190}
191#endif
192
193#if IS_ENABLED(CONFIG_MTD_ONENAND_OMAP2)
194extern void gpmc_onenand_init(struct omap_onenand_platform_data *d);
195#else
196#define board_onenand_data NULL
197static inline void gpmc_onenand_init(struct omap_onenand_platform_data *d)
198{
199}
200#endif
201