[Uboot-stm32] [PATCH 2/3] phy: stm32-usbphyc: usbphyc is a clock provider of ck_usbo_48m clock
Patrice CHOTARD
patrice.chotard at foss.st.com
Tue May 10 09:45:27 CEST 2022
On 5/6/22 16:24, Patrice CHOTARD wrote:
> Hi Patrick
>
> On 4/26/22 14:37, Patrick Delaunay wrote:
>> ck_usbo_48m is generated by usbphyc PLL and used by OTG controller
>> for Full-Speed use cases with dedicated Full-Speed transceiver.
>>
>> ck_usbo_48m is available as soon as the PLL is enabled.
>>
>> Signed-off-by: Patrick Delaunay <patrick.delaunay at foss.st.com>
>> ---
>>
>> drivers/phy/phy-stm32-usbphyc.c | 79 +++++++++++++++++++++++++++++++++
>> 1 file changed, 79 insertions(+)
>>
>> diff --git a/drivers/phy/phy-stm32-usbphyc.c b/drivers/phy/phy-stm32-usbphyc.c
>> index 16c8799eca..e0b8fcb8f2 100644
>> --- a/drivers/phy/phy-stm32-usbphyc.c
>> +++ b/drivers/phy/phy-stm32-usbphyc.c
>> @@ -7,6 +7,7 @@
>>
>> #include <common.h>
>> #include <clk.h>
>> +#include <clk-uclass.h>
>> #include <div64.h>
>> #include <dm.h>
>> #include <fdtdec.h>
>> @@ -17,6 +18,7 @@
>> #include <usb.h>
>> #include <asm/io.h>
>> #include <dm/device_compat.h>
>> +#include <dm/lists.h>
>> #include <linux/bitops.h>
>> #include <linux/delay.h>
>> #include <power/regulator.h>
>> @@ -49,6 +51,9 @@
>> #define PLL_INFF_MIN_RATE 19200000 /* in Hz */
>> #define PLL_INFF_MAX_RATE 38400000 /* in Hz */
>>
>> +/* USBPHYC_CLK48 */
>> +#define USBPHYC_CLK48_FREQ 48000000 /* in Hz */
>> +
>> struct pll_params {
>> u8 ndiv;
>> u16 frac;
>> @@ -355,6 +360,16 @@ static const struct phy_ops stm32_usbphyc_phy_ops = {
>> .of_xlate = stm32_usbphyc_of_xlate,
>> };
>>
>> +static int stm32_usbphyc_bind(struct udevice *dev)
>> +{
>> + int ret;
>> +
>> + ret = device_bind_driver_to_node(dev, "stm32-usbphyc-clk", "ck_usbo_48m",
>> + dev_ofnode(dev), NULL);
>> +
>> + return log_ret(ret);
>> +}
>> +
>> static int stm32_usbphyc_probe(struct udevice *dev)
>> {
>> struct stm32_usbphyc *usbphyc = dev_get_priv(dev);
>> @@ -444,6 +459,70 @@ U_BOOT_DRIVER(stm32_usb_phyc) = {
>> .id = UCLASS_PHY,
>> .of_match = stm32_usbphyc_of_match,
>> .ops = &stm32_usbphyc_phy_ops,
>> + .bind = stm32_usbphyc_bind,
>> .probe = stm32_usbphyc_probe,
>> .priv_auto = sizeof(struct stm32_usbphyc),
>> };
>> +
>> +struct stm32_usbphyc_clk {
>> + bool enable;
>> +};
>> +
>> +static ulong stm32_usbphyc_clk48_get_rate(struct clk *clk)
>> +{
>> + return USBPHYC_CLK48_FREQ;
>> +}
>> +
>> +static int stm32_usbphyc_clk48_enable(struct clk *clk)
>> +{
>> + struct stm32_usbphyc_clk *usbphyc_clk = dev_get_priv(clk->dev);
>> + struct stm32_usbphyc *usbphyc;
>> + int ret;
>> +
>> + if (usbphyc_clk->enable)
>> + return 0;
>> +
>> + usbphyc = dev_get_priv(clk->dev->parent);
>> +
>> + /* ck_usbo_48m is generated by usbphyc PLL */
>> + ret = stm32_usbphyc_pll_enable(usbphyc);
>> + if (ret)
>> + return ret;
>> +
>> + usbphyc_clk->enable = true;
>> +
>> + return 0;
>> +}
>> +
>> +static int stm32_usbphyc_clk48_disable(struct clk *clk)
>> +{
>> + struct stm32_usbphyc_clk *usbphyc_clk = dev_get_priv(clk->dev);
>> + struct stm32_usbphyc *usbphyc;
>> + int ret;
>> +
>> + if (!usbphyc_clk->enable)
>> + return 0;
>> +
>> + usbphyc = dev_get_priv(clk->dev->parent);
>> +
>> + ret = stm32_usbphyc_pll_disable(usbphyc);
>> + if (ret)
>> + return ret;
>> +
>> + usbphyc_clk->enable = false;
>> +
>> + return 0;
>> +}
>> +
>> +const struct clk_ops usbphyc_clk48_ops = {
>> + .get_rate = stm32_usbphyc_clk48_get_rate,
>> + .enable = stm32_usbphyc_clk48_enable,
>> + .disable = stm32_usbphyc_clk48_disable,
>> +};
>> +
>> +U_BOOT_DRIVER(stm32_usb_phyc_clk) = {
>> + .name = "stm32-usbphyc-clk",
>> + .id = UCLASS_CLK,
>> + .ops = &usbphyc_clk48_ops,
>> + .priv_auto = sizeof(struct stm32_usbphyc_clk),
>> +};
>
>
> Reviewed-by: Patrice Chotard <patrice.chotard at foss.st.com>
>
> Thanks
> PAtrice
> _______________________________________________
> Uboot-stm32 mailing list
> Uboot-stm32 at st-md-mailman.stormreply.com
> https://st-md-mailman.stormreply.com/mailman/listinfo/uboot-stm32
Applied to u-boot-stm32
Thanks
Patrice
More information about the U-Boot
mailing list