1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * Copyright (c) 2023, Intel Corporation. All rights reserved. |
4 | */ |
5 | #ifndef _LINUX_USB_LJCA_H_ |
6 | #define _LINUX_USB_LJCA_H_ |
7 | |
8 | #include <linux/auxiliary_bus.h> |
9 | #include <linux/list.h> |
10 | #include <linux/spinlock.h> |
11 | #include <linux/types.h> |
12 | |
13 | #define LJCA_MAX_GPIO_NUM 64 |
14 | |
15 | #define auxiliary_dev_to_ljca_client(auxiliary_dev) \ |
16 | container_of(auxiliary_dev, struct ljca_client, auxdev) |
17 | |
18 | struct ljca_adapter; |
19 | |
20 | /** |
21 | * typedef ljca_event_cb_t - event callback function signature |
22 | * |
23 | * @context: the execution context of who registered this callback |
24 | * @cmd: the command from device for this event |
25 | * @evt_data: the event data payload |
26 | * @len: the event data payload length |
27 | * |
28 | * The callback function is called in interrupt context and the data payload is |
29 | * only valid during the call. If the user needs later access of the data, it |
30 | * must copy it. |
31 | */ |
32 | typedef void (*ljca_event_cb_t)(void *context, u8 cmd, const void *evt_data, int len); |
33 | |
34 | /** |
35 | * struct ljca_client - represent a ljca client device |
36 | * |
37 | * @type: ljca client type |
38 | * @id: ljca client id within same client type |
39 | * @link: ljca client on the same ljca adapter |
40 | * @auxdev: auxiliary device object |
41 | * @adapter: ljca adapter the ljca client sit on |
42 | * @context: the execution context of the event callback |
43 | * @event_cb: ljca client driver register this callback to get |
44 | * firmware asynchronous rx buffer pending notifications |
45 | * @event_cb_lock: spinlock to protect event callback |
46 | */ |
47 | struct ljca_client { |
48 | u8 type; |
49 | u8 id; |
50 | struct list_head link; |
51 | struct auxiliary_device auxdev; |
52 | struct ljca_adapter *adapter; |
53 | |
54 | void *context; |
55 | ljca_event_cb_t event_cb; |
56 | /* lock to protect event_cb */ |
57 | spinlock_t event_cb_lock; |
58 | }; |
59 | |
60 | /** |
61 | * struct ljca_gpio_info - ljca gpio client device info |
62 | * |
63 | * @num: ljca gpio client device pin number |
64 | * @valid_pin_map: ljca gpio client device valid pin mapping |
65 | */ |
66 | struct ljca_gpio_info { |
67 | unsigned int num; |
68 | DECLARE_BITMAP(valid_pin_map, LJCA_MAX_GPIO_NUM); |
69 | }; |
70 | |
71 | /** |
72 | * struct ljca_i2c_info - ljca i2c client device info |
73 | * |
74 | * @id: ljca i2c client device identification number |
75 | * @capacity: ljca i2c client device capacity |
76 | * @intr_pin: ljca i2c client device interrupt pin number if exists |
77 | */ |
78 | struct ljca_i2c_info { |
79 | u8 id; |
80 | u8 capacity; |
81 | u8 intr_pin; |
82 | }; |
83 | |
84 | /** |
85 | * struct ljca_spi_info - ljca spi client device info |
86 | * |
87 | * @id: ljca spi client device identification number |
88 | * @capacity: ljca spi client device capacity |
89 | */ |
90 | struct ljca_spi_info { |
91 | u8 id; |
92 | u8 capacity; |
93 | }; |
94 | |
95 | /** |
96 | * ljca_register_event_cb - register a callback function to receive events |
97 | * |
98 | * @client: ljca client device |
99 | * @event_cb: callback function |
100 | * @context: execution context of event callback |
101 | * |
102 | * Return: 0 in case of success, negative value in case of error |
103 | */ |
104 | int ljca_register_event_cb(struct ljca_client *client, ljca_event_cb_t event_cb, void *context); |
105 | |
106 | /** |
107 | * ljca_unregister_event_cb - unregister the callback function for an event |
108 | * |
109 | * @client: ljca client device |
110 | */ |
111 | void ljca_unregister_event_cb(struct ljca_client *client); |
112 | |
113 | /** |
114 | * ljca_transfer - issue a LJCA command and wait for a response |
115 | * |
116 | * @client: ljca client device |
117 | * @cmd: the command to be sent to the device |
118 | * @obuf: the buffer to be sent to the device; it can be NULL if the user |
119 | * doesn't need to transmit data with this command |
120 | * @obuf_len: the size of the buffer to be sent to the device; it should |
121 | * be 0 when obuf is NULL |
122 | * @ibuf: any data associated with the response will be copied here; it can be |
123 | * NULL if the user doesn't need the response data |
124 | * @ibuf_len: must be initialized to the input buffer size |
125 | * |
126 | * Return: the actual length of response data for success, negative value for errors |
127 | */ |
128 | int ljca_transfer(struct ljca_client *client, u8 cmd, const u8 *obuf, |
129 | u8 obuf_len, u8 *ibuf, u8 ibuf_len); |
130 | |
131 | /** |
132 | * ljca_transfer_noack - issue a LJCA command without a response |
133 | * |
134 | * @client: ljca client device |
135 | * @cmd: the command to be sent to the device |
136 | * @obuf: the buffer to be sent to the device; it can be NULL if the user |
137 | * doesn't need to transmit data with this command |
138 | * @obuf_len: the size of the buffer to be sent to the device |
139 | * |
140 | * Return: 0 for success, negative value for errors |
141 | */ |
142 | int ljca_transfer_noack(struct ljca_client *client, u8 cmd, const u8 *obuf, |
143 | u8 obuf_len); |
144 | |
145 | #endif |
146 | |