[PATCH 1/2] soc: mediatek: Add regulator control for MT8192 MFG power domain

Hsin-Yi Wang hsinyi at chromium.org
Mon Jan 11 02:07:35 EST 2021


On Mon, Jan 4, 2021 at 10:44 AM Weiyi Lu <weiyi.lu at mediatek.com> wrote:
>
> Add regulator control support and specific power domain name of
> MT8192 MFG power domain for regulator lookup.
> Also power domain name can fix the debugfs warning.
> (e.g. debugfs: Directory 'power-domain' with parent 'pm_genpd'
> already present!)
> However, not every domain with name need to get the regulator,
> if we just want to fix the debugfs warning log by adding names to
> power domains. Considering this case, lookup regulator by
> regulator_get_optional() instead of getting a dummy regulator from
> regulator_get() to operate.
>
Hi,

sorry I didn't notice this patch before. I sent out a similar patch
for this problem here:
https://patchwork.kernel.org/project/linux-mediatek/cover/20210107104915.2888408-1-hsinyi@chromium.org/

The difference is that
1) we store the requirement for quirks in caps instead of name.
2) regulators are under power-domain nodes instead of mfg devices in dts.

> Signed-off-by: Weiyi Lu <weiyi.lu at mediatek.com>
> ---
>  drivers/soc/mediatek/mt8192-pm-domains.h |  1 +
>  drivers/soc/mediatek/mtk-pm-domains.c    | 42 ++++++++++++++++++++++++++++++--
>  drivers/soc/mediatek/mtk-pm-domains.h    |  2 ++
>  3 files changed, 43 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/soc/mediatek/mt8192-pm-domains.h b/drivers/soc/mediatek/mt8192-pm-domains.h
> index 0fdf6dc..7db0ad3 100644
> --- a/drivers/soc/mediatek/mt8192-pm-domains.h
> +++ b/drivers/soc/mediatek/mt8192-pm-domains.h
> @@ -49,6 +49,7 @@
>                 .ctl_offs = 0x0308,
>                 .sram_pdn_bits = GENMASK(8, 8),
>                 .sram_pdn_ack_bits = GENMASK(12, 12),
> +               .name = "mfg",
>         },
>         [MT8192_POWER_DOMAIN_MFG1] = {
>                 .sta_mask = BIT(3),
> diff --git a/drivers/soc/mediatek/mtk-pm-domains.c b/drivers/soc/mediatek/mtk-pm-domains.c
> index fb70cb3..a160800 100644
> --- a/drivers/soc/mediatek/mtk-pm-domains.c
> +++ b/drivers/soc/mediatek/mtk-pm-domains.c
> @@ -13,6 +13,7 @@
>  #include <linux/platform_device.h>
>  #include <linux/pm_domain.h>
>  #include <linux/regmap.h>
> +#include <linux/regulator/consumer.h>
>  #include <linux/soc/mediatek/infracfg.h>
>
>  #include "mt8173-pm-domains.h"
> @@ -40,6 +41,7 @@ struct scpsys_domain {
>         struct clk_bulk_data *subsys_clks;
>         struct regmap *infracfg;
>         struct regmap *smi;
> +       struct regulator *supply;
>  };
>
>  struct scpsys {
> @@ -187,6 +189,22 @@ static int scpsys_bus_protect_disable(struct scpsys_domain *pd)
>         return _scpsys_bus_protect_disable(pd->data->bp_infracfg, pd->infracfg);
>  }
>
> +static int scpsys_regulator_enable(struct scpsys_domain *pd)
> +{
> +       if (!pd->supply)
> +               return 0;
> +
> +       return regulator_enable(pd->supply);
> +}
> +
> +static int scpsys_regulator_disable(struct scpsys_domain *pd)
> +{
> +       if (!pd->supply)
> +               return 0;
> +
> +       return regulator_disable(pd->supply);
> +}
> +
>  static int scpsys_power_on(struct generic_pm_domain *genpd)
>  {
>         struct scpsys_domain *pd = container_of(genpd, struct scpsys_domain, genpd);
> @@ -194,9 +212,13 @@ static int scpsys_power_on(struct generic_pm_domain *genpd)
>         bool tmp;
>         int ret;
>
> +       ret = scpsys_regulator_enable(pd);
> +       if (ret < 0)
> +               return ret;
> +
>         ret = clk_bulk_enable(pd->num_clks, pd->clks);
>         if (ret)
> -               return ret;
> +               goto err_disable_regulator;
>
>         /* subsys power on */
>         regmap_set_bits(scpsys->base, pd->data->ctl_offs, PWR_ON_BIT);
> @@ -232,6 +254,8 @@ static int scpsys_power_on(struct generic_pm_domain *genpd)
>         clk_bulk_disable(pd->num_subsys_clks, pd->subsys_clks);
>  err_pwr_ack:
>         clk_bulk_disable(pd->num_clks, pd->clks);
> +err_disable_regulator:
> +       scpsys_regulator_disable(pd);
>         return ret;
>  }
>
> @@ -267,6 +291,10 @@ static int scpsys_power_off(struct generic_pm_domain *genpd)
>
>         clk_bulk_disable(pd->num_clks, pd->clks);
>
> +       ret = scpsys_regulator_disable(pd);
> +       if (ret < 0)
> +               return ret;
> +
>         return 0;
>  }
>
> @@ -315,6 +343,16 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys *scpsys, struct device_no
>         if (IS_ERR(pd->smi))
>                 return ERR_CAST(pd->smi);
>
> +       if (pd->data->name) {
> +               pd->supply = devm_regulator_get_optional(scpsys->dev, pd->data->name);
> +               if (IS_ERR(pd->supply)) {
> +                       if (PTR_ERR(pd->supply) == -ENODEV)
> +                               pd->supply = NULL;
> +                       else
> +                               return ERR_CAST(pd->supply);
> +               }
> +       }
> +
>         num_clks = of_clk_get_parent_count(node);
>         if (num_clks > 0) {
>                 /* Calculate number of subsys_clks */
> @@ -397,7 +435,7 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys *scpsys, struct device_no
>                 goto err_unprepare_subsys_clocks;
>         }
>
> -       pd->genpd.name = node->name;
> +       pd->genpd.name = pd->data->name ?: node->name;
>         pd->genpd.power_off = scpsys_power_off;
>         pd->genpd.power_on = scpsys_power_on;
>
> diff --git a/drivers/soc/mediatek/mtk-pm-domains.h b/drivers/soc/mediatek/mtk-pm-domains.h
> index a2f4d8f..58d72fb 100644
> --- a/drivers/soc/mediatek/mtk-pm-domains.h
> +++ b/drivers/soc/mediatek/mtk-pm-domains.h
> @@ -81,6 +81,7 @@ struct scpsys_bus_prot_data {
>   * @caps: The flag for active wake-up action.
>   * @bp_infracfg: bus protection for infracfg subsystem
>   * @bp_smi: bus protection for smi subsystem
> + * @name: specific power domain name for regulator lookup and debugfs
>   */
>  struct scpsys_domain_data {
>         u32 sta_mask;
> @@ -90,6 +91,7 @@ struct scpsys_domain_data {
>         u8 caps;
>         const struct scpsys_bus_prot_data bp_infracfg[SPM_MAX_BUS_PROT_DATA];
>         const struct scpsys_bus_prot_data bp_smi[SPM_MAX_BUS_PROT_DATA];
> +       char *name;
>  };
>
>  struct scpsys_soc_data {



More information about the linux-arm-kernel mailing list