update debug code

This commit is contained in:
黄涛 2010-04-27 12:48:00 +00:00
parent 5e623a8256
commit 1c112ca231

View File

@ -220,6 +220,7 @@ static struct clk xin24m = {
.name = "xin24m",
.rate = 24000000,
.flags = RATE_FIXED,
.gate_idx = -1,
};
static struct clk clk12m = {
@ -227,12 +228,14 @@ static struct clk clk12m = {
.rate = 12000000,
.parent = &xin24m,
.flags = RATE_FIXED,
.gate_idx = -1,
};
static struct clk extclk = {
.name = "extclk",
.rate = 27000000,
.flags = RATE_FIXED,
.gate_idx = -1,
};
static unsigned long pll_clk_recalc(struct clk *clk)
@ -252,6 +255,7 @@ static struct clk NAME##_pll_clk = { \
.parent = &xin24m, \
.pll_idx = IDX, \
.recalc = pll_clk_recalc, \
.gate_idx = -1, \
}
PLL_CLK(arm, 0);
@ -263,6 +267,7 @@ static struct clk arm_clk = {
.parent = &arm_pll_clk,
.recalc = clksel_recalc,
// .set_rate = arm_clk_set_rate,
.gate_idx = -1,
.clksel_reg = CLKSEL2_REG,
.clksel_mask = 0xF,
.clksel_maxdiv = 16,
@ -272,6 +277,7 @@ static struct clk arm_hclk = {
.name = "arm_hclk",
.parent = &arm_clk,
.recalc = clksel_recalc,
.gate_idx = -1,
.clksel_reg = CLKSEL0_REG,
.clksel_mask = 0x3,
.clksel_maxdiv = 4,
@ -280,8 +286,9 @@ static struct clk arm_hclk = {
static struct clk clk48m = {
.name = "clk48m",
.parent = &arm_clk,
.recalc = clksel_recalc,
.flags = RATE_FIXED,
.recalc = clksel_recalc,
.gate_idx = -1,
.clksel_reg = CLKSEL2_REG,
.clksel_mask = 0xF << 4,
.clksel_shift = 4,
@ -290,8 +297,10 @@ static struct clk clk48m = {
static struct clk arm_pclk = {
.name = "arm_pclk",
.parent = &arm_hclk,
.flags = ENABLE_ON_INIT,
.recalc = clksel_recalc_shift,
.set_rate = clksel_set_rate_shift,
.gate_idx = -1,
.clksel_reg = CLKSEL0_REG,
.clksel_mask = 0x3 << 2,
.clksel_shift = 2,
@ -317,6 +326,7 @@ static struct clk demod_clk = {
.recalc = clksel_recalc,
.set_rate = clksel_set_rate,
.init = demod_clk_init,
.gate_idx = -1,
.clksel_reg = CLKSEL1_REG,
.clksel_mask = 0xFF << 16,
.clksel_shift = 16,
@ -328,6 +338,7 @@ static struct clk codec_clk = {
.parent = &codec_pll_clk,
.recalc = clksel_recalc,
.set_rate = clksel_set_rate,
.gate_idx = -1,
.clksel_reg = CLKSEL1_REG,
.clksel_mask = 0x1F << 3,
.clksel_shift = 3,
@ -339,6 +350,7 @@ static struct clk lcdc_divider_clk = {
.parent = &arm_pll_clk,
.recalc = clksel_recalc,
.set_rate = clksel_set_rate,
.gate_idx = -1,
.clksel_reg = CLKSEL0_REG,
.clksel_mask = 0xFF << 8,
.clksel_shift = 8,
@ -1055,94 +1067,105 @@ void __init rk2818_clock_init(void)
clk_enable_init_clocks();
}
#if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS)
/*
* debugfs support to trace clock tree hierarchy and attributes
*/
static struct dentry *clk_debugfs_root;
#ifdef CONFIG_PROC_FS
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
static int clk_debugfs_register_one(struct clk *c)
static void dump_clock(struct seq_file *s, struct clk *clk, int deep)
{
int err;
struct dentry *d, *child;
struct clk *pa = c->parent;
char s[255];
char *p = s;
struct clk* ck;
int i;
unsigned long rate = clk->rate;
p += sprintf(p, "%s", c->name);
d = debugfs_create_dir(s, pa ? pa->dent : clk_debugfs_root);
if (!d)
return -ENOMEM;
c->dent = d;
for (i = 0; i < deep; i++)
seq_printf(s, " ");
d = debugfs_create_u8("usecount", S_IRUGO, c->dent, (u8 *)&c->usecount);
if (!d) {
err = -ENOMEM;
goto err_out;
}
d = debugfs_create_u32("rate", S_IRUGO, c->dent, (u32 *)&c->rate);
if (!d) {
err = -ENOMEM;
goto err_out;
}
d = debugfs_create_x32("flags", S_IRUGO, c->dent, (u32 *)&c->flags);
if (!d) {
err = -ENOMEM;
goto err_out;
}
return 0;
seq_printf(s, "%-9s ", clk->name);
err_out:
d = c->dent;
list_for_each_entry(child, &d->d_subdirs, d_u.d_child)
debugfs_remove(child);
debugfs_remove(c->dent);
return err;
if (clk->gate_idx < SCU_IPID_GATE_MAX) {
u32 *reg;
int idx = clk->gate_idx;
u32 v;
reg = &scu_register_base->scu_clkgate0_config;
reg += (idx >> 5);
idx &= 0x1F;
v = readl(reg) & (1 << idx);
seq_printf(s, "%s ", v ? "off" : "on ");
} else
seq_printf(s, "%s ", clk->usecount ? "on " : "off");
if (rate >= 1000000) {
if (rate % 1000000)
seq_printf(s, "%ld.%06ld MHz", rate / 1000000, rate % 1000000);
else
seq_printf(s, "%ld MHz", rate / 1000000);
} else if (rate >= 1000) {
if (rate % 1000)
seq_printf(s, "%ld.%03ld KHz", rate / 1000, rate % 1000);
else
seq_printf(s, "%ld KHz", rate / 1000);
} else {
seq_printf(s, "%ld Hz", rate);
}
seq_printf(s, " usecount = %d", clk->usecount);
seq_printf(s, " parent = %s\n", clk->parent ? clk->parent->name : "NULL");
list_for_each_entry(ck, &clocks, node) {
if (ck->parent == clk)
dump_clock(s, ck, deep + 1);
}
}
static int clk_debugfs_register(struct clk *c)
static int proc_clk_show(struct seq_file *s, void *v)
{
int err;
struct clk *pa = c->parent;
struct clk* clk;
if (pa && !pa->dent) {
err = clk_debugfs_register(pa);
if (err)
return err;
mutex_lock(&clocks_mutex);
list_for_each_entry(clk, &clocks, node) {
if (!clk->parent)
dump_clock(s, clk, 0);
}
mutex_unlock(&clocks_mutex);
seq_printf(s, "\nRegisters:\n");
seq_printf(s, "SCU_APLL_CON : 0x%08x\n", readl(&scu_register_base->scu_pll_config[0]));
seq_printf(s, "SCU_DPLL_CON : 0x%08x\n", readl(&scu_register_base->scu_pll_config[1]));
seq_printf(s, "SCU_CPLL_CON : 0x%08x\n", readl(&scu_register_base->scu_pll_config[2]));
seq_printf(s, "SCU_MODE_CON : 0x%08x\n", readl(&scu_register_base->scu_mode_config));
seq_printf(s, "SCU_PMU_CON : 0x%08x\n", readl(&scu_register_base->scu_pmu_config));
seq_printf(s, "SCU_CLKSEL0_CON : 0x%08x\n", readl(&scu_register_base->scu_clksel0_config));
seq_printf(s, "SCU_CLKSEL1_CON : 0x%08x\n", readl(&scu_register_base->scu_clksel1_config));
seq_printf(s, "SCU_CLKGATE0_CON : 0x%08x\n", readl(&scu_register_base->scu_clkgate0_config));
seq_printf(s, "SCU_CLKGATE1_CON : 0x%08x\n", readl(&scu_register_base->scu_clkgate1_config));
seq_printf(s, "SCU_CLKGATE2_CON : 0x%08x\n", readl(&scu_register_base->scu_clkgate2_config));
seq_printf(s, "SCU_CLKSEL2_CON : 0x%08x\n", readl(&scu_register_base->scu_clksel2_config));
if (!c->dent) {
err = clk_debugfs_register_one(c);
if (err)
return err;
}
return 0;
}
static int __init clk_debugfs_init(void)
static int proc_clk_open(struct inode *inode, struct file *file)
{
struct clk *c;
struct dentry *d;
int err;
d = debugfs_create_dir("clock", NULL);
if (!d)
return -ENOMEM;
clk_debugfs_root = d;
list_for_each_entry(c, &clocks, node) {
err = clk_debugfs_register(c);
if (err)
goto err_out;
}
return 0;
err_out:
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
debugfs_remove_recursive(clk_debugfs_root);
#endif
return err;
return single_open(file, proc_clk_show, NULL);
}
late_initcall(clk_debugfs_init);
#endif /* defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) */
static const struct file_operations proc_clk_fops = {
.open = proc_clk_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};
static int __init clk_proc_init(void)
{
proc_create("clocks", 0, NULL, &proc_clk_fops);
return 0;
}
late_initcall(clk_proc_init);
#endif /* CONFIG_PROC_FS */