[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 12/17] m25p80.c: Use QOM classes for part differenti
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PATCH 12/17] m25p80.c: Use QOM classes for part differentiation |
Date: |
Thu, 28 Feb 2013 18:53:58 +0000 |
From: Peter Crosthwaite <address@hidden>
Currently, M25P80 uses an object property to differentiate between flash parts.
Changed this over to use QOM sub-classes - the actual names of the different
parts
are used to create a set of dynamic classes which passes the part info as class
data. The object no longer needs to search the known_devices table for itself,
instead it just gets its info from its own class.
Kept the intermediate class definition private to m25p80.c for the moment, as
the expectation is parts will only be added as new entries in the table. We can
factor out the TYPE_M25P80 abstraction into a header on a demand basis.
Signed-off-by: Peter Crosthwaite <address@hidden>
Message-id: address@hidden
Reviewed-by: Andreas Färber <address@hidden>
Signed-off-by: Peter Maydell <address@hidden>
---
hw/m25p80.c | 58 +++++++++++++++++++++++++---------------------
hw/petalogix_ml605_mmu.c | 3 +--
hw/xilinx_zynq.c | 3 +--
3 files changed, 33 insertions(+), 31 deletions(-)
diff --git a/hw/m25p80.c b/hw/m25p80.c
index 461b41c..1372d06 100644
--- a/hw/m25p80.c
+++ b/hw/m25p80.c
@@ -178,8 +178,6 @@ static const FlashPartInfo known_devices[] = {
/* Numonyx -- n25q128 */
{ INFO("n25q128", 0x20ba18, 0, 64 << 10, 256, 0) },
-
- { },
};
typedef enum {
@@ -236,11 +234,23 @@ typedef struct Flash {
int64_t dirty_page;
- char *part_name;
const FlashPartInfo *pi;
} Flash;
+typedef struct M25P80Class {
+ SSISlaveClass parent_class;
+ FlashPartInfo *pi;
+} M25P80Class;
+
+#define TYPE_M25P80 "m25p80-generic"
+#define M25P80(obj) \
+ OBJECT_CHECK(Flash, (obj), TYPE_M25P80)
+#define M25P80_CLASS(klass) \
+ OBJECT_CLASS_CHECK(M25P80Class, (klass), TYPE_M25P80)
+#define M25P80_GET_CLASS(obj) \
+ OBJECT_GET_CLASS(M25P80Class, (obj), TYPE_M25P80)
+
static void bdrv_sync_complete(void *opaque, int ret)
{
/* do nothing. Masters do not directly interact with the backing store,
@@ -571,23 +581,9 @@ static int m25p80_init(SSISlave *ss)
{
DriveInfo *dinfo;
Flash *s = FROM_SSI_SLAVE(Flash, ss);
- const FlashPartInfo *i;
+ M25P80Class *mc = M25P80_GET_CLASS(s);
- if (!s->part_name) { /* default to actual m25p80 if no partname given */
- s->part_name = (char *)"m25p80";
- }
-
- i = known_devices;
- for (i = known_devices;; i++) {
- assert(i);
- if (!i->part_name) {
- fprintf(stderr, "Unknown SPI flash part: \"%s\"\n", s->part_name);
- return 1;
- } else if (!strcmp(i->part_name, s->part_name)) {
- s->pi = i;
- break;
- }
- }
+ s->pi = mc->pi;
s->size = s->pi->sector_size * s->pi->n_sectors;
s->dirty_page = -1;
@@ -635,34 +631,42 @@ static const VMStateDescription vmstate_m25p80 = {
}
};
-static Property m25p80_properties[] = {
- DEFINE_PROP_STRING("partname", Flash, part_name),
- DEFINE_PROP_END_OF_LIST(),
-};
-
static void m25p80_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
+ M25P80Class *mc = M25P80_CLASS(klass);
k->init = m25p80_init;
k->transfer = m25p80_transfer8;
k->set_cs = m25p80_cs;
k->cs_polarity = SSI_CS_LOW;
- dc->props = m25p80_properties;
dc->vmsd = &vmstate_m25p80;
+ mc->pi = data;
}
static const TypeInfo m25p80_info = {
- .name = "m25p80",
+ .name = TYPE_M25P80,
.parent = TYPE_SSI_SLAVE,
.instance_size = sizeof(Flash),
- .class_init = m25p80_class_init,
+ .class_size = sizeof(M25P80Class),
+ .abstract = true,
};
static void m25p80_register_types(void)
{
+ int i;
+
type_register_static(&m25p80_info);
+ for (i = 0; i < ARRAY_SIZE(known_devices); ++i) {
+ TypeInfo ti = {
+ .name = known_devices[i].part_name,
+ .parent = TYPE_M25P80,
+ .class_init = m25p80_class_init,
+ .class_data = (void *)&known_devices[i],
+ };
+ type_register(&ti);
+ }
}
type_init(m25p80_register_types)
diff --git a/hw/petalogix_ml605_mmu.c b/hw/petalogix_ml605_mmu.c
index 82d7183..fe7a932 100644
--- a/hw/petalogix_ml605_mmu.c
+++ b/hw/petalogix_ml605_mmu.c
@@ -158,8 +158,7 @@ petalogix_ml605_init(QEMUMachineInitArgs *args)
for (i = 0; i < NUM_SPI_FLASHES; i++) {
qemu_irq cs_line;
- dev = ssi_create_slave_no_init(spi, "m25p80");
- qdev_prop_set_string(dev, "partname", "n25q128");
+ dev = ssi_create_slave_no_init(spi, "n25q128");
qdev_init_nofail(dev);
cs_line = qdev_get_gpio_in(dev, 0);
sysbus_connect_irq(busdev, i+1, cs_line);
diff --git a/hw/xilinx_zynq.c b/hw/xilinx_zynq.c
index 39d9fb3..2f67d90 100644
--- a/hw/xilinx_zynq.c
+++ b/hw/xilinx_zynq.c
@@ -82,8 +82,7 @@ static inline void zynq_init_spi_flashes(uint32_t base_addr,
qemu_irq irq,
spi = (SSIBus *)qdev_get_child_bus(dev, bus_name);
for (j = 0; j < num_ss; ++j) {
- flash_dev = ssi_create_slave_no_init(spi, "m25p80");
- qdev_prop_set_string(flash_dev, "partname", "n25q128");
+ flash_dev = ssi_create_slave_no_init(spi, "n25q128");
qdev_init_nofail(flash_dev);
cs_line = qdev_get_gpio_in(flash_dev, 0);
--
1.7.9.5
- [Qemu-devel] [PULL 00/17] arm-devs queue, Peter Maydell, 2013/02/28
- [Qemu-devel] [PATCH 07/17] arm: a9mpcore: remove old_timer_status field, Peter Maydell, 2013/02/28
- [Qemu-devel] [PATCH 08/17] arm: a9mpcore: Coreify the SCU, Peter Maydell, 2013/02/28
- [Qemu-devel] [PATCH 11/17] xilinx_zynq: Added SD controllers, Peter Maydell, 2013/02/28
- [Qemu-devel] [PATCH 12/17] m25p80.c: Use QOM classes for part differentiation,
Peter Maydell <=
- [Qemu-devel] [PATCH 17/17] cadence_gem: Add debug msgs for rx desc movement, Peter Maydell, 2013/02/28
- [Qemu-devel] [PATCH 02/17] hw/pflash_cfi01: Make read after byte-write or erase return status, Peter Maydell, 2013/02/28
- [Qemu-devel] [PATCH 14/17] cadence_gem: factor out can_rx() logic replication, Peter Maydell, 2013/02/28
- [Qemu-devel] [PATCH 03/17] hw/pflash_cfi01: Treat read in unknown command state as read, Peter Maydell, 2013/02/28
- [Qemu-devel] [PATCH 06/17] arm: mptimer: Remove WDT distinction, Peter Maydell, 2013/02/28
- [Qemu-devel] [PATCH 13/17] cadence_gem: Flush queued packets, Peter Maydell, 2013/02/28
- [Qemu-devel] [PATCH 10/17] vl.c: allow for repeated -sd arguments, Peter Maydell, 2013/02/28
- [Qemu-devel] [PATCH 05/17] arm: arm11mpcore, a9mpcore: CamelCased type names, Peter Maydell, 2013/02/28
- [Qemu-devel] [PATCH 16/17] cadence_gem: Don't reset rx desc pointer on rx_en, Peter Maydell, 2013/02/28
- [Qemu-devel] [PATCH 15/17] cadence_gem: fix interrupt events, Peter Maydell, 2013/02/28