diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index 4e815679238..d2a88794517 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -1364,6 +1364,12 @@ static void mxt_input_close(struct input_dev *dev) } +static int reg_set_optimum_mode_check(struct regulator *reg, int load_uA) +{ + return (regulator_count_voltages(reg) > 0) ? + regulator_set_optimum_mode(reg, load_uA) : 0; +} + static int mxt_power_on(struct mxt_data *data, bool on) { int rc; @@ -1371,7 +1377,7 @@ static int mxt_power_on(struct mxt_data *data, bool on) if (on == false) goto power_off; - rc = regulator_set_optimum_mode(data->vcc_ana, MXT_ACTIVE_LOAD_UA); + rc = reg_set_optimum_mode_check(data->vcc_ana, MXT_ACTIVE_LOAD_UA); if (rc < 0) { dev_err(&data->client->dev, "Regulator vcc_ana set_opt failed rc=%d\n", rc); @@ -1386,8 +1392,8 @@ static int mxt_power_on(struct mxt_data *data, bool on) } if (data->pdata->digital_pwr_regulator) { - rc = regulator_set_optimum_mode(data->vcc_dig, - MXT_ACTIVE_LOAD_DIG_UA); + rc = reg_set_optimum_mode_check(data->vcc_dig, + MXT_ACTIVE_LOAD_DIG_UA); if (rc < 0) { dev_err(&data->client->dev, "Regulator vcc_dig set_opt failed rc=%d\n", @@ -1404,7 +1410,7 @@ static int mxt_power_on(struct mxt_data *data, bool on) } if (data->pdata->i2c_pull_up) { - rc = regulator_set_optimum_mode(data->vcc_i2c, MXT_I2C_LOAD_UA); + rc = reg_set_optimum_mode_check(data->vcc_i2c, MXT_I2C_LOAD_UA); if (rc < 0) { dev_err(&data->client->dev, "Regulator vcc_i2c set_opt failed rc=%d\n", rc); @@ -1425,28 +1431,28 @@ static int mxt_power_on(struct mxt_data *data, bool on) error_reg_en_vcc_i2c: if (data->pdata->i2c_pull_up) - regulator_set_optimum_mode(data->vcc_i2c, 0); + reg_set_optimum_mode_check(data->vcc_i2c, 0); error_reg_opt_i2c: if (data->pdata->digital_pwr_regulator) regulator_disable(data->vcc_dig); error_reg_en_vcc_dig: if (data->pdata->digital_pwr_regulator) - regulator_set_optimum_mode(data->vcc_dig, 0); + reg_set_optimum_mode_check(data->vcc_dig, 0); error_reg_opt_vcc_dig: regulator_disable(data->vcc_ana); error_reg_en_vcc_ana: - regulator_set_optimum_mode(data->vcc_ana, 0); + reg_set_optimum_mode_check(data->vcc_ana, 0); return rc; power_off: - regulator_set_optimum_mode(data->vcc_ana, 0); + reg_set_optimum_mode_check(data->vcc_ana, 0); regulator_disable(data->vcc_ana); if (data->pdata->digital_pwr_regulator) { - regulator_set_optimum_mode(data->vcc_dig, 0); + reg_set_optimum_mode_check(data->vcc_dig, 0); regulator_disable(data->vcc_dig); } if (data->pdata->i2c_pull_up) { - regulator_set_optimum_mode(data->vcc_i2c, 0); + reg_set_optimum_mode_check(data->vcc_i2c, 0); regulator_disable(data->vcc_i2c); } msleep(50); @@ -1562,7 +1568,7 @@ static int mxt_regulator_lpm(struct mxt_data *data, bool on) if (on == false) goto regulator_hpm; - rc = regulator_set_optimum_mode(data->vcc_ana, MXT_LPM_LOAD_UA); + rc = reg_set_optimum_mode_check(data->vcc_ana, MXT_LPM_LOAD_UA); if (rc < 0) { dev_err(&data->client->dev, "Regulator vcc_ana set_opt failed rc=%d\n", rc); @@ -1570,7 +1576,7 @@ static int mxt_regulator_lpm(struct mxt_data *data, bool on) } if (data->pdata->digital_pwr_regulator) { - rc = regulator_set_optimum_mode(data->vcc_dig, + rc = reg_set_optimum_mode_check(data->vcc_dig, MXT_LPM_LOAD_DIG_UA); if (rc < 0) { dev_err(&data->client->dev, @@ -1580,7 +1586,7 @@ static int mxt_regulator_lpm(struct mxt_data *data, bool on) } if (data->pdata->i2c_pull_up) { - rc = regulator_set_optimum_mode(data->vcc_i2c, + rc = reg_set_optimum_mode_check(data->vcc_i2c, MXT_I2C_LPM_LOAD_UA); if (rc < 0) { dev_err(&data->client->dev, @@ -1593,7 +1599,7 @@ static int mxt_regulator_lpm(struct mxt_data *data, bool on) regulator_hpm: - rc = regulator_set_optimum_mode(data->vcc_ana, MXT_ACTIVE_LOAD_UA); + rc = reg_set_optimum_mode_check(data->vcc_ana, MXT_ACTIVE_LOAD_UA); if (rc < 0) { dev_err(&data->client->dev, "Regulator vcc_ana set_opt failed rc=%d\n", rc); @@ -1601,7 +1607,7 @@ regulator_hpm: } if (data->pdata->digital_pwr_regulator) { - rc = regulator_set_optimum_mode(data->vcc_dig, + rc = reg_set_optimum_mode_check(data->vcc_dig, MXT_ACTIVE_LOAD_DIG_UA); if (rc < 0) { dev_err(&data->client->dev, @@ -1611,7 +1617,7 @@ regulator_hpm: } if (data->pdata->i2c_pull_up) { - rc = regulator_set_optimum_mode(data->vcc_i2c, MXT_I2C_LOAD_UA); + rc = reg_set_optimum_mode_check(data->vcc_i2c, MXT_I2C_LOAD_UA); if (rc < 0) { dev_err(&data->client->dev, "Regulator vcc_i2c set_opt failed rc=%d\n", rc); @@ -1622,21 +1628,21 @@ regulator_hpm: return 0; fail_regulator_lpm: - regulator_set_optimum_mode(data->vcc_ana, MXT_ACTIVE_LOAD_UA); + reg_set_optimum_mode_check(data->vcc_ana, MXT_ACTIVE_LOAD_UA); if (data->pdata->digital_pwr_regulator) - regulator_set_optimum_mode(data->vcc_dig, - MXT_ACTIVE_LOAD_DIG_UA); + reg_set_optimum_mode_check(data->vcc_dig, + MXT_ACTIVE_LOAD_DIG_UA); if (data->pdata->i2c_pull_up) - regulator_set_optimum_mode(data->vcc_i2c, MXT_I2C_LOAD_UA); + reg_set_optimum_mode_check(data->vcc_i2c, MXT_I2C_LOAD_UA); return rc; fail_regulator_hpm: - regulator_set_optimum_mode(data->vcc_ana, MXT_LPM_LOAD_UA); + reg_set_optimum_mode_check(data->vcc_ana, MXT_LPM_LOAD_UA); if (data->pdata->digital_pwr_regulator) - regulator_set_optimum_mode(data->vcc_dig, MXT_LPM_LOAD_DIG_UA); + reg_set_optimum_mode_check(data->vcc_dig, MXT_LPM_LOAD_DIG_UA); if (data->pdata->i2c_pull_up) - regulator_set_optimum_mode(data->vcc_i2c, MXT_I2C_LPM_LOAD_UA); + reg_set_optimum_mode_check(data->vcc_i2c, MXT_I2C_LPM_LOAD_UA); return rc; }