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