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