@@ -28,6 +28,7 @@ struct i2c_hid_of_goodix {
28
28
struct regulator * vdd ;
29
29
struct regulator * vddio ;
30
30
struct gpio_desc * reset_gpio ;
31
+ bool no_reset_during_suspend ;
31
32
const struct goodix_i2c_hid_timing_data * timings ;
32
33
};
33
34
@@ -37,6 +38,14 @@ static int goodix_i2c_hid_power_up(struct i2chid_ops *ops)
37
38
container_of (ops , struct i2c_hid_of_goodix , ops );
38
39
int ret ;
39
40
41
+ /*
42
+ * We assert reset GPIO here (instead of during power-down) to ensure
43
+ * the device will have a clean state after powering up, just like the
44
+ * normal scenarios will have.
45
+ */
46
+ if (ihid_goodix -> no_reset_during_suspend )
47
+ gpiod_set_value_cansleep (ihid_goodix -> reset_gpio , 1 );
48
+
40
49
ret = regulator_enable (ihid_goodix -> vdd );
41
50
if (ret )
42
51
return ret ;
@@ -60,7 +69,9 @@ static void goodix_i2c_hid_power_down(struct i2chid_ops *ops)
60
69
struct i2c_hid_of_goodix * ihid_goodix =
61
70
container_of (ops , struct i2c_hid_of_goodix , ops );
62
71
63
- gpiod_set_value_cansleep (ihid_goodix -> reset_gpio , 1 );
72
+ if (!ihid_goodix -> no_reset_during_suspend )
73
+ gpiod_set_value_cansleep (ihid_goodix -> reset_gpio , 1 );
74
+
64
75
regulator_disable (ihid_goodix -> vddio );
65
76
regulator_disable (ihid_goodix -> vdd );
66
77
}
@@ -91,6 +102,9 @@ static int i2c_hid_of_goodix_probe(struct i2c_client *client)
91
102
if (IS_ERR (ihid_goodix -> vddio ))
92
103
return PTR_ERR (ihid_goodix -> vddio );
93
104
105
+ ihid_goodix -> no_reset_during_suspend =
106
+ of_property_read_bool (client -> dev .of_node , "goodix,no-reset-during-suspend" );
107
+
94
108
ihid_goodix -> timings = device_get_match_data (& client -> dev );
95
109
96
110
return i2c_hid_core_probe (client , & ihid_goodix -> ops , 0x0001 , 0 );
0 commit comments