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