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

Commit 41efd125 authored by Adrian Salido-Moreno's avatar Adrian Salido-Moreno
Browse files

msm: mdss: refactor register space io remap to use common utility



Refactor MDSS and VBIF registers ioremap to go through common utility
functions and add API to allow adding any register base which uses
utility structure. Expose VBIF register base through this utility.

Change-Id: I97ca2db07e40b261abf1a46b427a373295886cb2
Signed-off-by: default avatarAdrian Salido-Moreno <adrianm@codeaurora.org>
parent 1fb7ca1e
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@
#include <linux/types.h>
#include <linux/workqueue.h>
#include <linux/irqreturn.h>

#include <linux/mdss_io_util.h>
#include <linux/msm_iommu_domains.h>

#include "mdss_panel.h"
@@ -118,9 +118,8 @@ struct mdss_data_type {
	u32 max_mdp_clk_rate;

	struct platform_device *pdev;
	char __iomem *mdss_base;
	size_t mdp_reg_size;
	char __iomem *vbif_base;
	struct dss_io_data mdss_io;
	struct dss_io_data vbif_io;
	char __iomem *mdp_base;

	struct mutex reg_lock;
@@ -281,4 +280,14 @@ static inline int mdss_get_sd_client_cnt(void)
	else
		return atomic_read(&mdss_res->sd_client_count);
}

#define MDSS_VBIF_WRITE(mdata, offset, value) \
		dss_reg_w(&mdata->vbif_io, offset, value, 0)
#define MDSS_VBIF_READ(mdata, offset) \
		dss_reg_r(&mdata->vbif_io, offset, 0)
#define MDSS_REG_WRITE(mdata, offset, value) \
		dss_reg_w(&mdata->mdss_io, offset, value, 0)
#define MDSS_REG_READ(mdata, offset) \
		dss_reg_r(&mdata->mdss_io, offset, 0)

#endif /* MDSS_H */
+9 −0
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@
#define MDSS_DEBUG_H

#include <stdarg.h>
#include <linux/mdss_io_util.h>

#include "mdss.h"
#include "mdss_mdp_trace.h"

@@ -106,4 +108,11 @@ static inline void mdss_dump_reg(char __iomem *base, int len) { }
static inline void mdss_dsi_debug_check_te(struct mdss_panel_data *pdata) { }
static inline void mdss_xlog_tout_handler(const char *name, ...) { }
#endif

static inline int mdss_debug_register_io(const char *name,
		struct dss_io_data *io_data)
{
	return mdss_debug_register_base(name, io_data->base, io_data->len);
}

#endif /* MDSS_DEBUG_H */
+28 −41
Original line number Diff line number Diff line
@@ -191,15 +191,15 @@ int mdss_mdp_vbif_axi_halt(struct mdss_data_type *mdata)
		idle_mask |= BIT(5);

	mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON);
	reg_val = readl_relaxed(mdata->vbif_base + MMSS_VBIF_AXI_HALT_CTRL1);
	reg_val = MDSS_VBIF_READ(mdata, MMSS_VBIF_AXI_HALT_CTRL1);

	is_idle = (reg_val & idle_mask) ? true : false;
	if (!is_idle) {
		pr_err("axi is not idle. halt_ctrl1=%d\n", reg_val);

		writel_relaxed(1, mdata->vbif_base + MMSS_VBIF_AXI_HALT_CTRL0);
		MDSS_VBIF_WRITE(mdata, MMSS_VBIF_AXI_HALT_CTRL0, 1);

		rc = readl_poll_timeout(mdata->vbif_base +
		rc = readl_poll_timeout(mdata->vbif_io.base +
			MMSS_VBIF_AXI_HALT_CTRL1, status, (status & idle_mask),
			1000, AXI_HALT_TIMEOUT_US);
		if (rc == -ETIMEDOUT)
@@ -207,7 +207,7 @@ int mdss_mdp_vbif_axi_halt(struct mdss_data_type *mdata)
		else
			pr_debug("VBIF axi is halted\n");

		writel_relaxed(0, mdata->vbif_base + MMSS_VBIF_AXI_HALT_CTRL0);
		MDSS_VBIF_WRITE(mdata, MMSS_VBIF_AXI_HALT_CTRL0, 0);
	}
	mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_OFF);

@@ -245,7 +245,7 @@ static inline int mdss_irq_dispatch(u32 hw_ndx, int irq, void *ptr)
static irqreturn_t mdss_irq_handler(int irq, void *ptr)
{
	struct mdss_data_type *mdata = ptr;
	u32 intr = readl_relaxed(mdata->mdss_base + MDSS_REG_HW_INTR_STATUS);
	u32 intr = MDSS_REG_READ(mdata, MDSS_REG_HW_INTR_STATUS);

	if (!mdata)
		return IRQ_NONE;
@@ -1131,7 +1131,8 @@ static int mdss_mdp_debug_init(struct mdss_data_type *mdata)
	if (rc)
		return rc;

	mdss_debug_register_base("mdp", mdata->mdss_base, mdata->mdp_reg_size);
	mdss_debug_register_io("mdp", &mdata->mdss_io);
	mdss_debug_register_io("vbif", &mdata->vbif_io);

	return 0;
}
@@ -1150,8 +1151,9 @@ static void mdss_hw_rev_init(struct mdss_data_type *mdata)
{
	if (mdata->mdp_rev)
		return;

	mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON);
	mdata->mdp_rev = readl_relaxed(mdata->mdss_base + MDSS_REG_HW_VERSION);
	mdata->mdp_rev = MDSS_REG_READ(mdata, MDSS_REG_HW_VERSION);
	pr_info_once("MDP Rev=%x\n", mdata->mdp_rev);
	mdss_mdp_max_zorder_init(mdata);
	mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_OFF);
@@ -1497,42 +1499,23 @@ static int mdss_mdp_probe(struct platform_device *pdev)
	mutex_init(&mdata->reg_lock);
	atomic_set(&mdata->sd_client_count, 0);

	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mdp_phys");
	if (!res) {
		pr_err("unable to get MDP base address\n");
		rc = -ENOMEM;
		goto probe_done;
	}

	mdata->mdp_reg_size = resource_size(res);
	mdata->mdss_base = devm_ioremap(&pdev->dev, res->start,
				       mdata->mdp_reg_size);
	if (unlikely(!mdata->mdss_base)) {
	rc = msm_dss_ioremap_byname(pdev, &mdata->mdss_io, "mdp_phys");
	if (rc) {
		pr_err("unable to map MDP base\n");
		rc = -ENOMEM;
		goto probe_done;
	}
	pr_info("MDSS HW Base phy_Address=0x%x virt=0x%x\n",
		(int) (unsigned long) res->start,
		(int) (unsigned long) mdata->mdss_base);
	pr_debug("MDSS HW Base addr=0x%x len=0x%x\n",
		(int) (unsigned long) mdata->mdss_io.base,
		mdata->mdss_io.len);

	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "vbif_phys");
	if (!res) {
		pr_err("unable to get MDSS VBIF base address\n");
		rc = -ENOMEM;
		goto probe_done;
	}

	mdata->vbif_base = devm_ioremap(&pdev->dev, res->start,
					resource_size(res));
	if (unlikely(!mdata->vbif_base)) {
	rc = msm_dss_ioremap_byname(pdev, &mdata->vbif_io, "vbif_phys");
	if (rc) {
		pr_err("unable to map MDSS VBIF base\n");
		rc = -ENOMEM;
		goto probe_done;
	}
	pr_info("MDSS VBIF HW Base phy_Address=0x%x virt=0x%x\n",
		(int) (unsigned long) res->start,
		(int) (unsigned long) mdata->vbif_base);
	pr_debug("MDSS VBIF HW Base addr=0x%x len=0x%x\n",
		(int) (unsigned long) mdata->vbif_io.base,
		mdata->vbif_io.len);

	res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
	if (!res) {
@@ -1606,7 +1589,7 @@ probe_done:
	return rc;
}

static void mdss_mdp_parse_dt_regs_array(const u32 *arr, char __iomem *hw_base,
static void mdss_mdp_parse_dt_regs_array(const u32 *arr, struct dss_io_data *io,
	struct mdss_hw_settings *hws, int count)
{
	u32 len, reg;
@@ -1617,7 +1600,10 @@ static void mdss_mdp_parse_dt_regs_array(const u32 *arr, char __iomem *hw_base,

	for (i = 0, len = count * 2; i < len; i += 2) {
		reg = be32_to_cpu(arr[i]);
		hws->reg = hw_base + reg;
		if (reg >= io->len)
			continue;

		hws->reg = io->base + reg;
		hws->val = be32_to_cpu(arr[i + 1]);
		pr_debug("reg: 0x%04x=0x%08x\n", reg, hws->val);
		hws++;
@@ -1655,8 +1641,9 @@ int mdss_mdp_parse_dt_hw_settings(struct platform_device *pdev)
	if (!hws)
		return -ENOMEM;

	mdss_mdp_parse_dt_regs_array(vbif_arr, mdata->vbif_base, hws, vbif_len);
	mdss_mdp_parse_dt_regs_array(mdp_arr, mdata->mdss_base,
	mdss_mdp_parse_dt_regs_array(vbif_arr, &mdata->vbif_io,
			hws, vbif_len);
	mdss_mdp_parse_dt_regs_array(mdp_arr, &mdata->mdss_io,
		hws + vbif_len, mdp_len);

	mdata->hw_settings = hws;
@@ -1736,7 +1723,7 @@ static int mdss_mdp_parse_dt(struct platform_device *pdev)
		pr_err("Error in device tree : mdp reg base\n");
		return rc;
	}
	mdata->mdp_base = mdata->mdss_base + data;
	mdata->mdp_base = mdata->mdss_io.base + data;
	return 0;
}

+7 −6
Original line number Diff line number Diff line
@@ -2530,12 +2530,13 @@ int mdss_mdp_mixer_addr_setup(struct mdss_data_type *mdata,

	for (i = 0; i < len; i++) {
		head[i].type = type;
		head[i].base = mdata->mdss_base + mixer_offsets[i];
		head[i].base = mdata->mdss_io.base + mixer_offsets[i];
		head[i].ref_cnt = 0;
		head[i].num = i;
		if (type == MDSS_MDP_MIXER_TYPE_INTF) {
			head[i].dspp_base = mdata->mdss_base + dspp_offsets[i];
			head[i].pingpong_base = mdata->mdss_base +
			head[i].dspp_base = mdata->mdss_io.base +
					dspp_offsets[i];
			head[i].pingpong_base = mdata->mdss_io.base +
					pingpong_offsets[i];
		}
	}
@@ -2597,8 +2598,8 @@ int mdss_mdp_ctl_addr_setup(struct mdss_data_type *mdata,

	for (i = 0; i < len; i++) {
		head[i].num = i;
		head[i].base = (mdata->mdss_base) + ctl_offsets[i];
		head[i].wb_base = (mdata->mdss_base) + wb_offsets[i];
		head[i].base = (mdata->mdss_io.base) + ctl_offsets[i];
		head[i].wb_base = (mdata->mdss_io.base) + wb_offsets[i];
		head[i].ref_cnt = 0;
	}

+1 −1
Original line number Diff line number Diff line
@@ -104,7 +104,7 @@ int mdss_mdp_video_addr_setup(struct mdss_data_type *mdata,
		return -ENOMEM;

	for (i = 0; i < count; i++) {
		head[i].base = mdata->mdss_base + offsets[i];
		head[i].base = mdata->mdss_io.base + offsets[i];
		pr_debug("adding Video Intf #%d offset=0x%x virt=%p\n", i,
				offsets[i], head[i].base);
		head[i].ref_cnt = 0;
Loading