Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
dpll44xx.c
Go to the documentation of this file.
1 /*
2  * OMAP4-specific DPLL control functions
3  *
4  * Copyright (C) 2011 Texas Instruments, Inc.
5  * Rajendra Nayak
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  */
11 
12 #include <linux/kernel.h>
13 #include <linux/errno.h>
14 #include <linux/clk.h>
15 #include <linux/io.h>
16 #include <linux/bitops.h>
17 
18 #include <plat/clock.h>
19 
20 #include "soc.h"
21 #include "clock.h"
22 #include "clock44xx.h"
23 #include "cm-regbits-44xx.h"
24 
25 /* Supported only on OMAP4 */
27 {
28  u32 v;
29  u32 mask;
30 
31  if (!clk || !clk->clksel_reg || !cpu_is_omap44xx())
32  return -EINVAL;
33 
34  mask = clk->flags & CLOCK_CLKOUTX2 ?
37 
38  v = __raw_readl(clk->clksel_reg);
39  v &= mask;
40  v >>= __ffs(mask);
41 
42  return v;
43 }
44 
46 {
47  u32 v;
48  u32 mask;
49 
50  if (!clk || !clk->clksel_reg || !cpu_is_omap44xx())
51  return;
52 
53  mask = clk->flags & CLOCK_CLKOUTX2 ?
56 
57  v = __raw_readl(clk->clksel_reg);
58  /* Clear the bit to allow gatectrl */
59  v &= ~mask;
60  __raw_writel(v, clk->clksel_reg);
61 }
62 
64 {
65  u32 v;
66  u32 mask;
67 
68  if (!clk || !clk->clksel_reg || !cpu_is_omap44xx())
69  return;
70 
71  mask = clk->flags & CLOCK_CLKOUTX2 ?
74 
75  v = __raw_readl(clk->clksel_reg);
76  /* Set the bit to deny gatectrl */
77  v |= mask;
78  __raw_writel(v, clk->clksel_reg);
79 }
80 
82  .allow_idle = omap4_dpllmx_allow_gatectrl,
83  .deny_idle = omap4_dpllmx_deny_gatectrl,
84 };
85 
95 unsigned long omap4_dpll_regm4xen_recalc(struct clk *clk)
96 {
97  u32 v;
98  unsigned long rate;
99  struct dpll_data *dd;
100 
101  if (!clk || !clk->dpll_data)
102  return 0;
103 
104  dd = clk->dpll_data;
105 
106  rate = omap2_get_dpll_rate(clk);
107 
108  /* regm4xen adds a multiplier of 4 to DPLL calculations */
109  v = __raw_readl(dd->control_reg);
111  rate *= OMAP4430_REGM4XEN_MULT;
112 
113  return rate;
114 }
115 
128 long omap4_dpll_regm4xen_round_rate(struct clk *clk, unsigned long target_rate)
129 {
130  u32 v;
131  struct dpll_data *dd;
132  long r;
133 
134  if (!clk || !clk->dpll_data)
135  return -EINVAL;
136 
137  dd = clk->dpll_data;
138 
139  /* regm4xen adds a multiplier of 4 to DPLL calculations */
140  v = __raw_readl(dd->control_reg) & OMAP4430_DPLL_REGM4XEN_MASK;
141 
142  if (v)
143  target_rate = target_rate / OMAP4430_REGM4XEN_MULT;
144 
145  r = omap2_dpll_round_rate(clk, target_rate);
146  if (r == ~0)
147  return r;
148 
149  if (v)
150  clk->dpll_data->last_rounded_rate *= OMAP4430_REGM4XEN_MULT;
151 
152  return clk->dpll_data->last_rounded_rate;
153 }