wcn36xx: Split mmio space into explicit regions
authorBjorn Andersson <bjorn.andersson@linaro.org>
Mon, 20 Jun 2016 06:19:45 +0000 (23:19 -0700)
committerKalle Valo <kvalo@qca.qualcomm.com>
Fri, 8 Jul 2016 13:58:22 +0000 (16:58 +0300)
Split the wcnss mmio space into explicit regions for ccu and dxe and
acquire these from the node referenced by the qcom,mmio phandle.

Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/wcn36xx/dxe.c
drivers/net/wireless/ath/wcn36xx/dxe.h
drivers/net/wireless/ath/wcn36xx/main.c
drivers/net/wireless/ath/wcn36xx/wcn36xx.h

index 8643801f31b6ec818886b1ca7749e4014e021a8b..a8ff454009823a719ce380ebd92c25d0aff2eb6e 100644 (file)
@@ -35,26 +35,27 @@ void *wcn36xx_dxe_get_next_bd(struct wcn36xx *wcn, bool is_low)
        return ch->head_blk_ctl->bd_cpu_addr;
 }
 
+static void wcn36xx_ccu_write_register(struct wcn36xx *wcn, int addr, int data)
+{
+       wcn36xx_dbg(WCN36XX_DBG_DXE,
+                   "wcn36xx_ccu_write_register: addr=%x, data=%x\n",
+                   addr, data);
+
+       writel(data, wcn->ccu_base + addr);
+}
+
 static void wcn36xx_dxe_write_register(struct wcn36xx *wcn, int addr, int data)
 {
        wcn36xx_dbg(WCN36XX_DBG_DXE,
                    "wcn36xx_dxe_write_register: addr=%x, data=%x\n",
                    addr, data);
 
-       writel(data, wcn->mmio + addr);
+       writel(data, wcn->dxe_base + addr);
 }
 
-#define wcn36xx_dxe_write_register_x(wcn, reg, reg_data)                \
-do {                                                                    \
-       if (wcn->chip_version == WCN36XX_CHIP_3680)                      \
-               wcn36xx_dxe_write_register(wcn, reg ## _3680, reg_data); \
-       else                                                             \
-               wcn36xx_dxe_write_register(wcn, reg ## _3660, reg_data); \
-} while (0)                                                             \
-
 static void wcn36xx_dxe_read_register(struct wcn36xx *wcn, int addr, int *data)
 {
-       *data = readl(wcn->mmio + addr);
+       *data = readl(wcn->dxe_base + addr);
 
        wcn36xx_dbg(WCN36XX_DBG_DXE,
                    "wcn36xx_dxe_read_register: addr=%x, data=%x\n",
@@ -703,7 +704,10 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn)
 
        /* Setting interrupt path */
        reg_data = WCN36XX_DXE_CCU_INT;
-       wcn36xx_dxe_write_register_x(wcn, WCN36XX_DXE_REG_CCU_INT, reg_data);
+       if (wcn->chip_version == WCN36XX_CHIP_3680)
+               wcn36xx_ccu_write_register(wcn, WCN36XX_DXE_REG_CCU_INT_3680, reg_data);
+       else
+               wcn36xx_ccu_write_register(wcn, WCN36XX_DXE_REG_CCU_INT_3660, reg_data);
 
        /***************************************/
        /* Init descriptors for TX LOW channel */
index 3eca4f9594f2a3a3c638996fd13daae66e473283..012b59f4f91b58979677b3feb4d7a700b705e9e2 100644 (file)
@@ -28,11 +28,11 @@ H2H_TEST_RX_TX = DMA2
 */
 
 /* DXE registers */
-#define WCN36XX_DXE_MEM_REG                    0x202000
+#define WCN36XX_DXE_MEM_REG                    0
 
 #define WCN36XX_DXE_CCU_INT                    0xA0011
-#define WCN36XX_DXE_REG_CCU_INT_3660           0x200b10
-#define WCN36XX_DXE_REG_CCU_INT_3680           0x2050dc
+#define WCN36XX_DXE_REG_CCU_INT_3660           0x310
+#define WCN36XX_DXE_REG_CCU_INT_3680           0x10dc
 
 /* TODO This must calculated properly but not hardcoded */
 #define WCN36XX_DXE_CTRL_TX_L                  0x328a44
index a920d70201481379b769ef5d046caf8b55dd7ac4..8146eeba44587e8f7ec6a58cd632014b75555368 100644 (file)
@@ -19,6 +19,8 @@
 #include <linux/module.h>
 #include <linux/firmware.h>
 #include <linux/platform_device.h>
+#include <linux/of_address.h>
+#include <linux/of_device.h>
 #include "wcn36xx.h"
 
 unsigned int wcn36xx_dbg_mask;
@@ -1064,7 +1066,11 @@ static int wcn36xx_init_ieee80211(struct wcn36xx *wcn)
 static int wcn36xx_platform_get_resources(struct wcn36xx *wcn,
                                          struct platform_device *pdev)
 {
+       struct device_node *mmio_node;
        struct resource *res;
+       int index;
+       int ret;
+
        /* Set TX IRQ */
        res = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
                                           "wcnss_wlantx_irq");
@@ -1083,19 +1089,38 @@ static int wcn36xx_platform_get_resources(struct wcn36xx *wcn,
        }
        wcn->rx_irq = res->start;
 
-       /* Map the memory */
-       res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
-                                                "wcnss_mmio");
-       if (!res) {
-               wcn36xx_err("failed to get mmio\n");
-               return -ENOENT;
+       mmio_node = of_parse_phandle(pdev->dev.parent->of_node, "qcom,mmio", 0);
+       if (!mmio_node) {
+               wcn36xx_err("failed to acquire qcom,mmio reference\n");
+               return -EINVAL;
+       }
+
+       /* Map the CCU memory */
+       index = of_property_match_string(mmio_node, "reg-names", "ccu");
+       wcn->ccu_base = of_iomap(mmio_node, index);
+       if (!wcn->ccu_base) {
+               wcn36xx_err("failed to map ccu memory\n");
+               ret = -ENOMEM;
+               goto put_mmio_node;
        }
-       wcn->mmio = ioremap(res->start, resource_size(res));
-       if (!wcn->mmio) {
-               wcn36xx_err("failed to map io memory\n");
-               return -ENOMEM;
+
+       /* Map the DXE memory */
+       index = of_property_match_string(mmio_node, "reg-names", "dxe");
+       wcn->dxe_base = of_iomap(mmio_node, index);
+       if (!wcn->dxe_base) {
+               wcn36xx_err("failed to map dxe memory\n");
+               ret = -ENOMEM;
+               goto unmap_ccu;
        }
+
+       of_node_put(mmio_node);
        return 0;
+
+unmap_ccu:
+       iounmap(wcn->ccu_base);
+put_mmio_node:
+       of_node_put(mmio_node);
+       return ret;
 }
 
 static int wcn36xx_probe(struct platform_device *pdev)
@@ -1138,7 +1163,8 @@ static int wcn36xx_probe(struct platform_device *pdev)
        return 0;
 
 out_unmap:
-       iounmap(wcn->mmio);
+       iounmap(wcn->ccu_base);
+       iounmap(wcn->dxe_base);
 out_wq:
        ieee80211_free_hw(hw);
 out_err:
@@ -1154,7 +1180,8 @@ static int wcn36xx_remove(struct platform_device *pdev)
        mutex_destroy(&wcn->hal_mutex);
 
        ieee80211_unregister_hw(hw);
-       iounmap(wcn->mmio);
+       iounmap(wcn->dxe_base);
+       iounmap(wcn->ccu_base);
        ieee80211_free_hw(hw);
 
        return 0;
index f6d8d14f13d1100c6b400877bf4e6f565f9fa1b0..845f2446a1b5d8768e4692b2832446031fe045d0 100644 (file)
@@ -202,7 +202,8 @@ struct wcn36xx {
        /* IRQs */
        int                     tx_irq;
        int                     rx_irq;
-       void __iomem            *mmio;
+       void __iomem            *ccu_base;
+       void __iomem            *dxe_base;
 
        struct wcn36xx_platform_ctrl_ops *ctrl_ops;
        /*