wcnss: get MUX control before dumping IRIS register
Sometimes dumping IRIS register along with PRONTO register
results in crash.
To mitigate issue get MUX control before dumping IRIS register.
Change-Id: Ie1e19a254ec1ae43c2713c86c4d35a2d9968bcd6
CRs-Fixed: 777663
Signed-off-by: Anand N Sunkad <asunka@codeaurora.org>
diff --git a/drivers/net/wireless/wcnss/wcnss_vreg.c b/drivers/net/wireless/wcnss/wcnss_vreg.c
index 9c65a63..2d7d1bd 100644
--- a/drivers/net/wireless/wcnss/wcnss_vreg.c
+++ b/drivers/net/wireless/wcnss/wcnss_vreg.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-2013,2015 The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -37,7 +37,6 @@
#define MSM_PRONTO_PHYS 0xfb21b000
#define RIVA_PMU_OFFSET 0x28
-#define PRONTO_PMU_OFFSET 0x1004
#define RIVA_SPARE_OFFSET 0x0b4
#define PRONTO_SPARE_OFFSET 0x1088
@@ -48,7 +47,6 @@
#define WCNSS_PMU_CFG_IRIS_XO_CFG BIT(3)
#define WCNSS_PMU_CFG_IRIS_XO_EN BIT(4)
-#define WCNSS_PMU_CFG_GC_BUS_MUX_SEL_TOP BIT(5)
#define WCNSS_PMU_CFG_IRIS_XO_CFG_STS BIT(6) /* 1: in progress, 0: done */
#define WCNSS_PMU_CFG_IRIS_RESET BIT(7)
diff --git a/drivers/net/wireless/wcnss/wcnss_wlan.c b/drivers/net/wireless/wcnss/wcnss_wlan.c
index d24f43a..30d337a 100644
--- a/drivers/net/wireless/wcnss/wcnss_wlan.c
+++ b/drivers/net/wireless/wcnss/wcnss_wlan.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-2013,2015 The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -889,6 +889,24 @@
}
}
+int wcnss_get_mux_control(void)
+{
+ void __iomem *pmu_conf_reg;
+ struct wcnss_wlan_config *cfg;
+ u32 reg = 0;
+
+ cfg = wcnss_get_wlan_config();
+ if (NULL == cfg)
+ return 0;
+
+ pmu_conf_reg = cfg->msm_wcnss_base + PRONTO_PMU_OFFSET;
+ writel_relaxed(0, pmu_conf_reg);
+ reg = readl_relaxed(pmu_conf_reg);
+ reg |= WCNSS_PMU_CFG_GC_BUS_MUX_SEL_TOP;
+ writel_relaxed(reg, pmu_conf_reg);
+ return 1;
+}
+
void wcnss_log_debug_regs_on_bite(void)
{
struct platform_device *pdev = wcnss_get_platform_device();
@@ -911,7 +929,8 @@
if (clk_rate) {
wcnss_pronto_log_debug_regs();
- wcnss_log_iris_regs();
+ if (wcnss_get_mux_control())
+ wcnss_log_iris_regs();
} else {
pr_err("clock frequency is zero, cannot access PMU or other registers\n");
wcnss_log_iris_regs();
@@ -925,7 +944,8 @@
{
if (wcnss_hardware_type() == WCNSS_PRONTO_HW) {
wcnss_pronto_log_debug_regs();
- wcnss_log_iris_regs();
+ if (wcnss_get_mux_control())
+ wcnss_log_iris_regs();
wmb();
__raw_writel(1 << 16, penv->fiq_reg);
} else {
diff --git a/include/linux/wcnss_wlan.h b/include/linux/wcnss_wlan.h
index 8bdcfd5..e88ee3b 100644
--- a/include/linux/wcnss_wlan.h
+++ b/include/linux/wcnss_wlan.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-2013,2015 The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -44,6 +44,8 @@
#define HAVE_WCNSS_CAL_DOWNLOAD 1
#define HAVE_WCNSS_RX_BUFF_COUNT 1
#define WLAN_MAC_ADDR_SIZE (6)
+#define PRONTO_PMU_OFFSET 0x1004
+#define WCNSS_PMU_CFG_GC_BUS_MUX_SEL_TOP BIT(5)
void wcnss_get_monotonic_boottime(struct timespec *ts);
struct device *wcnss_wlan_get_device(void);