hw/arm/iotkit: Refactor into abstract base class and subclass
The Arm SSE-200 Subsystem for Embedded is a revised and extended version of the older IoTKit SoC. Prepare for adding a model of it by refactoring the IoTKit code into an abstract base class which contains the functionality, driven by a class data block specific to each subclass. (This is the same approach used by the existing bcm283x SoC family implementation.) Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20190121185118.18550-6-peter.maydell@linaro.org
This commit is contained in:
parent
93dbd10347
commit
4c3690b591
@ -18,6 +18,16 @@
|
|||||||
#include "hw/arm/iotkit.h"
|
#include "hw/arm/iotkit.h"
|
||||||
#include "hw/arm/arm.h"
|
#include "hw/arm/arm.h"
|
||||||
|
|
||||||
|
struct ARMSSEInfo {
|
||||||
|
const char *name;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const ARMSSEInfo armsse_variants[] = {
|
||||||
|
{
|
||||||
|
.name = TYPE_IOTKIT,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
/* Clock frequency in HZ of the 32KHz "slow clock" */
|
/* Clock frequency in HZ of the 32KHz "slow clock" */
|
||||||
#define S32KCLK (32 * 1000)
|
#define S32KCLK (32 * 1000)
|
||||||
|
|
||||||
@ -732,29 +742,43 @@ static void iotkit_class_init(ObjectClass *klass, void *data)
|
|||||||
{
|
{
|
||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||||
IDAUInterfaceClass *iic = IDAU_INTERFACE_CLASS(klass);
|
IDAUInterfaceClass *iic = IDAU_INTERFACE_CLASS(klass);
|
||||||
|
ARMSSEClass *asc = ARMSSE_CLASS(klass);
|
||||||
|
|
||||||
dc->realize = iotkit_realize;
|
dc->realize = iotkit_realize;
|
||||||
dc->vmsd = &iotkit_vmstate;
|
dc->vmsd = &iotkit_vmstate;
|
||||||
dc->props = iotkit_properties;
|
dc->props = iotkit_properties;
|
||||||
dc->reset = iotkit_reset;
|
dc->reset = iotkit_reset;
|
||||||
iic->check = iotkit_idau_check;
|
iic->check = iotkit_idau_check;
|
||||||
|
asc->info = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const TypeInfo iotkit_info = {
|
static const TypeInfo armsse_info = {
|
||||||
.name = TYPE_ARMSSE,
|
.name = TYPE_ARMSSE,
|
||||||
.parent = TYPE_SYS_BUS_DEVICE,
|
.parent = TYPE_SYS_BUS_DEVICE,
|
||||||
.instance_size = sizeof(ARMSSE),
|
.instance_size = sizeof(ARMSSE),
|
||||||
.instance_init = iotkit_init,
|
.instance_init = iotkit_init,
|
||||||
.class_init = iotkit_class_init,
|
.abstract = true,
|
||||||
.interfaces = (InterfaceInfo[]) {
|
.interfaces = (InterfaceInfo[]) {
|
||||||
{ TYPE_IDAU_INTERFACE },
|
{ TYPE_IDAU_INTERFACE },
|
||||||
{ }
|
{ }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static void iotkit_register_types(void)
|
static void armsse_register_types(void)
|
||||||
{
|
{
|
||||||
type_register_static(&iotkit_info);
|
int i;
|
||||||
|
|
||||||
|
type_register_static(&armsse_info);
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(armsse_variants); i++) {
|
||||||
|
TypeInfo ti = {
|
||||||
|
.name = armsse_variants[i].name,
|
||||||
|
.parent = TYPE_ARMSSE,
|
||||||
|
.class_init = iotkit_class_init,
|
||||||
|
.class_data = (void *)&armsse_variants[i],
|
||||||
|
};
|
||||||
|
type_register(&ti);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type_init(iotkit_register_types);
|
type_init(armsse_register_types);
|
||||||
|
@ -74,15 +74,15 @@
|
|||||||
#include "hw/or-irq.h"
|
#include "hw/or-irq.h"
|
||||||
#include "hw/core/split-irq.h"
|
#include "hw/core/split-irq.h"
|
||||||
|
|
||||||
#define TYPE_ARMSSE "iotkit"
|
#define TYPE_ARMSSE "arm-sse"
|
||||||
#define ARMSSE(obj) OBJECT_CHECK(ARMSSE, (obj), TYPE_ARMSSE)
|
#define ARMSSE(obj) OBJECT_CHECK(ARMSSE, (obj), TYPE_ARMSSE)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For the moment TYPE_IOTKIT is a synonym for TYPE_ARMSSE (and the
|
* These type names are for specific IoTKit subsystems; other than
|
||||||
* latter's underlying name is left as "iotkit"); in a later
|
* instantiating them, code using these devices should always handle
|
||||||
* commit it will become a subclass of TYPE_ARMSSE.
|
* them via the ARMSSE base class, so they have no IOTKIT() etc macros.
|
||||||
*/
|
*/
|
||||||
#define TYPE_IOTKIT TYPE_ARMSSE
|
#define TYPE_IOTKIT "iotkit"
|
||||||
|
|
||||||
/* We have an IRQ splitter and an OR gate input for each external PPC
|
/* We have an IRQ splitter and an OR gate input for each external PPC
|
||||||
* and the 2 internal PPCs
|
* and the 2 internal PPCs
|
||||||
@ -143,4 +143,16 @@ typedef struct ARMSSE {
|
|||||||
uint32_t mainclk_frq;
|
uint32_t mainclk_frq;
|
||||||
} ARMSSE;
|
} ARMSSE;
|
||||||
|
|
||||||
|
typedef struct ARMSSEInfo ARMSSEInfo;
|
||||||
|
|
||||||
|
typedef struct ARMSSEClass {
|
||||||
|
DeviceClass parent_class;
|
||||||
|
const ARMSSEInfo *info;
|
||||||
|
} ARMSSEClass;
|
||||||
|
|
||||||
|
#define ARMSSE_CLASS(klass) \
|
||||||
|
OBJECT_CLASS_CHECK(ARMSSEClass, (klass), TYPE_ARMSSE)
|
||||||
|
#define ARMSSE_GET_CLASS(obj) \
|
||||||
|
OBJECT_GET_CLASS(ARMSSEClass, (obj), TYPE_ARMSSE)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user