mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 08:19:28 +00:00
Merge branch 'for-6.5/goodix' into for-linus
- power management reset-during-suspend fix for goodix Chromebook devices (Fei Shao)
This commit is contained in:
commit
278cc2f13d
2 changed files with 24 additions and 1 deletions
|
@ -43,6 +43,15 @@ properties:
|
|||
itself as long as it allows the main board to make signals compatible
|
||||
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:
|
||||
- compatible
|
||||
- reg
|
||||
|
|
|
@ -28,6 +28,7 @@ struct i2c_hid_of_goodix {
|
|||
struct regulator *vdd;
|
||||
struct regulator *vddio;
|
||||
struct gpio_desc *reset_gpio;
|
||||
bool no_reset_during_suspend;
|
||||
const struct goodix_i2c_hid_timing_data *timings;
|
||||
};
|
||||
|
||||
|
@ -37,6 +38,14 @@ static int goodix_i2c_hid_power_up(struct i2chid_ops *ops)
|
|||
container_of(ops, struct i2c_hid_of_goodix, ops);
|
||||
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);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -60,7 +69,9 @@ static void goodix_i2c_hid_power_down(struct i2chid_ops *ops)
|
|||
struct i2c_hid_of_goodix *ihid_goodix =
|
||||
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->vdd);
|
||||
}
|
||||
|
@ -91,6 +102,9 @@ static int i2c_hid_of_goodix_probe(struct i2c_client *client)
|
|||
if (IS_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);
|
||||
|
||||
return i2c_hid_core_probe(client, &ihid_goodix->ops, 0x0001, 0);
|
||||
|
|
Loading…
Reference in a new issue