blob: aefd21dc458a4ac5b505714939bb3e23eda6c956 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
David Brownell45064002009-05-15 23:47:12 +02002/*
3 * Copyright (C) 2004 Texas Instruments.
4 * Copyright (C) 2009 David Brownell
David Brownell45064002009-05-15 23:47:12 +02005 */
6
7#include <common.h>
Simon Glass97589732020-05-10 11:40:02 -06008#include <init.h>
David Brownell45064002009-05-15 23:47:12 +02009#include <asm/arch/hardware.h>
Simon Glass3ba929a2020-10-30 21:38:53 -060010#include <asm/global_data.h>
Sekhar Nori302fc2f2009-11-12 11:07:22 -050011#include <asm/io.h>
David Brownell45064002009-05-15 23:47:12 +020012
Hadli, Manjunath0dfccbe2012-02-06 00:30:44 +000013DECLARE_GLOBAL_DATA_PTR;
14
David Brownell45064002009-05-15 23:47:12 +020015/* offsets from PLL controller base */
16#define PLLC_PLLCTL 0x100
17#define PLLC_PLLM 0x110
18#define PLLC_PREDIV 0x114
19#define PLLC_PLLDIV1 0x118
20#define PLLC_PLLDIV2 0x11c
21#define PLLC_PLLDIV3 0x120
22#define PLLC_POSTDIV 0x128
23#define PLLC_BPDIV 0x12c
24#define PLLC_PLLDIV4 0x160
25#define PLLC_PLLDIV5 0x164
26#define PLLC_PLLDIV6 0x168
Sudhakar Rajashekhara0a7fbec2011-09-03 22:18:04 -040027#define PLLC_PLLDIV7 0x16c
David Brownell45064002009-05-15 23:47:12 +020028#define PLLC_PLLDIV8 0x170
29#define PLLC_PLLDIV9 0x174
30
Sudhakar Rajashekhara0a7fbec2011-09-03 22:18:04 -040031unsigned int sysdiv[9] = {
32 PLLC_PLLDIV1, PLLC_PLLDIV2, PLLC_PLLDIV3, PLLC_PLLDIV4, PLLC_PLLDIV5,
33 PLLC_PLLDIV6, PLLC_PLLDIV7, PLLC_PLLDIV8, PLLC_PLLDIV9
Sekhar Nori302fc2f2009-11-12 11:07:22 -050034};
35
36int clk_get(enum davinci_clk_ids id)
37{
38 int pre_div;
39 int pllm;
40 int post_div;
41 int pll_out;
Sudhakar Rajashekhara0a7fbec2011-09-03 22:18:04 -040042 unsigned int pll_base;
Sekhar Nori302fc2f2009-11-12 11:07:22 -050043
44 pll_out = CONFIG_SYS_OSCIN_FREQ;
45
46 if (id == DAVINCI_AUXCLK_CLKID)
47 goto out;
48
Sudhakar Rajashekhara0a7fbec2011-09-03 22:18:04 -040049 if ((id >> 16) == 1)
50 pll_base = (unsigned int)davinci_pllc1_regs;
51 else
52 pll_base = (unsigned int)davinci_pllc0_regs;
53
54 id &= 0xFFFF;
55
Sekhar Nori302fc2f2009-11-12 11:07:22 -050056 /*
57 * Lets keep this simple. Combining operations can result in
58 * unexpected approximations
59 */
Sudhakar Rajashekhara0a7fbec2011-09-03 22:18:04 -040060 pre_div = (readl(pll_base + PLLC_PREDIV) &
61 DAVINCI_PLLC_DIV_MASK) + 1;
62 pllm = readl(pll_base + PLLC_PLLM) + 1;
Sekhar Nori302fc2f2009-11-12 11:07:22 -050063
64 pll_out /= pre_div;
65 pll_out *= pllm;
66
67 if (id == DAVINCI_PLLM_CLKID)
68 goto out;
69
Sudhakar Rajashekhara0a7fbec2011-09-03 22:18:04 -040070 post_div = (readl(pll_base + PLLC_POSTDIV) &
71 DAVINCI_PLLC_DIV_MASK) + 1;
Sekhar Nori302fc2f2009-11-12 11:07:22 -050072
73 pll_out /= post_div;
74
75 if (id == DAVINCI_PLLC_CLKID)
76 goto out;
77
Sudhakar Rajashekhara0a7fbec2011-09-03 22:18:04 -040078 pll_out /= (readl(pll_base + sysdiv[id - 1]) &
79 DAVINCI_PLLC_DIV_MASK) + 1;
Sekhar Nori302fc2f2009-11-12 11:07:22 -050080
81out:
82 return pll_out;
83}
Laurence Withersdfd07f62012-07-30 23:30:37 +000084
85int set_cpu_clk_info(void)
86{
87 gd->bd->bi_arm_freq = clk_get(DAVINCI_ARM_CLKID) / 1000000;
88 /* DDR PHY uses an x2 input clock */
89 gd->bd->bi_ddr_freq = cpu_is_da830() ? 0 :
90 (clk_get(DAVINCI_DDR_CLKID) / 1000000);
91 gd->bd->bi_dsp_freq = 0;
92 return 0;
93}