generic.c 2.65 KB
Newer Older
Sascha Hauer's avatar
Sascha Hauer committed
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
/*
 * (C) Copyright 2007
 * Sascha Hauer, Pengutronix
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

#include <common.h>
#include <asm/arch/mx31-regs.h>
26
#include <asm/io.h>
Sascha Hauer's avatar
Sascha Hauer committed
27
28
29
30

static u32 mx31_decode_pll(u32 reg, u32 infreq)
{
	u32 mfi = (reg >> 10) & 0xf;
31
32
	u32 mfn = reg & 0x3ff;
	u32 mfd = (reg >> 16) & 0x3ff;
Sascha Hauer's avatar
Sascha Hauer committed
33
34
35
36
37
38
39
40
41
42
	u32 pd =  (reg >> 26) & 0xf;

	mfi = mfi <= 5 ? 5 : mfi;
	mfd += 1;
	pd += 1;

	return ((2 * (infreq >> 10) * (mfi * mfd + mfn)) /
		(mfd * pd)) << 10;
}

43
static u32 mx31_get_mpl_dpdgck_clk(void)
Sascha Hauer's avatar
Sascha Hauer committed
44
45
46
47
48
49
50
51
52
53
54
{
	u32 infreq;

	if ((__REG(CCM_CCMR) & CCMR_PRCS_MASK) == CCMR_FPM)
		infreq = CONFIG_MX31_CLK32 * 1024;
	else
		infreq = CONFIG_MX31_HCLK_FREQ;

	return mx31_decode_pll(__REG(CCM_MPCTL), infreq);
}

55
static u32 mx31_get_mcu_main_clk(void)
Sascha Hauer's avatar
Sascha Hauer committed
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
{
	/* For now we assume mpl_dpdgck_clk == mcu_main_clk
	 * which should be correct for most boards
	 */
	return mx31_get_mpl_dpdgck_clk();
}

u32 mx31_get_ipg_clk(void)
{
	u32 freq = mx31_get_mcu_main_clk();
	u32 pdr0 = __REG(CCM_PDR0);

	freq /= ((pdr0 >> 3) & 0x7) + 1;
	freq /= ((pdr0 >> 6) & 0x3) + 1;

	return freq;
}

void mx31_dump_clocks(void)
{
	u32 cpufreq = mx31_get_mcu_main_clk();
	printf("mx31 cpu clock: %dMHz\n",cpufreq / 1000000);
	printf("ipg clock     : %dHz\n", mx31_get_ipg_clk());
}

void mx31_gpio_mux(unsigned long mode)
{
	unsigned long reg, shift, tmp;

85
	reg = IOMUXC_BASE + (mode & 0x1fc);
Sascha Hauer's avatar
Sascha Hauer committed
86
87
88
89
	shift = (~mode & 0x3) * 8;

	tmp = __REG(reg);
	tmp &= ~(0xff << shift);
90
	tmp |= ((mode >> IOMUX_MODE_POS) & 0xff) << shift;
Sascha Hauer's avatar
Sascha Hauer committed
91
92
93
	__REG(reg) = tmp;
}

94
95
void mx31_set_pad(enum iomux_pins pin, u32 config)
{
96
	u32 field, l, reg;
97
98
99
100
101

	pin &= IOMUX_PADNUM_MASK;
	reg = (IOMUXC_BASE + 0x154) + (pin + 2) / 3 * 4;
	field = (pin + 2) % 3;

102
	l = __REG(reg);
103
104
	l &= ~(0x1ff << (field * 10));
	l |= config << (field * 10);
105
	__REG(reg) = l;
106
107
108

}

Sascha Hauer's avatar
Sascha Hauer committed
109
110
111
112
113
114
115
116
#if defined(CONFIG_DISPLAY_CPUINFO)
int print_cpuinfo (void)
{
	printf("CPU:   Freescale i.MX31 at %d MHz\n",
		mx31_get_mcu_main_clk() / 1000000);
	return 0;
}
#endif