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

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

- power management reset-during-suspend fix for goodix Chromebook
  devices (Fei Shao)
parents 1639f986 7607f12b
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -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
+15 −1
Original line number Diff line number Diff line
@@ -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);

	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);