* Misc fixes of Mark A. Greers's stm_combined patch --- drivers/i2c/chips/Kconfig | 2 +- drivers/i2c/chips/m41txx.c | 45 +++++++++++++++++++++++++------------------- include/linux/m41txx.h | 34 +++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 20 deletions(-) diff --git a/drivers/i2c/chips/Kconfig b/drivers/i2c/chips/Kconfig index 4a26fb4..8fa3840 100644 --- a/drivers/i2c/chips/Kconfig +++ b/drivers/i2c/chips/Kconfig @@ -134,6 +134,6 @@ config RTC_M41TXX_I2C of I2C RTC chips. This driver can also be built as a module. If so, the module - will be called m41t00. + will be called m41txx. endmenu diff --git a/drivers/i2c/chips/m41txx.c b/drivers/i2c/chips/m41txx.c index 82ada1f..97564a1 100644 --- a/drivers/i2c/chips/m41txx.c +++ b/drivers/i2c/chips/m41txx.c @@ -124,12 +124,12 @@ m41txx_get_rtc_time(void) mon &= 0x1f; year &= 0xff; - BCD_TO_BIN(sec); - BCD_TO_BIN(min); - BCD_TO_BIN(hour); - BCD_TO_BIN(day); - BCD_TO_BIN(mon); - BCD_TO_BIN(year); + sec = BCD2BIN(sec); + min = BCD2BIN(min); + hour = BCD2BIN(hour); + day = BCD2BIN(day); + mon = BCD2BIN(mon); + year = BCD2BIN(year); year += 1900; if (year < 1970) @@ -148,12 +148,12 @@ m41txx_set(void *arg) to_tm(nowtime, &tm); tm.tm_year = (tm.tm_year - 1900) % 100; - BIN_TO_BCD(tm.tm_sec); - BIN_TO_BCD(tm.tm_min); - BIN_TO_BCD(tm.tm_hour); - BIN_TO_BCD(tm.tm_mday); - BIN_TO_BCD(tm.tm_mon); - BIN_TO_BCD(tm.tm_year); + tm.tm_sec = BIN2BCD(tm.tm_sec); + tm.tm_min = BIN2BCD(tm.tm_min); + tm.tm_hour = BIN2BCD(tm.tm_hour); + tm.tm_mday = BIN2BCD(tm.tm_mday); + tm.tm_mon = BIN2BCD(tm.tm_mon); + tm.tm_year = BIN2BCD(tm.tm_year); down(&m41txx_mutex); @@ -259,14 +259,21 @@ m41txx_probe(struct i2c_adapter *adap, i if ((rc = i2c_attach_client(client)) != 0) goto probe_err; - /* Sst SQW frequency & enable */ - if ((m41txx_chip->type != M41TXX_TYPE_M41T00) && m41txx_chip->sqw_freq - && ((rc = i2c_smbus_read_byte_data(client, - m41txx_chip->alarm_mon)) >= 0) + /* Set SQW frequency & enable */ + if ((m41txx_chip->type != M41TXX_TYPE_M41T00)) { + if (m41txx_chip->sqw_freq + && ((rc = i2c_smbus_read_byte_data(client, + m41txx_chip->alarm_mon)) >= 0) && !(rc & 0x40) && !(i2c_smbus_write_byte_data( - client,m41txx_chip->sqw,m41txx_chip->sqw_freq))) - i2c_smbus_write_byte_data(client, m41txx_chip->alarm_mon, - rc | 0x40); + client,m41txx_chip->sqw, m41txx_chip->sqw_freq))) + i2c_smbus_write_byte_data(client, m41txx_chip->alarm_mon, + rc | 0x40); + /* Reset HT (Halt Update) flag, if it set */ + if ( ((rc = i2c_smbus_read_byte_data(client, + m41txx_chip->alarm_hour)) >= 0) && (rc & 0x40)) + i2c_smbus_write_byte_data(client, m41txx_chip->alarm_hour, + rc & ~0x40); + } /* Make sure oscillator is running (i.e., clear 'ST' bit in sec reg) */ if (((rc = i2c_smbus_read_byte_data(client, m41txx_chip->sec)) < 0) diff --git a/include/linux/m41txx.h b/include/linux/m41txx.h index 31a40d2..8176721 100644 --- a/include/linux/m41txx.h +++ b/include/linux/m41txx.h @@ -25,4 +25,38 @@ struct m41txx_platform_data { u32 sqw_freq; }; +/* SQW output disabled, this is default value by power on*/ +#define SQW_FREQ_DISABLE (0) + +/* 32.768 KHz */ +#define SQW_FREQ_32KHZ (1<<4) +/* 8.192 KHz */ +#define SQW_FREQ_8KHZ (2<<4) +/* 4.096 KHz */ +#define SQW_FREQ_4KHZ (3<<4) +/* 2.048 KHz */ +#define SQW_FREQ_2KHZ (4<<4) +/* 1.024 KHz */ +#define SQW_FREQ_1KHZ (5<<4) +/* 512 Hz */ +#define SQW_FREQ_512HZ (6<<4) +/* 256 Hz */ +#define SQW_FREQ_256HZ (7<<4) +/* 128 Hz */ +#define SQW_FREQ_128HZ (8<<4) +/* 64 Hz */ +#define SQW_FREQ_64HZ (9<<4) +/* 32 Hz */ +#define SQW_FREQ_32HZ (10<<4) +/* 16 Hz */ +#define SQW_FREQ_16HZ (11<<4) +/* 8 Hz */ +#define SQW_FREQ_8HZ (12<<4) +/* 4 Hz */ +#define SQW_FREQ_4HZ (13<<4) +/* 2 Hz */ +#define SQW_FREQ_2HZ (14<<4) +/* 1 Hz */ +#define SQW_FREQ_1HZ (15<<4) + #endif /* _M41TXX_H */