Re: [PATCH] Input: elan_i2c - Fix regulator enable count imbalance after suspend/resume

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On 1/6/22 07:50, Jingle.Wu wrote:
> Hi Hans/Dmitry:
> 
> It is not OK to skip elan_enable_power() for all Elan touchpad controllers.
> 
> I suggest to deal with this touchpad module ID as "quirk" case to support
> this special case.

There is nothing special / quirky about this, regulator enable imbalances
simply must not happen / must be fixed.

I'll prepare a new version of the patch which adds a parameter to
elan_enable_power() to skip the regulator enable if the regulator
was not disabled on suspend.

This will allow still always calling elan_enable_power() on resume,
while also fixing the regulator imbalance.

Note that this will also help save power, the regulator imbalance
also means that the regulator will no longer get disabled _ever_
after the first suspend/resume cycle where device_may_wakeup()
returns true.

Regards,

Hans




> -----Original Message-----
> From: Dmitry Torokhov [mailto:dmitry.torokhov@xxxxxxxxx] 
> Sent: Tuesday, January 4, 2022 8:30 AM
> To: Hans de Goede <hdegoede@xxxxxxxxxx>
> Cc: Jingle Wu <jingle.wu@xxxxxxxxxx>; linux-input@xxxxxxxxxxxxxxx
> Subject: Re: [PATCH] Input: elan_i2c - Fix regulator enable count imbalance
> after suspend/resume
> 
> Hi Hans,
> 
> On Wed, Dec 22, 2021 at 11:06:41PM +0100, Hans de Goede wrote:
>> Before these changes elan_suspend() would only call 
>> elan_disable_power() when device_may_wakeup() returns false; whereas 
>> elan_resume() would unconditionally call elan_enable_power(), leading 
>> to an enable count imbalance when device_may_wakeup() returns true.
>>
>> This triggers the "WARN_ON(regulator->enable_count)" in 
>> regulator_put() when the elan_i2c driver gets unbound, this happens 
>> e.g. with the hot-plugable dock with Elan I2C touchpad for the Asus TF103C
> 2-in-1.
>>
>> Fix this by making the elan_enable_power() call also be conditional on 
>> device_may_wakeup() returning false.
> 
> elan_enable_power() not only tries to toggle the regulator, but also tries
> to issue command to the controller to power/wake it up. I need confirmation
> from Jingle Wu that skipping this is OK for all Elan touchpad controllers,
> or if we need to add call to either power control or sleep control method to
> make sure the controller it fully resumed.
> 
> Jingle, what can you tell us here?
> 
>>
>> Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx>
>> ---
>>  drivers/input/mouse/elan_i2c_core.c | 14 +++++++-------
>>  1 file changed, 7 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/input/mouse/elan_i2c_core.c 
>> b/drivers/input/mouse/elan_i2c_core.c
>> index 47af62c12267..cdb36d35ffa4 100644
>> --- a/drivers/input/mouse/elan_i2c_core.c
>> +++ b/drivers/input/mouse/elan_i2c_core.c
>> @@ -1412,17 +1412,17 @@ static int __maybe_unused elan_resume(struct
> device *dev)
>>  	struct elan_tp_data *data = i2c_get_clientdata(client);
>>  	int error;
>>  
>> -	if (device_may_wakeup(dev) && data->irq_wake) {
>> +	if (!device_may_wakeup(dev)) {
>> +		error = elan_enable_power(data);
>> +		if (error) {
>> +			dev_err(dev, "power up when resuming failed: %d\n",
> error);
>> +			goto err;
>> +		}
>> +	} else if (data->irq_wake) {
>>  		disable_irq_wake(client->irq);
>>  		data->irq_wake = false;
>>  	}
>>  
>> -	error = elan_enable_power(data);
>> -	if (error) {
>> -		dev_err(dev, "power up when resuming failed: %d\n", error);
>> -		goto err;
>> -	}
>> -
>>  	error = elan_initialize(data, data->quirks &
> ETP_QUIRK_QUICK_WAKEUP);
>>  	if (error)
>>  		dev_err(dev, "initialize when resuming failed: %d\n",
> error);
>> --
>> 2.33.1
>>
> 
> Thanks.
> 




[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux