blob: 4b9ec075a84840d6e5a4a2368c36d789b6836fad [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Masahiro Yamadabb2ff9d2014-10-03 19:21:06 +09002/*
Masahiro Yamada9d6652c2016-09-17 03:33:09 +09003 * Copyright (C) 2013-2014 Panasonic Corporation
4 * Copyright (C) 2015-2016 Socionext Inc.
Masahiro Yamadabb2ff9d2014-10-03 19:21:06 +09005 */
6
7#include <common.h>
Masahiro Yamadae4e789d2017-01-21 18:05:24 +09008#include <linux/errno.h>
Masahiro Yamada663a23f2015-05-29 17:30:00 +09009#include <linux/io.h>
Masahiro Yamadaefdf3402016-01-09 01:51:13 +090010
11#include "../init.h"
12#include "../sc-regs.h"
Masahiro Yamadabb2ff9d2014-10-03 19:21:06 +090013
14#undef DPLL_SSC_RATE_1PER
15
Masahiro Yamada9d6652c2016-09-17 03:33:09 +090016int uniphier_ld4_dpll_init(const struct uniphier_board_data *bd)
Masahiro Yamadabb2ff9d2014-10-03 19:21:06 +090017{
Masahiro Yamada9d6652c2016-09-17 03:33:09 +090018 unsigned int dram_freq = bd->dram_freq;
Masahiro Yamadabb2ff9d2014-10-03 19:21:06 +090019 u32 tmp;
20
21 /*
22 * Set Frequency
23 * Set 0xc(1600MHz)/0xd(1333MHz)/0xe(1066MHz)
24 * to FOUT (DPLLCTRL.bit[29:20])
25 */
26 tmp = readl(SC_DPLLCTRL);
27 tmp &= ~0x000f0000;
Masahiro Yamada75f16f82015-09-22 00:27:39 +090028 switch (dram_freq) {
29 case 1333:
30 tmp |= 0x000d0000;
31 break;
32 case 1600:
33 tmp |= 0x000c0000;
34 break;
35 default:
36 pr_err("Unsupported frequency");
37 return -EINVAL;
38 }
Masahiro Yamadabb2ff9d2014-10-03 19:21:06 +090039
40#if defined(DPLL_SSC_RATE_1PER)
41 tmp &= ~SC_DPLLCTRL_SSC_RATE;
42#else
43 tmp |= SC_DPLLCTRL_SSC_RATE;
44#endif
45 writel(tmp, SC_DPLLCTRL);
46
47 tmp = readl(SC_DPLLCTRL2);
48 tmp |= SC_DPLLCTRL2_NRSTDS;
49 writel(tmp, SC_DPLLCTRL2);
Masahiro Yamada75f16f82015-09-22 00:27:39 +090050
Masahiro Yamada9d6652c2016-09-17 03:33:09 +090051 /* Wait 500 usec until dpll gets stable */
52 udelay(500);
Masahiro Yamada75f16f82015-09-22 00:27:39 +090053
54 return 0;
Masahiro Yamadabb2ff9d2014-10-03 19:21:06 +090055}