*/
 
 #include <linux/bcd.h>
+#include <linux/clk.h>
 #include <linux/i2c.h>
 #include <linux/module.h>
 #include <linux/of_device.h>
        return 0;
 }
 
+static int isl1208_set_xtoscb(struct i2c_client *client, int sr, int xtosb_val)
+{
+       /* Do nothing if bit is already set to desired value */
+       if ((sr & ISL1208_REG_SR_XTOSCB) == xtosb_val)
+               return 0;
+
+       if (xtosb_val)
+               sr |= ISL1208_REG_SR_XTOSCB;
+       else
+               sr &= ~ISL1208_REG_SR_XTOSCB;
+
+       return i2c_smbus_write_byte_data(client, ISL1208_REG_SR, sr);
+}
+
 static int
 isl1208_i2c_get_sr(struct i2c_client *client)
 {
        return 0;
 }
 
-
 static int
 isl1208_rtc_set_time(struct device *dev, struct rtc_time *tm)
 {
        return rc;
 }
 
+static int
+isl1208_clk_present(struct i2c_client *client, const char *name)
+{
+       struct clk *clk;
+
+       clk = devm_clk_get_optional(&client->dev, name);
+       if (IS_ERR(clk))
+               return PTR_ERR(clk);
+
+       return !!clk;
+}
+
 static int
 isl1208_probe(struct i2c_client *client)
 {
-       int rc = 0;
        struct isl1208_state *isl1208;
        int evdet_irq = -1;
+       int xtosb_val = 0;
+       int rc = 0;
+       int sr;
 
        if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
                return -ENODEV;
                isl1208->config = (struct isl1208_config *)id->driver_data;
        }
 
+       rc = isl1208_clk_present(client, "xin");
+       if (rc < 0)
+               return rc;
+
+       if (!rc) {
+               rc = isl1208_clk_present(client, "clkin");
+               if (rc < 0)
+                       return rc;
+
+               if (rc)
+                       xtosb_val = 1;
+       }
+
        isl1208->rtc = devm_rtc_allocate_device(&client->dev);
        if (IS_ERR(isl1208->rtc))
                return PTR_ERR(isl1208->rtc);
        isl1208->nvmem_config.size = isl1208->config->nvmem_length;
        isl1208->nvmem_config.priv = isl1208;
 
-       rc = isl1208_i2c_get_sr(client);
-       if (rc < 0) {
+       sr = isl1208_i2c_get_sr(client);
+       if (sr < 0) {
                dev_err(&client->dev, "reading status failed\n");
-               return rc;
+               return sr;
        }
 
-       if (rc & ISL1208_REG_SR_RTCF)
+       rc = isl1208_set_xtoscb(client, sr, xtosb_val);
+       if (rc)
+               return rc;
+
+       if (sr & ISL1208_REG_SR_RTCF)
                dev_warn(&client->dev, "rtc power failure detected, "
                         "please set clock.\n");