ARM: Indirect round/set_rate operations through clk structure
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
3081e43b97
commit
9bf5b2ef67
9 changed files with 77 additions and 24 deletions
|
@ -71,6 +71,12 @@ static void impd1_setvco(struct clk *clk, struct icst_vco vco)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct clk_ops impd1_clk_ops = {
|
||||||
|
.round = icst_clk_round,
|
||||||
|
.set = icst_clk_set,
|
||||||
|
.setvco = impd1_setvco,
|
||||||
|
};
|
||||||
|
|
||||||
void impd1_tweak_control(struct device *dev, u32 mask, u32 val)
|
void impd1_tweak_control(struct device *dev, u32 mask, u32 val)
|
||||||
{
|
{
|
||||||
struct impd1_module *impd1 = dev_get_drvdata(dev);
|
struct impd1_module *impd1 = dev_get_drvdata(dev);
|
||||||
|
@ -366,10 +372,10 @@ static int impd1_probe(struct lm_device *dev)
|
||||||
(unsigned long)dev->resource.start);
|
(unsigned long)dev->resource.start);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(impd1->vcos); i++) {
|
for (i = 0; i < ARRAY_SIZE(impd1->vcos); i++) {
|
||||||
|
impd1->vcos[i].ops = &impd1_clk_ops,
|
||||||
impd1->vcos[i].owner = THIS_MODULE,
|
impd1->vcos[i].owner = THIS_MODULE,
|
||||||
impd1->vcos[i].params = &impd1_vco_params,
|
impd1->vcos[i].params = &impd1_vco_params,
|
||||||
impd1->vcos[i].data = impd1,
|
impd1->vcos[i].data = impd1;
|
||||||
impd1->vcos[i].setvco = impd1_setvco;
|
|
||||||
}
|
}
|
||||||
impd1->vcos[0].vcoreg = impd1->base + IMPD1_OSC1;
|
impd1->vcos[0].vcoreg = impd1->base + IMPD1_OSC1;
|
||||||
impd1->vcos[1].vcoreg = impd1->base + IMPD1_OSC2;
|
impd1->vcos[1].vcoreg = impd1->base + IMPD1_OSC2;
|
||||||
|
|
|
@ -2,14 +2,14 @@
|
||||||
#define __ASM_MACH_CLKDEV_H
|
#define __ASM_MACH_CLKDEV_H
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <asm/hardware/icst.h>
|
#include <plat/clock.h>
|
||||||
|
|
||||||
struct clk {
|
struct clk {
|
||||||
unsigned long rate;
|
unsigned long rate;
|
||||||
|
const struct clk_ops *ops;
|
||||||
struct module *owner;
|
struct module *owner;
|
||||||
const struct icst_params *params;
|
const struct icst_params *params;
|
||||||
void __iomem *vcoreg;
|
void __iomem *vcoreg;
|
||||||
void (*setvco)(struct clk *, struct icst_vco vco);
|
|
||||||
void *data;
|
void *data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -293,10 +293,16 @@ static void cp_auxvco_set(struct clk *clk, struct icst_vco vco)
|
||||||
writel(0, CM_LOCK);
|
writel(0, CM_LOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct clk_ops cp_auxclk_ops = {
|
||||||
|
.round = icst_clk_round,
|
||||||
|
.set = icst_clk_set,
|
||||||
|
.setvco = cp_auxvco_set,
|
||||||
|
};
|
||||||
|
|
||||||
static struct clk cp_auxclk = {
|
static struct clk cp_auxclk = {
|
||||||
|
.ops = &cp_auxclk_ops,
|
||||||
.params = &cp_auxvco_params,
|
.params = &cp_auxvco_params,
|
||||||
.vcoreg = CM_AUXOSC,
|
.vcoreg = CM_AUXOSC,
|
||||||
.setvco = cp_auxvco_set,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk_lookup cp_lookups[] = {
|
static struct clk_lookup cp_lookups[] = {
|
||||||
|
|
|
@ -281,9 +281,15 @@ static void realview_oscvco_set(struct clk *clk, struct icst_vco vco)
|
||||||
writel(0, sys_lock);
|
writel(0, sys_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct clk_ops oscvco_clk_ops = {
|
||||||
|
.round = icst_clk_round,
|
||||||
|
.set = icst_clk_set,
|
||||||
|
.setvco = realview_oscvco_set,
|
||||||
|
};
|
||||||
|
|
||||||
static struct clk oscvco_clk = {
|
static struct clk oscvco_clk = {
|
||||||
|
.ops = &oscvco_clk_ops,
|
||||||
.params = &realview_oscvco_params,
|
.params = &realview_oscvco_params,
|
||||||
.setvco = realview_oscvco_set,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
#ifndef __ASM_MACH_CLKDEV_H
|
#ifndef __ASM_MACH_CLKDEV_H
|
||||||
#define __ASM_MACH_CLKDEV_H
|
#define __ASM_MACH_CLKDEV_H
|
||||||
|
|
||||||
#include <asm/hardware/icst.h>
|
#include <plat/clock.h>
|
||||||
|
|
||||||
struct clk {
|
struct clk {
|
||||||
unsigned long rate;
|
unsigned long rate;
|
||||||
|
const struct clk_ops *ops;
|
||||||
const struct icst_params *params;
|
const struct icst_params *params;
|
||||||
void __iomem *vcoreg;
|
void __iomem *vcoreg;
|
||||||
void (*setvco)(struct clk *, struct icst_vco vco);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define __clk_get(clk) ({ 1; })
|
#define __clk_get(clk) ({ 1; })
|
||||||
|
|
|
@ -381,11 +381,17 @@ static void versatile_oscvco_set(struct clk *clk, struct icst_vco vco)
|
||||||
writel(0, sys_lock);
|
writel(0, sys_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct clk osc4_clk = {
|
static const struct clk_ops osc4_clk_ops = {
|
||||||
.params = &versatile_oscvco_params,
|
.round = icst_clk_round,
|
||||||
|
.set = icst_clk_set,
|
||||||
.setvco = versatile_oscvco_set,
|
.setvco = versatile_oscvco_set,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct clk osc4_clk = {
|
||||||
|
.ops = &osc4_clk_ops,
|
||||||
|
.params = &versatile_oscvco_params,
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These are fixed clocks.
|
* These are fixed clocks.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
#ifndef __ASM_MACH_CLKDEV_H
|
#ifndef __ASM_MACH_CLKDEV_H
|
||||||
#define __ASM_MACH_CLKDEV_H
|
#define __ASM_MACH_CLKDEV_H
|
||||||
|
|
||||||
#include <asm/hardware/icst.h>
|
#include <plat/clock.h>
|
||||||
|
|
||||||
struct clk {
|
struct clk {
|
||||||
unsigned long rate;
|
unsigned long rate;
|
||||||
|
const struct clk_ops *ops;
|
||||||
const struct icst_params *params;
|
const struct icst_params *params;
|
||||||
void __iomem *vcoreg;
|
void __iomem *vcoreg;
|
||||||
void (*setvco)(struct clk *, struct icst_vco vco);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define __clk_get(clk) ({ 1; })
|
#define __clk_get(clk) ({ 1; })
|
||||||
|
|
|
@ -37,24 +37,38 @@ EXPORT_SYMBOL(clk_get_rate);
|
||||||
|
|
||||||
long clk_round_rate(struct clk *clk, unsigned long rate)
|
long clk_round_rate(struct clk *clk, unsigned long rate)
|
||||||
{
|
{
|
||||||
struct icst_vco vco;
|
long ret = -EIO;
|
||||||
vco = icst_hz_to_vco(clk->params, rate);
|
if (clk->ops && clk->ops->round)
|
||||||
return icst_hz(clk->params, vco);
|
ret = clk->ops->round(clk, rate);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(clk_round_rate);
|
EXPORT_SYMBOL(clk_round_rate);
|
||||||
|
|
||||||
int clk_set_rate(struct clk *clk, unsigned long rate)
|
int clk_set_rate(struct clk *clk, unsigned long rate)
|
||||||
{
|
{
|
||||||
int ret = -EIO;
|
int ret = -EIO;
|
||||||
|
if (clk->ops && clk->ops->set)
|
||||||
if (clk->setvco) {
|
ret = clk->ops->set(clk, rate);
|
||||||
struct icst_vco vco;
|
|
||||||
|
|
||||||
vco = icst_hz_to_vco(clk->params, rate);
|
|
||||||
clk->rate = icst_hz(clk->params, vco);
|
|
||||||
clk->setvco(clk, vco);
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(clk_set_rate);
|
EXPORT_SYMBOL(clk_set_rate);
|
||||||
|
|
||||||
|
long icst_clk_round(struct clk *clk, unsigned long rate)
|
||||||
|
{
|
||||||
|
struct icst_vco vco;
|
||||||
|
vco = icst_hz_to_vco(clk->params, rate);
|
||||||
|
return icst_hz(clk->params, vco);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(icst_clk_round);
|
||||||
|
|
||||||
|
int icst_clk_set(struct clk *clk, unsigned long rate)
|
||||||
|
{
|
||||||
|
struct icst_vco vco;
|
||||||
|
|
||||||
|
vco = icst_hz_to_vco(clk->params, rate);
|
||||||
|
clk->rate = icst_hz(clk->params, vco);
|
||||||
|
clk->ops->setvco(clk, vco);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(icst_clk_set);
|
||||||
|
|
15
arch/arm/plat-versatile/include/plat/clock.h
Normal file
15
arch/arm/plat-versatile/include/plat/clock.h
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#ifndef PLAT_CLOCK_H
|
||||||
|
#define PLAT_CLOCK_H
|
||||||
|
|
||||||
|
#include <asm/hardware/icst.h>
|
||||||
|
|
||||||
|
struct clk_ops {
|
||||||
|
long (*round)(struct clk *, unsigned long);
|
||||||
|
int (*set)(struct clk *, unsigned long);
|
||||||
|
void (*setvco)(struct clk *, struct icst_vco);
|
||||||
|
};
|
||||||
|
|
||||||
|
int icst_clk_set(struct clk *, unsigned long);
|
||||||
|
long icst_clk_round(struct clk *, unsigned long);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue