Merge tag 'uniphier-v2019.10' of https://gitlab.denx.de/u-boot/custodians/u-boot...
[oweals/u-boot.git] / arch / arm / mach-uniphier / clk / dpll-sld8.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2013-2014 Panasonic Corporation
4  * Copyright (C) 2015-2016 Socionext Inc.
5  */
6
7 #include <linux/delay.h>
8 #include <linux/io.h>
9
10 #include "../init.h"
11 #include "../sc-regs.h"
12
13 int uniphier_sld8_dpll_init(const struct uniphier_board_data *bd)
14 {
15         u32 tmp;
16         /*
17          * Set DPLL SSC parameters for DPLLCTRL3
18          * [23]    DIVN_TEST    0x1
19          * [22:16] DIVN         0x50
20          * [10]    FREFSEL_TEST 0x1
21          * [9:8]   FREFSEL      0x2
22          * [4]     ICPD_TEST    0x1
23          * [3:0]   ICPD         0xb
24          */
25         tmp = readl(sc_base + SC_DPLLCTRL3);
26         tmp &= ~0x00ff0717;
27         tmp |= 0x00d0061b;
28         writel(tmp, sc_base + SC_DPLLCTRL3);
29
30         /*
31          * Set DPLL SSC parameters for DPLLCTRL
32          *                    <-1%>          <-2%>
33          * [29:20] SSC_UPCNT 132 (0x084)    132  (0x084)
34          * [14:0]  SSC_dK    6335(0x18bf)   12710(0x31a6)
35          */
36         tmp = readl(sc_base + SC_DPLLCTRL);
37         tmp &= ~0x3ff07fff;
38 #ifdef DPLL_SSC_RATE_1PER
39         tmp |= 0x084018bf;
40 #else
41         tmp |= 0x084031a6;
42 #endif
43         writel(tmp, sc_base + SC_DPLLCTRL);
44
45         /*
46          * Set DPLL SSC parameters for DPLLCTRL2
47          * [31:29]  SSC_STEP     0
48          * [27]     SSC_REG_REF  1
49          * [26:20]  SSC_M        79     (0x4f)
50          * [19:0]   SSC_K        964689 (0xeb851)
51          */
52         tmp = readl(sc_base + SC_DPLLCTRL2);
53         tmp &= ~0xefffffff;
54         tmp |= 0x0cfeb851;
55         writel(tmp, sc_base + SC_DPLLCTRL2);
56
57         /* Wait 500 usec until dpll gets stable */
58         udelay(500);
59
60         return 0;
61 }