[RFC] serial: mxc: get the clock frequency from the used clock for the device

Heiko Thiery heiko.thiery at gmail.com
Thu Mar 24 10:58:21 CET 2022


Hi Adam,

[SNIP]

>
> I was thinking that we could expand the struct mxc_serial_plat to
> include both per and igp clocks to cover devices have clocks that are
> not the same.  The configuring of the platdata can happen using
> mxc_serial_of_to_plat to 'get' both igp and per clocks.  The probe
> would enable both per and igp to ensure they are operating, then the
> mxc_serial_setbrg could use clk_get_rate(plat->clk_igp) to determine
> the clock rate.

With your comment I have made the following, does this fit with your suggestion?

diff --git a/drivers/serial/serial_mxc.c b/drivers/serial/serial_mxc.c
index e4970a169b..7f9f7e8383 100644
--- a/drivers/serial/serial_mxc.c
+++ b/drivers/serial/serial_mxc.c
@@ -3,6 +3,7 @@
  * (c) 2007 Sascha Hauer <s.hauer at pengutronix.de>
  */

+#include <clk.h>
 #include <common.h>
 #include <dm.h>
 #include <errno.h>
@@ -266,9 +267,16 @@ __weak struct serial_device *default_serial_console(void)
 int mxc_serial_setbrg(struct udevice *dev, int baudrate)
 {
        struct mxc_serial_plat *plat = dev_get_plat(dev);
-       u32 clk = imx_get_uartclk();
+       u32 rate = 0;
+
+#if defined(CONFIG_CLK)
+       rate = clk_get_rate(&plat->per_clk);
+#else
+       /* as fallback we try to get the clk rate that way */
+       rate = imx_get_uartclk();
+#endif

-       _mxc_serial_setbrg(plat->reg, clk, baudrate, plat->use_dte);
+       _mxc_serial_setbrg(plat->reg, rate, baudrate, plat->use_dte);

        return 0;
 }
@@ -277,6 +285,11 @@ static int mxc_serial_probe(struct udevice *dev)
 {
        struct mxc_serial_plat *plat = dev_get_plat(dev);

+#if defined(CONFIG_CLK)
+       clk_enable(&plat->ipg_clk);
+       clk_enable(&plat->per_clk);
+#endif
+
        _mxc_serial_init(plat->reg, plat->use_dte);

        return 0;
@@ -339,6 +352,10 @@ static int mxc_serial_of_to_plat(struct udevice *dev)

        plat->use_dte = fdtdec_get_bool(gd->fdt_blob, dev_of_offset(dev),
                                        "fsl,dte-mode");
+#if defined(CONFIG_CLK)
+       clk_get_by_name(dev, "ipg", &plat->ipg_clk);
+       clk_get_by_name(dev, "per", &plat->per_clk);
+#endif
        return 0;
 }

diff --git a/include/dm/platform_data/serial_mxc.h
b/include/dm/platform_data/serial_mxc.h
index cc59eeb1dd..330476f816 100644
--- a/include/dm/platform_data/serial_mxc.h
+++ b/include/dm/platform_data/serial_mxc.h
@@ -10,6 +10,10 @@
 struct mxc_serial_plat {
        struct mxc_uart *reg;  /* address of registers in physical memory */
        bool use_dte;
+#if defined(CONFIG_CLK)
+       struct clk ipg_clk;
+       struct clk per_clk;
+#endif
 };

 #endif

> I am guessing the clock composite would have to be expanded to include
> the UART clocks because from what I can see, they're not included.
> However, this could potentially eliminate the need to use some of the
> functions in arch/arm/mach-imx/imx8m/clock_imx8mm.

For the imx8mq I added this and asked Angus to integrate it into his
patchset. [1]

> The down-side is that a bunch of SoC's might need to be updated to
> support more and more clocks, so we could potentially use
> !CONFIG_IS_ENABLED to use the existing functions as a fall-back.
>
> adam
> >
> > Angus

-- 
Heiko

[1] https://lore.kernel.org/u-boot/CAEyMn7bC-p6o6VCu7YWQyXMm+51EcJ5OVXv_625cjDiaR+3TyQ@mail.gmail.com/


More information about the U-Boot mailing list