hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/remoteproc/qcom_wcnss.c
....@@ -1,18 +1,10 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Qualcomm Wireless Connectivity Subsystem Peripheral Image Loader
34 *
45 * Copyright (C) 2016 Linaro Ltd
56 * Copyright (C) 2014 Sony Mobile Communications AB
67 * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
7
- *
8
- * This program is free software; you can redistribute it and/or
9
- * modify it under the terms of the GNU General Public License
10
- * version 2 as published by the Free Software Foundation.
11
- *
12
- * This program is distributed in the hope that it will be useful,
13
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- * GNU General Public License for more details.
168 */
179
1810 #include <linux/clk.h>
....@@ -35,6 +27,7 @@
3527
3628 #include "qcom_common.h"
3729 #include "remoteproc_internal.h"
30
+#include "qcom_pil_info.h"
3831 #include "qcom_wcnss.h"
3932
4033 #define WCNSS_CRASH_REASON_SMEM 422
....@@ -153,10 +146,17 @@
153146 static int wcnss_load(struct rproc *rproc, const struct firmware *fw)
154147 {
155148 struct qcom_wcnss *wcnss = (struct qcom_wcnss *)rproc->priv;
149
+ int ret;
156150
157
- return qcom_mdt_load(wcnss->dev, fw, rproc->firmware, WCNSS_PAS_ID,
158
- wcnss->mem_region, wcnss->mem_phys,
159
- wcnss->mem_size, &wcnss->mem_reloc);
151
+ ret = qcom_mdt_load(wcnss->dev, fw, rproc->firmware, WCNSS_PAS_ID,
152
+ wcnss->mem_region, wcnss->mem_phys,
153
+ wcnss->mem_size, &wcnss->mem_reloc);
154
+ if (ret)
155
+ return ret;
156
+
157
+ qcom_pil_info_store("wcnss", wcnss->mem_phys, wcnss->mem_size);
158
+
159
+ return 0;
160160 }
161161
162162 static void wcnss_indicate_nv_download(struct qcom_wcnss *wcnss)
....@@ -295,7 +295,7 @@
295295 return ret;
296296 }
297297
298
-static void *wcnss_da_to_va(struct rproc *rproc, u64 da, int len)
298
+static void *wcnss_da_to_va(struct rproc *rproc, u64 da, size_t len, bool *is_iomem)
299299 {
300300 struct qcom_wcnss *wcnss = (struct qcom_wcnss *)rproc->priv;
301301 int offset;
....@@ -415,6 +415,7 @@
415415 irq_handler_t thread_fn)
416416 {
417417 int ret;
418
+ int irq_number;
418419
419420 ret = platform_get_irq_byname(pdev, name);
420421 if (ret < 0 && optional) {
....@@ -425,14 +426,19 @@
425426 return ret;
426427 }
427428
429
+ irq_number = ret;
430
+
428431 ret = devm_request_threaded_irq(&pdev->dev, ret,
429432 NULL, thread_fn,
430433 IRQF_TRIGGER_RISING | IRQF_ONESHOT,
431434 "wcnss", wcnss);
432
- if (ret)
435
+ if (ret) {
433436 dev_err(&pdev->dev, "request %s IRQ failed\n", name);
437
+ return ret;
438
+ }
434439
435
- return ret;
440
+ /* Return the IRQ number if the IRQ was successfully acquired */
441
+ return irq_number;
436442 }
437443
438444 static int wcnss_alloc_memory_region(struct qcom_wcnss *wcnss)
....@@ -448,6 +454,7 @@
448454 }
449455
450456 ret = of_address_to_resource(node, 0, &r);
457
+ of_node_put(node);
451458 if (ret)
452459 return ret;
453460
....@@ -488,6 +495,7 @@
488495 dev_err(&pdev->dev, "unable to allocate remoteproc\n");
489496 return -ENOMEM;
490497 }
498
+ rproc_coredump_set_elf_info(rproc, ELFCLASS32, EM_NONE);
491499
492500 wcnss = (struct qcom_wcnss *)rproc->priv;
493501 wcnss->dev = &pdev->dev;
....@@ -553,6 +561,10 @@
553561
554562 qcom_add_smd_subdev(rproc, &wcnss->smd_subdev);
555563 wcnss->sysmon = qcom_add_sysmon_subdev(rproc, "wcnss", WCNSS_SSCTL_ID);
564
+ if (IS_ERR(wcnss->sysmon)) {
565
+ ret = PTR_ERR(wcnss->sysmon);
566
+ goto free_rproc;
567
+ }
556568
557569 ret = rproc_add(rproc);
558570 if (ret)
....@@ -622,5 +634,5 @@
622634 }
623635 module_exit(wcnss_exit);
624636
625
-MODULE_DESCRIPTION("Qualcomm Peripherial Image Loader for Wireless Subsystem");
637
+MODULE_DESCRIPTION("Qualcomm Peripheral Image Loader for Wireless Subsystem");
626638 MODULE_LICENSE("GPL v2");