Re: [PATCH 1/3] platform/x86: x86-android-tablets: Unregister devices in reverse order

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

 



Hi All,

I've added patch 1/3 and 2/3 of this series to my review-hans
(soon to be for-next) branch now.

I'll send out a v2 of patch 3/3 to address the review comments.

Regards,

Hans



On 4/6/24 2:50 PM, Hans de Goede wrote:
> Not all subsystems support a device getting removed while there are
> still consumers of the device with a reference to the device.
> 
> One example of this is the regulator subsystem. If a regulator gets
> unregistered while there are still drivers holding a reference
> a WARN() at drivers/regulator/core.c:5829 triggers, e.g.:
> 
>  WARNING: CPU: 1 PID: 1587 at drivers/regulator/core.c:5829 regulator_unregister
>  Hardware name: Intel Corp. VALLEYVIEW C0 PLATFORM/BYT-T FFD8, BIOS BLADE_21.X64.0005.R00.1504101516 FFD8_X64_R_2015_04_10_1516 04/10/2015
>  RIP: 0010:regulator_unregister
>  Call Trace:
>   <TASK>
>   regulator_unregister
>   devres_release_group
>   i2c_device_remove
>   device_release_driver_internal
>   bus_remove_device
>   device_del
>   device_unregister
>   x86_android_tablet_remove
> 
> On the Lenovo Yoga Tablet 2 series the bq24190 charger chip also provides
> a 5V boost converter output for powering USB devices connected to the micro
> USB port, the bq24190-charger driver exports this as a Vbus regulator.
> 
> On the 830 (8") and 1050 ("10") models this regulator is controlled by
> a platform_device and x86_android_tablet_remove() removes platform_device-s
> before i2c_clients so the consumer gets removed first.
> 
> But on the 1380 (13") model there is a lc824206xa micro-USB switch
> connected over I2C and the extcon driver for that controls the regulator.
> The bq24190 i2c-client *must* be registered first, because that creates
> the regulator with the lc824206xa listed as its consumer. If the regulator
> has not been registered yet the lc824206xa driver will end up getting
> a dummy regulator.
> 
> Since in this case both the regulator provider and consumer are I2C
> devices, the only way to ensure that the consumer is unregistered first
> is to unregister the I2C devices in reverse order of in which they were
> created.
> 
> For consistency and to avoid similar problems in the future change
> x86_android_tablet_remove() to unregister all device types in reverse
> order.
> 
> Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx>
> ---
>  drivers/platform/x86/x86-android-tablets/core.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/platform/x86/x86-android-tablets/core.c b/drivers/platform/x86/x86-android-tablets/core.c
> index a3415f1c0b5f..6559bb4ea730 100644
> --- a/drivers/platform/x86/x86-android-tablets/core.c
> +++ b/drivers/platform/x86/x86-android-tablets/core.c
> @@ -278,25 +278,25 @@ static void x86_android_tablet_remove(struct platform_device *pdev)
>  {
>  	int i;
>  
> -	for (i = 0; i < serdev_count; i++) {
> +	for (i = serdev_count - 1; i >= 0; i--) {
>  		if (serdevs[i])
>  			serdev_device_remove(serdevs[i]);
>  	}
>  
>  	kfree(serdevs);
>  
> -	for (i = 0; i < pdev_count; i++)
> +	for (i = pdev_count - 1; i >= 0; i--)
>  		platform_device_unregister(pdevs[i]);
>  
>  	kfree(pdevs);
>  	kfree(buttons);
>  
> -	for (i = 0; i < spi_dev_count; i++)
> +	for (i = spi_dev_count - 1; i >= 0; i--)
>  		spi_unregister_device(spi_devs[i]);
>  
>  	kfree(spi_devs);
>  
> -	for (i = 0; i < i2c_client_count; i++)
> +	for (i = i2c_client_count - 1; i >= 0; i--)
>  		i2c_unregister_device(i2c_clients[i]);
>  
>  	kfree(i2c_clients);





[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux