Commit 278cc2f1 authored by Jiri Kosina's avatar Jiri Kosina

Merge branch 'for-6.5/goodix' into for-linus

- power management reset-during-suspend fix for goodix Chromebook
  devices (Fei Shao)
parents 1639f986 7607f12b
...@@ -43,6 +43,15 @@ properties: ...@@ -43,6 +43,15 @@ properties:
itself as long as it allows the main board to make signals compatible itself as long as it allows the main board to make signals compatible
with what the touchscreen is expecting for its IO rails. with what the touchscreen is expecting for its IO rails.
goodix,no-reset-during-suspend:
description:
Set this to true to enforce the driver to not assert the reset GPIO
during suspend.
Due to potential touchscreen hardware flaw, back-powering could happen in
suspend if the power supply is on and with active-low reset GPIO asserted.
This property is used to avoid the back-powering issue.
type: boolean
required: required:
- compatible - compatible
- reg - reg
......
...@@ -28,6 +28,7 @@ struct i2c_hid_of_goodix { ...@@ -28,6 +28,7 @@ struct i2c_hid_of_goodix {
struct regulator *vdd; struct regulator *vdd;
struct regulator *vddio; struct regulator *vddio;
struct gpio_desc *reset_gpio; struct gpio_desc *reset_gpio;
bool no_reset_during_suspend;
const struct goodix_i2c_hid_timing_data *timings; const struct goodix_i2c_hid_timing_data *timings;
}; };
...@@ -37,6 +38,14 @@ static int goodix_i2c_hid_power_up(struct i2chid_ops *ops) ...@@ -37,6 +38,14 @@ static int goodix_i2c_hid_power_up(struct i2chid_ops *ops)
container_of(ops, struct i2c_hid_of_goodix, ops); container_of(ops, struct i2c_hid_of_goodix, ops);
int ret; int ret;
/*
* We assert reset GPIO here (instead of during power-down) to ensure
* the device will have a clean state after powering up, just like the
* normal scenarios will have.
*/
if (ihid_goodix->no_reset_during_suspend)
gpiod_set_value_cansleep(ihid_goodix->reset_gpio, 1);
ret = regulator_enable(ihid_goodix->vdd); ret = regulator_enable(ihid_goodix->vdd);
if (ret) if (ret)
return ret; return ret;
...@@ -60,7 +69,9 @@ static void goodix_i2c_hid_power_down(struct i2chid_ops *ops) ...@@ -60,7 +69,9 @@ static void goodix_i2c_hid_power_down(struct i2chid_ops *ops)
struct i2c_hid_of_goodix *ihid_goodix = struct i2c_hid_of_goodix *ihid_goodix =
container_of(ops, struct i2c_hid_of_goodix, ops); container_of(ops, struct i2c_hid_of_goodix, ops);
gpiod_set_value_cansleep(ihid_goodix->reset_gpio, 1); if (!ihid_goodix->no_reset_during_suspend)
gpiod_set_value_cansleep(ihid_goodix->reset_gpio, 1);
regulator_disable(ihid_goodix->vddio); regulator_disable(ihid_goodix->vddio);
regulator_disable(ihid_goodix->vdd); regulator_disable(ihid_goodix->vdd);
} }
...@@ -91,6 +102,9 @@ static int i2c_hid_of_goodix_probe(struct i2c_client *client) ...@@ -91,6 +102,9 @@ static int i2c_hid_of_goodix_probe(struct i2c_client *client)
if (IS_ERR(ihid_goodix->vddio)) if (IS_ERR(ihid_goodix->vddio))
return PTR_ERR(ihid_goodix->vddio); return PTR_ERR(ihid_goodix->vddio);
ihid_goodix->no_reset_during_suspend =
of_property_read_bool(client->dev.of_node, "goodix,no-reset-during-suspend");
ihid_goodix->timings = device_get_match_data(&client->dev); ihid_goodix->timings = device_get_match_data(&client->dev);
return i2c_hid_core_probe(client, &ihid_goodix->ops, 0x0001, 0); return i2c_hid_core_probe(client, &ihid_goodix->ops, 0x0001, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment