102e19a960a519224a74da4d190965201044c1583Paul Walmsley/*
202e19a960a519224a74da4d190965201044c1583Paul Walmsley * OMAP3-specific clock framework functions
302e19a960a519224a74da4d190965201044c1583Paul Walmsley *
4542313cc98e72d026d2df86f515699dfaface460Paul Walmsley * Copyright (C) 2007-2008 Texas Instruments, Inc.
5ec538e30f7eded2c4af8d9184619a3de65bc378ePaul Walmsley * Copyright (C) 2007-2011 Nokia Corporation
602e19a960a519224a74da4d190965201044c1583Paul Walmsley *
7da4d2904abc0c31ac829e9c6d52106d5a6606507Paul Walmsley * Paul Walmsley
8da4d2904abc0c31ac829e9c6d52106d5a6606507Paul Walmsley * Jouni Högander
902e19a960a519224a74da4d190965201044c1583Paul Walmsley *
1002e19a960a519224a74da4d190965201044c1583Paul Walmsley * Parts of this code are based on code written by
11657ebfadc19c5a14f709dee1645082828330d5d4Paul Walmsley * Richard Woodruff, Tony Lindgren, Tuukka Tikkanen, Karthik Dasu,
12657ebfadc19c5a14f709dee1645082828330d5d4Paul Walmsley * Russell King
1302e19a960a519224a74da4d190965201044c1583Paul Walmsley *
1402e19a960a519224a74da4d190965201044c1583Paul Walmsley * This program is free software; you can redistribute it and/or modify
1502e19a960a519224a74da4d190965201044c1583Paul Walmsley * it under the terms of the GNU General Public License version 2 as
1602e19a960a519224a74da4d190965201044c1583Paul Walmsley * published by the Free Software Foundation.
1702e19a960a519224a74da4d190965201044c1583Paul Walmsley */
1802e19a960a519224a74da4d190965201044c1583Paul Walmsley#undef DEBUG
1902e19a960a519224a74da4d190965201044c1583Paul Walmsley
2002e19a960a519224a74da4d190965201044c1583Paul Walmsley#include <linux/kernel.h>
2102e19a960a519224a74da4d190965201044c1583Paul Walmsley#include <linux/clk.h>
2202e19a960a519224a74da4d190965201044c1583Paul Walmsley#include <linux/io.h>
2302e19a960a519224a74da4d190965201044c1583Paul Walmsley
2402e19a960a519224a74da4d190965201044c1583Paul Walmsley#include "clock.h"
2582e9bd588563c4e22ebb55b684ebec7e310cc715Paul Walmsley#include "clock34xx.h"
26ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley#include "cm3xxx.h"
2702e19a960a519224a74da4d190965201044c1583Paul Walmsley#include "cm-regbits-34xx.h"
2802e19a960a519224a74da4d190965201044c1583Paul Walmsley
2902e19a960a519224a74da4d190965201044c1583Paul Walmsley/**
303c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * omap3430es2_clk_ssi_find_idlest - return CM_IDLEST info for SSI
313c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * @clk: struct clk * being enabled
323c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
333c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
34419cc97d3678f0fca5e60b3853dd9c1371f67805Ranjith Lohithakshan * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
353c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley *
363c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * The OMAP3430ES2 SSI target CM_IDLEST bit is at a different shift
373c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * from the CM_{I,F}CLKEN bit.  Pass back the correct info via
383c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * @idlest_reg and @idlest_bit.  No return value.
393c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley */
40b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayakstatic void omap3430es2_clk_ssi_find_idlest(struct clk_hw_omap *clk,
413c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley					    void __iomem **idlest_reg,
42419cc97d3678f0fca5e60b3853dd9c1371f67805Ranjith Lohithakshan					    u8 *idlest_bit,
43419cc97d3678f0fca5e60b3853dd9c1371f67805Ranjith Lohithakshan					    u8 *idlest_val)
443c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley{
453c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley	u32 r;
463c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley
473c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley	r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20);
483c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley	*idlest_reg = (__force void __iomem *)r;
493c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley	*idlest_bit = OMAP3430ES2_ST_SSI_IDLE_SHIFT;
50419cc97d3678f0fca5e60b3853dd9c1371f67805Ranjith Lohithakshan	*idlest_val = OMAP34XX_CM_IDLEST_VAL;
513c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley}
52b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayakconst struct clk_hw_omap_ops clkhwops_omap3430es2_ssi_wait = {
53b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak	.find_idlest	= omap3430es2_clk_ssi_find_idlest,
54b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak	.find_companion	= omap2_clk_dflt_find_companion,
55b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak};
563c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley
57b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayakconst struct clk_hw_omap_ops clkhwops_omap3430es2_iclk_ssi_wait = {
58b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak	.allow_idle	= omap2_clkt_iclk_allow_idle,
59b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak	.deny_idle	= omap2_clkt_iclk_deny_idle,
60b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak	.find_idlest	= omap3430es2_clk_ssi_find_idlest,
61b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak	.find_companion = omap2_clk_dflt_find_companion,
62b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak};
63ec538e30f7eded2c4af8d9184619a3de65bc378ePaul Walmsley
643c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley/**
653c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * omap3430es2_clk_dss_usbhost_find_idlest - CM_IDLEST info for DSS, USBHOST
663c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * @clk: struct clk * being enabled
673c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
683c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
69419cc97d3678f0fca5e60b3853dd9c1371f67805Ranjith Lohithakshan * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
703c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley *
713c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * Some OMAP modules on OMAP3 ES2+ chips have both initiator and
723c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * target IDLEST bits.  For our purposes, we are concerned with the
733c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * target IDLEST bits, which exist at a different bit position than
743c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * the *CLKEN bit position for these modules (DSS and USBHOST) (The
753c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * default find_idlest code assumes that they are at the same
763c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * position.)  No return value.
773c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley */
78b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayakstatic void omap3430es2_clk_dss_usbhost_find_idlest(struct clk_hw_omap *clk,
793c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley						    void __iomem **idlest_reg,
80419cc97d3678f0fca5e60b3853dd9c1371f67805Ranjith Lohithakshan						    u8 *idlest_bit,
81419cc97d3678f0fca5e60b3853dd9c1371f67805Ranjith Lohithakshan						    u8 *idlest_val)
823c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley{
833c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley	u32 r;
843c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley
853c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley	r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20);
863c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley	*idlest_reg = (__force void __iomem *)r;
873c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley	/* USBHOST_IDLE has same shift */
883c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley	*idlest_bit = OMAP3430ES2_ST_DSS_IDLE_SHIFT;
89419cc97d3678f0fca5e60b3853dd9c1371f67805Ranjith Lohithakshan	*idlest_val = OMAP34XX_CM_IDLEST_VAL;
903c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley}
9125f4214e388dda818765b670fb608f2e6467d877Rajendra Nayak
92b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayakconst struct clk_hw_omap_ops clkhwops_omap3430es2_dss_usbhost_wait = {
93b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak	.find_idlest	= omap3430es2_clk_dss_usbhost_find_idlest,
94b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak	.find_companion	= omap2_clk_dflt_find_companion,
95b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak};
963c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley
97b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayakconst struct clk_hw_omap_ops clkhwops_omap3430es2_iclk_dss_usbhost_wait = {
98b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak	.allow_idle	= omap2_clkt_iclk_allow_idle,
99b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak	.deny_idle	= omap2_clkt_iclk_deny_idle,
100b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak	.find_idlest	= omap3430es2_clk_dss_usbhost_find_idlest,
101b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak	.find_companion	= omap2_clk_dflt_find_companion,
102b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak};
103ec538e30f7eded2c4af8d9184619a3de65bc378ePaul Walmsley
1043c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley/**
1053c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * omap3430es2_clk_hsotgusb_find_idlest - return CM_IDLEST info for HSOTGUSB
1063c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * @clk: struct clk * being enabled
1073c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
1083c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
109419cc97d3678f0fca5e60b3853dd9c1371f67805Ranjith Lohithakshan * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
1103c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley *
1113c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * The OMAP3430ES2 HSOTGUSB target CM_IDLEST bit is at a different
1123c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * shift from the CM_{I,F}CLKEN bit.  Pass back the correct info via
1133c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley * @idlest_reg and @idlest_bit.  No return value.
1143c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley */
115b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayakstatic void omap3430es2_clk_hsotgusb_find_idlest(struct clk_hw_omap *clk,
1163c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley						 void __iomem **idlest_reg,
117419cc97d3678f0fca5e60b3853dd9c1371f67805Ranjith Lohithakshan						 u8 *idlest_bit,
118419cc97d3678f0fca5e60b3853dd9c1371f67805Ranjith Lohithakshan						 u8 *idlest_val)
1193c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley{
1203c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley	u32 r;
1213c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley
1223c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley	r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20);
1233c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley	*idlest_reg = (__force void __iomem *)r;
1243c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley	*idlest_bit = OMAP3430ES2_ST_HSOTGUSB_IDLE_SHIFT;
125419cc97d3678f0fca5e60b3853dd9c1371f67805Ranjith Lohithakshan	*idlest_val = OMAP34XX_CM_IDLEST_VAL;
1263c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley}
12725f4214e388dda818765b670fb608f2e6467d877Rajendra Nayak
128b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayakconst struct clk_hw_omap_ops clkhwops_omap3430es2_iclk_hsotgusb_wait = {
129b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak	.allow_idle	= omap2_clkt_iclk_allow_idle,
130b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak	.deny_idle	= omap2_clkt_iclk_deny_idle,
131b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak	.find_idlest	= omap3430es2_clk_hsotgusb_find_idlest,
132b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak	.find_companion	= omap2_clk_dflt_find_companion,
133b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak};
1343c82e229f09a6acc8d24dc27c5e0e60b1d7161c2Paul Walmsley
135b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayakconst struct clk_hw_omap_ops clkhwops_omap3430es2_hsotgusb_wait = {
136b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak	.find_idlest	= omap3430es2_clk_hsotgusb_find_idlest,
137b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak	.find_companion	= omap2_clk_dflt_find_companion,
138b4777a21381fd1f87be8c606a616b7f97f485d2bRajendra Nayak};
139