1 /*
2  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /**
21  * DOC: qal_vbus_dev
22  * QCA abstraction layer (QAL) virtual bus management APIs
23  */
24 
25 #if !defined(__QAL_VBUS_DEV_H)
26 #define __QAL_VBUS_DEV_H
27 
28 /* Include Files */
29 #include <qdf_types.h>
30 #include <i_qal_vbus_dev.h>
31 
32 struct qdf_vbus_resource;
33 struct qdf_vbus_rstctl;
34 struct qdf_dev_clk;
35 struct qdf_pfm_hndl;
36 struct qdf_pfm_drv;
37 struct qdf_device_node;
38 typedef __qdf_of_gpio_flags qdf_of_gpio_flags;
39 #ifdef ENHANCED_OS_ABSTRACTION
40 /**
41  * qal_vbus_get_iorsc() - acquire io resource
42  * @devnum: Device Number
43  * @flag: Property bitmap for the io resource
44  * @devname: Device name string
45  *
46  * This function will allocate the io resource for a device
47  *
48  * Return: QDF_STATUS_SUCCESS on success
49  */
50 QDF_STATUS
51 qal_vbus_get_iorsc(int devnum, uint32_t flag, char *devname);
52 
53 /**
54  * qal_vbus_release_iorsc() - release io resource
55  * @devnum: Device Number
56  *
57  * This function will release the io resource attached to a device
58  *
59  * Return: QDF_STATUS_SUCCESS on success
60  */
61 QDF_STATUS
62 qal_vbus_release_iorsc(int devnum);
63 
64 /**
65  * qal_vbus_allocate_iorsc() - allocate io resource
66  * @pinnum: pin Number
67  * @label: pin name string
68  *
69  * This function will allocate the io resource for a device
70  *
71  * Return: QDF_STATUS_SUCCESS on success
72  */
73 QDF_STATUS
74 qal_vbus_allocate_iorsc(unsigned int pinnum, const char *label);
75 
76 /**
77  * qal_vbus_iorsc_dir_output() - set pin dirction to output
78  * @pin: pin Number
79  * @val: value
80  *
81  * This function set the gpio pin direction to output
82  *
83  * Return: 0 on success, error no on failure
84  */
85 QDF_STATUS
86 qal_vbus_iorsc_dir_output(unsigned int pin, int val);
87 
88 /**
89  * qal_vbus_iorsc_set_value() - set pin direction
90  * @pin: pin Number
91  * @val: value
92  *
93  * This function set the gpio pin direction based on value
94  *
95  * Return: QDF_STATUS_SUCCESS on success
96  */
97 QDF_STATUS
98 qal_vbus_iorsc_set_value(unsigned int pin, int val);
99 
100 /**
101  * qal_vbus_iorsc_toirq() - set irq number to gpio
102  * @pin: pin Number
103  *
104  * This function set the irq number to gpio pin
105  *
106  * Return: QDF_STATUS_SUCCESS on success
107  */
108 QDF_STATUS
109 qal_vbus_iorsc_toirq(unsigned int pin);
110 
111 /**
112  * qal_vbus_request_irq() - set interrupt handler
113  * @irqnum: irq Number
114  * @handler: function handler to be called
115  * @flags: irq flags
116  * @dev_name: device name
117  * @ctx: pointer to device context
118  * This function set up the handling of the interrupt
119  *
120  * Return: QDF_STATUS_SUCCESS on success, Error code on failure
121  */
122 QDF_STATUS
123 qal_vbus_request_irq(unsigned int irqnum,
124 		     irqreturn_t (*handler)(int irq, void *arg),
125 		     unsigned long flags, const char *dev_name,
126 		     void *ctx);
127 
128 /**
129  * __qal_vbus_free_irq() - free irq
130  * @irqnum: irq Number
131  * @ctx: pointer to device context
132  *
133  * This function free the irq number set to gpio pin
134  *
135  * Return: QDF_STATUS_SUCCESS on success
136  */
137 static inline QDF_STATUS
138 __qal_vbus_free_irq(unsigned int irqnum, void *ctx);
139 
140 /**
141  * qal_vbus_enable_devclk() - enable device clock
142  * @clk: Device clock
143  *
144  * This function will enable the clock for a device
145  *
146  * Return: QDF_STATUS_SUCCESS on success
147  */
148 QDF_STATUS
149 qal_vbus_enable_devclk(struct qdf_dev_clk *clk);
150 
151 /**
152  * qal_vbus_disable_devclk() - disable device clock
153  * @clk: Device clock
154  *
155  * This function will disable the clock for a device
156  *
157  * Return: QDF_STATUS_SUCCESS on success
158  */
159 QDF_STATUS
160 qal_vbus_disable_devclk(struct qdf_dev_clk *clk);
161 
162 /**
163  * qal_vbus_get_dev_rstctl() - get device reset control
164  * @pfhndl: Device handle
165  * @state: Device state information
166  * @rstctl: Device reset control handle
167  *
168  * This function will acquire the control to reset the device
169  *
170  * Return: QDF_STATUS_SUCCESS on success
171  */
172 QDF_STATUS
173 qal_vbus_get_dev_rstctl(struct qdf_pfm_hndl *pfhndl, const char *state,
174 			struct qdf_vbus_rstctl **rstctl);
175 
176 /**
177  * qal_vbus_release_dev_rstctl() - release device reset control
178  * @pfhndl: Device handle
179  * @rstctl: Device reset control handle
180  *
181  * This function will release the control to reset the device
182  *
183  * Return: QDF_STATUS_SUCCESS on success
184  */
185 QDF_STATUS
186 qal_vbus_release_dev_rstctl(struct qdf_pfm_hndl *pfhndl,
187 			    struct qdf_vbus_rstctl *rstctl);
188 
189 /**
190  * qal_vbus_activate_dev_rstctl() - activate device reset control
191  * @pfhndl: Device handle
192  * @rstctl: Device reset control handle
193  *
194  * This function will activate the reset control for the device
195  *
196  * Return: QDF_STATUS_SUCCESS on success
197  */
198 QDF_STATUS
199 qal_vbus_activate_dev_rstctl(struct qdf_pfm_hndl *pfhndl,
200 			     struct qdf_vbus_rstctl *rstctl);
201 
202 /**
203  * qal_vbus_deactivate_dev_rstctl() - deactivate device reset control
204  * @pfhndl: Device handle
205  * @rstctl: Device reset control handle
206  *
207  * This function will deactivate the reset control for the device
208  *
209  * Return: QDF_STATUS_SUCCESS on success
210  */
211 QDF_STATUS
212 qal_vbus_deactivate_dev_rstctl(struct qdf_pfm_hndl *pfhndl,
213 			       struct qdf_vbus_rstctl *rstctl);
214 
215 /**
216  * qal_vbus_get_resource() - get resource
217  * @pfhndl: Device handle
218  * @rsc: Resource handle
219  * @restype: Resource type
220  * @residx: Resource index
221  *
222  * This function will acquire a particular resource and attach it to the device
223  *
224  * Return: QDF_STATUS_SUCCESS on success
225  */
226 QDF_STATUS
227 qal_vbus_get_resource(struct qdf_pfm_hndl *pfhndl,
228 		      struct qdf_vbus_resource **rsc, uint32_t restype,
229 		      uint32_t residx);
230 
231 /**
232  * qal_vbus_get_irq() - get irq
233  * @pfhndl: Device handle
234  * @str: Device identifier
235  * @irq: irq number
236  *
237  * This function will acquire an irq for the device
238  *
239  * Return: QDF_STATUS_SUCCESS on success
240  */
241 QDF_STATUS
242 qal_vbus_get_irq(struct qdf_pfm_hndl *pfhndl, const char *str, int *irq);
243 
244 /**
245  * qal_vbus_register_driver() - register driver
246  * @pfdev: Device handle
247  *
248  * This function will initialize a device
249  *
250  * Return: QDF_STATUS_SUCCESS on success
251  */
252 QDF_STATUS
253 qal_vbus_register_driver(struct qdf_pfm_drv *pfdev);
254 
255 /**
256  * qal_vbus_deregister_driver() - deregister driver
257  * @pfdev: Device handle
258  *
259  * This function will deregister the driver for a device
260  *
261  * Return: QDF_STATUS_SUCCESS on success
262  */
263 QDF_STATUS
264 qal_vbus_deregister_driver(struct qdf_pfm_drv *pfdev);
265 
266 /**
267  * qal_vbus_gpio_set_value_cansleep() - assign a gpio's value
268  * @gpio: gpio whose value will be assigned
269  * @value: value to assign
270  *
271  * Return: QDF_STATUS_SUCCESS on success
272  */
273 QDF_STATUS
274 qal_vbus_gpio_set_value_cansleep(unsigned int gpio, int value);
275 
276 /**
277  * qal_vbus_rcu_read_lock() - mark the beginning of an RCU read-side critical
278  *                            section
279  *
280  * Return: QDF_STATUS_SUCCESS on success
281  */
282 QDF_STATUS
283 qal_vbus_rcu_read_lock(void);
284 
285 /**
286  * qal_vbus_rcu_read_unlock() - mark the end of an RCU read-side critical
287  *                              section
288  *
289  * Return: QDF_STATUS_SUCCESS on success
290  */
291 QDF_STATUS
292 qal_vbus_rcu_read_unlock(void);
293 
294 /**
295  * qal_vbus_of_get_named_gpio_flags() - Get a GPIO descriptor and flags
296  * for GPIO API
297  * @np: device node to get GPIO from
298  * @list_name: property name containing gpio specifier(s)
299  * @index: index of the GPIO
300  * @flags: a flags pointer to fill in
301  *
302  * The global GPIO number for the GPIO specified by its descriptor.
303  */
304 int
305 qal_vbus_of_get_named_gpio_flags(struct qdf_device_node *np,
306 				 const char *list_name,
307 				 int index, qdf_of_gpio_flags *flags);
308 #else
309 static inline QDF_STATUS
qal_vbus_get_iorsc(int devnum,uint32_t flag,char * devname)310 qal_vbus_get_iorsc(int devnum, uint32_t flag, char *devname)
311 {
312 	return __qal_vbus_get_iorsc(devnum, flag, devname);
313 }
314 
315 static inline QDF_STATUS
qal_vbus_allocate_iorsc(unsigned int pinnum,const char * label)316 qal_vbus_allocate_iorsc(unsigned int pinnum, const char *label)
317 {
318 	return __qal_vbus_allocate_iorsc(pinnum, label);
319 }
320 
321 static inline QDF_STATUS
qal_vbus_iorsc_dir_output(unsigned int pin,int val)322 qal_vbus_iorsc_dir_output(unsigned int pin, int val)
323 {
324 	return __qal_vbus_iorsc_dir_output(pin, val);
325 }
326 
327 static inline QDF_STATUS
qal_vbus_iorsc_set_value(unsigned int pin,int val)328 qal_vbus_iorsc_set_value(unsigned int pin, int val)
329 {
330 	return __qal_vbus_iorsc_set_value(pin, val);
331 }
332 
333 static inline QDF_STATUS
qal_vbus_release_iorsc(int devnum)334 qal_vbus_release_iorsc(int devnum)
335 {
336 	return __qal_vbus_release_iorsc(devnum);
337 }
338 
339 static inline QDF_STATUS
qal_vbus_iorsc_toirq(unsigned int pin)340 qal_vbus_iorsc_toirq(unsigned int pin)
341 {
342 	return __qal_vbus_iorsc_toirq(pin);
343 }
344 
345 static inline QDF_STATUS
qal_vbus_request_irq(unsigned int irqnum,irqreturn_t (* handler)(int irq,void * arg),unsigned long flags,const char * dev_name,void * ctx)346 qal_vbus_request_irq(unsigned int irqnum,
347 		     irqreturn_t (*handler)(int irq, void *arg),
348 		     unsigned long flags, const char *dev_name, void *ctx)
349 {
350 	return __qal_vbus_request_irq(irqnum, handler, flags, dev_name, ctx);
351 }
352 
353 static inline QDF_STATUS
qal_vbus_free_irq(unsigned int irqnum,void * ctx)354 qal_vbus_free_irq(unsigned int irqnum, void *ctx)
355 {
356 	return __qal_vbus_free_irq(irqnum, ctx);
357 }
358 
359 static inline QDF_STATUS
qal_vbus_enable_devclk(struct qdf_dev_clk * clk)360 qal_vbus_enable_devclk(struct qdf_dev_clk *clk)
361 {
362 	return __qal_vbus_enable_devclk(clk);
363 }
364 
365 static inline QDF_STATUS
qal_vbus_disable_devclk(struct qdf_dev_clk * clk)366 qal_vbus_disable_devclk(struct qdf_dev_clk *clk)
367 {
368 	return __qal_vbus_disable_devclk(clk);
369 }
370 
371 static inline QDF_STATUS
qal_vbus_get_dev_rstctl(struct qdf_pfm_hndl * pfhndl,const char * state,struct qdf_vbus_rstctl ** rstctl)372 qal_vbus_get_dev_rstctl(struct qdf_pfm_hndl *pfhndl, const char *state,
373 			struct qdf_vbus_rstctl **rstctl)
374 {
375 	return __qal_vbus_get_dev_rstctl(pfhndl, state, rstctl);
376 }
377 
378 static inline QDF_STATUS
qal_vbus_release_dev_rstctl(struct qdf_pfm_hndl * pfhndl,struct qdf_vbus_rstctl * rstctl)379 qal_vbus_release_dev_rstctl(struct qdf_pfm_hndl *pfhndl,
380 			    struct qdf_vbus_rstctl *rstctl)
381 {
382 	return __qal_vbus_release_dev_rstctl(pfhndl, rstctl);
383 }
384 
385 static inline QDF_STATUS
qal_vbus_activate_dev_rstctl(struct qdf_pfm_hndl * pfhndl,struct qdf_vbus_rstctl * rstctl)386 qal_vbus_activate_dev_rstctl(struct qdf_pfm_hndl *pfhndl,
387 			     struct qdf_vbus_rstctl *rstctl)
388 {
389 	return __qal_vbus_activate_dev_rstctl(pfhndl, rstctl);
390 }
391 
392 static inline QDF_STATUS
qal_vbus_deactivate_dev_rstctl(struct qdf_pfm_hndl * pfhndl,struct qdf_vbus_rstctl * rstctl)393 qal_vbus_deactivate_dev_rstctl(struct qdf_pfm_hndl *pfhndl,
394 			       struct qdf_vbus_rstctl *rstctl)
395 {
396 	return __qal_vbus_deactivate_dev_rstctl(pfhndl, rstctl);
397 }
398 
399 static inline QDF_STATUS
qal_vbus_get_resource(struct qdf_pfm_hndl * pfhndl,struct qdf_vbus_resource ** rsc,uint32_t restype,uint32_t residx)400 qal_vbus_get_resource(struct qdf_pfm_hndl *pfhndl,
401 		      struct qdf_vbus_resource **rsc, uint32_t restype,
402 		      uint32_t residx)
403 {
404 	return __qal_vbus_get_resource(pfhndl, rsc, restype, residx);
405 }
406 
407 static inline QDF_STATUS
qal_vbus_get_irq(struct qdf_pfm_hndl * pfhndl,const char * str,int * irq)408 qal_vbus_get_irq(struct qdf_pfm_hndl *pfhndl, const char *str, int *irq)
409 {
410 	return __qal_vbus_get_irq(pfhndl, str, irq);
411 }
412 
413 static inline QDF_STATUS
qal_vbus_register_driver(struct qdf_pfm_drv * pfdev)414 qal_vbus_register_driver(struct qdf_pfm_drv *pfdev)
415 {
416 	return __qal_vbus_register_driver(pfdev);
417 }
418 
419 static inline QDF_STATUS
qal_vbus_deregister_driver(struct qdf_pfm_drv * pfdev)420 qal_vbus_deregister_driver(struct qdf_pfm_drv *pfdev)
421 {
422 	return __qal_vbus_deregister_driver(pfdev);
423 }
424 
425 static inline QDF_STATUS
qal_vbus_gpio_set_value_cansleep(unsigned int gpio,int value)426 qal_vbus_gpio_set_value_cansleep(unsigned int gpio, int value)
427 {
428 	return __qal_vbus_gpio_set_value_cansleep(gpio, value);
429 }
430 
431 static inline QDF_STATUS
qal_vbus_rcu_read_lock(void)432 qal_vbus_rcu_read_lock(void)
433 {
434 	return __qal_vbus_rcu_read_lock();
435 }
436 
437 static inline QDF_STATUS
qal_vbus_rcu_read_unlock(void)438 qal_vbus_rcu_read_unlock(void)
439 {
440 	return __qal_vbus_rcu_read_unlock();
441 }
442 
443 static inline int
qal_vbus_of_get_named_gpio_flags(struct qdf_device_node * np,const char * list_name,int index,qdf_of_gpio_flags * flags)444 qal_vbus_of_get_named_gpio_flags(struct qdf_device_node *np,
445 				 const char *list_name,
446 				 int index, qdf_of_gpio_flags *flags)
447 {
448 	return __qal_vbus_of_get_named_gpio_flags(np, list_name, index, flags);
449 }
450 #endif
451 #endif  /* __QAL_VBUS_DEV_H */
452