1 /* drivers/rtc/rtc-max6902.c
3 * Copyright (C) 2006 8D Technologies inc.
4 * Copyright (C) 2004 Compulab Ltd.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
10 * Driver for MAX6902 spi RTC
14 #include <linux/module.h>
15 #include <linux/kernel.h>
16 #include <linux/platform_device.h>
17 #include <linux/init.h>
18 #include <linux/rtc.h>
19 #include <linux/spi/spi.h>
20 #include <linux/bcd.h>
22 #define MAX6902_REG_SECONDS 0x01
23 #define MAX6902_REG_MINUTES 0x03
24 #define MAX6902_REG_HOURS 0x05
25 #define MAX6902_REG_DATE 0x07
26 #define MAX6902_REG_MONTH 0x09
27 #define MAX6902_REG_DAY 0x0B
28 #define MAX6902_REG_YEAR 0x0D
29 #define MAX6902_REG_CONTROL 0x0F
30 #define MAX6902_REG_CENTURY 0x13
32 static int max6902_set_reg(struct device
*dev
, unsigned char address
,
35 struct spi_device
*spi
= to_spi_device(dev
);
38 /* MSB must be '0' to write */
39 buf
[0] = address
& 0x7f;
42 return spi_write_then_read(spi
, buf
, 2, NULL
, 0);
45 static int max6902_get_reg(struct device
*dev
, unsigned char address
,
48 struct spi_device
*spi
= to_spi_device(dev
);
50 /* Set MSB to indicate read */
51 *data
= address
| 0x80;
53 return spi_write_then_read(spi
, data
, 1, data
, 1);
56 static int max6902_read_time(struct device
*dev
, struct rtc_time
*dt
)
59 struct spi_device
*spi
= to_spi_device(dev
);
62 buf
[0] = 0xbf; /* Burst read */
64 err
= spi_write_then_read(spi
, buf
, 1, buf
, 8);
68 /* The chip sends data in this order:
69 * Seconds, Minutes, Hours, Date, Month, Day, Year */
70 dt
->tm_sec
= bcd2bin(buf
[0]);
71 dt
->tm_min
= bcd2bin(buf
[1]);
72 dt
->tm_hour
= bcd2bin(buf
[2]);
73 dt
->tm_mday
= bcd2bin(buf
[3]);
74 dt
->tm_mon
= bcd2bin(buf
[4]) - 1;
75 dt
->tm_wday
= bcd2bin(buf
[5]);
76 dt
->tm_year
= bcd2bin(buf
[6]);
79 err
= max6902_get_reg(dev
, MAX6902_REG_CENTURY
, &buf
[0]);
83 century
= bcd2bin(buf
[0]) * 100;
85 dt
->tm_year
+= century
;
88 return rtc_valid_tm(dt
);
91 static int max6902_set_time(struct device
*dev
, struct rtc_time
*dt
)
93 dt
->tm_year
= dt
->tm_year
+ 1900;
95 /* Remove write protection */
96 max6902_set_reg(dev
, 0xF, 0);
98 max6902_set_reg(dev
, 0x01, bin2bcd(dt
->tm_sec
));
99 max6902_set_reg(dev
, 0x03, bin2bcd(dt
->tm_min
));
100 max6902_set_reg(dev
, 0x05, bin2bcd(dt
->tm_hour
));
102 max6902_set_reg(dev
, 0x07, bin2bcd(dt
->tm_mday
));
103 max6902_set_reg(dev
, 0x09, bin2bcd(dt
->tm_mon
+ 1));
104 max6902_set_reg(dev
, 0x0B, bin2bcd(dt
->tm_wday
));
105 max6902_set_reg(dev
, 0x0D, bin2bcd(dt
->tm_year
% 100));
106 max6902_set_reg(dev
, 0x13, bin2bcd(dt
->tm_year
/ 100));
108 /* Compulab used a delay here. However, the datasheet
109 * does not mention a delay being required anywhere... */
113 max6902_set_reg(dev
, 0xF, 0x80);
118 static const struct rtc_class_ops max6902_rtc_ops
= {
119 .read_time
= max6902_read_time
,
120 .set_time
= max6902_set_time
,
123 static int __devinit
max6902_probe(struct spi_device
*spi
)
125 struct rtc_device
*rtc
;
129 spi
->mode
= SPI_MODE_3
;
130 spi
->bits_per_word
= 8;
133 res
= max6902_get_reg(&spi
->dev
, MAX6902_REG_SECONDS
, &tmp
);
137 rtc
= rtc_device_register("max6902",
138 &spi
->dev
, &max6902_rtc_ops
, THIS_MODULE
);
142 dev_set_drvdata(&spi
->dev
, rtc
);
146 static int __devexit
max6902_remove(struct spi_device
*spi
)
148 struct rtc_device
*rtc
= dev_get_drvdata(&spi
->dev
);
150 rtc_device_unregister(rtc
);
154 static struct spi_driver max6902_driver
= {
156 .name
= "rtc-max6902",
157 .owner
= THIS_MODULE
,
159 .probe
= max6902_probe
,
160 .remove
= __devexit_p(max6902_remove
),
163 module_spi_driver(max6902_driver
);
165 MODULE_DESCRIPTION ("max6902 spi RTC driver");
166 MODULE_AUTHOR ("Raphael Assenat");
167 MODULE_LICENSE ("GPL");
168 MODULE_ALIAS("spi:rtc-max6902");