xref: /linux/include/linux/usb/usbio.h (revision 7362b5b493102c6b71827c2da22117b475528f6d)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (c) 2025 Intel Corporation.
4  *
5  */
6 
7 #ifndef _LINUX_USBIO_H_
8 #define _LINUX_USBIO_H_
9 
10 #include <linux/auxiliary_bus.h>
11 #include <linux/byteorder/generic.h>
12 #include <linux/list.h>
13 #include <linux/types.h>
14 
15 /***********************
16  * USBIO Clients Names *
17  ***********************/
18 #define USBIO_GPIO_CLIENT		"usbio-gpio"
19 #define USBIO_I2C_CLIENT		"usbio-i2c"
20 
21 /****************
22  * USBIO quirks *
23  ****************/
24 #define USBIO_QUIRK_BULK_MAXP_63	BIT(0)  /* Force bulk endpoint maxp to 63 */
25 #define USBIO_QUIRK_I2C_NO_INIT_ACK	BIT(8)  /* Do not ask for ack on I2C init */
26 #define USBIO_QUIRK_I2C_MAX_RW_LEN_52	BIT(9)  /* Set i2c-adapter max r/w len to 52 */
27 #define USBIO_QUIRK_I2C_USE_CHUNK_LEN	BIT(10) /* Send chunk-len for split xfers */
28 #define USBIO_QUIRK_I2C_ALLOW_400KHZ	BIT(11) /* Override desc, allowing 400 KHz */
29 
30 /**************************
31  * USBIO Type Definitions *
32  **************************/
33 
34 /* USBIO Packet Type */
35 #define USBIO_PKTTYPE_CTRL		1
36 #define USBIO_PKTTYPE_DBG		2
37 #define USBIO_PKTTYPE_GPIO		3
38 #define USBIO_PKTTYPE_I2C		4
39 
40 /* USBIO Packet Header */
41 struct usbio_packet_header {
42 	u8 type;
43 	u8 cmd;
44 	u8 flags;
45 } __packed;
46 
47 /* USBIO Control Transfer Packet */
48 struct usbio_ctrl_packet {
49 	struct usbio_packet_header header;
50 	u8 len;
51 	u8 data[] __counted_by(len);
52 } __packed;
53 
54 /* USBIO Bulk Transfer Packet */
55 struct usbio_bulk_packet {
56 	struct usbio_packet_header header;
57 	__le16 len;
58 	u8 data[] __counted_by(len);
59 } __packed;
60 
61 /* USBIO GPIO commands */
62 enum usbio_gpio_cmd {
63 	USBIO_GPIOCMD_DEINIT,
64 	USBIO_GPIOCMD_INIT,
65 	USBIO_GPIOCMD_READ,
66 	USBIO_GPIOCMD_WRITE,
67 	USBIO_GPIOCMD_END
68 };
69 
70 /* USBIO GPIO config */
71 enum usbio_gpio_pincfg {
72 	USBIO_GPIO_PINCFG_DEFAULT,
73 	USBIO_GPIO_PINCFG_PULLUP,
74 	USBIO_GPIO_PINCFG_PULLDOWN,
75 	USBIO_GPIO_PINCFG_PUSHPULL
76 };
77 
78 #define USBIO_GPIO_PINCFG_SHIFT		2
79 #define USBIO_GPIO_PINCFG_MASK		(0x3 << USBIO_GPIO_PINCFG_SHIFT)
80 #define USBIO_GPIO_SET_PINCFG(pincfg) \
81 	(((pincfg) << USBIO_GPIO_PINCFG_SHIFT) & USBIO_GPIO_PINCFG_MASK)
82 
83 enum usbio_gpio_pinmode {
84 	USBIO_GPIO_PINMOD_INVAL,
85 	USBIO_GPIO_PINMOD_INPUT,
86 	USBIO_GPIO_PINMOD_OUTPUT,
87 	USBIO_GPIO_PINMOD_MAXVAL
88 };
89 
90 #define USBIO_GPIO_PINMOD_MASK		0x3
91 #define USBIO_GPIO_SET_PINMOD(pin)	(pin & USBIO_GPIO_PINMOD_MASK)
92 
93 /*************************
94  * USBIO GPIO Controller *
95  *************************/
96 
97 #define USBIO_MAX_GPIOBANKS		5
98 #define USBIO_GPIOSPERBANK		32
99 
100 struct usbio_gpio_bank_desc {
101 	u8 id;
102 	u8 pins;
103 	__le32 bmap;
104 } __packed;
105 
106 struct usbio_gpio_init {
107 	u8 bankid;
108 	u8 config;
109 	u8 pincount;
110 	u8 pin;
111 } __packed;
112 
113 struct usbio_gpio_rw {
114 	u8 bankid;
115 	u8 pincount;
116 	u8 pin;
117 	__le32 value;
118 } __packed;
119 
120 /* USBIO I2C commands */
121 enum usbio_i2c_cmd {
122 	USBIO_I2CCMD_UNINIT,
123 	USBIO_I2CCMD_INIT,
124 	USBIO_I2CCMD_READ,
125 	USBIO_I2CCMD_WRITE,
126 	USBIO_I2CCMD_END
127 };
128 
129 /************************
130  * USBIO I2C Controller *
131  ************************/
132 
133 #define USBIO_MAX_I2CBUSES 5
134 
135 #define USBIO_I2C_BUS_ADDR_CAP_10B	BIT(3) /* 10bit address support */
136 #define USBIO_I2C_BUS_MODE_CAP_MASK	0x3
137 #define USBIO_I2C_BUS_MODE_CAP_SM	0 /* Standard Mode */
138 #define USBIO_I2C_BUS_MODE_CAP_FM	1 /* Fast Mode */
139 #define USBIO_I2C_BUS_MODE_CAP_FMP	2 /* Fast Mode+ */
140 #define USBIO_I2C_BUS_MODE_CAP_HSM	3 /* High-Speed Mode */
141 
142 struct usbio_i2c_bus_desc {
143 	u8 id;
144 	u8 caps;
145 } __packed;
146 
147 struct usbio_i2c_uninit {
148 	u8 busid;
149 	__le16 config;
150 } __packed;
151 
152 struct usbio_i2c_init {
153 	u8 busid;
154 	__le16 config;
155 	__le32 speed;
156 } __packed;
157 
158 struct usbio_i2c_rw {
159 	u8 busid;
160 	__le16 config;
161 	__le16 size;
162 	u8 data[] __counted_by(size);
163 } __packed;
164 
165 int usbio_control_msg(struct auxiliary_device *adev, u8 type, u8 cmd,
166 		      const void *obuf, u16 obuf_len, void *ibuf, u16 ibuf_len);
167 
168 int usbio_bulk_msg(struct auxiliary_device *adev, u8 type, u8 cmd, bool last,
169 		   const void *obuf, u16 obuf_len, void *ibuf, u16 ibuf_len);
170 
171 int usbio_acquire(struct auxiliary_device *adev);
172 void usbio_release(struct auxiliary_device *adev);
173 void usbio_get_txrxbuf_len(struct auxiliary_device *adev, u16 *txbuf_len, u16 *rxbuf_len);
174 unsigned long usbio_get_quirks(struct auxiliary_device *adev);
175 void usbio_acpi_bind(struct auxiliary_device *adev, const struct acpi_device_id *hids);
176 
177 #endif
178