2 * linux/arch/arm/mach-omap2/gpmc-onenand.c
4 * Copyright (C) 2006 - 2009 Nokia Corporation
5 * Contacts: Juha Yrjola
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.
13 #include <linux/string.h>
14 #include <linux/kernel.h>
15 #include <linux/platform_device.h>
16 #include <linux/mtd/onenand_regs.h>
18 #include <linux/omap-gpmc.h>
19 #include <linux/platform_data/mtd-onenand-omap2.h>
20 #include <linux/err.h>
22 #include <asm/mach/flash.h>
26 #define ONENAND_IO_SIZE SZ_128K
28 #define ONENAND_FLAG_SYNCREAD (1 << 0)
29 #define ONENAND_FLAG_SYNCWRITE (1 << 1)
30 #define ONENAND_FLAG_HF (1 << 2)
31 #define ONENAND_FLAG_VHF (1 << 3)
33 static unsigned onenand_flags
;
34 static unsigned latency
;
36 static struct omap_onenand_platform_data
*gpmc_onenand_data
;
38 static struct resource gpmc_onenand_resource
= {
39 .flags
= IORESOURCE_MEM
,
42 static struct platform_device gpmc_onenand_device
= {
43 .name
= "omap2-onenand",
46 .resource
= &gpmc_onenand_resource
,
49 static struct gpmc_settings onenand_async
= {
50 .device_width
= GPMC_DEVWIDTH_16BIT
,
51 .mux_add_data
= GPMC_MUX_AD
,
54 static struct gpmc_settings onenand_sync
= {
57 .burst_len
= GPMC_BURST_16
,
58 .device_width
= GPMC_DEVWIDTH_16BIT
,
59 .mux_add_data
= GPMC_MUX_AD
,
63 static void omap2_onenand_calc_async_timings(struct gpmc_timings
*t
)
65 struct gpmc_device_timings dev_t
;
67 const int t_avdp
= 12;
68 const int t_aavdh
= 7;
72 const int t_cez
= 20; /* max of t_cez, t_oez */
76 memset(&dev_t
, 0, sizeof(dev_t
));
78 dev_t
.t_avdp_r
= max_t(int, t_avdp
, t_cer
) * 1000;
79 dev_t
.t_avdp_w
= dev_t
.t_avdp_r
;
80 dev_t
.t_aavdh
= t_aavdh
* 1000;
81 dev_t
.t_aa
= t_aa
* 1000;
82 dev_t
.t_ce
= t_ce
* 1000;
83 dev_t
.t_oe
= t_oe
* 1000;
84 dev_t
.t_cez_r
= t_cez
* 1000;
85 dev_t
.t_cez_w
= dev_t
.t_cez_r
;
86 dev_t
.t_wpl
= t_wpl
* 1000;
87 dev_t
.t_wph
= t_wph
* 1000;
89 gpmc_calc_timings(t
, &onenand_async
, &dev_t
);
92 static void omap2_onenand_set_async_mode(void __iomem
*onenand_base
)
96 /* Ensure sync read and sync write are disabled */
97 reg
= readw(onenand_base
+ ONENAND_REG_SYS_CFG1
);
98 reg
&= ~ONENAND_SYS_CFG1_SYNC_READ
& ~ONENAND_SYS_CFG1_SYNC_WRITE
;
99 writew(reg
, onenand_base
+ ONENAND_REG_SYS_CFG1
);
102 static void set_onenand_cfg(void __iomem
*onenand_base
)
106 reg
= readw(onenand_base
+ ONENAND_REG_SYS_CFG1
);
107 reg
&= ~((0x7 << ONENAND_SYS_CFG1_BRL_SHIFT
) | (0x7 << 9));
108 reg
|= (latency
<< ONENAND_SYS_CFG1_BRL_SHIFT
) |
109 ONENAND_SYS_CFG1_BL_16
;
110 if (onenand_flags
& ONENAND_FLAG_SYNCREAD
)
111 reg
|= ONENAND_SYS_CFG1_SYNC_READ
;
113 reg
&= ~ONENAND_SYS_CFG1_SYNC_READ
;
114 if (onenand_flags
& ONENAND_FLAG_SYNCWRITE
)
115 reg
|= ONENAND_SYS_CFG1_SYNC_WRITE
;
117 reg
&= ~ONENAND_SYS_CFG1_SYNC_WRITE
;
118 if (onenand_flags
& ONENAND_FLAG_HF
)
119 reg
|= ONENAND_SYS_CFG1_HF
;
121 reg
&= ~ONENAND_SYS_CFG1_HF
;
122 if (onenand_flags
& ONENAND_FLAG_VHF
)
123 reg
|= ONENAND_SYS_CFG1_VHF
;
125 reg
&= ~ONENAND_SYS_CFG1_VHF
;
126 writew(reg
, onenand_base
+ ONENAND_REG_SYS_CFG1
);
129 static int omap2_onenand_get_freq(struct omap_onenand_platform_data
*cfg
,
130 void __iomem
*onenand_base
)
132 u16 ver
= readw(onenand_base
+ ONENAND_REG_VERSION_ID
);
135 switch ((ver
>> 4) & 0xf) {
159 static void omap2_onenand_calc_sync_timings(struct gpmc_timings
*t
,
163 struct gpmc_device_timings dev_t
;
164 const int t_cer
= 15;
165 const int t_avdp
= 12;
166 const int t_cez
= 20; /* max of t_cez, t_oez */
167 const int t_wpl
= 40;
168 const int t_wph
= 30;
169 int min_gpmc_clk_period
, t_ces
, t_avds
, t_avdh
, t_ach
, t_aavdh
, t_rdyo
;
170 int div
, gpmc_clk_ns
;
172 if (flags
& ONENAND_SYNC_READ
)
173 onenand_flags
= ONENAND_FLAG_SYNCREAD
;
174 else if (flags
& ONENAND_SYNC_READWRITE
)
175 onenand_flags
= ONENAND_FLAG_SYNCREAD
| ONENAND_FLAG_SYNCWRITE
;
179 min_gpmc_clk_period
= 9600; /* 104 MHz */
188 min_gpmc_clk_period
= 12000; /* 83 MHz */
197 min_gpmc_clk_period
= 15000; /* 66 MHz */
206 min_gpmc_clk_period
= 18500; /* 54 MHz */
213 onenand_flags
&= ~ONENAND_FLAG_SYNCWRITE
;
217 div
= gpmc_calc_divider(min_gpmc_clk_period
);
218 gpmc_clk_ns
= gpmc_ticks_to_ns(div
);
219 if (gpmc_clk_ns
< 15) /* >66MHz */
220 onenand_flags
|= ONENAND_FLAG_HF
;
222 onenand_flags
&= ~ONENAND_FLAG_HF
;
223 if (gpmc_clk_ns
< 12) /* >83MHz */
224 onenand_flags
|= ONENAND_FLAG_VHF
;
226 onenand_flags
&= ~ONENAND_FLAG_VHF
;
227 if (onenand_flags
& ONENAND_FLAG_VHF
)
229 else if (onenand_flags
& ONENAND_FLAG_HF
)
231 else if (gpmc_clk_ns
>= 25) /* 40 MHz*/
236 /* Set synchronous read timings */
237 memset(&dev_t
, 0, sizeof(dev_t
));
239 if (onenand_flags
& ONENAND_FLAG_SYNCREAD
)
240 onenand_sync
.sync_read
= true;
241 if (onenand_flags
& ONENAND_FLAG_SYNCWRITE
) {
242 onenand_sync
.sync_write
= true;
243 onenand_sync
.burst_write
= true;
245 dev_t
.t_avdp_w
= max(t_avdp
, t_cer
) * 1000;
246 dev_t
.t_wpl
= t_wpl
* 1000;
247 dev_t
.t_wph
= t_wph
* 1000;
248 dev_t
.t_aavdh
= t_aavdh
* 1000;
250 dev_t
.ce_xdelay
= true;
251 dev_t
.avd_xdelay
= true;
252 dev_t
.oe_xdelay
= true;
253 dev_t
.we_xdelay
= true;
254 dev_t
.clk
= min_gpmc_clk_period
;
255 dev_t
.t_bacc
= dev_t
.clk
;
256 dev_t
.t_ces
= t_ces
* 1000;
257 dev_t
.t_avds
= t_avds
* 1000;
258 dev_t
.t_avdh
= t_avdh
* 1000;
259 dev_t
.t_ach
= t_ach
* 1000;
260 dev_t
.cyc_iaa
= (latency
+ 1);
261 dev_t
.t_cez_r
= t_cez
* 1000;
262 dev_t
.t_cez_w
= dev_t
.t_cez_r
;
263 dev_t
.cyc_aavdh_oe
= 1;
264 dev_t
.t_rdyo
= t_rdyo
* 1000 + min_gpmc_clk_period
;
266 gpmc_calc_timings(t
, &onenand_sync
, &dev_t
);
269 static int omap2_onenand_setup_async(void __iomem
*onenand_base
)
271 struct gpmc_timings t
;
274 if (gpmc_onenand_data
->of_node
) {
275 gpmc_read_settings_dt(gpmc_onenand_data
->of_node
,
277 if (onenand_async
.sync_read
|| onenand_async
.sync_write
) {
278 if (onenand_async
.sync_write
)
279 gpmc_onenand_data
->flags
|=
280 ONENAND_SYNC_READWRITE
;
282 gpmc_onenand_data
->flags
|= ONENAND_SYNC_READ
;
283 onenand_async
.sync_read
= false;
284 onenand_async
.sync_write
= false;
288 omap2_onenand_set_async_mode(onenand_base
);
290 omap2_onenand_calc_async_timings(&t
);
292 ret
= gpmc_cs_program_settings(gpmc_onenand_data
->cs
, &onenand_async
);
296 ret
= gpmc_cs_set_timings(gpmc_onenand_data
->cs
, &t
, &onenand_async
);
300 omap2_onenand_set_async_mode(onenand_base
);
305 static int omap2_onenand_setup_sync(void __iomem
*onenand_base
, int *freq_ptr
)
307 int ret
, freq
= *freq_ptr
;
308 struct gpmc_timings t
;
311 /* Very first call freq is not known */
312 freq
= omap2_onenand_get_freq(gpmc_onenand_data
, onenand_base
);
313 set_onenand_cfg(onenand_base
);
316 if (gpmc_onenand_data
->of_node
) {
317 gpmc_read_settings_dt(gpmc_onenand_data
->of_node
,
321 * FIXME: Appears to be legacy code from initial ONENAND commit.
322 * Unclear what boards this is for and if this can be removed.
324 if (!cpu_is_omap34xx())
325 onenand_sync
.wait_on_read
= true;
328 omap2_onenand_calc_sync_timings(&t
, gpmc_onenand_data
->flags
, freq
);
330 ret
= gpmc_cs_program_settings(gpmc_onenand_data
->cs
, &onenand_sync
);
334 ret
= gpmc_cs_set_timings(gpmc_onenand_data
->cs
, &t
, &onenand_sync
);
338 set_onenand_cfg(onenand_base
);
345 static int gpmc_onenand_setup(void __iomem
*onenand_base
, int *freq_ptr
)
347 struct device
*dev
= &gpmc_onenand_device
.dev
;
348 unsigned l
= ONENAND_SYNC_READ
| ONENAND_SYNC_READWRITE
;
351 ret
= omap2_onenand_setup_async(onenand_base
);
353 dev_err(dev
, "unable to set to async mode\n");
357 if (!(gpmc_onenand_data
->flags
& l
))
360 ret
= omap2_onenand_setup_sync(onenand_base
, freq_ptr
);
362 dev_err(dev
, "unable to set to sync mode\n");
366 void gpmc_onenand_init(struct omap_onenand_platform_data
*_onenand_data
)
369 struct device
*dev
= &gpmc_onenand_device
.dev
;
371 gpmc_onenand_data
= _onenand_data
;
372 gpmc_onenand_data
->onenand_setup
= gpmc_onenand_setup
;
373 gpmc_onenand_device
.dev
.platform_data
= gpmc_onenand_data
;
375 if (cpu_is_omap24xx() &&
376 (gpmc_onenand_data
->flags
& ONENAND_SYNC_READWRITE
)) {
377 dev_warn(dev
, "OneNAND using only SYNC_READ on 24xx\n");
378 gpmc_onenand_data
->flags
&= ~ONENAND_SYNC_READWRITE
;
379 gpmc_onenand_data
->flags
|= ONENAND_SYNC_READ
;
382 if (cpu_is_omap34xx())
383 gpmc_onenand_data
->flags
|= ONENAND_IN_OMAP34XX
;
385 gpmc_onenand_data
->flags
&= ~ONENAND_IN_OMAP34XX
;
387 err
= gpmc_cs_request(gpmc_onenand_data
->cs
, ONENAND_IO_SIZE
,
388 (unsigned long *)&gpmc_onenand_resource
.start
);
390 dev_err(dev
, "Cannot request GPMC CS %d, error %d\n",
391 gpmc_onenand_data
->cs
, err
);
395 gpmc_onenand_resource
.end
= gpmc_onenand_resource
.start
+
398 if (platform_device_register(&gpmc_onenand_device
) < 0) {
399 dev_err(dev
, "Unable to register OneNAND device\n");
400 gpmc_cs_free(gpmc_onenand_data
->cs
);