1530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley/* 2530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley * OMAP2/3 interface clock control 3530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley * 4530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley * Copyright (C) 2011 Nokia Corporation 5530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley * Paul Walmsley 6530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley * 7530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley * This program is free software; you can redistribute it and/or modify 8530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley * it under the terms of the GNU General Public License version 2 as 9530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley * published by the Free Software Foundation. 10530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley */ 11530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley#undef DEBUG 12530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley 13530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley#include <linux/kernel.h> 1432cc002116b866151ca24c6e9110ba8a93754753Mike Turquette#include <linux/clk-provider.h> 15530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley#include <linux/io.h> 16530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley 17530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley#include "clock.h" 18acd052bb8119dd9117e0af48ff0ac6e56e61b6b4Tero Kristo 19acd052bb8119dd9117e0af48ff0ac6e56e61b6b4Tero Kristo/* Register offsets */ 20acd052bb8119dd9117e0af48ff0ac6e56e61b6b4Tero Kristo#define CM_AUTOIDLE 0x30 21acd052bb8119dd9117e0af48ff0ac6e56e61b6b4Tero Kristo#define CM_ICLKEN 0x10 22530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley 23530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley/* Private functions */ 24530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley 25530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley/* XXX */ 26b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayakvoid omap2_clkt_iclk_allow_idle(struct clk_hw_omap *clk) 27530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley{ 28519ab8b202f37fb76cc6f32ef34da79716680d03Tero Kristo u32 v; 29519ab8b202f37fb76cc6f32ef34da79716680d03Tero Kristo void __iomem *r; 30530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley 31519ab8b202f37fb76cc6f32ef34da79716680d03Tero Kristo r = (__force void __iomem *) 32519ab8b202f37fb76cc6f32ef34da79716680d03Tero Kristo ((__force u32)clk->enable_reg ^ (CM_AUTOIDLE ^ CM_ICLKEN)); 33530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley 34519ab8b202f37fb76cc6f32ef34da79716680d03Tero Kristo v = omap2_clk_readl(clk, r); 35530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley v |= (1 << clk->enable_bit); 36519ab8b202f37fb76cc6f32ef34da79716680d03Tero Kristo omap2_clk_writel(v, clk, r); 37530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley} 38530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley 39530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley/* XXX */ 40b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayakvoid omap2_clkt_iclk_deny_idle(struct clk_hw_omap *clk) 41530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley{ 42519ab8b202f37fb76cc6f32ef34da79716680d03Tero Kristo u32 v; 43519ab8b202f37fb76cc6f32ef34da79716680d03Tero Kristo void __iomem *r; 44530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley 45519ab8b202f37fb76cc6f32ef34da79716680d03Tero Kristo r = (__force void __iomem *) 46519ab8b202f37fb76cc6f32ef34da79716680d03Tero Kristo ((__force u32)clk->enable_reg ^ (CM_AUTOIDLE ^ CM_ICLKEN)); 47530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley 48519ab8b202f37fb76cc6f32ef34da79716680d03Tero Kristo v = omap2_clk_readl(clk, r); 49530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley v &= ~(1 << clk->enable_bit); 50519ab8b202f37fb76cc6f32ef34da79716680d03Tero Kristo omap2_clk_writel(v, clk, r); 51530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley} 52530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley 53530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley/* Public data */ 54530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley 55b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayakconst struct clk_hw_omap_ops clkhwops_iclk = { 56b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak .allow_idle = omap2_clkt_iclk_allow_idle, 57b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak .deny_idle = omap2_clkt_iclk_deny_idle, 58b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak}; 59b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak 6032cc002116b866151ca24c6e9110ba8a93754753Mike Turquetteconst struct clk_hw_omap_ops clkhwops_iclk_wait = { 6132cc002116b866151ca24c6e9110ba8a93754753Mike Turquette .allow_idle = omap2_clkt_iclk_allow_idle, 6232cc002116b866151ca24c6e9110ba8a93754753Mike Turquette .deny_idle = omap2_clkt_iclk_deny_idle, 6332cc002116b866151ca24c6e9110ba8a93754753Mike Turquette .find_idlest = omap2_clk_dflt_find_idlest, 6432cc002116b866151ca24c6e9110ba8a93754753Mike Turquette .find_companion = omap2_clk_dflt_find_companion, 6532cc002116b866151ca24c6e9110ba8a93754753Mike Turquette}; 66530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley 67530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley 68530e544fdadb934470c5c2b0e8d60c3d5386c161Paul Walmsley 69