xref: /openbmc/u-boot/drivers/rtc/ds1302.c (revision 406fd7e207d3593f150079514a371dccdc651ce7)
10c698dcaSJean-Christophe PLAGNIOL-VILLARD /*
20c698dcaSJean-Christophe PLAGNIOL-VILLARD  * ds1302.c - Support for the Dallas Semiconductor DS1302 Timekeeping Chip
30c698dcaSJean-Christophe PLAGNIOL-VILLARD  *
40c698dcaSJean-Christophe PLAGNIOL-VILLARD  * Rex G. Feany <rfeany@zumanetworks.com>
50c698dcaSJean-Christophe PLAGNIOL-VILLARD  *
60c698dcaSJean-Christophe PLAGNIOL-VILLARD  */
70c698dcaSJean-Christophe PLAGNIOL-VILLARD 
80c698dcaSJean-Christophe PLAGNIOL-VILLARD #include <common.h>
90c698dcaSJean-Christophe PLAGNIOL-VILLARD #include <command.h>
100c698dcaSJean-Christophe PLAGNIOL-VILLARD #include <rtc.h>
110c698dcaSJean-Christophe PLAGNIOL-VILLARD 
120c698dcaSJean-Christophe PLAGNIOL-VILLARD /* GPP Pins */
130c698dcaSJean-Christophe PLAGNIOL-VILLARD #define DATA		0x200
140c698dcaSJean-Christophe PLAGNIOL-VILLARD #define SCLK		0x400
150c698dcaSJean-Christophe PLAGNIOL-VILLARD #define RST		0x800
160c698dcaSJean-Christophe PLAGNIOL-VILLARD 
170c698dcaSJean-Christophe PLAGNIOL-VILLARD /* Happy Fun Defines(tm) */
180c698dcaSJean-Christophe PLAGNIOL-VILLARD #define RESET		rtc_go_low(RST), rtc_go_low(SCLK)
190c698dcaSJean-Christophe PLAGNIOL-VILLARD #define N_RESET		rtc_go_high(RST), rtc_go_low(SCLK)
200c698dcaSJean-Christophe PLAGNIOL-VILLARD 
210c698dcaSJean-Christophe PLAGNIOL-VILLARD #define CLOCK_HIGH	rtc_go_high(SCLK)
220c698dcaSJean-Christophe PLAGNIOL-VILLARD #define CLOCK_LOW	rtc_go_low(SCLK)
230c698dcaSJean-Christophe PLAGNIOL-VILLARD 
240c698dcaSJean-Christophe PLAGNIOL-VILLARD #define DATA_HIGH	rtc_go_high(DATA)
250c698dcaSJean-Christophe PLAGNIOL-VILLARD #define DATA_LOW	rtc_go_low(DATA)
260c698dcaSJean-Christophe PLAGNIOL-VILLARD #define DATA_READ	(GTREGREAD(GPP_VALUE) & DATA)
270c698dcaSJean-Christophe PLAGNIOL-VILLARD 
280c698dcaSJean-Christophe PLAGNIOL-VILLARD #undef RTC_DEBUG
290c698dcaSJean-Christophe PLAGNIOL-VILLARD 
300c698dcaSJean-Christophe PLAGNIOL-VILLARD #ifdef RTC_DEBUG
310c698dcaSJean-Christophe PLAGNIOL-VILLARD #  define DPRINTF(x,args...)	printf("ds1302: " x , ##args)
DUMP(const char * ptr,int num)320c698dcaSJean-Christophe PLAGNIOL-VILLARD static inline void DUMP(const char *ptr, int num)
330c698dcaSJean-Christophe PLAGNIOL-VILLARD {
340c698dcaSJean-Christophe PLAGNIOL-VILLARD 	while (num--) printf("%x ", *ptr++);
350c698dcaSJean-Christophe PLAGNIOL-VILLARD 	printf("]\n");
360c698dcaSJean-Christophe PLAGNIOL-VILLARD }
370c698dcaSJean-Christophe PLAGNIOL-VILLARD #else
380c698dcaSJean-Christophe PLAGNIOL-VILLARD #  define DPRINTF(x,args...)
390c698dcaSJean-Christophe PLAGNIOL-VILLARD #  define DUMP(ptr, num)
400c698dcaSJean-Christophe PLAGNIOL-VILLARD #endif
410c698dcaSJean-Christophe PLAGNIOL-VILLARD 
420c698dcaSJean-Christophe PLAGNIOL-VILLARD /* time data format for DS1302 */
430c698dcaSJean-Christophe PLAGNIOL-VILLARD struct ds1302_st
440c698dcaSJean-Christophe PLAGNIOL-VILLARD {
450c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char CH:1;		/* clock halt 1=stop 0=start */
460c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char sec10:3;
470c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char sec:4;
480c698dcaSJean-Christophe PLAGNIOL-VILLARD 
490c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char zero0:1;
500c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char min10:3;
510c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char min:4;
520c698dcaSJean-Christophe PLAGNIOL-VILLARD 
530c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char fmt:1;		/* 1=12 hour 0=24 hour */
540c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char zero1:1;
550c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char hr10:2;	/* 10 (0-2) or am/pm (am/pm, 0-1) */
560c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char hr:4;
570c698dcaSJean-Christophe PLAGNIOL-VILLARD 
580c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char zero2:2;
590c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char date10:2;
600c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char date:4;
610c698dcaSJean-Christophe PLAGNIOL-VILLARD 
620c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char zero3:3;
630c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char month10:1;
640c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char month:4;
650c698dcaSJean-Christophe PLAGNIOL-VILLARD 
660c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char zero4:5;
670c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char day:3;		/* day of week */
680c698dcaSJean-Christophe PLAGNIOL-VILLARD 
690c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char year10:4;
700c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char year:4;
710c698dcaSJean-Christophe PLAGNIOL-VILLARD 
720c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char WP:1;		/* write protect 1=protect 0=unprot */
730c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char zero5:7;
740c698dcaSJean-Christophe PLAGNIOL-VILLARD };
750c698dcaSJean-Christophe PLAGNIOL-VILLARD 
760c698dcaSJean-Christophe PLAGNIOL-VILLARD static int ds1302_initted=0;
770c698dcaSJean-Christophe PLAGNIOL-VILLARD 
780c698dcaSJean-Christophe PLAGNIOL-VILLARD /* Pin control */
790c698dcaSJean-Christophe PLAGNIOL-VILLARD static inline void
rtc_go_high(unsigned int mask)800c698dcaSJean-Christophe PLAGNIOL-VILLARD rtc_go_high(unsigned int mask)
810c698dcaSJean-Christophe PLAGNIOL-VILLARD {
820c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned int f = GTREGREAD(GPP_VALUE) | mask;
830c698dcaSJean-Christophe PLAGNIOL-VILLARD 
840c698dcaSJean-Christophe PLAGNIOL-VILLARD 	GT_REG_WRITE(GPP_VALUE, f);
850c698dcaSJean-Christophe PLAGNIOL-VILLARD }
860c698dcaSJean-Christophe PLAGNIOL-VILLARD 
870c698dcaSJean-Christophe PLAGNIOL-VILLARD static inline void
rtc_go_low(unsigned int mask)880c698dcaSJean-Christophe PLAGNIOL-VILLARD rtc_go_low(unsigned int mask)
890c698dcaSJean-Christophe PLAGNIOL-VILLARD {
900c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned int f = GTREGREAD(GPP_VALUE) & ~mask;
910c698dcaSJean-Christophe PLAGNIOL-VILLARD 
920c698dcaSJean-Christophe PLAGNIOL-VILLARD 	GT_REG_WRITE(GPP_VALUE, f);
930c698dcaSJean-Christophe PLAGNIOL-VILLARD }
940c698dcaSJean-Christophe PLAGNIOL-VILLARD 
950c698dcaSJean-Christophe PLAGNIOL-VILLARD static inline void
rtc_go_input(unsigned int mask)960c698dcaSJean-Christophe PLAGNIOL-VILLARD rtc_go_input(unsigned int mask)
970c698dcaSJean-Christophe PLAGNIOL-VILLARD {
980c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned int f = GTREGREAD(GPP_IO_CONTROL) & ~mask;
990c698dcaSJean-Christophe PLAGNIOL-VILLARD 
1000c698dcaSJean-Christophe PLAGNIOL-VILLARD 	GT_REG_WRITE(GPP_IO_CONTROL, f);
1010c698dcaSJean-Christophe PLAGNIOL-VILLARD }
1020c698dcaSJean-Christophe PLAGNIOL-VILLARD 
1030c698dcaSJean-Christophe PLAGNIOL-VILLARD static inline void
rtc_go_output(unsigned int mask)1040c698dcaSJean-Christophe PLAGNIOL-VILLARD rtc_go_output(unsigned int mask)
1050c698dcaSJean-Christophe PLAGNIOL-VILLARD {
1060c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned int f = GTREGREAD(GPP_IO_CONTROL) | mask;
1070c698dcaSJean-Christophe PLAGNIOL-VILLARD 
1080c698dcaSJean-Christophe PLAGNIOL-VILLARD 	GT_REG_WRITE(GPP_IO_CONTROL, f);
1090c698dcaSJean-Christophe PLAGNIOL-VILLARD }
1100c698dcaSJean-Christophe PLAGNIOL-VILLARD 
1110c698dcaSJean-Christophe PLAGNIOL-VILLARD /* Access data in RTC */
1120c698dcaSJean-Christophe PLAGNIOL-VILLARD 
1130c698dcaSJean-Christophe PLAGNIOL-VILLARD static void
write_byte(unsigned char b)1140c698dcaSJean-Christophe PLAGNIOL-VILLARD write_byte(unsigned char b)
1150c698dcaSJean-Christophe PLAGNIOL-VILLARD {
1160c698dcaSJean-Christophe PLAGNIOL-VILLARD 	int i;
1170c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char mask=1;
1180c698dcaSJean-Christophe PLAGNIOL-VILLARD 
1190c698dcaSJean-Christophe PLAGNIOL-VILLARD 	for(i=0;i<8;i++) {
1200c698dcaSJean-Christophe PLAGNIOL-VILLARD 		CLOCK_LOW;			/* Lower clock */
1210c698dcaSJean-Christophe PLAGNIOL-VILLARD 		(b&mask)?DATA_HIGH:DATA_LOW;	/* set data */
1220c698dcaSJean-Christophe PLAGNIOL-VILLARD 		udelay(1);
1230c698dcaSJean-Christophe PLAGNIOL-VILLARD 		CLOCK_HIGH;		/* latch data with rising clock */
1240c698dcaSJean-Christophe PLAGNIOL-VILLARD 		udelay(1);
1250c698dcaSJean-Christophe PLAGNIOL-VILLARD 		mask=mask<<1;
1260c698dcaSJean-Christophe PLAGNIOL-VILLARD 	}
1270c698dcaSJean-Christophe PLAGNIOL-VILLARD }
1280c698dcaSJean-Christophe PLAGNIOL-VILLARD 
1290c698dcaSJean-Christophe PLAGNIOL-VILLARD static unsigned char
read_byte(void)1300c698dcaSJean-Christophe PLAGNIOL-VILLARD read_byte(void)
1310c698dcaSJean-Christophe PLAGNIOL-VILLARD {
1320c698dcaSJean-Christophe PLAGNIOL-VILLARD 	int i;
1330c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char mask=1;
1340c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char b=0;
1350c698dcaSJean-Christophe PLAGNIOL-VILLARD 
1360c698dcaSJean-Christophe PLAGNIOL-VILLARD 	for(i=0;i<8;i++) {
1370c698dcaSJean-Christophe PLAGNIOL-VILLARD 		CLOCK_LOW;
1380c698dcaSJean-Christophe PLAGNIOL-VILLARD 		udelay(1);
1390c698dcaSJean-Christophe PLAGNIOL-VILLARD 		if (DATA_READ) b|=mask;	/* if this bit is high, set in b */
1400c698dcaSJean-Christophe PLAGNIOL-VILLARD 		CLOCK_HIGH;		/* clock out next bit */
1410c698dcaSJean-Christophe PLAGNIOL-VILLARD 		udelay(1);
1420c698dcaSJean-Christophe PLAGNIOL-VILLARD 		mask=mask<<1;
1430c698dcaSJean-Christophe PLAGNIOL-VILLARD 	}
1440c698dcaSJean-Christophe PLAGNIOL-VILLARD 	return b;
1450c698dcaSJean-Christophe PLAGNIOL-VILLARD }
1460c698dcaSJean-Christophe PLAGNIOL-VILLARD 
1470c698dcaSJean-Christophe PLAGNIOL-VILLARD static void
read_ser_drv(unsigned char addr,unsigned char * buf,int count)1480c698dcaSJean-Christophe PLAGNIOL-VILLARD read_ser_drv(unsigned char addr, unsigned char *buf, int count)
1490c698dcaSJean-Christophe PLAGNIOL-VILLARD {
1500c698dcaSJean-Christophe PLAGNIOL-VILLARD 	int i;
1510c698dcaSJean-Christophe PLAGNIOL-VILLARD #ifdef RTC_DEBUG
1520c698dcaSJean-Christophe PLAGNIOL-VILLARD 	char *foo = buf;
1530c698dcaSJean-Christophe PLAGNIOL-VILLARD #endif
1540c698dcaSJean-Christophe PLAGNIOL-VILLARD 
1550c698dcaSJean-Christophe PLAGNIOL-VILLARD 	DPRINTF("READ 0x%x bytes @ 0x%x [ ", count, addr);
1560c698dcaSJean-Christophe PLAGNIOL-VILLARD 
1570c698dcaSJean-Christophe PLAGNIOL-VILLARD 	addr|=1;	/* READ */
1580c698dcaSJean-Christophe PLAGNIOL-VILLARD 	N_RESET;
1590c698dcaSJean-Christophe PLAGNIOL-VILLARD 	udelay(4);
1600c698dcaSJean-Christophe PLAGNIOL-VILLARD 	write_byte(addr);
1610c698dcaSJean-Christophe PLAGNIOL-VILLARD 	rtc_go_input(DATA); /* Put gpp pin into input mode */
1620c698dcaSJean-Christophe PLAGNIOL-VILLARD 	udelay(1);
1630c698dcaSJean-Christophe PLAGNIOL-VILLARD 	for(i=0;i<count;i++) *(buf++)=read_byte();
1640c698dcaSJean-Christophe PLAGNIOL-VILLARD 	RESET;
1650c698dcaSJean-Christophe PLAGNIOL-VILLARD 	rtc_go_output(DATA);/* Reset gpp for output */
1660c698dcaSJean-Christophe PLAGNIOL-VILLARD 	udelay(4);
1670c698dcaSJean-Christophe PLAGNIOL-VILLARD 
1680c698dcaSJean-Christophe PLAGNIOL-VILLARD 	DUMP(foo, count);
1690c698dcaSJean-Christophe PLAGNIOL-VILLARD }
1700c698dcaSJean-Christophe PLAGNIOL-VILLARD 
1710c698dcaSJean-Christophe PLAGNIOL-VILLARD static void
write_ser_drv(unsigned char addr,unsigned char * buf,int count)1720c698dcaSJean-Christophe PLAGNIOL-VILLARD write_ser_drv(unsigned char addr, unsigned char *buf, int count)
1730c698dcaSJean-Christophe PLAGNIOL-VILLARD {
1740c698dcaSJean-Christophe PLAGNIOL-VILLARD 	int i;
1750c698dcaSJean-Christophe PLAGNIOL-VILLARD 
1760c698dcaSJean-Christophe PLAGNIOL-VILLARD 	DPRINTF("WRITE 0x%x bytes @ 0x%x [ ", count, addr);
1770c698dcaSJean-Christophe PLAGNIOL-VILLARD 	DUMP(buf, count);
1780c698dcaSJean-Christophe PLAGNIOL-VILLARD 
1790c698dcaSJean-Christophe PLAGNIOL-VILLARD 	addr&=~1;	/* WRITE */
1800c698dcaSJean-Christophe PLAGNIOL-VILLARD 	N_RESET;
1810c698dcaSJean-Christophe PLAGNIOL-VILLARD 	udelay(4);
1820c698dcaSJean-Christophe PLAGNIOL-VILLARD 	write_byte(addr);
1830c698dcaSJean-Christophe PLAGNIOL-VILLARD 	for(i=0;i<count;i++) write_byte(*(buf++));
1840c698dcaSJean-Christophe PLAGNIOL-VILLARD 	RESET;
1850c698dcaSJean-Christophe PLAGNIOL-VILLARD 	udelay(4);
1860c698dcaSJean-Christophe PLAGNIOL-VILLARD 
1870c698dcaSJean-Christophe PLAGNIOL-VILLARD }
1880c698dcaSJean-Christophe PLAGNIOL-VILLARD 
1890c698dcaSJean-Christophe PLAGNIOL-VILLARD void
rtc_init(void)1900c698dcaSJean-Christophe PLAGNIOL-VILLARD rtc_init(void)
1910c698dcaSJean-Christophe PLAGNIOL-VILLARD {
1920c698dcaSJean-Christophe PLAGNIOL-VILLARD 	struct ds1302_st bbclk;
1930c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char b;
1940c698dcaSJean-Christophe PLAGNIOL-VILLARD 	int mod;
1950c698dcaSJean-Christophe PLAGNIOL-VILLARD 
1960c698dcaSJean-Christophe PLAGNIOL-VILLARD 	DPRINTF("init\n");
1970c698dcaSJean-Christophe PLAGNIOL-VILLARD 
1980c698dcaSJean-Christophe PLAGNIOL-VILLARD 	rtc_go_output(DATA|SCLK|RST);
1990c698dcaSJean-Christophe PLAGNIOL-VILLARD 
2000c698dcaSJean-Christophe PLAGNIOL-VILLARD 	/* disable write protect */
2010c698dcaSJean-Christophe PLAGNIOL-VILLARD 	b = 0;
2020c698dcaSJean-Christophe PLAGNIOL-VILLARD 	write_ser_drv(0x8e,&b,1);
2030c698dcaSJean-Christophe PLAGNIOL-VILLARD 
2040c698dcaSJean-Christophe PLAGNIOL-VILLARD 	/* enable trickle */
2050c698dcaSJean-Christophe PLAGNIOL-VILLARD 	b = 0xa5;	/* 1010.0101 */
2060c698dcaSJean-Christophe PLAGNIOL-VILLARD 	write_ser_drv(0x90,&b,1);
2070c698dcaSJean-Christophe PLAGNIOL-VILLARD 
2080c698dcaSJean-Christophe PLAGNIOL-VILLARD 	/* read burst */
2090c698dcaSJean-Christophe PLAGNIOL-VILLARD 	read_ser_drv(0xbe, (unsigned char *)&bbclk, 8);
2100c698dcaSJean-Christophe PLAGNIOL-VILLARD 
2110c698dcaSJean-Christophe PLAGNIOL-VILLARD 	/* Sanity checks */
2120c698dcaSJean-Christophe PLAGNIOL-VILLARD 	mod = 0;
2130c698dcaSJean-Christophe PLAGNIOL-VILLARD 	if (bbclk.CH) {
2140c698dcaSJean-Christophe PLAGNIOL-VILLARD 		printf("ds1302: Clock was halted, starting clock\n");
2150c698dcaSJean-Christophe PLAGNIOL-VILLARD 		bbclk.CH=0;
2160c698dcaSJean-Christophe PLAGNIOL-VILLARD 		mod=1;
2170c698dcaSJean-Christophe PLAGNIOL-VILLARD 	}
2180c698dcaSJean-Christophe PLAGNIOL-VILLARD 
2190c698dcaSJean-Christophe PLAGNIOL-VILLARD 	if (bbclk.fmt) {
2200c698dcaSJean-Christophe PLAGNIOL-VILLARD 		printf("ds1302: Clock was in 12 hour mode, fixing\n");
2210c698dcaSJean-Christophe PLAGNIOL-VILLARD 		bbclk.fmt=0;
2220c698dcaSJean-Christophe PLAGNIOL-VILLARD 		mod=1;
2230c698dcaSJean-Christophe PLAGNIOL-VILLARD 	}
2240c698dcaSJean-Christophe PLAGNIOL-VILLARD 
2250c698dcaSJean-Christophe PLAGNIOL-VILLARD 	if (bbclk.year>9) {
2260c698dcaSJean-Christophe PLAGNIOL-VILLARD 		printf("ds1302: Year was corrupted, fixing\n");
2270c698dcaSJean-Christophe PLAGNIOL-VILLARD 		bbclk.year10=100/10;	/* 2000 - why not? ;) */
2280c698dcaSJean-Christophe PLAGNIOL-VILLARD 		bbclk.year=0;
2290c698dcaSJean-Christophe PLAGNIOL-VILLARD 		mod=1;
2300c698dcaSJean-Christophe PLAGNIOL-VILLARD 	}
2310c698dcaSJean-Christophe PLAGNIOL-VILLARD 
2320c698dcaSJean-Christophe PLAGNIOL-VILLARD 	/* Write out the changes if needed */
2330c698dcaSJean-Christophe PLAGNIOL-VILLARD 	if (mod) {
2340c698dcaSJean-Christophe PLAGNIOL-VILLARD 		/* enable write protect */
2350c698dcaSJean-Christophe PLAGNIOL-VILLARD 		bbclk.WP = 1;
2360c698dcaSJean-Christophe PLAGNIOL-VILLARD 		write_ser_drv(0xbe,(unsigned char *)&bbclk,8);
2370c698dcaSJean-Christophe PLAGNIOL-VILLARD 	} else {
2380c698dcaSJean-Christophe PLAGNIOL-VILLARD 		/* Else just turn write protect on */
2390c698dcaSJean-Christophe PLAGNIOL-VILLARD 		b = 0x80;
2400c698dcaSJean-Christophe PLAGNIOL-VILLARD 		write_ser_drv(0x8e,&b,1);
2410c698dcaSJean-Christophe PLAGNIOL-VILLARD 	}
2420c698dcaSJean-Christophe PLAGNIOL-VILLARD 	DPRINTF("init done\n");
2430c698dcaSJean-Christophe PLAGNIOL-VILLARD 
2440c698dcaSJean-Christophe PLAGNIOL-VILLARD 	ds1302_initted=1;
2450c698dcaSJean-Christophe PLAGNIOL-VILLARD }
2460c698dcaSJean-Christophe PLAGNIOL-VILLARD 
2470c698dcaSJean-Christophe PLAGNIOL-VILLARD void
rtc_reset(void)2480c698dcaSJean-Christophe PLAGNIOL-VILLARD rtc_reset(void)
2490c698dcaSJean-Christophe PLAGNIOL-VILLARD {
2500c698dcaSJean-Christophe PLAGNIOL-VILLARD 	if(!ds1302_initted) rtc_init();
2510c698dcaSJean-Christophe PLAGNIOL-VILLARD 	/* TODO */
2520c698dcaSJean-Christophe PLAGNIOL-VILLARD }
2530c698dcaSJean-Christophe PLAGNIOL-VILLARD 
254b73a19e1SYuri Tikhonov int
rtc_get(struct rtc_time * tmp)2550c698dcaSJean-Christophe PLAGNIOL-VILLARD rtc_get(struct rtc_time *tmp)
2560c698dcaSJean-Christophe PLAGNIOL-VILLARD {
257b73a19e1SYuri Tikhonov 	int rel = 0;
2580c698dcaSJean-Christophe PLAGNIOL-VILLARD 	struct ds1302_st bbclk;
2590c698dcaSJean-Christophe PLAGNIOL-VILLARD 
2600c698dcaSJean-Christophe PLAGNIOL-VILLARD 	if(!ds1302_initted) rtc_init();
2610c698dcaSJean-Christophe PLAGNIOL-VILLARD 
2620c698dcaSJean-Christophe PLAGNIOL-VILLARD 	read_ser_drv(0xbe,(unsigned char *)&bbclk, 8);      /* read burst */
2630c698dcaSJean-Christophe PLAGNIOL-VILLARD 
2640c698dcaSJean-Christophe PLAGNIOL-VILLARD 	if (bbclk.CH) {
2650c698dcaSJean-Christophe PLAGNIOL-VILLARD 		printf("ds1302: rtc_get: Clock was halted, clock probably "
2660c698dcaSJean-Christophe PLAGNIOL-VILLARD 			"corrupt\n");
267b73a19e1SYuri Tikhonov 		rel = -1;
2680c698dcaSJean-Christophe PLAGNIOL-VILLARD 	}
2690c698dcaSJean-Christophe PLAGNIOL-VILLARD 
2700c698dcaSJean-Christophe PLAGNIOL-VILLARD 	tmp->tm_sec=10*bbclk.sec10+bbclk.sec;
2710c698dcaSJean-Christophe PLAGNIOL-VILLARD 	tmp->tm_min=10*bbclk.min10+bbclk.min;
2720c698dcaSJean-Christophe PLAGNIOL-VILLARD 	tmp->tm_hour=10*bbclk.hr10+bbclk.hr;
2730c698dcaSJean-Christophe PLAGNIOL-VILLARD 	tmp->tm_wday=bbclk.day;
2740c698dcaSJean-Christophe PLAGNIOL-VILLARD 	tmp->tm_mday=10*bbclk.date10+bbclk.date;
2750c698dcaSJean-Christophe PLAGNIOL-VILLARD 	tmp->tm_mon=10*bbclk.month10+bbclk.month;
2760c698dcaSJean-Christophe PLAGNIOL-VILLARD 	tmp->tm_year=10*bbclk.year10+bbclk.year + 1900;
2770c698dcaSJean-Christophe PLAGNIOL-VILLARD 
2780c698dcaSJean-Christophe PLAGNIOL-VILLARD 	tmp->tm_yday = 0;
2790c698dcaSJean-Christophe PLAGNIOL-VILLARD 	tmp->tm_isdst= 0;
2800c698dcaSJean-Christophe PLAGNIOL-VILLARD 
2810c698dcaSJean-Christophe PLAGNIOL-VILLARD 	DPRINTF("Get DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",
2820c698dcaSJean-Christophe PLAGNIOL-VILLARD 		tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
2830c698dcaSJean-Christophe PLAGNIOL-VILLARD 		tmp->tm_hour, tmp->tm_min, tmp->tm_sec );
284b73a19e1SYuri Tikhonov 
285b73a19e1SYuri Tikhonov 	return rel;
2860c698dcaSJean-Christophe PLAGNIOL-VILLARD }
2870c698dcaSJean-Christophe PLAGNIOL-VILLARD 
rtc_set(struct rtc_time * tmp)288*d1e23194SJean-Christophe PLAGNIOL-VILLARD int rtc_set(struct rtc_time *tmp)
2890c698dcaSJean-Christophe PLAGNIOL-VILLARD {
2900c698dcaSJean-Christophe PLAGNIOL-VILLARD 	struct ds1302_st bbclk;
2910c698dcaSJean-Christophe PLAGNIOL-VILLARD 	unsigned char b=0;
2920c698dcaSJean-Christophe PLAGNIOL-VILLARD 
2930c698dcaSJean-Christophe PLAGNIOL-VILLARD 	if(!ds1302_initted) rtc_init();
2940c698dcaSJean-Christophe PLAGNIOL-VILLARD 
2950c698dcaSJean-Christophe PLAGNIOL-VILLARD 	DPRINTF("Set DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",
2960c698dcaSJean-Christophe PLAGNIOL-VILLARD 		tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
2970c698dcaSJean-Christophe PLAGNIOL-VILLARD 		tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
2980c698dcaSJean-Christophe PLAGNIOL-VILLARD 
2990c698dcaSJean-Christophe PLAGNIOL-VILLARD 	memset(&bbclk,0,sizeof(bbclk));
3000c698dcaSJean-Christophe PLAGNIOL-VILLARD 	bbclk.CH=0; /* dont halt */
3010c698dcaSJean-Christophe PLAGNIOL-VILLARD 	bbclk.WP=1; /* write protect when we're done */
3020c698dcaSJean-Christophe PLAGNIOL-VILLARD 
3030c698dcaSJean-Christophe PLAGNIOL-VILLARD 	bbclk.sec10=tmp->tm_sec/10;
3040c698dcaSJean-Christophe PLAGNIOL-VILLARD 	bbclk.sec=tmp->tm_sec%10;
3050c698dcaSJean-Christophe PLAGNIOL-VILLARD 
3060c698dcaSJean-Christophe PLAGNIOL-VILLARD 	bbclk.min10=tmp->tm_min/10;
3070c698dcaSJean-Christophe PLAGNIOL-VILLARD 	bbclk.min=tmp->tm_min%10;
3080c698dcaSJean-Christophe PLAGNIOL-VILLARD 
3090c698dcaSJean-Christophe PLAGNIOL-VILLARD 	bbclk.hr10=tmp->tm_hour/10;
3100c698dcaSJean-Christophe PLAGNIOL-VILLARD 	bbclk.hr=tmp->tm_hour%10;
3110c698dcaSJean-Christophe PLAGNIOL-VILLARD 
3120c698dcaSJean-Christophe PLAGNIOL-VILLARD 	bbclk.day=tmp->tm_wday;
3130c698dcaSJean-Christophe PLAGNIOL-VILLARD 
3140c698dcaSJean-Christophe PLAGNIOL-VILLARD 	bbclk.date10=tmp->tm_mday/10;
3150c698dcaSJean-Christophe PLAGNIOL-VILLARD 	bbclk.date=tmp->tm_mday%10;
3160c698dcaSJean-Christophe PLAGNIOL-VILLARD 
3170c698dcaSJean-Christophe PLAGNIOL-VILLARD 	bbclk.month10=tmp->tm_mon/10;
3180c698dcaSJean-Christophe PLAGNIOL-VILLARD 	bbclk.month=tmp->tm_mon%10;
3190c698dcaSJean-Christophe PLAGNIOL-VILLARD 
3200c698dcaSJean-Christophe PLAGNIOL-VILLARD 	tmp->tm_year -= 1900;
3210c698dcaSJean-Christophe PLAGNIOL-VILLARD 	bbclk.year10=tmp->tm_year/10;
3220c698dcaSJean-Christophe PLAGNIOL-VILLARD 	bbclk.year=tmp->tm_year%10;
3230c698dcaSJean-Christophe PLAGNIOL-VILLARD 
3240c698dcaSJean-Christophe PLAGNIOL-VILLARD 	write_ser_drv(0x8e,&b,1);           /* disable write protect */
3250c698dcaSJean-Christophe PLAGNIOL-VILLARD 	write_ser_drv(0xbe,(unsigned char *)&bbclk, 8);     /* write burst */
326*d1e23194SJean-Christophe PLAGNIOL-VILLARD 
327*d1e23194SJean-Christophe PLAGNIOL-VILLARD 	return 0;
3280c698dcaSJean-Christophe PLAGNIOL-VILLARD }
329