2010-01-28 16:40:29 -08:00
/*
* arch / arm / mach - tegra / include / mach / clock . h
*
* Copyright ( C ) 2010 Google , Inc .
*
* Author :
* Colin Cross < ccross @ google . com >
*
* This software is licensed under the terms of the GNU General Public
* License version 2 , as published by the Free Software Foundation , and
* may be copied , distributed , and modified under those terms .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
*/
# ifndef __MACH_TEGRA_CLOCK_H
# define __MACH_TEGRA_CLOCK_H
2010-11-17 10:04:33 +01:00
# include <linux/clkdev.h>
2011-02-12 16:43:05 -08:00
# include <linux/list.h>
# include <linux/spinlock.h>
2010-01-28 16:40:29 -08:00
2012-01-09 05:35:11 +00:00
# include <mach/clk.h>
2010-01-28 16:40:29 -08:00
# define DIV_BUS (1 << 0)
# define DIV_U71 (1 << 1)
# define DIV_U71_FIXED (1 << 2)
# define DIV_2 (1 << 3)
2010-06-07 20:49:46 -07:00
# define DIV_U16 (1 << 4)
# define PLL_FIXED (1 << 5)
# define PLL_HAS_CPCON (1 << 6)
# define MUX (1 << 7)
# define PLLD (1 << 8)
# define PERIPH_NO_RESET (1 << 9)
# define PERIPH_NO_ENB (1 << 10)
# define PERIPH_EMC_ENB (1 << 11)
# define PERIPH_MANUAL_RESET (1 << 12)
# define PLL_ALT_MISC_REG (1 << 13)
# define PLLU (1 << 14)
2012-01-09 05:35:11 +00:00
# define PLLX (1 << 15)
# define MUX_PWM (1 << 16)
# define MUX8 (1 << 17)
# define DIV_U71_UART (1 << 18)
# define MUX_CLK_OUT (1 << 19)
# define PLLM (1 << 20)
# define DIV_U71_INT (1 << 21)
# define DIV_U71_IDLE (1 << 22)
2010-01-28 16:40:29 -08:00
# define ENABLE_ON_INIT (1 << 28)
2012-01-09 05:35:11 +00:00
# define PERIPH_ON_APB (1 << 29)
2010-01-28 16:40:29 -08:00
struct clk ;
struct clk_mux_sel {
struct clk * input ;
u32 value ;
} ;
2011-02-12 16:05:31 -08:00
struct clk_pll_freq_table {
2010-01-28 16:40:29 -08:00
unsigned long input_rate ;
unsigned long output_rate ;
u16 n ;
u16 m ;
u8 p ;
u8 cpcon ;
} ;
struct clk_ops {
void ( * init ) ( struct clk * ) ;
int ( * enable ) ( struct clk * ) ;
void ( * disable ) ( struct clk * ) ;
int ( * set_parent ) ( struct clk * , struct clk * ) ;
int ( * set_rate ) ( struct clk * , unsigned long ) ;
long ( * round_rate ) ( struct clk * , unsigned long ) ;
2010-09-02 19:11:11 -07:00
void ( * reset ) ( struct clk * , bool ) ;
2012-01-09 05:35:11 +00:00
int ( * clk_cfg_ex ) ( struct clk * ,
enum tegra_clk_ex_param , u32 ) ;
2010-01-28 16:40:29 -08:00
} ;
enum clk_state {
UNINITIALIZED = 0 ,
ON ,
OFF ,
} ;
struct clk {
/* node for master clocks list */
2011-02-12 16:05:31 -08:00
struct list_head node ; /* node for list of all clocks */
struct clk_lookup lookup ;
2010-01-28 16:40:29 -08:00
# ifdef CONFIG_DEBUG_FS
2011-02-12 16:05:31 -08:00
struct dentry * dent ;
2010-01-28 16:40:29 -08:00
# endif
2011-02-20 23:35:07 -08:00
bool set ;
2011-02-12 16:05:31 -08:00
struct clk_ops * ops ;
unsigned long rate ;
unsigned long max_rate ;
2011-02-12 16:14:03 -08:00
unsigned long min_rate ;
2011-02-12 16:05:31 -08:00
u32 flags ;
const char * name ;
u32 refcnt ;
enum clk_state state ;
struct clk * parent ;
u32 div ;
u32 mul ;
2010-01-28 16:40:29 -08:00
const struct clk_mux_sel * inputs ;
2011-02-12 16:05:31 -08:00
u32 reg ;
u32 reg_shift ;
2010-06-07 20:49:46 -07:00
2011-02-12 16:14:03 -08:00
struct list_head shared_bus_list ;
2011-02-12 16:05:31 -08:00
union {
struct {
unsigned int clk_num ;
} periph ;
struct {
unsigned long input_min ;
unsigned long input_max ;
unsigned long cf_min ;
unsigned long cf_max ;
unsigned long vco_min ;
unsigned long vco_max ;
const struct clk_pll_freq_table * freq_table ;
int lock_delay ;
2012-01-09 05:35:11 +00:00
unsigned long fixed_rate ;
2011-02-12 16:05:31 -08:00
} pll ;
struct {
u32 sel ;
u32 reg_mask ;
} mux ;
struct {
struct clk * main ;
struct clk * backup ;
} cpu ;
2011-02-12 16:14:03 -08:00
struct {
struct list_head node ;
bool enabled ;
unsigned long rate ;
} shared_bus_user ;
2011-02-12 16:05:31 -08:00
} u ;
2010-01-28 16:40:29 -08:00
2011-02-12 16:43:05 -08:00
spinlock_t spinlock ;
} ;
2010-01-28 16:40:29 -08:00
struct clk_duplicate {
const char * name ;
struct clk_lookup lookup ;
} ;
struct tegra_clk_init_table {
const char * name ;
const char * parent ;
unsigned long rate ;
bool enabled ;
} ;
void tegra2_init_clocks ( void ) ;
2012-01-09 05:35:13 +00:00
void tegra30_init_clocks ( void ) ;
2010-01-28 16:40:29 -08:00
void clk_init ( struct clk * clk ) ;
struct clk * tegra_get_clock_by_name ( const char * name ) ;
int clk_reparent ( struct clk * c , struct clk * parent ) ;
void tegra_clk_init_from_table ( struct tegra_clk_init_table * table ) ;
2011-02-12 16:43:05 -08:00
unsigned long clk_get_rate_locked ( struct clk * c ) ;
int clk_set_rate_locked ( struct clk * c , unsigned long rate ) ;
2010-01-28 16:40:29 -08:00
# endif