Hello Paweł,

I would suggest dropping sentence punctuation in the patch subject line:

Input: atmel_mxt_ts: Add support for optional regulators.

More below...

On Tue, Jul 31, 2018 at 05:18:09PM +0200, Paweł Chmiel wrote:
> This patch adds optional regulators, which can be used to power
> up touchscreen. After enabling regulators, we need to wait 150msec.
> This value is taken from official driver.
> 
> It was tested on Samsung Galaxy i9000 (based on Samsung S5PV210 SOC).
> 
> Signed-off-by: Paweł Chmiel <pawel.mikolaj.chm...@gmail.com>
> ---
> Changes from v2:
>   - Move code enabling regulators into separate method,
>     to make code more readable.
> 
> Changes from v1:
>   - Enable regulators only if reset_gpio is present.
>   - Switch from devm_regulator_get_optional to devm_regulator_get
> ---
>  drivers/input/touchscreen/atmel_mxt_ts.c | 65 
> +++++++++++++++++++++++++++++---
>  1 file changed, 59 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c 
> b/drivers/input/touchscreen/atmel_mxt_ts.c
> index 54fe190fd4bc..2cd7f6db6ba9 100644
> --- a/drivers/input/touchscreen/atmel_mxt_ts.c
> +++ b/drivers/input/touchscreen/atmel_mxt_ts.c
> @@ -27,6 +27,7 @@
>  #include <linux/interrupt.h>
>  #include <linux/of.h>
>  #include <linux/property.h>
> +#include <linux/regulator/consumer.h>
>  #include <linux/slab.h>
>  #include <linux/gpio/consumer.h>
>  #include <linux/property.h>
> @@ -194,10 +195,10 @@ enum t100_type {
>  
>  /* Delay times */
>  #define MXT_BACKUP_TIME              50      /* msec */
> -#define MXT_RESET_GPIO_TIME  20      /* msec */
>  #define MXT_RESET_INVALID_CHG        100     /* msec */
>  #define MXT_RESET_TIME               200     /* msec */
>  #define MXT_RESET_TIMEOUT    3000    /* msec */
> +#define MXT_REGULATOR_DELAY  150     /* msec */
>  #define MXT_CRC_TIMEOUT              1000    /* msec */
>  #define MXT_FW_RESET_TIME    3000    /* msec */
>  #define MXT_FW_CHG_TIMEOUT   300     /* msec */
> @@ -310,6 +311,8 @@ struct mxt_data {
>       struct t7_config t7_cfg;
>       struct mxt_dbg dbg;
>       struct gpio_desc *reset_gpio;
> +     struct regulator *vdd_reg;
> +     struct regulator *avdd_reg;
>  
>       /* Cached parameters from object table */
>       u16 T5_address;
> @@ -3016,6 +3019,38 @@ static const struct dmi_system_id 
> chromebook_T9_suspend_dmi[] = {
>       { }
>  };
>  
> +static int mxt_regulator_enable(struct mxt_data *data)
> +{
> +     int error;
> +
> +     if (data->reset_gpio) {
> +             error = regulator_enable(data->vdd_reg);
> +             if (error) {
> +                     dev_err(&data->client->dev, "Failed to enable vdd 
> regulator: %d\n",
> +                             error);
> +                     return error;
> +             }
> +
> +             error = regulator_enable(data->avdd_reg);
> +             if (error) {
> +                     dev_err(&data->client->dev, "Failed to enable avdd 
> regulator: %d\n",
> +                             error);
> +                     return error;
> +             }
> +
> +             /*
> +              * According to maXTouch power sequencing specification, RESET 
> line

Please fix the following checkpatch issue:

drivers/input/touchscreen/atmel_mxt_ts.c:3065: WARNING:LONG_LINE_COMMENT: line 
over 80 characters

Thanks!

--
Regards,
George

> +              * must be kept low until some time after regulators come up to
> +              * voltage
> +              */
> +             msleep(MXT_REGULATOR_DELAY);
> +             gpiod_set_value(data->reset_gpio, 1);
> +             msleep(MXT_RESET_INVALID_CHG);
> +     }
> +
> +     return 0;
> +}
> +
>  static int mxt_probe(struct i2c_client *client, const struct i2c_device_id 
> *id)
>  {
>       struct mxt_data *data;
> @@ -3076,6 +3111,22 @@ static int mxt_probe(struct i2c_client *client, const 
> struct i2c_device_id *id)
>               return error;
>       }
>  
> +     data->vdd_reg = devm_regulator_get(&client->dev, "vdd");
> +     if (IS_ERR(data->vdd_reg)) {
> +             error = PTR_ERR(data->vdd_reg);
> +             dev_err(&client->dev, "Failed to get vdd regulator: %d\n",
> +                     error);
> +             return error;
> +     }
> +
> +     data->avdd_reg = devm_regulator_get(&client->dev, "avdd");
> +     if (IS_ERR(data->avdd_reg)) {
> +             error = PTR_ERR(data->avdd_reg);
> +             dev_err(&client->dev, "Failed to get avdd regulator: %d\n",
> +                     error);
> +             return error;
> +     }
> +
>       error = devm_request_threaded_irq(&client->dev, client->irq,
>                                         NULL, mxt_interrupt, IRQF_ONESHOT,
>                                         client->name, data);
> @@ -3086,11 +3137,9 @@ static int mxt_probe(struct i2c_client *client, const 
> struct i2c_device_id *id)
>  
>       disable_irq(client->irq);
>  
> -     if (data->reset_gpio) {
> -             msleep(MXT_RESET_GPIO_TIME);
> -             gpiod_set_value(data->reset_gpio, 1);
> -             msleep(MXT_RESET_INVALID_CHG);
> -     }
> +     error = mxt_regulator_enable(data);
> +     if (error)
> +             return error;
>  
>       error = mxt_initialize(data);
>       if (error)
> @@ -3116,6 +3165,10 @@ static int mxt_remove(struct i2c_client *client)
>       struct mxt_data *data = i2c_get_clientdata(client);
>  
>       disable_irq(data->irq);
> +     if (data->reset_gpio) {
> +             regulator_disable(data->avdd_reg);
> +             regulator_disable(data->vdd_reg);
> +     }
>       sysfs_remove_group(&client->dev.kobj, &mxt_attr_group);
>       mxt_free_input_device(data);
>       mxt_free_object_table(data);
> -- 
> 2.7.4
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-ker...@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

Reply via email to