From b209209acf4eec25c9dc8c7795431cf7709142e5 Mon Sep 17 00:00:00 2001 From: Hardik Kantilal Patel Date: Sun, 2 Mar 2014 07:53:52 -0800 Subject: wcnss: Memory map change for wcnss subsystem Read Pronto base address register from dtsi file. Change-Id: If895c75c5a153b6190a0a67c0bd6cd54a4e1a5bb CRs-fixed: 567674 Signed-off-by: Hardik Kantilal Patel --- drivers/net/wireless/wcnss/wcnss_vreg.c | 26 ++-- drivers/net/wireless/wcnss/wcnss_wlan.c | 265 ++++++++++++++++++++------------ 2 files changed, 180 insertions(+), 111 deletions(-) (limited to 'drivers/net') diff --git a/drivers/net/wireless/wcnss/wcnss_vreg.c b/drivers/net/wireless/wcnss/wcnss_vreg.c index 1955cfaf3409..eca1c3900a44 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-2014, 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 @@ -34,9 +34,6 @@ static DEFINE_MUTEX(list_lock); static DEFINE_SEMAPHORE(wcnss_power_on_lock); static int auto_detect; -#define MSM_RIVA_PHYS 0x03204000 -#define MSM_PRONTO_PHYS 0xfb21b000 - #define RIVA_PMU_OFFSET 0x28 #define PRONTO_PMU_OFFSET 0x1004 @@ -143,27 +140,28 @@ int xo_auto_detect(u32 reg) } } -static int configure_iris_xo(struct device *dev, bool use_48mhz_xo, int on, - int *iris_xo_set) +static int +configure_iris_xo(struct device *dev, + struct wcnss_wlan_config *cfg, + int on, int *iris_xo_set) { u32 reg = 0; u32 iris_reg = WCNSS_INVALID_IRIS_REG; int rc = 0; - int size = 0; int pmu_offset = 0; int spare_offset = 0; - unsigned long wcnss_phys_addr; void __iomem *pmu_conf_reg; void __iomem *spare_reg; void __iomem *iris_read_reg; struct clk *clk; struct clk *clk_rf = NULL; + bool use_48mhz_xo; + + use_48mhz_xo = cfg->use_48mhz_xo; if (wcnss_hardware_type() == WCNSS_PRONTO_HW) { - wcnss_phys_addr = MSM_PRONTO_PHYS; pmu_offset = PRONTO_PMU_OFFSET; spare_offset = PRONTO_SPARE_OFFSET; - size = 0x3000; clk = clk_get(dev, "xo"); if (IS_ERR(clk)) { @@ -172,10 +170,8 @@ static int configure_iris_xo(struct device *dev, bool use_48mhz_xo, int on, } } else { - wcnss_phys_addr = MSM_RIVA_PHYS; pmu_offset = RIVA_PMU_OFFSET; spare_offset = RIVA_SPARE_OFFSET; - size = SZ_256; clk = clk_get(dev, "cxo"); if (IS_ERR(clk)) { @@ -185,7 +181,7 @@ static int configure_iris_xo(struct device *dev, bool use_48mhz_xo, int on, } if (on) { - msm_wcnss_base = ioremap(wcnss_phys_addr, size); + msm_wcnss_base = cfg->msm_wcnss_base; if (!msm_wcnss_base) { pr_err("ioremap wcnss physical failed\n"); goto fail; @@ -512,14 +508,14 @@ int wcnss_wlan_power(struct device *dev, goto fail_iris_on; /* Configure IRIS XO */ - rc = configure_iris_xo(dev, cfg->use_48mhz_xo, + rc = configure_iris_xo(dev, cfg, WCNSS_WLAN_SWITCH_ON, iris_xo_set); if (rc) goto fail_iris_xo; up(&wcnss_power_on_lock); } else { - configure_iris_xo(dev, cfg->use_48mhz_xo, + configure_iris_xo(dev, cfg, WCNSS_WLAN_SWITCH_OFF, NULL); wcnss_iris_vregs_off(hw_type); wcnss_core_vregs_off(hw_type); diff --git a/drivers/net/wireless/wcnss/wcnss_wlan.c b/drivers/net/wireless/wcnss/wcnss_wlan.c index d12792ed27fb..af75b8af7f69 100644 --- a/drivers/net/wireless/wcnss/wcnss_wlan.c +++ b/drivers/net/wireless/wcnss/wcnss_wlan.c @@ -74,14 +74,9 @@ MODULE_PARM_DESC(do_not_cancel_vote, "Do not cancel votes for wcnss"); static DEFINE_SPINLOCK(reg_spinlock); -#define MSM_RIVA_PHYS 0x03204000 -#define MSM_PRONTO_PHYS 0xfb21b000 - #define RIVA_SPARE_OFFSET 0x0b4 #define RIVA_SUSPEND_BIT BIT(24) -#define MSM_RIVA_CCU_BASE 0x03200800 - #define CCU_RIVA_INVALID_ADDR_OFFSET 0x100 #define CCU_RIVA_LAST_ADDR0_OFFSET 0x104 #define CCU_RIVA_LAST_ADDR1_OFFSET 0x108 @@ -117,7 +112,6 @@ static DEFINE_SPINLOCK(reg_spinlock); #define PRONTO_PMU_COM_CSR_OFFSET 0x1040 #define PRONTO_PMU_SOFT_RESET_OFFSET 0x104C -#define MSM_PRONTO_A2XB_BASE 0xfb100400 #define A2XB_CFG_OFFSET 0x00 #define A2XB_INT_SRC_OFFSET 0x0c #define A2XB_TSTBUS_CTRL_OFFSET 0x14 @@ -135,19 +129,16 @@ static DEFINE_SPINLOCK(reg_spinlock); #define WCNSS_TSTBUS_CTRL_CTRL_CFG0 (0x00 << 28) #define WCNSS_TSTBUS_CTRL_CTRL_CFG1 (0x01 << 28) -#define MSM_PRONTO_CCPU_BASE 0xfb205050 #define CCU_PRONTO_INVALID_ADDR_OFFSET 0x08 #define CCU_PRONTO_LAST_ADDR0_OFFSET 0x0c #define CCU_PRONTO_LAST_ADDR1_OFFSET 0x10 #define CCU_PRONTO_LAST_ADDR2_OFFSET 0x14 -#define MSM_PRONTO_SAW2_BASE 0xfb219000 #define PRONTO_SAW2_SPM_STS_OFFSET 0x0c -#define MSM_PRONTO_PLL_BASE 0xfb21b1c0 #define PRONTO_PLL_STATUS_OFFSET 0x1c +#define PRONTO_PLL_MODE_OFFSET 0x1c0 -#define MSM_PRONTO_MCU_BASE 0xfb080c00 #define MCU_CBR_CCAHB_ERR_OFFSET 0x380 #define MCU_CBR_CAHB_ERR_OFFSET 0x384 #define MCU_CBR_CCAHB_TIMEOUT_OFFSET 0x388 @@ -161,13 +152,6 @@ static DEFINE_SPINLOCK(reg_spinlock); #define MCU_FDBR_CDAHB_TIMEOUT_OFFSET 0x3a8 #define MCU_FDBR_FDAHB_TIMEOUT_OFFSET 0x3ac -#define MSM_PRONTO_TXP_STATUS 0xfb08040c -#define MSM_PRONTO_TXP_PHY_ABORT 0xfb080488 -#define MSM_PRONTO_BRDG_ERR_SRC 0xfb080fb0 - -#define MSM_PRONTO_ALARMS_TXCTL 0xfb0120a8 -#define MSM_PRONTO_ALARMS_TACTL 0xfb012448 - #define WCNSS_DEF_WLAN_RX_BUFF_COUNT 1024 #define WCNSS_VBATT_THRESHOLD 3500000 #define WCNSS_VBATT_GUARD 200 @@ -2091,12 +2075,10 @@ wcnss_trigger_config(struct platform_device *pdev) { int ret; struct qcom_wcnss_opts *pdata; - unsigned long wcnss_phys_addr; - int size = 0; struct resource *res; int pil_retry = 0; int has_pronto_hw = of_property_read_bool(pdev->dev.of_node, - "qcom,has-pronto-hw"); + "qcom,has-pronto-hw"); if (of_property_read_u32(pdev->dev.of_node, "qcom,wlan-rx-buff-count", &penv->wlan_rx_buff_count)) { @@ -2113,7 +2095,7 @@ wcnss_trigger_config(struct platform_device *pdev) if (WCNSS_CONFIG_UNSPECIFIED == has_48mhz_xo) { if (has_pronto_hw) { has_48mhz_xo = of_property_read_bool(pdev->dev.of_node, - "qcom,has-48mhz-xo"); + "qcom,has-48mhz-xo"); } else { has_48mhz_xo = pdata->has_48mhz_xo; } @@ -2123,7 +2105,7 @@ wcnss_trigger_config(struct platform_device *pdev) if (WCNSS_CONFIG_UNSPECIFIED == has_autodetect_xo && has_pronto_hw) { has_autodetect_xo = of_property_read_bool(pdev->dev.of_node, - "qcom,has-autodetect-xo"); + "qcom,has-autodetect-xo"); } penv->thermal_mitigation = 0; @@ -2169,112 +2151,238 @@ wcnss_trigger_config(struct platform_device *pdev) wake_lock_init(&penv->wcnss_wake_lock, WAKE_LOCK_SUSPEND, "wcnss"); if (wcnss_hardware_type() == WCNSS_PRONTO_HW) { - size = 0x3000; - wcnss_phys_addr = MSM_PRONTO_PHYS; + res = platform_get_resource_byname(pdev, + IORESOURCE_MEM, "pronto_phy_base"); + if (!res) { + ret = -EIO; + pr_err("%s: resource pronto_phy_base failed\n", + __func__); + goto fail_ioremap; + } + penv->msm_wcnss_base = + devm_request_and_ioremap(&pdev->dev, res); } else { - wcnss_phys_addr = MSM_RIVA_PHYS; - size = SZ_256; + res = platform_get_resource_byname(pdev, + IORESOURCE_MEM, "riva_phy_base"); + if (!res) { + ret = -EIO; + pr_err("%s: resource riva_phy_base failed\n", + __func__); + goto fail_ioremap; + } + penv->msm_wcnss_base = + devm_request_and_ioremap(&pdev->dev, res); } - penv->msm_wcnss_base = ioremap(wcnss_phys_addr, size); if (!penv->msm_wcnss_base) { ret = -ENOMEM; pr_err("%s: ioremap wcnss physical failed\n", __func__); goto fail_ioremap; } + penv->wlan_config.msm_wcnss_base = penv->msm_wcnss_base; if (wcnss_hardware_type() == WCNSS_RIVA_HW) { - penv->riva_ccu_base = ioremap(MSM_RIVA_CCU_BASE, SZ_512); + res = platform_get_resource_byname(pdev, + IORESOURCE_MEM, "riva_ccu_base"); + if (!res) { + ret = -EIO; + pr_err("%s: resource riva_ccu_base failed\n", + __func__); + goto fail_ioremap; + } + penv->riva_ccu_base = + devm_request_and_ioremap(&pdev->dev, res); + if (!penv->riva_ccu_base) { ret = -ENOMEM; - pr_err("%s: ioremap wcnss physical failed\n", __func__); - goto fail_ioremap2; + pr_err("%s: ioremap riva ccu physical failed\n", + __func__); + goto fail_ioremap; } } else { - penv->pronto_a2xb_base = ioremap(MSM_PRONTO_A2XB_BASE, SZ_512); + res = platform_get_resource_byname(pdev, + IORESOURCE_MEM, "pronto_a2xb_base"); + if (!res) { + ret = -EIO; + pr_err("%s: resource pronto_a2xb_base failed\n", + __func__); + goto fail_ioremap; + } + penv->pronto_a2xb_base = + devm_request_and_ioremap(&pdev->dev, res); + if (!penv->pronto_a2xb_base) { ret = -ENOMEM; - pr_err("%s: ioremap wcnss physical failed\n", __func__); - goto fail_ioremap2; + pr_err("%s: ioremap pronto a2xb physical failed\n", + __func__); + goto fail_ioremap; + } + + res = platform_get_resource_byname(pdev, + IORESOURCE_MEM, "pronto_ccpu_base"); + if (!res) { + ret = -EIO; + pr_err("%s: resource pronto_ccpu_base failed\n", + __func__); + goto fail_ioremap; } - penv->pronto_ccpu_base = ioremap(MSM_PRONTO_CCPU_BASE, SZ_512); + penv->pronto_ccpu_base = + devm_request_and_ioremap(&pdev->dev, res); + if (!penv->pronto_ccpu_base) { ret = -ENOMEM; - pr_err("%s: ioremap wcnss physical failed\n", __func__); - goto fail_ioremap3; + pr_err("%s: ioremap pronto ccpu physical failed\n", + __func__); + goto fail_ioremap; } + /* for reset FIQ */ res = platform_get_resource_byname(penv->pdev, IORESOURCE_MEM, "wcnss_fiq"); if (!res) { dev_err(&pdev->dev, "insufficient irq mem resources\n"); ret = -ENOENT; - goto fail_ioremap4; + goto fail_ioremap; } penv->fiq_reg = ioremap_nocache(res->start, resource_size(res)); if (!penv->fiq_reg) { pr_err("wcnss: %s: ioremap_nocache() failed fiq_reg addr:%pr\n", __func__, &res->start); ret = -ENOMEM; - goto fail_ioremap4; + goto fail_ioremap; } - penv->pronto_saw2_base = ioremap_nocache(MSM_PRONTO_SAW2_BASE, - SZ_32); + + res = platform_get_resource_byname(pdev, + IORESOURCE_MEM, "pronto_saw2_base"); + if (!res) { + ret = -EIO; + pr_err("%s: resource pronto_saw2_base failed\n", + __func__); + goto fail_ioremap2; + } + penv->pronto_saw2_base = + devm_request_and_ioremap(&pdev->dev, res); + if (!penv->pronto_saw2_base) { pr_err("%s: ioremap wcnss physical(saw2) failed\n", __func__); ret = -ENOMEM; - goto fail_ioremap5; + goto fail_ioremap2; } - penv->pronto_pll_base = ioremap_nocache(MSM_PRONTO_PLL_BASE, - SZ_64); + + penv->pronto_pll_base = + penv->msm_wcnss_base + PRONTO_PLL_MODE_OFFSET; if (!penv->pronto_pll_base) { pr_err("%s: ioremap wcnss physical(pll) failed\n", __func__); ret = -ENOMEM; - goto fail_ioremap6; + goto fail_ioremap2; + } + + res = platform_get_resource_byname(pdev, + IORESOURCE_MEM, "wlan_tx_phy_aborts"); + if (!res) { + ret = -EIO; + pr_err("%s: resource wlan_tx_phy_aborts failed\n", + __func__); + goto fail_ioremap2; } + penv->wlan_tx_phy_aborts = + devm_request_and_ioremap(&pdev->dev, res); - penv->wlan_tx_phy_aborts = ioremap(MSM_PRONTO_TXP_PHY_ABORT, - SZ_8); if (!penv->wlan_tx_phy_aborts) { ret = -ENOMEM; pr_err("%s: ioremap wlan TX PHY failed\n", __func__); - goto fail_ioremap7; + goto fail_ioremap2; } - penv->wlan_brdg_err_source = ioremap(MSM_PRONTO_BRDG_ERR_SRC, - SZ_8); + + res = platform_get_resource_byname(pdev, + IORESOURCE_MEM, "wlan_brdg_err_source"); + if (!res) { + ret = -EIO; + pr_err("%s: resource wlan_brdg_err_source failed\n", + __func__); + goto fail_ioremap2; + } + penv->wlan_brdg_err_source = + devm_request_and_ioremap(&pdev->dev, res); + if (!penv->wlan_brdg_err_source) { ret = -ENOMEM; pr_err("%s: ioremap wlan BRDG ERR failed\n", __func__); - goto fail_ioremap8; + goto fail_ioremap2; } - penv->wlan_tx_status = ioremap(MSM_PRONTO_TXP_STATUS, SZ_8); + + res = platform_get_resource_byname(pdev, + IORESOURCE_MEM, "wlan_tx_status"); + if (!res) { + ret = -EIO; + pr_err("%s: resource wlan_tx_status failed\n", + __func__); + goto fail_ioremap2; + } + penv->wlan_tx_status = + devm_request_and_ioremap(&pdev->dev, res); + if (!penv->wlan_tx_status) { ret = -ENOMEM; pr_err("%s: ioremap wlan TX STATUS failed\n", __func__); - goto fail_ioremap9; + goto fail_ioremap2; + } + + res = platform_get_resource_byname(pdev, + IORESOURCE_MEM, "alarms_txctl"); + if (!res) { + ret = -EIO; + pr_err("%s: resource alarms_txctl failed\n", + __func__); + goto fail_ioremap2; } - penv->alarms_txctl = ioremap(MSM_PRONTO_ALARMS_TXCTL, SZ_8); + penv->alarms_txctl = + devm_request_and_ioremap(&pdev->dev, res); + if (!penv->alarms_txctl) { ret = -ENOMEM; pr_err("%s: ioremap alarms TXCTL failed\n", __func__); - goto fail_ioremap10; + goto fail_ioremap2; + } + + res = platform_get_resource_byname(pdev, + IORESOURCE_MEM, "alarms_tactl"); + if (!res) { + ret = -EIO; + pr_err("%s: resource alarms_tactl failed\n", + __func__); + goto fail_ioremap2; } - penv->alarms_tactl = ioremap(MSM_PRONTO_ALARMS_TACTL, SZ_8); + penv->alarms_tactl = + devm_request_and_ioremap(&pdev->dev, res); + if (!penv->alarms_tactl) { ret = -ENOMEM; pr_err("%s: ioremap alarms TACTL failed\n", __func__); - goto fail_ioremap11; + goto fail_ioremap2; + } + + res = platform_get_resource_byname(pdev, + IORESOURCE_MEM, "pronto_mcu_base"); + if (!res) { + ret = -EIO; + pr_err("%s: resource pronto_mcu_base failed\n", + __func__); + goto fail_ioremap2; } - penv->pronto_mcu_base = ioremap(MSM_PRONTO_MCU_BASE, SZ_1K); + penv->pronto_mcu_base = + devm_request_and_ioremap(&pdev->dev, res); + if (!penv->pronto_mcu_base) { ret = -ENOMEM; - pr_err("%s: ioremap wcnss physical(mcu) failed\n", + pr_err("%s: ioremap pronto mcu physical failed\n", __func__); - goto fail_ioremap12; + goto fail_ioremap2; } } + penv->adc_tm_dev = qpnp_get_adc_tm(&penv->pdev->dev, "wcnss"); if (IS_ERR(penv->adc_tm_dev)) { pr_err("%s: adc get failed\n", __func__); @@ -2296,49 +2404,14 @@ wcnss_trigger_config(struct platform_device *pdev) if (pil_retry >= WCNSS_MAX_PIL_RETRY) { penv->pil = NULL; - goto fail_pil; + goto fail_ioremap2; } return 0; -fail_pil: - if (penv->riva_ccu_base) - iounmap(penv->riva_ccu_base); - if (penv->pronto_mcu_base) - iounmap(penv->pronto_mcu_base); -fail_ioremap12: - if (penv->alarms_tactl) - iounmap(penv->alarms_tactl); -fail_ioremap11: - if (penv->alarms_txctl) - iounmap(penv->alarms_txctl); -fail_ioremap10: - if (penv->wlan_tx_status) - iounmap(penv->wlan_tx_status); -fail_ioremap9: - if (penv->wlan_brdg_err_source) - iounmap(penv->wlan_brdg_err_source); -fail_ioremap8: - if (penv->wlan_tx_phy_aborts) - iounmap(penv->wlan_tx_phy_aborts); -fail_ioremap7: - if (penv->pronto_pll_base) - iounmap(penv->pronto_pll_base); -fail_ioremap6: - if (penv->pronto_saw2_base) - iounmap(penv->pronto_saw2_base); -fail_ioremap5: +fail_ioremap2: if (penv->fiq_reg) iounmap(penv->fiq_reg); -fail_ioremap4: - if (penv->pronto_ccpu_base) - iounmap(penv->pronto_ccpu_base); -fail_ioremap3: - if (penv->pronto_a2xb_base) - iounmap(penv->pronto_a2xb_base); -fail_ioremap2: - if (penv->msm_wcnss_base) - iounmap(penv->msm_wcnss_base); fail_ioremap: wake_lock_destroy(&penv->wcnss_wake_lock); fail_res: -- cgit v1.2.3