Signed-off-by: Jason Cooper <u-b...@lakedaemon.net>
---
 common/fdt_decode.c  |    1 +
 drivers/rtc/mvrtc.c  |   62 +++++++++++++++++++++++++++++++++++++++++++++++--
 drivers/rtc/mvrtc.h  |    7 +++++
 include/fdt_decode.h |    1 +
 4 files changed, 68 insertions(+), 3 deletions(-)

diff --git a/common/fdt_decode.c b/common/fdt_decode.c
index 0f13089..1a0dcf4 100644
--- a/common/fdt_decode.c
+++ b/common/fdt_decode.c
@@ -34,6 +34,7 @@
  */
 #define COMPAT(id, name) name
 const char *compat_names[COMPAT_COUNT] = {
+       COMPAT(MARVELL_KIRKWOOD_RTC, "marvell,kirkwood-rtc"),
 };
 
 /**
diff --git a/drivers/rtc/mvrtc.c b/drivers/rtc/mvrtc.c
index ccc573a..ce2dc3d 100644
--- a/drivers/rtc/mvrtc.c
+++ b/drivers/rtc/mvrtc.c
@@ -28,18 +28,62 @@
 #include <common.h>
 #include <command.h>
 #include <rtc.h>
+#ifdef CONFIG_OF_CONTROL
+#include <fdt_decode.h>
+#endif
 #include "mvrtc.h"
 
+DECLARE_GLOBAL_DATA_PTR;
+
 /* This RTC does not support century, so we assume 20 */
 #define CENTURY 20
 
+#ifndef CONFIG_OF_CONTROL
+struct mvrtc_registers *mvrtc_get_config(void) {
+       return (struct mvrtc_registers *)KW_RTC_BASE;
+}
+
+#else
+int fdt_decode_rtc(const void *blob, int node, struct fdt_rtc *config)
+{
+       config->reg = get_addr(blob, node, "reg");
+       config->enabled = get_is_enabled(blob, node, 0);
+
+       return 0;
+}
+
+struct mvrtc_registers *mvrtc_get_config(void) {
+       const void     *blob = gd->blob;
+       struct fdt_rtc config;
+       int            node;
+       int            index=0;
+
+       node = fdt_decode_next_alias(blob, "rtc",
+                                    COMPAT_MARVELL_KIRKWOOD_RTC, &index);
+
+       if (node < 0)
+               return NULL;
+
+       if (fdt_decode_rtc(blob, node, &config))
+               return NULL;
+
+       return config.enabled ? (struct mvrtc_registers *)config.reg : NULL;
+}
+#endif
+
 int rtc_get(struct rtc_time *t)
 {
        u32 time;
        u32 date;
        struct mvrtc_registers *mvrtc_regs;
 
-       mvrtc_regs = (struct mvrtc_registers *)KW_RTC_BASE;
+       mvrtc_regs = mvrtc_get_config();
+#ifdef CONFIG_OF_CONTROL
+       if (mvrtc_regs == NULL) {
+               printf("Error decoding fdt for mvrtc.\n");
+               return -1;
+       }
+#endif
 
        /* read the time register */
        time = readl(&mvrtc_regs->time);
@@ -79,7 +123,13 @@ int rtc_set(struct rtc_time *t)
        u32 date = 0;
        struct mvrtc_registers *mvrtc_regs;
 
-       mvrtc_regs = (struct mvrtc_registers *)KW_RTC_BASE;
+       mvrtc_regs = mvrtc_get_config();
+#ifdef CONFIG_OF_CONTROL
+       if (mvrtc_regs == NULL) {
+               printf("Error decoding fdt for mvrtc.\n");
+               return -1;
+       }
+#endif
 
        /* check that this code isn't 80+ years old ;-) */
        if ((t->tm_year / 100) != CENTURY)
@@ -111,7 +161,13 @@ void rtc_reset(void)
        u32 sec;
        struct mvrtc_registers *mvrtc_regs;
 
-       mvrtc_regs = (struct mvrtc_registers *)KW_RTC_BASE;
+       mvrtc_regs = mvrtc_get_config();
+#ifdef CONFIG_OF_CONTROL
+       if (mvrtc_regs == NULL) {
+               printf("Error decoding fdt for mvrtc.\n");
+               return;
+       }
+#endif
 
        /* no init routine for this RTC needed, just check that it's working */
        time = readl(&mvrtc_regs->time);
diff --git a/drivers/rtc/mvrtc.h b/drivers/rtc/mvrtc.h
index b9d5c6f..56b09f2 100644
--- a/drivers/rtc/mvrtc.h
+++ b/drivers/rtc/mvrtc.h
@@ -37,6 +37,13 @@ struct mvrtc_registers {
        u32 date;
 };
 
+#ifdef CONFIG_OF_CONTROL
+struct fdt_rtc {
+       addr_t reg;  /* address of the registers */
+       int enabled; /* 1 if enabled, 0 if disabled */
+};
+#endif
+
 /* time register */
 #define MVRTC_SEC_SFT          0
 #define MVRTC_SEC_MSK          0x7f
diff --git a/include/fdt_decode.h b/include/fdt_decode.h
index 4264e3b..f236643 100644
--- a/include/fdt_decode.h
+++ b/include/fdt_decode.h
@@ -54,6 +54,7 @@ struct fdt_memory {
  */
 enum fdt_compat_id {
        COMPAT_UNKNOWN,
+       COMPAT_MARVELL_KIRKWOOD_RTC,
        COMPAT_COUNT,
 };
 
-- 
1.7.0.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to