Merge branch 'for-v5.13-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/ebieder...
[linux-2.6-microblaze.git] / drivers / clk / zynq / pll.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Zynq PLL driver
4  *
5  *  Copyright (C) 2013 Xilinx
6  *
7  *  Sören Brinkmann <soren.brinkmann@xilinx.com>
8  */
9 #include <linux/clk/zynq.h>
10 #include <linux/clk-provider.h>
11 #include <linux/slab.h>
12 #include <linux/io.h>
13
14 /**
15  * struct zynq_pll
16  * @hw:         Handle between common and hardware-specific interfaces
17  * @pll_ctrl:   PLL control register
18  * @pll_status: PLL status register
19  * @lock:       Register lock
20  * @lockbit:    Indicates the associated PLL_LOCKED bit in the PLL status
21  *              register.
22  */
23 struct zynq_pll {
24         struct clk_hw   hw;
25         void __iomem    *pll_ctrl;
26         void __iomem    *pll_status;
27         spinlock_t      *lock;
28         u8              lockbit;
29 };
30 #define to_zynq_pll(_hw)        container_of(_hw, struct zynq_pll, hw)
31
32 /* Register bitfield defines */
33 #define PLLCTRL_FBDIV_MASK      0x7f000
34 #define PLLCTRL_FBDIV_SHIFT     12
35 #define PLLCTRL_BPQUAL_MASK     (1 << 3)
36 #define PLLCTRL_PWRDWN_MASK     2
37 #define PLLCTRL_PWRDWN_SHIFT    1
38 #define PLLCTRL_RESET_MASK      1
39 #define PLLCTRL_RESET_SHIFT     0
40
41 #define PLL_FBDIV_MIN   13
42 #define PLL_FBDIV_MAX   66
43
44 /**
45  * zynq_pll_round_rate() - Round a clock frequency
46  * @hw:         Handle between common and hardware-specific interfaces
47  * @rate:       Desired clock frequency
48  * @prate:      Clock frequency of parent clock
49  * Returns frequency closest to @rate the hardware can generate.
50  */
51 static long zynq_pll_round_rate(struct clk_hw *hw, unsigned long rate,
52                 unsigned long *prate)
53 {
54         u32 fbdiv;
55
56         fbdiv = DIV_ROUND_CLOSEST(rate, *prate);
57         if (fbdiv < PLL_FBDIV_MIN)
58                 fbdiv = PLL_FBDIV_MIN;
59         else if (fbdiv > PLL_FBDIV_MAX)
60                 fbdiv = PLL_FBDIV_MAX;
61
62         return *prate * fbdiv;
63 }
64
65 /**
66  * zynq_pll_recalc_rate() - Recalculate clock frequency
67  * @hw:                 Handle between common and hardware-specific interfaces
68  * @parent_rate:        Clock frequency of parent clock
69  * Returns current clock frequency.
70  */
71 static unsigned long zynq_pll_recalc_rate(struct clk_hw *hw,
72                 unsigned long parent_rate)
73 {
74         struct zynq_pll *clk = to_zynq_pll(hw);
75         u32 fbdiv;
76
77         /*
78          * makes probably sense to redundantly save fbdiv in the struct
79          * zynq_pll to save the IO access.
80          */
81         fbdiv = (readl(clk->pll_ctrl) & PLLCTRL_FBDIV_MASK) >>
82                         PLLCTRL_FBDIV_SHIFT;
83
84         return parent_rate * fbdiv;
85 }
86
87 /**
88  * zynq_pll_is_enabled - Check if a clock is enabled
89  * @hw:         Handle between common and hardware-specific interfaces
90  * Returns 1 if the clock is enabled, 0 otherwise.
91  *
92  * Not sure this is a good idea, but since disabled means bypassed for
93  * this clock implementation we say we are always enabled.
94  */
95 static int zynq_pll_is_enabled(struct clk_hw *hw)
96 {
97         unsigned long flags = 0;
98         u32 reg;
99         struct zynq_pll *clk = to_zynq_pll(hw);
100
101         spin_lock_irqsave(clk->lock, flags);
102
103         reg = readl(clk->pll_ctrl);
104
105         spin_unlock_irqrestore(clk->lock, flags);
106
107         return !(reg & (PLLCTRL_RESET_MASK | PLLCTRL_PWRDWN_MASK));
108 }
109
110 /**
111  * zynq_pll_enable - Enable clock
112  * @hw:         Handle between common and hardware-specific interfaces
113  * Returns 0 on success
114  */
115 static int zynq_pll_enable(struct clk_hw *hw)
116 {
117         unsigned long flags = 0;
118         u32 reg;
119         struct zynq_pll *clk = to_zynq_pll(hw);
120
121         if (zynq_pll_is_enabled(hw))
122                 return 0;
123
124         pr_info("PLL: enable\n");
125
126         /* Power up PLL and wait for lock */
127         spin_lock_irqsave(clk->lock, flags);
128
129         reg = readl(clk->pll_ctrl);
130         reg &= ~(PLLCTRL_RESET_MASK | PLLCTRL_PWRDWN_MASK);
131         writel(reg, clk->pll_ctrl);
132         while (!(readl(clk->pll_status) & (1 << clk->lockbit)))
133                 ;
134
135         spin_unlock_irqrestore(clk->lock, flags);
136
137         return 0;
138 }
139
140 /**
141  * zynq_pll_disable - Disable clock
142  * @hw:         Handle between common and hardware-specific interfaces
143  * Returns 0 on success
144  */
145 static void zynq_pll_disable(struct clk_hw *hw)
146 {
147         unsigned long flags = 0;
148         u32 reg;
149         struct zynq_pll *clk = to_zynq_pll(hw);
150
151         if (!zynq_pll_is_enabled(hw))
152                 return;
153
154         pr_info("PLL: shutdown\n");
155
156         /* shut down PLL */
157         spin_lock_irqsave(clk->lock, flags);
158
159         reg = readl(clk->pll_ctrl);
160         reg |= PLLCTRL_RESET_MASK | PLLCTRL_PWRDWN_MASK;
161         writel(reg, clk->pll_ctrl);
162
163         spin_unlock_irqrestore(clk->lock, flags);
164 }
165
166 static const struct clk_ops zynq_pll_ops = {
167         .enable = zynq_pll_enable,
168         .disable = zynq_pll_disable,
169         .is_enabled = zynq_pll_is_enabled,
170         .round_rate = zynq_pll_round_rate,
171         .recalc_rate = zynq_pll_recalc_rate
172 };
173
174 /**
175  * clk_register_zynq_pll() - Register PLL with the clock framework
176  * @name:       PLL name
177  * @parent:     Parent clock name
178  * @pll_ctrl:   Pointer to PLL control register
179  * @pll_status: Pointer to PLL status register
180  * @lock_index: Bit index to this PLL's lock status bit in @pll_status
181  * @lock:       Register lock
182  * Returns handle to the registered clock.
183  */
184 struct clk *clk_register_zynq_pll(const char *name, const char *parent,
185                 void __iomem *pll_ctrl, void __iomem *pll_status, u8 lock_index,
186                 spinlock_t *lock)
187 {
188         struct zynq_pll *pll;
189         struct clk *clk;
190         u32 reg;
191         const char *parent_arr[1] = {parent};
192         unsigned long flags = 0;
193         struct clk_init_data initd = {
194                 .name = name,
195                 .parent_names = parent_arr,
196                 .ops = &zynq_pll_ops,
197                 .num_parents = 1,
198                 .flags = 0
199         };
200
201         pll = kmalloc(sizeof(*pll), GFP_KERNEL);
202         if (!pll)
203                 return ERR_PTR(-ENOMEM);
204
205         /* Populate the struct */
206         pll->hw.init = &initd;
207         pll->pll_ctrl = pll_ctrl;
208         pll->pll_status = pll_status;
209         pll->lockbit = lock_index;
210         pll->lock = lock;
211
212         spin_lock_irqsave(pll->lock, flags);
213
214         reg = readl(pll->pll_ctrl);
215         reg &= ~PLLCTRL_BPQUAL_MASK;
216         writel(reg, pll->pll_ctrl);
217
218         spin_unlock_irqrestore(pll->lock, flags);
219
220         clk = clk_register(NULL, &pll->hw);
221         if (WARN_ON(IS_ERR(clk)))
222                 goto free_pll;
223
224         return clk;
225
226 free_pll:
227         kfree(pll);
228
229         return clk;
230 }