Skip to content

Commit

Permalink
Input: mms114 - Fix regulator enable and disable paths
Browse files Browse the repository at this point in the history
When it uses regulators the mms114 driver checks to see if it managed to
acquire regulators and ignores errors. This is not the intended usage and
not great style in general.

Since the driver already refuses to probe if it fails to allocate the
regulators simply make the enable and disable calls unconditional and
add appropriate error handling, including adding cleanup of the
regulators if setup_reg() fails.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Joonyoung Shim <jy0922.shim@samsung.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
  • Loading branch information
Mark Brown authored and Dmitry Torokhov committed Mar 11, 2013
1 parent f94352f commit 4b7d293
Showing 1 changed file with 25 additions and 9 deletions.
34 changes: 25 additions & 9 deletions drivers/input/touchscreen/mms114.c
Original file line number Diff line number Diff line change
Expand Up @@ -314,15 +314,27 @@ static int mms114_start(struct mms114_data *data)
struct i2c_client *client = data->client;
int error;

if (data->core_reg)
regulator_enable(data->core_reg);
if (data->io_reg)
regulator_enable(data->io_reg);
error = regulator_enable(data->core_reg);
if (error) {
dev_err(&client->dev, "Failed to enable avdd: %d\n", error);
return error;
}

error = regulator_enable(data->io_reg);
if (error) {
dev_err(&client->dev, "Failed to enable vdd: %d\n", error);
regulator_disable(data->core_reg);
return error;
}

mdelay(MMS114_POWERON_DELAY);

error = mms114_setup_regs(data);
if (error < 0)
if (error < 0) {
regulator_disable(data->io_reg);
regulator_disable(data->core_reg);
return error;
}

if (data->pdata->cfg_pin)
data->pdata->cfg_pin(true);
Expand All @@ -335,16 +347,20 @@ static int mms114_start(struct mms114_data *data)
static void mms114_stop(struct mms114_data *data)
{
struct i2c_client *client = data->client;
int error;

disable_irq(client->irq);

if (data->pdata->cfg_pin)
data->pdata->cfg_pin(false);

if (data->io_reg)
regulator_disable(data->io_reg);
if (data->core_reg)
regulator_disable(data->core_reg);
error = regulator_disable(data->io_reg);
if (error)
dev_warn(&client->dev, "Failed to disable vdd: %d\n", error);

error = regulator_disable(data->core_reg);
if (error)
dev_warn(&client->dev, "Failed to disable avdd: %d\n", error);
}

static int mms114_input_open(struct input_dev *dev)
Expand Down

0 comments on commit 4b7d293

Please sign in to comment.