2018-09-25 09:34:05 +02:00
// SPDX-License-Identifier: GPL-2.0
2014-04-18 08:05:50 +09:00
/*
* r8a7779 Core CPG Clocks
*
* Copyright ( C ) 2013 , 2014 Horms Solutions Ltd .
*
* Contact : Simon Horman < horms @ verge . net . au >
*/
# include <linux/clk-provider.h>
2016-03-08 09:42:07 +09:00
# include <linux/clk/renesas.h>
2014-04-18 08:05:50 +09:00
# include <linux/init.h>
# include <linux/kernel.h>
# include <linux/of.h>
# include <linux/of_address.h>
2015-06-23 15:09:27 +02:00
# include <linux/slab.h>
2014-04-18 08:05:50 +09:00
# include <linux/spinlock.h>
2016-06-01 14:49:41 +02:00
# include <linux/soc/renesas/rcar-rst.h>
2014-04-18 08:05:50 +09:00
# include <dt-bindings/clock/r8a7779-clock.h>
# define CPG_NUM_CLOCKS (R8A7779_CLK_OUT + 1)
struct r8a7779_cpg {
struct clk_onecell_data data ;
spinlock_t lock ;
void __iomem * reg ;
} ;
/* -----------------------------------------------------------------------------
* CPG Clock Data
*/
/*
* MD1 = 1 MD1 = 0
* ( PLLA = 1500 ) ( PLLA = 1600 )
* ( MHz ) ( MHz )
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - -
* clkz 1000 ( 2 / 3 ) 800 ( 1 / 2 )
* clkzs 250 ( 1 / 6 ) 200 ( 1 / 8 )
* clki 750 ( 1 / 2 ) 800 ( 1 / 2 )
* clks 250 ( 1 / 6 ) 200 ( 1 / 8 )
* clks1 125 ( 1 / 12 ) 100 ( 1 / 16 )
* clks3 187.5 ( 1 / 8 ) 200 ( 1 / 8 )
* clks4 93.7 ( 1 / 16 ) 100 ( 1 / 16 )
* clkp 62.5 ( 1 / 24 ) 50 ( 1 / 32 )
* clkg 62.5 ( 1 / 24 ) 66.6 ( 1 / 24 )
* clkb , CLKOUT
* ( MD2 = 0 ) 62.5 ( 1 / 24 ) 66.6 ( 1 / 24 )
* ( MD2 = 1 ) 41.6 ( 1 / 36 ) 50 ( 1 / 32 )
*/
# define CPG_CLK_CONFIG_INDEX(md) (((md) & (BIT(2)|BIT(1))) >> 1)
struct cpg_clk_config {
unsigned int z_mult ;
unsigned int z_div ;
unsigned int zs_and_s_div ;
unsigned int s1_div ;
unsigned int p_div ;
unsigned int b_and_out_div ;
} ;
static const struct cpg_clk_config cpg_clk_configs [ 4 ] __initconst = {
{ 1 , 2 , 8 , 16 , 32 , 24 } ,
{ 2 , 3 , 6 , 12 , 24 , 24 } ,
{ 1 , 2 , 8 , 16 , 32 , 32 } ,
{ 2 , 3 , 6 , 12 , 24 , 36 } ,
} ;
/*
* MD PLLA Ratio
* 12 11
* - - - - - - - - - - - - - - - - - - - - - - - -
* 0 0 x42
* 0 1 x48
* 1 0 x56
* 1 1 x64
*/
# define CPG_PLLA_MULT_INDEX(md) (((md) & (BIT(12)|BIT(11))) >> 11)
static const unsigned int cpg_plla_mult [ 4 ] __initconst = { 42 , 48 , 56 , 64 } ;
/* -----------------------------------------------------------------------------
* Initialization
*/
static struct clk * __init
r8a7779_cpg_register_clock ( struct device_node * np , struct r8a7779_cpg * cpg ,
const struct cpg_clk_config * config ,
unsigned int plla_mult , const char * name )
{
const char * parent_name = " plla " ;
unsigned int mult = 1 ;
unsigned int div = 1 ;
if ( ! strcmp ( name , " plla " ) ) {
parent_name = of_clk_get_parent_name ( np , 0 ) ;
mult = plla_mult ;
} else if ( ! strcmp ( name , " z " ) ) {
div = config - > z_div ;
mult = config - > z_mult ;
} else if ( ! strcmp ( name , " zs " ) | | ! strcmp ( name , " s " ) ) {
div = config - > zs_and_s_div ;
} else if ( ! strcmp ( name , " s1 " ) ) {
div = config - > s1_div ;
} else if ( ! strcmp ( name , " p " ) ) {
div = config - > p_div ;
} else if ( ! strcmp ( name , " b " ) | | ! strcmp ( name , " out " ) ) {
div = config - > b_and_out_div ;
} else {
return ERR_PTR ( - EINVAL ) ;
}
return clk_register_fixed_factor ( NULL , name , parent_name , 0 , mult , div ) ;
}
static void __init r8a7779_cpg_clocks_init ( struct device_node * np )
{
const struct cpg_clk_config * config ;
struct r8a7779_cpg * cpg ;
struct clk * * clks ;
unsigned int i , plla_mult ;
int num_clks ;
2016-06-01 14:49:41 +02:00
u32 mode ;
if ( rcar_rst_read_mode_pins ( & mode ) )
return ;
2014-04-18 08:05:50 +09:00
num_clks = of_property_count_strings ( np , " clock-output-names " ) ;
if ( num_clks < 0 ) {
pr_err ( " %s: failed to count clocks \n " , __func__ ) ;
return ;
}
cpg = kzalloc ( sizeof ( * cpg ) , GFP_KERNEL ) ;
treewide: kzalloc() -> kcalloc()
The kzalloc() function has a 2-factor argument form, kcalloc(). This
patch replaces cases of:
kzalloc(a * b, gfp)
with:
kcalloc(a * b, gfp)
as well as handling cases of:
kzalloc(a * b * c, gfp)
with:
kzalloc(array3_size(a, b, c), gfp)
as it's slightly less ugly than:
kzalloc_array(array_size(a, b), c, gfp)
This does, however, attempt to ignore constant size factors like:
kzalloc(4 * 1024, gfp)
though any constants defined via macros get caught up in the conversion.
Any factors with a sizeof() of "unsigned char", "char", and "u8" were
dropped, since they're redundant.
The Coccinelle script used for this was:
// Fix redundant parens around sizeof().
@@
type TYPE;
expression THING, E;
@@
(
kzalloc(
- (sizeof(TYPE)) * E
+ sizeof(TYPE) * E
, ...)
|
kzalloc(
- (sizeof(THING)) * E
+ sizeof(THING) * E
, ...)
)
// Drop single-byte sizes and redundant parens.
@@
expression COUNT;
typedef u8;
typedef __u8;
@@
(
kzalloc(
- sizeof(u8) * (COUNT)
+ COUNT
, ...)
|
kzalloc(
- sizeof(__u8) * (COUNT)
+ COUNT
, ...)
|
kzalloc(
- sizeof(char) * (COUNT)
+ COUNT
, ...)
|
kzalloc(
- sizeof(unsigned char) * (COUNT)
+ COUNT
, ...)
|
kzalloc(
- sizeof(u8) * COUNT
+ COUNT
, ...)
|
kzalloc(
- sizeof(__u8) * COUNT
+ COUNT
, ...)
|
kzalloc(
- sizeof(char) * COUNT
+ COUNT
, ...)
|
kzalloc(
- sizeof(unsigned char) * COUNT
+ COUNT
, ...)
)
// 2-factor product with sizeof(type/expression) and identifier or constant.
@@
type TYPE;
expression THING;
identifier COUNT_ID;
constant COUNT_CONST;
@@
(
- kzalloc
+ kcalloc
(
- sizeof(TYPE) * (COUNT_ID)
+ COUNT_ID, sizeof(TYPE)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(TYPE) * COUNT_ID
+ COUNT_ID, sizeof(TYPE)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(TYPE) * (COUNT_CONST)
+ COUNT_CONST, sizeof(TYPE)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(TYPE) * COUNT_CONST
+ COUNT_CONST, sizeof(TYPE)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(THING) * (COUNT_ID)
+ COUNT_ID, sizeof(THING)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(THING) * COUNT_ID
+ COUNT_ID, sizeof(THING)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(THING) * (COUNT_CONST)
+ COUNT_CONST, sizeof(THING)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(THING) * COUNT_CONST
+ COUNT_CONST, sizeof(THING)
, ...)
)
// 2-factor product, only identifiers.
@@
identifier SIZE, COUNT;
@@
- kzalloc
+ kcalloc
(
- SIZE * COUNT
+ COUNT, SIZE
, ...)
// 3-factor product with 1 sizeof(type) or sizeof(expression), with
// redundant parens removed.
@@
expression THING;
identifier STRIDE, COUNT;
type TYPE;
@@
(
kzalloc(
- sizeof(TYPE) * (COUNT) * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
kzalloc(
- sizeof(TYPE) * (COUNT) * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
kzalloc(
- sizeof(TYPE) * COUNT * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
kzalloc(
- sizeof(TYPE) * COUNT * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
kzalloc(
- sizeof(THING) * (COUNT) * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
|
kzalloc(
- sizeof(THING) * (COUNT) * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
|
kzalloc(
- sizeof(THING) * COUNT * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
|
kzalloc(
- sizeof(THING) * COUNT * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
)
// 3-factor product with 2 sizeof(variable), with redundant parens removed.
@@
expression THING1, THING2;
identifier COUNT;
type TYPE1, TYPE2;
@@
(
kzalloc(
- sizeof(TYPE1) * sizeof(TYPE2) * COUNT
+ array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
, ...)
|
kzalloc(
- sizeof(TYPE1) * sizeof(THING2) * (COUNT)
+ array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
, ...)
|
kzalloc(
- sizeof(THING1) * sizeof(THING2) * COUNT
+ array3_size(COUNT, sizeof(THING1), sizeof(THING2))
, ...)
|
kzalloc(
- sizeof(THING1) * sizeof(THING2) * (COUNT)
+ array3_size(COUNT, sizeof(THING1), sizeof(THING2))
, ...)
|
kzalloc(
- sizeof(TYPE1) * sizeof(THING2) * COUNT
+ array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
, ...)
|
kzalloc(
- sizeof(TYPE1) * sizeof(THING2) * (COUNT)
+ array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
, ...)
)
// 3-factor product, only identifiers, with redundant parens removed.
@@
identifier STRIDE, SIZE, COUNT;
@@
(
kzalloc(
- (COUNT) * STRIDE * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- COUNT * (STRIDE) * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- COUNT * STRIDE * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- (COUNT) * (STRIDE) * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- COUNT * (STRIDE) * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- (COUNT) * STRIDE * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- (COUNT) * (STRIDE) * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
kzalloc(
- COUNT * STRIDE * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
)
// Any remaining multi-factor products, first at least 3-factor products,
// when they're not all constants...
@@
expression E1, E2, E3;
constant C1, C2, C3;
@@
(
kzalloc(C1 * C2 * C3, ...)
|
kzalloc(
- (E1) * E2 * E3
+ array3_size(E1, E2, E3)
, ...)
|
kzalloc(
- (E1) * (E2) * E3
+ array3_size(E1, E2, E3)
, ...)
|
kzalloc(
- (E1) * (E2) * (E3)
+ array3_size(E1, E2, E3)
, ...)
|
kzalloc(
- E1 * E2 * E3
+ array3_size(E1, E2, E3)
, ...)
)
// And then all remaining 2 factors products when they're not all constants,
// keeping sizeof() as the second factor argument.
@@
expression THING, E1, E2;
type TYPE;
constant C1, C2, C3;
@@
(
kzalloc(sizeof(THING) * C2, ...)
|
kzalloc(sizeof(TYPE) * C2, ...)
|
kzalloc(C1 * C2 * C3, ...)
|
kzalloc(C1 * C2, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(TYPE) * (E2)
+ E2, sizeof(TYPE)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(TYPE) * E2
+ E2, sizeof(TYPE)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(THING) * (E2)
+ E2, sizeof(THING)
, ...)
|
- kzalloc
+ kcalloc
(
- sizeof(THING) * E2
+ E2, sizeof(THING)
, ...)
|
- kzalloc
+ kcalloc
(
- (E1) * E2
+ E1, E2
, ...)
|
- kzalloc
+ kcalloc
(
- (E1) * (E2)
+ E1, E2
, ...)
|
- kzalloc
+ kcalloc
(
- E1 * E2
+ E1, E2
, ...)
)
Signed-off-by: Kees Cook <keescook@chromium.org>
2018-06-12 14:03:40 -07:00
clks = kcalloc ( CPG_NUM_CLOCKS , sizeof ( * clks ) , GFP_KERNEL ) ;
2014-04-18 08:05:50 +09:00
if ( cpg = = NULL | | clks = = NULL ) {
/* We're leaking memory on purpose, there's no point in cleaning
* up as the system won ' t boot anyway .
*/
return ;
}
spin_lock_init ( & cpg - > lock ) ;
cpg - > data . clks = clks ;
cpg - > data . clk_num = num_clks ;
2016-06-01 14:49:41 +02:00
config = & cpg_clk_configs [ CPG_CLK_CONFIG_INDEX ( mode ) ] ;
plla_mult = cpg_plla_mult [ CPG_PLLA_MULT_INDEX ( mode ) ] ;
2014-04-18 08:05:50 +09:00
for ( i = 0 ; i < num_clks ; + + i ) {
const char * name ;
struct clk * clk ;
of_property_read_string_index ( np , " clock-output-names " , i ,
& name ) ;
clk = r8a7779_cpg_register_clock ( np , cpg , config ,
plla_mult , name ) ;
if ( IS_ERR ( clk ) )
2018-08-28 10:44:29 -05:00
pr_err ( " %s: failed to register %pOFn %s clock (%ld) \n " ,
__func__ , np , name , PTR_ERR ( clk ) ) ;
2014-04-18 08:05:50 +09:00
else
cpg - > data . clks [ i ] = clk ;
}
of_clk_add_provider ( np , of_clk_src_onecell_get , & cpg - > data ) ;
2015-08-04 14:28:04 +02:00
cpg_mstp_add_clk_domain ( np ) ;
2014-04-18 08:05:50 +09:00
}
CLK_OF_DECLARE ( r8a7779_cpg_clks , " renesas,r8a7779-cpg-clocks " ,
r8a7779_cpg_clocks_init ) ;