From: Chao Liu <chao.liu@processmission.com>
To: Simon Law <0860734llx@gmail.com>
Cc: qemu-devel@nongnu.org, qemu-riscv@nongnu.org, palmer@dabbelt.com,
alistair.francis@wdc.com, liwei1518@gmail.com,
daniel.barboza@oss.qualcomm.com, zhiwei_liu@linux.alibaba.com,
pierrick.bouvier@oss.qualcomm.com
Subject: Re: [PATCH 1/4] hw/misc: model K230 CMU registers
Date: Tue, 18 Aug 2026 13:37:17 +0800 [thread overview]
Message-ID: <aoPV06elI1pvi3tk@ChaodeMacBook-Pro.local> (raw)
In-Reply-To: <20260809-feat-k230-cmu-v1-1-8792982c446c@gmail.com>
On Sun, Aug 09, 2026 at 02:20:41PM +0800, Simon Law wrote:
> Signed-off-by: Simon Law <0860734llx@gmail.com>
> ---
> MAINTAINERS | 4 +
> hw/misc/Kconfig | 3 +
> hw/misc/k230_cmu.c | 881 +++++++++++++++++++++++++++++++++++++++++++++
> hw/misc/meson.build | 1 +
> hw/misc/trace-events | 9 +
> hw/riscv/Kconfig | 1 +
> include/hw/misc/k230_cmu.h | 58 +++
> 7 files changed, 957 insertions(+)
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 6171cc7494..d46e90cdc5 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -1820,14 +1820,18 @@ F: hw/riscv/xiangshan_kmh.c
> F: include/hw/riscv/xiangshan_kmh.h
>
> K230 Machines
> +M: Simon Law <0860734llx@gmail.com>
Thanks for helping maintain the K230 machine module. I suggest starting with
patch reviews on the upstream mailing list, like Junze Cao.
> M: Chao Liu <chao.liu@processmission.com>
> L: qemu-riscv@nongnu.org
> S: Maintained
> F: docs/system/riscv/k230.rst
> F: hw/riscv/k230.c
> +F: hw/misc/k230_cmu.c
> F: hw/watchdog/k230_wdt.c
> +F: include/hw/misc/k230_cmu.h
> F: include/hw/riscv/k230.h
> F: include/hw/watchdog/k230_wdt.h
> +F: tests/qtest/k230-cmu-test.c
> F: tests/qtest/k230-wdt-test.c
>
> RX Machines
> diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig
> index 1543ee6653..58a0421e84 100644
> --- a/hw/misc/Kconfig
> +++ b/hw/misc/Kconfig
> @@ -101,6 +101,9 @@ config FSL_IMX8MP_ANALOG
> config FSL_IMX8MP_CCM
> bool
>
> +config K230_CMU
> + bool
> +
> config STM32_RCC
> bool
>
> diff --git a/hw/misc/k230_cmu.c b/hw/misc/k230_cmu.c
> new file mode 100644
> index 0000000000..6af19d2a06
> --- /dev/null
> +++ b/hw/misc/k230_cmu.c
> @@ -0,0 +1,881 @@
> +/*
> + * Kendryte K230 Clock Management Unit
> + *
> + * Copyright (c) 2026 Simon Law <0860734llx@gmail.com>
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + *
> + * Emulates the K230 PLL and system-clock register protocol. It models
> + * software-visible reset values, masks, write strobes, and PLL lock state,
> + * but does not provide cycle-accurate clocks or propagate QEMU Clock signals.
> + *
> + * K230 Technical Reference Manual V0.3.1 (2024-11-18):
> + * https://github.com/revyos/external-docs/blob/master/K230/en-us/K230_Technical_Reference_Manual_V0.3.1_20241118.pdf
> + *
> + * For more information, see <https://www.kendryte.com/en/proDetail/230>
> + */
> +
> +#include "qemu/osdep.h"
> +#include "hw/core/sysbus.h"
> +#include "hw/core/registerfields.h"
> +#include "migration/vmstate.h"
> +#include "qemu/log.h"
> +#include "qemu/module.h"
> +#include "qom/object.h"
> +
> +#include "hw/misc/k230_cmu.h"
> +#include "trace.h"
> +
> +REG32(CMU_CFG0, 0x00)
> + FIELD(CMU_CFG0, PLL_OUT_DIV, 24, 4)
> + FIELD(CMU_CFG0, PLL_REF_DIV, 16, 6)
> + FIELD(CMU_CFG0, PLL_FB_DIV, 0, 13)
> +
> +REG32(CMU_CFG1, 0x04)
> + FIELD(CMU_CFG1, PLL_BYPASS, 19, 1)
> + FIELD(CMU_CFG1, PLL_TEST, 18, 1)
> + FIELD(CMU_CFG1, PLL_ENSAT, 17, 1)
> + FIELD(CMU_CFG1, PLL_FASTEN, 16, 1)
> + FIELD(CMU_CFG1, PLL_BWADJ, 0, 12)
> +
> +REG32(CMU_CTL, 0x08)
> + FIELD(CMU_CTL, PLL_LOCK_TIM, 4, 8)
> + FIELD(CMU_CTL, PLL_CLK_OE, 2, 1)
> + FIELD(CMU_CTL, PLL_INIT, 1, 1)
> + FIELD(CMU_CTL, PLL_PWRDWN, 0, 1)
> +
> +REG32(CMU_STAT, 0x0c)
> + FIELD(CMU_STAT, PLL_FSM_STAT, 4, 2)
> + FIELD(CMU_STAT, PLL_RESERVED, 3, 1)
> + FIELD(CMU_STAT, PLL_FB_SLIP, 2, 1)
> + FIELD(CMU_STAT, PLL_REF_SLIP, 1, 1)
> + FIELD(CMU_STAT, PLL_LOCK, 0, 1)
> +
> +#define PLL_CFG0_RW_MASK (R_CMU_CFG0_PLL_OUT_DIV_MASK | \
> + R_CMU_CFG0_PLL_REF_DIV_MASK | \
> + R_CMU_CFG0_PLL_FB_DIV_MASK)
> +#define PLL_CFG1_RW_MASK (R_CMU_CFG1_PLL_BYPASS_MASK | \
> + R_CMU_CFG1_PLL_TEST_MASK | \
> + R_CMU_CFG1_PLL_ENSAT_MASK | \
> + R_CMU_CFG1_PLL_FASTEN_MASK | \
> + R_CMU_CFG1_PLL_BWADJ_MASK)
> +#define PLL_CTL_RW_MASK (R_CMU_CTL_PLL_LOCK_TIM_MASK | \
> + R_CMU_CTL_PLL_CLK_OE_MASK)
> +#define PLL_CTL_W1T_MASK (R_CMU_CTL_PLL_INIT_MASK | \
> + R_CMU_CTL_PLL_PWRDWN_MASK)
> +#define PLL_CTL_LOW_MASK (PLL_CTL_RW_MASK | PLL_CTL_W1T_MASK)
> +#define PLL_STAT_RO_MASK (R_CMU_STAT_PLL_FSM_STAT_MASK | \
> + R_CMU_STAT_PLL_RESERVED_MASK | \
> + R_CMU_STAT_PLL_FB_SLIP_MASK | \
> + R_CMU_STAT_PLL_REF_SLIP_MASK | \
> + R_CMU_STAT_PLL_LOCK_MASK)
> +
> +REG32(SYSCLK_CPU0_CLK_CFG, 0x000)
> + FIELD(SYSCLK_CPU0_CLK_CFG, CORE_CLK_ROOT_GDIV_UPD, 31, 1)
> + FIELD(SYSCLK_CPU0_CLK_CFG, PCLK_DIV, 15, 3)
> + FIELD(SYSCLK_CPU0_CLK_CFG, TDI_PCLK_EN, 14, 1)
> + /* FIXME: SDK get_leaf_en() reads bit 7 for this gate; */
> + /* TRM says bit 13. */
> + FIELD(SYSCLK_CPU0_CLK_CFG, PCLK_ENABLE, 13, 1)
> + FIELD(SYSCLK_CPU0_CLK_CFG, PLICLK_DIV, 10, 3)
> + FIELD(SYSCLK_CPU0_CLK_CFG, PLICLK_ENABLE, 9, 1)
> + FIELD(SYSCLK_CPU0_CLK_CFG, ACLK_DIV, 6, 3)
> + FIELD(SYSCLK_CPU0_CLK_CFG, CORE_CLK_ROOT_DIV, 1, 4)
> + FIELD(SYSCLK_CPU0_CLK_CFG, CORE_CLK_ENABLE, 0, 1)
> +REG32(SYSCLK_CPU1_CLK_CFG, 0x004)
> + FIELD(SYSCLK_CPU1_CLK_CFG, CORE_CLK_DIV_UPD, 31, 1)
> + FIELD(SYSCLK_CPU1_CLK_CFG, PCLK_ENABLE, 19, 1)
> + FIELD(SYSCLK_CPU1_CLK_CFG, PLICLK_DIV, 16, 3)
> + FIELD(SYSCLK_CPU1_CLK_CFG, PLICLK_ENABLE, 15, 1)
> + FIELD(SYSCLK_CPU1_CLK_CFG, ACLK_DIV, 12, 3)
> + FIELD(SYSCLK_CPU1_CLK_CFG, CORE_CLK_ROOT_DIV, 3, 3)
> + FIELD(SYSCLK_CPU1_CLK_CFG, CORE_CLK_SEL, 1, 2)
> + FIELD(SYSCLK_CPU1_CLK_CFG, CORE_CLK_ENABLE, 0, 1)
> +REG32(SYSCLK_AI_CLK_CFG, 0x008)
> + FIELD(SYSCLK_AI_CLK_CFG, CLK_DIV_UPD, 31, 1)
> + FIELD(SYSCLK_AI_CLK_CFG, ACLK_ENABLE, 10, 1)
> + FIELD(SYSCLK_AI_CLK_CFG, CLK_CDIV, 3, 3)
> + FIELD(SYSCLK_AI_CLK_CFG, CLK_SEL, 2, 1)
> + FIELD(SYSCLK_AI_CLK_CFG, CLK_ENABLE, 0, 1)
> +REG32(SYSCLK_VPU_CLK_CFG, 0x00c)
> + FIELD(SYSCLK_VPU_CLK_CFG, CLK_GDIV_UPD, 31, 1)
> + FIELD(SYSCLK_VPU_CLK_CFG, CFGCLK_ROOT_DIV, 11, 4)
> + FIELD(SYSCLK_VPU_CLK_CFG, CFGCLK_ENABLE, 10, 1)
> + FIELD(SYSCLK_VPU_CLK_CFG, ACLK_ROOT_DIV, 6, 4)
> + FIELD(SYSCLK_VPU_CLK_CFG, ACLK_ENABLE, 5, 1)
> + FIELD(SYSCLK_VPU_CLK_CFG, CLK_DIV, 1, 4)
> + FIELD(SYSCLK_VPU_CLK_CFG, CLK_EN, 0, 1)
> +REG32(SYSCLK_PMU_CLK_CFG, 0x010)
> + FIELD(SYSCLK_PMU_CLK_CFG, CLK_EN, 0, 1)
> +REG32(SYSCLK_HS_CLKEN_CFG, 0x018)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SSI2_ACLK_ENABLE, 30, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SSI1_ACLK_ENABLE, 29, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, QSPI_ACLK_ENABLE, 28, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SSI0_ACLK_ENABLE, 27, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SSI2_CLK_ENABLE, 26, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SSI1_CLK_ENABLE, 25, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SSI0_CLK_ENABLE, 24, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, USB_REFCLK_SEL, 23, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, USB1_REFCLK_ENABLE, 22, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, USB0_REFCLK_ENABLE, 21, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SD1_TMCLK_ENABLE, 20, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SD1_CCLK_ENABLE, 19, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SD1_BCLK_ENABLE, 18, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SD1_ACLK_ENABLE, 17, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SD0_TMCLK_ENABLE, 16, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SD0_CCLK_ENABLE, 15, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SD0_BCLK_ENABLE, 14, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SD0_ACLK_ENABLE, 13, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SD_TMCLK_ENABLE, 12, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SD_CCLK_ENABLE, 11, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SD_BCLK_ENABLE, 10, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SD_ACLK_ENABLE, 9, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SSI2_HCLK_ENABLE, 8, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SSI1_HCLK_ENABLE, 7, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SSI0_HCLK_ENABLE, 6, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, USB1_HCLK_ENABLE, 5, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, USB0_HCLK_ENABLE, 4, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SD1_HCLK_ENABLE, 3, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, SD0_HCLK_ENABLE, 2, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, HCLK_HIGH_ENABLE, 1, 1)
> + FIELD(SYSCLK_HS_CLKEN_CFG, HCLK_ENABLE, 0, 1)
> +REG32(SYSCLK_HS_SDCLK_CFG, 0x01c)
> + FIELD(SYSCLK_HS_SDCLK_CFG, ACLK_ROOT_CDIV_UPD, 31, 1)
> + FIELD(SYSCLK_HS_SDCLK_CFG, TMCLK_DIV, 15, 5)
> + /* FIXME: SDK get_leaf_rate() uses ACLK_ROOT_DIV for SD CCLK, */
> + /* not bits 14:12. */
> + FIELD(SYSCLK_HS_SDCLK_CFG, CCLK_DIV, 12, 3)
> + FIELD(SYSCLK_HS_SDCLK_CFG, BCLK_DIV, 9, 3)
> + FIELD(SYSCLK_HS_SDCLK_CFG, ACLK_ROOT_DIV, 6, 3)
> + FIELD(SYSCLK_HS_SDCLK_CFG, HCLK_DIV, 3, 3)
> + FIELD(SYSCLK_HS_SDCLK_CFG, HCLK_HIGH_ROOT_DIV, 0, 3)
> +REG32(SYSCLK_HS_SPI_CFG, 0x020)
> + FIELD(SYSCLK_HS_SPI_CFG, SSI0_ACLK_ROOT_CDIV_UPD, 31, 1)
> + FIELD(SYSCLK_HS_SPI_CFG, SSI0_CLK_SEL, 18, 1)
> + FIELD(SYSCLK_HS_SPI_CFG, USB_REFCLK_50M_DIV, 15, 3)
> + FIELD(SYSCLK_HS_SPI_CFG, QSPI_ACLK_ROOT_DIV, 12, 3)
> + FIELD(SYSCLK_HS_SPI_CFG, SSI0_ACLK_DIV, 9, 3)
> + FIELD(SYSCLK_HS_SPI_CFG, SSI2_CLK_DIV, 6, 3)
> + FIELD(SYSCLK_HS_SPI_CFG, SSI1_CLK_DIV, 3, 3)
> +REG32(SYSCLK_LS_CLKEN_CFG0, 0x024)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, PDM_CLK_ENABLE, 31, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, CODEC_MCLK_DAC_ENABLE, 30, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, CODEC_MCLK_ADC_ENABLE, 29, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, AUD_DEV_CLK_ENABLE, 28, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, GPIO_DBCLK_ENABLE, 27, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, ADC_CLK_ENABLE, 26, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, I2C4_CLK_ENABLE, 25, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, I2C3_CLK_ENABLE, 24, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, I2C2_CLK_ENABLE, 23, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, I2C1_CLK_ENABLE, 22, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, I2C0_CLK_ENABLE, 21, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, UART4_CLK_ENABLE, 20, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, UART3_CLK_ENABLE, 19, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, UART2_CLK_ENABLE, 18, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, UART1_CLK_ENABLE, 17, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, UART0_CLK_ENABLE, 16, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, ADC_PCLK_ENABLE, 15, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, CODEC_PCLK_ENABLE, 14, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, AUD_DEV_PCLK_ENABLE, 13, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, PWM_PCLK_ENABLE, 12, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, GPIO_PCLK_ENABLE, 11, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, I2C4_PCLK_ENABLE, 10, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, I2C3_PCLK_ENABLE, 9, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, I2C2_PCLK_ENABLE, 8, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, I2C1_PCLK_ENABLE, 7, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, I2C0_PCLK_ENABLE, 6, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, UART4_PCLK_ENABLE, 5, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, UART3_PCLK_ENABLE, 4, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, UART2_PCLK_ENABLE, 3, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, UART1_PCLK_ENABLE, 2, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, UART0_PCLK_ENABLE, 1, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG0, PCLK_ENABLE, 0, 1)
> +REG32(SYSCLK_LS_CLKEN_CFG1, 0x028)
> + FIELD(SYSCLK_LS_CLKEN_CFG1, JAMLINK3_PCLK_ENABLE, 7, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG1, JAMLINK2_PCLK_ENABLE, 6, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG1, JAMLINK1_PCLK_ENABLE, 5, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG1, JAMLINK0_PCLK_ENABLE, 4, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG1, JAMLINK3_CO_ENABLE, 3, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG1, JAMLINK2_CO_ENABLE, 2, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG1, JAMLINK1_CO_ENABLE, 1, 1)
> + FIELD(SYSCLK_LS_CLKEN_CFG1, JAMLINK0_CO_ENABLE, 0, 1)
> +REG32(SYSCLK_UART_I2C_CLKDIV_CFG, 0x02c)
> + FIELD(SYSCLK_UART_I2C_CLKDIV_CFG, I2C0_CLK_CDIV_UPD, 31, 1)
> + FIELD(SYSCLK_UART_I2C_CLKDIV_CFG, I2C4_CLK_DIV, 27, 3)
> + FIELD(SYSCLK_UART_I2C_CLKDIV_CFG, I2C3_CLK_DIV, 24, 3)
> + FIELD(SYSCLK_UART_I2C_CLKDIV_CFG, I2C2_CLK_DIV, 21, 3)
> + FIELD(SYSCLK_UART_I2C_CLKDIV_CFG, I2C1_CLK_DIV, 18, 3)
> + FIELD(SYSCLK_UART_I2C_CLKDIV_CFG, I2C0_CLK_DIV, 15, 3)
> + FIELD(SYSCLK_UART_I2C_CLKDIV_CFG, UART4_SCLK_DIV, 12, 3)
> + FIELD(SYSCLK_UART_I2C_CLKDIV_CFG, UART3_SCLK_DIV, 9, 3)
> + FIELD(SYSCLK_UART_I2C_CLKDIV_CFG, UART2_SCLK_DIV, 6, 3)
> + FIELD(SYSCLK_UART_I2C_CLKDIV_CFG, UART1_SCLK_DIV, 3, 3)
> + FIELD(SYSCLK_UART_I2C_CLKDIV_CFG, UART0_SCLK_DIV, 0, 3)
> +REG32(SYSCLK_LS_CLKDIV_CFG, 0x030)
> + FIELD(SYSCLK_LS_CLKDIV_CFG, JAMLINK_CO_CDIV_UPD, 31, 1)
> + FIELD(SYSCLK_LS_CLKDIV_CFG, JAMLINK_CO_DIV, 23, 8)
> + FIELD(SYSCLK_LS_CLKDIV_CFG, GPIO_DBCLK_DIV, 13, 10)
> + FIELD(SYSCLK_LS_CLKDIV_CFG, ADC_CLK_DIV, 3, 10)
> + FIELD(SYSCLK_LS_CLKDIV_CFG, PCLK_DIV, 0, 3)
> +/*
> + * SDK sysctl_clk_t marks offsets 0x034..0x044 reserved; the TRM defines
> + * these registers, so the TRM layout is authoritative for the v1 model.
> + */
> +REG32(SYSCLK_AUDIO_CLKDIV_CFG, 0x034)
> + FIELD(SYSCLK_AUDIO_CLKDIV_CFG, AUD_DEV_CLK_FDIV_UPD, 31, 1)
> + FIELD(SYSCLK_AUDIO_CLKDIV_CFG, AUDIO_CLK_STEP, 16, 15)
> + FIELD(SYSCLK_AUDIO_CLKDIV_CFG, AUDIO_CLK_SUM, 0, 16)
> +REG32(SYSCLK_CODEC_ADC_MCLKDIV_CFG, 0x038)
> + FIELD(SYSCLK_CODEC_ADC_MCLKDIV_CFG, MCLK_ADC_FDIV_UPD, 31, 1)
> + FIELD(SYSCLK_CODEC_ADC_MCLKDIV_CFG, MCLK_ADC_STEP, 14, 13)
> + FIELD(SYSCLK_CODEC_ADC_MCLKDIV_CFG, MCLK_ADC_SUM, 0, 14)
> +REG32(SYSCLK_CODEC_DAC_MCLKDIV_CFG, 0x03c)
> + FIELD(SYSCLK_CODEC_DAC_MCLKDIV_CFG, MCLK_DAC_FDIV_UPD, 31, 1)
> + FIELD(SYSCLK_CODEC_DAC_MCLKDIV_CFG, MCLK_DAC_STEP, 14, 13)
> + FIELD(SYSCLK_CODEC_DAC_MCLKDIV_CFG, MCLK_DAC_SUM, 0, 14)
> +REG32(SYSCLK_PDM_CLKDIV_CFG0, 0x040)
> + FIELD(SYSCLK_PDM_CLKDIV_CFG0, CLK_SUM, 0, 17)
> +REG32(SYSCLK_PDM_CLKDIV_CFG1, 0x044)
> + FIELD(SYSCLK_PDM_CLKDIV_CFG1, CLK_FDIV_UPD, 31, 1)
> + FIELD(SYSCLK_PDM_CLKDIV_CFG1, CLK_STEP, 0, 16)
> +REG32(SYSCLK_SYSCTL_CLKEN_CFG, 0x050)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, HDI_CLK_ENABLE, 21, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, IOMUX_PCLK_ENABLE, 20, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, STC_CLK_EN, 19, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, TIMER5_CLK_ENABLE, 18, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, TIMER4_CLK_ENABLE, 17, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, TIMER3_CLK_ENABLE, 16, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, TIMER2_CLK_ENABLE, 15, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, TIMER1_CLK_ENABLE, 14, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, TIMER0_CLK_ENABLE, 13, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, TIMER5_CLK_SEL, 12, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, TIMER4_CLK_SEL, 11, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, TIMER3_CLK_SEL, 10, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, TIMER2_CLK_SEL, 9, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, TIMER1_CLK_SEL, 8, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, TIMER0_CLK_SEL, 7, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, WDT1_CLK_ENABLE, 6, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, WDT0_CLK_ENABLE, 5, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, MAILBOX_PCLK_ENABLE, 4, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, TIMER_PCLK_ENABLE, 3, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, WDT1_PCLK_ENABLE, 2, 1)
> + FIELD(SYSCLK_SYSCTL_CLKEN_CFG, WDT0_PCLK_ENABLE, 1, 1)
> +REG32(SYSCLK_TIMER_CLK_CFG, 0x054)
> + FIELD(SYSCLK_TIMER_CLK_CFG, CLK0_CDIV_UPD, 31, 1)
> + FIELD(SYSCLK_TIMER_CLK_CFG, CLK5_DIV, 15, 3)
> + FIELD(SYSCLK_TIMER_CLK_CFG, CLK4_DIV, 12, 3)
> + FIELD(SYSCLK_TIMER_CLK_CFG, CLK3_DIV, 9, 3)
> + FIELD(SYSCLK_TIMER_CLK_CFG, CLK2_DIV, 6, 3)
> + FIELD(SYSCLK_TIMER_CLK_CFG, CLK1_DIV, 3, 3)
> + FIELD(SYSCLK_TIMER_CLK_CFG, CLK0_DIV, 0, 3)
> +REG32(SYSCLK_SYSCTL_CLK_DIV_CFG, 0x058)
> + FIELD(SYSCLK_SYSCTL_CLK_DIV_CFG, PCLK_CDIV_UPD, 31, 1)
> + FIELD(SYSCLK_SYSCTL_CLK_DIV_CFG, HDI_CLK_DIV, 28, 3)
> + FIELD(SYSCLK_SYSCTL_CLK_DIV_CFG, TS_CLK_DIV, 20, 8)
> + FIELD(SYSCLK_SYSCTL_CLK_DIV_CFG, STC_CLK_DIV, 15, 5)
> + FIELD(SYSCLK_SYSCTL_CLK_DIV_CFG, WDT1_CLK_DIV, 9, 6)
> + FIELD(SYSCLK_SYSCTL_CLK_DIV_CFG, WDT0_CLK_DIV, 3, 6)
> +REG32(SYSCLK_SHRM_CLK_CFG, 0x05c)
> + FIELD(SYSCLK_SHRM_CLK_CFG, PCLK_ROOT_DIV_UPD, 31, 1)
> + FIELD(SYSCLK_SHRM_CLK_CFG, PCLK_ROOT_DIV, 18, 3)
> + FIELD(SYSCLK_SHRM_CLK_CFG, SRAM_CLK_SEL, 14, 1)
> + FIELD(SYSCLK_SHRM_CLK_CFG, AXIM_BRIDGE_CLK_EN, 13, 1)
> + FIELD(SYSCLK_SHRM_CLK_CFG, AXIM_CLK_EN, 12, 1)
> + FIELD(SYSCLK_SHRM_CLK_CFG, AXIS_CLK_EN, 11, 1)
> + FIELD(SYSCLK_SHRM_CLK_CFG, SRAM_ACLK_ENABLE, 10, 1)
> + FIELD(SYSCLK_SHRM_CLK_CFG, NONAI2D_ACLK_ENABLE, 9, 1)
> + FIELD(SYSCLK_SHRM_CLK_CFG, NONAI2D_PCLK_ENABLE, 8, 1)
> + FIELD(SYSCLK_SHRM_CLK_CFG, DECOMPRESS_ACLK_ENABLE, 7, 1)
> + FIELD(SYSCLK_SHRM_CLK_CFG, DECOMPRESS_PCLK_ENABLE, 6, 1)
> + FIELD(SYSCLK_SHRM_CLK_CFG, GSDMA_ACLK_ENABLE, 5, 1)
> + FIELD(SYSCLK_SHRM_CLK_CFG, GSDMA_PCLK_ENABLE, 4, 1)
> + FIELD(SYSCLK_SHRM_CLK_CFG, PERI_DMA_ACLK_ENABLE, 3, 1)
> + FIELD(SYSCLK_SHRM_CLK_CFG, PERI_DMA_PCLK_ENABLE, 2, 1)
> + FIELD(SYSCLK_SHRM_CLK_CFG, PCLK_ENABLE, 0, 1)
> +REG32(SYSCLK_DDR_CLK_CFG, 0x060)
> + FIELD(SYSCLK_DDR_CLK_CFG, CORE_CLK_CDIV_UPD, 31, 1)
> + FIELD(SYSCLK_DDR_CLK_CFG, PCLK_DIV, 14, 4)
> + FIELD(SYSCLK_DDR_CLK_CFG, CORE_CLK_DIV, 10, 4)
> + FIELD(SYSCLK_DDR_CLK_CFG, PCLK_ENABLE, 9, 1)
> + FIELD(SYSCLK_DDR_CLK_CFG, BYPASSPCLK_ENABLE, 8, 1)
> + FIELD(SYSCLK_DDR_CLK_CFG, AXI4CLK_ENABLE, 7, 1)
> + FIELD(SYSCLK_DDR_CLK_CFG, AXI3CLK_ENABLE, 6, 1)
> + FIELD(SYSCLK_DDR_CLK_CFG, AXI2CLK_ENABLE, 5, 1)
> + FIELD(SYSCLK_DDR_CLK_CFG, AXI1CLK_ENABLE, 4, 1)
> + FIELD(SYSCLK_DDR_CLK_CFG, AXI0CLK_ENABLE, 3, 1)
> + FIELD(SYSCLK_DDR_CLK_CFG, CLK_ENABLE, 2, 1)
> + FIELD(SYSCLK_DDR_CLK_CFG, CLK_SEL, 0, 2)
> +/*
> + * SDK sysctl_clk_t marks offsets 0x064..0x078 reserved; the TRM defines
> + * these registers, so the TRM layout is authoritative for the v1 model.
> + */
> +REG32(SYSCLK_ISP_CLKEN_CFG, 0x064)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, DW_ACLK_ENABLE, 19, 1)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, DW_HCLK_ENABLE, 18, 1)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, MCM_CLK_ENABLE, 17, 1)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, VSE_CLK_ENABLE, 16, 1)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, DWE_CLK_ENABLE, 15, 1)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, ACLK_ENABLE, 14, 1)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, HCLK_ENABLE, 13, 1)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, CLK_ENABLE, 12, 1)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, CSI2_PCLK_ENABLE, 11, 1)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, CSI1_PCLK_ENABLE, 10, 1)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, CSI0_PCLK_ENABLE, 9, 1)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, CSI2_PIXELCLK_ENABLE, 8, 1)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, CSI1_PIXELCLK_ENABLE, 7, 1)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, CSI0_PIXELCLK_ENABLE, 6, 1)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, DPHY_PCLK_ENABLE, 5, 1)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, CFG2_CLK_ENABLE, 4, 1)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, CFG1_CLK_ENABLE, 3, 1)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, CFG0_CLK_ENABLE, 2, 1)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, PCLK_ENABLE, 1, 1)
> + FIELD(SYSCLK_ISP_CLKEN_CFG, CSIPHY_CFGCLK_ENABLE, 0, 1)
> +REG32(SYSCLK_ISP_CLKDIV_CFG, 0x068)
> + FIELD(SYSCLK_ISP_CLKDIV_CFG, CFG_CLK_CDIV_UPD, 31, 1)
> + FIELD(SYSCLK_ISP_CLKDIV_CFG, CLK_SEL, 29, 1)
> + FIELD(SYSCLK_ISP_CLKDIV_CFG, CLK_DIV, 26, 3)
> + FIELD(SYSCLK_ISP_CLKDIV_CFG, PCLK_DIV, 23, 3)
> + FIELD(SYSCLK_ISP_CLKDIV_CFG, CSI2_PIXEL_CLK_DIV, 17, 6)
> + FIELD(SYSCLK_ISP_CLKDIV_CFG, CSI1_PIXEL_CLK_DIV, 11, 6)
> + FIELD(SYSCLK_ISP_CLKDIV_CFG, CSI0_PIXEL_CLK_DIV, 5, 6)
> + FIELD(SYSCLK_ISP_CLKDIV_CFG, CFG_CLK_DIV, 0, 5)
> +REG32(SYSCLK_MCLK_CFG, 0x06c)
> + FIELD(SYSCLK_MCLK_CFG, MCLK0_CDIV_UPD, 31, 1)
> + FIELD(SYSCLK_MCLK_CFG, MCLK2_DIV, 19, 5)
> + FIELD(SYSCLK_MCLK_CFG, MCLK2_SEL, 17, 2)
> + FIELD(SYSCLK_MCLK_CFG, MCLK1_DIV, 12, 5)
> + FIELD(SYSCLK_MCLK_CFG, MCLK1_SEL, 10, 2)
> + FIELD(SYSCLK_MCLK_CFG, MCLK0_DIV, 5, 5)
> + FIELD(SYSCLK_MCLK_CFG, MCLK0_SEL, 3, 2)
> + FIELD(SYSCLK_MCLK_CFG, MCLK2_ENABLE, 2, 1)
> + FIELD(SYSCLK_MCLK_CFG, MCLK1_ENABLE, 1, 1)
> + FIELD(SYSCLK_MCLK_CFG, MCLK0_ENABLE, 0, 1)
> +REG32(SYSCLK_DPU_CLK_CFG, 0x070)
> + FIELD(SYSCLK_DPU_CLK_CFG, CLK_DIV_UPD, 31, 1)
> + FIELD(SYSCLK_DPU_CLK_CFG, PCLK_DIV, 7, 3)
> + FIELD(SYSCLK_DPU_CLK_CFG, CLK_DIV, 3, 4)
> + FIELD(SYSCLK_DPU_CLK_CFG, PCLK_ENABLE, 2, 1)
> + FIELD(SYSCLK_DPU_CLK_CFG, ACLK_ENABLE, 1, 1)
> + FIELD(SYSCLK_DPU_CLK_CFG, CLK_ENABLE, 0, 1)
> +REG32(SYSCLK_VO_CLK_CFG, 0x074)
> + FIELD(SYSCLK_VO_CLK_CFG, ACLK_GPU_EN, 12, 1)
> + FIELD(SYSCLK_VO_CLK_CFG, ACLK_VO_EN, 11, 1)
> + FIELD(SYSCLK_VO_CLK_CFG, HCLK_GPU_EN, 10, 1)
> + FIELD(SYSCLK_VO_CLK_CFG, PCLK_DSI_PHY_EN, 9, 1)
> + FIELD(SYSCLK_VO_CLK_CFG, PCLK_DSI_ENABLE, 8, 1)
> + FIELD(SYSCLK_VO_CLK_CFG, PCLK_VO_ENABLE, 7, 1)
> + FIELD(SYSCLK_VO_CLK_CFG, CLK_GPU_ENABLE, 6, 1)
> + FIELD(SYSCLK_VO_CLK_CFG, CLKEXT_ENABLE, 5, 1)
> + FIELD(SYSCLK_VO_CLK_CFG, CFGCLK_ENABLE, 4, 1)
> + FIELD(SYSCLK_VO_CLK_CFG, REFCLK_ENABLE, 3, 1)
> + FIELD(SYSCLK_VO_CLK_CFG, DPIPCLK_ENABLE, 2, 1)
> + FIELD(SYSCLK_VO_CLK_CFG, ACLK_ENABLE, 1, 1)
> + FIELD(SYSCLK_VO_CLK_CFG, HCLK_ENABLE, 0, 1)
> +REG32(SYSCLK_DISP_CLK_DIV, 0x078)
> + FIELD(SYSCLK_DISP_CLK_DIV, HCLK_ROOT_CDIV_UPD, 31, 1)
> + FIELD(SYSCLK_DISP_CLK_DIV, CLK_GPU_DIV, 20, 4)
> + FIELD(SYSCLK_DISP_CLK_DIV, CLKEXT_DIV, 16, 4)
> + FIELD(SYSCLK_DISP_CLK_DIV, CFGCLK_DIV, 11, 5)
> + FIELD(SYSCLK_DISP_CLK_DIV, DPIPCLK_DIV, 3, 8)
> + FIELD(SYSCLK_DISP_CLK_DIV, HCLK_ROOT_DIV, 0, 3)
> +REG32(SYSCLK_SEC_CLK_DIV, 0x080)
> + FIELD(SYSCLK_SEC_CLK_DIV, PCLK_DIV_UPD, 31, 1)
> + FIELD(SYSCLK_SEC_CLK_DIV, ACLK_DIV, 11, 3)
> + FIELD(SYSCLK_SEC_CLK_DIV, FIXCLK_DIV, 6, 5)
> + FIELD(SYSCLK_SEC_CLK_DIV, FIXCLK_ENABLE, 5, 1)
> + FIELD(SYSCLK_SEC_CLK_DIV, ACLK_ENABLE, 4, 1)
> + FIELD(SYSCLK_SEC_CLK_DIV, PCLK_DIV, 1, 3)
> + FIELD(SYSCLK_SEC_CLK_DIV, PCLK_ENABLE, 0, 1)
> +REG32(SYSCLK_USB_TEST_CLK_DIV, 0x100)
> + FIELD(SYSCLK_USB_TEST_CLK_DIV, CLK480_CDIV_UPD, 31, 1)
> + FIELD(SYSCLK_USB_TEST_CLK_DIV, CLK100_DIV, 4, 3)
> + FIELD(SYSCLK_USB_TEST_CLK_DIV, CLK480_DIV, 1, 3)
> + FIELD(SYSCLK_USB_TEST_CLK_DIV, TEST_CLK_ENABLE, 0, 1)
> +REG32(SYSCLK_DPHY_TEST_CLK_DIV, 0x104)
> + FIELD(SYSCLK_DPHY_TEST_CLK_DIV, TEST_CLK_CDIV_UPD, 31, 1)
> + FIELD(SYSCLK_DPHY_TEST_CLK_DIV, TEST_CLK_DIV, 1, 4)
> + FIELD(SYSCLK_DPHY_TEST_CLK_DIV, TEST_CLK_ENABLE, 0, 1)
> +/*
> + * The TRM v0.3.1 sysclk summary ends at 0x104. Linux and the SDK both
> + * access SPI2AXI_CLK_DIV at 0x108, so v1 preserves this software ABI
> + * exception.
> + */
> +REG32(SYSCLK_SPI2AXI_CLK_DIV, 0x108)
> + FIELD(SYSCLK_SPI2AXI_CLK_DIV, CLK_DIV_UPD, 31, 1)
> + FIELD(SYSCLK_SPI2AXI_CLK_DIV, CLK_DIV, 1, 3)
> + FIELD(SYSCLK_SPI2AXI_CLK_DIV, CLK_ENABLE, 0, 1)
> +
> +typedef struct K230PllRegDesc {
> + hwaddr offset;
> + const char *name;
> + uint32_t reset[K230_PLL_COUNT];
> + uint32_t rw_mask;
> + uint32_t ro_mask;
> + uint32_t w1t_mask;
> + uint8_t write_enable_shift;
> + uint32_t write_enable_mask;
> +} K230PllRegDesc;
> +
> +typedef struct K230SysclkRegDesc {
> + hwaddr offset;
> + const char *name;
> + uint32_t reset;
> + uint32_t rw_mask;
> + uint32_t w1t_mask;
> +} K230SysclkRegDesc;
> +
> +static const K230PllRegDesc k230_pll_regs[] = {
> + {
> + .offset = A_CMU_CFG0,
> + .name = "PLLx_CFG0",
> + .reset = {
> + 0x0102018f, 0x00000062, 0x00070378, 0x0102018f,
> + },
> + .rw_mask = PLL_CFG0_RW_MASK,
> + },
> + {
> + .offset = A_CMU_CFG1,
> + .name = "PLLx_CFG1",
> + .reset = {
> + 0x000200c7, 0x00020031, 0x000201bb, 0x000200c7,
> + },
> + .rw_mask = PLL_CFG1_RW_MASK,
> + },
> + {
> + .offset = A_CMU_CTL,
> + .name = "PLLx_CTL",
> + .reset = {
> + 0x00000034, 0x00000034, 0x00000034, 0x00000074,
> + },
> + .rw_mask = PLL_CTL_RW_MASK,
> + .w1t_mask = PLL_CTL_W1T_MASK,
Where is w1t_mask actually used?
> + .write_enable_shift = 16,
> + .write_enable_mask = PLL_CTL_LOW_MASK,
> + },
> + {
> + .offset = A_CMU_STAT,
> + .name = "PLLx_STAT",
> + .reset = {
> + 0x00000021, 0x00000021, 0x00000021, 0x00000021,
> + },
> + .ro_mask = PLL_STAT_RO_MASK,
> + },
> +};
> +
> +#define SYSCLK_REG(_reg, _name, _reset, _rw, _w1t) \
> + { .offset = A_ ## _reg, .name = _name, .reset = _reset, \
> + .rw_mask = (_rw), .w1t_mask = (_w1t) }
> +
> +static const K230SysclkRegDesc k230_sysclk_regs[] = {
> + SYSCLK_REG(SYSCLK_CPU0_CLK_CFG, "CPU0_CLK_CFG", 0x0000e65f,
> + 0x0003ffdf, R_SYSCLK_CPU0_CLK_CFG_CORE_CLK_ROOT_GDIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_CPU1_CLK_CFG, "CPU1_CLK_CFG", 0x0009900d,
> + 0x000f803f, R_SYSCLK_CPU1_CLK_CFG_CORE_CLK_DIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_AI_CLK_CFG, "AI_CLK_CFG", 0x0000043d,
> + 0x0000043d, R_SYSCLK_AI_CLK_CFG_CLK_DIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_VPU_CLK_CFG, "VPU_CLK_CFG", 0x00000c7f,
> + 0x00007fff, R_SYSCLK_VPU_CLK_CFG_CLK_GDIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_PMU_CLK_CFG, "PMU_CLK_CFG", 0x00000001,
> + 0x00000001, 0),
> + SYSCLK_REG(SYSCLK_HS_CLKEN_CFG, "HS_CLKEN_CFG", 0x7f7fffff,
> + 0x7fffffff, 0),
> + SYSCLK_REG(SYSCLK_HS_SDCLK_CFG, "HS_SDCLK_CFG", 0x000b9248,
> + 0x000fffff, R_SYSCLK_HS_SDCLK_CFG_ACLK_ROOT_CDIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_HS_SPI_CFG, "HS_SPI_CFG", 0x00039048,
> + 0x0007fff8, R_SYSCLK_HS_SPI_CFG_SSI0_ACLK_ROOT_CDIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_LS_CLKEN_CFG0, "LS_CLKEN_CFG0", 0xffffffff,
> + 0xffffffff, 0),
> + SYSCLK_REG(SYSCLK_LS_CLKEN_CFG1, "LS_CLKEN_CFG1", 0x000000ff,
> + 0x000000ff, 0),
> + SYSCLK_REG(SYSCLK_UART_I2C_CLKDIV_CFG, "UART_I2C_CLKDIV_CFG",
> + 0x1b6d9249, 0x3fffffff,
> + R_SYSCLK_UART_I2C_CLKDIV_CFG_I2C0_CLK_CDIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_LS_CLKDIV_CFG, "LS_CLKDIV_CFG", 0x01dda0c3,
> + 0x7fffffff, R_SYSCLK_LS_CLKDIV_CFG_JAMLINK_CO_CDIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_AUDIO_CLKDIV_CFG, "AUDIO_CLKDIV_CFG", 0x01b9f424,
> + 0x7fffffff, R_SYSCLK_AUDIO_CLKDIV_CFG_AUD_DEV_CLK_FDIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_CODEC_ADC_MCLKDIV_CFG, "CODEC_ADC_MCLKDIV_CFG",
> + 0x006e7d09, 0x07ffffff,
> + R_SYSCLK_CODEC_ADC_MCLKDIV_CFG_MCLK_ADC_FDIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_CODEC_DAC_MCLKDIV_CFG, "CODEC_DAC_MCLKDIV_CFG",
> + 0x006e7d09, 0x07ffffff,
> + R_SYSCLK_CODEC_DAC_MCLKDIV_CFG_MCLK_DAC_FDIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_PDM_CLKDIV_CFG0, "PDM_CLKDIV_CFG0", 0x0000f424,
> + 0x0001ffff, 0),
> + SYSCLK_REG(SYSCLK_PDM_CLKDIV_CFG1, "PDM_CLKDIV_CFG1", 0x000001b9,
> + 0x0000ffff, R_SYSCLK_PDM_CLKDIV_CFG1_CLK_FDIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_SYSCTL_CLKEN_CFG, "SYSCTL_CLKEN_CFG", 0x003ffffe,
> + 0x003ffffe, 0),
> + SYSCLK_REG(SYSCLK_TIMER_CLK_CFG, "TIMER_CLK_CFG", 0x0003ffff,
> + 0x0003ffff, R_SYSCLK_TIMER_CLK_CFG_CLK0_CDIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_SYSCTL_CLK_DIV_CFG, "SYSCTL_CLK_DIV_CFG", 0x1efabef9,
> + 0x7ffffff8, R_SYSCLK_SYSCTL_CLK_DIV_CFG_PCLK_CDIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_SHRM_CLK_CFG, "SHRM_CLK_CFG", 0x000c7ffd,
> + 0x001c7ffd, R_SYSCLK_SHRM_CLK_CFG_PCLK_ROOT_DIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_DDR_CLK_CFG, "DDR_CLK_CFG", 0x000043fd,
> + 0x0003ffff, R_SYSCLK_DDR_CLK_CFG_CORE_CLK_CDIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_ISP_CLKEN_CFG, "ISP_CLKEN_CFG", 0x000fffff,
> + 0x000fffff, 0),
> + SYSCLK_REG(SYSCLK_ISP_CLKDIV_CFG, "ISP_CLKDIV_CFG", 0x00820835,
> + 0x3fffffff, R_SYSCLK_ISP_CLKDIV_CFG_CFG_CLK_CDIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_MCLK_CFG, "MCLK_CFG", 0x003a74ef,
> + 0x00ffffff, R_SYSCLK_MCLK_CFG_MCLK0_CDIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_DPU_CLK_CFG, "DPU_CLK_CFG", 0x000001ff,
> + 0x000003ff, R_SYSCLK_DPU_CLK_CFG_CLK_DIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_VO_CLK_CFG, "VO_CLK_CFG", 0x00001fff,
> + 0x00001fff, 0),
> + SYSCLK_REG(SYSCLK_DISP_CLK_DIV, "DISP_CLK_DIV", 0x0000a83b,
> + 0x00ffffff, R_SYSCLK_DISP_CLK_DIV_HCLK_ROOT_CDIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_SEC_CLK_DIV, "SEC_CLK_DIV", 0x000002f3,
> + 0x00003fff, R_SYSCLK_SEC_CLK_DIV_PCLK_DIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_USB_TEST_CLK_DIV, "USB_TEST_CLK_DIV", 0x00000039,
> + 0x0000007f, R_SYSCLK_USB_TEST_CLK_DIV_CLK480_CDIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_DPHY_TEST_CLK_DIV, "DPHY_TEST_CLK_DIV", 0x00000009,
> + 0x0000001f,
> + R_SYSCLK_DPHY_TEST_CLK_DIV_TEST_CLK_CDIV_UPD_MASK),
> + SYSCLK_REG(SYSCLK_SPI2AXI_CLK_DIV, "SPI2AXI_CLK_DIV", 0x00000007,
> + 0x0000000f,
> + R_SYSCLK_SPI2AXI_CLK_DIV_CLK_DIV_UPD_MASK),
> +};
> +
> +#undef SYSCLK_REG
> +
> +static const K230PllRegDesc *k230_pll_desc(hwaddr addr,
> + unsigned *pll_index)
Please align it with the first parameter after the line break.
Thanks,
Chao
next prev parent reply other threads:[~2026-08-18 5:38 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-09 6:20 [PATCH 0/4] Kendryte K230 CMU register model Simon Law
2026-08-09 6:20 ` [PATCH 1/4] hw/misc: model K230 CMU registers Simon Law
2026-08-18 5:37 ` Chao Liu [this message]
2026-08-09 6:20 ` [PATCH 2/4] hw/riscv: connect the K230 CMU Simon Law
2026-08-09 6:20 ` [PATCH 3/4] tests/qtest: add K230 CMU coverage Simon Law
2026-08-09 6:20 ` [PATCH 4/4] docs/system/riscv: document K230 CMU support Simon Law
2026-08-14 7:53 ` [PATCH 0/4] Kendryte K230 CMU register model Bin Meng
2026-08-17 8:55 ` Niel Law
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aoPV06elI1pvi3tk@ChaodeMacBook-Pro.local \
--to=chao.liu@processmission.com \
--cc=0860734llx@gmail.com \
--cc=alistair.francis@wdc.com \
--cc=daniel.barboza@oss.qualcomm.com \
--cc=liwei1518@gmail.com \
--cc=palmer@dabbelt.com \
--cc=pierrick.bouvier@oss.qualcomm.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-riscv@nongnu.org \
--cc=zhiwei_liu@linux.alibaba.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.