/* * Copyright (c) 2026 Mirocom Laboratories and MSP engineers. * All Rights Reserved. */ #include #include #include #include #include "mvm/bus.h" int bus_ctl_init(struct mvm_bus_ctl *busctl) { if (busctl == NULL) { errno = EINVAL; return -1; } busctl->head = NULL; busctl->tail = NULL; busctl->dev_count = 0; return 0; } int bus_dev_alloc(mvm_devtype_t type, void *data, struct mvm_bus_dev **res) { struct mvm_bus_dev *dev; if (type == BUS_DEV_NONE || data == NULL) { errno = EINVAL; return -1; } if (res == NULL) { errno = EINVAL; return -1; } if ((dev = malloc(sizeof(*dev))) == NULL) { errno = ENOMEM; return -1; } dev->type = type; dev->data = data; dev->next = NULL; *res = dev; return 0; } void bus_dev_free(struct mvm_bus_dev *dev) { if (dev == NULL) { return; } free(dev); } int bus_ctl_append(struct mvm_bus_ctl *busctl, struct mvm_bus_dev *dev) { if (busctl == NULL || dev == NULL) { errno = EINVAL; return -1; } if (busctl->head == NULL || busctl->tail == NULL) { busctl->head = dev; busctl->tail = dev; } else { busctl->tail->next = dev; busctl->tail = dev; } ++busctl->dev_count; return 0; } void bus_ctl_free(struct mvm_bus_ctl *busctl) { struct mvm_bus_dev *dev, *tmp; if (busctl == NULL) { return; } if ((dev = busctl->head) == NULL) { return; } while (dev != NULL) { tmp = dev; bus_dev_free(tmp); dev = dev->next; } busctl->head = NULL; busctl->tail = NULL; }