Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 05ddce49 authored by Bjorn Andersson's avatar Bjorn Andersson Committed by Kalle Valo
Browse files

wcn36xx: Split mmio space into explicit regions



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: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent 1c41fd5f
Loading
Loading
Loading
Loading
+15 −11
Original line number Diff line number Diff line
@@ -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 */
+3 −3
Original line number Diff line number Diff line
@@ -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
+39 −12
Original line number Diff line number Diff line
@@ -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;
+2 −1
Original line number Diff line number Diff line
@@ -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;
	/*