@@ -355,6 +355,7 @@ static int da9063_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct da9063 *da9063;
+ unsigned int busmode;
int ret;
da9063 = devm_kzalloc(&i2c->dev, sizeof(struct da9063), GFP_KERNEL);
@@ -442,6 +443,20 @@ static int da9063_i2c_probe(struct i2c_client *i2c,
return ret;
}
+ if (i2c_check_functionality(i2c->adapter, I2C_FUNC_I2C)) {
+ dev_info(da9063->dev, "I2C mode");
+ busmode = 0;
+ } else {
+ dev_info(da9063->dev, "SMBus mode");
+ busmode = DA9063_TWOWIRE_TO;
+ }
+ ret = regmap_update_bits(da9063->regmap, DA9063_REG_CONFIG_J,
+ DA9063_TWOWIRE_TO, busmode);
+ if (ret < 0) {
+ dev_err(da9063->dev, "Failed to set 2-wire bus mode.\n");
+ return -EIO;
+ }
+
return da9063_device_init(da9063, i2c->irq);
}
@@ -1037,6 +1037,9 @@
#define DA9063_NONKEY_PIN_AUTODOWN 0x02
#define DA9063_NONKEY_PIN_AUTOFLPRT 0x03
+/* DA9063_REG_CONFIG_J (addr=0x10F) */
+#define DA9063_TWOWIRE_TO 0x40
+
/* DA9063_REG_MON_REG_5 (addr=0x116) */
#define DA9063_MON_A8_IDX_MASK 0x07
#define DA9063_MON_A8_IDX_NONE 0x00