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