On 5/6/22 16:18, Patrice CHOTARD wrote:
> Hi Patrick
> 
> On 4/26/22 14:37, Patrick Delaunay wrote:
>> Add the counter of the PLL user n_pll_cons managed by the 2 functions
>> stm32_usbphyc_pll_enable / stm32_usbphyc_pll_disable.
>>
>> This counter allow to remove the function stm32_usbphyc_is_init
>> and it is a preliminary step for ck_usbo_48m introduction.
>>
>> Signed-off-by: Patrick Delaunay <patrick.delau...@foss.st.com>
>> ---
>>
>>  drivers/phy/phy-stm32-usbphyc.c | 76 +++++++++++++++++++++------------
>>  1 file changed, 48 insertions(+), 28 deletions(-)
>>
>> diff --git a/drivers/phy/phy-stm32-usbphyc.c 
>> b/drivers/phy/phy-stm32-usbphyc.c
>> index 9c1dcfae52..16c8799eca 100644
>> --- a/drivers/phy/phy-stm32-usbphyc.c
>> +++ b/drivers/phy/phy-stm32-usbphyc.c
>> @@ -65,6 +65,7 @@ struct stm32_usbphyc {
>>              bool init;
>>              bool powered;
>>      } phys[MAX_PHYS];
>> +    int n_pll_cons;
>>  };
>>  
>>  static void stm32_usbphyc_get_pll_params(u32 clk_rate,
>> @@ -124,18 +125,6 @@ static int stm32_usbphyc_pll_init(struct stm32_usbphyc 
>> *usbphyc)
>>      return 0;
>>  }
>>  
>> -static bool stm32_usbphyc_is_init(struct stm32_usbphyc *usbphyc)
>> -{
>> -    int i;
>> -
>> -    for (i = 0; i < MAX_PHYS; i++) {
>> -            if (usbphyc->phys[i].init)
>> -                    return true;
>> -    }
>> -
>> -    return false;
>> -}
>> -
>>  static bool stm32_usbphyc_is_powered(struct stm32_usbphyc *usbphyc)
>>  {
>>      int i;
>> @@ -148,18 +137,17 @@ static bool stm32_usbphyc_is_powered(struct 
>> stm32_usbphyc *usbphyc)
>>      return false;
>>  }
>>  
>> -static int stm32_usbphyc_phy_init(struct phy *phy)
>> +static int stm32_usbphyc_pll_enable(struct stm32_usbphyc *usbphyc)
>>  {
>> -    struct stm32_usbphyc *usbphyc = dev_get_priv(phy->dev);
>> -    struct stm32_usbphyc_phy *usbphyc_phy = usbphyc->phys + phy->id;
>>      bool pllen = readl(usbphyc->base + STM32_USBPHYC_PLL) & PLLEN ?
>>                   true : false;
>>      int ret;
>>  
>> -    dev_dbg(phy->dev, "phy ID = %lu\n", phy->id);
>> -    /* Check if one phy port has already configured the pll */
>> -    if (pllen && stm32_usbphyc_is_init(usbphyc))
>> -            goto initialized;
>> +    /* Check if one consumer has already configured the pll */
>> +    if (pllen && usbphyc->n_pll_cons) {
>> +            usbphyc->n_pll_cons++;
>> +            return 0;
>> +    }
>>  
>>      if (usbphyc->vdda1v1) {
>>              ret = regulator_set_enable(usbphyc->vdda1v1, true);
>> @@ -190,23 +178,19 @@ static int stm32_usbphyc_phy_init(struct phy *phy)
>>      if (!(readl(usbphyc->base + STM32_USBPHYC_PLL) & PLLEN))
>>              return -EIO;
>>  
>> -initialized:
>> -    usbphyc_phy->init = true;
>> +    usbphyc->n_pll_cons++;
>>  
>>      return 0;
>>  }
>>  
>> -static int stm32_usbphyc_phy_exit(struct phy *phy)
>> +static int stm32_usbphyc_pll_disable(struct stm32_usbphyc *usbphyc)
>>  {
>> -    struct stm32_usbphyc *usbphyc = dev_get_priv(phy->dev);
>> -    struct stm32_usbphyc_phy *usbphyc_phy = usbphyc->phys + phy->id;
>>      int ret;
>>  
>> -    dev_dbg(phy->dev, "phy ID = %lu\n", phy->id);
>> -    usbphyc_phy->init = false;
>> +    usbphyc->n_pll_cons--;
>>  
>> -    /* Check if other phy port requires pllen */
>> -    if (stm32_usbphyc_is_init(usbphyc))
>> +    /* Check if other consumer requires pllen */
>> +    if (usbphyc->n_pll_cons)
>>              return 0;
>>  
>>      clrbits_le32(usbphyc->base + STM32_USBPHYC_PLL, PLLEN);
>> @@ -235,6 +219,42 @@ static int stm32_usbphyc_phy_exit(struct phy *phy)
>>      return 0;
>>  }
>>  
>> +static int stm32_usbphyc_phy_init(struct phy *phy)
>> +{
>> +    struct stm32_usbphyc *usbphyc = dev_get_priv(phy->dev);
>> +    struct stm32_usbphyc_phy *usbphyc_phy = usbphyc->phys + phy->id;
>> +    int ret;
>> +
>> +    dev_dbg(phy->dev, "phy ID = %lu\n", phy->id);
>> +    if (usbphyc_phy->init)
>> +            return 0;
>> +
>> +    ret = stm32_usbphyc_pll_enable(usbphyc);
>> +    if (ret)
>> +            return log_ret(ret);
>> +
>> +    usbphyc_phy->init = true;
>> +
>> +    return 0;
>> +}
>> +
>> +static int stm32_usbphyc_phy_exit(struct phy *phy)
>> +{
>> +    struct stm32_usbphyc *usbphyc = dev_get_priv(phy->dev);
>> +    struct stm32_usbphyc_phy *usbphyc_phy = usbphyc->phys + phy->id;
>> +    int ret;
>> +
>> +    dev_dbg(phy->dev, "phy ID = %lu\n", phy->id);
>> +    if (!usbphyc_phy->init)
>> +            return 0;
>> +
>> +    ret = stm32_usbphyc_pll_disable(usbphyc);
>> +
>> +    usbphyc_phy->init = false;
>> +
>> +    return log_ret(ret);
>> +}
>> +
>>  static int stm32_usbphyc_phy_power_on(struct phy *phy)
>>  {
>>      struct stm32_usbphyc *usbphyc = dev_get_priv(phy->dev);
> Reviewed-by: Patrice Chotard <patrice.chot...@foss.st.com>
> 
> Thanks
> Patrice
> _______________________________________________
> Uboot-stm32 mailing list
> uboot-st...@st-md-mailman.stormreply.com
> https://st-md-mailman.stormreply.com/mailman/listinfo/uboot-stm32
Applied to u-boot-stm32

Thanks
Patrice

Reply via email to