@samitouri / QOSamiQemu / commits / 38b5256375

hw/misc: Add AX3000 clock control

This patch adds a new model for Axiado AX3000 clock control which supports to read ID and status Signed-off-by: Kuan-Jui Chiu <kchiu@axiado.com> Message-id: 20260713073033.3883619-3-kchiu@axiado.com [PMM: use HWADDR_PRIx] Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Kuan-Jui Chiu committed Aug 11, 2026 at 20:14 UTC 38b52563758ec3fe5df2ba8efa86b155ad79649d
4 files changed +111
hw/misc/Kconfig
+3
@@ -257,4 +257,7 @@ config XLNX_VERSAL_TRNG
257 config XLNX_ZYNQ_DDRC
258 bool
259
260 +config AXIADO_CLK
261 + bool
262 +
263 source macio/Kconfig
hw/misc/axiado_clk.c new
+79
@@ -0,0 +1,79 @@
1 +/*
2 + * Axiado Clock Control
3 + *
4 + * Author: Kuan-Jui Chiu <kchiu@axiado.com>
5 + *
6 + * SPDX-License-Identifier: GPL-2.0-or-later
7 + */
8 +
9 +#include "qemu/osdep.h"
10 +#include "hw/misc/axiado_clk.h"
11 +#include "qemu/log.h"
12 +
13 +#define CLKRST_CPU_PLL_POSTDIV_OFFSET 0x0C
14 +#define CLKRST_CPU_PLL_STS_OFFSET 0x14
15 +
16 +static uint64_t pll_read(void *opaque, hwaddr offset, unsigned size)
17 +{
18 + switch (offset) {
19 + case CLKRST_CPU_PLL_POSTDIV_OFFSET:
20 + return 0x20891b;
21 + case CLKRST_CPU_PLL_STS_OFFSET:
22 + return 0x01;
23 + default:
24 + qemu_log_mask(LOG_UNIMP,
25 + "Register 0x%" HWADDR_PRIx " not implemented\n", offset);
26 + break;
27 + }
28 + return 0x00;
29 +}
30 +
31 +static void pll_write(void *opaque, hwaddr offset, uint64_t val, unsigned size)
32 +{
33 + qemu_log_mask(LOG_UNIMP,
34 + "Register 0x%" HWADDR_PRIx " not implemented\n", offset);
35 +}
36 +
37 +static const MemoryRegionOps pll_ops = {
38 + .read = pll_read,
39 + .write = pll_write,
40 + .endianness = DEVICE_LITTLE_ENDIAN,
41 + .impl = {
42 + .min_access_size = 4,
43 + .max_access_size = 4,
44 + },
45 + .valid = {
46 + .min_access_size = 4,
47 + .max_access_size = 4,
48 + }
49 +};
50 +
51 +static void ax3000_clk_init(Object *obj)
52 +{
53 + Ax3000ClkState *s = AX3000_CLK(obj);
54 +
55 + memory_region_init_io(&s->pll_ctrl, obj, &pll_ops, s,
56 + TYPE_AX3000_CLK, AX3000_CLK_PLL_CTRL_SIZE);
57 + sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->pll_ctrl);
58 +}
59 +
60 +static void ax3000_clk_class_init(ObjectClass *klass, const void *data)
61 +{
62 + DeviceClass *dc = DEVICE_CLASS(klass);
63 +
64 + dc->desc = "Axiado AX3000 Clock Control";
65 +}
66 +
67 +static const TypeInfo ax3000_clk_info = {
68 + .parent = TYPE_SYS_BUS_DEVICE,
69 + .name = TYPE_AX3000_CLK,
70 + .instance_size = sizeof(Ax3000ClkState),
71 + .instance_init = ax3000_clk_init,
72 + .class_init = ax3000_clk_class_init,
73 +};
74 +
75 +static void axiado_clk_register_type(void)
76 +{
77 + type_register_static(&ax3000_clk_info);
78 +}
79 +type_init(axiado_clk_register_type);
hw/misc/meson.build
+3
@@ -1,4 +1,5 @@
1 system_ss.add(when: 'CONFIG_APPLESMC', if_true: files('applesmc.c'))
2 +
3 system_ss.add(when: 'CONFIG_EDU', if_true: files('edu.c'))
4 system_ss.add(when: 'CONFIG_FW_CFG_DMA', if_true: files('vmcoreinfo.c'))
5 system_ss.add(when: 'CONFIG_ISA_DEBUG', if_true: files('debugexit.c'))
@@ -168,3 +169,5 @@ system_ss.add(when: 'CONFIG_SBSA_REF', if_true: files('sbsa_ec.c'))
169
170 # HPPA devices
171 system_ss.add(when: 'CONFIG_LASI', if_true: files('lasi.c'))
172 +
173 +system_ss.add(when: 'CONFIG_AXIADO_CLK', if_true: files('axiado_clk.c'))
include/hw/misc/axiado_clk.h new
+26
@@ -0,0 +1,26 @@
1 +/*
2 + * Axiado AX3000 Clock Control
3 + *
4 + * Author: Kuan-Jui Chiu <kchiu@axiado.com>
5 + *
6 + * SPDX-License-Identifier: GPL-2.0-or-later
7 + */
8 +
9 +#ifndef AXIADO_AX3000_CLK_H
10 +#define AXIADO_AX3000_CLK_H
11 +
12 +#include "hw/core/sysbus.h"
13 +#include "qom/object.h"
14 +
15 +#define TYPE_AX3000_CLK "ax3000-clk"
16 +OBJECT_DECLARE_SIMPLE_TYPE(Ax3000ClkState, AX3000_CLK)
17 +
18 +#define AX3000_CLK_PLL_CTRL_SIZE 0x1000
19 +
20 +typedef struct Ax3000ClkState {
21 + SysBusDevice parent;
22 +
23 + MemoryRegion pll_ctrl;
24 +} Ax3000ClkState;
25 +
26 +#endif /* AXIADO_AX3000_CLK_H */