hw/i2c/pmbus_device: Fix modifying QOM class internals from instance

QOM object instance should not modify its class state (because
all other objects instanciated from this class get affected).

Instead of modifying the PMBusDeviceClass 'device_num_pages' field
the first time a instance is initialized (in pmbus_pages_alloc),
introduce a new pmbus_pages_num() helper which returns the page
number from the class without modifying the class state.

The code logic become slighly simplified.

Inspired-by: Bernhard Beschow <shentey@gmail.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20230523064408.57941-4-philmd@linaro.org>
This commit is contained in:
Philippe Mathieu-Daudé 2023-05-12 10:20:52 +02:00
parent 0773885236
commit f0e4588fd4

View File

@ -190,15 +190,18 @@ static void pmbus_quick_cmd(SMBusDevice *smd, uint8_t read)
}
}
static uint8_t pmbus_pages_num(PMBusDevice *pmdev)
{
const PMBusDeviceClass *k = PMBUS_DEVICE_GET_CLASS(pmdev);
/* some PMBus devices don't use the PAGE command, so they get 1 page */
return k->device_num_pages ? : 1;
}
static void pmbus_pages_alloc(PMBusDevice *pmdev)
{
/* some PMBus devices don't use the PAGE command, so they get 1 page */
PMBusDeviceClass *k = PMBUS_DEVICE_GET_CLASS(pmdev);
if (k->device_num_pages == 0) {
k->device_num_pages = 1;
}
pmdev->num_pages = k->device_num_pages;
pmdev->pages = g_new0(PMBusPage, k->device_num_pages);
pmdev->num_pages = pmbus_pages_num(pmdev);
pmdev->pages = g_new0(PMBusPage, pmdev->num_pages);
}
void pmbus_check_limits(PMBusDevice *pmdev)