diff options
Diffstat (limited to 'drivers/rtc/mc13783-rtc.c')
| -rw-r--r-- | drivers/rtc/mc13783-rtc.c | 43 | 
1 files changed, 37 insertions, 6 deletions
| diff --git a/drivers/rtc/mc13783-rtc.c b/drivers/rtc/mc13783-rtc.c index 35b1b8b25..b6e15014b 100644 --- a/drivers/rtc/mc13783-rtc.c +++ b/drivers/rtc/mc13783-rtc.c @@ -24,34 +24,50 @@  #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 *)®, (uchar *)&day1); +		err = spi_xfer(slave, 32, (uchar *)®, (uchar *)&day1, +				SPI_XFER_BEGIN | SPI_XFER_END);  		if (err)  			return err;  		reg = 0x28000000; -		err = spi_xfer(0, 32, (uchar *)®, (uchar *)&time); +		err = spi_xfer(slave, 32, (uchar *)®, (uchar *)&time, +				SPI_XFER_BEGIN | SPI_XFER_END);  		if (err)  			return err;  		reg = 0x2c000000; -		err = spi_xfer(0, 32, (uchar *)®, (uchar *)&day2); +		err = spi_xfer(slave, 32, (uchar *)®, (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 *)®, (uchar *)&day); +	spi_xfer(slave, 32, (uchar *)®, (uchar *)&day, +			SPI_XFER_BEGIN | SPI_XFER_END);  	reg = 0x28000000 | time | 0x80000000; -	spi_xfer(0, 32, (uchar *)®, (uchar *)&time); +	spi_xfer(slave, 32, (uchar *)®, (uchar *)&time, +			SPI_XFER_BEGIN | SPI_XFER_END); + +	spi_release_bus(slave);  }  void rtc_reset(void) |