]>
Commit | Line | Data |
---|---|---|
bcc181b0 PC |
1 | /* |
2 | * IMX31 Clock Control Module | |
3 | * | |
4 | * Copyright (C) 2012 NICTA | |
282e74c8 | 5 | * Updated by Jean-Christophe Dubois <[email protected]> |
bcc181b0 PC |
6 | * |
7 | * This work is licensed under the terms of the GNU GPL, version 2 or later. | |
8 | * See the COPYING file in the top-level directory. | |
9 | * | |
cb54d868 JCD |
10 | * This is an abstract base class used to get a common interface to |
11 | * retrieve the CCM frequencies from the various i.MX SOC. | |
bcc181b0 PC |
12 | */ |
13 | ||
8ef94f0b | 14 | #include "qemu/osdep.h" |
282e74c8 | 15 | #include "hw/misc/imx_ccm.h" |
bcc181b0 | 16 | |
4a6aa0af JCD |
17 | #ifndef DEBUG_IMX_CCM |
18 | #define DEBUG_IMX_CCM 0 | |
bcc181b0 PC |
19 | #endif |
20 | ||
4a6aa0af JCD |
21 | #define DPRINTF(fmt, args...) \ |
22 | do { \ | |
23 | if (DEBUG_IMX_CCM) { \ | |
24 | fprintf(stderr, "[%s]%s: " fmt , TYPE_IMX_CCM, \ | |
25 | __func__, ##args); \ | |
26 | } \ | |
27 | } while (0) | |
28 | ||
bcc181b0 | 29 | |
cb54d868 | 30 | uint32_t imx_ccm_get_clock_frequency(IMXCCMState *dev, IMXClk clock) |
bcc181b0 | 31 | { |
cb54d868 JCD |
32 | uint32_t freq = 0; |
33 | IMXCCMClass *klass = IMX_GET_CLASS(dev); | |
bcc181b0 | 34 | |
cb54d868 JCD |
35 | if (klass->get_clock_frequency) { |
36 | freq = klass->get_clock_frequency(dev, clock); | |
bcc181b0 | 37 | } |
cb54d868 JCD |
38 | |
39 | DPRINTF("(clock = %d) = %d\n", clock, freq); | |
40 | ||
41 | return freq; | |
bcc181b0 PC |
42 | } |
43 | ||
44 | /* | |
45 | * Calculate PLL output frequency | |
46 | */ | |
cb54d868 | 47 | uint32_t imx_ccm_calc_pll(uint32_t pllreg, uint32_t base_freq) |
bcc181b0 | 48 | { |
cb54d868 | 49 | int32_t freq; |
bcc181b0 PC |
50 | int32_t mfn = MFN(pllreg); /* Numerator */ |
51 | uint32_t mfi = MFI(pllreg); /* Integer part */ | |
52 | uint32_t mfd = 1 + MFD(pllreg); /* Denominator */ | |
53 | uint32_t pd = 1 + PD(pllreg); /* Pre-divider */ | |
54 | ||
55 | if (mfi < 5) { | |
56 | mfi = 5; | |
57 | } | |
cb54d868 | 58 | |
bcc181b0 PC |
59 | /* mfn is 10-bit signed twos-complement */ |
60 | mfn <<= 32 - 10; | |
61 | mfn >>= 32 - 10; | |
62 | ||
cb54d868 | 63 | freq = ((2 * (base_freq >> 10) * (mfi * mfd + mfn)) / |
bcc181b0 | 64 | (mfd * pd)) << 10; |
bcc181b0 | 65 | |
cb54d868 JCD |
66 | DPRINTF("(pllreg = 0x%08x, base_freq = %d) = %d\n", pllreg, base_freq, |
67 | freq); | |
bcc181b0 | 68 | |
cb54d868 | 69 | return freq; |
bcc181b0 PC |
70 | } |
71 | ||
8c43a6f0 | 72 | static const TypeInfo imx_ccm_info = { |
cb54d868 JCD |
73 | .name = TYPE_IMX_CCM, |
74 | .parent = TYPE_SYS_BUS_DEVICE, | |
bcc181b0 | 75 | .instance_size = sizeof(IMXCCMState), |
cb54d868 JCD |
76 | .class_size = sizeof(IMXCCMClass), |
77 | .abstract = true, | |
bcc181b0 PC |
78 | }; |
79 | ||
80 | static void imx_ccm_register_types(void) | |
81 | { | |
82 | type_register_static(&imx_ccm_info); | |
83 | } | |
84 | ||
85 | type_init(imx_ccm_register_types) |