Commit 84965337 authored by Paul Mundt's avatar Paul Mundt

Merge branch 'common/clkfwk' into sh-fixes-for-linus

parents 6800e4c0 549015c3
...@@ -79,10 +79,6 @@ ...@@ -79,10 +79,6 @@
</sect2> </sect2>
</sect1> </sect1>
</chapter> </chapter>
<chapter id="clk">
<title>Clock Framework Extensions</title>
!Iinclude/linux/sh_clk.h
</chapter>
<chapter id="mach"> <chapter id="mach">
<title>Machine Specific Interfaces</title> <title>Machine Specific Interfaces</title>
<sect1 id="dreamcast"> <sect1 id="dreamcast">
......
Clock framework on SuperH architecture
The framework on SH extends existing API by the function clk_set_rate_ex,
which prototype is as follows:
clk_set_rate_ex (struct clk *clk, unsigned long rate, int algo_id)
The algo_id parameter is used to specify algorithm used to recalculate clocks,
adjanced to clock, specified as first argument. It is assumed that algo_id==0
means no changes to adjanced clock
Internally, the clk_set_rate_ex forwards request to clk->ops->set_rate method,
if it is present in ops structure. The method should set the clock rate and adjust
all needed clocks according to the passed algo_id.
Exact values for algo_id are machine-dependent. For the sh7722, the following
values are defined:
NO_CHANGE = 0,
IUS_N1_N1, /* I:U = N:1, U:Sh = N:1 */
IUS_322, /* I:U:Sh = 3:2:2 */
IUS_522, /* I:U:Sh = 5:2:2 */
IUS_N11, /* I:U:Sh = N:1:1 */
SB_N1, /* Sh:B = N:1 */
SB3_N1, /* Sh:B3 = N:1 */
SB3_32, /* Sh:B3 = 3:2 */
SB3_43, /* Sh:B3 = 4:3 */
SB3_54, /* Sh:B3 = 5:4 */
BP_N1, /* B:P = N:1 */
IP_N1 /* I:P = N:1 */
Each of these constants means relation between clocks that can be set via the FRQCR
register
...@@ -220,8 +220,7 @@ static void pllc2_disable(struct clk *clk) ...@@ -220,8 +220,7 @@ static void pllc2_disable(struct clk *clk)
__raw_writel(__raw_readl(PLLC2CR) & ~0x80000000, PLLC2CR); __raw_writel(__raw_readl(PLLC2CR) & ~0x80000000, PLLC2CR);
} }
static int pllc2_set_rate(struct clk *clk, static int pllc2_set_rate(struct clk *clk, unsigned long rate)
unsigned long rate, int algo_id)
{ {
unsigned long value; unsigned long value;
int idx; int idx;
...@@ -463,8 +462,7 @@ static int fsidiv_enable(struct clk *clk) ...@@ -463,8 +462,7 @@ static int fsidiv_enable(struct clk *clk)
return 0; return 0;
} }
static int fsidiv_set_rate(struct clk *clk, static int fsidiv_set_rate(struct clk *clk, unsigned long rate)
unsigned long rate, int algo_id)
{ {
int idx; int idx;
......
...@@ -110,7 +110,7 @@ static int shoc_clk_verify_rate(struct clk *clk, unsigned long rate) ...@@ -110,7 +110,7 @@ static int shoc_clk_verify_rate(struct clk *clk, unsigned long rate)
return 0; return 0;
} }
static int shoc_clk_set_rate(struct clk *clk, unsigned long rate, int algo_id) static int shoc_clk_set_rate(struct clk *clk, unsigned long rate)
{ {
unsigned long frqcr3; unsigned long frqcr3;
unsigned int tmp; unsigned int tmp;
......
...@@ -454,12 +454,6 @@ unsigned long clk_get_rate(struct clk *clk) ...@@ -454,12 +454,6 @@ unsigned long clk_get_rate(struct clk *clk)
EXPORT_SYMBOL_GPL(clk_get_rate); EXPORT_SYMBOL_GPL(clk_get_rate);
int clk_set_rate(struct clk *clk, unsigned long rate) int clk_set_rate(struct clk *clk, unsigned long rate)
{
return clk_set_rate_ex(clk, rate, 0);
}
EXPORT_SYMBOL_GPL(clk_set_rate);
int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id)
{ {
int ret = -EOPNOTSUPP; int ret = -EOPNOTSUPP;
unsigned long flags; unsigned long flags;
...@@ -467,7 +461,7 @@ int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id) ...@@ -467,7 +461,7 @@ int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id)
spin_lock_irqsave(&clock_lock, flags); spin_lock_irqsave(&clock_lock, flags);
if (likely(clk->ops && clk->ops->set_rate)) { if (likely(clk->ops && clk->ops->set_rate)) {
ret = clk->ops->set_rate(clk, rate, algo_id); ret = clk->ops->set_rate(clk, rate);
if (ret != 0) if (ret != 0)
goto out_unlock; goto out_unlock;
} else { } else {
...@@ -485,7 +479,7 @@ int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id) ...@@ -485,7 +479,7 @@ int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id)
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(clk_set_rate_ex); EXPORT_SYMBOL_GPL(clk_set_rate);
int clk_set_parent(struct clk *clk, struct clk *parent) int clk_set_parent(struct clk *clk, struct clk *parent)
{ {
...@@ -653,8 +647,7 @@ static int clks_sysdev_suspend(struct sys_device *dev, pm_message_t state) ...@@ -653,8 +647,7 @@ static int clks_sysdev_suspend(struct sys_device *dev, pm_message_t state)
clkp->ops->set_parent(clkp, clkp->ops->set_parent(clkp,
clkp->parent); clkp->parent);
if (likely(clkp->ops->set_rate)) if (likely(clkp->ops->set_rate))
clkp->ops->set_rate(clkp, clkp->ops->set_rate(clkp, rate);
rate, NO_CHANGE);
else if (likely(clkp->ops->recalc)) else if (likely(clkp->ops->recalc))
clkp->rate = clkp->ops->recalc(clkp); clkp->rate = clkp->ops->recalc(clkp);
} }
......
...@@ -110,8 +110,7 @@ static int sh_clk_div6_set_parent(struct clk *clk, struct clk *parent) ...@@ -110,8 +110,7 @@ static int sh_clk_div6_set_parent(struct clk *clk, struct clk *parent)
return 0; return 0;
} }
static int sh_clk_div6_set_rate(struct clk *clk, static int sh_clk_div6_set_rate(struct clk *clk, unsigned long rate)
unsigned long rate, int algo_id)
{ {
unsigned long value; unsigned long value;
int idx; int idx;
...@@ -253,7 +252,7 @@ static int sh_clk_div4_set_parent(struct clk *clk, struct clk *parent) ...@@ -253,7 +252,7 @@ static int sh_clk_div4_set_parent(struct clk *clk, struct clk *parent)
return 0; return 0;
} }
static int sh_clk_div4_set_rate(struct clk *clk, unsigned long rate, int algo_id) static int sh_clk_div4_set_rate(struct clk *clk, unsigned long rate)
{ {
struct clk_div4_table *d4t = clk->priv; struct clk_div4_table *d4t = clk->priv;
unsigned long value; unsigned long value;
......
...@@ -19,11 +19,13 @@ struct clk_mapping { ...@@ -19,11 +19,13 @@ struct clk_mapping {
}; };
struct clk_ops { struct clk_ops {
#ifdef CONFIG_SH_CLK_CPG_LEGACY
void (*init)(struct clk *clk); void (*init)(struct clk *clk);
#endif
int (*enable)(struct clk *clk); int (*enable)(struct clk *clk);
void (*disable)(struct clk *clk); void (*disable)(struct clk *clk);
unsigned long (*recalc)(struct clk *clk); unsigned long (*recalc)(struct clk *clk);
int (*set_rate)(struct clk *clk, unsigned long rate, int algo_id); int (*set_rate)(struct clk *clk, unsigned long rate);
int (*set_parent)(struct clk *clk, struct clk *parent); int (*set_parent)(struct clk *clk, struct clk *parent);
long (*round_rate)(struct clk *clk, unsigned long rate); long (*round_rate)(struct clk *clk, unsigned long rate);
}; };
...@@ -67,36 +69,6 @@ int clk_register(struct clk *); ...@@ -67,36 +69,6 @@ int clk_register(struct clk *);
void clk_unregister(struct clk *); void clk_unregister(struct clk *);
void clk_enable_init_clocks(void); void clk_enable_init_clocks(void);
/**
* clk_set_rate_ex - set the clock rate for a clock source, with additional parameter
* @clk: clock source
* @rate: desired clock rate in Hz
* @algo_id: algorithm id to be passed down to ops->set_rate
*
* Returns success (0) or negative errno.
*/
int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id);
enum clk_sh_algo_id {
NO_CHANGE = 0,
IUS_N1_N1,
IUS_322,
IUS_522,
IUS_N11,
SB_N1,
SB3_N1,
SB3_32,
SB3_43,
SB3_54,
BP_N1,
IP_N1,
};
struct clk_div_mult_table { struct clk_div_mult_table {
unsigned int *divisors; unsigned int *divisors;
unsigned int nr_divisors; unsigned int nr_divisors;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment