aboutsummaryrefslogtreecommitdiffstats
path: root/arch/blackfin/include/asm
diff options
context:
space:
mode:
authorBob Liu <lliubbo@gmail.com>2012-07-22 22:47:48 -0400
committerBob Liu <lliubbo@gmail.com>2012-07-24 01:39:49 -0400
commitf82f16d2f55a68a5134e26edbc9303fe8048764f (patch)
tree834e3cec640d2a56958bb5ced476b20a30e99a02 /arch/blackfin/include/asm
parente70f466067ef980876d6a190426b3670bccee4a7 (diff)
bfin: reorg clock init steps for bf609
So that user can set the clocks through menuconfig. Signed-off-by: Bob Liu <lliubbo@gmail.com>
Diffstat (limited to 'arch/blackfin/include/asm')
-rw-r--r--arch/blackfin/include/asm/mem_init.h212
1 files changed, 212 insertions, 0 deletions
diff --git a/arch/blackfin/include/asm/mem_init.h b/arch/blackfin/include/asm/mem_init.h
index 237579935e29..f019e9bcefe9 100644
--- a/arch/blackfin/include/asm/mem_init.h
+++ b/arch/blackfin/include/asm/mem_init.h
@@ -6,6 +6,9 @@
6 * Licensed under the GPL-2 or later. 6 * Licensed under the GPL-2 or later.
7 */ 7 */
8 8
9#ifndef __MEM_INIT_H__
10#define __MEM_INIT_H__
11
9#if defined(EBIU_SDGCTL) 12#if defined(EBIU_SDGCTL)
10#if defined(CONFIG_MEM_MT48LC16M16A2TG_75) || \ 13#if defined(CONFIG_MEM_MT48LC16M16A2TG_75) || \
11 defined(CONFIG_MEM_MT48LC64M4A2FB_7E) || \ 14 defined(CONFIG_MEM_MT48LC64M4A2FB_7E) || \
@@ -277,3 +280,212 @@
277#else 280#else
278#define PLL_BYPASS 0 281#define PLL_BYPASS 0
279#endif 282#endif
283
284#ifdef CONFIG_BF60x
285
286/* DMC status bits */
287#define IDLE 0x1
288#define MEMINITDONE 0x4
289#define SRACK 0x8
290#define PDACK 0x10
291#define DPDACK 0x20
292#define DLLCALDONE 0x2000
293#define PENDREF 0xF0000
294#define PHYRDPHASE 0xF00000
295#define PHYRDPHASE_OFFSET 20
296
297/* DMC control bits */
298#define LPDDR 0x2
299#define INIT 0x4
300#define SRREQ 0x8
301#define PDREQ 0x10
302#define DPDREQ 0x20
303#define PREC 0x40
304#define ADDRMODE 0x100
305#define RDTOWR 0xE00
306#define PPREF 0x1000
307#define DLLCAL 0x2000
308
309/* DMC DLL control bits */
310#define DLLCALRDCNT 0xFF
311#define DATACYC 0xF00
312#define DATACYC_OFFSET 8
313
314/* CGU Divisor bits */
315#define CSEL_OFFSET 0
316#define S0SEL_OFFSET 5
317#define SYSSEL_OFFSET 8
318#define S1SEL_OFFSET 13
319#define DSEL_OFFSET 16
320#define OSEL_OFFSET 22
321#define ALGN 0x20000000
322#define UPDT 0x40000000
323#define LOCK 0x80000000
324
325/* CGU Status bits */
326#define PLLEN 0x1
327#define PLLBP 0x2
328#define PLOCK 0x4
329#define CLKSALGN 0x8
330
331/* CGU Control bits */
332#define MSEL_MASK 0x7F00
333#define DF_MASK 0x1
334
335struct ddr_config {
336 u32 ddr_clk;
337 u32 dmc_ddrctl;
338 u32 dmc_ddrcfg;
339 u32 dmc_ddrtr0;
340 u32 dmc_ddrtr1;
341 u32 dmc_ddrtr2;
342 u32 dmc_ddrmr;
343 u32 dmc_ddrmr1;
344};
345
346#if defined(CONFIG_MEM_MT47H64M16)
347static struct ddr_config ddr_config_table[] __attribute__((section(".data_l1"))) = {
348 [0] = {
349 .ddr_clk = 125,
350 .dmc_ddrctl = 0x00000904,
351 .dmc_ddrcfg = 0x00000422,
352 .dmc_ddrtr0 = 0x20705212,
353 .dmc_ddrtr1 = 0x201003CF,
354 .dmc_ddrtr2 = 0x00320107,
355 .dmc_ddrmr = 0x00000422,
356 .dmc_ddrmr1 = 0x4,
357 },
358 [1] = {
359 .ddr_clk = 133,
360 .dmc_ddrctl = 0x00000904,
361 .dmc_ddrcfg = 0x00000422,
362 .dmc_ddrtr0 = 0x20806313,
363 .dmc_ddrtr1 = 0x2013040D,
364 .dmc_ddrtr2 = 0x00320108,
365 .dmc_ddrmr = 0x00000632,
366 .dmc_ddrmr1 = 0x4,
367 },
368 [2] = {
369 .ddr_clk = 150,
370 .dmc_ddrctl = 0x00000904,
371 .dmc_ddrcfg = 0x00000422,
372 .dmc_ddrtr0 = 0x20A07323,
373 .dmc_ddrtr1 = 0x20160492,
374 .dmc_ddrtr2 = 0x00320209,
375 .dmc_ddrmr = 0x00000632,
376 .dmc_ddrmr1 = 0x4,
377 },
378 [3] = {
379 .ddr_clk = 166,
380 .dmc_ddrctl = 0x00000904,
381 .dmc_ddrcfg = 0x00000422,
382 .dmc_ddrtr0 = 0x20A07323,
383 .dmc_ddrtr1 = 0x2016050E,
384 .dmc_ddrtr2 = 0x00320209,
385 .dmc_ddrmr = 0x00000632,
386 .dmc_ddrmr1 = 0x4,
387 },
388 [4] = {
389 .ddr_clk = 200,
390 .dmc_ddrctl = 0x00000904,
391 .dmc_ddrcfg = 0x00000422,
392 .dmc_ddrtr0 = 0x20a07323,
393 .dmc_ddrtr1 = 0x2016050f,
394 .dmc_ddrtr2 = 0x00320509,
395 .dmc_ddrmr = 0x00000632,
396 .dmc_ddrmr1 = 0x4,
397 },
398 [5] = {
399 .ddr_clk = 225,
400 .dmc_ddrctl = 0x00000904,
401 .dmc_ddrcfg = 0x00000422,
402 .dmc_ddrtr0 = 0x20E0A424,
403 .dmc_ddrtr1 = 0x302006DB,
404 .dmc_ddrtr2 = 0x0032020D,
405 .dmc_ddrmr = 0x00000842,
406 .dmc_ddrmr1 = 0x4,
407 },
408 [6] = {
409 .ddr_clk = 250,
410 .dmc_ddrctl = 0x00000904,
411 .dmc_ddrcfg = 0x00000422,
412 .dmc_ddrtr0 = 0x20E0A424,
413 .dmc_ddrtr1 = 0x3020079E,
414 .dmc_ddrtr2 = 0x0032020D,
415 .dmc_ddrmr = 0x00000842,
416 .dmc_ddrmr1 = 0x4,
417 },
418};
419#endif
420
421static inline void dmc_enter_self_refresh(void)
422{
423 if (bfin_read_DMC0_STAT() & MEMINITDONE) {
424 bfin_write_DMC0_CTL(bfin_read_DMC0_CTL() | SRREQ);
425 while (!(bfin_read_DMC0_STAT() & SRACK))
426 continue;
427 }
428}
429
430static inline void dmc_exit_self_refresh(void)
431{
432 if (bfin_read_DMC0_STAT() & MEMINITDONE) {
433 bfin_write_DMC0_CTL(bfin_read_DMC0_CTL() & ~SRREQ);
434 while (bfin_read_DMC0_STAT() & SRACK)
435 continue;
436 }
437}
438
439static inline void init_cgu(u32 cgu_div, u32 cgu_ctl)
440{
441 dmc_enter_self_refresh();
442
443 /* Don't set the same value of MSEL and DF to CGU_CTL */
444 if ((bfin_read32(CGU0_CTL) & (MSEL_MASK | DF_MASK))
445 != cgu_ctl) {
446 bfin_write32(CGU0_DIV, cgu_div);
447 bfin_write32(CGU0_CTL, cgu_ctl);
448 while ((bfin_read32(CGU0_STAT) & (CLKSALGN | PLLBP)) ||
449 !(bfin_read32(CGU0_STAT) & PLOCK))
450 continue;
451 }
452
453 bfin_write32(CGU0_DIV, cgu_div | UPDT);
454 while (bfin_read32(CGU0_STAT) & CLKSALGN)
455 continue;
456
457 dmc_exit_self_refresh();
458}
459
460static inline void init_dmc(u32 dmc_clk)
461{
462 int i, dlldatacycle, dll_ctl;
463
464 for (i = 0; i < 7; i++) {
465 if (ddr_config_table[i].ddr_clk == dmc_clk) {
466 bfin_write_DMC0_CFG(ddr_config_table[i].dmc_ddrcfg);
467 bfin_write_DMC0_TR0(ddr_config_table[i].dmc_ddrtr0);
468 bfin_write_DMC0_TR1(ddr_config_table[i].dmc_ddrtr1);
469 bfin_write_DMC0_TR2(ddr_config_table[i].dmc_ddrtr2);
470 bfin_write_DMC0_MR(ddr_config_table[i].dmc_ddrmr);
471 bfin_write_DMC0_EMR1(ddr_config_table[i].dmc_ddrmr1);
472 bfin_write_DMC0_CTL(ddr_config_table[i].dmc_ddrctl);
473 break;
474 }
475 }
476
477 while (!(bfin_read_DMC0_STAT() & MEMINITDONE))
478 continue;
479
480 dlldatacycle = (bfin_read_DMC0_STAT() & PHYRDPHASE) >> PHYRDPHASE_OFFSET;
481 dll_ctl = bfin_read_DMC0_DLLCTL();
482 dll_ctl &= ~DATACYC;
483 bfin_write_DMC0_DLLCTL(dll_ctl | (dlldatacycle << DATACYC_OFFSET));
484
485 while (!(bfin_read_DMC0_STAT() & DLLCALDONE))
486 continue;
487}
488#endif
489
490#endif /*__MEM_INIT_H__*/
491