Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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 */
41struct usbio_packet_header {
42 u8 type;
43 u8 cmd;
44 u8 flags;
45} __packed;
46
47/* USBIO Control Transfer Packet */
48struct 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 */
55struct 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 */
62enum 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 */
71enum 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
83enum 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
100struct usbio_gpio_bank_desc {
101 u8 id;
102 u8 pins;
103 __le32 bmap;
104} __packed;
105
106struct usbio_gpio_init {
107 u8 bankid;
108 u8 config;
109 u8 pincount;
110 u8 pin;
111} __packed;
112
113struct usbio_gpio_rw {
114 u8 bankid;
115 u8 pincount;
116 u8 pin;
117 __le32 value;
118} __packed;
119
120/* USBIO I2C commands */
121enum 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
142struct usbio_i2c_bus_desc {
143 u8 id;
144 u8 caps;
145} __packed;
146
147struct usbio_i2c_uninit {
148 u8 busid;
149 __le16 config;
150} __packed;
151
152struct usbio_i2c_init {
153 u8 busid;
154 __le16 config;
155 __le32 speed;
156} __packed;
157
158struct usbio_i2c_rw {
159 u8 busid;
160 __le16 config;
161 __le16 size;
162 u8 data[] __counted_by(size);
163} __packed;
164
165int usbio_control_msg(struct auxiliary_device *adev, u8 type, u8 cmd,
166 const void *obuf, u16 obuf_len, void *ibuf, u16 ibuf_len);
167
168int 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
171int usbio_acquire(struct auxiliary_device *adev);
172void usbio_release(struct auxiliary_device *adev);
173void usbio_get_txrxbuf_len(struct auxiliary_device *adev, u16 *txbuf_len, u16 *rxbuf_len);
174unsigned long usbio_get_quirks(struct auxiliary_device *adev);
175void usbio_acpi_bind(struct auxiliary_device *adev, const struct acpi_device_id *hids);
176
177#endif