Blame view

kernel/linux-imx6_3.14.28/arch/blackfin/mach-common/clocks-init.c 3.25 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
  /*
   * arch/blackfin/mach-common/clocks-init.c - reprogram clocks / memory
   *
   * Copyright 2004-2008 Analog Devices Inc.
   *
   * Licensed under the GPL-2 or later.
   */
  
  #include <linux/linkage.h>
  #include <asm/blackfin.h>
  
  #include <asm/dma.h>
  #include <asm/clocks.h>
  #include <asm/mem_init.h>
  #include <asm/dpmc.h>
  
  #ifdef CONFIG_BF60x
  
  #define CGU_CTL_VAL ((CONFIG_VCO_MULT << 8) | CLKIN_HALF)
  #define CGU_DIV_VAL \
  	((CONFIG_CCLK_DIV   << CSEL_OFFSET)   | \
  	(CONFIG_SCLK_DIV << SYSSEL_OFFSET)   | \
  	(CONFIG_SCLK0_DIV  << S0SEL_OFFSET)  | \
  	(CONFIG_SCLK1_DIV  << S1SEL_OFFSET)  | \
  	(CONFIG_DCLK_DIV   << DSEL_OFFSET))
  
  #define CONFIG_BFIN_DCLK (((CONFIG_CLKIN_HZ * CONFIG_VCO_MULT) / CONFIG_DCLK_DIV) / 1000000)
  #if ((CONFIG_BFIN_DCLK != 125) && \
  	(CONFIG_BFIN_DCLK != 133) && (CONFIG_BFIN_DCLK != 150) && \
  	(CONFIG_BFIN_DCLK != 166) && (CONFIG_BFIN_DCLK != 200) && \
  	(CONFIG_BFIN_DCLK != 225) && (CONFIG_BFIN_DCLK != 250))
  #error "DCLK must be in (125, 133, 150, 166, 200, 225, 250)MHz"
  #endif
  
  #else
  #define SDGCTL_WIDTH (1 << 31)	/* SDRAM external data path width */
  #define PLL_CTL_VAL \
  	(((CONFIG_VCO_MULT & 63) << 9) | CLKIN_HALF | \
  		(PLL_BYPASS << 8) | (ANOMALY_05000305 ? 0 : 0x8000))
  #endif
  
  __attribute__((l1_text))
  static void do_sync(void)
  {
  	__builtin_bfin_ssync();
  }
  
  __attribute__((l1_text))
  void init_clocks(void)
  {
  	/* Kill any active DMAs as they may trigger external memory accesses
  	 * in the middle of reprogramming things, and that'll screw us up.
  	 * For example, any automatic DMAs left by U-Boot for splash screens.
  	 */
  #ifdef CONFIG_BF60x
  	init_cgu(CGU_DIV_VAL, CGU_CTL_VAL);
  	init_dmc(CONFIG_BFIN_DCLK);
  #else
  	size_t i;
  	for (i = 0; i < MAX_DMA_CHANNELS; ++i) {
  		struct dma_register *dma = dma_io_base_addr[i];
  		dma->cfg = 0;
  	}
  
  	do_sync();
  
  #ifdef SIC_IWR0
  	bfin_write_SIC_IWR0(IWR_ENABLE(0));
  # ifdef SIC_IWR1
  	/* BF52x system reset does not properly reset SIC_IWR1 which
  	 * will screw up the bootrom as it relies on MDMA0/1 waking it
  	 * up from IDLE instructions.  See this report for more info:
  	 * http://blackfin.uclinux.org/gf/tracker/4323
  	 */
  	if (ANOMALY_05000435)
  		bfin_write_SIC_IWR1(IWR_ENABLE(10) | IWR_ENABLE(11));
  	else
  		bfin_write_SIC_IWR1(IWR_DISABLE_ALL);
  # endif
  # ifdef SIC_IWR2
  	bfin_write_SIC_IWR2(IWR_DISABLE_ALL);
  # endif
  #else
  	bfin_write_SIC_IWR(IWR_ENABLE(0));
  #endif
  	do_sync();
  #ifdef EBIU_SDGCTL
  	bfin_write_EBIU_SDGCTL(bfin_read_EBIU_SDGCTL() | SRFS);
  	do_sync();
  #endif
  
  #ifdef CLKBUFOE
  	bfin_write16(VR_CTL, bfin_read_VR_CTL() | CLKBUFOE);
  	do_sync();
  	__asm__ __volatile__("IDLE;");
  #endif
  	bfin_write_PLL_LOCKCNT(0x300);
  	do_sync();
  	/* We always write PLL_CTL thus avoiding Anomaly 05000242 */
  	bfin_write16(PLL_CTL, PLL_CTL_VAL);
  	__asm__ __volatile__("IDLE;");
  	bfin_write_PLL_DIV(CONFIG_CCLK_ACT_DIV | CONFIG_SCLK_DIV);
  #ifdef EBIU_SDGCTL
  	bfin_write_EBIU_SDRRC(mem_SDRRC);
  	bfin_write_EBIU_SDGCTL((bfin_read_EBIU_SDGCTL() & SDGCTL_WIDTH) | mem_SDGCTL);
  #else
  	bfin_write_EBIU_RSTCTL(bfin_read_EBIU_RSTCTL() & ~(SRREQ));
  	do_sync();
  	bfin_write_EBIU_RSTCTL(bfin_read_EBIU_RSTCTL() | 0x1);
  	bfin_write_EBIU_DDRCTL0(mem_DDRCTL0);
  	bfin_write_EBIU_DDRCTL1(mem_DDRCTL1);
  	bfin_write_EBIU_DDRCTL2(mem_DDRCTL2);
  #ifdef CONFIG_MEM_EBIU_DDRQUE
  	bfin_write_EBIU_DDRQUE(CONFIG_MEM_EBIU_DDRQUE);
  #endif
  #endif
  #endif
  	do_sync();
  	bfin_read16(0);
  
  }