xref: /wlan-dirver/qca-wifi-host-cmn/gpio/dispatcher/src/wlan_gpio_tgt_api.c (revision 901120c066e139c7f8a2c8e4820561fdd83c67ef)
1 /*
2  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 /**
19  * DOC:wlan_gpio_tgt_api.c
20  *
21  * This file provide API definitions to update gpio configuration from interface
22  */
23 #include <wlan_gpio_priv_api.h>
24 #include <wlan_gpio_tgt_api.h>
25 #include <target_type.h>
26 #include <qdf_module.h>
27 
28 QDF_STATUS tgt_set_gpio_config_req(struct wlan_objmgr_psoc *psoc,
29 				   struct gpio_config_params *param)
30 {
31 	struct wlan_lmac_if_gpio_tx_ops *gpio_tx_ops;
32 
33 	if (!psoc) {
34 		gpio_err("NULL psoc");
35 		return QDF_STATUS_E_NULL_VALUE;
36 	}
37 	gpio_tx_ops = wlan_psoc_get_gpio_txops(psoc);
38 	if (!gpio_tx_ops)
39 		return QDF_STATUS_E_NULL_VALUE;
40 
41 	return gpio_tx_ops->set_gpio_config(psoc, param);
42 }
43 
44 QDF_STATUS tgt_set_gpio_output_req(struct wlan_objmgr_psoc *psoc,
45 				   struct gpio_output_params *param)
46 {
47 	struct wlan_lmac_if_gpio_tx_ops *gpio_tx_ops;
48 
49 	if (!psoc) {
50 		gpio_err("NULL psoc");
51 		return QDF_STATUS_E_NULL_VALUE;
52 	}
53 
54 	gpio_tx_ops = wlan_psoc_get_gpio_txops(psoc);
55 	if (!gpio_tx_ops)
56 		return QDF_STATUS_E_NULL_VALUE;
57 
58 	return gpio_tx_ops->set_gpio_output(psoc, param);
59 }
60 
61 QDF_STATUS tgt_gpio_config(struct wlan_objmgr_psoc *psoc, uint32_t gpio_num,
62 			   uint32_t input, uint32_t pull_type,
63 			   uint32_t intr_mode,  uint32_t mux_config_val,
64 			   uint32_t drive, uint32_t init_enable)
65 {
66 	struct gpio_config_params param;
67 
68 	if (!psoc) {
69 		gpio_err("psoc_obj is null");
70 		return QDF_STATUS_E_INVAL;
71 	}
72 
73 	qdf_mem_set(&param, sizeof(param), 0);
74 	param.pin_pull_type = pull_type;
75 	param.pin_num = gpio_num;
76 	param.pin_dir = input;
77 	param.pin_intr_mode = intr_mode;
78 	param.mux_config_val = mux_config_val;
79 	param.drive = drive;
80 	param.init_enable = init_enable;
81 
82 	return tgt_set_gpio_config_req(psoc, &param);
83 }
84 
85 qdf_export_symbol(tgt_gpio_config);
86 
87 static bool tgt_gpio_disabled(struct wlan_objmgr_psoc *psoc)
88 {
89 	uint32_t target_type = 0;
90 	struct wlan_lmac_if_target_tx_ops *target_type_tx_ops;
91 	struct wlan_lmac_if_tx_ops *tx_ops;
92 
93 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
94 	if (!tx_ops) {
95 		gpio_err("tx_ops is NULL");
96 		return false;
97 	}
98 	target_type_tx_ops = &tx_ops->target_tx_ops;
99 
100 	if (target_type_tx_ops->tgt_get_tgt_type)
101 		target_type = target_type_tx_ops->tgt_get_tgt_type(psoc);
102 
103 	if ((target_type == TARGET_TYPE_QCA8074) ||
104 	    (target_type == TARGET_TYPE_QCN6122) ||
105 	    (target_type == TARGET_TYPE_QCN9160) ||
106 	    (target_type == TARGET_TYPE_QCA8074V2) ||
107 	    (target_type == TARGET_TYPE_QCA9574) ||
108 	    (target_type == TARGET_TYPE_QCA5332) ||
109 	    (target_type == TARGET_TYPE_QCA5018) ||
110 	    (target_type == TARGET_TYPE_QCA6018)) {
111 		return true;
112 	}
113 
114 	return false;
115 }
116 
117 QDF_STATUS tgt_gpio_output(struct wlan_objmgr_psoc *psoc, uint32_t gpio_num,
118 			   uint32_t set)
119 {
120 	struct gpio_output_params param;
121 
122 	if (!psoc) {
123 		gpio_err("psoc_obj is null");
124 		return QDF_STATUS_E_INVAL;
125 	}
126 
127 	if (tgt_gpio_disabled(psoc))
128 		return QDF_STATUS_E_INVAL;
129 
130 	qdf_mem_set(&param, sizeof(param), 0);
131 	param.pin_num = gpio_num;
132 	param.pin_set = set;
133 
134 	return tgt_set_gpio_output_req(psoc, &param);
135 }
136 
137 qdf_export_symbol(tgt_gpio_output);
138