Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.13.7.
  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 <plat/clock.h>
 25
 26#include "clock.h"
 27#include "clock34xx.h"
 28#include "cm2xxx_3xxx.h"
 29#include "cm-regbits-34xx.h"
 30
 31/**
 32 * omap3430es2_clk_ssi_find_idlest - return CM_IDLEST info for SSI
 33 * @clk: struct clk * being enabled
 34 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
 35 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
 36 * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
 37 *
 38 * The OMAP3430ES2 SSI target CM_IDLEST bit is at a different shift
 39 * from the CM_{I,F}CLKEN bit.  Pass back the correct info via
 40 * @idlest_reg and @idlest_bit.  No return value.
 41 */
 42static void omap3430es2_clk_ssi_find_idlest(struct clk *clk,
 43					    void __iomem **idlest_reg,
 44					    u8 *idlest_bit,
 45					    u8 *idlest_val)
 46{
 47	u32 r;
 48
 49	r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20);
 50	*idlest_reg = (__force void __iomem *)r;
 51	*idlest_bit = OMAP3430ES2_ST_SSI_IDLE_SHIFT;
 52	*idlest_val = OMAP34XX_CM_IDLEST_VAL;
 53}
 54
 55const struct clkops clkops_omap3430es2_ssi_wait = {
 56	.enable		= omap2_dflt_clk_enable,
 57	.disable	= omap2_dflt_clk_disable,
 58	.find_idlest	= omap3430es2_clk_ssi_find_idlest,
 59	.find_companion = omap2_clk_dflt_find_companion,
 60};
 61
 62const struct clkops clkops_omap3430es2_iclk_ssi_wait = {
 63	.enable		= omap2_dflt_clk_enable,
 64	.disable	= omap2_dflt_clk_disable,
 65	.find_idlest	= omap3430es2_clk_ssi_find_idlest,
 66	.find_companion = omap2_clk_dflt_find_companion,
 67	.allow_idle	= omap2_clkt_iclk_allow_idle,
 68	.deny_idle	= omap2_clkt_iclk_deny_idle,
 69};
 70
 71/**
 72 * omap3430es2_clk_dss_usbhost_find_idlest - CM_IDLEST info for DSS, USBHOST
 73 * @clk: struct clk * being enabled
 74 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
 75 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
 76 * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
 77 *
 78 * Some OMAP modules on OMAP3 ES2+ chips have both initiator and
 79 * target IDLEST bits.  For our purposes, we are concerned with the
 80 * target IDLEST bits, which exist at a different bit position than
 81 * the *CLKEN bit position for these modules (DSS and USBHOST) (The
 82 * default find_idlest code assumes that they are at the same
 83 * position.)  No return value.
 84 */
 85static void omap3430es2_clk_dss_usbhost_find_idlest(struct clk *clk,
 86						    void __iomem **idlest_reg,
 87						    u8 *idlest_bit,
 88						    u8 *idlest_val)
 89{
 90	u32 r;
 91
 92	r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20);
 93	*idlest_reg = (__force void __iomem *)r;
 94	/* USBHOST_IDLE has same shift */
 95	*idlest_bit = OMAP3430ES2_ST_DSS_IDLE_SHIFT;
 96	*idlest_val = OMAP34XX_CM_IDLEST_VAL;
 97}
 98
 99const struct clkops clkops_omap3430es2_dss_usbhost_wait = {
100	.enable		= omap2_dflt_clk_enable,
101	.disable	= omap2_dflt_clk_disable,
102	.find_idlest	= omap3430es2_clk_dss_usbhost_find_idlest,
103	.find_companion = omap2_clk_dflt_find_companion,
104};
105
106const struct clkops clkops_omap3430es2_iclk_dss_usbhost_wait = {
107	.enable		= omap2_dflt_clk_enable,
108	.disable	= omap2_dflt_clk_disable,
109	.find_idlest	= omap3430es2_clk_dss_usbhost_find_idlest,
110	.find_companion = omap2_clk_dflt_find_companion,
111	.allow_idle	= omap2_clkt_iclk_allow_idle,
112	.deny_idle	= omap2_clkt_iclk_deny_idle,
113};
114
115/**
116 * omap3430es2_clk_hsotgusb_find_idlest - return CM_IDLEST info for HSOTGUSB
117 * @clk: struct clk * being enabled
118 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
119 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
120 * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
121 *
122 * The OMAP3430ES2 HSOTGUSB target CM_IDLEST bit is at a different
123 * shift from the CM_{I,F}CLKEN bit.  Pass back the correct info via
124 * @idlest_reg and @idlest_bit.  No return value.
125 */
126static void omap3430es2_clk_hsotgusb_find_idlest(struct clk *clk,
127						 void __iomem **idlest_reg,
128						 u8 *idlest_bit,
129						 u8 *idlest_val)
130{
131	u32 r;
132
133	r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20);
134	*idlest_reg = (__force void __iomem *)r;
135	*idlest_bit = OMAP3430ES2_ST_HSOTGUSB_IDLE_SHIFT;
136	*idlest_val = OMAP34XX_CM_IDLEST_VAL;
137}
138
139const struct clkops clkops_omap3430es2_hsotgusb_wait = {
140	.enable		= omap2_dflt_clk_enable,
141	.disable	= omap2_dflt_clk_disable,
142	.find_idlest	= omap3430es2_clk_hsotgusb_find_idlest,
143	.find_companion = omap2_clk_dflt_find_companion,
144};
145
146const struct clkops clkops_omap3430es2_iclk_hsotgusb_wait = {
147	.enable		= omap2_dflt_clk_enable,
148	.disable	= omap2_dflt_clk_disable,
149	.find_idlest	= omap3430es2_clk_hsotgusb_find_idlest,
150	.find_companion = omap2_clk_dflt_find_companion,
151	.allow_idle	= omap2_clkt_iclk_allow_idle,
152	.deny_idle	= omap2_clkt_iclk_deny_idle,
153};