xref: /wlan-driver/qcacld-3.0/core/pld/src/pld_common.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name #define pr_fmt(fmt) "wlan_pld:%s:%d:: " fmt, __func__, __LINE__
21*5113495bSYour Name 
22*5113495bSYour Name #include <linux/printk.h>
23*5113495bSYour Name #include <linux/err.h>
24*5113495bSYour Name #include <linux/string.h>
25*5113495bSYour Name #include <linux/list.h>
26*5113495bSYour Name #include <linux/slab.h>
27*5113495bSYour Name #include <linux/pm.h>
28*5113495bSYour Name 
29*5113495bSYour Name #ifdef CONFIG_PLD_SDIO_CNSS
30*5113495bSYour Name #include <net/cnss.h>
31*5113495bSYour Name #endif
32*5113495bSYour Name #ifdef CONFIG_PLD_PCIE_CNSS
33*5113495bSYour Name #ifdef CONFIG_CNSS_OUT_OF_TREE
34*5113495bSYour Name #include "cnss2.h"
35*5113495bSYour Name #else
36*5113495bSYour Name #include <net/cnss2.h>
37*5113495bSYour Name #endif
38*5113495bSYour Name #endif
39*5113495bSYour Name 
40*5113495bSYour Name #ifdef CONFIG_CNSS_OUT_OF_TREE
41*5113495bSYour Name #ifdef CONFIG_PLD_SNOC_ICNSS
42*5113495bSYour Name #ifdef CONFIG_PLD_SNOC_ICNSS2
43*5113495bSYour Name #include "icnss2.h"
44*5113495bSYour Name #else
45*5113495bSYour Name #include "icnss.h"
46*5113495bSYour Name #endif
47*5113495bSYour Name #endif
48*5113495bSYour Name #ifdef CONFIG_PLD_IPCI_ICNSS
49*5113495bSYour Name #include "icnss2.h"
50*5113495bSYour Name #endif
51*5113495bSYour Name #else
52*5113495bSYour Name #ifdef CONFIG_PLD_SNOC_ICNSS
53*5113495bSYour Name #ifdef CONFIG_PLD_SNOC_ICNSS2
54*5113495bSYour Name #include <soc/qcom/icnss2.h>
55*5113495bSYour Name #else
56*5113495bSYour Name #include <soc/qcom/icnss.h>
57*5113495bSYour Name #endif
58*5113495bSYour Name #endif
59*5113495bSYour Name #ifdef CONFIG_PLD_IPCI_ICNSS
60*5113495bSYour Name #include <soc/qcom/icnss2.h>
61*5113495bSYour Name #endif
62*5113495bSYour Name #endif
63*5113495bSYour Name 
64*5113495bSYour Name #include "pld_pcie.h"
65*5113495bSYour Name #include "pld_ipci.h"
66*5113495bSYour Name #include "pld_pcie_fw_sim.h"
67*5113495bSYour Name #include "pld_snoc_fw_sim.h"
68*5113495bSYour Name #include "pld_snoc.h"
69*5113495bSYour Name #include "pld_sdio.h"
70*5113495bSYour Name #include "pld_usb.h"
71*5113495bSYour Name #include "qwlan_version.h"
72*5113495bSYour Name 
73*5113495bSYour Name #define PLD_PCIE_REGISTERED BIT(0)
74*5113495bSYour Name #define PLD_SNOC_REGISTERED BIT(1)
75*5113495bSYour Name #define PLD_SDIO_REGISTERED BIT(2)
76*5113495bSYour Name #define PLD_USB_REGISTERED BIT(3)
77*5113495bSYour Name #define PLD_SNOC_FW_SIM_REGISTERED BIT(4)
78*5113495bSYour Name #define PLD_PCIE_FW_SIM_REGISTERED BIT(5)
79*5113495bSYour Name #define PLD_IPCI_REGISTERED BIT(6)
80*5113495bSYour Name 
81*5113495bSYour Name #define PLD_BUS_MASK 0xf
82*5113495bSYour Name 
83*5113495bSYour Name static struct pld_context *pld_ctx;
84*5113495bSYour Name 
pld_init(void)85*5113495bSYour Name int pld_init(void)
86*5113495bSYour Name {
87*5113495bSYour Name 	struct pld_context *pld_context;
88*5113495bSYour Name 
89*5113495bSYour Name 	pld_context = kzalloc(sizeof(*pld_context), GFP_KERNEL);
90*5113495bSYour Name 	if (!pld_context)
91*5113495bSYour Name 		return -ENOMEM;
92*5113495bSYour Name 
93*5113495bSYour Name 	spin_lock_init(&pld_context->pld_lock);
94*5113495bSYour Name 
95*5113495bSYour Name 	INIT_LIST_HEAD(&pld_context->dev_list);
96*5113495bSYour Name 
97*5113495bSYour Name 	pld_ctx = pld_context;
98*5113495bSYour Name 
99*5113495bSYour Name 	return 0;
100*5113495bSYour Name }
101*5113495bSYour Name 
pld_deinit(void)102*5113495bSYour Name void pld_deinit(void)
103*5113495bSYour Name {
104*5113495bSYour Name 	struct dev_node *dev_node;
105*5113495bSYour Name 	struct pld_context *pld_context;
106*5113495bSYour Name 	unsigned long flags;
107*5113495bSYour Name 
108*5113495bSYour Name 	pld_context = pld_ctx;
109*5113495bSYour Name 	if (!pld_context) {
110*5113495bSYour Name 		pld_ctx = NULL;
111*5113495bSYour Name 		return;
112*5113495bSYour Name 	}
113*5113495bSYour Name 
114*5113495bSYour Name 	spin_lock_irqsave(&pld_context->pld_lock, flags);
115*5113495bSYour Name 	while (!list_empty(&pld_context->dev_list)) {
116*5113495bSYour Name 		dev_node = list_first_entry(&pld_context->dev_list,
117*5113495bSYour Name 					    struct dev_node, list);
118*5113495bSYour Name 		list_del(&dev_node->list);
119*5113495bSYour Name 		kfree(dev_node);
120*5113495bSYour Name 	}
121*5113495bSYour Name 	spin_unlock_irqrestore(&pld_context->pld_lock, flags);
122*5113495bSYour Name 
123*5113495bSYour Name 	kfree(pld_context);
124*5113495bSYour Name 
125*5113495bSYour Name 	pld_ctx = NULL;
126*5113495bSYour Name }
127*5113495bSYour Name 
pld_set_mode(u8 mode)128*5113495bSYour Name int pld_set_mode(u8 mode)
129*5113495bSYour Name {
130*5113495bSYour Name 	if (!pld_ctx)
131*5113495bSYour Name 		return -ENOMEM;
132*5113495bSYour Name 
133*5113495bSYour Name 	pld_ctx->mode = mode;
134*5113495bSYour Name 	return 0;
135*5113495bSYour Name }
136*5113495bSYour Name 
pld_get_global_context(void)137*5113495bSYour Name struct pld_context *pld_get_global_context(void)
138*5113495bSYour Name {
139*5113495bSYour Name 	return pld_ctx;
140*5113495bSYour Name }
141*5113495bSYour Name 
pld_add_dev(struct pld_context * pld_context,struct device * dev,struct device * ifdev,enum pld_bus_type type)142*5113495bSYour Name int pld_add_dev(struct pld_context *pld_context,
143*5113495bSYour Name 		struct device *dev, struct device *ifdev,
144*5113495bSYour Name 		enum pld_bus_type type)
145*5113495bSYour Name {
146*5113495bSYour Name 	unsigned long flags;
147*5113495bSYour Name 	struct dev_node *dev_node;
148*5113495bSYour Name 
149*5113495bSYour Name 	dev_node = kzalloc(sizeof(*dev_node), GFP_KERNEL);
150*5113495bSYour Name 	if (!dev_node)
151*5113495bSYour Name 		return -ENOMEM;
152*5113495bSYour Name 
153*5113495bSYour Name 	dev_node->dev = dev;
154*5113495bSYour Name 	dev_node->ifdev = ifdev;
155*5113495bSYour Name 	dev_node->bus_type = type;
156*5113495bSYour Name 
157*5113495bSYour Name 	spin_lock_irqsave(&pld_context->pld_lock, flags);
158*5113495bSYour Name 	list_add_tail(&dev_node->list, &pld_context->dev_list);
159*5113495bSYour Name 	spin_unlock_irqrestore(&pld_context->pld_lock, flags);
160*5113495bSYour Name 
161*5113495bSYour Name 	return 0;
162*5113495bSYour Name }
163*5113495bSYour Name 
pld_del_dev(struct pld_context * pld_context,struct device * dev)164*5113495bSYour Name void pld_del_dev(struct pld_context *pld_context,
165*5113495bSYour Name 		 struct device *dev)
166*5113495bSYour Name {
167*5113495bSYour Name 	unsigned long flags;
168*5113495bSYour Name 	struct dev_node *dev_node, *tmp;
169*5113495bSYour Name 
170*5113495bSYour Name 	spin_lock_irqsave(&pld_context->pld_lock, flags);
171*5113495bSYour Name 	list_for_each_entry_safe(dev_node, tmp, &pld_context->dev_list, list) {
172*5113495bSYour Name 		if (dev_node->dev == dev) {
173*5113495bSYour Name 			list_del(&dev_node->list);
174*5113495bSYour Name 			kfree(dev_node);
175*5113495bSYour Name 		}
176*5113495bSYour Name 	}
177*5113495bSYour Name 	spin_unlock_irqrestore(&pld_context->pld_lock, flags);
178*5113495bSYour Name }
179*5113495bSYour Name 
pld_get_dev_node(struct device * dev)180*5113495bSYour Name static struct dev_node *pld_get_dev_node(struct device *dev)
181*5113495bSYour Name {
182*5113495bSYour Name 	struct pld_context *pld_context;
183*5113495bSYour Name 	struct dev_node *dev_node;
184*5113495bSYour Name 	unsigned long flags;
185*5113495bSYour Name 
186*5113495bSYour Name 	pld_context = pld_get_global_context();
187*5113495bSYour Name 
188*5113495bSYour Name 	if (!dev || !pld_context) {
189*5113495bSYour Name 		pr_err("Invalid info: dev %pK, context %pK\n",
190*5113495bSYour Name 		       dev, pld_context);
191*5113495bSYour Name 		return NULL;
192*5113495bSYour Name 	}
193*5113495bSYour Name 
194*5113495bSYour Name 	spin_lock_irqsave(&pld_context->pld_lock, flags);
195*5113495bSYour Name 	list_for_each_entry(dev_node, &pld_context->dev_list, list) {
196*5113495bSYour Name 		if (dev_node->dev == dev) {
197*5113495bSYour Name 			spin_unlock_irqrestore(&pld_context->pld_lock, flags);
198*5113495bSYour Name 			return dev_node;
199*5113495bSYour Name 		}
200*5113495bSYour Name 	}
201*5113495bSYour Name 	spin_unlock_irqrestore(&pld_context->pld_lock, flags);
202*5113495bSYour Name 
203*5113495bSYour Name 	return NULL;
204*5113495bSYour Name }
205*5113495bSYour Name 
pld_get_bus_type(struct device * dev)206*5113495bSYour Name enum pld_bus_type pld_get_bus_type(struct device *dev)
207*5113495bSYour Name {
208*5113495bSYour Name 	struct dev_node *dev_node = pld_get_dev_node(dev);
209*5113495bSYour Name 
210*5113495bSYour Name 	if (dev_node)
211*5113495bSYour Name 		return dev_node->bus_type;
212*5113495bSYour Name 	else
213*5113495bSYour Name 		return PLD_BUS_TYPE_NONE;
214*5113495bSYour Name }
215*5113495bSYour Name 
216*5113495bSYour Name /**
217*5113495bSYour Name  * pld_get_if_dev() - Bus interface/pipe dev of the device
218*5113495bSYour Name  * @dev: device
219*5113495bSYour Name  *
220*5113495bSYour Name  * Return: Bus sub-interface or pipe dev.
221*5113495bSYour Name  */
pld_get_if_dev(struct device * dev)222*5113495bSYour Name static struct device *pld_get_if_dev(struct device *dev)
223*5113495bSYour Name {
224*5113495bSYour Name 	struct dev_node *dev_node = pld_get_dev_node(dev);
225*5113495bSYour Name 
226*5113495bSYour Name 	if (dev_node)
227*5113495bSYour Name 		return dev_node->ifdev;
228*5113495bSYour Name 	else
229*5113495bSYour Name 		return NULL;
230*5113495bSYour Name }
231*5113495bSYour Name 
pld_register_driver(struct pld_driver_ops * ops)232*5113495bSYour Name int pld_register_driver(struct pld_driver_ops *ops)
233*5113495bSYour Name {
234*5113495bSYour Name 	int ret = 0;
235*5113495bSYour Name 	struct pld_context *pld_context;
236*5113495bSYour Name 
237*5113495bSYour Name 	pld_context = pld_get_global_context();
238*5113495bSYour Name 
239*5113495bSYour Name 	if (!pld_context) {
240*5113495bSYour Name 		pr_err("global context is NULL\n");
241*5113495bSYour Name 		ret = -ENODEV;
242*5113495bSYour Name 		goto out;
243*5113495bSYour Name 	}
244*5113495bSYour Name 
245*5113495bSYour Name 	if (pld_context->ops) {
246*5113495bSYour Name 		pr_err("driver already registered\n");
247*5113495bSYour Name 		ret = -EEXIST;
248*5113495bSYour Name 		goto out;
249*5113495bSYour Name 	}
250*5113495bSYour Name 
251*5113495bSYour Name 	if (!ops || !ops->probe || !ops->remove ||
252*5113495bSYour Name 	    !ops->suspend || !ops->resume) {
253*5113495bSYour Name 		pr_err("Required callback functions are missing\n");
254*5113495bSYour Name 		ret = -EINVAL;
255*5113495bSYour Name 		goto out;
256*5113495bSYour Name 	}
257*5113495bSYour Name 
258*5113495bSYour Name 	pld_context->ops = ops;
259*5113495bSYour Name 	pld_context->pld_driver_state = 0;
260*5113495bSYour Name 
261*5113495bSYour Name 	ret = pld_pcie_register_driver();
262*5113495bSYour Name 	if (ret) {
263*5113495bSYour Name 		pld_err_rl("Fail to register pcie driver\n");
264*5113495bSYour Name 		goto fail_pcie;
265*5113495bSYour Name 	}
266*5113495bSYour Name 	pld_context->pld_driver_state |= PLD_PCIE_REGISTERED;
267*5113495bSYour Name 
268*5113495bSYour Name 	ret = pld_snoc_register_driver();
269*5113495bSYour Name 	if (ret) {
270*5113495bSYour Name 		pld_err_rl("Fail to register snoc driver\n");
271*5113495bSYour Name 		goto fail_snoc;
272*5113495bSYour Name 	}
273*5113495bSYour Name 	pld_context->pld_driver_state |= PLD_SNOC_REGISTERED;
274*5113495bSYour Name 
275*5113495bSYour Name 	ret = pld_sdio_register_driver();
276*5113495bSYour Name 	if (ret) {
277*5113495bSYour Name 		pr_err("Fail to register sdio driver\n");
278*5113495bSYour Name 		goto fail_sdio;
279*5113495bSYour Name 	}
280*5113495bSYour Name 	pld_context->pld_driver_state |= PLD_SDIO_REGISTERED;
281*5113495bSYour Name 
282*5113495bSYour Name 	ret = pld_snoc_fw_sim_register_driver();
283*5113495bSYour Name 	if (ret) {
284*5113495bSYour Name 		pr_err("Fail to register snoc fw sim driver\n");
285*5113495bSYour Name 		goto fail_snoc_fw_sim;
286*5113495bSYour Name 	}
287*5113495bSYour Name 	pld_context->pld_driver_state |= PLD_SNOC_FW_SIM_REGISTERED;
288*5113495bSYour Name 
289*5113495bSYour Name 	ret = pld_pcie_fw_sim_register_driver();
290*5113495bSYour Name 	if (ret) {
291*5113495bSYour Name 		pr_err("Fail to register pcie fw sim driver\n");
292*5113495bSYour Name 		goto fail_pcie_fw_sim;
293*5113495bSYour Name 	}
294*5113495bSYour Name 	pld_context->pld_driver_state |= PLD_PCIE_FW_SIM_REGISTERED;
295*5113495bSYour Name 
296*5113495bSYour Name 	ret = pld_usb_register_driver();
297*5113495bSYour Name 	if (ret) {
298*5113495bSYour Name 		pr_err("Fail to register usb driver\n");
299*5113495bSYour Name 		goto fail_usb;
300*5113495bSYour Name 	}
301*5113495bSYour Name 	pld_context->pld_driver_state |= PLD_USB_REGISTERED;
302*5113495bSYour Name 
303*5113495bSYour Name 	ret = pld_ipci_register_driver();
304*5113495bSYour Name 	if (ret) {
305*5113495bSYour Name 		pld_err_rl("Fail to register ipci driver\n");
306*5113495bSYour Name 		goto fail_ipci;
307*5113495bSYour Name 	}
308*5113495bSYour Name 	pld_context->pld_driver_state |= PLD_IPCI_REGISTERED;
309*5113495bSYour Name 
310*5113495bSYour Name 	return ret;
311*5113495bSYour Name 
312*5113495bSYour Name fail_ipci:
313*5113495bSYour Name 	pld_usb_unregister_driver();
314*5113495bSYour Name fail_usb:
315*5113495bSYour Name 	pld_pcie_fw_sim_unregister_driver();
316*5113495bSYour Name fail_pcie_fw_sim:
317*5113495bSYour Name 	pld_snoc_fw_sim_unregister_driver();
318*5113495bSYour Name fail_snoc_fw_sim:
319*5113495bSYour Name 	pld_sdio_unregister_driver();
320*5113495bSYour Name fail_sdio:
321*5113495bSYour Name 	pld_snoc_unregister_driver();
322*5113495bSYour Name fail_snoc:
323*5113495bSYour Name 	pld_pcie_unregister_driver();
324*5113495bSYour Name fail_pcie:
325*5113495bSYour Name 	pld_context->pld_driver_state = 0;
326*5113495bSYour Name 	pld_context->ops = NULL;
327*5113495bSYour Name out:
328*5113495bSYour Name 	return ret;
329*5113495bSYour Name }
330*5113495bSYour Name 
pld_unregister_driver(void)331*5113495bSYour Name void pld_unregister_driver(void)
332*5113495bSYour Name {
333*5113495bSYour Name 	struct pld_context *pld_context;
334*5113495bSYour Name 
335*5113495bSYour Name 	pld_context = pld_get_global_context();
336*5113495bSYour Name 
337*5113495bSYour Name 	if (!pld_context) {
338*5113495bSYour Name 		pr_err("global context is NULL\n");
339*5113495bSYour Name 		return;
340*5113495bSYour Name 	}
341*5113495bSYour Name 
342*5113495bSYour Name 	if (!pld_context->ops) {
343*5113495bSYour Name 		pr_err("driver not registered\n");
344*5113495bSYour Name 		return;
345*5113495bSYour Name 	}
346*5113495bSYour Name 
347*5113495bSYour Name 	pld_pcie_unregister_driver();
348*5113495bSYour Name 	pld_snoc_fw_sim_unregister_driver();
349*5113495bSYour Name 	pld_pcie_fw_sim_unregister_driver();
350*5113495bSYour Name 	pld_snoc_unregister_driver();
351*5113495bSYour Name 	pld_sdio_unregister_driver();
352*5113495bSYour Name 	pld_usb_unregister_driver();
353*5113495bSYour Name 	pld_ipci_unregister_driver();
354*5113495bSYour Name 
355*5113495bSYour Name 	pld_context->pld_driver_state = 0;
356*5113495bSYour Name 
357*5113495bSYour Name 	pld_context->ops = NULL;
358*5113495bSYour Name }
359*5113495bSYour Name 
pld_wlan_enable(struct device * dev,struct pld_wlan_enable_cfg * config,enum pld_driver_mode mode)360*5113495bSYour Name int pld_wlan_enable(struct device *dev, struct pld_wlan_enable_cfg *config,
361*5113495bSYour Name 		    enum pld_driver_mode mode)
362*5113495bSYour Name {
363*5113495bSYour Name 	int ret = 0;
364*5113495bSYour Name 	struct device *ifdev;
365*5113495bSYour Name 
366*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
367*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
368*5113495bSYour Name 		ret = pld_pcie_wlan_enable(dev, config, mode, QWLAN_VERSIONSTR);
369*5113495bSYour Name 		break;
370*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
371*5113495bSYour Name 		ret = pld_snoc_wlan_enable(dev, config, mode, QWLAN_VERSIONSTR);
372*5113495bSYour Name 		break;
373*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
374*5113495bSYour Name 		ret = pld_snoc_fw_sim_wlan_enable(dev, config, mode,
375*5113495bSYour Name 						  QWLAN_VERSIONSTR);
376*5113495bSYour Name 		break;
377*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
378*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
379*5113495bSYour Name 		ret = pld_pcie_fw_sim_wlan_enable(dev, config, mode,
380*5113495bSYour Name 						  QWLAN_VERSIONSTR);
381*5113495bSYour Name 		break;
382*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
383*5113495bSYour Name 		ret = pld_sdio_wlan_enable(dev, config, mode, QWLAN_VERSIONSTR);
384*5113495bSYour Name 		break;
385*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
386*5113495bSYour Name 		ifdev = pld_get_if_dev(dev);
387*5113495bSYour Name 		ret = pld_usb_wlan_enable(ifdev, config, mode,
388*5113495bSYour Name 					  QWLAN_VERSIONSTR);
389*5113495bSYour Name 		break;
390*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
391*5113495bSYour Name 		ret = pld_ipci_wlan_enable(dev, config, mode, QWLAN_VERSIONSTR);
392*5113495bSYour Name 		break;
393*5113495bSYour Name 	default:
394*5113495bSYour Name 		ret = -EINVAL;
395*5113495bSYour Name 		break;
396*5113495bSYour Name 	}
397*5113495bSYour Name 
398*5113495bSYour Name 	return ret;
399*5113495bSYour Name }
400*5113495bSYour Name 
pld_wlan_disable(struct device * dev,enum pld_driver_mode mode)401*5113495bSYour Name int pld_wlan_disable(struct device *dev, enum pld_driver_mode mode)
402*5113495bSYour Name {
403*5113495bSYour Name 	int ret = 0;
404*5113495bSYour Name 
405*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
406*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
407*5113495bSYour Name 		ret = pld_pcie_wlan_disable(dev, mode);
408*5113495bSYour Name 		break;
409*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
410*5113495bSYour Name 		ret = pld_snoc_wlan_disable(dev, mode);
411*5113495bSYour Name 		break;
412*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
413*5113495bSYour Name 		ret = pld_snoc_fw_sim_wlan_disable(dev, mode);
414*5113495bSYour Name 		break;
415*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
416*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
417*5113495bSYour Name 		ret = pld_pcie_fw_sim_wlan_disable(dev, mode);
418*5113495bSYour Name 		break;
419*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
420*5113495bSYour Name 		break;
421*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
422*5113495bSYour Name 		ret = pld_ipci_wlan_disable(dev, mode);
423*5113495bSYour Name 		break;
424*5113495bSYour Name 	default:
425*5113495bSYour Name 		ret = -EINVAL;
426*5113495bSYour Name 		break;
427*5113495bSYour Name 	}
428*5113495bSYour Name 
429*5113495bSYour Name 	return ret;
430*5113495bSYour Name }
431*5113495bSYour Name 
pld_wlan_hw_enable(void)432*5113495bSYour Name int pld_wlan_hw_enable(void)
433*5113495bSYour Name {
434*5113495bSYour Name 	return pld_pcie_wlan_hw_enable();
435*5113495bSYour Name }
436*5113495bSYour Name 
pld_set_fw_log_mode(struct device * dev,u8 fw_log_mode)437*5113495bSYour Name int pld_set_fw_log_mode(struct device *dev, u8 fw_log_mode)
438*5113495bSYour Name {
439*5113495bSYour Name 	int ret = 0;
440*5113495bSYour Name 
441*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
442*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
443*5113495bSYour Name 		ret = pld_pcie_set_fw_log_mode(dev, fw_log_mode);
444*5113495bSYour Name 		break;
445*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
446*5113495bSYour Name 		ret = pld_snoc_set_fw_log_mode(dev, fw_log_mode);
447*5113495bSYour Name 		break;
448*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
449*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
450*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
451*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
452*5113495bSYour Name 		break;
453*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
454*5113495bSYour Name 		ret = pld_ipci_set_fw_log_mode(dev, fw_log_mode);
455*5113495bSYour Name 		break;
456*5113495bSYour Name 	default:
457*5113495bSYour Name 		ret = -EINVAL;
458*5113495bSYour Name 		break;
459*5113495bSYour Name 	}
460*5113495bSYour Name 
461*5113495bSYour Name 	return ret;
462*5113495bSYour Name }
463*5113495bSYour Name 
pld_get_default_fw_files(struct pld_fw_files * pfw_files)464*5113495bSYour Name void pld_get_default_fw_files(struct pld_fw_files *pfw_files)
465*5113495bSYour Name {
466*5113495bSYour Name 	memset(pfw_files, 0, sizeof(*pfw_files));
467*5113495bSYour Name 
468*5113495bSYour Name 	strlcpy(pfw_files->image_file, PREFIX PLD_IMAGE_FILE,
469*5113495bSYour Name 		PLD_MAX_FILE_NAME);
470*5113495bSYour Name 	strlcpy(pfw_files->board_data, PREFIX PLD_BOARD_DATA_FILE,
471*5113495bSYour Name 		PLD_MAX_FILE_NAME);
472*5113495bSYour Name 	strlcpy(pfw_files->otp_data, PREFIX PLD_OTP_FILE,
473*5113495bSYour Name 		PLD_MAX_FILE_NAME);
474*5113495bSYour Name 	strlcpy(pfw_files->utf_file, PREFIX PLD_UTF_FIRMWARE_FILE,
475*5113495bSYour Name 		PLD_MAX_FILE_NAME);
476*5113495bSYour Name 	strlcpy(pfw_files->utf_board_data, PREFIX PLD_BOARD_DATA_FILE,
477*5113495bSYour Name 		PLD_MAX_FILE_NAME);
478*5113495bSYour Name 	strlcpy(pfw_files->epping_file, PREFIX PLD_EPPING_FILE,
479*5113495bSYour Name 		PLD_MAX_FILE_NAME);
480*5113495bSYour Name 	strlcpy(pfw_files->setup_file, PREFIX PLD_SETUP_FILE,
481*5113495bSYour Name 		PLD_MAX_FILE_NAME);
482*5113495bSYour Name }
483*5113495bSYour Name 
pld_get_fw_files_for_target(struct device * dev,struct pld_fw_files * pfw_files,u32 target_type,u32 target_version)484*5113495bSYour Name int pld_get_fw_files_for_target(struct device *dev,
485*5113495bSYour Name 				struct pld_fw_files *pfw_files,
486*5113495bSYour Name 				u32 target_type, u32 target_version)
487*5113495bSYour Name {
488*5113495bSYour Name 	int ret = 0;
489*5113495bSYour Name 
490*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
491*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
492*5113495bSYour Name 		ret = pld_pcie_get_fw_files_for_target(dev, pfw_files,
493*5113495bSYour Name 						       target_type,
494*5113495bSYour Name 						       target_version);
495*5113495bSYour Name 		break;
496*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
497*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
498*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
499*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
500*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
501*5113495bSYour Name 		break;
502*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
503*5113495bSYour Name 		ret = pld_sdio_get_fw_files_for_target(pfw_files,
504*5113495bSYour Name 						       target_type,
505*5113495bSYour Name 						       target_version);
506*5113495bSYour Name 		break;
507*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
508*5113495bSYour Name 	ret = pld_usb_get_fw_files_for_target(pfw_files,
509*5113495bSYour Name 					      target_type,
510*5113495bSYour Name 					      target_version);
511*5113495bSYour Name 	break;
512*5113495bSYour Name 	default:
513*5113495bSYour Name 		ret = -EINVAL;
514*5113495bSYour Name 		break;
515*5113495bSYour Name 	}
516*5113495bSYour Name 
517*5113495bSYour Name 	return ret;
518*5113495bSYour Name }
519*5113495bSYour Name 
pld_prevent_l1(struct device * dev)520*5113495bSYour Name int pld_prevent_l1(struct device *dev)
521*5113495bSYour Name {
522*5113495bSYour Name 	int ret = 0;
523*5113495bSYour Name 
524*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
525*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
526*5113495bSYour Name 		ret = pld_pcie_prevent_l1(dev);
527*5113495bSYour Name 		break;
528*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
529*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
530*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
531*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
532*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
533*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
534*5113495bSYour Name 		break;
535*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
536*5113495bSYour Name 		ret = pld_ipci_prevent_l1(dev);
537*5113495bSYour Name 		break;
538*5113495bSYour Name 	default:
539*5113495bSYour Name 		ret = -EINVAL;
540*5113495bSYour Name 		pr_err("Invalid device type\n");
541*5113495bSYour Name 		break;
542*5113495bSYour Name 	}
543*5113495bSYour Name 
544*5113495bSYour Name 	return ret;
545*5113495bSYour Name }
546*5113495bSYour Name 
pld_allow_l1(struct device * dev)547*5113495bSYour Name void pld_allow_l1(struct device *dev)
548*5113495bSYour Name {
549*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
550*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
551*5113495bSYour Name 		pld_pcie_allow_l1(dev);
552*5113495bSYour Name 		break;
553*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
554*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
555*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
556*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
557*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
558*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
559*5113495bSYour Name 		break;
560*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
561*5113495bSYour Name 		pld_ipci_allow_l1(dev);
562*5113495bSYour Name 		break;
563*5113495bSYour Name 	default:
564*5113495bSYour Name 		pr_err("Invalid device type\n");
565*5113495bSYour Name 		break;
566*5113495bSYour Name 	}
567*5113495bSYour Name }
568*5113495bSYour Name 
pld_get_mhi_state(struct device * dev)569*5113495bSYour Name int pld_get_mhi_state(struct device *dev)
570*5113495bSYour Name {
571*5113495bSYour Name 	int ret = 0;
572*5113495bSYour Name 
573*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
574*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
575*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
576*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
577*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
578*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
579*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
580*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
581*5113495bSYour Name 		ret = PLD_MHI_STATE_L0;
582*5113495bSYour Name 		break;
583*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
584*5113495bSYour Name 		ret = pld_ipci_mhi_state(dev);
585*5113495bSYour Name 		break;
586*5113495bSYour Name 	default:
587*5113495bSYour Name 		pr_err("Invalid device type\n");
588*5113495bSYour Name 		break;
589*5113495bSYour Name 	}
590*5113495bSYour Name 	return ret;
591*5113495bSYour Name }
592*5113495bSYour Name 
pld_set_pcie_gen_speed(struct device * dev,u8 pcie_gen_speed)593*5113495bSYour Name int pld_set_pcie_gen_speed(struct device *dev, u8 pcie_gen_speed)
594*5113495bSYour Name {
595*5113495bSYour Name 	int ret = -EINVAL;
596*5113495bSYour Name 
597*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
598*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
599*5113495bSYour Name 		ret = pld_pcie_set_gen_speed(dev, pcie_gen_speed);
600*5113495bSYour Name 		break;
601*5113495bSYour Name 	default:
602*5113495bSYour Name 		pr_err("Invalid device type\n");
603*5113495bSYour Name 		break;
604*5113495bSYour Name 	}
605*5113495bSYour Name 	return ret;
606*5113495bSYour Name }
607*5113495bSYour Name 
pld_is_pci_link_down(struct device * dev)608*5113495bSYour Name void pld_is_pci_link_down(struct device *dev)
609*5113495bSYour Name {
610*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
611*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
612*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
613*5113495bSYour Name 		break;
614*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
615*5113495bSYour Name 		pld_pcie_link_down(dev);
616*5113495bSYour Name 		break;
617*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
618*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
619*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
620*5113495bSYour Name 		break;
621*5113495bSYour Name 	default:
622*5113495bSYour Name 		pr_err("Invalid device type\n");
623*5113495bSYour Name 		break;
624*5113495bSYour Name 	}
625*5113495bSYour Name }
626*5113495bSYour Name 
pld_get_bus_reg_dump(struct device * dev,uint8_t * buf,uint32_t len)627*5113495bSYour Name void pld_get_bus_reg_dump(struct device *dev, uint8_t *buf, uint32_t len)
628*5113495bSYour Name {
629*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
630*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
631*5113495bSYour Name 		break;
632*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
633*5113495bSYour Name 		pld_pcie_get_reg_dump(dev, buf, len);
634*5113495bSYour Name 		break;
635*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
636*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
637*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
638*5113495bSYour Name 		break;
639*5113495bSYour Name 	default:
640*5113495bSYour Name 		pr_err("Invalid device type\n");
641*5113495bSYour Name 		break;
642*5113495bSYour Name 	}
643*5113495bSYour Name }
644*5113495bSYour Name 
pld_schedule_recovery_work(struct device * dev,enum pld_recovery_reason reason)645*5113495bSYour Name void pld_schedule_recovery_work(struct device *dev,
646*5113495bSYour Name 				enum pld_recovery_reason reason)
647*5113495bSYour Name {
648*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
649*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
650*5113495bSYour Name 		pld_pcie_schedule_recovery_work(dev, reason);
651*5113495bSYour Name 		break;
652*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
653*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
654*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
655*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
656*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
657*5113495bSYour Name 		break;
658*5113495bSYour Name 	default:
659*5113495bSYour Name 		pr_err("Invalid device type\n");
660*5113495bSYour Name 		break;
661*5113495bSYour Name 	}
662*5113495bSYour Name }
663*5113495bSYour Name 
pld_wlan_pm_control(struct device * dev,bool vote)664*5113495bSYour Name int pld_wlan_pm_control(struct device *dev, bool vote)
665*5113495bSYour Name {
666*5113495bSYour Name 	int ret = 0;
667*5113495bSYour Name 
668*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
669*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
670*5113495bSYour Name 		ret = pld_pcie_wlan_pm_control(dev, vote);
671*5113495bSYour Name 		break;
672*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
673*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
674*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
675*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
676*5113495bSYour Name 		break;
677*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
678*5113495bSYour Name 		break;
679*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
680*5113495bSYour Name 		break;
681*5113495bSYour Name 	default:
682*5113495bSYour Name 		ret = -EINVAL;
683*5113495bSYour Name 		break;
684*5113495bSYour Name 	}
685*5113495bSYour Name 
686*5113495bSYour Name 	return ret;
687*5113495bSYour Name }
688*5113495bSYour Name 
pld_get_virt_ramdump_mem(struct device * dev,unsigned long * size)689*5113495bSYour Name void *pld_get_virt_ramdump_mem(struct device *dev, unsigned long *size)
690*5113495bSYour Name {
691*5113495bSYour Name 	void *mem = NULL;
692*5113495bSYour Name 
693*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
694*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
695*5113495bSYour Name 		mem = pld_pcie_get_virt_ramdump_mem(dev, size);
696*5113495bSYour Name 		break;
697*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
698*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
699*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
700*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
701*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
702*5113495bSYour Name 		break;
703*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
704*5113495bSYour Name 		mem = pld_sdio_get_virt_ramdump_mem(dev, size);
705*5113495bSYour Name 		break;
706*5113495bSYour Name 	default:
707*5113495bSYour Name 		pr_err("Invalid device type\n");
708*5113495bSYour Name 		break;
709*5113495bSYour Name 	}
710*5113495bSYour Name 
711*5113495bSYour Name 	return mem;
712*5113495bSYour Name }
713*5113495bSYour Name 
pld_release_virt_ramdump_mem(struct device * dev,void * address)714*5113495bSYour Name void pld_release_virt_ramdump_mem(struct device *dev, void *address)
715*5113495bSYour Name {
716*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
717*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
718*5113495bSYour Name 		pld_pcie_release_virt_ramdump_mem(address);
719*5113495bSYour Name 		break;
720*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
721*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
722*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
723*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
724*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
725*5113495bSYour Name 		break;
726*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
727*5113495bSYour Name 		pld_sdio_release_virt_ramdump_mem(address);
728*5113495bSYour Name 		break;
729*5113495bSYour Name 	default:
730*5113495bSYour Name 		pr_err("Invalid device type\n");
731*5113495bSYour Name 		break;
732*5113495bSYour Name 	}
733*5113495bSYour Name }
734*5113495bSYour Name 
pld_device_crashed(struct device * dev)735*5113495bSYour Name void pld_device_crashed(struct device *dev)
736*5113495bSYour Name {
737*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
738*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
739*5113495bSYour Name 		pld_pcie_device_crashed(dev);
740*5113495bSYour Name 		break;
741*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
742*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
743*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
744*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
745*5113495bSYour Name 		break;
746*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
747*5113495bSYour Name 		break;
748*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
749*5113495bSYour Name 		pld_sdio_device_crashed(dev);
750*5113495bSYour Name 		break;
751*5113495bSYour Name 	default:
752*5113495bSYour Name 		pr_err("Invalid device type\n");
753*5113495bSYour Name 		break;
754*5113495bSYour Name 	}
755*5113495bSYour Name }
756*5113495bSYour Name 
pld_device_self_recovery(struct device * dev,enum pld_recovery_reason reason)757*5113495bSYour Name void pld_device_self_recovery(struct device *dev,
758*5113495bSYour Name 			      enum pld_recovery_reason reason)
759*5113495bSYour Name {
760*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
761*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
762*5113495bSYour Name 		pld_pcie_device_self_recovery(dev, reason);
763*5113495bSYour Name 		break;
764*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
765*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
766*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
767*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
768*5113495bSYour Name 		break;
769*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
770*5113495bSYour Name 		break;
771*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
772*5113495bSYour Name 		pld_sdio_device_self_recovery(dev);
773*5113495bSYour Name 		break;
774*5113495bSYour Name 	default:
775*5113495bSYour Name 		pr_err("Invalid device type\n");
776*5113495bSYour Name 		break;
777*5113495bSYour Name 	}
778*5113495bSYour Name }
779*5113495bSYour Name 
pld_intr_notify_q6(struct device * dev)780*5113495bSYour Name void pld_intr_notify_q6(struct device *dev)
781*5113495bSYour Name {
782*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
783*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
784*5113495bSYour Name 		pld_pcie_intr_notify_q6(dev);
785*5113495bSYour Name 		break;
786*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
787*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
788*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
789*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
790*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
791*5113495bSYour Name 		break;
792*5113495bSYour Name 	default:
793*5113495bSYour Name 		pr_err("Invalid device type\n");
794*5113495bSYour Name 		break;
795*5113495bSYour Name 	}
796*5113495bSYour Name }
797*5113495bSYour Name 
pld_request_pm_qos(struct device * dev,u32 qos_val)798*5113495bSYour Name void pld_request_pm_qos(struct device *dev, u32 qos_val)
799*5113495bSYour Name {
800*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
801*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
802*5113495bSYour Name 		pld_pcie_request_pm_qos(dev, qos_val);
803*5113495bSYour Name 		break;
804*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
805*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
806*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
807*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
808*5113495bSYour Name 		break;
809*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
810*5113495bSYour Name 		break;
811*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
812*5113495bSYour Name 		/* To do Add call cns API */
813*5113495bSYour Name 		break;
814*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
815*5113495bSYour Name 		break;
816*5113495bSYour Name 	default:
817*5113495bSYour Name 		pr_err("Invalid device type\n");
818*5113495bSYour Name 		break;
819*5113495bSYour Name 	}
820*5113495bSYour Name }
821*5113495bSYour Name 
pld_remove_pm_qos(struct device * dev)822*5113495bSYour Name void pld_remove_pm_qos(struct device *dev)
823*5113495bSYour Name {
824*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
825*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
826*5113495bSYour Name 		pld_pcie_remove_pm_qos(dev);
827*5113495bSYour Name 		break;
828*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
829*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
830*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
831*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
832*5113495bSYour Name 		break;
833*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
834*5113495bSYour Name 		break;
835*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
836*5113495bSYour Name 		/* To do Add call cns API */
837*5113495bSYour Name 		break;
838*5113495bSYour Name 	default:
839*5113495bSYour Name 		pr_err("Invalid device type\n");
840*5113495bSYour Name 		break;
841*5113495bSYour Name 	}
842*5113495bSYour Name }
843*5113495bSYour Name 
pld_request_bus_bandwidth(struct device * dev,int bandwidth)844*5113495bSYour Name int pld_request_bus_bandwidth(struct device *dev, int bandwidth)
845*5113495bSYour Name {
846*5113495bSYour Name 	int ret = 0;
847*5113495bSYour Name 
848*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
849*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
850*5113495bSYour Name 		ret = pld_pcie_request_bus_bandwidth(dev, bandwidth);
851*5113495bSYour Name 		break;
852*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
853*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
854*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
855*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
856*5113495bSYour Name 		break;
857*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
858*5113495bSYour Name 		break;
859*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
860*5113495bSYour Name 		/* To do Add call cns API */
861*5113495bSYour Name 		break;
862*5113495bSYour Name 	default:
863*5113495bSYour Name 		ret = -EINVAL;
864*5113495bSYour Name 		break;
865*5113495bSYour Name 	}
866*5113495bSYour Name 
867*5113495bSYour Name 	return ret;
868*5113495bSYour Name }
869*5113495bSYour Name 
pld_is_direct_link_supported(struct device * dev)870*5113495bSYour Name bool pld_is_direct_link_supported(struct device *dev)
871*5113495bSYour Name {
872*5113495bSYour Name 	bool ret = false;
873*5113495bSYour Name 
874*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
875*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
876*5113495bSYour Name 		ret = pld_pcie_is_direct_link_supported(dev);
877*5113495bSYour Name 		break;
878*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
879*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
880*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
881*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
882*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
883*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
884*5113495bSYour Name 	default:
885*5113495bSYour Name 		break;
886*5113495bSYour Name 	}
887*5113495bSYour Name 
888*5113495bSYour Name 	return ret;
889*5113495bSYour Name }
890*5113495bSYour Name 
pld_get_platform_cap(struct device * dev,struct pld_platform_cap * cap)891*5113495bSYour Name int pld_get_platform_cap(struct device *dev, struct pld_platform_cap *cap)
892*5113495bSYour Name {
893*5113495bSYour Name 	int ret = 0;
894*5113495bSYour Name 
895*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
896*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
897*5113495bSYour Name 		ret = pld_pcie_get_platform_cap(dev, cap);
898*5113495bSYour Name 		break;
899*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
900*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
901*5113495bSYour Name 		ret = pld_pcie_fw_sim_get_platform_cap(dev, cap);
902*5113495bSYour Name 		break;
903*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
904*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
905*5113495bSYour Name 		break;
906*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
907*5113495bSYour Name 		break;
908*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
909*5113495bSYour Name 		break;
910*5113495bSYour Name 	default:
911*5113495bSYour Name 		ret = -EINVAL;
912*5113495bSYour Name 		break;
913*5113495bSYour Name 	}
914*5113495bSYour Name 
915*5113495bSYour Name 	return ret;
916*5113495bSYour Name }
917*5113495bSYour Name 
pld_get_sha_hash(struct device * dev,const u8 * data,u32 data_len,u8 * hash_idx,u8 * out)918*5113495bSYour Name int pld_get_sha_hash(struct device *dev, const u8 *data,
919*5113495bSYour Name 		     u32 data_len, u8 *hash_idx, u8 *out)
920*5113495bSYour Name {
921*5113495bSYour Name 	int ret = 0;
922*5113495bSYour Name 
923*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
924*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
925*5113495bSYour Name 		ret = pld_pcie_get_sha_hash(dev, data, data_len,
926*5113495bSYour Name 					    hash_idx, out);
927*5113495bSYour Name 		break;
928*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
929*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
930*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
931*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
932*5113495bSYour Name 		break;
933*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
934*5113495bSYour Name 		break;
935*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
936*5113495bSYour Name 		break;
937*5113495bSYour Name 	default:
938*5113495bSYour Name 		ret = -EINVAL;
939*5113495bSYour Name 		break;
940*5113495bSYour Name 	}
941*5113495bSYour Name 
942*5113495bSYour Name 	return ret;
943*5113495bSYour Name }
944*5113495bSYour Name 
pld_get_fw_ptr(struct device * dev)945*5113495bSYour Name void *pld_get_fw_ptr(struct device *dev)
946*5113495bSYour Name {
947*5113495bSYour Name 	void *ptr = NULL;
948*5113495bSYour Name 
949*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
950*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
951*5113495bSYour Name 		ptr = pld_pcie_get_fw_ptr(dev);
952*5113495bSYour Name 		break;
953*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
954*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
955*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
956*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
957*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
958*5113495bSYour Name 		break;
959*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
960*5113495bSYour Name 		break;
961*5113495bSYour Name 	default:
962*5113495bSYour Name 		pr_err("Invalid device type\n");
963*5113495bSYour Name 		break;
964*5113495bSYour Name 	}
965*5113495bSYour Name 
966*5113495bSYour Name 	return ptr;
967*5113495bSYour Name }
968*5113495bSYour Name 
pld_auto_suspend(struct device * dev)969*5113495bSYour Name int pld_auto_suspend(struct device *dev)
970*5113495bSYour Name {
971*5113495bSYour Name 	int ret = 0;
972*5113495bSYour Name 
973*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
974*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
975*5113495bSYour Name 		ret = pld_pcie_auto_suspend(dev);
976*5113495bSYour Name 		break;
977*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
978*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
979*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
980*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
981*5113495bSYour Name 		break;
982*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
983*5113495bSYour Name 		break;
984*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
985*5113495bSYour Name 		break;
986*5113495bSYour Name 	default:
987*5113495bSYour Name 		ret = -EINVAL;
988*5113495bSYour Name 		break;
989*5113495bSYour Name 	}
990*5113495bSYour Name 
991*5113495bSYour Name 	return ret;
992*5113495bSYour Name }
993*5113495bSYour Name 
pld_auto_resume(struct device * dev)994*5113495bSYour Name int pld_auto_resume(struct device *dev)
995*5113495bSYour Name {
996*5113495bSYour Name 	int ret = 0;
997*5113495bSYour Name 
998*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
999*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1000*5113495bSYour Name 		ret = pld_pcie_auto_resume(dev);
1001*5113495bSYour Name 		break;
1002*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1003*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1004*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1005*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1006*5113495bSYour Name 		break;
1007*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1008*5113495bSYour Name 		break;
1009*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1010*5113495bSYour Name 		break;
1011*5113495bSYour Name 	default:
1012*5113495bSYour Name 		ret = -EINVAL;
1013*5113495bSYour Name 		break;
1014*5113495bSYour Name 	}
1015*5113495bSYour Name 
1016*5113495bSYour Name 	return ret;
1017*5113495bSYour Name }
1018*5113495bSYour Name 
pld_force_wake_request(struct device * dev)1019*5113495bSYour Name int pld_force_wake_request(struct device *dev)
1020*5113495bSYour Name {
1021*5113495bSYour Name 	int ret = 0;
1022*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
1023*5113495bSYour Name 
1024*5113495bSYour Name 	switch (type) {
1025*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1026*5113495bSYour Name 		ret = pld_pcie_force_wake_request(dev);
1027*5113495bSYour Name 		break;
1028*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1029*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1030*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1031*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1032*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1033*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
1034*5113495bSYour Name 		break;
1035*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1036*5113495bSYour Name 		ret = pld_ipci_force_wake_request(dev);
1037*5113495bSYour Name 		break;
1038*5113495bSYour Name 	default:
1039*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
1040*5113495bSYour Name 		ret = -EINVAL;
1041*5113495bSYour Name 		break;
1042*5113495bSYour Name 	}
1043*5113495bSYour Name 
1044*5113495bSYour Name 	return ret;
1045*5113495bSYour Name }
1046*5113495bSYour Name 
pld_force_wake_request_sync(struct device * dev,int timeout_us)1047*5113495bSYour Name int pld_force_wake_request_sync(struct device *dev, int timeout_us)
1048*5113495bSYour Name {
1049*5113495bSYour Name 	int ret = 0;
1050*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
1051*5113495bSYour Name 
1052*5113495bSYour Name 	switch (type) {
1053*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1054*5113495bSYour Name 		ret = pld_pcie_force_wake_request_sync(dev, timeout_us);
1055*5113495bSYour Name 		break;
1056*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1057*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1058*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1059*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1060*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1061*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
1062*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1063*5113495bSYour Name 		break;
1064*5113495bSYour Name 	default:
1065*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
1066*5113495bSYour Name 		ret = -EINVAL;
1067*5113495bSYour Name 		break;
1068*5113495bSYour Name 	}
1069*5113495bSYour Name 
1070*5113495bSYour Name 	return ret;
1071*5113495bSYour Name }
1072*5113495bSYour Name 
pld_exit_power_save(struct device * dev)1073*5113495bSYour Name int pld_exit_power_save(struct device *dev)
1074*5113495bSYour Name {
1075*5113495bSYour Name 	int ret = 0;
1076*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
1077*5113495bSYour Name 
1078*5113495bSYour Name 	switch (type) {
1079*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1080*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1081*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1082*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1083*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1084*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
1085*5113495bSYour Name 		break;
1086*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1087*5113495bSYour Name 		ret = pld_pcie_fw_sim_exit_power_save(dev);
1088*5113495bSYour Name 		break;
1089*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1090*5113495bSYour Name 		ret = pld_ipci_exit_power_save(dev);
1091*5113495bSYour Name 		break;
1092*5113495bSYour Name 	default:
1093*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
1094*5113495bSYour Name 		ret = -EINVAL;
1095*5113495bSYour Name 		break;
1096*5113495bSYour Name 	}
1097*5113495bSYour Name 
1098*5113495bSYour Name 	return ret;
1099*5113495bSYour Name }
1100*5113495bSYour Name 
pld_is_device_awake(struct device * dev)1101*5113495bSYour Name int pld_is_device_awake(struct device *dev)
1102*5113495bSYour Name {
1103*5113495bSYour Name 	int ret = true;
1104*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
1105*5113495bSYour Name 
1106*5113495bSYour Name 	switch (type) {
1107*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1108*5113495bSYour Name 		ret = pld_pcie_is_device_awake(dev);
1109*5113495bSYour Name 		break;
1110*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1111*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1112*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1113*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1114*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1115*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
1116*5113495bSYour Name 		break;
1117*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1118*5113495bSYour Name 		ret = pld_ipci_is_device_awake(dev);
1119*5113495bSYour Name 		break;
1120*5113495bSYour Name 	default:
1121*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
1122*5113495bSYour Name 		ret = -EINVAL;
1123*5113495bSYour Name 		break;
1124*5113495bSYour Name 	}
1125*5113495bSYour Name 
1126*5113495bSYour Name 	return ret;
1127*5113495bSYour Name }
1128*5113495bSYour Name 
pld_is_pci_ep_awake(struct device * dev)1129*5113495bSYour Name int pld_is_pci_ep_awake(struct device *dev)
1130*5113495bSYour Name {
1131*5113495bSYour Name 	int ret = true;
1132*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
1133*5113495bSYour Name 
1134*5113495bSYour Name 	switch (type) {
1135*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1136*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1137*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1138*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1139*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1140*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1141*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
1142*5113495bSYour Name 		ret = -ENOTSUPP;
1143*5113495bSYour Name 		break;
1144*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1145*5113495bSYour Name 		ret = pld_ipci_is_pci_ep_awake(dev);
1146*5113495bSYour Name 		break;
1147*5113495bSYour Name 	default:
1148*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
1149*5113495bSYour Name 		ret = -EINVAL;
1150*5113495bSYour Name 		break;
1151*5113495bSYour Name 	}
1152*5113495bSYour Name 
1153*5113495bSYour Name 	return ret;
1154*5113495bSYour Name }
1155*5113495bSYour Name 
pld_force_wake_release(struct device * dev)1156*5113495bSYour Name int pld_force_wake_release(struct device *dev)
1157*5113495bSYour Name {
1158*5113495bSYour Name 	int ret = 0;
1159*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
1160*5113495bSYour Name 
1161*5113495bSYour Name 	switch (type) {
1162*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1163*5113495bSYour Name 		ret = pld_pcie_force_wake_release(dev);
1164*5113495bSYour Name 		break;
1165*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1166*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1167*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1168*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1169*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1170*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
1171*5113495bSYour Name 		break;
1172*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1173*5113495bSYour Name 		ret = pld_ipci_force_wake_release(dev);
1174*5113495bSYour Name 		break;
1175*5113495bSYour Name 	default:
1176*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
1177*5113495bSYour Name 		ret = -EINVAL;
1178*5113495bSYour Name 		break;
1179*5113495bSYour Name 	}
1180*5113495bSYour Name 
1181*5113495bSYour Name 	return ret;
1182*5113495bSYour Name }
1183*5113495bSYour Name 
pld_ce_request_irq(struct device * dev,unsigned int ce_id,irqreturn_t (* handler)(int,void *),unsigned long flags,const char * name,void * ctx)1184*5113495bSYour Name int pld_ce_request_irq(struct device *dev, unsigned int ce_id,
1185*5113495bSYour Name 		       irqreturn_t (*handler)(int, void *),
1186*5113495bSYour Name 		       unsigned long flags, const char *name, void *ctx)
1187*5113495bSYour Name {
1188*5113495bSYour Name 	int ret = 0;
1189*5113495bSYour Name 
1190*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
1191*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1192*5113495bSYour Name 		ret = pld_snoc_ce_request_irq(dev, ce_id,
1193*5113495bSYour Name 					      handler, flags, name, ctx);
1194*5113495bSYour Name 		break;
1195*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1196*5113495bSYour Name 		ret = pld_snoc_fw_sim_ce_request_irq(dev, ce_id,
1197*5113495bSYour Name 						     handler, flags, name, ctx);
1198*5113495bSYour Name 		break;
1199*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1200*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1201*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1202*5113495bSYour Name 		break;
1203*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1204*5113495bSYour Name 		break;
1205*5113495bSYour Name 	default:
1206*5113495bSYour Name 		ret = -EINVAL;
1207*5113495bSYour Name 		break;
1208*5113495bSYour Name 	}
1209*5113495bSYour Name 
1210*5113495bSYour Name 	return ret;
1211*5113495bSYour Name }
1212*5113495bSYour Name 
pld_ce_free_irq(struct device * dev,unsigned int ce_id,void * ctx)1213*5113495bSYour Name int pld_ce_free_irq(struct device *dev, unsigned int ce_id, void *ctx)
1214*5113495bSYour Name {
1215*5113495bSYour Name 	int ret = 0;
1216*5113495bSYour Name 
1217*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
1218*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1219*5113495bSYour Name 		ret = pld_snoc_ce_free_irq(dev, ce_id, ctx);
1220*5113495bSYour Name 		break;
1221*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1222*5113495bSYour Name 		ret = pld_snoc_fw_sim_ce_free_irq(dev, ce_id, ctx);
1223*5113495bSYour Name 		break;
1224*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1225*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1226*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1227*5113495bSYour Name 		break;
1228*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1229*5113495bSYour Name 		break;
1230*5113495bSYour Name 	default:
1231*5113495bSYour Name 		ret = -EINVAL;
1232*5113495bSYour Name 		break;
1233*5113495bSYour Name 	}
1234*5113495bSYour Name 
1235*5113495bSYour Name 	return ret;
1236*5113495bSYour Name }
1237*5113495bSYour Name 
pld_enable_irq(struct device * dev,unsigned int ce_id)1238*5113495bSYour Name void pld_enable_irq(struct device *dev, unsigned int ce_id)
1239*5113495bSYour Name {
1240*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
1241*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1242*5113495bSYour Name 		pld_snoc_enable_irq(dev, ce_id);
1243*5113495bSYour Name 		break;
1244*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1245*5113495bSYour Name 		pld_snoc_fw_sim_enable_irq(dev, ce_id);
1246*5113495bSYour Name 		break;
1247*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1248*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1249*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1250*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1251*5113495bSYour Name 		break;
1252*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1253*5113495bSYour Name 		break;
1254*5113495bSYour Name 	default:
1255*5113495bSYour Name 		pr_err("Invalid device type\n");
1256*5113495bSYour Name 		break;
1257*5113495bSYour Name 	}
1258*5113495bSYour Name }
1259*5113495bSYour Name 
pld_disable_irq(struct device * dev,unsigned int ce_id)1260*5113495bSYour Name void pld_disable_irq(struct device *dev, unsigned int ce_id)
1261*5113495bSYour Name {
1262*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
1263*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1264*5113495bSYour Name 		pld_snoc_disable_irq(dev, ce_id);
1265*5113495bSYour Name 		break;
1266*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1267*5113495bSYour Name 		pld_snoc_fw_sim_disable_irq(dev, ce_id);
1268*5113495bSYour Name 		break;
1269*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1270*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1271*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1272*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1273*5113495bSYour Name 		break;
1274*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1275*5113495bSYour Name 		break;
1276*5113495bSYour Name 	default:
1277*5113495bSYour Name 		pr_err("Invalid device type\n");
1278*5113495bSYour Name 		break;
1279*5113495bSYour Name 	}
1280*5113495bSYour Name }
1281*5113495bSYour Name 
pld_get_soc_info(struct device * dev,struct pld_soc_info * info)1282*5113495bSYour Name int pld_get_soc_info(struct device *dev, struct pld_soc_info *info)
1283*5113495bSYour Name {
1284*5113495bSYour Name 	int ret = 0;
1285*5113495bSYour Name 	memset(info, 0, sizeof(*info));
1286*5113495bSYour Name 
1287*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
1288*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1289*5113495bSYour Name 		ret = pld_snoc_get_soc_info(dev, info);
1290*5113495bSYour Name 		break;
1291*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1292*5113495bSYour Name 		ret = pld_snoc_fw_sim_get_soc_info(dev, info);
1293*5113495bSYour Name 		break;
1294*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1295*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1296*5113495bSYour Name 		ret = pld_pcie_fw_sim_get_soc_info(dev, info);
1297*5113495bSYour Name 		break;
1298*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1299*5113495bSYour Name 		ret = pld_pcie_get_soc_info(dev, info);
1300*5113495bSYour Name 		break;
1301*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1302*5113495bSYour Name 		break;
1303*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1304*5113495bSYour Name 		ret = pld_ipci_get_soc_info(dev, info);
1305*5113495bSYour Name 		break;
1306*5113495bSYour Name 	default:
1307*5113495bSYour Name 		ret = -EINVAL;
1308*5113495bSYour Name 		break;
1309*5113495bSYour Name 	}
1310*5113495bSYour Name 
1311*5113495bSYour Name 	return ret;
1312*5113495bSYour Name }
1313*5113495bSYour Name 
pld_get_ce_id(struct device * dev,int irq)1314*5113495bSYour Name int pld_get_ce_id(struct device *dev, int irq)
1315*5113495bSYour Name {
1316*5113495bSYour Name 	int ret = 0;
1317*5113495bSYour Name 
1318*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
1319*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1320*5113495bSYour Name 		ret = pld_snoc_get_ce_id(dev, irq);
1321*5113495bSYour Name 		break;
1322*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1323*5113495bSYour Name 		ret = pld_snoc_fw_sim_get_ce_id(dev, irq);
1324*5113495bSYour Name 		break;
1325*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1326*5113495bSYour Name 		ret = pld_pcie_get_ce_id(dev, irq);
1327*5113495bSYour Name 		break;
1328*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1329*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1330*5113495bSYour Name 		break;
1331*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1332*5113495bSYour Name 		break;
1333*5113495bSYour Name 	default:
1334*5113495bSYour Name 		ret = -EINVAL;
1335*5113495bSYour Name 		break;
1336*5113495bSYour Name 	}
1337*5113495bSYour Name 
1338*5113495bSYour Name 	return ret;
1339*5113495bSYour Name }
1340*5113495bSYour Name 
pld_get_irq(struct device * dev,int ce_id)1341*5113495bSYour Name int pld_get_irq(struct device *dev, int ce_id)
1342*5113495bSYour Name {
1343*5113495bSYour Name 	int ret = 0;
1344*5113495bSYour Name 
1345*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
1346*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1347*5113495bSYour Name 		ret = pld_snoc_get_irq(dev, ce_id);
1348*5113495bSYour Name 		break;
1349*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1350*5113495bSYour Name 		ret = pld_snoc_fw_sim_get_irq(dev, ce_id);
1351*5113495bSYour Name 		break;
1352*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1353*5113495bSYour Name 		ret = pld_ipci_get_irq(dev, ce_id);
1354*5113495bSYour Name 		break;
1355*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1356*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1357*5113495bSYour Name 		ret = pld_pcie_fw_sim_get_irq(dev, ce_id);
1358*5113495bSYour Name 		break;
1359*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1360*5113495bSYour Name 	default:
1361*5113495bSYour Name 		ret = -EINVAL;
1362*5113495bSYour Name 		break;
1363*5113495bSYour Name 	}
1364*5113495bSYour Name 
1365*5113495bSYour Name 	return ret;
1366*5113495bSYour Name }
1367*5113495bSYour Name 
pld_lock_reg_window(struct device * dev,unsigned long * flags)1368*5113495bSYour Name void pld_lock_reg_window(struct device *dev, unsigned long *flags)
1369*5113495bSYour Name {
1370*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
1371*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1372*5113495bSYour Name 		pld_pcie_lock_reg_window(dev, flags);
1373*5113495bSYour Name 		break;
1374*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1375*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1376*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1377*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1378*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1379*5113495bSYour Name 		break;
1380*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1381*5113495bSYour Name 		break;
1382*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
1383*5113495bSYour Name 		break;
1384*5113495bSYour Name 	default:
1385*5113495bSYour Name 		pr_err("Invalid device type\n");
1386*5113495bSYour Name 		break;
1387*5113495bSYour Name 	}
1388*5113495bSYour Name }
1389*5113495bSYour Name 
pld_unlock_reg_window(struct device * dev,unsigned long * flags)1390*5113495bSYour Name void pld_unlock_reg_window(struct device *dev, unsigned long *flags)
1391*5113495bSYour Name {
1392*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
1393*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1394*5113495bSYour Name 		pld_pcie_unlock_reg_window(dev, flags);
1395*5113495bSYour Name 		break;
1396*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1397*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1398*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1399*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1400*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1401*5113495bSYour Name 		break;
1402*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1403*5113495bSYour Name 		break;
1404*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
1405*5113495bSYour Name 		break;
1406*5113495bSYour Name 	default:
1407*5113495bSYour Name 		pr_err("Invalid device type\n");
1408*5113495bSYour Name 		break;
1409*5113495bSYour Name 	}
1410*5113495bSYour Name }
1411*5113495bSYour Name 
pld_get_pci_slot(struct device * dev)1412*5113495bSYour Name int pld_get_pci_slot(struct device *dev)
1413*5113495bSYour Name {
1414*5113495bSYour Name 	int ret = 0;
1415*5113495bSYour Name 
1416*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
1417*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1418*5113495bSYour Name 		ret = pld_pcie_get_pci_slot(dev);
1419*5113495bSYour Name 		break;
1420*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1421*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1422*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1423*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1424*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1425*5113495bSYour Name 		break;
1426*5113495bSYour Name 	default:
1427*5113495bSYour Name 		pr_err("Invalid device type\n");
1428*5113495bSYour Name 		ret = -EINVAL;
1429*5113495bSYour Name 		break;
1430*5113495bSYour Name 	}
1431*5113495bSYour Name 
1432*5113495bSYour Name 	return ret;
1433*5113495bSYour Name }
1434*5113495bSYour Name 
pld_power_on(struct device * dev)1435*5113495bSYour Name int pld_power_on(struct device *dev)
1436*5113495bSYour Name {
1437*5113495bSYour Name 	int ret = 0;
1438*5113495bSYour Name 
1439*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
1440*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1441*5113495bSYour Name 		/* cnss platform driver handles PCIe SoC
1442*5113495bSYour Name 		 * power on/off sequence so let CNSS driver
1443*5113495bSYour Name 		 * handle the power on sequence for PCIe SoC
1444*5113495bSYour Name 		 */
1445*5113495bSYour Name 		break;
1446*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1447*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1448*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1449*5113495bSYour Name 		break;
1450*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1451*5113495bSYour Name 		ret = pld_snoc_power_on(dev);
1452*5113495bSYour Name 		break;
1453*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1454*5113495bSYour Name 		ret = pld_ipci_power_on(dev);
1455*5113495bSYour Name 		break;
1456*5113495bSYour Name 	default:
1457*5113495bSYour Name 		pr_err("Invalid device type\n");
1458*5113495bSYour Name 		break;
1459*5113495bSYour Name 	}
1460*5113495bSYour Name 
1461*5113495bSYour Name 	return ret;
1462*5113495bSYour Name }
1463*5113495bSYour Name 
pld_power_off(struct device * dev)1464*5113495bSYour Name int pld_power_off(struct device *dev)
1465*5113495bSYour Name {
1466*5113495bSYour Name 	int ret = 0;
1467*5113495bSYour Name 
1468*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
1469*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1470*5113495bSYour Name 		/* cnss platform driver handles PCIe SoC
1471*5113495bSYour Name 		 * power on/off sequence so let CNSS driver
1472*5113495bSYour Name 		 * handle the power off sequence for PCIe SoC
1473*5113495bSYour Name 		 */
1474*5113495bSYour Name 		break;
1475*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1476*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1477*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1478*5113495bSYour Name 		break;
1479*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1480*5113495bSYour Name 		ret = pld_snoc_power_off(dev);
1481*5113495bSYour Name 		break;
1482*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1483*5113495bSYour Name 		ret = pld_ipci_power_off(dev);
1484*5113495bSYour Name 		break;
1485*5113495bSYour Name 	default:
1486*5113495bSYour Name 		pr_err("Invalid device type\n");
1487*5113495bSYour Name 		break;
1488*5113495bSYour Name 	}
1489*5113495bSYour Name 
1490*5113495bSYour Name 	return ret;
1491*5113495bSYour Name }
1492*5113495bSYour Name 
pld_athdiag_read(struct device * dev,uint32_t offset,uint32_t memtype,uint32_t datalen,uint8_t * output)1493*5113495bSYour Name int pld_athdiag_read(struct device *dev, uint32_t offset,
1494*5113495bSYour Name 		     uint32_t memtype, uint32_t datalen,
1495*5113495bSYour Name 		     uint8_t *output)
1496*5113495bSYour Name {
1497*5113495bSYour Name 	int ret = 0;
1498*5113495bSYour Name 
1499*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
1500*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1501*5113495bSYour Name 		ret = pld_snoc_athdiag_read(dev, offset, memtype,
1502*5113495bSYour Name 					    datalen, output);
1503*5113495bSYour Name 		break;
1504*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1505*5113495bSYour Name 		ret = pld_pcie_athdiag_read(dev, offset, memtype,
1506*5113495bSYour Name 					    datalen, output);
1507*5113495bSYour Name 		break;
1508*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1509*5113495bSYour Name 		break;
1510*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
1511*5113495bSYour Name 		ret = pld_usb_athdiag_read(dev, offset, memtype,
1512*5113495bSYour Name 					   datalen, output);
1513*5113495bSYour Name 		break;
1514*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1515*5113495bSYour Name 		ret = pld_ipci_athdiag_read(dev, offset, memtype,
1516*5113495bSYour Name 					    datalen, output);
1517*5113495bSYour Name 		break;
1518*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1519*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1520*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1521*5113495bSYour Name 		break;
1522*5113495bSYour Name 	default:
1523*5113495bSYour Name 		ret = -EINVAL;
1524*5113495bSYour Name 		break;
1525*5113495bSYour Name 	}
1526*5113495bSYour Name 
1527*5113495bSYour Name 	return ret;
1528*5113495bSYour Name }
1529*5113495bSYour Name 
pld_athdiag_write(struct device * dev,uint32_t offset,uint32_t memtype,uint32_t datalen,uint8_t * input)1530*5113495bSYour Name int pld_athdiag_write(struct device *dev, uint32_t offset,
1531*5113495bSYour Name 		      uint32_t memtype, uint32_t datalen,
1532*5113495bSYour Name 		      uint8_t *input)
1533*5113495bSYour Name {
1534*5113495bSYour Name 	int ret = 0;
1535*5113495bSYour Name 
1536*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
1537*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1538*5113495bSYour Name 		ret = pld_snoc_athdiag_write(dev, offset, memtype,
1539*5113495bSYour Name 					     datalen, input);
1540*5113495bSYour Name 		break;
1541*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1542*5113495bSYour Name 		ret = pld_pcie_athdiag_write(dev, offset, memtype,
1543*5113495bSYour Name 					     datalen, input);
1544*5113495bSYour Name 		break;
1545*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1546*5113495bSYour Name 		break;
1547*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
1548*5113495bSYour Name 		ret = pld_usb_athdiag_write(dev, offset, memtype,
1549*5113495bSYour Name 					    datalen, input);
1550*5113495bSYour Name 		break;
1551*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1552*5113495bSYour Name 		ret = pld_ipci_athdiag_write(dev, offset, memtype,
1553*5113495bSYour Name 					     datalen, input);
1554*5113495bSYour Name 		break;
1555*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1556*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1557*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1558*5113495bSYour Name 		break;
1559*5113495bSYour Name 	default:
1560*5113495bSYour Name 		ret = -EINVAL;
1561*5113495bSYour Name 		break;
1562*5113495bSYour Name 	}
1563*5113495bSYour Name 
1564*5113495bSYour Name 	return ret;
1565*5113495bSYour Name }
1566*5113495bSYour Name 
1567*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0))
pld_smmu_get_domain(struct device * dev)1568*5113495bSYour Name void *pld_smmu_get_domain(struct device *dev)
1569*5113495bSYour Name {
1570*5113495bSYour Name 	void *ptr = NULL;
1571*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
1572*5113495bSYour Name 
1573*5113495bSYour Name 	switch (type) {
1574*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1575*5113495bSYour Name 		ptr = pld_snoc_smmu_get_domain(dev);
1576*5113495bSYour Name 		break;
1577*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1578*5113495bSYour Name 		ptr = pld_pcie_smmu_get_domain(dev);
1579*5113495bSYour Name 		break;
1580*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1581*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1582*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1583*5113495bSYour Name 		break;
1584*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1585*5113495bSYour Name 		ptr = pld_ipci_smmu_get_domain(dev);
1586*5113495bSYour Name 		break;
1587*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1588*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
1589*5113495bSYour Name 		pr_err("Not supported on type %d\n", type);
1590*5113495bSYour Name 		break;
1591*5113495bSYour Name 	default:
1592*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
1593*5113495bSYour Name 		break;
1594*5113495bSYour Name 	}
1595*5113495bSYour Name 
1596*5113495bSYour Name 	return ptr;
1597*5113495bSYour Name }
1598*5113495bSYour Name #else
pld_smmu_get_mapping(struct device * dev)1599*5113495bSYour Name void *pld_smmu_get_mapping(struct device *dev)
1600*5113495bSYour Name {
1601*5113495bSYour Name 	void *ptr = NULL;
1602*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
1603*5113495bSYour Name 
1604*5113495bSYour Name 	switch (type) {
1605*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1606*5113495bSYour Name 		ptr = pld_snoc_smmu_get_mapping(dev);
1607*5113495bSYour Name 		break;
1608*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1609*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1610*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1611*5113495bSYour Name 		break;
1612*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1613*5113495bSYour Name 		break;
1614*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1615*5113495bSYour Name 		ptr = pld_pcie_smmu_get_mapping(dev);
1616*5113495bSYour Name 		break;
1617*5113495bSYour Name 	default:
1618*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
1619*5113495bSYour Name 		break;
1620*5113495bSYour Name 	}
1621*5113495bSYour Name 
1622*5113495bSYour Name 	return ptr;
1623*5113495bSYour Name }
1624*5113495bSYour Name #endif
1625*5113495bSYour Name 
1626*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0))
pld_get_wifi_kobj(struct device * dev)1627*5113495bSYour Name struct kobject *pld_get_wifi_kobj(struct device *dev)
1628*5113495bSYour Name {
1629*5113495bSYour Name 	struct kobject *wifi_kobj = NULL;
1630*5113495bSYour Name 
1631*5113495bSYour Name 	wifi_kobj = pld_pcie_get_wifi_kobj(dev);
1632*5113495bSYour Name 
1633*5113495bSYour Name 	return wifi_kobj;
1634*5113495bSYour Name }
1635*5113495bSYour Name #endif
1636*5113495bSYour Name 
pld_smmu_map(struct device * dev,phys_addr_t paddr,uint32_t * iova_addr,size_t size)1637*5113495bSYour Name int pld_smmu_map(struct device *dev, phys_addr_t paddr,
1638*5113495bSYour Name 		 uint32_t *iova_addr, size_t size)
1639*5113495bSYour Name {
1640*5113495bSYour Name 	int ret = 0;
1641*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
1642*5113495bSYour Name 
1643*5113495bSYour Name 	switch (type) {
1644*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1645*5113495bSYour Name 		ret = pld_snoc_smmu_map(dev, paddr, iova_addr, size);
1646*5113495bSYour Name 		break;
1647*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1648*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1649*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1650*5113495bSYour Name 		break;
1651*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1652*5113495bSYour Name 		ret = pld_ipci_smmu_map(dev, paddr, iova_addr, size);
1653*5113495bSYour Name 		break;
1654*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1655*5113495bSYour Name 		ret = pld_pcie_smmu_map(dev, paddr, iova_addr, size);
1656*5113495bSYour Name 		break;
1657*5113495bSYour Name 	default:
1658*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
1659*5113495bSYour Name 		ret = -EINVAL;
1660*5113495bSYour Name 		break;
1661*5113495bSYour Name 	}
1662*5113495bSYour Name 
1663*5113495bSYour Name 	return ret;
1664*5113495bSYour Name }
1665*5113495bSYour Name 
1666*5113495bSYour Name #ifdef CONFIG_SMMU_S1_UNMAP
pld_smmu_unmap(struct device * dev,uint32_t iova_addr,size_t size)1667*5113495bSYour Name int pld_smmu_unmap(struct device *dev,
1668*5113495bSYour Name 		   uint32_t iova_addr, size_t size)
1669*5113495bSYour Name {
1670*5113495bSYour Name 	int ret = 0;
1671*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
1672*5113495bSYour Name 
1673*5113495bSYour Name 	switch (type) {
1674*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1675*5113495bSYour Name 		ret = pld_snoc_smmu_unmap(dev, iova_addr, size);
1676*5113495bSYour Name 		break;
1677*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1678*5113495bSYour Name 		ret = pld_pcie_smmu_unmap(dev, iova_addr, size);
1679*5113495bSYour Name 		break;
1680*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1681*5113495bSYour Name 		ret = pld_ipci_smmu_unmap(dev, iova_addr, size);
1682*5113495bSYour Name 		break;
1683*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1684*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1685*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1686*5113495bSYour Name 		pr_err("Not supported on type %d\n", type);
1687*5113495bSYour Name 		break;
1688*5113495bSYour Name 	default:
1689*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
1690*5113495bSYour Name 		ret = -EINVAL;
1691*5113495bSYour Name 		break;
1692*5113495bSYour Name 	}
1693*5113495bSYour Name 
1694*5113495bSYour Name 	return ret;
1695*5113495bSYour Name }
1696*5113495bSYour Name #endif
1697*5113495bSYour Name 
pld_get_user_msi_assignment(struct device * dev,char * user_name,int * num_vectors,uint32_t * user_base_data,uint32_t * base_vector)1698*5113495bSYour Name int pld_get_user_msi_assignment(struct device *dev, char *user_name,
1699*5113495bSYour Name 				int *num_vectors, uint32_t *user_base_data,
1700*5113495bSYour Name 				uint32_t *base_vector)
1701*5113495bSYour Name {
1702*5113495bSYour Name 	int ret = 0;
1703*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
1704*5113495bSYour Name 
1705*5113495bSYour Name 	switch (type) {
1706*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1707*5113495bSYour Name 		ret = pld_pcie_get_user_msi_assignment(dev, user_name,
1708*5113495bSYour Name 						       num_vectors,
1709*5113495bSYour Name 						       user_base_data,
1710*5113495bSYour Name 						       base_vector);
1711*5113495bSYour Name 		break;
1712*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1713*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1714*5113495bSYour Name 		ret = pld_pcie_fw_sim_get_user_msi_assignment(dev, user_name,
1715*5113495bSYour Name 							      num_vectors,
1716*5113495bSYour Name 							      user_base_data,
1717*5113495bSYour Name 							      base_vector);
1718*5113495bSYour Name 		break;
1719*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1720*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1721*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
1722*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1723*5113495bSYour Name 		pr_err("Not supported on type %d\n", type);
1724*5113495bSYour Name 		ret = -ENODEV;
1725*5113495bSYour Name 		break;
1726*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1727*5113495bSYour Name 		ret = pld_ipci_get_user_msi_assignment(dev, user_name,
1728*5113495bSYour Name 						       num_vectors,
1729*5113495bSYour Name 						       user_base_data,
1730*5113495bSYour Name 						       base_vector);
1731*5113495bSYour Name 		break;
1732*5113495bSYour Name 	default:
1733*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
1734*5113495bSYour Name 		ret = -EINVAL;
1735*5113495bSYour Name 		break;
1736*5113495bSYour Name 	}
1737*5113495bSYour Name 
1738*5113495bSYour Name 	return ret;
1739*5113495bSYour Name }
1740*5113495bSYour Name 
pld_srng_devm_request_irq(struct device * dev,int irq,irq_handler_t handler,unsigned long irqflags,const char * devname,void * dev_data)1741*5113495bSYour Name int pld_srng_devm_request_irq(struct device *dev, int irq,
1742*5113495bSYour Name 			      irq_handler_t handler,
1743*5113495bSYour Name 			      unsigned long irqflags,
1744*5113495bSYour Name 			      const char *devname,
1745*5113495bSYour Name 			      void *dev_data)
1746*5113495bSYour Name {
1747*5113495bSYour Name 	int ret = 0;
1748*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
1749*5113495bSYour Name 
1750*5113495bSYour Name 	switch (type) {
1751*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1752*5113495bSYour Name 		ret = devm_request_irq(dev, irq, handler, irqflags,
1753*5113495bSYour Name 				       devname, dev_data);
1754*5113495bSYour Name 		break;
1755*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1756*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1757*5113495bSYour Name 		ret = pld_pcie_fw_sim_request_irq(dev, irq, handler,
1758*5113495bSYour Name 						  irqflags, devname,
1759*5113495bSYour Name 						  dev_data);
1760*5113495bSYour Name 		break;
1761*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1762*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1763*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
1764*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1765*5113495bSYour Name 		pr_err("Not supported on type %d\n", type);
1766*5113495bSYour Name 		ret = -ENODEV;
1767*5113495bSYour Name 		break;
1768*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1769*5113495bSYour Name 		ret = devm_request_irq(dev, irq, handler, irqflags,
1770*5113495bSYour Name 				       devname, dev_data);
1771*5113495bSYour Name 		break;
1772*5113495bSYour Name 	default:
1773*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
1774*5113495bSYour Name 		ret = -EINVAL;
1775*5113495bSYour Name 		break;
1776*5113495bSYour Name 	}
1777*5113495bSYour Name 
1778*5113495bSYour Name 	return ret;
1779*5113495bSYour Name }
1780*5113495bSYour Name 
pld_srng_request_irq(struct device * dev,int irq,irq_handler_t handler,unsigned long irqflags,const char * devname,void * dev_data)1781*5113495bSYour Name int pld_srng_request_irq(struct device *dev, int irq, irq_handler_t handler,
1782*5113495bSYour Name 			 unsigned long irqflags,
1783*5113495bSYour Name 			 const char *devname,
1784*5113495bSYour Name 			 void *dev_data)
1785*5113495bSYour Name {
1786*5113495bSYour Name 	int ret = 0;
1787*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
1788*5113495bSYour Name 
1789*5113495bSYour Name 	switch (type) {
1790*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1791*5113495bSYour Name 		ret = request_irq(irq, handler, irqflags, devname, dev_data);
1792*5113495bSYour Name 		break;
1793*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1794*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1795*5113495bSYour Name 		ret = pld_pcie_fw_sim_request_irq(dev, irq, handler,
1796*5113495bSYour Name 						  irqflags, devname,
1797*5113495bSYour Name 						  dev_data);
1798*5113495bSYour Name 		break;
1799*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1800*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1801*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
1802*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1803*5113495bSYour Name 		pr_err("Not supported on type %d\n", type);
1804*5113495bSYour Name 		ret = -ENODEV;
1805*5113495bSYour Name 		break;
1806*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1807*5113495bSYour Name 		ret = request_irq(irq, handler, irqflags, devname, dev_data);
1808*5113495bSYour Name 		break;
1809*5113495bSYour Name 	default:
1810*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
1811*5113495bSYour Name 		ret = -EINVAL;
1812*5113495bSYour Name 		break;
1813*5113495bSYour Name 	}
1814*5113495bSYour Name 
1815*5113495bSYour Name 	return ret;
1816*5113495bSYour Name }
1817*5113495bSYour Name 
pld_srng_free_irq(struct device * dev,int irq,void * dev_data)1818*5113495bSYour Name int pld_srng_free_irq(struct device *dev, int irq, void *dev_data)
1819*5113495bSYour Name {
1820*5113495bSYour Name 	int ret = 0;
1821*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
1822*5113495bSYour Name 
1823*5113495bSYour Name 	switch (type) {
1824*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1825*5113495bSYour Name 		free_irq(irq, dev_data);
1826*5113495bSYour Name 		break;
1827*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1828*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1829*5113495bSYour Name 		ret = pld_pcie_fw_sim_free_irq(dev, irq, dev_data);
1830*5113495bSYour Name 		break;
1831*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1832*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1833*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
1834*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1835*5113495bSYour Name 		pr_err("Not supported on type %d\n", type);
1836*5113495bSYour Name 		ret = -ENODEV;
1837*5113495bSYour Name 		break;
1838*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1839*5113495bSYour Name 		free_irq(irq, dev_data);
1840*5113495bSYour Name 		break;
1841*5113495bSYour Name 	default:
1842*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
1843*5113495bSYour Name 		ret = -EINVAL;
1844*5113495bSYour Name 		break;
1845*5113495bSYour Name 	}
1846*5113495bSYour Name 
1847*5113495bSYour Name 	return ret;
1848*5113495bSYour Name }
1849*5113495bSYour Name 
pld_srng_enable_irq(struct device * dev,int irq)1850*5113495bSYour Name void pld_srng_enable_irq(struct device *dev, int irq)
1851*5113495bSYour Name {
1852*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
1853*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1854*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1855*5113495bSYour Name 		break;
1856*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1857*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1858*5113495bSYour Name 		pld_pcie_fw_sim_enable_irq(dev, irq);
1859*5113495bSYour Name 		break;
1860*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1861*5113495bSYour Name 		enable_irq(irq);
1862*5113495bSYour Name 		break;
1863*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1864*5113495bSYour Name 		break;
1865*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1866*5113495bSYour Name 		enable_irq(irq);
1867*5113495bSYour Name 		break;
1868*5113495bSYour Name 	default:
1869*5113495bSYour Name 		pr_err("Invalid device type\n");
1870*5113495bSYour Name 		break;
1871*5113495bSYour Name 	}
1872*5113495bSYour Name }
1873*5113495bSYour Name 
pld_srng_disable_irq(struct device * dev,int irq)1874*5113495bSYour Name void pld_srng_disable_irq(struct device *dev, int irq)
1875*5113495bSYour Name {
1876*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
1877*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1878*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1879*5113495bSYour Name 		break;
1880*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1881*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1882*5113495bSYour Name 		pld_pcie_fw_sim_disable_irq(dev, irq);
1883*5113495bSYour Name 		break;
1884*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1885*5113495bSYour Name 		disable_irq_nosync(irq);
1886*5113495bSYour Name 		break;
1887*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1888*5113495bSYour Name 		break;
1889*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1890*5113495bSYour Name 		disable_irq_nosync(irq);
1891*5113495bSYour Name 		break;
1892*5113495bSYour Name 	default:
1893*5113495bSYour Name 		pr_err("Invalid device type\n");
1894*5113495bSYour Name 		break;
1895*5113495bSYour Name 	}
1896*5113495bSYour Name }
1897*5113495bSYour Name 
pld_srng_disable_irq_sync(struct device * dev,int irq)1898*5113495bSYour Name void pld_srng_disable_irq_sync(struct device *dev, int irq)
1899*5113495bSYour Name {
1900*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
1901*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1902*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1903*5113495bSYour Name 		break;
1904*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1905*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1906*5113495bSYour Name 		pld_pcie_fw_sim_disable_irq(dev, irq);
1907*5113495bSYour Name 		break;
1908*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1909*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1910*5113495bSYour Name 		disable_irq(irq);
1911*5113495bSYour Name 		break;
1912*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1913*5113495bSYour Name 		break;
1914*5113495bSYour Name 	default:
1915*5113495bSYour Name 		pr_err("Invalid device type\n");
1916*5113495bSYour Name 		break;
1917*5113495bSYour Name 	}
1918*5113495bSYour Name }
1919*5113495bSYour Name 
pld_pci_read_config_word(struct pci_dev * pdev,int offset,uint16_t * val)1920*5113495bSYour Name int pld_pci_read_config_word(struct pci_dev *pdev, int offset, uint16_t *val)
1921*5113495bSYour Name {
1922*5113495bSYour Name 	int ret = 0;
1923*5113495bSYour Name 
1924*5113495bSYour Name 	switch (pld_get_bus_type(&pdev->dev)) {
1925*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1926*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1927*5113495bSYour Name 		break;
1928*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1929*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1930*5113495bSYour Name 		ret = pld_pcie_fw_sim_read_config_word(&pdev->dev, offset, val);
1931*5113495bSYour Name 		break;
1932*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1933*5113495bSYour Name 		break;
1934*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1935*5113495bSYour Name 		ret = pci_read_config_word(pdev, offset, val);
1936*5113495bSYour Name 		break;
1937*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1938*5113495bSYour Name 		break;
1939*5113495bSYour Name 	default:
1940*5113495bSYour Name 		pr_err("Invalid device type\n");
1941*5113495bSYour Name 		break;
1942*5113495bSYour Name 	}
1943*5113495bSYour Name 
1944*5113495bSYour Name 	return ret;
1945*5113495bSYour Name }
1946*5113495bSYour Name 
pld_pci_write_config_word(struct pci_dev * pdev,int offset,uint16_t val)1947*5113495bSYour Name int pld_pci_write_config_word(struct pci_dev *pdev, int offset, uint16_t val)
1948*5113495bSYour Name {
1949*5113495bSYour Name 	int ret = 0;
1950*5113495bSYour Name 
1951*5113495bSYour Name 	switch (pld_get_bus_type(&pdev->dev)) {
1952*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1953*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1954*5113495bSYour Name 		break;
1955*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1956*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1957*5113495bSYour Name 		break;
1958*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1959*5113495bSYour Name 		ret = pci_write_config_word(pdev, offset, val);
1960*5113495bSYour Name 		break;
1961*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1962*5113495bSYour Name 		break;
1963*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1964*5113495bSYour Name 		break;
1965*5113495bSYour Name 	default:
1966*5113495bSYour Name 		pr_err("Invalid device type\n");
1967*5113495bSYour Name 		break;
1968*5113495bSYour Name 	}
1969*5113495bSYour Name 
1970*5113495bSYour Name 	return ret;
1971*5113495bSYour Name }
1972*5113495bSYour Name 
pld_pci_read_config_dword(struct pci_dev * pdev,int offset,uint32_t * val)1973*5113495bSYour Name int pld_pci_read_config_dword(struct pci_dev *pdev, int offset, uint32_t *val)
1974*5113495bSYour Name {
1975*5113495bSYour Name 	int ret = 0;
1976*5113495bSYour Name 
1977*5113495bSYour Name 	switch (pld_get_bus_type(&pdev->dev)) {
1978*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
1979*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
1980*5113495bSYour Name 		break;
1981*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
1982*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
1983*5113495bSYour Name 		break;
1984*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
1985*5113495bSYour Name 		ret = pci_read_config_dword(pdev, offset, val);
1986*5113495bSYour Name 		break;
1987*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
1988*5113495bSYour Name 		break;
1989*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
1990*5113495bSYour Name 		break;
1991*5113495bSYour Name 	default:
1992*5113495bSYour Name 		pr_err("Invalid device type\n");
1993*5113495bSYour Name 		break;
1994*5113495bSYour Name 	}
1995*5113495bSYour Name 
1996*5113495bSYour Name 	return ret;
1997*5113495bSYour Name }
1998*5113495bSYour Name 
pld_pci_write_config_dword(struct pci_dev * pdev,int offset,uint32_t val)1999*5113495bSYour Name int pld_pci_write_config_dword(struct pci_dev *pdev, int offset, uint32_t val)
2000*5113495bSYour Name {
2001*5113495bSYour Name 	int ret = 0;
2002*5113495bSYour Name 
2003*5113495bSYour Name 	switch (pld_get_bus_type(&pdev->dev)) {
2004*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2005*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2006*5113495bSYour Name 		break;
2007*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2008*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2009*5113495bSYour Name 		break;
2010*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2011*5113495bSYour Name 		ret = pci_write_config_dword(pdev, offset, val);
2012*5113495bSYour Name 		break;
2013*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2014*5113495bSYour Name 		break;
2015*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2016*5113495bSYour Name 		break;
2017*5113495bSYour Name 	default:
2018*5113495bSYour Name 		pr_err("Invalid device type\n");
2019*5113495bSYour Name 		break;
2020*5113495bSYour Name 	}
2021*5113495bSYour Name 
2022*5113495bSYour Name 	return ret;
2023*5113495bSYour Name }
2024*5113495bSYour Name 
pld_get_msi_irq(struct device * dev,unsigned int vector)2025*5113495bSYour Name int pld_get_msi_irq(struct device *dev, unsigned int vector)
2026*5113495bSYour Name {
2027*5113495bSYour Name 	int ret = 0;
2028*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
2029*5113495bSYour Name 
2030*5113495bSYour Name 	switch (type) {
2031*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2032*5113495bSYour Name 		ret = pld_pcie_get_msi_irq(dev, vector);
2033*5113495bSYour Name 		break;
2034*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2035*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2036*5113495bSYour Name 		ret = pld_pcie_fw_sim_get_msi_irq(dev, vector);
2037*5113495bSYour Name 		break;
2038*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2039*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2040*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
2041*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2042*5113495bSYour Name 		pr_err("Not supported on type %d\n", type);
2043*5113495bSYour Name 		ret = -ENODEV;
2044*5113495bSYour Name 		break;
2045*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2046*5113495bSYour Name 		ret = pld_ipci_get_msi_irq(dev, vector);
2047*5113495bSYour Name 		break;
2048*5113495bSYour Name 	default:
2049*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
2050*5113495bSYour Name 		ret = -EINVAL;
2051*5113495bSYour Name 		break;
2052*5113495bSYour Name 	}
2053*5113495bSYour Name 
2054*5113495bSYour Name 	return ret;
2055*5113495bSYour Name }
2056*5113495bSYour Name 
pld_get_msi_address(struct device * dev,uint32_t * msi_addr_low,uint32_t * msi_addr_high)2057*5113495bSYour Name void pld_get_msi_address(struct device *dev, uint32_t *msi_addr_low,
2058*5113495bSYour Name 			 uint32_t *msi_addr_high)
2059*5113495bSYour Name {
2060*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
2061*5113495bSYour Name 
2062*5113495bSYour Name 	switch (type) {
2063*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2064*5113495bSYour Name 		pld_pcie_get_msi_address(dev, msi_addr_low, msi_addr_high);
2065*5113495bSYour Name 		break;
2066*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2067*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2068*5113495bSYour Name 		pld_pcie_fw_sim_get_msi_address(dev, msi_addr_low,
2069*5113495bSYour Name 						msi_addr_high);
2070*5113495bSYour Name 		break;
2071*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2072*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2073*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
2074*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2075*5113495bSYour Name 		pr_err("Not supported on type %d\n", type);
2076*5113495bSYour Name 		break;
2077*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2078*5113495bSYour Name 		pld_ipci_get_msi_address(dev, msi_addr_low, msi_addr_high);
2079*5113495bSYour Name 		break;
2080*5113495bSYour Name 	default:
2081*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
2082*5113495bSYour Name 		break;
2083*5113495bSYour Name 	}
2084*5113495bSYour Name }
2085*5113495bSYour Name 
pld_is_drv_connected(struct device * dev)2086*5113495bSYour Name int pld_is_drv_connected(struct device *dev)
2087*5113495bSYour Name {
2088*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
2089*5113495bSYour Name 	int ret = 0;
2090*5113495bSYour Name 
2091*5113495bSYour Name 	switch (type) {
2092*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2093*5113495bSYour Name 		ret = pld_pcie_is_drv_connected(dev);
2094*5113495bSYour Name 		break;
2095*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2096*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2097*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2098*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2099*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2100*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
2101*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2102*5113495bSYour Name 		break;
2103*5113495bSYour Name 	default:
2104*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
2105*5113495bSYour Name 		ret = -EINVAL;
2106*5113495bSYour Name 		break;
2107*5113495bSYour Name 	}
2108*5113495bSYour Name 
2109*5113495bSYour Name 	return ret;
2110*5113495bSYour Name }
2111*5113495bSYour Name 
pld_socinfo_get_serial_number(struct device * dev)2112*5113495bSYour Name unsigned int pld_socinfo_get_serial_number(struct device *dev)
2113*5113495bSYour Name {
2114*5113495bSYour Name 	unsigned int ret = 0;
2115*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
2116*5113495bSYour Name 
2117*5113495bSYour Name 	switch (type) {
2118*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2119*5113495bSYour Name 		ret = pld_snoc_socinfo_get_serial_number(dev);
2120*5113495bSYour Name 		break;
2121*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2122*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2123*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2124*5113495bSYour Name 		pr_err("Not supported on type %d\n", type);
2125*5113495bSYour Name 		break;
2126*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2127*5113495bSYour Name 		break;
2128*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2129*5113495bSYour Name 		break;
2130*5113495bSYour Name 	default:
2131*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
2132*5113495bSYour Name 		break;
2133*5113495bSYour Name 	}
2134*5113495bSYour Name 
2135*5113495bSYour Name 	return ret;
2136*5113495bSYour Name }
2137*5113495bSYour Name 
pld_is_qmi_disable(struct device * dev)2138*5113495bSYour Name int pld_is_qmi_disable(struct device *dev)
2139*5113495bSYour Name {
2140*5113495bSYour Name 	int ret = 0;
2141*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
2142*5113495bSYour Name 
2143*5113495bSYour Name 	switch (type) {
2144*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2145*5113495bSYour Name 		ret = pld_snoc_is_qmi_disable(dev);
2146*5113495bSYour Name 		break;
2147*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2148*5113495bSYour Name 		break;
2149*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2150*5113495bSYour Name 		break;
2151*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2152*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2153*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2154*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2155*5113495bSYour Name 		pr_err("Not supported on type %d\n", type);
2156*5113495bSYour Name 		ret = -EINVAL;
2157*5113495bSYour Name 		break;
2158*5113495bSYour Name 	default:
2159*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
2160*5113495bSYour Name 		ret = -EINVAL;
2161*5113495bSYour Name 		break;
2162*5113495bSYour Name 	}
2163*5113495bSYour Name 
2164*5113495bSYour Name 	return ret;
2165*5113495bSYour Name }
2166*5113495bSYour Name 
pld_is_fw_down(struct device * dev)2167*5113495bSYour Name int pld_is_fw_down(struct device *dev)
2168*5113495bSYour Name {
2169*5113495bSYour Name 	int ret = 0;
2170*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
2171*5113495bSYour Name 	struct device *ifdev;
2172*5113495bSYour Name 
2173*5113495bSYour Name 	switch (type) {
2174*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2175*5113495bSYour Name 		ret = pld_snoc_is_fw_down(dev);
2176*5113495bSYour Name 		break;
2177*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2178*5113495bSYour Name 		ret = pld_snoc_fw_sim_is_fw_down(dev);
2179*5113495bSYour Name 		break;
2180*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2181*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2182*5113495bSYour Name 		break;
2183*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2184*5113495bSYour Name 		ret = pld_pcie_is_fw_down(dev);
2185*5113495bSYour Name 		break;
2186*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2187*5113495bSYour Name 		break;
2188*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
2189*5113495bSYour Name 		ifdev = pld_get_if_dev(dev);
2190*5113495bSYour Name 		ret = pld_usb_is_fw_down(ifdev);
2191*5113495bSYour Name 		break;
2192*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2193*5113495bSYour Name 		ret = pld_ipci_is_fw_down(dev);
2194*5113495bSYour Name 		break;
2195*5113495bSYour Name 	default:
2196*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
2197*5113495bSYour Name 		ret = -EINVAL;
2198*5113495bSYour Name 		break;
2199*5113495bSYour Name 	}
2200*5113495bSYour Name 
2201*5113495bSYour Name 	return ret;
2202*5113495bSYour Name }
2203*5113495bSYour Name 
2204*5113495bSYour Name #ifdef CONFIG_ENABLE_LOW_POWER_MODE
pld_is_low_power_mode(struct device * dev)2205*5113495bSYour Name int pld_is_low_power_mode(struct device *dev)
2206*5113495bSYour Name {
2207*5113495bSYour Name 	int ret = 0;
2208*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
2209*5113495bSYour Name 
2210*5113495bSYour Name 	switch (type) {
2211*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2212*5113495bSYour Name 		ret = pld_snoc_is_low_power_mode(dev);
2213*5113495bSYour Name 		break;
2214*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2215*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2216*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2217*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2218*5113495bSYour Name 	default:
2219*5113495bSYour Name 		break;
2220*5113495bSYour Name 	}
2221*5113495bSYour Name 	return ret;
2222*5113495bSYour Name }
2223*5113495bSYour Name #endif
2224*5113495bSYour Name 
pld_force_assert_target(struct device * dev)2225*5113495bSYour Name int pld_force_assert_target(struct device *dev)
2226*5113495bSYour Name {
2227*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
2228*5113495bSYour Name 
2229*5113495bSYour Name 	switch (type) {
2230*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2231*5113495bSYour Name 		return pld_snoc_force_assert_target(dev);
2232*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2233*5113495bSYour Name 		return pld_pcie_force_assert_target(dev);
2234*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2235*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2236*5113495bSYour Name 		return -EOPNOTSUPP;
2237*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2238*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2239*5113495bSYour Name 		return -EINVAL;
2240*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2241*5113495bSYour Name 		return pld_ipci_force_assert_target(dev);
2242*5113495bSYour Name 	default:
2243*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
2244*5113495bSYour Name 		return -EINVAL;
2245*5113495bSYour Name 	}
2246*5113495bSYour Name }
2247*5113495bSYour Name 
pld_force_collect_target_dump(struct device * dev)2248*5113495bSYour Name int pld_force_collect_target_dump(struct device *dev)
2249*5113495bSYour Name {
2250*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
2251*5113495bSYour Name 
2252*5113495bSYour Name 	switch (type) {
2253*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2254*5113495bSYour Name 		return pld_pcie_collect_rddm(dev);
2255*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2256*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2257*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2258*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2259*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2260*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
2261*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2262*5113495bSYour Name 		return -EOPNOTSUPP;
2263*5113495bSYour Name 	default:
2264*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
2265*5113495bSYour Name 		return -EINVAL;
2266*5113495bSYour Name 	}
2267*5113495bSYour Name }
2268*5113495bSYour Name 
pld_qmi_send_get(struct device * dev)2269*5113495bSYour Name int pld_qmi_send_get(struct device *dev)
2270*5113495bSYour Name {
2271*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
2272*5113495bSYour Name 
2273*5113495bSYour Name 	switch (type) {
2274*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2275*5113495bSYour Name 		return pld_pcie_qmi_send_get(dev);
2276*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2277*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2278*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
2279*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2280*5113495bSYour Name 		return 0;
2281*5113495bSYour Name 	default:
2282*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
2283*5113495bSYour Name 		return -EINVAL;
2284*5113495bSYour Name 	}
2285*5113495bSYour Name }
2286*5113495bSYour Name 
pld_qmi_send_put(struct device * dev)2287*5113495bSYour Name int pld_qmi_send_put(struct device *dev)
2288*5113495bSYour Name {
2289*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
2290*5113495bSYour Name 
2291*5113495bSYour Name 	switch (type) {
2292*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2293*5113495bSYour Name 		return pld_pcie_qmi_send_put(dev);
2294*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2295*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2296*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
2297*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2298*5113495bSYour Name 		return 0;
2299*5113495bSYour Name 	default:
2300*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
2301*5113495bSYour Name 		return -EINVAL;
2302*5113495bSYour Name 	}
2303*5113495bSYour Name }
2304*5113495bSYour Name 
pld_qmi_send(struct device * dev,int type,void * cmd,int cmd_len,void * cb_ctx,int (* cb)(void * ctx,void * event,int event_len))2305*5113495bSYour Name int pld_qmi_send(struct device *dev, int type, void *cmd,
2306*5113495bSYour Name 		 int cmd_len, void *cb_ctx,
2307*5113495bSYour Name 		 int (*cb)(void *ctx, void *event, int event_len))
2308*5113495bSYour Name {
2309*5113495bSYour Name 	enum pld_bus_type bus_type = pld_get_bus_type(dev);
2310*5113495bSYour Name 
2311*5113495bSYour Name 	switch (bus_type) {
2312*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2313*5113495bSYour Name 		return pld_pcie_qmi_send(dev, type, cmd, cmd_len, cb_ctx, cb);
2314*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2315*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2316*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
2317*5113495bSYour Name 		return -EINVAL;
2318*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2319*5113495bSYour Name 		return pld_ipci_qmi_send(dev, type, cmd, cmd_len, cb_ctx, cb);
2320*5113495bSYour Name 	default:
2321*5113495bSYour Name 		pr_err("Invalid device type %d\n", bus_type);
2322*5113495bSYour Name 		return -EINVAL;
2323*5113495bSYour Name 	}
2324*5113495bSYour Name }
2325*5113495bSYour Name 
pld_qmi_indication(struct device * dev,void * cb_ctx,int (* cb)(void * ctx,uint16_t type,void * event,int event_len))2326*5113495bSYour Name int pld_qmi_indication(struct device *dev, void *cb_ctx,
2327*5113495bSYour Name 		       int (*cb)(void *ctx, uint16_t type,
2328*5113495bSYour Name 				 void *event, int event_len))
2329*5113495bSYour Name {
2330*5113495bSYour Name 	enum pld_bus_type bus_type = pld_get_bus_type(dev);
2331*5113495bSYour Name 
2332*5113495bSYour Name 	switch (bus_type) {
2333*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2334*5113495bSYour Name 		return pld_pcie_register_qmi_ind(dev, cb_ctx, cb);
2335*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2336*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2337*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
2338*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2339*5113495bSYour Name 		return -EINVAL;
2340*5113495bSYour Name 	default:
2341*5113495bSYour Name 		pr_err("Invalid device type %d\n", bus_type);
2342*5113495bSYour Name 		return -EINVAL;
2343*5113495bSYour Name 	}
2344*5113495bSYour Name }
2345*5113495bSYour Name 
pld_is_fw_dump_skipped(struct device * dev)2346*5113495bSYour Name bool pld_is_fw_dump_skipped(struct device *dev)
2347*5113495bSYour Name {
2348*5113495bSYour Name 	bool ret = false;
2349*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
2350*5113495bSYour Name 
2351*5113495bSYour Name 	switch (type) {
2352*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2353*5113495bSYour Name 		ret = pld_sdio_is_fw_dump_skipped();
2354*5113495bSYour Name 		break;
2355*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2356*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2357*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2358*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2359*5113495bSYour Name 	default:
2360*5113495bSYour Name 		break;
2361*5113495bSYour Name 	}
2362*5113495bSYour Name 	return ret;
2363*5113495bSYour Name }
2364*5113495bSYour Name 
pld_is_pdr(struct device * dev)2365*5113495bSYour Name int pld_is_pdr(struct device *dev)
2366*5113495bSYour Name {
2367*5113495bSYour Name 	int ret = 0;
2368*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
2369*5113495bSYour Name 
2370*5113495bSYour Name 	switch (type) {
2371*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2372*5113495bSYour Name 		ret = pld_snoc_is_pdr();
2373*5113495bSYour Name 		break;
2374*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2375*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2376*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2377*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2378*5113495bSYour Name 	default:
2379*5113495bSYour Name 		break;
2380*5113495bSYour Name 	}
2381*5113495bSYour Name 	return ret;
2382*5113495bSYour Name }
2383*5113495bSYour Name 
pld_is_fw_rejuvenate(struct device * dev)2384*5113495bSYour Name int pld_is_fw_rejuvenate(struct device *dev)
2385*5113495bSYour Name {
2386*5113495bSYour Name 	int ret = 0;
2387*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
2388*5113495bSYour Name 
2389*5113495bSYour Name 	switch (type) {
2390*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2391*5113495bSYour Name 		ret = pld_snoc_is_fw_rejuvenate();
2392*5113495bSYour Name 		break;
2393*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2394*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2395*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2396*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2397*5113495bSYour Name 	default:
2398*5113495bSYour Name 		break;
2399*5113495bSYour Name 	}
2400*5113495bSYour Name 	return ret;
2401*5113495bSYour Name }
2402*5113495bSYour Name 
pld_have_platform_driver_support(struct device * dev)2403*5113495bSYour Name bool pld_have_platform_driver_support(struct device *dev)
2404*5113495bSYour Name {
2405*5113495bSYour Name 	bool ret = false;
2406*5113495bSYour Name 
2407*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
2408*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2409*5113495bSYour Name 		ret = pld_pcie_platform_driver_support();
2410*5113495bSYour Name 		break;
2411*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2412*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2413*5113495bSYour Name 		ret = true;
2414*5113495bSYour Name 		break;
2415*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2416*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2417*5113495bSYour Name 		break;
2418*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2419*5113495bSYour Name 		ret = true;
2420*5113495bSYour Name 		break;
2421*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2422*5113495bSYour Name 		ret = pld_sdio_platform_driver_support();
2423*5113495bSYour Name 		break;
2424*5113495bSYour Name 	default:
2425*5113495bSYour Name 		pr_err("Invalid device type\n");
2426*5113495bSYour Name 		break;
2427*5113495bSYour Name 	}
2428*5113495bSYour Name 
2429*5113495bSYour Name 	return ret;
2430*5113495bSYour Name }
2431*5113495bSYour Name 
pld_idle_shutdown(struct device * dev,int (* shutdown_cb)(struct device * dev))2432*5113495bSYour Name int pld_idle_shutdown(struct device *dev,
2433*5113495bSYour Name 		      int (*shutdown_cb)(struct device *dev))
2434*5113495bSYour Name {
2435*5113495bSYour Name 	int errno = -EINVAL;
2436*5113495bSYour Name 	enum pld_bus_type type;
2437*5113495bSYour Name 
2438*5113495bSYour Name 	if (!shutdown_cb)
2439*5113495bSYour Name 		return -EINVAL;
2440*5113495bSYour Name 
2441*5113495bSYour Name 	type = pld_get_bus_type(dev);
2442*5113495bSYour Name 	switch (type) {
2443*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2444*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
2445*5113495bSYour Name 		errno = shutdown_cb(dev);
2446*5113495bSYour Name 		break;
2447*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2448*5113495bSYour Name 		errno = pld_snoc_idle_shutdown(dev);
2449*5113495bSYour Name 		break;
2450*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2451*5113495bSYour Name 		errno = pld_pcie_idle_shutdown(dev);
2452*5113495bSYour Name 		break;
2453*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2454*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2455*5113495bSYour Name 		errno = pld_pcie_fw_sim_idle_shutdown(dev);
2456*5113495bSYour Name 		break;
2457*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2458*5113495bSYour Name 		errno = pld_snoc_fw_sim_idle_shutdown(dev);
2459*5113495bSYour Name 		break;
2460*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2461*5113495bSYour Name 		errno = pld_ipci_idle_shutdown(dev);
2462*5113495bSYour Name 		break;
2463*5113495bSYour Name 	default:
2464*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
2465*5113495bSYour Name 		break;
2466*5113495bSYour Name 	}
2467*5113495bSYour Name 
2468*5113495bSYour Name 	return errno;
2469*5113495bSYour Name }
2470*5113495bSYour Name 
pld_idle_restart(struct device * dev,int (* restart_cb)(struct device * dev))2471*5113495bSYour Name int pld_idle_restart(struct device *dev,
2472*5113495bSYour Name 		     int (*restart_cb)(struct device *dev))
2473*5113495bSYour Name {
2474*5113495bSYour Name 	int errno = -EINVAL;
2475*5113495bSYour Name 	enum pld_bus_type type;
2476*5113495bSYour Name 
2477*5113495bSYour Name 	if (!restart_cb)
2478*5113495bSYour Name 		return -EINVAL;
2479*5113495bSYour Name 
2480*5113495bSYour Name 	type = pld_get_bus_type(dev);
2481*5113495bSYour Name 	switch (type) {
2482*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2483*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
2484*5113495bSYour Name 		errno = restart_cb(dev);
2485*5113495bSYour Name 		break;
2486*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2487*5113495bSYour Name 		errno = pld_snoc_idle_restart(dev);
2488*5113495bSYour Name 		break;
2489*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2490*5113495bSYour Name 		errno = pld_pcie_idle_restart(dev);
2491*5113495bSYour Name 		break;
2492*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2493*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2494*5113495bSYour Name 		errno = pld_pcie_fw_sim_idle_restart(dev);
2495*5113495bSYour Name 		break;
2496*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2497*5113495bSYour Name 		errno = pld_snoc_fw_sim_idle_restart(dev);
2498*5113495bSYour Name 		break;
2499*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2500*5113495bSYour Name 		errno = pld_ipci_idle_restart(dev);
2501*5113495bSYour Name 		break;
2502*5113495bSYour Name 	default:
2503*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
2504*5113495bSYour Name 		break;
2505*5113495bSYour Name 	}
2506*5113495bSYour Name 
2507*5113495bSYour Name 	return errno;
2508*5113495bSYour Name }
2509*5113495bSYour Name 
pld_thermal_register(struct device * dev,unsigned long max_state,int mon_id)2510*5113495bSYour Name int pld_thermal_register(struct device *dev,
2511*5113495bSYour Name 			 unsigned long max_state, int mon_id)
2512*5113495bSYour Name {
2513*5113495bSYour Name 	int errno = -EINVAL;
2514*5113495bSYour Name 	enum pld_bus_type type;
2515*5113495bSYour Name 
2516*5113495bSYour Name 	type = pld_get_bus_type(dev);
2517*5113495bSYour Name 	switch (type) {
2518*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2519*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
2520*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2521*5113495bSYour Name 		break;
2522*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2523*5113495bSYour Name 		errno = pld_pci_thermal_register(dev, max_state, mon_id);
2524*5113495bSYour Name 		break;
2525*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2526*5113495bSYour Name 		break;
2527*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2528*5113495bSYour Name 		errno = pld_pcie_fw_sim_thermal_register(dev, max_state,
2529*5113495bSYour Name 							 mon_id);
2530*5113495bSYour Name 		break;
2531*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2532*5113495bSYour Name 		break;
2533*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2534*5113495bSYour Name 		errno = pld_ipci_thermal_register(dev, max_state, mon_id);
2535*5113495bSYour Name 		break;
2536*5113495bSYour Name 	default:
2537*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
2538*5113495bSYour Name 		break;
2539*5113495bSYour Name 	}
2540*5113495bSYour Name 
2541*5113495bSYour Name 	return errno;
2542*5113495bSYour Name }
2543*5113495bSYour Name 
pld_thermal_unregister(struct device * dev,int mon_id)2544*5113495bSYour Name void pld_thermal_unregister(struct device *dev, int mon_id)
2545*5113495bSYour Name {
2546*5113495bSYour Name 	enum pld_bus_type type;
2547*5113495bSYour Name 
2548*5113495bSYour Name 	type = pld_get_bus_type(dev);
2549*5113495bSYour Name 	switch (type) {
2550*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2551*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
2552*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2553*5113495bSYour Name 		break;
2554*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2555*5113495bSYour Name 		pld_pci_thermal_unregister(dev, mon_id);
2556*5113495bSYour Name 		break;
2557*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2558*5113495bSYour Name 		break;
2559*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2560*5113495bSYour Name 		pld_pcie_fw_sim_thermal_unregister(dev, mon_id);
2561*5113495bSYour Name 		break;
2562*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2563*5113495bSYour Name 		break;
2564*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2565*5113495bSYour Name 		pld_ipci_thermal_unregister(dev, mon_id);
2566*5113495bSYour Name 		break;
2567*5113495bSYour Name 	default:
2568*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
2569*5113495bSYour Name 		break;
2570*5113495bSYour Name 	}
2571*5113495bSYour Name }
2572*5113495bSYour Name 
pld_set_wfc_mode(struct device * dev,enum pld_wfc_mode wfc_mode)2573*5113495bSYour Name int pld_set_wfc_mode(struct device *dev, enum pld_wfc_mode wfc_mode)
2574*5113495bSYour Name {
2575*5113495bSYour Name 	int errno = -ENOTSUPP;
2576*5113495bSYour Name 	enum pld_bus_type type;
2577*5113495bSYour Name 
2578*5113495bSYour Name 	type = pld_get_bus_type(dev);
2579*5113495bSYour Name 	switch (type) {
2580*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2581*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
2582*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2583*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2584*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2585*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2586*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2587*5113495bSYour Name 		break;
2588*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2589*5113495bSYour Name 		errno = pld_pcie_set_wfc_mode(dev, wfc_mode);
2590*5113495bSYour Name 		break;
2591*5113495bSYour Name 	default:
2592*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
2593*5113495bSYour Name 		break;
2594*5113495bSYour Name 	}
2595*5113495bSYour Name 
2596*5113495bSYour Name 	return errno;
2597*5113495bSYour Name }
pld_bus_width_type_to_str(enum pld_bus_width_type level)2598*5113495bSYour Name const char *pld_bus_width_type_to_str(enum pld_bus_width_type level)
2599*5113495bSYour Name {
2600*5113495bSYour Name 	switch (level) {
2601*5113495bSYour Name 	/* initialize the wlan sub system */
2602*5113495bSYour Name 	case PLD_BUS_WIDTH_NONE:
2603*5113495bSYour Name 		return "NONE";
2604*5113495bSYour Name 	case PLD_BUS_WIDTH_IDLE:
2605*5113495bSYour Name 		return "IDLE";
2606*5113495bSYour Name 	case PLD_BUS_WIDTH_LOW:
2607*5113495bSYour Name 		return "LOW";
2608*5113495bSYour Name 	case PLD_BUS_WIDTH_MEDIUM:
2609*5113495bSYour Name 		return "MEDIUM";
2610*5113495bSYour Name 	case PLD_BUS_WIDTH_HIGH:
2611*5113495bSYour Name 		return "HIGH";
2612*5113495bSYour Name 	case PLD_BUS_WIDTH_MID_HIGH:
2613*5113495bSYour Name 		return "MID_HIGH";
2614*5113495bSYour Name 	case PLD_BUS_WIDTH_VERY_HIGH:
2615*5113495bSYour Name 		return "VERY_HIGH";
2616*5113495bSYour Name 	case PLD_BUS_WIDTH_ULTRA_HIGH:
2617*5113495bSYour Name 		return "ULTRA_HIGH";
2618*5113495bSYour Name 	case PLD_BUS_WIDTH_LOW_LATENCY:
2619*5113495bSYour Name 		return "LOW_LAT";
2620*5113495bSYour Name 	default:
2621*5113495bSYour Name 		if (level > PLD_BUS_WIDTH_ULTRA_HIGH)
2622*5113495bSYour Name 			return "SUPER_HIGH";
2623*5113495bSYour Name 		else
2624*5113495bSYour Name 			return "INVAL";
2625*5113495bSYour Name 	}
2626*5113495bSYour Name }
2627*5113495bSYour Name 
pld_get_thermal_state(struct device * dev,unsigned long * thermal_state,int mon_id)2628*5113495bSYour Name int pld_get_thermal_state(struct device *dev, unsigned long *thermal_state,
2629*5113495bSYour Name 			  int mon_id)
2630*5113495bSYour Name {
2631*5113495bSYour Name 	int errno = -EINVAL;
2632*5113495bSYour Name 	enum pld_bus_type type;
2633*5113495bSYour Name 
2634*5113495bSYour Name 	type = pld_get_bus_type(dev);
2635*5113495bSYour Name 	switch (type) {
2636*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2637*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
2638*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2639*5113495bSYour Name 		break;
2640*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2641*5113495bSYour Name 		errno = pld_pci_get_thermal_state(dev, thermal_state, mon_id);
2642*5113495bSYour Name 		break;
2643*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2644*5113495bSYour Name 		break;
2645*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2646*5113495bSYour Name 		errno = pld_pcie_fw_sim_get_thermal_state(dev, thermal_state,
2647*5113495bSYour Name 							  mon_id);
2648*5113495bSYour Name 		break;
2649*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2650*5113495bSYour Name 		break;
2651*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2652*5113495bSYour Name 		errno = pld_ipci_get_thermal_state(dev, thermal_state, mon_id);
2653*5113495bSYour Name 		break;
2654*5113495bSYour Name 	default:
2655*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
2656*5113495bSYour Name 		break;
2657*5113495bSYour Name 	}
2658*5113495bSYour Name 
2659*5113495bSYour Name 	return errno;
2660*5113495bSYour Name }
2661*5113495bSYour Name 
2662*5113495bSYour Name #ifdef CNSS_UTILS_VENDOR_UNSAFE_CHAN_API_SUPPORT
pld_get_wlan_unsafe_channel_sap(struct device * dev,struct pld_ch_avoid_ind_type * ch_avoid_ranges)2663*5113495bSYour Name int pld_get_wlan_unsafe_channel_sap(
2664*5113495bSYour Name 	struct device *dev, struct pld_ch_avoid_ind_type *ch_avoid_ranges)
2665*5113495bSYour Name {
2666*5113495bSYour Name 	struct cnss_ch_avoid_ind_type cnss_ch_avoid;
2667*5113495bSYour Name 	int ret;
2668*5113495bSYour Name 	int i;
2669*5113495bSYour Name 
2670*5113495bSYour Name 	if (!ch_avoid_ranges)
2671*5113495bSYour Name 		return -EINVAL;
2672*5113495bSYour Name 	cnss_ch_avoid.ch_avoid_range_cnt = 0;
2673*5113495bSYour Name 	ret = cnss_utils_get_wlan_unsafe_channel_sap(dev, &cnss_ch_avoid);
2674*5113495bSYour Name 	if (ret)
2675*5113495bSYour Name 		return ret;
2676*5113495bSYour Name 
2677*5113495bSYour Name 	for (i = 0;
2678*5113495bSYour Name 	     i < PLD_CH_AVOID_MAX_RANGE &&
2679*5113495bSYour Name 	     i < cnss_ch_avoid.ch_avoid_range_cnt; i++) {
2680*5113495bSYour Name 		ch_avoid_ranges->avoid_freq_range[i].start_freq =
2681*5113495bSYour Name 			cnss_ch_avoid.avoid_freq_range[i].start_freq;
2682*5113495bSYour Name 		ch_avoid_ranges->avoid_freq_range[i].end_freq =
2683*5113495bSYour Name 			cnss_ch_avoid.avoid_freq_range[i].end_freq;
2684*5113495bSYour Name 	}
2685*5113495bSYour Name 	ch_avoid_ranges->ch_avoid_range_cnt = i;
2686*5113495bSYour Name 	if (i < cnss_ch_avoid.ch_avoid_range_cnt)
2687*5113495bSYour Name 		pr_err("unexpected cnss ch_avoid_range_cnt %d",
2688*5113495bSYour Name 		       cnss_ch_avoid.ch_avoid_range_cnt);
2689*5113495bSYour Name 
2690*5113495bSYour Name 	return 0;
2691*5113495bSYour Name }
2692*5113495bSYour Name #endif
2693*5113495bSYour Name 
pld_set_tsf_sync_period(struct device * dev,u32 val)2694*5113495bSYour Name void pld_set_tsf_sync_period(struct device *dev, u32 val)
2695*5113495bSYour Name {
2696*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
2697*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2698*5113495bSYour Name 		pld_pcie_set_tsf_sync_period(dev, val);
2699*5113495bSYour Name 		break;
2700*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2701*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2702*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2703*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2704*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2705*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2706*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
2707*5113495bSYour Name 		break;
2708*5113495bSYour Name 	default:
2709*5113495bSYour Name 		pr_err("Invalid device type\n");
2710*5113495bSYour Name 		break;
2711*5113495bSYour Name 	}
2712*5113495bSYour Name }
2713*5113495bSYour Name 
pld_reset_tsf_sync_period(struct device * dev)2714*5113495bSYour Name void pld_reset_tsf_sync_period(struct device *dev)
2715*5113495bSYour Name {
2716*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
2717*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2718*5113495bSYour Name 		pld_pcie_reset_tsf_sync_period(dev);
2719*5113495bSYour Name 		break;
2720*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2721*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2722*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2723*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2724*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2725*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2726*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
2727*5113495bSYour Name 		break;
2728*5113495bSYour Name 	default:
2729*5113495bSYour Name 		pr_err("Invalid device type\n");
2730*5113495bSYour Name 		break;
2731*5113495bSYour Name 	}
2732*5113495bSYour Name }
2733*5113495bSYour Name 
2734*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0))
pld_is_ipa_offload_disabled(struct device * dev)2735*5113495bSYour Name int pld_is_ipa_offload_disabled(struct device *dev)
2736*5113495bSYour Name {
2737*5113495bSYour Name 	unsigned long dev_cfg = 0;
2738*5113495bSYour Name 
2739*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
2740*5113495bSYour Name 
2741*5113495bSYour Name 	switch (type) {
2742*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2743*5113495bSYour Name 		dev_cfg = pld_snoc_get_device_config();
2744*5113495bSYour Name 		break;
2745*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2746*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2747*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2748*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
2749*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2750*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2751*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2752*5113495bSYour Name 		pr_err("Not supported on type %d\n", type);
2753*5113495bSYour Name 		break;
2754*5113495bSYour Name 	default:
2755*5113495bSYour Name 		pr_err("Invalid device type %d\n", type);
2756*5113495bSYour Name 		break;
2757*5113495bSYour Name 	}
2758*5113495bSYour Name 
2759*5113495bSYour Name 	return test_bit(PLD_IPA_DISABLED, &dev_cfg);
2760*5113495bSYour Name }
2761*5113495bSYour Name #endif
2762*5113495bSYour Name 
2763*5113495bSYour Name #ifdef FEATURE_WLAN_TIME_SYNC_FTM
pld_get_audio_wlan_timestamp(struct device * dev,enum pld_wlan_time_sync_trigger_type type,uint64_t * ts)2764*5113495bSYour Name int pld_get_audio_wlan_timestamp(struct device *dev,
2765*5113495bSYour Name 				 enum pld_wlan_time_sync_trigger_type type,
2766*5113495bSYour Name 				 uint64_t *ts)
2767*5113495bSYour Name {
2768*5113495bSYour Name 	int ret = 0;
2769*5113495bSYour Name 	enum pld_bus_type bus_type;
2770*5113495bSYour Name 
2771*5113495bSYour Name 	bus_type = pld_get_bus_type(dev);
2772*5113495bSYour Name 	switch (bus_type) {
2773*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC:
2774*5113495bSYour Name 		ret = pld_snoc_get_audio_wlan_timestamp(dev, type, ts);
2775*5113495bSYour Name 		break;
2776*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2777*5113495bSYour Name 	case PLD_BUS_TYPE_SNOC_FW_SIM:
2778*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE_FW_SIM:
2779*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI_FW_SIM:
2780*5113495bSYour Name 	case PLD_BUS_TYPE_SDIO:
2781*5113495bSYour Name 	case PLD_BUS_TYPE_USB:
2782*5113495bSYour Name 	case PLD_BUS_TYPE_IPCI:
2783*5113495bSYour Name 		break;
2784*5113495bSYour Name 	default:
2785*5113495bSYour Name 		ret = -EINVAL;
2786*5113495bSYour Name 		break;
2787*5113495bSYour Name 	}
2788*5113495bSYour Name 	return ret;
2789*5113495bSYour Name }
2790*5113495bSYour Name #endif /* FEATURE_WLAN_TIME_SYNC_FTM */
2791*5113495bSYour Name 
pld_is_one_msi(struct device * dev)2792*5113495bSYour Name bool pld_is_one_msi(struct device *dev)
2793*5113495bSYour Name {
2794*5113495bSYour Name 	bool ret = false;
2795*5113495bSYour Name 	enum pld_bus_type type = pld_get_bus_type(dev);
2796*5113495bSYour Name 
2797*5113495bSYour Name 	switch (type) {
2798*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2799*5113495bSYour Name 		ret = pld_pcie_is_one_msi(dev);
2800*5113495bSYour Name 		break;
2801*5113495bSYour Name 	default:
2802*5113495bSYour Name 		break;
2803*5113495bSYour Name 	}
2804*5113495bSYour Name 
2805*5113495bSYour Name 	return ret;
2806*5113495bSYour Name }
2807*5113495bSYour Name 
2808*5113495bSYour Name #ifdef CONFIG_AFC_SUPPORT
pld_send_buffer_to_afcmem(struct device * dev,const uint8_t * afcdb,uint32_t len,uint8_t slotid)2809*5113495bSYour Name int pld_send_buffer_to_afcmem(struct device *dev, const uint8_t *afcdb,
2810*5113495bSYour Name 			      uint32_t len, uint8_t slotid)
2811*5113495bSYour Name {
2812*5113495bSYour Name 	return cnss_send_buffer_to_afcmem(dev, afcdb, len, slotid);
2813*5113495bSYour Name }
2814*5113495bSYour Name 
pld_reset_afcmem(struct device * dev,uint8_t slotid)2815*5113495bSYour Name int pld_reset_afcmem(struct device *dev, uint8_t slotid)
2816*5113495bSYour Name {
2817*5113495bSYour Name 	return cnss_reset_afcmem(dev, slotid);
2818*5113495bSYour Name }
2819*5113495bSYour Name #endif
2820*5113495bSYour Name 
2821*5113495bSYour Name #ifdef FEATURE_DIRECT_LINK
pld_audio_smmu_map(struct device * dev,phys_addr_t paddr,dma_addr_t iova,size_t size)2822*5113495bSYour Name int pld_audio_smmu_map(struct device *dev, phys_addr_t paddr, dma_addr_t iova,
2823*5113495bSYour Name 		       size_t size)
2824*5113495bSYour Name {
2825*5113495bSYour Name 	int ret;
2826*5113495bSYour Name 
2827*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
2828*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2829*5113495bSYour Name 		ret = pld_pcie_audio_smmu_map(dev, paddr, iova, size);
2830*5113495bSYour Name 		break;
2831*5113495bSYour Name 	default:
2832*5113495bSYour Name 		ret = -EINVAL;
2833*5113495bSYour Name 		break;
2834*5113495bSYour Name 	}
2835*5113495bSYour Name 
2836*5113495bSYour Name 	return ret;
2837*5113495bSYour Name }
2838*5113495bSYour Name 
pld_audio_smmu_unmap(struct device * dev,dma_addr_t iova,size_t size)2839*5113495bSYour Name void pld_audio_smmu_unmap(struct device *dev, dma_addr_t iova, size_t size)
2840*5113495bSYour Name {
2841*5113495bSYour Name 	switch (pld_get_bus_type(dev)) {
2842*5113495bSYour Name 	case PLD_BUS_TYPE_PCIE:
2843*5113495bSYour Name 		pld_pcie_audio_smmu_unmap(dev, iova, size);
2844*5113495bSYour Name 		break;
2845*5113495bSYour Name 	default:
2846*5113495bSYour Name 		break;
2847*5113495bSYour Name 	}
2848*5113495bSYour Name }
2849*5113495bSYour Name #endif
2850