blob: 098596fe1e007fb29790b138161ca88e8209f36f [file] [log] [blame]
Kai Liu4cf21392017-12-15 21:14:08 +08001/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#define pr_fmt(fmt) "cnss_sdio:%s:%d:: " fmt, __func__, __LINE__
14
15#include <linux/kernel.h>
16#include <linux/module.h>
17#include <linux/init.h>
18#include <linux/of.h>
19#include <linux/platform_device.h>
20#include <linux/regulator/consumer.h>
21#include <linux/delay.h>
22#include <linux/err.h>
23#include <linux/slab.h>
24#include <linux/mmc/sdio_func.h>
25#include <linux/mmc/sdio_ids.h>
26#include <linux/mmc/card.h>
27#include <linux/mmc/host.h>
28#include <linux/io.h>
29#include <soc/qcom/subsystem_restart.h>
30#include <soc/qcom/subsystem_notif.h>
31#include <soc/qcom/ramdump.h>
32#include <soc/qcom/memory_dump.h>
33#include <net/cnss.h>
34#include "cnss_common.h"
35#include <linux/pm_qos.h>
36#include <linux/msm-bus.h>
37#include <linux/msm-bus-board.h>
38#include <linux/gpio.h>
39#include <linux/of_gpio.h>
40
41#define WLAN_VREG_NAME "vdd-wlan"
42#define WLAN_VREG_DSRC_NAME "vdd-wlan-dsrc"
43#define WLAN_VREG_IO_NAME "vdd-wlan-io"
44#define WLAN_VREG_XTAL_NAME "vdd-wlan-xtal"
45#define WLAN_GPIO_CAPTSF_NAME "qcom,cap-tsf-gpio"
46
47#define WLAN_VREG_IO_MAX 1800000
48#define WLAN_VREG_IO_MIN 1800000
49#define WLAN_VREG_XTAL_MAX 1800000
50#define WLAN_VREG_XTAL_MIN 1800000
51#define POWER_ON_DELAY 4
52
53/* Values for Dynamic Ramdump Collection*/
54#define CNSS_DUMP_FORMAT_VER 0x11
55#define CNSS_DUMP_MAGIC_VER_V2 0x42445953
56#define CNSS_DUMP_NAME "CNSS_WLAN_SDIO"
57#define CNSS_PINCTRL_SLEEP_STATE "sleep"
58#define CNSS_PINCTRL_ACTIVE_STATE "active"
59
60#define CNSS_HW_SLEEP 0
61#define CNSS_HW_ACTIVE 1
62
63struct cnss_sdio_regulator {
64 struct regulator *wlan_io;
65 struct regulator *wlan_xtal;
66 struct regulator *wlan_vreg;
67 struct regulator *wlan_vreg_dsrc;
68};
69
70struct cnss_sdio_info {
71 struct cnss_sdio_wlan_driver *wdrv;
72 struct sdio_func *func;
73 struct mmc_card *card;
74 struct mmc_host *host;
75 struct device *dev;
76 const struct sdio_device_id *id;
77 bool skip_wlan_en_toggle;
78 bool cnss_hw_state;
79 struct cnss_cap_tsf_info cap_tsf_info;
80};
81
82struct cnss_ssr_info {
83 struct subsys_device *subsys;
84 struct subsys_desc subsysdesc;
85 void *subsys_handle;
86 struct ramdump_device *ramdump_dev;
87 unsigned long ramdump_size;
88 void *ramdump_addr;
89 phys_addr_t ramdump_phys;
90 struct msm_dump_data dump_data;
91 bool ramdump_dynamic;
92 char subsys_name[10];
93};
94
95struct cnss_wlan_pinctrl_info {
96 bool is_antenna_shared;
97 struct pinctrl *pinctrl;
98 struct pinctrl_state *sleep;
99 struct pinctrl_state *active;
100};
101
102struct cnss_sdio_bus_bandwidth {
103 struct msm_bus_scale_pdata *bus_scale_table;
104 u32 bus_client;
105 int current_bandwidth_vote;
106};
107
108static struct cnss_sdio_data {
109 struct cnss_sdio_regulator regulator;
110 struct platform_device *pdev;
111 struct cnss_sdio_info cnss_sdio_info;
112 struct cnss_ssr_info ssr_info;
113 struct pm_qos_request qos_request;
114 struct cnss_wlan_pinctrl_info pinctrl_info;
115 struct cnss_sdio_bus_bandwidth bus_bandwidth;
116 struct cnss_dev_platform_ops platform_ops;
117} *cnss_pdata;
118
119#define WLAN_RECOVERY_DELAY 1
120/* cnss sdio subsytem device name, required property */
121#define CNSS_SUBSYS_NAME_KEY "subsys-name"
122
123/* SDIO manufacturer ID and Codes */
124#define MANUFACTURER_ID_AR6320_BASE 0x500
125#define MANUFACTURER_ID_QCA9377_BASE 0x700
gaolez98d40932018-04-23 18:25:12 +0800126#define MANUFACTURER_ID_QCA9379_BASE 0x800
Kai Liu4cf21392017-12-15 21:14:08 +0800127#define MANUFACTURER_CODE 0x271
128
129static const struct sdio_device_id ar6k_id_table[] = {
130 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x0))},
131 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x1))},
132 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x2))},
133 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x3))},
134 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x4))},
135 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x5))},
136 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x6))},
137 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x7))},
138 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x8))},
139 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0x9))},
140 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0xA))},
141 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0xB))},
142 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0xC))},
143 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0xD))},
144 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0xE))},
145 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6320_BASE | 0xF))},
146 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0x0))},
147 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0x1))},
148 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0x2))},
149 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0x3))},
150 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0x4))},
151 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0x5))},
152 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0x6))},
153 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0x7))},
154 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0x8))},
155 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0x9))},
156 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0xA))},
157 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0xB))},
158 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0xC))},
159 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0xD))},
160 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0xE))},
161 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9377_BASE | 0xF))},
gaolez98d40932018-04-23 18:25:12 +0800162 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9379_BASE | 0x0))},
163 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9379_BASE | 0x1))},
164 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9379_BASE | 0x2))},
165 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9379_BASE | 0x3))},
166 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9379_BASE | 0x4))},
167 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9379_BASE | 0x5))},
168 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9379_BASE | 0x6))},
169 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9379_BASE | 0x7))},
170 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9379_BASE | 0x8))},
171 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9379_BASE | 0x9))},
172 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9379_BASE | 0xA))},
173 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9379_BASE | 0xB))},
174 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9379_BASE | 0xC))},
175 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9379_BASE | 0xD))},
176 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9379_BASE | 0xE))},
177 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_QCA9379_BASE | 0xF))},
Kai Liu4cf21392017-12-15 21:14:08 +0800178 {},
179};
180MODULE_DEVICE_TABLE(sdio, ar6k_id_table);
181
182void cnss_sdio_request_pm_qos_type(int latency_type, u32 qos_val)
183{
184 if (!cnss_pdata)
185 return;
186
187 pr_debug("PM QoS value: %d\n", qos_val);
188 pm_qos_add_request(&cnss_pdata->qos_request, latency_type, qos_val);
189}
190EXPORT_SYMBOL(cnss_sdio_request_pm_qos_type);
191
192int cnss_sdio_request_bus_bandwidth(int bandwidth)
193{
194 int ret;
195 struct cnss_sdio_bus_bandwidth *bus_bandwidth;
196
197 if (!cnss_pdata)
198 return -ENODEV;
199
200 bus_bandwidth = &cnss_pdata->bus_bandwidth;
201 if (!bus_bandwidth->bus_client)
202 return -EINVAL;
203
204 switch (bandwidth) {
205 case CNSS_BUS_WIDTH_NONE:
206 case CNSS_BUS_WIDTH_LOW:
207 case CNSS_BUS_WIDTH_MEDIUM:
208 case CNSS_BUS_WIDTH_HIGH:
209 ret = msm_bus_scale_client_update_request(
210 bus_bandwidth->bus_client, bandwidth);
211 if (!ret) {
212 bus_bandwidth->current_bandwidth_vote = bandwidth;
213 } else {
214 pr_debug(
215 "could not set bus bandwidth %d, ret = %d\n",
216 bandwidth, ret);
217 }
218 break;
219 default:
220 pr_debug("Invalid request %d\n", bandwidth);
221 ret = -EINVAL;
222 }
223
224 return ret;
225}
226
227void cnss_sdio_request_pm_qos(u32 qos_val)
228{
229 if (!cnss_pdata)
230 return;
231
232 pr_debug("PM QoS value: %d\n", qos_val);
233 pm_qos_add_request(
234 &cnss_pdata->qos_request,
235 PM_QOS_CPU_DMA_LATENCY, qos_val);
236}
237EXPORT_SYMBOL(cnss_sdio_request_pm_qos);
238
239void cnss_sdio_remove_pm_qos(void)
240{
241 if (!cnss_pdata)
242 return;
243
244 pm_qos_remove_request(&cnss_pdata->qos_request);
245 pr_debug("PM QoS removed\n");
246}
247EXPORT_SYMBOL(cnss_sdio_remove_pm_qos);
248
249static int cnss_put_hw_resources(struct device *dev)
250{
251 int ret = -EINVAL;
252 struct cnss_sdio_info *info;
253 struct mmc_host *host;
254
255 if (!cnss_pdata)
256 return ret;
257
258 info = &cnss_pdata->cnss_sdio_info;
259
260 if (info->skip_wlan_en_toggle) {
261 pr_debug("HW doesn't support wlan toggling\n");
262 return 0;
263 }
264
265 if (info->cnss_hw_state == CNSS_HW_SLEEP) {
266 pr_debug("HW resources are already released\n");
267 return 0;
268 }
269
270 host = info->host;
271
272 if (!host) {
273 pr_err("MMC host is invalid\n");
274 return ret;
275 }
276
277 if (!cnss_pdata->regulator.wlan_vreg) {
278 pr_debug("wlan_vreg regulator is invalid\n");
279 return 0;
280 }
281
282 ret = mmc_power_save_host(host);
283 if (ret) {
284 pr_err("Failed to Power Save Host err:%d\n",
285 ret);
286 return ret;
287 }
288
289 regulator_disable(cnss_pdata->regulator.wlan_vreg);
290 info->cnss_hw_state = CNSS_HW_SLEEP;
291
292 return ret;
293}
294
295static int cnss_get_hw_resources(struct device *dev)
296{
297 int ret = -EINVAL;
298 struct mmc_host *host;
299 struct cnss_sdio_info *info;
300
301 if (!cnss_pdata)
302 return ret;
303
304 info = &cnss_pdata->cnss_sdio_info;
305
306 if (info->skip_wlan_en_toggle) {
307 pr_debug("HW doesn't support wlan toggling\n");
308 return 0;
309 }
310
311 if (info->cnss_hw_state == CNSS_HW_ACTIVE) {
312 pr_debug("HW resources are already active\n");
313 return 0;
314 }
315
316 host = info->host;
317
318 if (!host) {
319 pr_err("MMC Host is Invalid; Enumeration Failed\n");
320 return ret;
321 }
322
323 if (!cnss_pdata->regulator.wlan_vreg) {
324 pr_debug("wlan_vreg regulator is invalid\n");
325 return 0;
326 }
327
328 ret = regulator_enable(cnss_pdata->regulator.wlan_vreg);
329 if (ret) {
330 pr_err("Failed to enable wlan vreg\n");
331 return ret;
332 }
333
334 ret = mmc_power_restore_host(host);
335 if (ret) {
336 pr_err("Failed to restore host power ret:%d\n",
337 ret);
338 regulator_disable(cnss_pdata->regulator.wlan_vreg);
339 return ret;
340 }
341
342 info->cnss_hw_state = CNSS_HW_ACTIVE;
343 return ret;
344}
345
346static int cnss_sdio_shutdown(const struct subsys_desc *subsys, bool force_stop)
347{
348 struct cnss_sdio_info *cnss_info;
349 struct cnss_sdio_wlan_driver *wdrv;
350 int ret = 0;
351
352 if (!cnss_pdata)
353 return -ENODEV;
354
355 cnss_info = &cnss_pdata->cnss_sdio_info;
356 wdrv = cnss_info->wdrv;
357 if (!wdrv)
358 return 0;
359 if (!wdrv->shutdown)
360 return 0;
361
362 wdrv->shutdown(cnss_info->func);
363 ret = cnss_put_hw_resources(cnss_info->dev);
364
365 if (ret)
366 pr_err("Failed to put hw resources\n");
367
368 return ret;
369}
370
371static int cnss_sdio_powerup(const struct subsys_desc *subsys)
372{
373 struct cnss_sdio_info *cnss_info;
374 struct cnss_sdio_wlan_driver *wdrv;
375 int ret = 0;
376
377 if (!cnss_pdata)
378 return -ENODEV;
379
380 cnss_info = &cnss_pdata->cnss_sdio_info;
381 wdrv = cnss_info->wdrv;
382
383 if (!wdrv)
384 return 0;
385
386 if (!wdrv->reinit)
387 return 0;
388
389 ret = cnss_get_hw_resources(cnss_info->dev);
390 if (ret) {
391 pr_err("Failed to power up HW\n");
392 return ret;
393 }
394
395 ret = wdrv->reinit(cnss_info->func, cnss_info->id);
396 if (ret)
397 pr_err("wlan reinit error=%d\n", ret);
398
399 return ret;
400}
401
402static void cnss_sdio_crash_shutdown(const struct subsys_desc *subsys)
403{
404 struct cnss_sdio_info *cnss_info;
405 struct cnss_sdio_wlan_driver *wdrv;
406
407 if (!cnss_pdata)
408 return;
409
410 cnss_info = &cnss_pdata->cnss_sdio_info;
411 wdrv = cnss_info->wdrv;
412 if (wdrv && wdrv->crash_shutdown)
413 wdrv->crash_shutdown(cnss_info->func);
414}
415
416static int cnss_sdio_ramdump(int enable, const struct subsys_desc *subsys)
417{
418 struct cnss_ssr_info *ssr_info;
419 struct ramdump_segment segment;
420 int ret;
421
422 if (!cnss_pdata)
423 return -ENODEV;
424
425 if (!cnss_pdata->ssr_info.ramdump_size)
426 return -ENOENT;
427
428 if (!enable)
429 return 0;
430
431 ssr_info = &cnss_pdata->ssr_info;
432
433 memset(&segment, 0, sizeof(segment));
434 segment.v_address = ssr_info->ramdump_addr;
435 segment.size = ssr_info->ramdump_size;
436 ret = do_ramdump(ssr_info->ramdump_dev, &segment, 1);
437 if (ret)
438 pr_err("do_ramdump failed error=%d\n", ret);
439 return ret;
440}
441
442static int cnss_subsys_init(void)
443{
444 struct cnss_ssr_info *ssr_info;
445 int ret = 0;
446
447 if (!cnss_pdata)
448 return -ENODEV;
449
450 ssr_info = &cnss_pdata->ssr_info;
451 ssr_info->subsysdesc.name = ssr_info->subsys_name;
452 ssr_info->subsysdesc.owner = THIS_MODULE;
453 ssr_info->subsysdesc.shutdown = cnss_sdio_shutdown;
454 ssr_info->subsysdesc.powerup = cnss_sdio_powerup;
455 ssr_info->subsysdesc.ramdump = cnss_sdio_ramdump;
456 ssr_info->subsysdesc.crash_shutdown = cnss_sdio_crash_shutdown;
457 ssr_info->subsysdesc.dev = &cnss_pdata->pdev->dev;
458 ssr_info->subsys = subsys_register(&ssr_info->subsysdesc);
459 if (IS_ERR(ssr_info->subsys)) {
460 ret = PTR_ERR(ssr_info->subsys);
461 ssr_info->subsys = NULL;
462 dev_err(&cnss_pdata->pdev->dev, "Failed to subsys_register error=%d\n",
463 ret);
464 goto err_subsys_reg;
465 }
466 ssr_info->subsys_handle = subsystem_get(ssr_info->subsysdesc.name);
467 if (IS_ERR(ssr_info->subsys_handle)) {
468 ret = PTR_ERR(ssr_info->subsys_handle);
469 ssr_info->subsys_handle = NULL;
470 dev_err(&cnss_pdata->pdev->dev, "Failed to subsystem_get error=%d\n",
471 ret);
472 goto err_subsys_get;
473 }
474 return 0;
475err_subsys_get:
476 subsys_unregister(ssr_info->subsys);
477 ssr_info->subsys = NULL;
478err_subsys_reg:
479 return ret;
480}
481
482static void cnss_subsys_exit(void)
483{
484 struct cnss_ssr_info *ssr_info;
485
486 if (!cnss_pdata)
487 return;
488
489 ssr_info = &cnss_pdata->ssr_info;
490 if (ssr_info->subsys_handle)
491 subsystem_put(ssr_info->subsys_handle);
492 ssr_info->subsys_handle = NULL;
493 if (ssr_info->subsys)
494 subsys_unregister(ssr_info->subsys);
495 ssr_info->subsys = NULL;
496}
497
498static int cnss_configure_dump_table(struct cnss_ssr_info *ssr_info)
499{
500 struct msm_dump_entry dump_entry;
501 int ret;
502
503 ssr_info->dump_data.addr = ssr_info->ramdump_phys;
504 ssr_info->dump_data.len = ssr_info->ramdump_size;
505 ssr_info->dump_data.version = CNSS_DUMP_FORMAT_VER;
506 ssr_info->dump_data.magic = CNSS_DUMP_MAGIC_VER_V2;
507 strlcpy(ssr_info->dump_data.name, CNSS_DUMP_NAME,
508 sizeof(ssr_info->dump_data.name));
509
510 dump_entry.id = MSM_DUMP_DATA_CNSS_WLAN;
511 dump_entry.addr = virt_to_phys(&ssr_info->dump_data);
512
513 ret = msm_dump_data_register(MSM_DUMP_TABLE_APPS, &dump_entry);
514 if (ret)
515 pr_err("Dump table setup failed: %d\n", ret);
516
517 return ret;
518}
519
520static int cnss_configure_ramdump(void)
521{
522 struct cnss_ssr_info *ssr_info;
523 int ret = 0;
524 struct resource *res;
525 const char *name;
526 u32 ramdump_size = 0;
527 struct device *dev;
528
529 if (!cnss_pdata)
530 return -ENODEV;
531
532 dev = &cnss_pdata->pdev->dev;
533
534 ssr_info = &cnss_pdata->ssr_info;
535
536 ret = of_property_read_string(dev->of_node, CNSS_SUBSYS_NAME_KEY,
537 &name);
538 if (ret) {
539 pr_err("cnss missing DT key '%s'\n",
540 CNSS_SUBSYS_NAME_KEY);
541 ret = -ENODEV;
542 goto err_subsys_name_query;
543 }
544
545 strlcpy(ssr_info->subsys_name, name, sizeof(ssr_info->subsys_name));
546
547 if (of_property_read_u32(dev->of_node, "qcom,wlan-ramdump-dynamic",
548 &ramdump_size) == 0) {
549 ssr_info->ramdump_addr = dma_alloc_coherent(dev, ramdump_size,
550 &ssr_info->ramdump_phys,
551 GFP_KERNEL);
552 if (ssr_info->ramdump_addr)
553 ssr_info->ramdump_size = ramdump_size;
554 ssr_info->ramdump_dynamic = true;
555 } else {
556 res = platform_get_resource_byname(cnss_pdata->pdev,
557 IORESOURCE_MEM, "ramdump");
558 if (res) {
559 ssr_info->ramdump_phys = res->start;
560 ramdump_size = resource_size(res);
561 ssr_info->ramdump_addr = ioremap(ssr_info->ramdump_phys,
562 ramdump_size);
563 if (ssr_info->ramdump_addr)
564 ssr_info->ramdump_size = ramdump_size;
565 ssr_info->ramdump_dynamic = false;
566 }
567 }
568
569 pr_info("ramdump addr: %p, phys: %pa subsys:'%s'\n",
570 ssr_info->ramdump_addr, &ssr_info->ramdump_phys,
571 ssr_info->subsys_name);
572
573 if (ssr_info->ramdump_size == 0) {
574 pr_info("CNSS ramdump will not be collected\n");
575 return 0;
576 }
577
578 if (ssr_info->ramdump_dynamic) {
579 ret = cnss_configure_dump_table(ssr_info);
580 if (ret)
581 goto err_configure_dump_table;
582 }
583
584 ssr_info->ramdump_dev = create_ramdump_device(ssr_info->subsys_name,
585 dev);
586 if (!ssr_info->ramdump_dev) {
587 ret = -ENOMEM;
588 pr_err("ramdump dev create failed: error=%d\n",
589 ret);
590 goto err_configure_dump_table;
591 }
592
593 return 0;
594
595err_configure_dump_table:
596 if (ssr_info->ramdump_dynamic)
597 dma_free_coherent(dev, ssr_info->ramdump_size,
598 ssr_info->ramdump_addr,
599 ssr_info->ramdump_phys);
600 else
601 iounmap(ssr_info->ramdump_addr);
602
603 ssr_info->ramdump_addr = NULL;
604 ssr_info->ramdump_size = 0;
605err_subsys_name_query:
606 return ret;
607}
608
609static void cnss_ramdump_cleanup(void)
610{
611 struct cnss_ssr_info *ssr_info;
612 struct device *dev;
613
614 if (!cnss_pdata)
615 return;
616
617 dev = &cnss_pdata->pdev->dev;
618 ssr_info = &cnss_pdata->ssr_info;
619 if (ssr_info->ramdump_addr) {
620 if (ssr_info->ramdump_dynamic)
621 dma_free_coherent(dev, ssr_info->ramdump_size,
622 ssr_info->ramdump_addr,
623 ssr_info->ramdump_phys);
624 else
625 iounmap(ssr_info->ramdump_addr);
626 }
627
628 ssr_info->ramdump_addr = NULL;
629 if (ssr_info->ramdump_dev)
630 destroy_ramdump_device(ssr_info->ramdump_dev);
631 ssr_info->ramdump_dev = NULL;
632}
633
634void *cnss_sdio_get_virt_ramdump_mem(unsigned long *size)
635{
636 if (!cnss_pdata || !cnss_pdata->pdev)
637 return NULL;
638
639 *size = cnss_pdata->ssr_info.ramdump_size;
640
641 return cnss_pdata->ssr_info.ramdump_addr;
642}
643
644void cnss_sdio_device_self_recovery(void)
645{
646 cnss_sdio_shutdown(NULL, false);
647 msleep(WLAN_RECOVERY_DELAY);
648 cnss_sdio_powerup(NULL);
649}
650
651void cnss_sdio_device_crashed(void)
652{
653 struct cnss_ssr_info *ssr_info;
654
655 if (!cnss_pdata)
656 return;
657 ssr_info = &cnss_pdata->ssr_info;
658 if (ssr_info->subsys) {
659 subsys_set_crash_status(ssr_info->subsys, true);
660 subsystem_restart_dev(ssr_info->subsys);
661 }
662}
663
664static void cnss_sdio_recovery_work_handler(struct work_struct *recovery)
665{
666 cnss_sdio_device_self_recovery();
667}
668
669DECLARE_WORK(cnss_sdio_recovery_work, cnss_sdio_recovery_work_handler);
670
671void cnss_sdio_schedule_recovery_work(void)
672{
673 schedule_work(&cnss_sdio_recovery_work);
674}
675
676/**
677 * cnss_get_restart_level() - cnss get restart level API
678 *
679 * Wlan sdio function driver uses this API to get the current
680 * subsystem restart level.
681 *
682 * Return: CNSS_RESET_SOC - "SYSTEM", restart system
683 * CNSS_RESET_SUBSYS_COUPLED - "RELATED",restart subsystem
684 */
685int cnss_get_restart_level(void)
686{
687 struct cnss_ssr_info *ssr_info;
688 int level;
689
690 if (!cnss_pdata)
691 return CNSS_RESET_SOC;
692 ssr_info = &cnss_pdata->ssr_info;
693 if (!ssr_info->subsys)
694 return CNSS_RESET_SOC;
695 level = subsys_get_restart_level(ssr_info->subsys);
696 switch (level) {
697 case RESET_SOC:
698 return CNSS_RESET_SOC;
699 case RESET_SUBSYS_COUPLED:
700 return CNSS_RESET_SUBSYS_COUPLED;
701 default:
702 return CNSS_RESET_SOC;
703 }
704}
705EXPORT_SYMBOL(cnss_get_restart_level);
706
707static inline int cnss_get_tsf_cap_irq(struct device *dev)
708{
709 int irq = -EINVAL;
710 int gpio;
711
712 if (!dev)
713 return -ENODEV;
714
715 gpio = of_get_named_gpio(dev->of_node, WLAN_GPIO_CAPTSF_NAME, 0);
716 if (gpio >= 0)
717 irq = gpio_to_irq(gpio);
718
719 return irq;
720}
721
722static int cnss_sdio_register_tsf_captured_handler(irq_handler_t handler,
723 void *ctx)
724{
725 struct cnss_cap_tsf_info *tsf_info;
726
727 if (!cnss_pdata)
728 return -ENODEV;
729
730 tsf_info = &cnss_pdata->cnss_sdio_info.cap_tsf_info;
731 if (tsf_info->irq_num < 0)
732 return -ENOTSUPP;
733
734 tsf_info->irq_handler = handler;
735 tsf_info->context = ctx;
736 return 0;
737}
738
739static int cnss_sdio_unregister_tsf_captured_handler(void *ctx)
740{
741 struct cnss_cap_tsf_info *tsf_info;
742
743 if (!cnss_pdata)
744 return -ENODEV;
745
746 tsf_info = &cnss_pdata->cnss_sdio_info.cap_tsf_info;
747 if (tsf_info->irq_num < 0)
748 return -ENOTSUPP;
749
750 if (ctx == tsf_info->context) {
751 tsf_info->irq_handler = NULL;
752 tsf_info->context = NULL;
753 }
754 return 0;
755}
756
757static irqreturn_t cnss_sdio_tsf_captured_handler(int irq, void *ctx)
758{
759 struct cnss_cap_tsf_info *tsf_info;
760
761 if (!cnss_pdata)
762 return IRQ_HANDLED;
763
764 tsf_info = &cnss_pdata->cnss_sdio_info.cap_tsf_info;
765 if (tsf_info->irq_num < 0 || tsf_info->irq_num != irq ||
766 !tsf_info->irq_handler || !tsf_info->context)
767 return IRQ_HANDLED;
768
769 return tsf_info->irq_handler(irq, tsf_info->context);
770}
771
772static void cnss_sdio_tsf_init(struct device *dev,
773 struct cnss_cap_tsf_info *tsf_info)
774{
775 int ret, irq;
776
777 tsf_info->irq_num = -EINVAL;
778 tsf_info->irq_handler = NULL;
779 tsf_info->context = NULL;
780
781 irq = cnss_get_tsf_cap_irq(dev);
782 if (irq < 0) {
783 dev_err(dev, "%s: fail to get irq: %d\n", __func__, irq);
784 return;
785 }
786
787 ret = request_irq(irq, cnss_sdio_tsf_captured_handler,
788 IRQF_SHARED | IRQF_TRIGGER_RISING, dev_name(dev),
789 (void *)tsf_info);
790 dev_err(dev, "%s: request irq[%d] for dev: %s, result: %d\n",
791 __func__, irq, dev_name(dev), ret);
792 if (!ret)
793 tsf_info->irq_num = irq;
794}
795
796static void cnss_sdio_tsf_deinit(struct cnss_cap_tsf_info *tsf_info)
797{
798 int irq = tsf_info->irq_num;
799
800 if (irq < 0)
801 return;
802
803 free_irq(irq, (void *)tsf_info);
804
805 tsf_info->irq_num = -EINVAL;
806 tsf_info->irq_handler = NULL;
807 tsf_info->context = NULL;
808}
809
810static void cnss_sdio_set_platform_ops(struct device *dev)
811{
812 struct cnss_dev_platform_ops *pf_ops = &cnss_pdata->platform_ops;
813
814 pf_ops->power_up = cnss_sdio_power_up;
815 pf_ops->power_down = cnss_sdio_power_down;
816 pf_ops->device_crashed = cnss_sdio_device_crashed;
817 pf_ops->get_virt_ramdump_mem = cnss_sdio_get_virt_ramdump_mem;
818 pf_ops->device_self_recovery = cnss_sdio_device_self_recovery;
819 pf_ops->get_wlan_mac_address = cnss_sdio_get_wlan_mac_address;
820 pf_ops->set_wlan_mac_address = cnss_sdio_set_wlan_mac_address;
821 pf_ops->schedule_recovery_work = cnss_sdio_schedule_recovery_work;
822 pf_ops->request_bus_bandwidth = cnss_sdio_request_bus_bandwidth;
823 pf_ops->register_tsf_captured_handler =
824 cnss_sdio_register_tsf_captured_handler;
825 pf_ops->unregister_tsf_captured_handler =
826 cnss_sdio_unregister_tsf_captured_handler;
827 dev->platform_data = pf_ops;
828}
829
830static int cnss_sdio_wlan_inserted(struct sdio_func *func,
831 const struct sdio_device_id *id)
832{
833 struct cnss_sdio_info *info;
834
835 if (!cnss_pdata)
836 return -ENODEV;
837
838 info = &cnss_pdata->cnss_sdio_info;
839
840 info->func = func;
841 info->card = func->card;
842 info->host = func->card->host;
843 info->id = id;
844 info->dev = &func->dev;
845 cnss_sdio_set_platform_ops(info->dev);
846
847 cnss_put_hw_resources(cnss_pdata->cnss_sdio_info.dev);
848
849 pr_info("SDIO Device is Probed\n");
850 return 0;
851}
852
853static void cnss_sdio_wlan_removed(struct sdio_func *func)
854{
855 struct cnss_sdio_info *info;
856
857 if (!cnss_pdata)
858 return;
859
860 info = &cnss_pdata->cnss_sdio_info;
861
862 info->host = NULL;
863 info->card = NULL;
864 info->func = NULL;
865 info->id = NULL;
866}
867
868#if defined(CONFIG_PM)
869static int cnss_sdio_wlan_suspend(struct device *dev)
870{
871 struct cnss_sdio_wlan_driver *wdrv;
872 struct cnss_sdio_bus_bandwidth *bus_bandwidth;
873 struct sdio_func *func;
874
875 int error = 0;
876
877 if (!cnss_pdata)
878 return -ENODEV;
879
880 bus_bandwidth = &cnss_pdata->bus_bandwidth;
881 if (bus_bandwidth->bus_client) {
882 msm_bus_scale_client_update_request(
883 bus_bandwidth->bus_client, CNSS_BUS_WIDTH_NONE);
884 }
885
886 func = cnss_pdata->cnss_sdio_info.func;
887 wdrv = cnss_pdata->cnss_sdio_info.wdrv;
888 if (!wdrv) {
889 /* This can happen when no wlan driver loaded (no register to
890 * platform driver).
891 */
892 sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
893 pr_debug("wlan driver not registered\n");
894 return 0;
895 }
896 if (wdrv->suspend) {
897 error = wdrv->suspend(dev);
898 if (error)
899 pr_err("wlan suspend failed error=%d\n", error);
900 }
901
902 return error;
903}
904
905static int cnss_sdio_wlan_resume(struct device *dev)
906{
907 struct cnss_sdio_wlan_driver *wdrv;
908 struct cnss_sdio_bus_bandwidth *bus_bandwidth;
909 int error = 0;
910
911 if (!cnss_pdata)
912 return -ENODEV;
913
914 bus_bandwidth = &cnss_pdata->bus_bandwidth;
915 if (bus_bandwidth->bus_client) {
916 msm_bus_scale_client_update_request(
917 bus_bandwidth->bus_client,
918 bus_bandwidth->current_bandwidth_vote);
919 }
920
921 wdrv = cnss_pdata->cnss_sdio_info.wdrv;
922 if (!wdrv) {
923 /* This can happen when no wlan driver loaded (no register to
924 * platform driver).
925 */
926 pr_debug("wlan driver not registered\n");
927 return 0;
928 }
929 if (wdrv->resume) {
930 error = wdrv->resume(dev);
931 if (error)
932 pr_err("wlan resume failed error=%d\n", error);
933 }
934 return error;
935}
936#endif
937
938#if defined(CONFIG_PM)
939static const struct dev_pm_ops cnss_ar6k_device_pm_ops = {
940 .suspend = cnss_sdio_wlan_suspend,
941 .resume = cnss_sdio_wlan_resume,
942};
943#endif /* CONFIG_PM */
944
945static struct sdio_driver cnss_ar6k_driver = {
946 .name = "cnss_ar6k_wlan",
947 .id_table = ar6k_id_table,
948 .probe = cnss_sdio_wlan_inserted,
949 .remove = cnss_sdio_wlan_removed,
950#if defined(CONFIG_PM)
951 .drv = {
952 .pm = &cnss_ar6k_device_pm_ops,
953 }
954#endif
955};
956
957static int cnss_set_pinctrl_state(struct cnss_sdio_data *pdata, bool state)
958{
959 struct cnss_wlan_pinctrl_info *info = &pdata->pinctrl_info;
960
961 if (!info->is_antenna_shared)
962 return 0;
963
964 if (!info->pinctrl)
965 return -EIO;
966
967 return state ? pinctrl_select_state(info->pinctrl, info->active) :
968 pinctrl_select_state(info->pinctrl, info->sleep);
969}
970
971int cnss_sdio_configure_spdt(bool state)
972{
973 if (!cnss_pdata)
974 return -ENODEV;
975
976 return cnss_set_pinctrl_state(cnss_pdata, state);
977}
978EXPORT_SYMBOL(cnss_sdio_configure_spdt);
979
980/**
981 * cnss_sdio_wlan_register_driver() - cnss wlan register API
982 * @driver: sdio wlan driver interface from wlan driver.
983 *
984 * wlan sdio function driver uses this API to register callback
985 * functions to cnss_sido platform driver. The callback will
986 * be invoked by corresponding wrapper function of this cnss
987 * platform driver.
988 */
989int cnss_sdio_wlan_register_driver(struct cnss_sdio_wlan_driver *driver)
990{
991 struct cnss_sdio_info *cnss_info;
992 struct device *dev;
993 int error = -EINVAL;
994
995 if (!cnss_pdata)
996 return -ENODEV;
997
998 cnss_info = &cnss_pdata->cnss_sdio_info;
999 dev = cnss_info->dev;
1000
1001 if (cnss_info->wdrv) {
1002 pr_debug("wdrv already existed\n");
1003 return error;
1004 }
1005
1006 if (!driver)
1007 return error;
1008
1009 error = cnss_get_hw_resources(dev);
1010 if (error) {
1011 pr_err("Failed to restore power err:%d\n", error);
1012 return error;
1013 }
1014
1015 error = cnss_set_pinctrl_state(cnss_pdata, PINCTRL_ACTIVE);
1016 if (error) {
1017 pr_err("Fail to set pinctrl to active state\n");
1018 cnss_put_hw_resources(dev);
1019 goto put_hw;
1020 }
1021
1022 /* The HW resources are released in unregister logic if probe fails */
1023 error = driver->probe ? driver->probe(cnss_info->func,
1024 cnss_info->id) : error;
1025 if (error) {
1026 pr_err("wlan probe failed error=%d\n", error);
1027 /**
1028 * Check memory leak in skb pre-alloc memory pool
1029 * Reset the skb memory pool
1030 */
1031 goto pinctrl_sleep;
1032 }
1033
1034 cnss_info->wdrv = driver;
1035
1036 return error;
1037
1038pinctrl_sleep:
1039 cnss_set_pinctrl_state(cnss_pdata, PINCTRL_SLEEP);
1040put_hw:
1041 return error;
1042}
1043EXPORT_SYMBOL(cnss_sdio_wlan_register_driver);
1044
1045/**
1046 * cnss_sdio_wlan_unregister_driver() - cnss wlan unregister API
1047 * @driver: sdio wlan driver interface from wlan driver.
1048 *
1049 * wlan sdio function driver uses this API to detach it from cnss_sido
1050 * platform driver.
1051 */
1052void
1053cnss_sdio_wlan_unregister_driver(struct cnss_sdio_wlan_driver *driver)
1054{
1055 struct cnss_sdio_info *cnss_info;
1056 struct cnss_sdio_bus_bandwidth *bus_bandwidth;
1057
1058 if (!cnss_pdata)
1059 return;
1060
1061 bus_bandwidth = &cnss_pdata->bus_bandwidth;
1062 if (bus_bandwidth->bus_client) {
1063 msm_bus_scale_client_update_request(
1064 bus_bandwidth->bus_client, CNSS_BUS_WIDTH_NONE);
1065 }
1066
1067 cnss_info = &cnss_pdata->cnss_sdio_info;
1068 if (!cnss_info->wdrv) {
1069 pr_err("driver not registered\n");
1070 return;
1071 }
1072
1073 if (!driver)
1074 return;
1075
1076 if (!driver->remove)
1077 return;
1078
1079 driver->remove(cnss_info->func);
1080
1081 cnss_info->wdrv = NULL;
1082 cnss_set_pinctrl_state(cnss_pdata, PINCTRL_SLEEP);
1083 cnss_put_hw_resources(cnss_info->dev);
1084}
1085EXPORT_SYMBOL(cnss_sdio_wlan_unregister_driver);
1086
1087/**
1088 * cnss_wlan_query_oob_status() - cnss wlan query oob status API
1089 *
1090 * Wlan sdio function driver uses this API to check whether oob is
1091 * supported in platform driver.
1092 *
1093 * Return: 0 means oob is supported, others means unsupported.
1094 */
1095int cnss_wlan_query_oob_status(void)
1096{
1097 return -EINVAL;
1098}
1099EXPORT_SYMBOL(cnss_wlan_query_oob_status);
1100
1101/**
1102 * cnss_wlan_register_oob_irq_handler() - cnss wlan register oob callback API
1103 * @handler: oob callback function pointer which registered to platform driver.
1104 * @pm_oob : parameter which registered to platform driver.
1105 *
1106 * Wlan sdio function driver uses this API to register oob callback
1107 * function to platform driver.
1108 *
1109 * Return: 0 means register successfully, others means failure.
1110 */
1111int cnss_wlan_register_oob_irq_handler(oob_irq_handler_t handler, void *pm_oob)
1112{
1113 return -EINVAL;
1114}
1115EXPORT_SYMBOL(cnss_wlan_register_oob_irq_handler);
1116
1117/**
1118 * cnss_wlan_unregister_oob_irq_handler() - unregister oob callback API
1119 * @pm_oob: parameter which unregistered from platform driver.
1120 *
1121 * Wlan sdio function driver uses this API to unregister oob callback
1122 * function from platform driver.
1123 *
1124 * Return: 0 means unregister successfully, others means failure.
1125 */
1126int cnss_wlan_unregister_oob_irq_handler(void *pm_oob)
1127{
1128 return -EINVAL;
1129}
1130EXPORT_SYMBOL(cnss_wlan_unregister_oob_irq_handler);
1131
1132static void cnss_sdio_reset_platform_ops(void)
1133{
1134 struct cnss_dev_platform_ops *pf_ops = &cnss_pdata->platform_ops;
1135 struct cnss_sdio_info *sdio_info = &cnss_pdata->cnss_sdio_info;
1136
1137 memset(pf_ops, 0, sizeof(struct cnss_dev_platform_ops));
1138 if (sdio_info->dev)
1139 sdio_info->dev->platform_data = NULL;
1140}
1141
1142static int cnss_sdio_wlan_init(void)
1143{
1144 int error = 0;
1145
1146 error = sdio_register_driver(&cnss_ar6k_driver);
1147 if (error) {
1148 cnss_sdio_reset_platform_ops();
1149 pr_err("registered fail error=%d\n", error);
1150 } else {
1151 pr_debug("registered success\n");
1152 }
1153
1154 return error;
1155}
1156
1157static void cnss_sdio_wlan_exit(void)
1158{
1159 if (!cnss_pdata)
1160 return;
1161
1162 cnss_sdio_reset_platform_ops();
1163 sdio_unregister_driver(&cnss_ar6k_driver);
1164}
1165
1166static void cnss_sdio_deinit_bus_bandwidth(void)
1167{
1168 struct cnss_sdio_bus_bandwidth *bus_bandwidth;
1169
1170 bus_bandwidth = &cnss_pdata->bus_bandwidth;
1171 if (bus_bandwidth->bus_client) {
1172 msm_bus_scale_client_update_request(bus_bandwidth->bus_client,
1173 CNSS_BUS_WIDTH_NONE);
1174 msm_bus_scale_unregister_client(bus_bandwidth->bus_client);
1175 }
1176}
1177
1178static int cnss_sdio_configure_wlan_enable_regulator(void)
1179{
1180 int error;
1181 struct device *dev = &cnss_pdata->pdev->dev;
1182
1183 if (of_get_property(
1184 cnss_pdata->pdev->dev.of_node,
1185 WLAN_VREG_NAME "-supply", NULL)) {
1186 cnss_pdata->regulator.wlan_vreg = regulator_get(
1187 &cnss_pdata->pdev->dev, WLAN_VREG_NAME);
1188 if (IS_ERR(cnss_pdata->regulator.wlan_vreg)) {
1189 error = PTR_ERR(cnss_pdata->regulator.wlan_vreg);
1190 dev_err(dev, "VDD-VREG get failed error=%d\n", error);
1191 return error;
1192 }
1193
1194 error = regulator_enable(cnss_pdata->regulator.wlan_vreg);
1195 if (error) {
1196 dev_err(dev, "VDD-VREG enable failed error=%d\n",
1197 error);
1198 goto err_vdd_vreg_regulator;
1199 }
1200 }
1201
1202 return 0;
1203
1204err_vdd_vreg_regulator:
1205 regulator_put(cnss_pdata->regulator.wlan_vreg);
1206
1207 return error;
1208}
1209
1210static int cnss_sdio_configure_wlan_enable_dsrc_regulator(void)
1211{
1212 int error;
1213 struct device *dev = &cnss_pdata->pdev->dev;
1214
1215 if (of_get_property(
1216 cnss_pdata->pdev->dev.of_node,
1217 WLAN_VREG_DSRC_NAME "-supply", NULL)) {
1218 cnss_pdata->regulator.wlan_vreg_dsrc = regulator_get(
1219 &cnss_pdata->pdev->dev, WLAN_VREG_DSRC_NAME);
1220 if (IS_ERR(cnss_pdata->regulator.wlan_vreg_dsrc)) {
1221 error = PTR_ERR(cnss_pdata->regulator.wlan_vreg_dsrc);
1222 dev_err(dev, "VDD-VREG-DSRC get failed error=%d\n",
1223 error);
1224 return error;
1225 }
1226
1227 error = regulator_enable(cnss_pdata->regulator.wlan_vreg_dsrc);
1228 if (error) {
1229 dev_err(dev, "VDD-VREG-DSRC enable failed error=%d\n",
1230 error);
1231 goto err_vdd_vreg_dsrc_regulator;
1232 }
1233 }
1234
1235 return 0;
1236
1237err_vdd_vreg_dsrc_regulator:
1238 regulator_put(cnss_pdata->regulator.wlan_vreg_dsrc);
1239
1240 return error;
1241}
1242
1243static int cnss_sdio_configure_regulator(void)
1244{
1245 int error;
1246 struct device *dev = &cnss_pdata->pdev->dev;
1247
1248 if (of_get_property(
1249 cnss_pdata->pdev->dev.of_node,
1250 WLAN_VREG_IO_NAME "-supply", NULL)) {
1251 cnss_pdata->regulator.wlan_io = regulator_get(
1252 &cnss_pdata->pdev->dev, WLAN_VREG_IO_NAME);
1253 if (IS_ERR(cnss_pdata->regulator.wlan_io)) {
1254 error = PTR_ERR(cnss_pdata->regulator.wlan_io);
1255 dev_err(dev, "VDD-IO get failed error=%d\n", error);
1256 return error;
1257 }
1258
1259 error = regulator_set_voltage(
1260 cnss_pdata->regulator.wlan_io,
1261 WLAN_VREG_IO_MIN, WLAN_VREG_IO_MAX);
1262 if (error) {
1263 dev_err(dev, "VDD-IO set failed error=%d\n", error);
1264 goto err_vdd_io_regulator;
1265 } else {
1266 error = regulator_enable(cnss_pdata->regulator.wlan_io);
1267 if (error) {
1268 dev_err(dev, "VDD-IO enable failed error=%d\n",
1269 error);
1270 goto err_vdd_io_regulator;
1271 }
1272 }
1273 }
1274
1275 if (of_get_property(
1276 cnss_pdata->pdev->dev.of_node,
1277 WLAN_VREG_XTAL_NAME "-supply", NULL)) {
1278 cnss_pdata->regulator.wlan_xtal = regulator_get(
1279 &cnss_pdata->pdev->dev, WLAN_VREG_XTAL_NAME);
1280 if (IS_ERR(cnss_pdata->regulator.wlan_xtal)) {
1281 error = PTR_ERR(cnss_pdata->regulator.wlan_xtal);
1282 dev_err(dev, "VDD-XTAL get failed error=%d\n", error);
1283 goto err_vdd_xtal_regulator;
1284 }
1285
1286 error = regulator_set_voltage(
1287 cnss_pdata->regulator.wlan_xtal,
1288 WLAN_VREG_XTAL_MIN, WLAN_VREG_XTAL_MAX);
1289 if (error) {
1290 dev_err(dev, "VDD-XTAL set failed error=%d\n", error);
1291 goto err_vdd_xtal_regulator;
1292 } else {
1293 error = regulator_enable(
1294 cnss_pdata->regulator.wlan_xtal);
1295 if (error) {
1296 dev_err(dev, "VDD-XTAL enable failed err=%d\n",
1297 error);
1298 goto err_vdd_xtal_regulator;
1299 }
1300 }
1301 }
1302
1303 return 0;
1304
1305err_vdd_xtal_regulator:
1306 regulator_put(cnss_pdata->regulator.wlan_xtal);
1307err_vdd_io_regulator:
1308 regulator_put(cnss_pdata->regulator.wlan_io);
1309 return error;
1310}
1311
1312static void cnss_sdio_release_resource(void)
1313{
1314 if (cnss_pdata->regulator.wlan_xtal)
1315 regulator_put(cnss_pdata->regulator.wlan_xtal);
1316 if (cnss_pdata->regulator.wlan_vreg)
1317 regulator_put(cnss_pdata->regulator.wlan_vreg);
1318 if (cnss_pdata->regulator.wlan_io)
1319 regulator_put(cnss_pdata->regulator.wlan_io);
1320 if (cnss_pdata->regulator.wlan_vreg_dsrc)
1321 regulator_put(cnss_pdata->regulator.wlan_vreg_dsrc);
1322}
1323
1324static int cnss_sdio_pinctrl_init(struct cnss_sdio_data *pdata,
1325 struct platform_device *pdev)
1326{
1327 int ret = 0;
1328 struct device *dev = &pdev->dev;
1329 struct cnss_wlan_pinctrl_info *info = &pdata->pinctrl_info;
1330
1331 if (!of_find_property(dev->of_node, "qcom,is-antenna-shared", NULL))
1332 return 0;
1333
1334 info->is_antenna_shared = true;
1335 info->pinctrl = devm_pinctrl_get(dev);
1336 if ((IS_ERR_OR_NULL(info->pinctrl))) {
1337 dev_err(dev, "%s: Failed to get pinctrl\n", __func__);
1338 return PTR_ERR(info->pinctrl);
1339 }
1340
1341 info->sleep = pinctrl_lookup_state(info->pinctrl,
1342 CNSS_PINCTRL_SLEEP_STATE);
1343 if (IS_ERR_OR_NULL(info->sleep)) {
1344 dev_err(dev, "%s: Fail to get sleep state for pin\n", __func__);
1345 ret = PTR_ERR(info->sleep);
1346 goto release_pinctrl;
1347 }
1348
1349 info->active = pinctrl_lookup_state(info->pinctrl,
1350 CNSS_PINCTRL_ACTIVE_STATE);
1351 if (IS_ERR_OR_NULL(info->active)) {
1352 dev_err(dev, "%s: Fail to get active state for pin\n",
1353 __func__);
1354 ret = PTR_ERR(info->active);
1355 goto release_pinctrl;
1356 }
1357
1358 ret = cnss_set_pinctrl_state(pdata, PINCTRL_SLEEP);
1359
1360 if (ret) {
1361 dev_err(dev, "%s: Fail to set pin in sleep state\n", __func__);
1362 goto release_pinctrl;
1363 }
1364
1365 return ret;
1366
1367release_pinctrl:
1368 devm_pinctrl_put(info->pinctrl);
1369 info->is_antenna_shared = false;
1370 return ret;
1371}
1372
1373static int cnss_sdio_init_bus_bandwidth(void)
1374{
1375 int ret = 0;
1376 struct cnss_sdio_bus_bandwidth *bus_bandwidth;
1377 struct device *dev = &cnss_pdata->pdev->dev;
1378
1379 bus_bandwidth = &cnss_pdata->bus_bandwidth;
1380 bus_bandwidth->bus_scale_table = msm_bus_cl_get_pdata(cnss_pdata->pdev);
1381 if (!bus_bandwidth->bus_scale_table) {
1382 dev_err(dev, "Failed to get the bus scale platform data\n");
1383 ret = -EINVAL;
1384 }
1385
1386 bus_bandwidth->bus_client = msm_bus_scale_register_client(
1387 bus_bandwidth->bus_scale_table);
1388 if (!bus_bandwidth->bus_client) {
1389 dev_err(dev, "Failed to register with bus_scale client\n");
1390 ret = -EINVAL;
1391 }
1392
1393 return ret;
1394}
1395
1396static int cnss_sdio_probe(struct platform_device *pdev)
1397{
1398 int error;
1399 struct device *dev = &pdev->dev;
1400 struct cnss_sdio_info *info;
1401
1402 if (pdev->dev.of_node) {
1403 cnss_pdata = devm_kzalloc(
1404 &pdev->dev, sizeof(*cnss_pdata), GFP_KERNEL);
1405 if (!cnss_pdata)
1406 return -ENOMEM;
1407 } else {
1408 cnss_pdata = pdev->dev.platform_data;
1409 }
1410
1411 if (!cnss_pdata)
1412 return -EINVAL;
1413
1414 cnss_pdata->pdev = pdev;
1415 info = &cnss_pdata->cnss_sdio_info;
1416
1417 error = cnss_sdio_pinctrl_init(cnss_pdata, pdev);
1418 if (error) {
1419 dev_err(&pdev->dev, "Fail to configure pinctrl err:%d\n",
1420 error);
1421 return error;
1422 }
1423
1424 error = cnss_sdio_configure_regulator();
1425 if (error) {
1426 dev_err(&pdev->dev, "Failed to configure voltage regulator error=%d\n",
1427 error);
1428 return error;
1429 }
1430
1431 if (of_get_property(
1432 cnss_pdata->pdev->dev.of_node,
1433 WLAN_VREG_NAME "-supply", NULL)) {
1434 error = cnss_sdio_configure_wlan_enable_regulator();
1435 if (error) {
1436 dev_err(&pdev->dev,
1437 "Failed to enable wlan enable regulator error=%d\n",
1438 error);
1439 goto err_wlan_enable_regulator;
1440 }
1441 }
1442
1443 if (of_get_property(
1444 cnss_pdata->pdev->dev.of_node,
1445 WLAN_VREG_DSRC_NAME "-supply", NULL)) {
1446 error = cnss_sdio_configure_wlan_enable_dsrc_regulator();
1447 if (error) {
1448 dev_err(&pdev->dev,
1449 "Failed to enable wlan dsrc enable regulator\n");
1450 goto err_wlan_dsrc_enable_regulator;
1451 }
1452 }
1453
1454 info->skip_wlan_en_toggle = of_property_read_bool(dev->of_node,
1455 "qcom,skip-wlan-en-toggle");
1456 info->cnss_hw_state = CNSS_HW_ACTIVE;
1457
1458 cnss_sdio_tsf_init(dev, &info->cap_tsf_info);
1459
1460 error = cnss_sdio_wlan_init();
1461 if (error) {
1462 dev_err(&pdev->dev, "cnss wlan init failed error=%d\n", error);
1463 goto err_wlan_dsrc_enable_regulator;
1464 }
1465
1466 error = cnss_configure_ramdump();
1467 if (error) {
1468 dev_err(&pdev->dev, "Failed to configure ramdump error=%d\n",
1469 error);
1470 goto err_ramdump_create;
1471 }
1472
1473 error = cnss_subsys_init();
1474 if (error) {
1475 dev_err(&pdev->dev, "Failed to cnss_subsys_init error=%d\n",
1476 error);
1477 goto err_subsys_init;
1478 }
1479
1480 if (of_property_read_bool(
1481 pdev->dev.of_node, "qcom,cnss-enable-bus-bandwidth")) {
1482 error = cnss_sdio_init_bus_bandwidth();
1483 if (error) {
1484 dev_err(&pdev->dev, "Failed to init bus bandwidth\n");
1485 goto err_bus_bandwidth_init;
1486 }
1487 }
1488
1489 dev_info(&pdev->dev, "CNSS SDIO Driver registered");
1490 return 0;
1491
1492err_bus_bandwidth_init:
1493 cnss_subsys_exit();
1494err_subsys_init:
1495 cnss_ramdump_cleanup();
1496err_ramdump_create:
1497 cnss_sdio_wlan_exit();
1498err_wlan_dsrc_enable_regulator:
1499 info->cnss_hw_state = CNSS_HW_SLEEP;
1500 regulator_put(cnss_pdata->regulator.wlan_vreg_dsrc);
1501err_wlan_enable_regulator:
1502 regulator_put(cnss_pdata->regulator.wlan_xtal);
1503 regulator_put(cnss_pdata->regulator.wlan_io);
1504 cnss_pdata = NULL;
1505 return error;
1506}
1507
1508static int cnss_sdio_remove(struct platform_device *pdev)
1509{
1510 struct cnss_sdio_info *info;
1511 struct cnss_cap_tsf_info *tsf_info;
1512
1513 if (!cnss_pdata)
1514 return -ENODEV;
1515
1516 info = &cnss_pdata->cnss_sdio_info;
1517 tsf_info = &info->cap_tsf_info;
1518
1519 cnss_sdio_tsf_deinit(tsf_info);
1520 cnss_sdio_deinit_bus_bandwidth();
1521 cnss_sdio_wlan_exit();
1522 cnss_subsys_exit();
1523 cnss_ramdump_cleanup();
1524 cnss_put_hw_resources(info->dev);
1525 cnss_sdio_release_resource();
1526 cnss_pdata = NULL;
1527 return 0;
1528}
1529
1530int cnss_sdio_set_wlan_mac_address(const u8 *in, u32 len)
1531{
1532 return 0;
1533}
1534
1535u8 *cnss_sdio_get_wlan_mac_address(u32 *num)
1536{
1537 *num = 0;
1538 return NULL;
1539}
1540
1541int cnss_sdio_power_down(struct device *dev)
1542{
1543 return 0;
1544}
1545
1546int cnss_sdio_power_up(struct device *dev)
1547{
1548 return 0;
1549}
1550
1551static const struct of_device_id cnss_sdio_dt_match[] = {
1552 {.compatible = "qcom,cnss_sdio"},
1553 {}
1554};
1555MODULE_DEVICE_TABLE(of, cnss_sdio_dt_match);
1556
1557static struct platform_driver cnss_sdio_driver = {
1558 .probe = cnss_sdio_probe,
1559 .remove = cnss_sdio_remove,
1560 .driver = {
1561 .name = "cnss_sdio",
1562 .owner = THIS_MODULE,
1563 .of_match_table = cnss_sdio_dt_match,
1564 },
1565};
1566
1567static int __init cnss_sdio_init(void)
1568{
1569 return platform_driver_register(&cnss_sdio_driver);
1570}
1571
1572static void __exit cnss_sdio_exit(void)
1573{
1574 platform_driver_unregister(&cnss_sdio_driver);
1575}
1576
1577module_init(cnss_sdio_init);
1578module_exit(cnss_sdio_exit);
1579
1580MODULE_LICENSE("GPL v2");
1581MODULE_DESCRIPTION(DEVICE "CNSS SDIO Driver");