Commit cb5a07f1 authored by Alexandru Ardelean's avatar Alexandru Ardelean Committed by Jonathan Cameron

iio: imu: adis: protect initial startup routine with state lock

The initial startup routine is called by some ADIS drivers during probe,
and before registering with IIO. Normally, userspace should not be able to
do any access to the device (as there shouldn't be any available).

This change extends the state lock to the entire initial-startup routine.
Behaviourally nothing should change, but this should make the library
function a bit more robust.
Signed-off-by: default avatarAlexandru Ardelean <alexandru.ardelean@analog.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 762ab093
...@@ -331,7 +331,7 @@ static int adis_self_test(struct adis *adis) ...@@ -331,7 +331,7 @@ static int adis_self_test(struct adis *adis)
{ {
int ret; int ret;
ret = adis_write_reg_16(adis, adis->data->msc_ctrl_reg, ret = __adis_write_reg_16(adis, adis->data->msc_ctrl_reg,
adis->data->self_test_mask); adis->data->self_test_mask);
if (ret) { if (ret) {
dev_err(&adis->spi->dev, "Failed to initiate self test: %d\n", dev_err(&adis->spi->dev, "Failed to initiate self test: %d\n",
...@@ -341,10 +341,10 @@ static int adis_self_test(struct adis *adis) ...@@ -341,10 +341,10 @@ static int adis_self_test(struct adis *adis)
msleep(adis->data->startup_delay); msleep(adis->data->startup_delay);
ret = adis_check_status(adis); ret = __adis_check_status(adis);
if (adis->data->self_test_no_autoclear) if (adis->data->self_test_no_autoclear)
adis_write_reg_16(adis, adis->data->msc_ctrl_reg, 0x00); __adis_write_reg_16(adis, adis->data->msc_ctrl_reg, 0x00);
return ret; return ret;
} }
...@@ -362,19 +362,23 @@ int adis_initial_startup(struct adis *adis) ...@@ -362,19 +362,23 @@ int adis_initial_startup(struct adis *adis)
{ {
int ret; int ret;
mutex_lock(&adis->state_lock);
ret = adis_self_test(adis); ret = adis_self_test(adis);
if (ret) { if (ret) {
dev_err(&adis->spi->dev, "Self-test failed, trying reset.\n"); dev_err(&adis->spi->dev, "Self-test failed, trying reset.\n");
adis_reset(adis); __adis_reset(adis);
msleep(adis->data->startup_delay); msleep(adis->data->startup_delay);
ret = adis_self_test(adis); ret = adis_self_test(adis);
if (ret) { if (ret) {
dev_err(&adis->spi->dev, "Second self-test failed, giving up.\n"); dev_err(&adis->spi->dev, "Second self-test failed, giving up.\n");
return ret; goto out_unlock;
} }
} }
return 0; out_unlock:
mutex_unlock(&adis->state_lock);
return ret;
} }
EXPORT_SYMBOL_GPL(adis_initial_startup); EXPORT_SYMBOL_GPL(adis_initial_startup);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment