diff options
Diffstat (limited to 'drivers/sensor')
-rw-r--r-- | drivers/sensor/lsm330dlc_accel.c | 30 | ||||
-rw-r--r-- | drivers/sensor/sensors_core.c | 1 |
2 files changed, 23 insertions, 8 deletions
diff --git a/drivers/sensor/lsm330dlc_accel.c b/drivers/sensor/lsm330dlc_accel.c index 5f228c7..430ef85 100644 --- a/drivers/sensor/lsm330dlc_accel.c +++ b/drivers/sensor/lsm330dlc_accel.c @@ -1045,15 +1045,25 @@ static int lsm330dlc_accel_probe(struct i2c_client *client, { struct lsm330dlc_accel_data *data; struct accel_platform_data *pdata; - int err = 0; + int err = 0, retry; + int probe_retry_max = 3; accel_dbgmsg("is started\n"); - if (!i2c_check_functionality(client->adapter, - I2C_FUNC_SMBUS_WRITE_BYTE_DATA | - I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { - pr_err("%s: i2c functionality check failed!\n", __func__); - err = -ENODEV; - goto exit; +probe_retry: + for (retry = 0; retry < 5; retry++) { + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_WRITE_BYTE_DATA | + I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { + pr_err("%s: i2c functionality failed!\n", __func__); + + if (retry == 4) { + err = -ENODEV; + goto exit; + } + i2c_smbus_write_byte_data(client, CTRL_REG1, PM_OFF); + mdelay(2); + } else + break; } data = kzalloc(sizeof(struct lsm330dlc_accel_data), GFP_KERNEL); @@ -1315,6 +1325,12 @@ err_misc_register: err_read_reg: kfree(data); exit: + if (probe_retry_max > 0) { + pr_err("%s: Failed to probe..(%d try left)\n", + __func__, probe_retry_max); + probe_retry_max--; + goto probe_retry; + } return err; } diff --git a/drivers/sensor/sensors_core.c b/drivers/sensor/sensors_core.c index e003652..1813b99 100644 --- a/drivers/sensor/sensors_core.c +++ b/drivers/sensor/sensors_core.c @@ -26,7 +26,6 @@ struct class *sensors_class; * sensors_classdev_register - create new sensor device in sensors_class. * @dev: The device to register. */ - static void set_sensor_attr(struct device *dev, struct device_attribute *attributes[]) { |