1/* 2 * OMAP3-specific clock framework functions 3 * 4 * Copyright (C) 2007-2008 Texas Instruments, Inc. 5 * Copyright (C) 2007-2011 Nokia Corporation 6 * 7 * Paul Walmsley 8 * Jouni Högander 9 * 10 * Parts of this code are based on code written by 11 * Richard Woodruff, Tony Lindgren, Tuukka Tikkanen, Karthik Dasu, 12 * Russell King 13 * 14 * This program is free software; you can redistribute it and/or modify 15 * it under the terms of the GNU General Public License version 2 as 16 * published by the Free Software Foundation. 17 */ 18#undef DEBUG 19 20#include <linux/kernel.h> 21#include <linux/clk.h> 22#include <linux/io.h> 23 24#include "clock.h" 25#include "clock34xx.h" 26#include "cm3xxx.h" 27#include "cm-regbits-34xx.h" 28 29/** 30 * omap3430es2_clk_ssi_find_idlest - return CM_IDLEST info for SSI 31 * @clk: struct clk * being enabled 32 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into 33 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into 34 * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator 35 * 36 * The OMAP3430ES2 SSI target CM_IDLEST bit is at a different shift 37 * from the CM_{I,F}CLKEN bit. Pass back the correct info via 38 * @idlest_reg and @idlest_bit. No return value. 39 */ 40static void omap3430es2_clk_ssi_find_idlest(struct clk_hw_omap *clk, 41 void __iomem **idlest_reg, 42 u8 *idlest_bit, 43 u8 *idlest_val) 44{ 45 u32 r; 46 47 r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); 48 *idlest_reg = (__force void __iomem *)r; 49 *idlest_bit = OMAP3430ES2_ST_SSI_IDLE_SHIFT; 50 *idlest_val = OMAP34XX_CM_IDLEST_VAL; 51} 52const struct clk_hw_omap_ops clkhwops_omap3430es2_ssi_wait = { 53 .find_idlest = omap3430es2_clk_ssi_find_idlest, 54 .find_companion = omap2_clk_dflt_find_companion, 55}; 56 57const struct clk_hw_omap_ops clkhwops_omap3430es2_iclk_ssi_wait = { 58 .allow_idle = omap2_clkt_iclk_allow_idle, 59 .deny_idle = omap2_clkt_iclk_deny_idle, 60 .find_idlest = omap3430es2_clk_ssi_find_idlest, 61 .find_companion = omap2_clk_dflt_find_companion, 62}; 63 64/** 65 * omap3430es2_clk_dss_usbhost_find_idlest - CM_IDLEST info for DSS, USBHOST 66 * @clk: struct clk * being enabled 67 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into 68 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into 69 * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator 70 * 71 * Some OMAP modules on OMAP3 ES2+ chips have both initiator and 72 * target IDLEST bits. For our purposes, we are concerned with the 73 * target IDLEST bits, which exist at a different bit position than 74 * the *CLKEN bit position for these modules (DSS and USBHOST) (The 75 * default find_idlest code assumes that they are at the same 76 * position.) No return value. 77 */ 78static void omap3430es2_clk_dss_usbhost_find_idlest(struct clk_hw_omap *clk, 79 void __iomem **idlest_reg, 80 u8 *idlest_bit, 81 u8 *idlest_val) 82{ 83 u32 r; 84 85 r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); 86 *idlest_reg = (__force void __iomem *)r; 87 /* USBHOST_IDLE has same shift */ 88 *idlest_bit = OMAP3430ES2_ST_DSS_IDLE_SHIFT; 89 *idlest_val = OMAP34XX_CM_IDLEST_VAL; 90} 91 92const struct clk_hw_omap_ops clkhwops_omap3430es2_dss_usbhost_wait = { 93 .find_idlest = omap3430es2_clk_dss_usbhost_find_idlest, 94 .find_companion = omap2_clk_dflt_find_companion, 95}; 96 97const struct clk_hw_omap_ops clkhwops_omap3430es2_iclk_dss_usbhost_wait = { 98 .allow_idle = omap2_clkt_iclk_allow_idle, 99 .deny_idle = omap2_clkt_iclk_deny_idle, 100 .find_idlest = omap3430es2_clk_dss_usbhost_find_idlest, 101 .find_companion = omap2_clk_dflt_find_companion, 102}; 103 104/** 105 * omap3430es2_clk_hsotgusb_find_idlest - return CM_IDLEST info for HSOTGUSB 106 * @clk: struct clk * being enabled 107 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into 108 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into 109 * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator 110 * 111 * The OMAP3430ES2 HSOTGUSB target CM_IDLEST bit is at a different 112 * shift from the CM_{I,F}CLKEN bit. Pass back the correct info via 113 * @idlest_reg and @idlest_bit. No return value. 114 */ 115static void omap3430es2_clk_hsotgusb_find_idlest(struct clk_hw_omap *clk, 116 void __iomem **idlest_reg, 117 u8 *idlest_bit, 118 u8 *idlest_val) 119{ 120 u32 r; 121 122 r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); 123 *idlest_reg = (__force void __iomem *)r; 124 *idlest_bit = OMAP3430ES2_ST_HSOTGUSB_IDLE_SHIFT; 125 *idlest_val = OMAP34XX_CM_IDLEST_VAL; 126} 127 128const struct clk_hw_omap_ops clkhwops_omap3430es2_iclk_hsotgusb_wait = { 129 .allow_idle = omap2_clkt_iclk_allow_idle, 130 .deny_idle = omap2_clkt_iclk_deny_idle, 131 .find_idlest = omap3430es2_clk_hsotgusb_find_idlest, 132 .find_companion = omap2_clk_dflt_find_companion, 133}; 134 135const struct clk_hw_omap_ops clkhwops_omap3430es2_hsotgusb_wait = { 136 .find_idlest = omap3430es2_clk_hsotgusb_find_idlest, 137 .find_companion = omap2_clk_dflt_find_companion, 138}; 139