[PATCH 1/2] rtc: add rtc-m41t80 driver (take 3)
This is a new-style i2c driver for ST M41T80 series RTC chip, derived from works by Alexander Bigga <[EMAIL PROTECTED]> who wrote the original rtc-m41txx.c based on drivers/i2c/chips/m41t00.c driver. This driver supports M41T8[0-4] and M41ST8[457]. The old m41t00 driver supports M41T00, M41T81 and M41T85(M41ST85). While the M41T00 chip is now supported by rtc-ds1307 driver, this driver does not include support for the chip. Signed-off-by: Atsushi Nemoto <[EMAIL PROTECTED]> Signed-off-by: Alexander Bigga <[EMAIL PROTECTED]> Acked-by: Mark A. Greer <[EMAIL PROTECTED]> Acked-by: Alessandro Zummo <[EMAIL PROTECTED]> --- Changes from previous version (take 2): * Fix wrong static storage class (by Andrew Morton) * Move a Kconfig entry into "I2C RTC drivers" section drivers/rtc/Kconfig | 12 + drivers/rtc/Makefile |1 + drivers/rtc/rtc-m41t80.c | 629 ++ 3 files changed, 642 insertions(+), 0 deletions(-) diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 4e4c10a..661386f 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -213,6 +213,18 @@ config RTC_DRV_PCF8583 This driver can also be built as a module. If so, the module will be called rtc-pcf8583. +config RTC_DRV_M41T80 + tristate "ST M41T80 series RTC" + depends on RTC_CLASS && I2C + help + If you say Y here you will get support for the + ST M41T80 RTC chips series. Currently following chips are + supported: M41T80, M41T81, M41T82, M41T83, M41ST84, M41ST85 + and M41ST87. + + This driver can also be built as a module. If so, the module + will be called rtc-m41t80. + comment "SPI RTC drivers" depends on RTC_CLASS diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index a1afbc2..d1dc270 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile @@ -28,6 +28,7 @@ obj-$(CONFIG_RTC_DRV_PCF8583) += rtc-pcf8583.o obj-$(CONFIG_RTC_DRV_RS5C372) += rtc-rs5c372.o obj-$(CONFIG_RTC_DRV_S3C) += rtc-s3c.o obj-$(CONFIG_RTC_DRV_RS5C348) += rtc-rs5c348.o +obj-$(CONFIG_RTC_DRV_M41T80) += rtc-m41t80.o obj-$(CONFIG_RTC_DRV_M48T86) += rtc-m48t86.o obj-$(CONFIG_RTC_DRV_DS1553) += rtc-ds1553.o obj-$(CONFIG_RTC_DRV_RS5C313) += rtc-rs5c313.o diff --git a/drivers/rtc/rtc-m41t80.c b/drivers/rtc/rtc-m41t80.c new file mode 100644 index 000..4875a44 --- /dev/null +++ b/drivers/rtc/rtc-m41t80.c @@ -0,0 +1,629 @@ +/* + * I2C client/driver for the ST M41T80 family of i2c rtc chips. + * + * Author: Alexander Bigga <[EMAIL PROTECTED]> + * + * Based on m41t00.c by Mark A. Greer <[EMAIL PROTECTED]> + * + * 2006 (c) mycable GmbH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#define M41T80_REG_SSEC0 +#define M41T80_REG_SEC 1 +#define M41T80_REG_MIN 2 +#define M41T80_REG_HOUR3 +#define M41T80_REG_WDAY4 +#define M41T80_REG_DAY 5 +#define M41T80_REG_MON 6 +#define M41T80_REG_YEAR7 +#define M41T80_REG_ALARM_MON 0xa +#define M41T80_REG_ALARM_DAY 0xb +#define M41T80_REG_ALARM_HOUR 0xc +#define M41T80_REG_ALARM_MIN 0xd +#define M41T80_REG_ALARM_SEC 0xe +#define M41T80_REG_FLAGS 0xf +#define M41T80_REG_SQW 0x13 + +#define M41T80_DATETIME_REG_SIZE (M41T80_REG_YEAR + 1) +#define M41T80_ALARM_REG_SIZE \ + (M41T80_REG_ALARM_SEC + 1 - M41T80_REG_ALARM_MON) + +#define M41T80_SEC_ST (1 << 7)/* ST: Stop Bit */ +#define M41T80_ALMON_AFE (1 << 7)/* AFE: AF Enable Bit */ +#define M41T80_ALMON_SQWE (1 << 6)/* SQWE: SQW Enable Bit */ +#define M41T80_ALHOUR_HT (1 << 6)/* HT: Halt Update Bit */ +#define M41T80_FLAGS_AF(1 << 6)/* AF: Alarm Flag Bit */ +#define M41T80_FLAGS_BATT_LOW (1 << 4)/* BL: Battery Low Bit */ + +#define M41T80_FEATURE_HT (1 << 0) +#define M41T80_FEATURE_BL (1 << 1) + +#define DRV_VERSION "0.05" + +struct m41t80_chip_info { + const char *name; + u8 features; +}; + +static const struct m41t80_chip_info m41t80_chip_info_tbl[] = { + { + .name = "m41t80", + .features = 0, + }, + { + .name = "m41t81", + .features = M41T80_FEATURE_HT, + }, + { + .name = "m41t81s", + .features = M41T80_FEATURE_HT | M41T80_FEATURE_BL, + }, + { + .name = "m41t82", + .features = M41T80_FEATURE_HT | M41T80_FEATURE_BL, + }, + { + .name = "m41t83", + .features = M41T80_FEATURE_HT | M41T80_FEATURE_BL, + }, + { + .name
[PATCH 1/2] rtc: add rtc-m41t80 driver (take 3)
This is a new-style i2c driver for ST M41T80 series RTC chip, derived from works by Alexander Bigga [EMAIL PROTECTED] who wrote the original rtc-m41txx.c based on drivers/i2c/chips/m41t00.c driver. This driver supports M41T8[0-4] and M41ST8[457]. The old m41t00 driver supports M41T00, M41T81 and M41T85(M41ST85). While the M41T00 chip is now supported by rtc-ds1307 driver, this driver does not include support for the chip. Signed-off-by: Atsushi Nemoto [EMAIL PROTECTED] Signed-off-by: Alexander Bigga [EMAIL PROTECTED] Acked-by: Mark A. Greer [EMAIL PROTECTED] Acked-by: Alessandro Zummo [EMAIL PROTECTED] --- Changes from previous version (take 2): * Fix wrong static storage class (by Andrew Morton) * Move a Kconfig entry into I2C RTC drivers section drivers/rtc/Kconfig | 12 + drivers/rtc/Makefile |1 + drivers/rtc/rtc-m41t80.c | 629 ++ 3 files changed, 642 insertions(+), 0 deletions(-) diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 4e4c10a..661386f 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -213,6 +213,18 @@ config RTC_DRV_PCF8583 This driver can also be built as a module. If so, the module will be called rtc-pcf8583. +config RTC_DRV_M41T80 + tristate ST M41T80 series RTC + depends on RTC_CLASS I2C + help + If you say Y here you will get support for the + ST M41T80 RTC chips series. Currently following chips are + supported: M41T80, M41T81, M41T82, M41T83, M41ST84, M41ST85 + and M41ST87. + + This driver can also be built as a module. If so, the module + will be called rtc-m41t80. + comment SPI RTC drivers depends on RTC_CLASS diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index a1afbc2..d1dc270 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile @@ -28,6 +28,7 @@ obj-$(CONFIG_RTC_DRV_PCF8583) += rtc-pcf8583.o obj-$(CONFIG_RTC_DRV_RS5C372) += rtc-rs5c372.o obj-$(CONFIG_RTC_DRV_S3C) += rtc-s3c.o obj-$(CONFIG_RTC_DRV_RS5C348) += rtc-rs5c348.o +obj-$(CONFIG_RTC_DRV_M41T80) += rtc-m41t80.o obj-$(CONFIG_RTC_DRV_M48T86) += rtc-m48t86.o obj-$(CONFIG_RTC_DRV_DS1553) += rtc-ds1553.o obj-$(CONFIG_RTC_DRV_RS5C313) += rtc-rs5c313.o diff --git a/drivers/rtc/rtc-m41t80.c b/drivers/rtc/rtc-m41t80.c new file mode 100644 index 000..4875a44 --- /dev/null +++ b/drivers/rtc/rtc-m41t80.c @@ -0,0 +1,629 @@ +/* + * I2C client/driver for the ST M41T80 family of i2c rtc chips. + * + * Author: Alexander Bigga [EMAIL PROTECTED] + * + * Based on m41t00.c by Mark A. Greer [EMAIL PROTECTED] + * + * 2006 (c) mycable GmbH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include linux/module.h +#include linux/init.h +#include linux/slab.h +#include linux/string.h +#include linux/i2c.h +#include linux/rtc.h +#include linux/bcd.h + +#define M41T80_REG_SSEC0 +#define M41T80_REG_SEC 1 +#define M41T80_REG_MIN 2 +#define M41T80_REG_HOUR3 +#define M41T80_REG_WDAY4 +#define M41T80_REG_DAY 5 +#define M41T80_REG_MON 6 +#define M41T80_REG_YEAR7 +#define M41T80_REG_ALARM_MON 0xa +#define M41T80_REG_ALARM_DAY 0xb +#define M41T80_REG_ALARM_HOUR 0xc +#define M41T80_REG_ALARM_MIN 0xd +#define M41T80_REG_ALARM_SEC 0xe +#define M41T80_REG_FLAGS 0xf +#define M41T80_REG_SQW 0x13 + +#define M41T80_DATETIME_REG_SIZE (M41T80_REG_YEAR + 1) +#define M41T80_ALARM_REG_SIZE \ + (M41T80_REG_ALARM_SEC + 1 - M41T80_REG_ALARM_MON) + +#define M41T80_SEC_ST (1 7)/* ST: Stop Bit */ +#define M41T80_ALMON_AFE (1 7)/* AFE: AF Enable Bit */ +#define M41T80_ALMON_SQWE (1 6)/* SQWE: SQW Enable Bit */ +#define M41T80_ALHOUR_HT (1 6)/* HT: Halt Update Bit */ +#define M41T80_FLAGS_AF(1 6)/* AF: Alarm Flag Bit */ +#define M41T80_FLAGS_BATT_LOW (1 4)/* BL: Battery Low Bit */ + +#define M41T80_FEATURE_HT (1 0) +#define M41T80_FEATURE_BL (1 1) + +#define DRV_VERSION 0.05 + +struct m41t80_chip_info { + const char *name; + u8 features; +}; + +static const struct m41t80_chip_info m41t80_chip_info_tbl[] = { + { + .name = m41t80, + .features = 0, + }, + { + .name = m41t81, + .features = M41T80_FEATURE_HT, + }, + { + .name = m41t81s, + .features = M41T80_FEATURE_HT | M41T80_FEATURE_BL, + }, + { + .name = m41t82, + .features = M41T80_FEATURE_HT | M41T80_FEATURE_BL, + }, + { + .name = m41t83, + .features = M41T80_FEATURE_HT | M41T80_FEATURE_BL, +