Re: [PATCH V7 2/2] iio: accell: mma8452: add vdd/vddio regulator operation support

2019-01-13 Thread Martin Kepplinger
On 12.01.19 20:11, Jonathan Cameron wrote:
> On Tue, 8 Jan 2019 14:48:48 +
> Anson Huang  wrote:
> 
>> Hi, Martin
>>
>> From Anson's iPhone 6
>>
>>
>>> 在 2019年1月8日,19:41,Martin Kepplinger  写道:
>>>   
 On 08.01.19 10:14, Anson Huang wrote:
 The accelerometer's power supply could be controllable on some
 platforms, such as i.MX6Q-SABRESD board, the mma8451's power supplies
 are controlled by a GPIO fixed regulator, need to make sure the
 regulators are enabled before any communication with mma8451, this
 patch adds vdd/vddio regulator operation support.

 Signed-off-by: Anson Huang 
 Acked-by: Martin Kepplinger 
 ---
 ChangeLog Since V6:
  - separate the error handling of regulators get to make code easy to read.
 ---
 drivers/iio/accel/mma8452.c | 105 
 ++--
 1 file changed, 83 insertions(+), 22 deletions(-)

 diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c
 index 421a0a8..3027811 100644
 --- a/drivers/iio/accel/mma8452.c
 +++ b/drivers/iio/accel/mma8452.c
 @@ -31,6 +31,7 @@
 #include 
 #include 
 #include 
 +#include 

 #define MMA8452_STATUS0x00
 #define  MMA8452_STATUS_DRDY(BIT(2) | BIT(1) | BIT(0))
 @@ -107,6 +108,8 @@ struct mma8452_data {
u8 data_cfg;
const struct mma_chip_info *chip_info;
int sleep_val;
 +struct regulator *vdd_reg;
 +struct regulator *vddio_reg;
 };

  /**
 @@ -1534,9 +1537,39 @@ static int mma8452_probe(struct i2c_client *client,
mutex_init(&data->lock);
data->chip_info = match->data;

 +data->vdd_reg = devm_regulator_get(&client->dev, "vdd");
 +if (IS_ERR(data->vdd_reg)) {
 +if (PTR_ERR(data->vdd_reg) == -EPROBE_DEFER)
 +return -EPROBE_DEFER;
 +
 +dev_err(&client->dev, "failed to get VDD regulator!\n");
 +return PTR_ERR(data->vdd_reg);
 +}
 +
 +data->vddio_reg = devm_regulator_get(&client->dev, "vddio");
 +if (IS_ERR(data->vddio_reg)) {
 +if (PTR_ERR(data->vddio_reg) == -EPROBE_DEFER)
 +return -EPROBE_DEFER;
 +
 +dev_err(&client->dev, "failed to get VDDIO regulator!\n");
 +return PTR_ERR(data->vddio_reg);
 +}
 +
 +ret = regulator_enable(data->vdd_reg);
 +if (ret) {
 +dev_err(&client->dev, "failed to enable VDD regulator!\n");
 +return ret;
 +}
 +
 +ret = regulator_enable(data->vddio_reg);
 +if (ret) {
 +dev_err(&client->dev, "failed to enable VDDIO regulator!\n");
 +goto disable_regulator_vdd;
 +}
 +
ret = i2c_smbus_read_byte_data(client, MMA8452_WHO_AM_I);
if (ret < 0)
 -return ret;
 +goto disable_regulators;

switch (ret) {
case MMA8451_DEVICE_ID:
 @@ -1549,7 +1582,8 @@ static int mma8452_probe(struct i2c_client *client,
break;
/* else: fall through */
default:
 -return -ENODEV;
 +ret = -ENODEV;
 +goto disable_regulators;
}

dev_info(&client->dev, "registering %s accelerometer; ID 0x%x\n",
 @@ -1566,13 +1600,13 @@ static int mma8452_probe(struct i2c_client *client,

ret = mma8452_reset(client);
if (ret < 0)
 -return ret;
 +goto disable_regulators;

data->data_cfg = MMA8452_DATA_CFG_FS_2G;
ret = i2c_smbus_write_byte_data(client, MMA8452_DATA_CFG,
data->data_cfg);
if (ret < 0)
 -return ret;
 +goto disable_regulators;

/*
 * By default set transient threshold to max to avoid events if
 @@ -1581,7 +1615,7 @@ static int mma8452_probe(struct i2c_client *client,
ret = i2c_smbus_write_byte_data(client, MMA8452_TRANSIENT_THS,
MMA8452_TRANSIENT_THS_MASK);
if (ret < 0)
 -return ret;
 +goto disable_regulators;

if (client->irq) {
int irq2;
 @@ -1595,7 +1629,7 @@ static int mma8452_probe(struct i2c_client *client,
MMA8452_CTRL_REG5,
data->chip_info->all_events);
if (ret < 0)
 -return ret;
 +goto disable_regulators;

dev_dbg(&client->dev, "using interrupt line INT1\n");
}
 @@ -1604,11 +1638,11 @@ static int mma8452_probe(struct i2c_client *client,
MMA8452_CTRL_REG4,
data->chip_info->enabled_events);
if (ret < 0)
 -return ret;
 +goto disable_regulators;

ret = mma8452_trigger_setup(indio_dev);
 

Re: [PATCH V7 2/2] iio: accell: mma8452: add vdd/vddio regulator operation support

2019-01-12 Thread Jonathan Cameron
On Tue, 8 Jan 2019 14:48:48 +
Anson Huang  wrote:

> Hi, Martin
> 
> From Anson's iPhone 6
> 
> 
> > 在 2019年1月8日,19:41,Martin Kepplinger  写道:
> >   
> >> On 08.01.19 10:14, Anson Huang wrote:
> >> The accelerometer's power supply could be controllable on some
> >> platforms, such as i.MX6Q-SABRESD board, the mma8451's power supplies
> >> are controlled by a GPIO fixed regulator, need to make sure the
> >> regulators are enabled before any communication with mma8451, this
> >> patch adds vdd/vddio regulator operation support.
> >> 
> >> Signed-off-by: Anson Huang 
> >> Acked-by: Martin Kepplinger 
> >> ---
> >> ChangeLog Since V6:
> >>  - separate the error handling of regulators get to make code easy to read.
> >> ---
> >> drivers/iio/accel/mma8452.c | 105 
> >> ++--
> >> 1 file changed, 83 insertions(+), 22 deletions(-)
> >> 
> >> diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c
> >> index 421a0a8..3027811 100644
> >> --- a/drivers/iio/accel/mma8452.c
> >> +++ b/drivers/iio/accel/mma8452.c
> >> @@ -31,6 +31,7 @@
> >> #include 
> >> #include 
> >> #include 
> >> +#include 
> >> 
> >> #define MMA8452_STATUS0x00
> >> #define  MMA8452_STATUS_DRDY(BIT(2) | BIT(1) | BIT(0))
> >> @@ -107,6 +108,8 @@ struct mma8452_data {
> >>u8 data_cfg;
> >>const struct mma_chip_info *chip_info;
> >>int sleep_val;
> >> +struct regulator *vdd_reg;
> >> +struct regulator *vddio_reg;
> >> };
> >> 
> >>  /**
> >> @@ -1534,9 +1537,39 @@ static int mma8452_probe(struct i2c_client *client,
> >>mutex_init(&data->lock);
> >>data->chip_info = match->data;
> >> 
> >> +data->vdd_reg = devm_regulator_get(&client->dev, "vdd");
> >> +if (IS_ERR(data->vdd_reg)) {
> >> +if (PTR_ERR(data->vdd_reg) == -EPROBE_DEFER)
> >> +return -EPROBE_DEFER;
> >> +
> >> +dev_err(&client->dev, "failed to get VDD regulator!\n");
> >> +return PTR_ERR(data->vdd_reg);
> >> +}
> >> +
> >> +data->vddio_reg = devm_regulator_get(&client->dev, "vddio");
> >> +if (IS_ERR(data->vddio_reg)) {
> >> +if (PTR_ERR(data->vddio_reg) == -EPROBE_DEFER)
> >> +return -EPROBE_DEFER;
> >> +
> >> +dev_err(&client->dev, "failed to get VDDIO regulator!\n");
> >> +return PTR_ERR(data->vddio_reg);
> >> +}
> >> +
> >> +ret = regulator_enable(data->vdd_reg);
> >> +if (ret) {
> >> +dev_err(&client->dev, "failed to enable VDD regulator!\n");
> >> +return ret;
> >> +}
> >> +
> >> +ret = regulator_enable(data->vddio_reg);
> >> +if (ret) {
> >> +dev_err(&client->dev, "failed to enable VDDIO regulator!\n");
> >> +goto disable_regulator_vdd;
> >> +}
> >> +
> >>ret = i2c_smbus_read_byte_data(client, MMA8452_WHO_AM_I);
> >>if (ret < 0)
> >> -return ret;
> >> +goto disable_regulators;
> >> 
> >>switch (ret) {
> >>case MMA8451_DEVICE_ID:
> >> @@ -1549,7 +1582,8 @@ static int mma8452_probe(struct i2c_client *client,
> >>break;
> >>/* else: fall through */
> >>default:
> >> -return -ENODEV;
> >> +ret = -ENODEV;
> >> +goto disable_regulators;
> >>}
> >> 
> >>dev_info(&client->dev, "registering %s accelerometer; ID 0x%x\n",
> >> @@ -1566,13 +1600,13 @@ static int mma8452_probe(struct i2c_client *client,
> >> 
> >>ret = mma8452_reset(client);
> >>if (ret < 0)
> >> -return ret;
> >> +goto disable_regulators;
> >> 
> >>data->data_cfg = MMA8452_DATA_CFG_FS_2G;
> >>ret = i2c_smbus_write_byte_data(client, MMA8452_DATA_CFG,
> >>data->data_cfg);
> >>if (ret < 0)
> >> -return ret;
> >> +goto disable_regulators;
> >> 
> >>/*
> >> * By default set transient threshold to max to avoid events if
> >> @@ -1581,7 +1615,7 @@ static int mma8452_probe(struct i2c_client *client,
> >>ret = i2c_smbus_write_byte_data(client, MMA8452_TRANSIENT_THS,
> >>MMA8452_TRANSIENT_THS_MASK);
> >>if (ret < 0)
> >> -return ret;
> >> +goto disable_regulators;
> >> 
> >>if (client->irq) {
> >>int irq2;
> >> @@ -1595,7 +1629,7 @@ static int mma8452_probe(struct i2c_client *client,
> >>MMA8452_CTRL_REG5,
> >>data->chip_info->all_events);
> >>if (ret < 0)
> >> -return ret;
> >> +goto disable_regulators;
> >> 
> >>dev_dbg(&client->dev, "using interrupt line INT1\n");
> >>}
> >> @@ -1604,11 +1638,11 @@ static int mma8452_probe(struct i2c_client *client,
> >>MMA8452_CTRL_REG4,
> >>data->chip_info->enabled_events);
> >>if (ret < 0)
> >> -return ret;
> >> +goto disable_regulators;
> >> 
> >>ret = mma8452_trigger_setup(indio_dev);
> >>if (ret < 0)
> >> -retu

Re: [PATCH V7 2/2] iio: accell: mma8452: add vdd/vddio regulator operation support

2019-01-08 Thread Anson Huang
Hi, Martin

From Anson's iPhone 6


> 在 2019年1月8日,19:41,Martin Kepplinger  写道:
> 
>> On 08.01.19 10:14, Anson Huang wrote:
>> The accelerometer's power supply could be controllable on some
>> platforms, such as i.MX6Q-SABRESD board, the mma8451's power supplies
>> are controlled by a GPIO fixed regulator, need to make sure the
>> regulators are enabled before any communication with mma8451, this
>> patch adds vdd/vddio regulator operation support.
>> 
>> Signed-off-by: Anson Huang 
>> Acked-by: Martin Kepplinger 
>> ---
>> ChangeLog Since V6:
>>  - separate the error handling of regulators get to make code easy to read.
>> ---
>> drivers/iio/accel/mma8452.c | 105 
>> ++--
>> 1 file changed, 83 insertions(+), 22 deletions(-)
>> 
>> diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c
>> index 421a0a8..3027811 100644
>> --- a/drivers/iio/accel/mma8452.c
>> +++ b/drivers/iio/accel/mma8452.c
>> @@ -31,6 +31,7 @@
>> #include 
>> #include 
>> #include 
>> +#include 
>> 
>> #define MMA8452_STATUS0x00
>> #define  MMA8452_STATUS_DRDY(BIT(2) | BIT(1) | BIT(0))
>> @@ -107,6 +108,8 @@ struct mma8452_data {
>>u8 data_cfg;
>>const struct mma_chip_info *chip_info;
>>int sleep_val;
>> +struct regulator *vdd_reg;
>> +struct regulator *vddio_reg;
>> };
>> 
>>  /**
>> @@ -1534,9 +1537,39 @@ static int mma8452_probe(struct i2c_client *client,
>>mutex_init(&data->lock);
>>data->chip_info = match->data;
>> 
>> +data->vdd_reg = devm_regulator_get(&client->dev, "vdd");
>> +if (IS_ERR(data->vdd_reg)) {
>> +if (PTR_ERR(data->vdd_reg) == -EPROBE_DEFER)
>> +return -EPROBE_DEFER;
>> +
>> +dev_err(&client->dev, "failed to get VDD regulator!\n");
>> +return PTR_ERR(data->vdd_reg);
>> +}
>> +
>> +data->vddio_reg = devm_regulator_get(&client->dev, "vddio");
>> +if (IS_ERR(data->vddio_reg)) {
>> +if (PTR_ERR(data->vddio_reg) == -EPROBE_DEFER)
>> +return -EPROBE_DEFER;
>> +
>> +dev_err(&client->dev, "failed to get VDDIO regulator!\n");
>> +return PTR_ERR(data->vddio_reg);
>> +}
>> +
>> +ret = regulator_enable(data->vdd_reg);
>> +if (ret) {
>> +dev_err(&client->dev, "failed to enable VDD regulator!\n");
>> +return ret;
>> +}
>> +
>> +ret = regulator_enable(data->vddio_reg);
>> +if (ret) {
>> +dev_err(&client->dev, "failed to enable VDDIO regulator!\n");
>> +goto disable_regulator_vdd;
>> +}
>> +
>>ret = i2c_smbus_read_byte_data(client, MMA8452_WHO_AM_I);
>>if (ret < 0)
>> -return ret;
>> +goto disable_regulators;
>> 
>>switch (ret) {
>>case MMA8451_DEVICE_ID:
>> @@ -1549,7 +1582,8 @@ static int mma8452_probe(struct i2c_client *client,
>>break;
>>/* else: fall through */
>>default:
>> -return -ENODEV;
>> +ret = -ENODEV;
>> +goto disable_regulators;
>>}
>> 
>>dev_info(&client->dev, "registering %s accelerometer; ID 0x%x\n",
>> @@ -1566,13 +1600,13 @@ static int mma8452_probe(struct i2c_client *client,
>> 
>>ret = mma8452_reset(client);
>>if (ret < 0)
>> -return ret;
>> +goto disable_regulators;
>> 
>>data->data_cfg = MMA8452_DATA_CFG_FS_2G;
>>ret = i2c_smbus_write_byte_data(client, MMA8452_DATA_CFG,
>>data->data_cfg);
>>if (ret < 0)
>> -return ret;
>> +goto disable_regulators;
>> 
>>/*
>> * By default set transient threshold to max to avoid events if
>> @@ -1581,7 +1615,7 @@ static int mma8452_probe(struct i2c_client *client,
>>ret = i2c_smbus_write_byte_data(client, MMA8452_TRANSIENT_THS,
>>MMA8452_TRANSIENT_THS_MASK);
>>if (ret < 0)
>> -return ret;
>> +goto disable_regulators;
>> 
>>if (client->irq) {
>>int irq2;
>> @@ -1595,7 +1629,7 @@ static int mma8452_probe(struct i2c_client *client,
>>MMA8452_CTRL_REG5,
>>data->chip_info->all_events);
>>if (ret < 0)
>> -return ret;
>> +goto disable_regulators;
>> 
>>dev_dbg(&client->dev, "using interrupt line INT1\n");
>>}
>> @@ -1604,11 +1638,11 @@ static int mma8452_probe(struct i2c_client *client,
>>MMA8452_CTRL_REG4,
>>data->chip_info->enabled_events);
>>if (ret < 0)
>> -return ret;
>> +goto disable_regulators;
>> 
>>ret = mma8452_trigger_setup(indio_dev);
>>if (ret < 0)
>> -return ret;
>> +goto disable_regulators;
>>}
>> 
>>data->ctrl_reg1 = MMA8452_CTRL_ACTIVE |
>> @@ -1661,12 +1695,19 @@ static int mma8452_probe(struct i2c_client *client,
>> trigger_cleanup:
>>mma8452_trigger_cleanup(indio_dev);
>> 
>> +disable_regulators:
>> +regulator_disable(data->vddio_reg);
>> +
>> +disable_

Re: [PATCH V7 2/2] iio: accell: mma8452: add vdd/vddio regulator operation support

2019-01-08 Thread Martin Kepplinger
On 08.01.19 10:14, Anson Huang wrote:
> The accelerometer's power supply could be controllable on some
> platforms, such as i.MX6Q-SABRESD board, the mma8451's power supplies
> are controlled by a GPIO fixed regulator, need to make sure the
> regulators are enabled before any communication with mma8451, this
> patch adds vdd/vddio regulator operation support.
> 
> Signed-off-by: Anson Huang 
> Acked-by: Martin Kepplinger 
> ---
> ChangeLog Since V6:
>   - separate the error handling of regulators get to make code easy to read.
> ---
>  drivers/iio/accel/mma8452.c | 105 
> ++--
>  1 file changed, 83 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c
> index 421a0a8..3027811 100644
> --- a/drivers/iio/accel/mma8452.c
> +++ b/drivers/iio/accel/mma8452.c
> @@ -31,6 +31,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  
>  #define MMA8452_STATUS   0x00
>  #define  MMA8452_STATUS_DRDY (BIT(2) | BIT(1) | BIT(0))
> @@ -107,6 +108,8 @@ struct mma8452_data {
>   u8 data_cfg;
>   const struct mma_chip_info *chip_info;
>   int sleep_val;
> + struct regulator *vdd_reg;
> + struct regulator *vddio_reg;
>  };
>  
>   /**
> @@ -1534,9 +1537,39 @@ static int mma8452_probe(struct i2c_client *client,
>   mutex_init(&data->lock);
>   data->chip_info = match->data;
>  
> + data->vdd_reg = devm_regulator_get(&client->dev, "vdd");
> + if (IS_ERR(data->vdd_reg)) {
> + if (PTR_ERR(data->vdd_reg) == -EPROBE_DEFER)
> + return -EPROBE_DEFER;
> +
> + dev_err(&client->dev, "failed to get VDD regulator!\n");
> + return PTR_ERR(data->vdd_reg);
> + }
> +
> + data->vddio_reg = devm_regulator_get(&client->dev, "vddio");
> + if (IS_ERR(data->vddio_reg)) {
> + if (PTR_ERR(data->vddio_reg) == -EPROBE_DEFER)
> + return -EPROBE_DEFER;
> +
> + dev_err(&client->dev, "failed to get VDDIO regulator!\n");
> + return PTR_ERR(data->vddio_reg);
> + }
> +
> + ret = regulator_enable(data->vdd_reg);
> + if (ret) {
> + dev_err(&client->dev, "failed to enable VDD regulator!\n");
> + return ret;
> + }
> +
> + ret = regulator_enable(data->vddio_reg);
> + if (ret) {
> + dev_err(&client->dev, "failed to enable VDDIO regulator!\n");
> + goto disable_regulator_vdd;
> + }
> +
>   ret = i2c_smbus_read_byte_data(client, MMA8452_WHO_AM_I);
>   if (ret < 0)
> - return ret;
> + goto disable_regulators;
>  
>   switch (ret) {
>   case MMA8451_DEVICE_ID:
> @@ -1549,7 +1582,8 @@ static int mma8452_probe(struct i2c_client *client,
>   break;
>   /* else: fall through */
>   default:
> - return -ENODEV;
> + ret = -ENODEV;
> + goto disable_regulators;
>   }
>  
>   dev_info(&client->dev, "registering %s accelerometer; ID 0x%x\n",
> @@ -1566,13 +1600,13 @@ static int mma8452_probe(struct i2c_client *client,
>  
>   ret = mma8452_reset(client);
>   if (ret < 0)
> - return ret;
> + goto disable_regulators;
>  
>   data->data_cfg = MMA8452_DATA_CFG_FS_2G;
>   ret = i2c_smbus_write_byte_data(client, MMA8452_DATA_CFG,
>   data->data_cfg);
>   if (ret < 0)
> - return ret;
> + goto disable_regulators;
>  
>   /*
>* By default set transient threshold to max to avoid events if
> @@ -1581,7 +1615,7 @@ static int mma8452_probe(struct i2c_client *client,
>   ret = i2c_smbus_write_byte_data(client, MMA8452_TRANSIENT_THS,
>   MMA8452_TRANSIENT_THS_MASK);
>   if (ret < 0)
> - return ret;
> + goto disable_regulators;
>  
>   if (client->irq) {
>   int irq2;
> @@ -1595,7 +1629,7 @@ static int mma8452_probe(struct i2c_client *client,
>   MMA8452_CTRL_REG5,
>   data->chip_info->all_events);
>   if (ret < 0)
> - return ret;
> + goto disable_regulators;
>  
>   dev_dbg(&client->dev, "using interrupt line INT1\n");
>   }
> @@ -1604,11 +1638,11 @@ static int mma8452_probe(struct i2c_client *client,
>   MMA8452_CTRL_REG4,
>   data->chip_info->enabled_events);
>   if (ret < 0)
> - return ret;
> + goto disable_regulators;
>  
>   ret = mma8452_trigger_setup(indio_dev);
>   if (ret < 0)
> - return ret;
> + goto disable_regulators;
>  

[PATCH V7 2/2] iio: accell: mma8452: add vdd/vddio regulator operation support

2019-01-08 Thread Anson Huang
The accelerometer's power supply could be controllable on some
platforms, such as i.MX6Q-SABRESD board, the mma8451's power supplies
are controlled by a GPIO fixed regulator, need to make sure the
regulators are enabled before any communication with mma8451, this
patch adds vdd/vddio regulator operation support.

Signed-off-by: Anson Huang 
Acked-by: Martin Kepplinger 
---
ChangeLog Since V6:
  - separate the error handling of regulators get to make code easy to read.
---
 drivers/iio/accel/mma8452.c | 105 ++--
 1 file changed, 83 insertions(+), 22 deletions(-)

diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c
index 421a0a8..3027811 100644
--- a/drivers/iio/accel/mma8452.c
+++ b/drivers/iio/accel/mma8452.c
@@ -31,6 +31,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #define MMA8452_STATUS 0x00
 #define  MMA8452_STATUS_DRDY   (BIT(2) | BIT(1) | BIT(0))
@@ -107,6 +108,8 @@ struct mma8452_data {
u8 data_cfg;
const struct mma_chip_info *chip_info;
int sleep_val;
+   struct regulator *vdd_reg;
+   struct regulator *vddio_reg;
 };
 
  /**
@@ -1534,9 +1537,39 @@ static int mma8452_probe(struct i2c_client *client,
mutex_init(&data->lock);
data->chip_info = match->data;
 
+   data->vdd_reg = devm_regulator_get(&client->dev, "vdd");
+   if (IS_ERR(data->vdd_reg)) {
+   if (PTR_ERR(data->vdd_reg) == -EPROBE_DEFER)
+   return -EPROBE_DEFER;
+
+   dev_err(&client->dev, "failed to get VDD regulator!\n");
+   return PTR_ERR(data->vdd_reg);
+   }
+
+   data->vddio_reg = devm_regulator_get(&client->dev, "vddio");
+   if (IS_ERR(data->vddio_reg)) {
+   if (PTR_ERR(data->vddio_reg) == -EPROBE_DEFER)
+   return -EPROBE_DEFER;
+
+   dev_err(&client->dev, "failed to get VDDIO regulator!\n");
+   return PTR_ERR(data->vddio_reg);
+   }
+
+   ret = regulator_enable(data->vdd_reg);
+   if (ret) {
+   dev_err(&client->dev, "failed to enable VDD regulator!\n");
+   return ret;
+   }
+
+   ret = regulator_enable(data->vddio_reg);
+   if (ret) {
+   dev_err(&client->dev, "failed to enable VDDIO regulator!\n");
+   goto disable_regulator_vdd;
+   }
+
ret = i2c_smbus_read_byte_data(client, MMA8452_WHO_AM_I);
if (ret < 0)
-   return ret;
+   goto disable_regulators;
 
switch (ret) {
case MMA8451_DEVICE_ID:
@@ -1549,7 +1582,8 @@ static int mma8452_probe(struct i2c_client *client,
break;
/* else: fall through */
default:
-   return -ENODEV;
+   ret = -ENODEV;
+   goto disable_regulators;
}
 
dev_info(&client->dev, "registering %s accelerometer; ID 0x%x\n",
@@ -1566,13 +1600,13 @@ static int mma8452_probe(struct i2c_client *client,
 
ret = mma8452_reset(client);
if (ret < 0)
-   return ret;
+   goto disable_regulators;
 
data->data_cfg = MMA8452_DATA_CFG_FS_2G;
ret = i2c_smbus_write_byte_data(client, MMA8452_DATA_CFG,
data->data_cfg);
if (ret < 0)
-   return ret;
+   goto disable_regulators;
 
/*
 * By default set transient threshold to max to avoid events if
@@ -1581,7 +1615,7 @@ static int mma8452_probe(struct i2c_client *client,
ret = i2c_smbus_write_byte_data(client, MMA8452_TRANSIENT_THS,
MMA8452_TRANSIENT_THS_MASK);
if (ret < 0)
-   return ret;
+   goto disable_regulators;
 
if (client->irq) {
int irq2;
@@ -1595,7 +1629,7 @@ static int mma8452_probe(struct i2c_client *client,
MMA8452_CTRL_REG5,
data->chip_info->all_events);
if (ret < 0)
-   return ret;
+   goto disable_regulators;
 
dev_dbg(&client->dev, "using interrupt line INT1\n");
}
@@ -1604,11 +1638,11 @@ static int mma8452_probe(struct i2c_client *client,
MMA8452_CTRL_REG4,
data->chip_info->enabled_events);
if (ret < 0)
-   return ret;
+   goto disable_regulators;
 
ret = mma8452_trigger_setup(indio_dev);
if (ret < 0)
-   return ret;
+   goto disable_regulators;
}
 
data->ctrl_reg1 = MMA8452_CTRL_ACTIVE |
@@ -1661,12 +1695,19 @@ static int mma8452_probe(struct i2c_client *client,
 trigger_cleanup