~ubuntu-branches/ubuntu/saucy/linux-ti-omap4/saucy-proposed

« back to all changes in this revision

Viewing changes to arch/mips/ath79/clock.c

  • Committer: Package Import Robot
  • Author(s): Paolo Pisati, Paolo Pisati, Stefan Bader, Upstream Kernel Changes
  • Date: 2012-08-15 17:17:43 UTC
  • Revision ID: package-import@ubuntu.com-20120815171743-h5wnuf51xe7pvdid
Tags: 3.5.0-207.13
[ Paolo Pisati ]

* Start new release

[ Stefan Bader ]

* (config) Enable getabis to use local package copies

[ Upstream Kernel Changes ]

* fixup: gargabe collect iva_seq[0|1] init
* [Config] enable all SND_OMAP_SOC_*s
* fixup: cm2xxx_3xxx.o is needed for omap2_cm_read|write_reg
* fixup: add some snd_soc_dai* helper functions
* fixup: s/snd_soc_dpcm_params/snd_soc_dpcm/g
* fixup: typo, no_host_mode and useless SDP4430 init
* fixup: enable again aess hwmod

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
2
 *  Atheros AR71XX/AR724X/AR913X common routines
3
3
 *
 
4
 *  Copyright (C) 2010-2011 Jaiganesh Narayanan <jnarayanan@atheros.com>
4
5
 *  Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org>
5
6
 *
 
7
 *  Parts of this file are based on Atheros' 2.6.15/2.6.31 BSP
 
8
 *
6
9
 *  This program is free software; you can redistribute it and/or modify it
7
10
 *  under the terms of the GNU General Public License version 2 as published
8
11
 *  by the Free Software Foundation.
163
166
        ath79_uart_clk.rate = ath79_ref_clk.rate;
164
167
}
165
168
 
 
169
static void __init ar934x_clocks_init(void)
 
170
{
 
171
        u32 pll, out_div, ref_div, nint, frac, clk_ctrl, postdiv;
 
172
        u32 cpu_pll, ddr_pll;
 
173
        u32 bootstrap;
 
174
 
 
175
        bootstrap = ath79_reset_rr(AR934X_RESET_REG_BOOTSTRAP);
 
176
        if (bootstrap & AR934X_BOOTSTRAP_REF_CLK_40)
 
177
                ath79_ref_clk.rate = 40 * 1000 * 1000;
 
178
        else
 
179
                ath79_ref_clk.rate = 25 * 1000 * 1000;
 
180
 
 
181
        pll = ath79_pll_rr(AR934X_PLL_CPU_CONFIG_REG);
 
182
        out_div = (pll >> AR934X_PLL_CPU_CONFIG_OUTDIV_SHIFT) &
 
183
                  AR934X_PLL_CPU_CONFIG_OUTDIV_MASK;
 
184
        ref_div = (pll >> AR934X_PLL_CPU_CONFIG_REFDIV_SHIFT) &
 
185
                  AR934X_PLL_CPU_CONFIG_REFDIV_MASK;
 
186
        nint = (pll >> AR934X_PLL_CPU_CONFIG_NINT_SHIFT) &
 
187
               AR934X_PLL_CPU_CONFIG_NINT_MASK;
 
188
        frac = (pll >> AR934X_PLL_CPU_CONFIG_NFRAC_SHIFT) &
 
189
               AR934X_PLL_CPU_CONFIG_NFRAC_MASK;
 
190
 
 
191
        cpu_pll = nint * ath79_ref_clk.rate / ref_div;
 
192
        cpu_pll += frac * ath79_ref_clk.rate / (ref_div * (2 << 6));
 
193
        cpu_pll /= (1 << out_div);
 
194
 
 
195
        pll = ath79_pll_rr(AR934X_PLL_DDR_CONFIG_REG);
 
196
        out_div = (pll >> AR934X_PLL_DDR_CONFIG_OUTDIV_SHIFT) &
 
197
                  AR934X_PLL_DDR_CONFIG_OUTDIV_MASK;
 
198
        ref_div = (pll >> AR934X_PLL_DDR_CONFIG_REFDIV_SHIFT) &
 
199
                  AR934X_PLL_DDR_CONFIG_REFDIV_MASK;
 
200
        nint = (pll >> AR934X_PLL_DDR_CONFIG_NINT_SHIFT) &
 
201
               AR934X_PLL_DDR_CONFIG_NINT_MASK;
 
202
        frac = (pll >> AR934X_PLL_DDR_CONFIG_NFRAC_SHIFT) &
 
203
               AR934X_PLL_DDR_CONFIG_NFRAC_MASK;
 
204
 
 
205
        ddr_pll = nint * ath79_ref_clk.rate / ref_div;
 
206
        ddr_pll += frac * ath79_ref_clk.rate / (ref_div * (2 << 10));
 
207
        ddr_pll /= (1 << out_div);
 
208
 
 
209
        clk_ctrl = ath79_pll_rr(AR934X_PLL_CPU_DDR_CLK_CTRL_REG);
 
210
 
 
211
        postdiv = (clk_ctrl >> AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_POST_DIV_SHIFT) &
 
212
                  AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_POST_DIV_MASK;
 
213
 
 
214
        if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_PLL_BYPASS)
 
215
                ath79_cpu_clk.rate = ath79_ref_clk.rate;
 
216
        else if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_CPUCLK_FROM_CPUPLL)
 
217
                ath79_cpu_clk.rate = cpu_pll / (postdiv + 1);
 
218
        else
 
219
                ath79_cpu_clk.rate = ddr_pll / (postdiv + 1);
 
220
 
 
221
        postdiv = (clk_ctrl >> AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_POST_DIV_SHIFT) &
 
222
                  AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_POST_DIV_MASK;
 
223
 
 
224
        if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_PLL_BYPASS)
 
225
                ath79_ddr_clk.rate = ath79_ref_clk.rate;
 
226
        else if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_DDRCLK_FROM_DDRPLL)
 
227
                ath79_ddr_clk.rate = ddr_pll / (postdiv + 1);
 
228
        else
 
229
                ath79_ddr_clk.rate = cpu_pll / (postdiv + 1);
 
230
 
 
231
        postdiv = (clk_ctrl >> AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_POST_DIV_SHIFT) &
 
232
                  AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_POST_DIV_MASK;
 
233
 
 
234
        if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_PLL_BYPASS)
 
235
                ath79_ahb_clk.rate = ath79_ref_clk.rate;
 
236
        else if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_AHBCLK_FROM_DDRPLL)
 
237
                ath79_ahb_clk.rate = ddr_pll / (postdiv + 1);
 
238
        else
 
239
                ath79_ahb_clk.rate = cpu_pll / (postdiv + 1);
 
240
 
 
241
        ath79_wdt_clk.rate = ath79_ref_clk.rate;
 
242
        ath79_uart_clk.rate = ath79_ref_clk.rate;
 
243
}
 
244
 
166
245
void __init ath79_clocks_init(void)
167
246
{
168
247
        if (soc_is_ar71xx())
173
252
                ar913x_clocks_init();
174
253
        else if (soc_is_ar933x())
175
254
                ar933x_clocks_init();
 
255
        else if (soc_is_ar934x())
 
256
                ar934x_clocks_init();
176
257
        else
177
258
                BUG();
178
259