diff options
Diffstat (limited to 'arch/arm/mach-ns9xxx/processor-ns9360.c')
-rw-r--r-- | arch/arm/mach-ns9xxx/processor-ns9360.c | 75 |
1 files changed, 73 insertions, 2 deletions
diff --git a/arch/arm/mach-ns9xxx/processor-ns9360.c b/arch/arm/mach-ns9xxx/processor-ns9360.c index abee8338735d..ca9475ed1b62 100644 --- a/arch/arm/mach-ns9xxx/processor-ns9360.c +++ b/arch/arm/mach-ns9xxx/processor-ns9360.c @@ -1,7 +1,7 @@ /* * arch/arm/mach-ns9xxx/processor-ns9360.c * - * Copyright (C) 2007 by Digi International Inc. + * Copyright (C) 2007,2008 by Digi International Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify it @@ -14,9 +14,14 @@ #include <asm/page.h> #include <asm/mach/map.h> -#include <mach/processor-ns9360.h> + #include <mach/regs-sys-ns9360.h> +#include "clock.h" + +#include "processor-ns9360.h" +#include "gpiolib-ns9360.h" + void ns9360_reset(char mode) { u32 reg; @@ -34,6 +39,36 @@ unsigned long ns9360_systemclock(void) >> REGGETIM(pll, SYS_PLL, FS); } +unsigned long ns9360_cpuclock(void) +{ + return ns9360_systemclock() / 2; +} + +unsigned long ns9360_ahbclock(void) +{ + return ns9360_systemclock() / 4; +} + +static unsigned long ns9360_get_systemclock_rate(struct clk *clk) +{ + return ns9360_systemclock(); +} + +static unsigned long ns9360_get_bbusclock_rate(struct clk *clk) +{ + return ns9360_systemclock() / 8; +} + +static unsigned long ns9360_get_cpuclock_rate(struct clk *clk) +{ + return ns9360_cpuclock(); +} + +static unsigned long ns9360_get_ahbclock_rate(struct clk *clk) +{ + return ns9360_ahbclock(); +} + static struct map_desc ns9360_io_desc[] __initdata = { { /* BBus */ .virtual = io_p2v(0x90000000), @@ -52,3 +87,39 @@ void __init ns9360_map_io(void) { iotable_init(ns9360_io_desc, ARRAY_SIZE(ns9360_io_desc)); } + +void ns9360_init_machine(void) +{ + /* register system, bbus and cpu clocks */ + struct clk *clk = kzalloc(4 * sizeof(*clk), GFP_KERNEL); + int ret, i; + + if (!clk) { + pr_warning("%s: could not register system clocks\n", __func__); + return; + } + + clk[0].name = "systemclock"; + clk[0].get_rate = ns9360_get_systemclock_rate; + + clk[1].name = "bbusclock"; + clk[1].get_rate = ns9360_get_bbusclock_rate; + + clk[2].name = "cpuclock"; + clk[2].get_rate = ns9360_get_cpuclock_rate; + + clk[3].name = "ahbclock"; + clk[3].get_rate = ns9360_get_ahbclock_rate; + + for (i = 0; i < 4; ++i) { + clk[i].id = -1; + ret = clk_register(&clk[i]); + if (ret) + pr_warning("%s: could not register %s\n", + __func__, clk[i].name); + + } + + /* add system GPIOs */ + ns9360_gpio_init(); +} |