clk: at91: make use of syscon/regmap internally
Use the regmap coming from syscon to access the registers instead of using pmc_read/pmc_write. This allows to avoid passing the at91_pmc structure to the child nodes of the PMC. The final benefit is to have each clock register itself instead of having to iterate over the children. Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> Acked-by: Stephen Boyd <sboyd@codeaurora.org> Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
This commit is contained in:

committed by
Alexandre Belloni

parent
863a81c3be
commit
1bdf02326b
@@ -21,6 +21,8 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/wait.h>
|
||||
|
||||
@@ -58,7 +60,7 @@ struct clk_slow_rc_osc {
|
||||
|
||||
struct clk_sam9260_slow {
|
||||
struct clk_hw hw;
|
||||
struct at91_pmc *pmc;
|
||||
struct regmap *regmap;
|
||||
};
|
||||
|
||||
#define to_clk_sam9260_slow(hw) container_of(hw, struct clk_sam9260_slow, hw)
|
||||
@@ -388,8 +390,11 @@ void __init of_at91sam9x5_clk_slow_setup(struct device_node *np,
|
||||
static u8 clk_sam9260_slow_get_parent(struct clk_hw *hw)
|
||||
{
|
||||
struct clk_sam9260_slow *slowck = to_clk_sam9260_slow(hw);
|
||||
unsigned int status;
|
||||
|
||||
return !!(pmc_read(slowck->pmc, AT91_PMC_SR) & AT91_PMC_OSCSEL);
|
||||
regmap_read(slowck->regmap, AT91_PMC_SR, &status);
|
||||
|
||||
return status & AT91_PMC_OSCSEL ? 1 : 0;
|
||||
}
|
||||
|
||||
static const struct clk_ops sam9260_slow_ops = {
|
||||
@@ -397,7 +402,7 @@ static const struct clk_ops sam9260_slow_ops = {
|
||||
};
|
||||
|
||||
static struct clk * __init
|
||||
at91_clk_register_sam9260_slow(struct at91_pmc *pmc,
|
||||
at91_clk_register_sam9260_slow(struct regmap *regmap,
|
||||
const char *name,
|
||||
const char **parent_names,
|
||||
int num_parents)
|
||||
@@ -406,7 +411,7 @@ at91_clk_register_sam9260_slow(struct at91_pmc *pmc,
|
||||
struct clk *clk = NULL;
|
||||
struct clk_init_data init;
|
||||
|
||||
if (!pmc || !name)
|
||||
if (!name)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
if (!parent_names || !num_parents)
|
||||
@@ -423,7 +428,7 @@ at91_clk_register_sam9260_slow(struct at91_pmc *pmc,
|
||||
init.flags = 0;
|
||||
|
||||
slowck->hw.init = &init;
|
||||
slowck->pmc = pmc;
|
||||
slowck->regmap = regmap;
|
||||
|
||||
clk = clk_register(NULL, &slowck->hw);
|
||||
if (IS_ERR(clk))
|
||||
@@ -432,26 +437,32 @@ at91_clk_register_sam9260_slow(struct at91_pmc *pmc,
|
||||
return clk;
|
||||
}
|
||||
|
||||
void __init of_at91sam9260_clk_slow_setup(struct device_node *np,
|
||||
struct at91_pmc *pmc)
|
||||
static void __init of_at91sam9260_clk_slow_setup(struct device_node *np)
|
||||
{
|
||||
struct clk *clk;
|
||||
const char *parent_names[2];
|
||||
int num_parents;
|
||||
const char *name = np->name;
|
||||
struct regmap *regmap;
|
||||
|
||||
num_parents = of_clk_get_parent_count(np);
|
||||
if (num_parents != 2)
|
||||
return;
|
||||
|
||||
of_clk_parent_fill(np, parent_names, num_parents);
|
||||
regmap = syscon_node_to_regmap(of_get_parent(np));
|
||||
if (IS_ERR(regmap))
|
||||
return;
|
||||
|
||||
of_property_read_string(np, "clock-output-names", &name);
|
||||
|
||||
clk = at91_clk_register_sam9260_slow(pmc, name, parent_names,
|
||||
clk = at91_clk_register_sam9260_slow(regmap, name, parent_names,
|
||||
num_parents);
|
||||
if (IS_ERR(clk))
|
||||
return;
|
||||
|
||||
of_clk_add_provider(np, of_clk_src_simple_get, clk);
|
||||
}
|
||||
|
||||
CLK_OF_DECLARE(at91sam9260_clk_slow, "atmel,at91sam9260-clk-slow",
|
||||
of_at91sam9260_clk_slow_setup);
|
||||
|
Reference in New Issue
Block a user