Commit 5eceb48bbe86 (hw/gpio: pca9554: add PCA9536 support) made type
"pca9535" a child of concrete type "pca9555".  This is inconvenient
for the next commit.  Make them both children of new abstract type
"pca9554-base".

Signed-off-by: Markus Armbruster <[email protected]>
---
 include/hw/gpio/pca9554.h |  1 +
 hw/gpio/pca9554.c         | 55 +++++++++++++++++++++++----------------
 2 files changed, 33 insertions(+), 23 deletions(-)

diff --git a/include/hw/gpio/pca9554.h b/include/hw/gpio/pca9554.h
index 1b33a8a752..0d841ff017 100644
--- a/include/hw/gpio/pca9554.h
+++ b/include/hw/gpio/pca9554.h
@@ -8,6 +8,7 @@
 #ifndef PCA9554_H
 #define PCA9554_H
 
+#define TYPE_PCA9554_BASE "pca9554-base"
 #define TYPE_PCA9554 "pca9554"
 #define TYPE_PCA9536 "pca9536"
 
diff --git a/hw/gpio/pca9554.c b/hw/gpio/pca9554.c
index caa73f63c9..1362b605c2 100644
--- a/hw/gpio/pca9554.c
+++ b/hw/gpio/pca9554.c
@@ -26,7 +26,7 @@
 #define PCA9554_PIN_COUNT 8
 #define PCA9536_PIN_COUNT 4
 
-OBJECT_DECLARE_TYPE(PCA9554State, PCA9554Class, PCA9554)
+OBJECT_DECLARE_TYPE(PCA9554State, PCA9554Class, PCA9554_BASE)
 
 struct PCA9554State {
     /*< private >*/
@@ -58,7 +58,7 @@ static const char *pin_state[] = {"low", "high"};
 
 static void pca9554_update_pin_input(PCA9554State *s)
 {
-    PCA9554Class *pc = PCA9554_GET_CLASS(s);
+    PCA9554Class *pc = PCA9554_BASE_GET_CLASS(s);
     int i;
     uint8_t config = s->regs[PCA9554_CONFIG];
     uint8_t output = s->regs[PCA9554_OUTPUT];
@@ -110,7 +110,7 @@ static uint8_t pca9554_read(PCA9554State *s, uint8_t reg)
 
 static void pca9554_write(PCA9554State *s, uint8_t reg, uint8_t data)
 {
-    PCA9554Class *pc = PCA9554_GET_CLASS(s);
+    PCA9554Class *pc = PCA9554_BASE_GET_CLASS(s);
     uint8_t pin_mask = (1 << pc->pin_count) - 1;
 
     /* Variants narrower than 8 bits ignore the unimplemented upper pins. */
@@ -134,14 +134,14 @@ static void pca9554_write(PCA9554State *s, uint8_t reg, 
uint8_t data)
 
 static uint8_t pca9554_recv(I2CSlave *i2c)
 {
-    PCA9554State *s = PCA9554(i2c);
+    PCA9554State *s = PCA9554_BASE(i2c);
 
     return pca9554_read(s, s->pointer & 0x3);
 }
 
 static int pca9554_send(I2CSlave *i2c, uint8_t data)
 {
-    PCA9554State *s = PCA9554(i2c);
+    PCA9554State *s = PCA9554_BASE(i2c);
 
     /* First byte sent by is the register address */
     if (s->len == 0) {
@@ -156,7 +156,7 @@ static int pca9554_send(I2CSlave *i2c, uint8_t data)
 
 static int pca9554_event(I2CSlave *i2c, enum i2c_event event)
 {
-    PCA9554State *s = PCA9554(i2c);
+    PCA9554State *s = PCA9554_BASE(i2c);
 
     s->len = 0;
     return 0;
@@ -173,7 +173,7 @@ static void pca9554_set_ext_state(PCA9554State *s, int pin, 
int level)
 static void pca9554_get_pin(Object *obj, Visitor *v, const char *name,
                             void *opaque, Error **errp)
 {
-    PCA9554State *s = PCA9554(obj);
+    PCA9554State *s = PCA9554_BASE(obj);
     int pin, rc;
     uint8_t state;
 
@@ -182,7 +182,7 @@ static void pca9554_get_pin(Object *obj, Visitor *v, const 
char *name,
         error_setg(errp, "%s: error reading %s", __func__, name);
         return;
     }
-    if (pin < 0 || pin >= PCA9554_GET_CLASS(s)->pin_count) {
+    if (pin < 0 || pin >= PCA9554_BASE_GET_CLASS(s)->pin_count) {
         error_setg(errp, "%s invalid pin %s", __func__, name);
         return;
     }
@@ -200,7 +200,7 @@ static void pca9554_get_pin(Object *obj, Visitor *v, const 
char *name,
 static void pca9554_set_pin(Object *obj, Visitor *v, const char *name,
                             void *opaque, Error **errp)
 {
-    PCA9554State *s = PCA9554(obj);
+    PCA9554State *s = PCA9554_BASE(obj);
     int pin, rc, val;
     uint8_t state, mask;
     g_autofree char *state_str = NULL;
@@ -213,7 +213,7 @@ static void pca9554_set_pin(Object *obj, Visitor *v, const 
char *name,
         error_setg(errp, "%s: error reading %s", __func__, name);
         return;
     }
-    if (pin < 0 || pin >= PCA9554_GET_CLASS(s)->pin_count) {
+    if (pin < 0 || pin >= PCA9554_BASE_GET_CLASS(s)->pin_count) {
         error_setg(errp, "%s invalid pin %s", __func__, name);
         return;
     }
@@ -274,8 +274,8 @@ static const VMStateDescription pca9554_vmstate = {
 
 static void pca9554_reset(DeviceState *dev)
 {
-    PCA9554State *s = PCA9554(dev);
-    PCA9554Class *pc = PCA9554_GET_CLASS(s);
+    PCA9554State *s = PCA9554_BASE(dev);
+    PCA9554Class *pc = PCA9554_BASE_GET_CLASS(s);
     uint8_t pin_mask = (1 << pc->pin_count) - 1;
 
     s->regs[PCA9554_INPUT] = pin_mask;
@@ -292,7 +292,7 @@ static void pca9554_reset(DeviceState *dev)
 
 static void pca9554_initfn(Object *obj)
 {
-    PCA9554Class *pc = PCA9554_GET_CLASS(obj);
+    PCA9554Class *pc = PCA9554_BASE_GET_CLASS(obj);
     int pin;
 
     for (pin = 0; pin < pc->pin_count; pin++) {
@@ -308,8 +308,8 @@ static void pca9554_initfn(Object *obj)
 
 static void pca9554_gpio_in_handler(void *opaque, int pin, int level)
 {
-    PCA9554State *s = PCA9554(opaque);
-    PCA9554Class *pc = PCA9554_GET_CLASS(s);
+    PCA9554State *s = PCA9554_BASE(opaque);
+    PCA9554Class *pc = PCA9554_BASE_GET_CLASS(s);
 
     assert((pin >= 0) && (pin < pc->pin_count));
     pca9554_set_ext_state(s, pin, level);
@@ -317,8 +317,8 @@ static void pca9554_gpio_in_handler(void *opaque, int pin, 
int level)
 
 static void pca9554_realize(DeviceState *dev, Error **errp)
 {
-    PCA9554State *s = PCA9554(dev);
-    PCA9554Class *pc = PCA9554_GET_CLASS(s);
+    PCA9554State *s = PCA9554_BASE(dev);
+    PCA9554Class *pc = PCA9554_BASE_GET_CLASS(s);
 
     if (!s->description) {
         s->description = g_strdup(object_get_typename(OBJECT(dev)));
@@ -333,11 +333,10 @@ static const Property pca9554_properties[] = {
     DEFINE_PROP_BOOL("hw-dir", PCA9554State, hw_dir, false),
 };
 
-static void pca9554_class_init(ObjectClass *klass, const void *data)
+static void pca9554_base_class_init(ObjectClass *klass, const void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
     I2CSlaveClass *k = I2C_SLAVE_CLASS(klass);
-    PCA9554Class *pc = PCA9554_CLASS(klass);
 
     k->event = pca9554_event;
     k->recv = pca9554_recv;
@@ -346,26 +345,36 @@ static void pca9554_class_init(ObjectClass *klass, const 
void *data)
     device_class_set_legacy_reset(dc, pca9554_reset);
     dc->vmsd = &pca9554_vmstate;
     device_class_set_props(dc, pca9554_properties);
+}
+
+static void pca9554_class_init(ObjectClass *klass, const void *data)
+{
+    PCA9554Class *pc = PCA9554_BASE_CLASS(klass);
 
     pc->pin_count = PCA9554_PIN_COUNT;
 }
 
 static void pca9536_class_init(ObjectClass *klass, const void *data)
 {
-    PCA9554Class *pc = PCA9554_CLASS(klass);
+    PCA9554Class *pc = PCA9554_BASE_CLASS(klass);
 
     pc->pin_count = PCA9536_PIN_COUNT;
 }
 
 static const TypeInfo pca9554_types[] = {
     {
-        .name          = TYPE_PCA9554,
+        .name          = TYPE_PCA9554_BASE,
         .parent        = TYPE_I2C_SLAVE,
         .instance_init = pca9554_initfn,
         .instance_size = sizeof(PCA9554State),
-        .class_init    = pca9554_class_init,
+        .class_init    = pca9554_base_class_init,
         .class_size    = sizeof(PCA9554Class),
-        .abstract      = false,
+        .abstract      = true,
+    },
+    {
+        .name          = TYPE_PCA9554,
+        .parent        = TYPE_PCA9554_BASE,
+        .class_init    = pca9554_class_init,
     },
     {
         .name          = TYPE_PCA9536,
-- 
2.55.0


Reply via email to