1*ef17dd6aSVivek Goyal /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2*ef17dd6aSVivek Goyal 3*ef17dd6aSVivek Goyal #ifndef _LINUX_VIRTIO_GPIO_H 4*ef17dd6aSVivek Goyal #define _LINUX_VIRTIO_GPIO_H 5*ef17dd6aSVivek Goyal 6*ef17dd6aSVivek Goyal #include "standard-headers/linux/types.h" 7*ef17dd6aSVivek Goyal 8*ef17dd6aSVivek Goyal /* Virtio GPIO Feature bits */ 9*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_F_IRQ 0 10*ef17dd6aSVivek Goyal 11*ef17dd6aSVivek Goyal /* Virtio GPIO request types */ 12*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_MSG_GET_NAMES 0x0001 13*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_MSG_GET_DIRECTION 0x0002 14*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_MSG_SET_DIRECTION 0x0003 15*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_MSG_GET_VALUE 0x0004 16*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_MSG_SET_VALUE 0x0005 17*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_MSG_IRQ_TYPE 0x0006 18*ef17dd6aSVivek Goyal 19*ef17dd6aSVivek Goyal /* Possible values of the status field */ 20*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_STATUS_OK 0x0 21*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_STATUS_ERR 0x1 22*ef17dd6aSVivek Goyal 23*ef17dd6aSVivek Goyal /* Direction types */ 24*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_DIRECTION_NONE 0x00 25*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_DIRECTION_OUT 0x01 26*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_DIRECTION_IN 0x02 27*ef17dd6aSVivek Goyal 28*ef17dd6aSVivek Goyal /* Virtio GPIO IRQ types */ 29*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_IRQ_TYPE_NONE 0x00 30*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_IRQ_TYPE_EDGE_RISING 0x01 31*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_IRQ_TYPE_EDGE_FALLING 0x02 32*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_IRQ_TYPE_EDGE_BOTH 0x03 33*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_IRQ_TYPE_LEVEL_HIGH 0x04 34*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_IRQ_TYPE_LEVEL_LOW 0x08 35*ef17dd6aSVivek Goyal 36*ef17dd6aSVivek Goyal struct virtio_gpio_config { 37*ef17dd6aSVivek Goyal uint16_t ngpio; 38*ef17dd6aSVivek Goyal uint8_t padding[2]; 39*ef17dd6aSVivek Goyal uint32_t gpio_names_size; 40*ef17dd6aSVivek Goyal }; 41*ef17dd6aSVivek Goyal 42*ef17dd6aSVivek Goyal /* Virtio GPIO Request / Response */ 43*ef17dd6aSVivek Goyal struct virtio_gpio_request { 44*ef17dd6aSVivek Goyal uint16_t type; 45*ef17dd6aSVivek Goyal uint16_t gpio; 46*ef17dd6aSVivek Goyal uint32_t value; 47*ef17dd6aSVivek Goyal }; 48*ef17dd6aSVivek Goyal 49*ef17dd6aSVivek Goyal struct virtio_gpio_response { 50*ef17dd6aSVivek Goyal uint8_t status; 51*ef17dd6aSVivek Goyal uint8_t value; 52*ef17dd6aSVivek Goyal }; 53*ef17dd6aSVivek Goyal 54*ef17dd6aSVivek Goyal struct virtio_gpio_response_get_names { 55*ef17dd6aSVivek Goyal uint8_t status; 56*ef17dd6aSVivek Goyal uint8_t value[]; 57*ef17dd6aSVivek Goyal }; 58*ef17dd6aSVivek Goyal 59*ef17dd6aSVivek Goyal /* Virtio GPIO IRQ Request / Response */ 60*ef17dd6aSVivek Goyal struct virtio_gpio_irq_request { 61*ef17dd6aSVivek Goyal uint16_t gpio; 62*ef17dd6aSVivek Goyal }; 63*ef17dd6aSVivek Goyal 64*ef17dd6aSVivek Goyal struct virtio_gpio_irq_response { 65*ef17dd6aSVivek Goyal uint8_t status; 66*ef17dd6aSVivek Goyal }; 67*ef17dd6aSVivek Goyal 68*ef17dd6aSVivek Goyal /* Possible values of the interrupt status field */ 69*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_IRQ_STATUS_INVALID 0x0 70*ef17dd6aSVivek Goyal #define VIRTIO_GPIO_IRQ_STATUS_VALID 0x1 71*ef17dd6aSVivek Goyal 72*ef17dd6aSVivek Goyal #endif /* _LINUX_VIRTIO_GPIO_H */ 73