1/* 2 * OMAP2/3 interface clock control 3 * 4 * Copyright (C) 2011 Nokia Corporation 5 * Paul Walmsley 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#undef DEBUG 12 13#include <linux/kernel.h> 14#include <linux/clk-provider.h> 15#include <linux/io.h> 16 17#include "clock.h" 18 19/* Register offsets */ 20#define CM_AUTOIDLE 0x30 21#define CM_ICLKEN 0x10 22 23/* Private functions */ 24 25/* XXX */ 26void omap2_clkt_iclk_allow_idle(struct clk_hw_omap *clk) 27{ 28 u32 v; 29 void __iomem *r; 30 31 r = (__force void __iomem *) 32 ((__force u32)clk->enable_reg ^ (CM_AUTOIDLE ^ CM_ICLKEN)); 33 34 v = omap2_clk_readl(clk, r); 35 v |= (1 << clk->enable_bit); 36 omap2_clk_writel(v, clk, r); 37} 38 39/* XXX */ 40void omap2_clkt_iclk_deny_idle(struct clk_hw_omap *clk) 41{ 42 u32 v; 43 void __iomem *r; 44 45 r = (__force void __iomem *) 46 ((__force u32)clk->enable_reg ^ (CM_AUTOIDLE ^ CM_ICLKEN)); 47 48 v = omap2_clk_readl(clk, r); 49 v &= ~(1 << clk->enable_bit); 50 omap2_clk_writel(v, clk, r); 51} 52 53/* Public data */ 54 55const struct clk_hw_omap_ops clkhwops_iclk = { 56 .allow_idle = omap2_clkt_iclk_allow_idle, 57 .deny_idle = omap2_clkt_iclk_deny_idle, 58}; 59 60const struct clk_hw_omap_ops clkhwops_iclk_wait = { 61 .allow_idle = omap2_clkt_iclk_allow_idle, 62 .deny_idle = omap2_clkt_iclk_deny_idle, 63 .find_idlest = omap2_clk_dflt_find_idlest, 64 .find_companion = omap2_clk_dflt_find_companion, 65}; 66 67 68 69