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/cpu.h>
19 #include <plat/clock.h>
20 
21 #include "clock.h"
22 #include "cm-regbits-44xx.h"
23 
24 /* Supported only on OMAP4 */
omap4_dpllmx_gatectrl_read(struct clk * clk)25 int omap4_dpllmx_gatectrl_read(struct clk *clk)
26 {
27 	u32 v;
28 	u32 mask;
29 
30 	if (!clk || !clk->clksel_reg || !cpu_is_omap44xx())
31 		return -EINVAL;
32 
33 	mask = clk->flags & CLOCK_CLKOUTX2 ?
34 			OMAP4430_DPLL_CLKOUTX2_GATE_CTRL_MASK :
35 			OMAP4430_DPLL_CLKOUT_GATE_CTRL_MASK;
36 
37 	v = __raw_readl(clk->clksel_reg);
38 	v &= mask;
39 	v >>= __ffs(mask);
40 
41 	return v;
42 }
43 
omap4_dpllmx_allow_gatectrl(struct clk * clk)44 void omap4_dpllmx_allow_gatectrl(struct clk *clk)
45 {
46 	u32 v;
47 	u32 mask;
48 
49 	if (!clk || !clk->clksel_reg || !cpu_is_omap44xx())
50 		return;
51 
52 	mask = clk->flags & CLOCK_CLKOUTX2 ?
53 			OMAP4430_DPLL_CLKOUTX2_GATE_CTRL_MASK :
54 			OMAP4430_DPLL_CLKOUT_GATE_CTRL_MASK;
55 
56 	v = __raw_readl(clk->clksel_reg);
57 	/* Clear the bit to allow gatectrl */
58 	v &= ~mask;
59 	__raw_writel(v, clk->clksel_reg);
60 }
61 
omap4_dpllmx_deny_gatectrl(struct clk * clk)62 void omap4_dpllmx_deny_gatectrl(struct clk *clk)
63 {
64 	u32 v;
65 	u32 mask;
66 
67 	if (!clk || !clk->clksel_reg || !cpu_is_omap44xx())
68 		return;
69 
70 	mask = clk->flags & CLOCK_CLKOUTX2 ?
71 			OMAP4430_DPLL_CLKOUTX2_GATE_CTRL_MASK :
72 			OMAP4430_DPLL_CLKOUT_GATE_CTRL_MASK;
73 
74 	v = __raw_readl(clk->clksel_reg);
75 	/* Set the bit to deny gatectrl */
76 	v |= mask;
77 	__raw_writel(v, clk->clksel_reg);
78 }
79 
80 const struct clkops clkops_omap4_dpllmx_ops = {
81 	.allow_idle	= omap4_dpllmx_allow_gatectrl,
82 	.deny_idle	= omap4_dpllmx_deny_gatectrl,
83 };
84 
85