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