diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index 7ef74c82d8d3..3fb9abdcdc94 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -378,6 +378,7 @@ struct mxt_data { enum mxt_suspend_mode suspend_mode; bool use_regulator; + bool poweron; struct regulator *reg_vdd; struct regulator *reg_avdd; struct regulator *reg_xvdd; @@ -458,7 +459,7 @@ static int mxt_wait_for_completion(struct mxt_data *data, if (ret < 0) { return ret; } else if (ret == 0) { - dev_err(dev, "Wait for completion timed out.\n"); + dev_dbg(dev, "Wait for completion timed out.\n"); return -ETIMEDOUT; } return 0; @@ -1983,7 +1984,7 @@ static int mxt_regulator_enable(struct mxt_data *data) { int error; - if (!data->use_regulator) + if (!data->use_regulator || data->poweron) return 0; gpiod_set_value(data->reset_gpio, 0); @@ -2015,6 +2016,7 @@ static int mxt_regulator_enable(struct mxt_data *data) gpiod_set_value(data->reset_gpio, 1); mxt_wait_for_completion(data, &data->bl_completion, MXT_POWERON_DELAY); + data->poweron = true; return 0; err_dis_avdd: @@ -2026,10 +2028,15 @@ err_dis_vdd: static void mxt_regulator_disable(struct mxt_data *data) { + if (!data->poweron) + return; + regulator_disable(data->reg_vdd); regulator_disable(data->reg_avdd); if (!IS_ERR(data->reg_xvdd)) regulator_disable(data->reg_xvdd); + + data->poweron = false; } static int mxt_regulator_configure(struct mxt_data *data, bool state) @@ -2994,6 +3001,7 @@ static int mxt_configure_objects(struct mxt_data *data, dev_warn(dev, "No touch object detected\n"); } + disable_irq(data->irq); mxt_debug_init(data); return 0;