Am 15. Dezember 2025 20:03:11 UTC schrieb "Matyáš Bobek" 
<[email protected]>:
>Add fixed frequency (480 MHz) PLL3, of which the FlexCAN
>clock is derived, and compute FlexCAN frequency based on
>divider configuration.
>
>Signed-off-by: Matyáš Bobek <[email protected]>
>---
> hw/misc/imx6_ccm.c         | 24 ++++++++++++++++++++++++
> hw/misc/trace-events       |  2 ++
> include/hw/misc/imx6_ccm.h |  4 ++++
> include/hw/misc/imx_ccm.h  |  1 +
> 4 files changed, 31 insertions(+)
>
>diff --git a/hw/misc/imx6_ccm.c b/hw/misc/imx6_ccm.c
>index a10b67d396..45fdd0d5a8 100644
>--- a/hw/misc/imx6_ccm.c
>+++ b/hw/misc/imx6_ccm.c
>@@ -257,6 +257,15 @@ static uint64_t imx6_analog_get_pll2_clk(IMX6CCMState 
>*dev)
>     return freq;
> }
> 
>+static uint64_t imx6_analog_get_pll3_clk(IMX6CCMState *dev)
>+{
>+    uint64_t freq = 480000000;
>+
>+    trace_imx6_analog_get_pll3_clk(freq);
>+
>+    return freq;
>+}
>+
> static uint64_t imx6_analog_get_pll2_pfd0_clk(IMX6CCMState *dev)
> {
>     uint64_t freq = 0;
>@@ -344,6 +353,18 @@ static uint64_t imx6_ccm_get_per_clk(IMX6CCMState *dev)
>     return freq;
> }
> 
>+static uint64_t imx6_ccm_get_can_clk(IMX6CCMState *dev)
>+{
>+    uint64_t freq = 0;
>+
>+    freq = imx6_analog_get_pll3_clk(dev) / 8;
>+    freq /= (1 + EXTRACT(dev->ccm[CCM_CSCMR2], CAN_CLK_PODF));
>+
>+    trace_imx6_ccm_get_can_clk(freq);
>+
>+    return freq;
>+}
>+
> static uint32_t imx6_ccm_get_clock_frequency(IMXCCMState *dev, IMXClk clock)
> {
>     uint32_t freq = 0;
>@@ -358,6 +379,9 @@ static uint32_t imx6_ccm_get_clock_frequency(IMXCCMState 
>*dev, IMXClk clock)
>     case CLK_IPG_HIGH:
>         freq = imx6_ccm_get_per_clk(s);
>         break;
>+    case CLK_CAN:
>+        freq = imx6_ccm_get_can_clk(s);
>+        break;
>     case CLK_32k:
>         freq = CKIL_FREQ;
>         break;
>diff --git a/hw/misc/trace-events b/hw/misc/trace-events
>index eeb9243898..7c4f1c45b8 100644
>--- a/hw/misc/trace-events
>+++ b/hw/misc/trace-events
>@@ -242,11 +242,13 @@ imx6_analog_get_periph_clk(uint32_t freq) "freq = %u Hz"
> imx6_analog_get_pll2_clk(uint32_t freq) "freq = %u Hz"
> imx6_analog_get_pll2_pfd0_clk(uint32_t freq) "freq = %u Hz"
> imx6_analog_get_pll2_pfd2_clk(uint32_t freq) "freq = %u Hz"
>+imx6_analog_get_pll3_clk(uint32_t freq) "freq = %u Hz"
> imx6_analog_read(const char *reg, uint32_t value) "reg[%s] => 0x%" PRIx32
> imx6_analog_write(const char *reg, uint32_t value) "reg[%s] <= 0x%" PRIx32
> imx6_ccm_get_ahb_clk(uint32_t freq) "freq = %u Hz"
> imx6_ccm_get_ipg_clk(uint32_t freq) "freq = %u Hz"
> imx6_ccm_get_per_clk(uint32_t freq) "freq = %u Hz"
>+imx6_ccm_get_can_clk(uint32_t freq) "freq = %u Hz"
> imx6_ccm_get_clock_frequency(unsigned clock, uint32_t freq) "(Clock = %d) = 
> %u"
> imx6_ccm_read(const char *reg, uint32_t value) "reg[%s] => 0x%" PRIx32
> imx6_ccm_reset(void) ""
>diff --git a/include/hw/misc/imx6_ccm.h b/include/hw/misc/imx6_ccm.h
>index ccf46d7353..f498732727 100644
>--- a/include/hw/misc/imx6_ccm.h
>+++ b/include/hw/misc/imx6_ccm.h
>@@ -164,6 +164,10 @@
> #define PERCLK_PODF_SHIFT        (0)
> #define PERCLK_PODF_LENGTH       (6)
> 
>+/* CCM_CSCMR2 */
>+#define CAN_CLK_PODF_SHIFT        (2)
>+#define CAN_CLK_PODF_LENGTH       (6)

Small nitpick: Alignment of the values is off by one compared to the other 
defines.

With that fixed:
Reviewed-by: Bernhard Beschow <[email protected]>

>+
> /* CCM_ANALOG_PFD_528 */
> #define PFD0_FRAC_SHIFT          (0)
> #define PFD0_FRAC_LENGTH         (6)
>diff --git a/include/hw/misc/imx_ccm.h b/include/hw/misc/imx_ccm.h
>index 7e5678e972..9ce3adf332 100644
>--- a/include/hw/misc/imx_ccm.h
>+++ b/include/hw/misc/imx_ccm.h
>@@ -46,6 +46,7 @@ typedef enum  {
>     CLK_EXT,
>     CLK_HIGH_DIV,
>     CLK_HIGH,
>+    CLK_CAN,
> } IMXClk;
> 
> struct IMXCCMClass {

Reply via email to