]> git.sur5r.net Git - u-boot/blobdiff - drivers/rtc/ds1306.c
board/flagadm/flash.c: fix compile warning
[u-boot] / drivers / rtc / ds1306.c
index 89e433dabd8894cddece689ebb84c0cd31e33a6d..288c5f8c4acbf881730ecf4d5342fec384bcd100 100644 (file)
@@ -36,7 +36,7 @@
 #include <rtc.h>
 #include <spi.h>
 
-#if defined(CONFIG_RTC_DS1306) && defined(CONFIG_CMD_DATE)
+#if defined(CONFIG_CMD_DATE)
 
 #define        RTC_SECONDS             0x00
 #define        RTC_MINUTES             0x01
 
 #define        RTC_USER_RAM_BASE       0x20
 
-/*
- * External table of chip select functions (see the appropriate board
- * support for the actual definition of the table).
- */
-extern spi_chipsel_type spi_chipsel[];
-extern int spi_chipsel_cnt;
-
-static unsigned int bin2bcd (unsigned int n);
-static unsigned char bcd2bin (unsigned char c);
-
 /* ************************************************************************* */
 #ifdef CONFIG_SXNI855T         /* !!! SHOULD BE CHANGED TO NEW CODE !!! */
 
@@ -91,9 +81,9 @@ static void init_spi (void);
 /* ------------------------------------------------------------------------- */
 
 /* read clock time from DS1306 and return it in *tmp */
-void rtc_get (struct rtc_time *tmp)
+int rtc_get (struct rtc_time *tmp)
 {
-       volatile immap_t *immap = (immap_t *) CFG_IMMR;
+       volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
        unsigned char spi_byte; /* Data Byte */
 
        init_spi ();            /* set port B for software SPI */
@@ -141,14 +131,16 @@ void rtc_get (struct rtc_time *tmp)
        debug ("Get DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",
               tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
               tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
+
+       return 0;
 }
 
 /* ------------------------------------------------------------------------- */
 
 /* set clock time in DS1306 RTC and in MPC8xx RTC */
-void rtc_set (struct rtc_time *tmp)
+int rtc_set (struct rtc_time *tmp)
 {
-       volatile immap_t *immap = (immap_t *) CFG_IMMR;
+       volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
 
        init_spi ();            /* set port B for software SPI */
 
@@ -214,6 +206,8 @@ void rtc_set (struct rtc_time *tmp)
        debug ("Set DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",
               tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
               tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
+
+       return 0;
 }
 
 /* ------------------------------------------------------------------------- */
@@ -221,7 +215,7 @@ void rtc_set (struct rtc_time *tmp)
 /* Initialize Port B for software SPI */
 static void init_spi (void)
 {
-       volatile immap_t *immap = (immap_t *) CFG_IMMR;
+       volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
 
        /* Force output pins to begin at logic 0 */
        immap->im_cpm.cp_pbdat &= ~(PB_SPI_CE | PB_SPIMOSI | PB_SPISCK);
@@ -238,7 +232,7 @@ static void init_spi (void)
 /* NOTE: soft_spi_send() assumes that the I/O lines are configured already */
 static void soft_spi_send (unsigned char n)
 {
-       volatile immap_t *immap = (immap_t *) CFG_IMMR;
+       volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
        unsigned char bitpos;   /* bit position to receive */
        unsigned char i;        /* Loop Control */
 
@@ -267,7 +261,7 @@ static void soft_spi_send (unsigned char n)
 /* NOTE: soft_spi_read() assumes that the I/O lines are configured already */
 static unsigned char soft_spi_read (void)
 {
-       volatile immap_t *immap = (immap_t *) CFG_IMMR;
+       volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
 
        unsigned char spi_byte = 0;     /* Return value, assume success */
        unsigned char bitpos;   /* bit position to receive */
@@ -303,11 +297,29 @@ void rtc_reset (void)
 static unsigned char rtc_read (unsigned char reg);
 static void rtc_write (unsigned char reg, unsigned char val);
 
+static struct spi_slave *slave;
+
 /* read clock time from DS1306 and return it in *tmp */
-void rtc_get (struct rtc_time *tmp)
+int rtc_get (struct rtc_time *tmp)
 {
        unsigned char sec, min, hour, mday, wday, mon, year;
 
+       /*
+        * Assuming Vcc = 2.0V (lowest speed)
+        *
+        * REVISIT: If we add an rtc_init() function we can do this
+        * step just once.
+        */
+       if (!slave) {
+               slave = spi_setup_slave(0, CONFIG_SYS_SPI_RTC_DEVID, 600000,
+                               SPI_MODE_3 | SPI_CS_HIGH);
+               if (!slave)
+                       return;
+       }
+
+       if (spi_claim_bus(slave))
+               return;
+
        sec = rtc_read (RTC_SECONDS);
        min = rtc_read (RTC_MINUTES);
        hour = rtc_read (RTC_HOURS);
@@ -316,6 +328,8 @@ void rtc_get (struct rtc_time *tmp)
        mon = rtc_read (RTC_MONTH);
        year = rtc_read (RTC_YEAR);
 
+       spi_release_bus(slave);
+
        debug ("Get RTC year: %02x mon: %02x mday: %02x wday: %02x "
               "hr: %02x min: %02x sec: %02x\n",
               year, mon, mday, wday, hour, min, sec);
@@ -349,13 +363,26 @@ void rtc_get (struct rtc_time *tmp)
        debug ("Get DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",
               tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
               tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
+
+       return 0;
 }
 
 /* ------------------------------------------------------------------------- */
 
 /* set clock time from *tmp in DS1306 RTC */
-void rtc_set (struct rtc_time *tmp)
+int rtc_set (struct rtc_time *tmp)
 {
+       /* Assuming Vcc = 2.0V (lowest speed) */
+       if (!slave) {
+               slave = spi_setup_slave(0, CONFIG_SYS_SPI_RTC_DEVID, 600000,
+                               SPI_MODE_3 | SPI_CS_HIGH);
+               if (!slave)
+                       return;
+       }
+
+       if (spi_claim_bus(slave))
+               return;
+
        debug ("Set DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",
               tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
               tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
@@ -367,6 +394,8 @@ void rtc_set (struct rtc_time *tmp)
        rtc_write (RTC_DATE_OF_MONTH, bin2bcd (tmp->tm_mday));
        rtc_write (RTC_MONTH, bin2bcd (tmp->tm_mon));
        rtc_write (RTC_YEAR, bin2bcd (tmp->tm_year - 2000));
+
+       spi_release_bus(slave);
 }
 
 /* ------------------------------------------------------------------------- */
@@ -374,6 +403,17 @@ void rtc_set (struct rtc_time *tmp)
 /* reset the DS1306 */
 void rtc_reset (void)
 {
+       /* Assuming Vcc = 2.0V (lowest speed) */
+       if (!slave) {
+               slave = spi_setup_slave(0, CONFIG_SYS_SPI_RTC_DEVID, 600000,
+                               SPI_MODE_3 | SPI_CS_HIGH);
+               if (!slave)
+                       return;
+       }
+
+       if (spi_claim_bus(slave))
+               return;
+
        /* clear the control register */
        rtc_write (RTC_CONTROL, 0x00);  /* 1st step: reset WP */
        rtc_write (RTC_CONTROL, 0x00);  /* 2nd step: reset 1Hz, AIE1, AIE0 */
@@ -387,22 +427,18 @@ void rtc_reset (void)
        rtc_write (RTC_HOURS_ALARM1, 0x00);
        rtc_write (RTC_DAY_OF_WEEK_ALARM0, 0x00);
        rtc_write (RTC_DAY_OF_WEEK_ALARM1, 0x00);
+
+       spi_release_bus(slave);
 }
 
 /* ------------------------------------------------------------------------- */
 
 static unsigned char rtc_read (unsigned char reg)
 {
-       unsigned char dout[2];  /* SPI Output Data Bytes */
-       unsigned char din[2];   /* SPI Input Data Bytes */
-
-       dout[0] = reg;
+       int ret;
 
-       if (spi_xfer (spi_chipsel[CFG_SPI_RTC_DEVID], 16, dout, din) != 0) {
-               return 0;
-       } else {
-               return din[1];
-       }
+       ret = spi_w8r8(slave, reg);
+       return ret < 0 ? 0 : ret;
 }
 
 /* ------------------------------------------------------------------------- */
@@ -415,24 +451,9 @@ static void rtc_write (unsigned char reg, unsigned char val)
        dout[0] = 0x80 | reg;
        dout[1] = val;
 
-       spi_xfer (spi_chipsel[CFG_SPI_RTC_DEVID], 16, dout, din);
+       spi_xfer (slave, 16, dout, din, SPI_XFER_BEGIN | SPI_XFER_END);
 }
 
 #endif /* end of code exclusion (see #ifdef CONFIG_SXNI855T above) */
 
-/* ------------------------------------------------------------------------- */
-
-static unsigned char bcd2bin (unsigned char n)
-{
-       return ((((n >> 4) & 0x0F) * 10) + (n & 0x0F));
-}
-
-/* ------------------------------------------------------------------------- */
-
-static unsigned int bin2bcd (unsigned int n)
-{
-       return (((n / 10) << 4) | (n % 10));
-}
-/* ------------------------------------------------------------------------- */
-
 #endif