nand: fsl_upm: convert to updated MTD NAND infrastructure
[oweals/u-boot.git] / drivers / rtc / mc13783-rtc.c
index 35b1b8b254dd218ab6c7b93abe71ace1b12cc242..b6e15014bb68e67f22c2e1b3340a7a23f5ed5ed6 100644 (file)
 #include <rtc.h>
 #include <spi.h>
 
+static struct spi_slave *slave;
+
 int rtc_get(struct rtc_time *rtc)
 {
        u32 day1, day2, time;
        u32 reg;
        int err, tim, i = 0;
 
-       spi_select(1, 0, SPI_MODE_2 | SPI_CS_HIGH);
+       if (!slave) {
+               /* FIXME: Verify the max SCK rate */
+               slave = spi_setup_slave(1, 0, 1000000,
+                               SPI_MODE_2 | SPI_CS_HIGH);
+               if (!slave)
+                       return -1;
+       }
+
+       if (spi_claim_bus(slave))
+               return -1;
 
        do {
                reg = 0x2c000000;
-               err = spi_xfer(0, 32, (uchar *)&reg, (uchar *)&day1);
+               err = spi_xfer(slave, 32, (uchar *)&reg, (uchar *)&day1,
+                               SPI_XFER_BEGIN | SPI_XFER_END);
 
                if (err)
                        return err;
 
                reg = 0x28000000;
-               err = spi_xfer(0, 32, (uchar *)&reg, (uchar *)&time);
+               err = spi_xfer(slave, 32, (uchar *)&reg, (uchar *)&time,
+                               SPI_XFER_BEGIN | SPI_XFER_END);
 
                if (err)
                        return err;
 
                reg = 0x2c000000;
-               err = spi_xfer(0, 32, (uchar *)&reg, (uchar *)&day2);
+               err = spi_xfer(slave, 32, (uchar *)&reg, (uchar *)&day2,
+                               SPI_XFER_BEGIN | SPI_XFER_END);
 
                if (err)
                        return err;
        } while (day1 != day2 && i++ < 3);
 
+       spi_release_bus(slave);
+
        tim = day1 * 86400 + time;
        to_tm(tim, rtc);
 
@@ -65,16 +81,31 @@ void rtc_set(struct rtc_time *rtc)
 {
        u32 time, day, reg;
 
+       if (!slave) {
+               /* FIXME: Verify the max SCK rate */
+               slave = spi_setup_slave(1, 0, 1000000,
+                               SPI_MODE_2 | SPI_CS_HIGH);
+               if (!slave)
+                       return;
+       }
+
        time = mktime(rtc->tm_year, rtc->tm_mon, rtc->tm_mday,
                      rtc->tm_hour, rtc->tm_min, rtc->tm_sec);
        day = time / 86400;
        time %= 86400;
 
+       if (spi_claim_bus(slave))
+               return;
+
        reg = 0x2c000000 | day | 0x80000000;
-       spi_xfer(0, 32, (uchar *)&reg, (uchar *)&day);
+       spi_xfer(slave, 32, (uchar *)&reg, (uchar *)&day,
+                       SPI_XFER_BEGIN | SPI_XFER_END);
 
        reg = 0x28000000 | time | 0x80000000;
-       spi_xfer(0, 32, (uchar *)&reg, (uchar *)&time);
+       spi_xfer(slave, 32, (uchar *)&reg, (uchar *)&time,
+                       SPI_XFER_BEGIN | SPI_XFER_END);
+
+       spi_release_bus(slave);
 }
 
 void rtc_reset(void)