diff --git a/drivers/rtc/rtc-m41t80.c b/drivers/rtc/rtc-m41t80.c
index 60fe266..9ac82b1 100644
--- a/drivers/rtc/rtc-m41t80.c
+++ b/drivers/rtc/rtc-m41t80.c
@@ -66,6 +66,8 @@
  #define M41T80_FEATURE_WD	(1 << 3)	/* Extra watchdog resolution */
  #define M41T80_FEATURE_SQ_ALT	(1 << 4)	/* RSx bits are in reg 4 */

+#define M41T80_DEFAULT_TIME	1262304000	/* 2010-01-01 00:00:00 UTC */
+
  #define DRV_VERSION "0.05"

  static const struct i2c_device_id m41t80_id[] = {
@@ -121,7 +123,7 @@ static int m41t80_get_datetime(struct i2c_client *client,

  	/* assume 20YY not 19YY, and ignore the Century Bit */
  	tm->tm_year = bcd2bin(buf[M41T80_REG_YEAR]) + 100;
-	return 0;
+	return rtc_valid_tm(tm);
  }

  /* Sets the given date and time to the real time clock. */
@@ -364,7 +366,7 @@ static int m41t80_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *t)
  	t->time.tm_isdst = -1;
  	t->enabled = !!(reg[M41T80_REG_ALARM_MON] & M41T80_ALMON_AFE);
  	t->pending = !!(reg[M41T80_REG_FLAGS] & M41T80_FLAGS_AF);
-	return 0;
+	return rtc_valid_tm((struct rtc_time *)t);
  }

  static struct rtc_class_ops m41t80_rtc_ops = {
@@ -806,21 +808,50 @@ static int m41t80_probe(struct i2c_client *client,

  	if (rc & M41T80_ALHOUR_HT) {
  		if (clientdata->features & M41T80_FEATURE_HT) {
-			m41t80_get_datetime(client, &tm);
  			dev_info(&client->dev, "HT bit was set!\n");
-			dev_info(&client->dev,
-				 "Power Down at "
-				 "%04i-%02i-%02i %02i:%02i:%02i\n",
-				 tm.tm_year + 1900,
-				 tm.tm_mon + 1, tm.tm_mday, tm.tm_hour,
-				 tm.tm_min, tm.tm_sec);
+
+			/* Show power down time only if it is valid */
+			if (m41t80_get_datetime(client, &tm) == 0) {
+				dev_info(&client->dev,
+					"Power Down at "
+					"%04i-%02i-%02i %02i:%02i:%02i\n",
+					tm.tm_year + 1900,
+					tm.tm_mon + 1, tm.tm_mday, tm.tm_hour,
+					tm.tm_min, tm.tm_sec);
+			}
  		}
+		/* Clear the HT bit */
  		if (i2c_smbus_write_byte_data(client,
  					      M41T80_REG_ALARM_HOUR,
  					      rc & ~M41T80_ALHOUR_HT) < 0)
  			goto ht_err;
  	}

+	/*
+	 * check if RTC time is valid, if it is not valid, set it to known
+	 * default. The check is done here to make sure HT bit is
+	 * already checked and cleared before time is set.
+	 */
+	if (m41t80_get_datetime(client, &tm) != 0) {
+		dev_err(&client->dev,
+			"Invalid date %04i-%02i-%02i %02i:%02i:%02i\n",
+			tm.tm_year + 1900,
+			tm.tm_mon + 1, tm.tm_mday, tm.tm_hour,
+			tm.tm_min, tm.tm_sec);
+
+		rtc_time_to_tm(M41T80_DEFAULT_TIME, &tm);
+
+		dev_err(&client->dev,
+			"Date defaulted to %04i-%02i-%02i %02i:%02i:%02i\n",
+			tm.tm_year + 1900,
+			tm.tm_mon + 1, tm.tm_mday, tm.tm_hour,
+			tm.tm_min, tm.tm_sec);
+
+		if (m41t80_set_datetime(client, &tm) != 0) {
+			goto exit;
+		}
+	}
+
  	/* Make sure ST (stop) bit is cleared */
  	rc = i2c_smbus_read_byte_data(client, M41T80_REG_SEC);
  	if (rc < 0)
