127ba7b02SViresh Kumar /* 227ba7b02SViresh Kumar * Vhost-user GPIO virtio device 327ba7b02SViresh Kumar * 427ba7b02SViresh Kumar * Copyright (c) 2022 Viresh Kumar <viresh.kumar@linaro.org> 527ba7b02SViresh Kumar * 627ba7b02SViresh Kumar * SPDX-License-Identifier: GPL-2.0-or-later 727ba7b02SViresh Kumar */ 827ba7b02SViresh Kumar 927ba7b02SViresh Kumar #include "qemu/osdep.h" 1027ba7b02SViresh Kumar #include "qapi/error.h" 1127ba7b02SViresh Kumar #include "hw/qdev-properties.h" 1227ba7b02SViresh Kumar #include "hw/virtio/virtio-bus.h" 1327ba7b02SViresh Kumar #include "hw/virtio/vhost-user-gpio.h" 1427ba7b02SViresh Kumar #include "standard-headers/linux/virtio_ids.h" 155ba58758SAlex Bennée #include "standard-headers/linux/virtio_gpio.h" 1627ba7b02SViresh Kumar 17*1577a918SRichard Henderson static const Property vgpio_properties[] = { 185ba58758SAlex Bennée DEFINE_PROP_CHR("chardev", VHostUserBase, chardev), 195ba58758SAlex Bennée DEFINE_PROP_END_OF_LIST(), 2027ba7b02SViresh Kumar }; 2127ba7b02SViresh Kumar 225ba58758SAlex Bennée static void vgpio_realize(DeviceState *dev, Error **errp) 2327ba7b02SViresh Kumar { 245ba58758SAlex Bennée VHostUserBase *vub = VHOST_USER_BASE(dev); 255ba58758SAlex Bennée VHostUserBaseClass *vubc = VHOST_USER_BASE_GET_CLASS(dev); 2627ba7b02SViresh Kumar 275ba58758SAlex Bennée /* Fixed for GPIO */ 285ba58758SAlex Bennée vub->virtio_id = VIRTIO_ID_GPIO; 295ba58758SAlex Bennée vub->num_vqs = 2; 305ba58758SAlex Bennée vub->config_size = sizeof(struct virtio_gpio_config); 3127ba7b02SViresh Kumar 325ba58758SAlex Bennée vubc->parent_realize(dev, errp); 3327ba7b02SViresh Kumar } 3427ba7b02SViresh Kumar 3527ba7b02SViresh Kumar static const VMStateDescription vu_gpio_vmstate = { 3627ba7b02SViresh Kumar .name = "vhost-user-gpio", 3727ba7b02SViresh Kumar .unmigratable = 1, 3827ba7b02SViresh Kumar }; 3927ba7b02SViresh Kumar 4027ba7b02SViresh Kumar static void vu_gpio_class_init(ObjectClass *klass, void *data) 4127ba7b02SViresh Kumar { 4227ba7b02SViresh Kumar DeviceClass *dc = DEVICE_CLASS(klass); 435ba58758SAlex Bennée VHostUserBaseClass *vubc = VHOST_USER_BASE_CLASS(klass); 4427ba7b02SViresh Kumar 4527ba7b02SViresh Kumar dc->vmsd = &vu_gpio_vmstate; 465ba58758SAlex Bennée device_class_set_props(dc, vgpio_properties); 475ba58758SAlex Bennée device_class_set_parent_realize(dc, vgpio_realize, 485ba58758SAlex Bennée &vubc->parent_realize); 4927ba7b02SViresh Kumar set_bit(DEVICE_CATEGORY_INPUT, dc->categories); 5027ba7b02SViresh Kumar } 5127ba7b02SViresh Kumar 5227ba7b02SViresh Kumar static const TypeInfo vu_gpio_info = { 5327ba7b02SViresh Kumar .name = TYPE_VHOST_USER_GPIO, 545ba58758SAlex Bennée .parent = TYPE_VHOST_USER_BASE, 5527ba7b02SViresh Kumar .instance_size = sizeof(VHostUserGPIO), 5627ba7b02SViresh Kumar .class_init = vu_gpio_class_init, 5727ba7b02SViresh Kumar }; 5827ba7b02SViresh Kumar 5927ba7b02SViresh Kumar static void vu_gpio_register_types(void) 6027ba7b02SViresh Kumar { 6127ba7b02SViresh Kumar type_register_static(&vu_gpio_info); 6227ba7b02SViresh Kumar } 6327ba7b02SViresh Kumar 6427ba7b02SViresh Kumar type_init(vu_gpio_register_types) 65