summaryrefslogtreecommitdiff
path: root/arch/arm/mach-ns9xxx/processor-ns9360.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-ns9xxx/processor-ns9360.c')
-rw-r--r--arch/arm/mach-ns9xxx/processor-ns9360.c75
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();
+}