sh: clkfwk: Use shared sh_clk_div_recalc().

This generalizes the div4 recalc routine for use by div6 and others, then
makes it the default.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
Paul Mundt 2012-05-25 15:26:01 +09:00
parent 1111cc1e80
commit 75f5f8a56e
2 changed files with 28 additions and 36 deletions

View File

@ -66,11 +66,6 @@ int __init sh_clk_mstp_register(struct clk *clks, int nr)
return ret; return ret;
} }
static long sh_clk_div_round_rate(struct clk *clk, unsigned long rate)
{
return clk_rate_table_round(clk, clk->freq_table, rate);
}
/* /*
* Div/mult table lookup helpers * Div/mult table lookup helpers
*/ */
@ -84,6 +79,27 @@ static inline struct clk_div_mult_table *clk_to_div_mult_table(struct clk *clk)
return clk_to_div_table(clk)->div_mult_table; return clk_to_div_table(clk)->div_mult_table;
} }
/*
* Common div ops
*/
static long sh_clk_div_round_rate(struct clk *clk, unsigned long rate)
{
return clk_rate_table_round(clk, clk->freq_table, rate);
}
static unsigned long sh_clk_div_recalc(struct clk *clk)
{
struct clk_div_mult_table *table = clk_to_div_mult_table(clk);
unsigned int idx;
clk_rate_table_build(clk, clk->freq_table, table->nr_divisors,
table, clk->arch_flags ? &clk->arch_flags : NULL);
idx = (sh_clk_read(clk) >> clk->enable_bit) & clk->div_mask;
return clk->freq_table[idx].frequency;
}
/* /*
* div6 support * div6 support
*/ */
@ -103,19 +119,6 @@ static struct clk_div_table sh_clk_div6_table = {
.div_mult_table = &div6_div_mult_table, .div_mult_table = &div6_div_mult_table,
}; };
static unsigned long sh_clk_div6_recalc(struct clk *clk)
{
struct clk_div_mult_table *table = clk_to_div_mult_table(clk);
unsigned int idx;
clk_rate_table_build(clk, clk->freq_table, table->nr_divisors,
table, NULL);
idx = sh_clk_read(clk) & clk->div_mask;
return clk->freq_table[idx].frequency;
}
static int sh_clk_div6_set_parent(struct clk *clk, struct clk *parent) static int sh_clk_div6_set_parent(struct clk *clk, struct clk *parent)
{ {
struct clk_div_mult_table *table = clk_to_div_mult_table(clk); struct clk_div_mult_table *table = clk_to_div_mult_table(clk);
@ -190,7 +193,7 @@ static void sh_clk_div6_disable(struct clk *clk)
} }
static struct sh_clk_ops sh_clk_div6_clk_ops = { static struct sh_clk_ops sh_clk_div6_clk_ops = {
.recalc = sh_clk_div6_recalc, .recalc = sh_clk_div_recalc,
.round_rate = sh_clk_div_round_rate, .round_rate = sh_clk_div_round_rate,
.set_rate = sh_clk_div6_set_rate, .set_rate = sh_clk_div6_set_rate,
.enable = sh_clk_div6_enable, .enable = sh_clk_div6_enable,
@ -198,7 +201,7 @@ static struct sh_clk_ops sh_clk_div6_clk_ops = {
}; };
static struct sh_clk_ops sh_clk_div6_reparent_clk_ops = { static struct sh_clk_ops sh_clk_div6_reparent_clk_ops = {
.recalc = sh_clk_div6_recalc, .recalc = sh_clk_div_recalc,
.round_rate = sh_clk_div_round_rate, .round_rate = sh_clk_div_round_rate,
.set_rate = sh_clk_div6_set_rate, .set_rate = sh_clk_div6_set_rate,
.enable = sh_clk_div6_enable, .enable = sh_clk_div6_enable,
@ -287,19 +290,6 @@ int __init sh_clk_div6_reparent_register(struct clk *clks, int nr)
/* /*
* div4 support * div4 support
*/ */
static unsigned long sh_clk_div4_recalc(struct clk *clk)
{
struct clk_div_mult_table *table = clk_to_div_mult_table(clk);
unsigned int idx;
clk_rate_table_build(clk, clk->freq_table, table->nr_divisors,
table, &clk->arch_flags);
idx = (sh_clk_read(clk) >> clk->enable_bit) & clk->div_mask;
return clk->freq_table[idx].frequency;
}
static int sh_clk_div4_set_parent(struct clk *clk, struct clk *parent) static int sh_clk_div4_set_parent(struct clk *clk, struct clk *parent)
{ {
struct clk_div_mult_table *table = clk_to_div_mult_table(clk); struct clk_div_mult_table *table = clk_to_div_mult_table(clk);
@ -361,13 +351,13 @@ static void sh_clk_div4_disable(struct clk *clk)
} }
static struct sh_clk_ops sh_clk_div4_clk_ops = { static struct sh_clk_ops sh_clk_div4_clk_ops = {
.recalc = sh_clk_div4_recalc, .recalc = sh_clk_div_recalc,
.set_rate = sh_clk_div4_set_rate, .set_rate = sh_clk_div4_set_rate,
.round_rate = sh_clk_div_round_rate, .round_rate = sh_clk_div_round_rate,
}; };
static struct sh_clk_ops sh_clk_div4_enable_clk_ops = { static struct sh_clk_ops sh_clk_div4_enable_clk_ops = {
.recalc = sh_clk_div4_recalc, .recalc = sh_clk_div_recalc,
.set_rate = sh_clk_div4_set_rate, .set_rate = sh_clk_div4_set_rate,
.round_rate = sh_clk_div_round_rate, .round_rate = sh_clk_div_round_rate,
.enable = sh_clk_div4_enable, .enable = sh_clk_div4_enable,
@ -375,7 +365,7 @@ static struct sh_clk_ops sh_clk_div4_enable_clk_ops = {
}; };
static struct sh_clk_ops sh_clk_div4_reparent_clk_ops = { static struct sh_clk_ops sh_clk_div4_reparent_clk_ops = {
.recalc = sh_clk_div4_recalc, .recalc = sh_clk_div_recalc,
.set_rate = sh_clk_div4_set_rate, .set_rate = sh_clk_div4_set_rate,
.round_rate = sh_clk_div_round_rate, .round_rate = sh_clk_div_round_rate,
.enable = sh_clk_div4_enable, .enable = sh_clk_div4_enable,

View File

@ -172,6 +172,7 @@ int sh_clk_div4_reparent_register(struct clk *clks, int nr,
_num_parents, _src_shift, _src_width) \ _num_parents, _src_shift, _src_width) \
{ \ { \
.enable_reg = (void __iomem *)_reg, \ .enable_reg = (void __iomem *)_reg, \
.enable_bit = 0, /* unused */ \
.flags = _flags, \ .flags = _flags, \
.div_mask = SH_CLK_DIV6_MSK, \ .div_mask = SH_CLK_DIV6_MSK, \
.parent_table = _parents, \ .parent_table = _parents, \
@ -184,6 +185,7 @@ int sh_clk_div4_reparent_register(struct clk *clks, int nr,
{ \ { \
.parent = _parent, \ .parent = _parent, \
.enable_reg = (void __iomem *)_reg, \ .enable_reg = (void __iomem *)_reg, \
.enable_bit = 0, /* unused */ \
.div_mask = SH_CLK_DIV6_MSK, \ .div_mask = SH_CLK_DIV6_MSK, \
.flags = _flags, \ .flags = _flags, \
} }