[U-Boot] [PATCH v2 1/2] dm: core: device: switch off power domain after device removal

Peng Fan peng.fan at nxp.com
Mon Jul 15 02:59:22 UTC 2019


> Subject: [PATCH v2 1/2] dm: core: device: switch off power domain after
> device removal
> 
> The power domain associated with a device is enabled when probing, but
> currently the domain remains enabled when the device is removed.
> Some boards started to disable power domains for selected devices via
> custom board_quiesce_devices(), but it doesn't work in many cases, i. e.
> because devices still can be accessed later in
> .remove() callback on behalf of dm_remove_devices_flags().
> 
> Utilize the DM core to power off the device power domain, but add a device
> flag to be able to selectively let the power domain enabled after device
> removal. This might be required for devices that must remain enabled when
> booting OS, i. e. serial console for debug output, etc.
> 
> Signed-off-by: Anatolij Gustschin <agust at denx.de>
> ---
> Changes in v2:
>  - use CONFIG_IS_ENABLED(POWER_DOMAIN) to reduce code size
> 
>  drivers/core/device-remove.c | 9 +++++++++
>  include/dm/device.h          | 6 ++++++
>  2 files changed, 15 insertions(+)
> 
> diff --git a/drivers/core/device-remove.c b/drivers/core/device-remove.c
> index 586fadee0a..abed84a652 100644
> --- a/drivers/core/device-remove.c
> +++ b/drivers/core/device-remove.c
> @@ -16,6 +16,7 @@
>  #include <dm/uclass.h>
>  #include <dm/uclass-internal.h>
>  #include <dm/util.h>
> +#include <power-domain.h>
> 
>  int device_chld_unbind(struct udevice *dev, struct driver *drv)  { @@
> -154,6 +155,7 @@ static bool flags_remove(uint flags, uint drv_flags)
> 
>  int device_remove(struct udevice *dev, uint flags)  {
> +	struct power_domain pd;
>  	const struct driver *drv;
>  	int ret;
> 
> @@ -192,6 +194,13 @@ int device_remove(struct udevice *dev, uint flags)
>  		}
>  	}
> 
> +	if (CONFIG_IS_ENABLED(POWER_DOMAIN) && dev->parent &&
> +	    device_get_uclass_id(dev) != UCLASS_POWER_DOMAIN &&
> +	    !(dev->flags & DM_FLAG_REMOVE_WITH_PD_ON)) {
> +		if (!power_domain_get(dev, &pd))
> +			power_domain_off(&pd);
> +	}
> +
>  	if (flags_remove(flags, drv->flags)) {
>  		device_free(dev);
> 
> diff --git a/include/dm/device.h b/include/dm/device.h index
> 27a6d7b9fd..9a98a4a39e 100644
> --- a/include/dm/device.h
> +++ b/include/dm/device.h
> @@ -61,6 +61,12 @@ struct driver_info;
>   */
>  #define DM_FLAG_OS_PREPARE		(1 << 10)
> 
> +/*
> + * Device is removed without switching off its power domain. This might
> + * be required, i. e. for serial console (debug) output when booting OS.
> + */
> +#define DM_FLAG_REMOVE_WITH_PD_ON	(1 << 11)
> +
>  /*
>   * One or multiple of these flags are passed to device_remove() so that
>   * a selective device removal as specified by the remove-stage and the

Reviewed-by: Peng Fan <peng.fan at nxp.com>

> --
> 2.17.1



More information about the U-Boot mailing list