1 /*
2  * Copyright (c) 2017 SiFive Inc
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef _SIFIVE_PRCI_H
8 #define _SIFIVE_PRCI_H
9 
10 /* Clock controller. */
11 #define PRCI_BASE_ADDR 0x10008000UL
12 
13 #define Z_REG32(p, i) (*(volatile uint32_t *) ((p) + (i)))
14 #define PRCI_REG(offset) Z_REG32(PRCI_BASE_ADDR, offset)
15 
16 /* Register offsets */
17 
18 #define PRCI_HFROSCCFG   (0x0000)
19 #define PRCI_HFXOSCCFG   (0x0004)
20 #define PRCI_PLLCFG      (0x0008)
21 #define PRCI_PLLDIV      (0x000C)
22 #define PRCI_PROCMONCFG  (0x00F0)
23 
24 /* Fields */
25 #define ROSC_DIV(x)    (((x) & 0x2F) << 0)
26 #define ROSC_TRIM(x)   (((x) & 0x1F) << 16)
27 #define ROSC_EN(x)     (((x) & 0x1) << 30)
28 #define ROSC_RDY(x)    (((x) & 0x1) << 31)
29 
30 #define XOSC_EN(x)     (((x) & 0x1) << 30)
31 #define XOSC_RDY(x)    (((x) & 0x1) << 31)
32 
33 #define PLL_R(x)       (((x) & 0x7)  << 0)
34 /* single reserved bit for F LSB. */
35 #define PLL_F(x)       (((x) & 0x3F) << 4)
36 #define PLL_Q(x)       (((x) & 0x3)  << 10)
37 #define PLL_SEL(x)     (((x) & 0x1)  << 16)
38 #define PLL_REFSEL(x)  (((x) & 0x1)  << 17)
39 #define PLL_BYPASS(x)  (((x) & 0x1)  << 18)
40 #define PLL_LOCK(x)    (((x) & 0x1)  << 31)
41 
42 #define PLL_R_default 0x1
43 #define PLL_F_default 0x1F
44 #define PLL_Q_default 0x3
45 
46 #define PLL_REFSEL_HFROSC 0x0
47 #define PLL_REFSEL_HFXOSC 0x1
48 
49 #define PLL_SEL_HFROSC 0x0
50 #define PLL_SEL_PLL    0x1
51 
52 #define PLL_FINAL_DIV(x)      (((x) & 0x3F) << 0)
53 #define PLL_FINAL_DIV_BY_1(x) (((x) & 0x1) << 8)
54 
55 #define PROCMON_DIV(x)   (((x) & 0x1F) << 0)
56 #define PROCMON_TRIM(x)  (((x) & 0x1F) << 8)
57 #define PROCMON_EN(x)    (((x) & 0x1)  << 16)
58 #define PROCMON_SEL(x)   (((x) & 0x3)  << 24)
59 #define PROCMON_NT_EN(x) (((x) & 0x1)  << 28)
60 
61 #define PROCMON_SEL_HFCLK     0
62 #define PROCMON_SEL_HFXOSCIN  1
63 #define PROCMON_SEL_PLLOUTDIV 2
64 #define PROCMON_SEL_PROCMON   3
65 
66 #endif /* _SIFIVE_PRCI_H */
67