All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] hw/adc: convert object props to class props
@ 2026-06-24 15:32 Mark Cave-Ayland
  2026-06-24 15:32 ` [PATCH 1/2] qom: add support for array class properties Mark Cave-Ayland
  2026-06-24 15:32 ` [PATCH 2/2] hw/adc/npcm7xx_adc.c: convert NPCM7XX_ADC object props to class props Mark Cave-Ayland
  0 siblings, 2 replies; 4+ messages in thread
From: Mark Cave-Ayland @ 2026-06-24 15:32 UTC (permalink / raw)
  To: alistair, peter.maydell, kfting, wuhaotsh, pbonzini, berrange,
	qemu-arm, qemu-devel

Since the use of object props is effectively deprecated, here is an attempt
to convert all use of object props in hw/adc to class props. The eventual
aim is to continue working through the codebase, removing all remaining uses
of object props.

The series is lightly tested: it passes "make check", GitLab CI and some
simple local tests. I'm mostly interested for feedback on the conversion
strategy, and to get a feel for the best way to merge this series since once
the basic conversion patterns are in place, the same patterns can be applied
elsewhere and it would be good to minimise the merge window for such changes.

Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>


Mark Cave-Ayland (2):
  qom: add support for array class properties
  hw/adc/npcm7xx_adc.c: convert NPCM7XX_ADC object props to class props

 hw/adc/npcm7xx_adc.c | 75 +++++++++++++++++++++++++++++++++++++++-----
 qom/object.c         | 27 ++++++++++++++++
 2 files changed, 95 insertions(+), 7 deletions(-)

-- 
2.43.0



^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/2] qom: add support for array class properties
  2026-06-24 15:32 [PATCH 0/2] hw/adc: convert object props to class props Mark Cave-Ayland
@ 2026-06-24 15:32 ` Mark Cave-Ayland
  2026-06-24 15:32 ` [PATCH 2/2] hw/adc/npcm7xx_adc.c: convert NPCM7XX_ADC object props to class props Mark Cave-Ayland
  1 sibling, 0 replies; 4+ messages in thread
From: Mark Cave-Ayland @ 2026-06-24 15:32 UTC (permalink / raw)
  To: alistair, peter.maydell, kfting, wuhaotsh, pbonzini, berrange,
	qemu-arm, qemu-devel

These will be required for the upcoming conversions of object properties to
class properties.

Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
 qom/object.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/qom/object.c b/qom/object.c
index 0ac201de4c..204871cb53 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1411,6 +1411,33 @@ object_class_property_add(ObjectClass *klass,
                           void *opaque)
 {
     ObjectProperty *prop;
+    size_t name_len = strlen(name);
+
+    if (name_len >= 3 && !memcmp(name + name_len - 3, "[*]", 4)) {
+        int i;
+        ObjectProperty *ret = NULL;
+        char *name_no_array = g_strdup(name);
+
+        name_no_array[name_len - 3] = '\0';
+        for (i = 0; i < INT16_MAX; ++i) {
+            char *full_name = g_strdup_printf("%s[%d]", name_no_array, i);
+
+            if (object_class_property_find(klass, full_name)) {
+                g_free(full_name);
+                continue;
+            }
+
+            ret = object_class_property_add(klass, full_name, type, get, set,
+                                            release, opaque);
+            g_free(full_name);
+            if (ret) {
+                break;
+            }
+        }
+        g_free(name_no_array);
+        assert(ret);
+        return ret;
+    }
 
     assert(!object_class_property_find(klass, name));
 
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] hw/adc/npcm7xx_adc.c: convert NPCM7XX_ADC object props to class props
  2026-06-24 15:32 [PATCH 0/2] hw/adc: convert object props to class props Mark Cave-Ayland
  2026-06-24 15:32 ` [PATCH 1/2] qom: add support for array class properties Mark Cave-Ayland
@ 2026-06-24 15:32 ` Mark Cave-Ayland
  2026-06-24 17:04   ` Daniel P. Berrangé
  1 sibling, 1 reply; 4+ messages in thread
From: Mark Cave-Ayland @ 2026-06-24 15:32 UTC (permalink / raw)
  To: alistair, peter.maydell, kfting, wuhaotsh, pbonzini, berrange,
	qemu-arm, qemu-devel

Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
 hw/adc/npcm7xx_adc.c | 75 +++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 68 insertions(+), 7 deletions(-)

diff --git a/hw/adc/npcm7xx_adc.c b/hw/adc/npcm7xx_adc.c
index 3584c27c75..accaaf2620 100644
--- a/hw/adc/npcm7xx_adc.c
+++ b/hw/adc/npcm7xx_adc.c
@@ -20,6 +20,8 @@
 #include "hw/core/qdev-properties.h"
 #include "hw/core/registerfields.h"
 #include "migration/vmstate.h"
+#include "qapi/error.h"
+#include "qapi/visitor.h"
 #include "qemu/log.h"
 #include "qemu/module.h"
 #include "qemu/timer.h"
@@ -229,7 +231,6 @@ static void npcm7xx_adc_init(Object *obj)
 {
     NPCM7xxADCState *s = NPCM7XX_ADC(obj);
     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
-    int i;
 
     sysbus_init_irq(sbd, &s->irq);
 
@@ -240,15 +241,63 @@ static void npcm7xx_adc_init(Object *obj)
     sysbus_init_mmio(sbd, &s->iomem);
     s->clock = qdev_init_clock_in(DEVICE(s), "clock", NULL, NULL, 0);
 
-    for (i = 0; i < NPCM7XX_ADC_NUM_INPUTS; ++i) {
-        object_property_add_uint32_ptr(obj, "adci[*]",
-                &s->adci[i], OBJ_PROP_FLAG_READWRITE);
-    }
-    object_property_add_uint32_ptr(obj, "vref",
-            &s->vref, OBJ_PROP_FLAG_WRITE);
     npcm7xx_adc_calibrate(s);
 }
 
+static void npcm7xx_adc_get_input(Object *obj, Visitor *v,
+                                  const char *name, void *opaque,
+                                  Error **errp)
+{
+    NPCM7xxADCState *s = NPCM7XX_ADC(obj);
+    uint32_t idx, val;
+    int res;
+
+    res = sscanf(name, "adci[%u]", &idx);
+    if (res == EOF || res != 1) {
+        error_setg(errp, "unable to parse index from %s", name);
+        return;
+    }
+
+    val = s->adci[idx];
+    visit_type_uint32(v, name, &val, errp);
+}
+
+static void npcm7xx_adc_set_input(Object *obj, Visitor *v,
+                                  const char *name, void *opaque,
+                                  Error **errp)
+{
+    NPCM7xxADCState *s = NPCM7XX_ADC(obj);
+    uint32_t idx, val;
+    int res;
+
+    res = sscanf(name, "adci[%u]", &idx);
+    if (res == EOF || res != 1) {
+        error_setg(errp, "unable to parse index from %s", name);
+        return;
+    }
+
+    val = s->adci[idx];
+    if (!visit_type_uint32(v, name, &val, errp)) {
+        return;
+    }
+
+    s->adci[idx] = val;
+}
+
+static void npcm7xx_adc_set_vref(Object *obj, Visitor *v,
+                                 const char *name, void *opaque,
+                                 Error **errp)
+{
+    NPCM7xxADCState *s = NPCM7XX_ADC(obj);
+    uint32_t vref = s->vref;
+
+    if (!visit_type_uint32(v, name, &vref, errp)) {
+        return;
+    }
+
+    s->vref = vref;
+}
+
 static const VMStateDescription vmstate_npcm7xx_adc = {
     .name = "npcm7xx-adc",
     .version_id = 0,
@@ -275,6 +324,7 @@ static void npcm7xx_adc_class_init(ObjectClass *klass, const void *data)
 {
     ResettableClass *rc = RESETTABLE_CLASS(klass);
     DeviceClass *dc = DEVICE_CLASS(klass);
+    int i;
 
     dc->desc = "NPCM7xx ADC Module";
     dc->vmsd = &vmstate_npcm7xx_adc;
@@ -282,6 +332,17 @@ static void npcm7xx_adc_class_init(ObjectClass *klass, const void *data)
     rc->phases.hold = npcm7xx_adc_hold_reset;
 
     device_class_set_props(dc, npcm7xx_timer_properties);
+
+    for (i = 0; i < NPCM7XX_ADC_NUM_INPUTS; ++i) {
+        object_class_property_add(klass, "adci[*]", "uint32",
+                                  npcm7xx_adc_get_input,
+                                  npcm7xx_adc_set_input,
+                                  NULL, NULL);
+    }
+    object_class_property_add(klass, "vref", "uint32",
+                              NULL,
+                              npcm7xx_adc_set_vref,
+                              NULL, NULL);
 }
 
 static const TypeInfo npcm7xx_adc_info = {
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] hw/adc/npcm7xx_adc.c: convert NPCM7XX_ADC object props to class props
  2026-06-24 15:32 ` [PATCH 2/2] hw/adc/npcm7xx_adc.c: convert NPCM7XX_ADC object props to class props Mark Cave-Ayland
@ 2026-06-24 17:04   ` Daniel P. Berrangé
  0 siblings, 0 replies; 4+ messages in thread
From: Daniel P. Berrangé @ 2026-06-24 17:04 UTC (permalink / raw)
  To: Mark Cave-Ayland
  Cc: alistair, peter.maydell, kfting, wuhaotsh, pbonzini, qemu-arm,
	qemu-devel

On Wed, Jun 24, 2026 at 04:32:30PM +0100, Mark Cave-Ayland wrote:
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
>  hw/adc/npcm7xx_adc.c | 75 +++++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 68 insertions(+), 7 deletions(-)
> 
> diff --git a/hw/adc/npcm7xx_adc.c b/hw/adc/npcm7xx_adc.c
> index 3584c27c75..accaaf2620 100644
> --- a/hw/adc/npcm7xx_adc.c
> +++ b/hw/adc/npcm7xx_adc.c
> @@ -20,6 +20,8 @@
>  #include "hw/core/qdev-properties.h"
>  #include "hw/core/registerfields.h"
>  #include "migration/vmstate.h"
> +#include "qapi/error.h"
> +#include "qapi/visitor.h"
>  #include "qemu/log.h"
>  #include "qemu/module.h"
>  #include "qemu/timer.h"
> @@ -229,7 +231,6 @@ static void npcm7xx_adc_init(Object *obj)
>  {
>      NPCM7xxADCState *s = NPCM7XX_ADC(obj);
>      SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
> -    int i;
>  
>      sysbus_init_irq(sbd, &s->irq);
>  
> @@ -240,15 +241,63 @@ static void npcm7xx_adc_init(Object *obj)
>      sysbus_init_mmio(sbd, &s->iomem);
>      s->clock = qdev_init_clock_in(DEVICE(s), "clock", NULL, NULL, 0);
>  
> -    for (i = 0; i < NPCM7XX_ADC_NUM_INPUTS; ++i) {
> -        object_property_add_uint32_ptr(obj, "adci[*]",
> -                &s->adci[i], OBJ_PROP_FLAG_READWRITE);
> -    }
> -    object_property_add_uint32_ptr(obj, "vref",
> -            &s->vref, OBJ_PROP_FLAG_WRITE);
>      npcm7xx_adc_calibrate(s);
>  }
>  
> +static void npcm7xx_adc_get_input(Object *obj, Visitor *v,
> +                                  const char *name, void *opaque,
> +                                  Error **errp)
> +{
> +    NPCM7xxADCState *s = NPCM7XX_ADC(obj);
> +    uint32_t idx, val;
> +    int res;
> +
> +    res = sscanf(name, "adci[%u]", &idx);
> +    if (res == EOF || res != 1) {
> +        error_setg(errp, "unable to parse index from %s", name);
> +        return;
> +    }
> +
> +    val = s->adci[idx];
> +    visit_type_uint32(v, name, &val, errp);
> +}
> +
> +static void npcm7xx_adc_set_input(Object *obj, Visitor *v,
> +                                  const char *name, void *opaque,
> +                                  Error **errp)
> +{
> +    NPCM7xxADCState *s = NPCM7XX_ADC(obj);
> +    uint32_t idx, val;
> +    int res;
> +
> +    res = sscanf(name, "adci[%u]", &idx);
> +    if (res == EOF || res != 1) {
> +        error_setg(errp, "unable to parse index from %s", name);
> +        return;
> +    }
> +
> +    val = s->adci[idx];
> +    if (!visit_type_uint32(v, name, &val, errp)) {
> +        return;
> +    }
> +
> +    s->adci[idx] = val;
> +}
> +
> +static void npcm7xx_adc_set_vref(Object *obj, Visitor *v,
> +                                 const char *name, void *opaque,
> +                                 Error **errp)
> +{
> +    NPCM7xxADCState *s = NPCM7XX_ADC(obj);
> +    uint32_t vref = s->vref;
> +
> +    if (!visit_type_uint32(v, name, &vref, errp)) {
> +        return;
> +    }
> +
> +    s->vref = vref;
> +}
> +
>  static const VMStateDescription vmstate_npcm7xx_adc = {
>      .name = "npcm7xx-adc",
>      .version_id = 0,
> @@ -275,6 +324,7 @@ static void npcm7xx_adc_class_init(ObjectClass *klass, const void *data)
>  {
>      ResettableClass *rc = RESETTABLE_CLASS(klass);
>      DeviceClass *dc = DEVICE_CLASS(klass);
> +    int i;
>  
>      dc->desc = "NPCM7xx ADC Module";
>      dc->vmsd = &vmstate_npcm7xx_adc;
> @@ -282,6 +332,17 @@ static void npcm7xx_adc_class_init(ObjectClass *klass, const void *data)
>      rc->phases.hold = npcm7xx_adc_hold_reset;
>  
>      device_class_set_props(dc, npcm7xx_timer_properties);
> +
> +    for (i = 0; i < NPCM7XX_ADC_NUM_INPUTS; ++i) {
> +        object_class_property_add(klass, "adci[*]", "uint32",
> +                                  npcm7xx_adc_get_input,
> +                                  npcm7xx_adc_set_input,
> +                                  NULL, NULL);
> +    }

IMHO the logic around "[*]" expansion is mostly useful for child
properties where you don't know ahead of time how many relationships
might already exist.

In this case though, we know exactly how many props we want and we
know we want to start from 0. 

How about we do this explicitly:

   g_autofree char *adciprop = g_strdup_printf("adci[%u]", i);
   object_class_property_add(klass, adciprop, "uint32",
                             npcm7xx_adc_get_input,
                             npcm7xx_adc_set_input,
                             NULL, NULL);

which avoids the O(N^2) performance of handling '[*]' and
thus makes the prior patch redundant.

I kind of wish we didn't have '[' in the property name but
we're probably stuck with that for back compat.

> +    object_class_property_add(klass, "vref", "uint32",
> +                              NULL,
> +                              npcm7xx_adc_set_vref,
> +                              NULL, NULL);
>  }
>  
>  static const TypeInfo npcm7xx_adc_info = {
> -- 
> 2.43.0
> 

With regards,
Daniel
-- 
|: https://berrange.com       ~~        https://hachyderm.io/@berrange :|
|: https://libvirt.org          ~~          https://entangle-photo.org :|
|: https://pixelfed.art/berrange   ~~    https://fstop138.berrange.com :|



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-06-24 17:05 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-24 15:32 [PATCH 0/2] hw/adc: convert object props to class props Mark Cave-Ayland
2026-06-24 15:32 ` [PATCH 1/2] qom: add support for array class properties Mark Cave-Ayland
2026-06-24 15:32 ` [PATCH 2/2] hw/adc/npcm7xx_adc.c: convert NPCM7XX_ADC object props to class props Mark Cave-Ayland
2026-06-24 17:04   ` Daniel P. Berrangé

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.