[U-Boot] [PATCH v2 1/2] dm: core: device: switch off power domain after device removal
Lokesh Vutla
lokeshvutla at ti.com
Tue Jul 23 14:05:43 UTC 2019
On 15/07/19 1:27 AM, Anatolij Gustschin wrote:
> 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)) {
This is going to hit every board and all serial drivers needs to be updated. Can
we add an extra check here for (dev != gd->cur_serial_dev).
Thanks and regards,
Lokesh
> + 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
>
More information about the U-Boot
mailing list