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)25int 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)44void 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)62void 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