2012-03-15 23:11:20 -07:00
/*
* Copyright ( C ) 2010 - 2011 Canonical Ltd < jeremy . kerr @ canonical . com >
* Copyright ( C ) 2011 - 2012 Mike Turquette , Linaro Ltd < mturquette @ linaro . org >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
* Fixed rate clock implementation
*/
# include <linux/clk-provider.h>
# include <linux/module.h>
# include <linux/slab.h>
# include <linux/io.h>
# include <linux/err.h>
2012-04-07 21:39:39 -05:00
# include <linux/of.h>
2012-03-15 23:11:20 -07:00
/*
* DOC : basic fixed - rate clock that cannot gate
*
* Traits of this clock :
* prepare - clk_ ( un ) prepare only ensures parents are prepared
* enable - clk_enable only ensures parents are enabled
* rate - rate is always a fixed value . No clk_set_rate support
* parent - fixed parent . No clk_set_parent support
*/
static unsigned long clk_fixed_rate_recalc_rate ( struct clk_hw * hw ,
unsigned long parent_rate )
{
return to_clk_fixed_rate ( hw ) - > fixed_rate ;
}
2013-12-21 10:34:48 +01:00
static unsigned long clk_fixed_rate_recalc_accuracy ( struct clk_hw * hw ,
unsigned long parent_accuracy )
{
return to_clk_fixed_rate ( hw ) - > fixed_accuracy ;
}
2012-03-27 15:23:22 +08:00
const struct clk_ops clk_fixed_rate_ops = {
2012-03-15 23:11:20 -07:00
. recalc_rate = clk_fixed_rate_recalc_rate ,
2013-12-21 10:34:48 +01:00
. recalc_accuracy = clk_fixed_rate_recalc_accuracy ,
2012-03-15 23:11:20 -07:00
} ;
EXPORT_SYMBOL_GPL ( clk_fixed_rate_ops ) ;
2012-03-26 17:51:03 -07:00
/**
2016-02-07 00:34:13 -08:00
* clk_hw_register_fixed_rate_with_accuracy - register fixed - rate clock with
* the clock framework
2012-03-26 17:51:03 -07:00
* @ dev : device that is registering this clock
* @ name : name of this clock
* @ parent_name : name of clock ' s parent
* @ flags : framework - specific flags
* @ fixed_rate : non - adjustable clock rate
2013-12-21 10:34:48 +01:00
* @ fixed_accuracy : non - adjustable clock rate
2012-03-26 17:51:03 -07:00
*/
2016-02-07 00:34:13 -08:00
struct clk_hw * clk_hw_register_fixed_rate_with_accuracy ( struct device * dev ,
2013-12-21 10:34:48 +01:00
const char * name , const char * parent_name , unsigned long flags ,
unsigned long fixed_rate , unsigned long fixed_accuracy )
2012-03-15 23:11:20 -07:00
{
struct clk_fixed_rate * fixed ;
2016-02-07 00:34:13 -08:00
struct clk_hw * hw ;
2012-04-25 22:58:56 -07:00
struct clk_init_data init ;
2016-02-07 00:34:13 -08:00
int ret ;
2012-03-15 23:11:20 -07:00
2012-03-26 17:51:03 -07:00
/* allocate fixed-rate clock */
2015-05-14 16:47:10 -07:00
fixed = kzalloc ( sizeof ( * fixed ) , GFP_KERNEL ) ;
if ( ! fixed )
2012-03-15 23:11:20 -07:00
return ERR_PTR ( - ENOMEM ) ;
2012-04-25 22:58:56 -07:00
init . name = name ;
init . ops = & clk_fixed_rate_ops ;
2012-06-01 14:02:47 +05:30
init . flags = flags | CLK_IS_BASIC ;
2012-04-25 22:58:56 -07:00
init . parent_names = ( parent_name ? & parent_name : NULL ) ;
init . num_parents = ( parent_name ? 1 : 0 ) ;
2012-03-15 23:11:20 -07:00
/* struct clk_fixed_rate assignments */
fixed - > fixed_rate = fixed_rate ;
2013-12-21 10:34:48 +01:00
fixed - > fixed_accuracy = fixed_accuracy ;
2012-04-25 22:58:56 -07:00
fixed - > hw . init = & init ;
2012-03-15 23:11:20 -07:00
2012-03-26 17:51:03 -07:00
/* register the clock */
2016-02-07 00:34:13 -08:00
hw = & fixed - > hw ;
ret = clk_hw_register ( dev , hw ) ;
if ( ret ) {
2012-03-26 17:51:03 -07:00
kfree ( fixed ) ;
2016-02-07 00:34:13 -08:00
hw = ERR_PTR ( ret ) ;
}
2012-03-26 17:51:03 -07:00
2016-02-07 00:34:13 -08:00
return hw ;
}
EXPORT_SYMBOL_GPL ( clk_hw_register_fixed_rate_with_accuracy ) ;
struct clk * clk_register_fixed_rate_with_accuracy ( struct device * dev ,
const char * name , const char * parent_name , unsigned long flags ,
unsigned long fixed_rate , unsigned long fixed_accuracy )
{
struct clk_hw * hw ;
hw = clk_hw_register_fixed_rate_with_accuracy ( dev , name , parent_name ,
flags , fixed_rate , fixed_accuracy ) ;
if ( IS_ERR ( hw ) )
return ERR_CAST ( hw ) ;
return hw - > clk ;
2012-03-15 23:11:20 -07:00
}
2013-12-21 10:34:48 +01:00
EXPORT_SYMBOL_GPL ( clk_register_fixed_rate_with_accuracy ) ;
/**
2016-02-07 00:34:13 -08:00
* clk_hw_register_fixed_rate - register fixed - rate clock with the clock
* framework
2013-12-21 10:34:48 +01:00
* @ dev : device that is registering this clock
* @ name : name of this clock
* @ parent_name : name of clock ' s parent
* @ flags : framework - specific flags
* @ fixed_rate : non - adjustable clock rate
*/
2016-02-07 00:34:13 -08:00
struct clk_hw * clk_hw_register_fixed_rate ( struct device * dev , const char * name ,
const char * parent_name , unsigned long flags ,
unsigned long fixed_rate )
{
return clk_hw_register_fixed_rate_with_accuracy ( dev , name , parent_name ,
flags , fixed_rate , 0 ) ;
}
EXPORT_SYMBOL_GPL ( clk_hw_register_fixed_rate ) ;
2013-12-21 10:34:48 +01:00
struct clk * clk_register_fixed_rate ( struct device * dev , const char * name ,
const char * parent_name , unsigned long flags ,
unsigned long fixed_rate )
{
return clk_register_fixed_rate_with_accuracy ( dev , name , parent_name ,
flags , fixed_rate , 0 ) ;
}
2013-07-24 17:43:29 -07:00
EXPORT_SYMBOL_GPL ( clk_register_fixed_rate ) ;
2012-04-07 21:39:39 -05:00
2016-01-06 13:25:10 +09:00
void clk_unregister_fixed_rate ( struct clk * clk )
{
struct clk_hw * hw ;
hw = __clk_get_hw ( clk ) ;
if ( ! hw )
return ;
clk_unregister ( clk ) ;
kfree ( to_clk_fixed_rate ( hw ) ) ;
}
EXPORT_SYMBOL_GPL ( clk_unregister_fixed_rate ) ;
2012-04-07 21:39:39 -05:00
# ifdef CONFIG_OF
/**
* of_fixed_clk_setup ( ) - Setup function for simple fixed rate clock
*/
2013-01-06 18:21:43 +04:00
void of_fixed_clk_setup ( struct device_node * node )
2012-04-07 21:39:39 -05:00
{
struct clk * clk ;
const char * clk_name = node - > name ;
u32 rate ;
2013-12-21 10:34:48 +01:00
u32 accuracy = 0 ;
2012-04-07 21:39:39 -05:00
if ( of_property_read_u32 ( node , " clock-frequency " , & rate ) )
return ;
2013-12-21 10:34:48 +01:00
of_property_read_u32 ( node , " clock-accuracy " , & accuracy ) ;
2012-04-07 21:39:39 -05:00
of_property_read_string ( node , " clock-output-names " , & clk_name ) ;
2013-12-21 10:34:48 +01:00
clk = clk_register_fixed_rate_with_accuracy ( NULL , clk_name , NULL ,
2016-03-01 11:00:12 -08:00
0 , rate , accuracy ) ;
2012-09-21 14:35:18 +08:00
if ( ! IS_ERR ( clk ) )
2012-04-07 21:39:39 -05:00
of_clk_add_provider ( node , of_clk_src_simple_get , clk ) ;
}
EXPORT_SYMBOL_GPL ( of_fixed_clk_setup ) ;
2013-01-04 12:30:52 +05:30
CLK_OF_DECLARE ( fixed_clk , " fixed-clock " , of_fixed_clk_setup ) ;
2012-04-07 21:39:39 -05:00
# endif