Commit 43fcb815 authored by David Anders's avatar David Anders Committed by Linus Torvalds

rtc: add initial support for mcp7941x parts

Add initial support for the microchip mcp7941x series of real time clocks.

The mcp7941x series is generally compatible with the ds1307 and ds1337 rtc
devices from dallas semiconductor.  minor differences include a backup
battery enable bit, and the polarity of the oscillator enable bit.
Signed-off-by: default avatarDavid Anders <danders.dev@gmail.com>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Reviewed-by: default avatarWolfram Sang <w.sang@pengutronix.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 6d03d06d
...@@ -34,6 +34,7 @@ enum ds_type { ...@@ -34,6 +34,7 @@ enum ds_type {
ds_1388, ds_1388,
ds_3231, ds_3231,
m41t00, m41t00,
mcp7941x,
rx_8025, rx_8025,
// rs5c372 too? different address... // rs5c372 too? different address...
}; };
...@@ -43,6 +44,7 @@ enum ds_type { ...@@ -43,6 +44,7 @@ enum ds_type {
#define DS1307_REG_SECS 0x00 /* 00-59 */ #define DS1307_REG_SECS 0x00 /* 00-59 */
# define DS1307_BIT_CH 0x80 # define DS1307_BIT_CH 0x80
# define DS1340_BIT_nEOSC 0x80 # define DS1340_BIT_nEOSC 0x80
# define MCP7941X_BIT_ST 0x80
#define DS1307_REG_MIN 0x01 /* 00-59 */ #define DS1307_REG_MIN 0x01 /* 00-59 */
#define DS1307_REG_HOUR 0x02 /* 00-23, or 1-12{am,pm} */ #define DS1307_REG_HOUR 0x02 /* 00-23, or 1-12{am,pm} */
# define DS1307_BIT_12HR 0x40 /* in REG_HOUR */ # define DS1307_BIT_12HR 0x40 /* in REG_HOUR */
...@@ -50,6 +52,7 @@ enum ds_type { ...@@ -50,6 +52,7 @@ enum ds_type {
# define DS1340_BIT_CENTURY_EN 0x80 /* in REG_HOUR */ # define DS1340_BIT_CENTURY_EN 0x80 /* in REG_HOUR */
# define DS1340_BIT_CENTURY 0x40 /* in REG_HOUR */ # define DS1340_BIT_CENTURY 0x40 /* in REG_HOUR */
#define DS1307_REG_WDAY 0x03 /* 01-07 */ #define DS1307_REG_WDAY 0x03 /* 01-07 */
# define MCP7941X_BIT_VBATEN 0x08
#define DS1307_REG_MDAY 0x04 /* 01-31 */ #define DS1307_REG_MDAY 0x04 /* 01-31 */
#define DS1307_REG_MONTH 0x05 /* 01-12 */ #define DS1307_REG_MONTH 0x05 /* 01-12 */
# define DS1337_BIT_CENTURY 0x80 /* in REG_MONTH */ # define DS1337_BIT_CENTURY 0x80 /* in REG_MONTH */
...@@ -137,6 +140,8 @@ static const struct chip_desc chips[] = { ...@@ -137,6 +140,8 @@ static const struct chip_desc chips[] = {
}, },
[m41t00] = { [m41t00] = {
}, },
[mcp7941x] = {
},
[rx_8025] = { [rx_8025] = {
}, }; }, };
...@@ -149,6 +154,7 @@ static const struct i2c_device_id ds1307_id[] = { ...@@ -149,6 +154,7 @@ static const struct i2c_device_id ds1307_id[] = {
{ "ds1340", ds_1340 }, { "ds1340", ds_1340 },
{ "ds3231", ds_3231 }, { "ds3231", ds_3231 },
{ "m41t00", m41t00 }, { "m41t00", m41t00 },
{ "mcp7941x", mcp7941x },
{ "pt7c4338", ds_1307 }, { "pt7c4338", ds_1307 },
{ "rx8025", rx_8025 }, { "rx8025", rx_8025 },
{ } { }
...@@ -365,6 +371,10 @@ static int ds1307_set_time(struct device *dev, struct rtc_time *t) ...@@ -365,6 +371,10 @@ static int ds1307_set_time(struct device *dev, struct rtc_time *t)
buf[DS1307_REG_HOUR] |= DS1340_BIT_CENTURY_EN buf[DS1307_REG_HOUR] |= DS1340_BIT_CENTURY_EN
| DS1340_BIT_CENTURY; | DS1340_BIT_CENTURY;
break; break;
case mcp7941x:
buf[DS1307_REG_SECS] |= MCP7941X_BIT_ST;
buf[DS1307_REG_WDAY] |= MCP7941X_BIT_VBATEN;
break;
default: default:
break; break;
} }
...@@ -808,6 +818,23 @@ static int __devinit ds1307_probe(struct i2c_client *client, ...@@ -808,6 +818,23 @@ static int __devinit ds1307_probe(struct i2c_client *client,
i2c_smbus_write_byte_data(client, DS1340_REG_FLAG, 0); i2c_smbus_write_byte_data(client, DS1340_REG_FLAG, 0);
dev_warn(&client->dev, "SET TIME!\n"); dev_warn(&client->dev, "SET TIME!\n");
} }
break;
case mcp7941x:
/* make sure that the backup battery is enabled */
if (!(ds1307->regs[DS1307_REG_WDAY] & MCP7941X_BIT_VBATEN)) {
i2c_smbus_write_byte_data(client, DS1307_REG_WDAY,
ds1307->regs[DS1307_REG_WDAY]
| MCP7941X_BIT_VBATEN);
}
/* clock halted? turn it on, so clock can tick. */
if (!(tmp & MCP7941X_BIT_ST)) {
i2c_smbus_write_byte_data(client, DS1307_REG_SECS,
MCP7941X_BIT_ST);
dev_warn(&client->dev, "SET TIME!\n");
goto read_rtc;
}
break; break;
case rx_8025: case rx_8025:
case ds_1337: case ds_1337:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment