2015-02-24 19:56:02 -08:00
/*
* Copyright ( C ) 2014 Google , Inc .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms and conditions of the GNU General Public License ,
* version 2 , as published by the Free Software Foundation .
*/
# ifndef __PISTACHIO_CLK_H
# define __PISTACHIO_CLK_H
# include <linux/clk-provider.h>
struct pistachio_gate {
unsigned int id ;
unsigned long reg ;
unsigned int shift ;
const char * name ;
const char * parent ;
} ;
# define GATE(_id, _name, _pname, _reg, _shift) \
{ \
. id = _id , \
. reg = _reg , \
. shift = _shift , \
. name = _name , \
. parent = _pname , \
}
struct pistachio_mux {
unsigned int id ;
unsigned long reg ;
unsigned int shift ;
unsigned int num_parents ;
const char * name ;
const char * * parents ;
} ;
# define PNAME(x) static const char *x[] __initconst
# define MUX(_id, _name, _pnames, _reg, _shift) \
{ \
. id = _id , \
. reg = _reg , \
. shift = _shift , \
. name = _name , \
. parents = _pnames , \
. num_parents = ARRAY_SIZE ( _pnames ) \
}
struct pistachio_div {
unsigned int id ;
unsigned long reg ;
unsigned int width ;
unsigned int div_flags ;
const char * name ;
const char * parent ;
} ;
# define DIV(_id, _name, _pname, _reg, _width) \
{ \
. id = _id , \
. reg = _reg , \
. width = _width , \
. div_flags = 0 , \
. name = _name , \
. parent = _pname , \
}
# define DIV_F(_id, _name, _pname, _reg, _width, _div_flags) \
{ \
. id = _id , \
. reg = _reg , \
. width = _width , \
. div_flags = _div_flags , \
. name = _name , \
. parent = _pname , \
}
struct pistachio_fixed_factor {
unsigned int id ;
unsigned int div ;
const char * name ;
const char * parent ;
} ;
# define FIXED_FACTOR(_id, _name, _pname, _div) \
{ \
. id = _id , \
. div = _div , \
. name = _name , \
. parent = _pname , \
}
2015-02-24 19:56:03 -08:00
struct pistachio_pll_rate_table {
unsigned long fref ;
unsigned long fout ;
unsigned int refdiv ;
unsigned int fbdiv ;
unsigned int postdiv1 ;
unsigned int postdiv2 ;
unsigned int frac ;
} ;
enum pistachio_pll_type {
PLL_GF40LP_LAINT ,
PLL_GF40LP_FRAC ,
} ;
struct pistachio_pll {
unsigned int id ;
unsigned long reg_base ;
enum pistachio_pll_type type ;
struct pistachio_pll_rate_table * rates ;
unsigned int nr_rates ;
const char * name ;
const char * parent ;
} ;
# define PLL(_id, _name, _pname, _type, _reg, _rates) \
{ \
. id = _id , \
. reg_base = _reg , \
. type = _type , \
. rates = _rates , \
. nr_rates = ARRAY_SIZE ( _rates ) , \
. name = _name , \
. parent = _pname , \
}
# define PLL_FIXED(_id, _name, _pname, _type, _reg) \
{ \
. id = _id , \
. reg_base = _reg , \
. type = _type , \
. rates = NULL , \
. nr_rates = 0 , \
. name = _name , \
. parent = _pname , \
}
2015-02-24 19:56:02 -08:00
struct pistachio_clk_provider {
struct device_node * node ;
void __iomem * base ;
struct clk_onecell_data clk_data ;
} ;
extern struct pistachio_clk_provider *
pistachio_clk_alloc_provider ( struct device_node * node , unsigned int num_clks ) ;
extern void pistachio_clk_register_provider ( struct pistachio_clk_provider * p ) ;
extern void pistachio_clk_register_gate ( struct pistachio_clk_provider * p ,
struct pistachio_gate * gate ,
unsigned int num ) ;
extern void pistachio_clk_register_mux ( struct pistachio_clk_provider * p ,
struct pistachio_mux * mux ,
unsigned int num ) ;
extern void pistachio_clk_register_div ( struct pistachio_clk_provider * p ,
struct pistachio_div * div ,
unsigned int num ) ;
extern void
pistachio_clk_register_fixed_factor ( struct pistachio_clk_provider * p ,
struct pistachio_fixed_factor * ff ,
unsigned int num ) ;
2015-02-24 19:56:03 -08:00
extern void pistachio_clk_register_pll ( struct pistachio_clk_provider * p ,
struct pistachio_pll * pll ,
unsigned int num ) ;
2015-02-24 19:56:02 -08:00
extern void pistachio_clk_force_enable ( struct pistachio_clk_provider * p ,
unsigned int * clk_ids , unsigned int num ) ;
# endif