Commit d5ff89a8 authored by Peter De Schrijver's avatar Peter De Schrijver

clk: tegra: simplify periph clock data

This patch determines the register bank for clock enable/disable and reset
based on the clock ID instead of hardcoding it in the tables describing the
clocks. This results in less data to be maintained in the tables, making the
code easier to understand. The full benefit of the change will be realized once
also other clocktypes will be table based.
Signed-off-by: default avatarPeter De Schrijver <pdeschrijver@nvidia.com>
parent 00c674e4
...@@ -151,12 +151,16 @@ const struct clk_ops tegra_clk_periph_gate_ops = { ...@@ -151,12 +151,16 @@ const struct clk_ops tegra_clk_periph_gate_ops = {
struct clk *tegra_clk_register_periph_gate(const char *name, struct clk *tegra_clk_register_periph_gate(const char *name,
const char *parent_name, u8 gate_flags, void __iomem *clk_base, const char *parent_name, u8 gate_flags, void __iomem *clk_base,
unsigned long flags, int clk_num, unsigned long flags, int clk_num, int *enable_refcnt)
struct tegra_clk_periph_regs *pregs, int *enable_refcnt)
{ {
struct tegra_clk_periph_gate *gate; struct tegra_clk_periph_gate *gate;
struct clk *clk; struct clk *clk;
struct clk_init_data init; struct clk_init_data init;
struct tegra_clk_periph_regs *pregs;
pregs = get_reg_bank(clk_num);
if (!pregs)
return ERR_PTR(-EINVAL);
gate = kzalloc(sizeof(*gate), GFP_KERNEL); gate = kzalloc(sizeof(*gate), GFP_KERNEL);
if (!gate) { if (!gate) {
......
...@@ -178,6 +178,7 @@ static struct clk *_tegra_clk_register_periph(const char *name, ...@@ -178,6 +178,7 @@ static struct clk *_tegra_clk_register_periph(const char *name,
{ {
struct clk *clk; struct clk *clk;
struct clk_init_data init; struct clk_init_data init;
struct tegra_clk_periph_regs *bank;
init.name = name; init.name = name;
init.ops = div ? &tegra_clk_periph_ops : &tegra_clk_periph_nodiv_ops; init.ops = div ? &tegra_clk_periph_ops : &tegra_clk_periph_nodiv_ops;
...@@ -185,12 +186,17 @@ static struct clk *_tegra_clk_register_periph(const char *name, ...@@ -185,12 +186,17 @@ static struct clk *_tegra_clk_register_periph(const char *name,
init.parent_names = parent_names; init.parent_names = parent_names;
init.num_parents = num_parents; init.num_parents = num_parents;
bank = get_reg_bank(periph->gate.clk_num);
if (!bank)
return ERR_PTR(-EINVAL);
/* Data in .init is copied by clk_register(), so stack variable OK */ /* Data in .init is copied by clk_register(), so stack variable OK */
periph->hw.init = &init; periph->hw.init = &init;
periph->magic = TEGRA_CLK_PERIPH_MAGIC; periph->magic = TEGRA_CLK_PERIPH_MAGIC;
periph->mux.reg = clk_base + offset; periph->mux.reg = clk_base + offset;
periph->divider.reg = div ? (clk_base + offset) : NULL; periph->divider.reg = div ? (clk_base + offset) : NULL;
periph->gate.clk_base = clk_base; periph->gate.clk_base = clk_base;
periph->gate.regs = bank;
clk = clk_register(NULL, &periph->hw); clk = clk_register(NULL, &periph->hw);
if (IS_ERR(clk)) if (IS_ERR(clk))
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -21,10 +21,114 @@ ...@@ -21,10 +21,114 @@
#include "clk.h" #include "clk.h"
#define CLK_OUT_ENB_L 0x010
#define CLK_OUT_ENB_H 0x014
#define CLK_OUT_ENB_U 0x018
#define CLK_OUT_ENB_V 0x360
#define CLK_OUT_ENB_W 0x364
#define CLK_OUT_ENB_X 0x280
#define CLK_OUT_ENB_SET_L 0x320
#define CLK_OUT_ENB_CLR_L 0x324
#define CLK_OUT_ENB_SET_H 0x328
#define CLK_OUT_ENB_CLR_H 0x32c
#define CLK_OUT_ENB_SET_U 0x330
#define CLK_OUT_ENB_CLR_U 0x334
#define CLK_OUT_ENB_SET_V 0x440
#define CLK_OUT_ENB_CLR_V 0x444
#define CLK_OUT_ENB_SET_W 0x448
#define CLK_OUT_ENB_CLR_W 0x44c
#define CLK_OUT_ENB_SET_X 0x284
#define CLK_OUT_ENB_CLR_X 0x288
#define RST_DEVICES_L 0x004
#define RST_DEVICES_H 0x008
#define RST_DEVICES_U 0x00C
#define RST_DFLL_DVCO 0x2F4
#define RST_DEVICES_V 0x358
#define RST_DEVICES_W 0x35C
#define RST_DEVICES_X 0x28C
#define RST_DEVICES_SET_L 0x300
#define RST_DEVICES_CLR_L 0x304
#define RST_DEVICES_SET_H 0x308
#define RST_DEVICES_CLR_H 0x30c
#define RST_DEVICES_SET_U 0x310
#define RST_DEVICES_CLR_U 0x314
#define RST_DEVICES_SET_V 0x430
#define RST_DEVICES_CLR_V 0x434
#define RST_DEVICES_SET_W 0x438
#define RST_DEVICES_CLR_W 0x43c
/* Global data of Tegra CPU CAR ops */ /* Global data of Tegra CPU CAR ops */
static struct tegra_cpu_car_ops dummy_car_ops; static struct tegra_cpu_car_ops dummy_car_ops;
struct tegra_cpu_car_ops *tegra_cpu_car_ops = &dummy_car_ops; struct tegra_cpu_car_ops *tegra_cpu_car_ops = &dummy_car_ops;
static int periph_banks;
static struct tegra_clk_periph_regs periph_regs[] = {
[0] = {
.enb_reg = CLK_OUT_ENB_L,
.enb_set_reg = CLK_OUT_ENB_SET_L,
.enb_clr_reg = CLK_OUT_ENB_CLR_L,
.rst_reg = RST_DEVICES_L,
.rst_set_reg = RST_DEVICES_SET_L,
.rst_clr_reg = RST_DEVICES_CLR_L,
},
[1] = {
.enb_reg = CLK_OUT_ENB_H,
.enb_set_reg = CLK_OUT_ENB_SET_H,
.enb_clr_reg = CLK_OUT_ENB_CLR_H,
.rst_reg = RST_DEVICES_H,
.rst_set_reg = RST_DEVICES_SET_H,
.rst_clr_reg = RST_DEVICES_CLR_H,
},
[2] = {
.enb_reg = CLK_OUT_ENB_U,
.enb_set_reg = CLK_OUT_ENB_SET_U,
.enb_clr_reg = CLK_OUT_ENB_CLR_U,
.rst_reg = RST_DEVICES_U,
.rst_set_reg = RST_DEVICES_SET_U,
.rst_clr_reg = RST_DEVICES_CLR_U,
},
[3] = {
.enb_reg = CLK_OUT_ENB_V,
.enb_set_reg = CLK_OUT_ENB_SET_V,
.enb_clr_reg = CLK_OUT_ENB_CLR_V,
.rst_reg = RST_DEVICES_V,
.rst_set_reg = RST_DEVICES_SET_V,
.rst_clr_reg = RST_DEVICES_CLR_V,
},
[4] = {
.enb_reg = CLK_OUT_ENB_W,
.enb_set_reg = CLK_OUT_ENB_SET_W,
.enb_clr_reg = CLK_OUT_ENB_CLR_W,
.rst_reg = RST_DEVICES_W,
.rst_set_reg = RST_DEVICES_SET_W,
.rst_clr_reg = RST_DEVICES_CLR_W,
},
};
struct tegra_clk_periph_regs *get_reg_bank(int clkid)
{
int reg_bank = clkid / 32;
if (reg_bank < periph_banks)
return &periph_regs[reg_bank];
else {
WARN_ON(1);
return NULL;
}
}
int __init tegra_clk_set_periph_banks(int num)
{
if (num > ARRAY_SIZE(periph_regs))
return -EINVAL;
periph_banks = num;
return 0;
}
void __init tegra_init_dup_clks(struct tegra_clk_duplicate *dup_list, void __init tegra_init_dup_clks(struct tegra_clk_duplicate *dup_list,
struct clk *clks[], int clk_max) struct clk *clks[], int clk_max)
{ {
......
...@@ -400,8 +400,7 @@ void tegra_periph_reset(struct tegra_clk_periph_gate *gate, bool assert); ...@@ -400,8 +400,7 @@ void tegra_periph_reset(struct tegra_clk_periph_gate *gate, bool assert);
extern const struct clk_ops tegra_clk_periph_gate_ops; extern const struct clk_ops tegra_clk_periph_gate_ops;
struct clk *tegra_clk_register_periph_gate(const char *name, struct clk *tegra_clk_register_periph_gate(const char *name,
const char *parent_name, u8 gate_flags, void __iomem *clk_base, const char *parent_name, u8 gate_flags, void __iomem *clk_base,
unsigned long flags, int clk_num, unsigned long flags, int clk_num, int *enable_refcnt);
struct tegra_clk_periph_regs *pregs, int *enable_refcnt);
/** /**
* struct clk-periph - peripheral clock * struct clk-periph - peripheral clock
...@@ -443,7 +442,7 @@ struct clk *tegra_clk_register_periph_nodiv(const char *name, ...@@ -443,7 +442,7 @@ struct clk *tegra_clk_register_periph_nodiv(const char *name,
#define TEGRA_CLK_PERIPH(_mux_shift, _mux_mask, _mux_flags, \ #define TEGRA_CLK_PERIPH(_mux_shift, _mux_mask, _mux_flags, \
_div_shift, _div_width, _div_frac_width, \ _div_shift, _div_width, _div_frac_width, \
_div_flags, _clk_num, _enb_refcnt, _regs, \ _div_flags, _clk_num, _enb_refcnt, \
_gate_flags, _table) \ _gate_flags, _table) \
{ \ { \
.mux = { \ .mux = { \
...@@ -462,7 +461,6 @@ struct clk *tegra_clk_register_periph_nodiv(const char *name, ...@@ -462,7 +461,6 @@ struct clk *tegra_clk_register_periph_nodiv(const char *name,
.flags = _gate_flags, \ .flags = _gate_flags, \
.clk_num = _clk_num, \ .clk_num = _clk_num, \
.enable_refcnt = _enb_refcnt, \ .enable_refcnt = _enb_refcnt, \
.regs = _regs, \
}, \ }, \
.mux_ops = &clk_mux_ops, \ .mux_ops = &clk_mux_ops, \
.div_ops = &tegra_clk_frac_div_ops, \ .div_ops = &tegra_clk_frac_div_ops, \
...@@ -483,7 +481,7 @@ struct tegra_periph_init_data { ...@@ -483,7 +481,7 @@ struct tegra_periph_init_data {
#define TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parent_names, _offset,\ #define TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parent_names, _offset,\
_mux_shift, _mux_mask, _mux_flags, _div_shift, \ _mux_shift, _mux_mask, _mux_flags, _div_shift, \
_div_width, _div_frac_width, _div_flags, _regs, \ _div_width, _div_frac_width, _div_flags, \
_clk_num, _enb_refcnt, _gate_flags, _clk_id, _table,\ _clk_num, _enb_refcnt, _gate_flags, _clk_id, _table,\
_flags) \ _flags) \
{ \ { \
...@@ -495,7 +493,7 @@ struct tegra_periph_init_data { ...@@ -495,7 +493,7 @@ struct tegra_periph_init_data {
_mux_flags, _div_shift, \ _mux_flags, _div_shift, \
_div_width, _div_frac_width, \ _div_width, _div_frac_width, \
_div_flags, _clk_num, \ _div_flags, _clk_num, \
_enb_refcnt, _regs, \ _enb_refcnt, \
_gate_flags, _table), \ _gate_flags, _table), \
.offset = _offset, \ .offset = _offset, \
.con_id = _con_id, \ .con_id = _con_id, \
...@@ -505,12 +503,12 @@ struct tegra_periph_init_data { ...@@ -505,12 +503,12 @@ struct tegra_periph_init_data {
#define TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parent_names, _offset,\ #define TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parent_names, _offset,\
_mux_shift, _mux_width, _mux_flags, _div_shift, \ _mux_shift, _mux_width, _mux_flags, _div_shift, \
_div_width, _div_frac_width, _div_flags, _regs, \ _div_width, _div_frac_width, _div_flags, \
_clk_num, _enb_refcnt, _gate_flags, _clk_id) \ _clk_num, _enb_refcnt, _gate_flags, _clk_id) \
TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parent_names, _offset,\ TEGRA_INIT_DATA_TABLE(_name, _con_id, _dev_id, _parent_names, _offset,\
_mux_shift, BIT(_mux_width) - 1, _mux_flags, \ _mux_shift, BIT(_mux_width) - 1, _mux_flags, \
_div_shift, _div_width, _div_frac_width, _div_flags, \ _div_shift, _div_width, _div_frac_width, _div_flags, \
_regs, _clk_num, _enb_refcnt, _gate_flags, _clk_id,\ _clk_num, _enb_refcnt, _gate_flags, _clk_id,\
NULL, 0) NULL, 0)
/** /**
...@@ -587,6 +585,9 @@ void tegra_init_from_table(struct tegra_clk_init_table *tbl, ...@@ -587,6 +585,9 @@ void tegra_init_from_table(struct tegra_clk_init_table *tbl,
void tegra_init_dup_clks(struct tegra_clk_duplicate *dup_list, void tegra_init_dup_clks(struct tegra_clk_duplicate *dup_list,
struct clk *clks[], int clk_max); struct clk *clks[], int clk_max);
struct tegra_clk_periph_regs *get_reg_bank(int clkid);
int tegra_clk_set_periph_banks(int num);
void tegra114_clock_tune_cpu_trimmers_high(void); void tegra114_clock_tune_cpu_trimmers_high(void);
void tegra114_clock_tune_cpu_trimmers_low(void); void tegra114_clock_tune_cpu_trimmers_low(void);
void tegra114_clock_tune_cpu_trimmers_init(void); void tegra114_clock_tune_cpu_trimmers_init(void);
......
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