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

Commit cbd0b535 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: mdss: Use the common interface for irq handling for mdp3"

parents fc574a2d 3b866a6e
Loading
Loading
Loading
Loading
+37 −6
Original line number Diff line number Diff line
@@ -38,7 +38,6 @@
#define DSI_MAX_BYTES_TO_READ 16

struct dsi_host_v2_private {
	int irq_no;
	unsigned char *dsi_base;
	size_t dsi_reg_size;
	struct device dis_dev;
@@ -168,7 +167,7 @@ static void msm_dsi_set_irq(struct mdss_dsi_ctrl_pdata *ctrl, u32 mask)
		return;
	}
	if (ctrl->dsi_irq_mask == 0) {
		enable_irq(dsi_host_private->irq_no);
		ctrl->mdss_util->enable_irq(ctrl->dsi_hw);
		pr_debug("%s: IRQ Enable, mask=%x term=%x\n", __func__,
			(int)ctrl->dsi_irq_mask, (int)mask);
	}
@@ -189,7 +188,7 @@ static void msm_dsi_clear_irq(struct mdss_dsi_ctrl_pdata *ctrl, u32 mask)
	}
	ctrl->dsi_irq_mask &= ~mask;
	if (ctrl->dsi_irq_mask == 0) {
		disable_irq(dsi_host_private->irq_no);
		ctrl->mdss_util->disable_irq(ctrl->dsi_hw);
		pr_debug("%s: IRQ Disable, mask=%x term=%x\n", __func__,
			(int)ctrl->dsi_irq_mask, (int)mask);
	}
@@ -243,6 +242,7 @@ int msm_dsi_irq_init(struct device *dev, int irq_no,
{
	int ret;
	u32 isr;
	struct mdss_hw *dsi_hw;

	msm_dsi_ahb_ctrl(1);
	isr = MIPI_INP(dsi_host_private->dsi_base + DSI_INT_CTRL);
@@ -256,8 +256,30 @@ int msm_dsi_irq_init(struct device *dev, int irq_no,
		pr_err("msm_dsi_irq_init request_irq() failed!\n");
		return ret;
	}
	dsi_host_private->irq_no = irq_no;
	disable_irq(irq_no);

	dsi_hw = kzalloc(sizeof(struct mdss_hw), GFP_KERNEL);
	if (!dsi_hw) {
		pr_err("no mem to save hw info: kzalloc fail\n");
		return -ENOMEM;
	}
	ctrl->dsi_hw = dsi_hw;

	dsi_hw->irq_info = kzalloc(sizeof(struct irq_info), GFP_KERNEL);
	if (!dsi_hw->irq_info) {
		kfree(dsi_hw);
		pr_err("no mem to save irq info: kzalloc fail\n");
		return -ENOMEM;
	}

	dsi_hw->hw_ndx = MDSS_HW_DSI0;
	dsi_hw->irq_info->irq = irq_no;
	dsi_hw->irq_info->irq_mask = 0;
	dsi_hw->irq_info->irq_ena = false;
	dsi_hw->irq_info->irq_buzy = false;

	ctrl->mdss_util->register_irq(ctrl->dsi_hw);
	ctrl->mdss_util->disable_irq(ctrl->dsi_hw);

	return 0;
}

@@ -1630,6 +1652,12 @@ static int msm_dsi_probe(struct platform_device *pdev)
		platform_set_drvdata(pdev, ctrl_pdata);
	}

	ctrl_pdata->mdss_util = mdss_get_util_intf();
	if (mdp3_res->mdss_util == NULL) {
		pr_err("Failed to get mdss utility functions\n");
		return -ENODEV;
	}

	mdss_dsi_mres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!mdss_dsi_mres) {
		pr_err("%s:%d unable to get the MDSS reg resources",
@@ -1723,7 +1751,7 @@ static int msm_dsi_probe(struct platform_device *pdev)
	if (rc) {
		dev_err(&pdev->dev, "%s: failed to init irq, rc=%d\n",
			__func__, rc);
		goto error_device_register;
		goto error_irq_init;
	}

	rc = dsi_panel_device_register_v2(pdev, ctrl_pdata);
@@ -1734,6 +1762,9 @@ static int msm_dsi_probe(struct platform_device *pdev)
	pr_debug("%s success\n", __func__);
	return 0;
error_device_register:
	kfree(ctrl_pdata->dsi_hw->irq_info);
	kfree(ctrl_pdata->dsi_hw);
error_irq_init:
	for (i = DSI_MAX_PM - 1; i >= 0; i--)
		msm_dsi_io_deinit(pdev, &(ctrl_pdata->power_data[i]));
error_io_init:
+57 −7
Original line number Diff line number Diff line
@@ -230,13 +230,15 @@ int mdp3_set_intr_callback(u32 type, struct mdp3_intr_cb *cb)
void mdp3_irq_register(void)
{
	unsigned long flag;
	struct mdss_hw *mdp3_hw;

	pr_debug("mdp3_irq_register\n");
	mdp3_hw = &mdp3_res->mdp3_hw;
	spin_lock_irqsave(&mdp3_res->irq_lock, flag);
	mdp3_res->irq_ref_cnt++;
	if (mdp3_res->irq_ref_cnt == 1) {
		MDP3_REG_WRITE(MDP3_REG_INTR_ENABLE, mdp3_res->irq_mask);
		enable_irq(mdp3_res->irq);
		mdp3_res->mdss_util->enable_irq(&mdp3_res->mdp3_hw);
	}
	spin_unlock_irqrestore(&mdp3_res->irq_lock, flag);
}
@@ -245,8 +247,10 @@ void mdp3_irq_deregister(void)
{
	unsigned long flag;
	bool irq_enabled = true;
	struct mdss_hw *mdp3_hw;

	pr_debug("mdp3_irq_deregister\n");
	mdp3_hw = &mdp3_res->mdp3_hw;
	spin_lock_irqsave(&mdp3_res->irq_lock, flag);
	memset(mdp3_res->irq_ref_count, 0, sizeof(u32) * MDP3_MAX_INTR);
	mdp3_res->irq_mask = 0;
@@ -258,7 +262,7 @@ void mdp3_irq_deregister(void)
		mdp3_res->irq_ref_cnt = 0;
	}
	if (mdp3_res->irq_ref_cnt == 0 && irq_enabled)
		disable_irq_nosync(mdp3_res->irq);
		mdp3_res->mdss_util->disable_irq_nosync(&mdp3_res->mdp3_hw);
	spin_unlock_irqrestore(&mdp3_res->irq_lock, flag);
}

@@ -266,8 +270,10 @@ void mdp3_irq_suspend(void)
{
	unsigned long flag;
	bool irq_enabled = true;
	struct mdss_hw *mdp3_hw;

	pr_debug("%s\n", __func__);
	mdp3_hw = &mdp3_res->mdp3_hw;
	spin_lock_irqsave(&mdp3_res->irq_lock, flag);
	mdp3_res->irq_ref_cnt--;
	if (mdp3_res->irq_ref_cnt < 0) {
@@ -276,7 +282,7 @@ void mdp3_irq_suspend(void)
	}
	if (mdp3_res->irq_ref_cnt == 0 && irq_enabled) {
		MDP3_REG_WRITE(MDP3_REG_INTR_ENABLE, 0);
		disable_irq_nosync(mdp3_res->irq);
		mdp3_res->mdss_util->disable_irq_nosync(&mdp3_res->mdp3_hw);
	}
	spin_unlock_irqrestore(&mdp3_res->irq_lock, flag);
}
@@ -674,16 +680,18 @@ int mdp3_put_mdp_dsi_clk(void)
static int mdp3_irq_setup(void)
{
	int ret;
	struct mdss_hw *mdp3_hw;

	mdp3_hw = &mdp3_res->mdp3_hw;
	ret = devm_request_irq(&mdp3_res->pdev->dev,
				mdp3_res->irq,
				mdp3_hw->irq_info->irq,
				mdp3_irq_handler,
				IRQF_DISABLED, "MDP", mdp3_res);
	if (ret) {
		pr_err("mdp request_irq() failed!\n");
		return ret;
	}
	disable_irq(mdp3_res->irq);
	mdp3_res->mdss_util->disable_irq_nosync(&mdp3_res->mdp3_hw);
	mdp3_res->irq_registered = true;
	return 0;
}
@@ -923,6 +931,9 @@ static int mdp3_res_init(void)

static void mdp3_res_deinit(void)
{
	struct mdss_hw *mdp3_hw;

	mdp3_hw = &mdp3_res->mdp3_hw;
	mdp3_bus_scale_unregister();
	mdp3_iommu_dettach(MDP3_IOMMU_CTX_MDP_0);
	mdp3_iommu_deinit();
@@ -933,7 +944,8 @@ static void mdp3_res_deinit(void)
	mdp3_clk_remove();

	if (mdp3_res->irq_registered)
		devm_free_irq(&mdp3_res->pdev->dev, mdp3_res->irq, mdp3_res);
		devm_free_irq(&mdp3_res->pdev->dev,
				mdp3_hw->irq_info->irq, mdp3_res);
}

static int mdp3_get_pan_intf(const char *pan_intf)
@@ -1065,6 +1077,28 @@ static int mdp3_get_cmdline_config(struct platform_device *pdev)
	return rc;
}


int mdp3_irq_init(u32 irq_start)
{
	struct mdss_hw *mdp3_hw;
	mdp3_hw = &mdp3_res->mdp3_hw;

	mdp3_hw->irq_info = kzalloc(sizeof(struct irq_info), GFP_KERNEL);
	if (!mdp3_hw->irq_info) {
		pr_err("no mem to save irq info: kzalloc fail\n");
		return -ENOMEM;
	}

	mdp3_hw->hw_ndx = MDSS_HW_MDP;
	mdp3_hw->irq_info->irq = irq_start;
	mdp3_hw->irq_info->irq_mask = 0;
	mdp3_hw->irq_info->irq_ena = false;
	mdp3_hw->irq_info->irq_buzy = false;

	mdp3_res->mdss_util->register_irq(&mdp3_res->mdp3_hw);
	return 0;
}

static int mdp3_parse_dt(struct platform_device *pdev)
{
	struct resource *res;
@@ -1095,12 +1129,18 @@ static int mdp3_parse_dt(struct platform_device *pdev)
		pr_err("unable to get MDSS irq\n");
		return -EINVAL;
	}
	mdp3_res->irq = res->start;
	rc = mdp3_irq_init(res->start);
	if (rc) {
		pr_err("%s: Error in irq initialization:rc=[%d]\n",
		       __func__, rc);
		return rc;
	}

	rc = mdp3_get_cmdline_config(pdev);
	if (rc) {
		pr_err("%s: Error in panel override:rc=[%d]\n",
		       __func__, rc);
		kfree(mdp3_res->mdp3_hw.irq_info);
		return rc;
	}

@@ -1892,6 +1932,13 @@ static int mdp3_probe(struct platform_device *pdev)
	spin_lock_init(&mdp3_res->irq_lock);
	platform_set_drvdata(pdev, mdp3_res);

	mdp3_res->mdss_util = mdss_get_util_intf();
	if (mdp3_res->mdss_util == NULL) {
		pr_err("Failed to get mdss utility functions\n");
		rc =  -ENODEV;
		goto get_util_fail;
	}

	rc = mdp3_parse_dt(pdev);
	if (rc)
		goto probe_done;
@@ -1928,6 +1975,9 @@ static int mdp3_probe(struct platform_device *pdev)
		pr_err("unable to configure interrupt callback\n");

probe_done:
	if (IS_ERR_VALUE(rc))
		kfree(mdp3_res->mdp3_hw.irq_info);
get_util_fail:
	if (IS_ERR_VALUE(rc)) {
		mdp3_res_deinit();

+3 −1
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@

#include "mdp3_dma.h"
#include "mdss_fb.h"
#include "mdss.h"

#define MDP_VSYNC_CLK_RATE	19200000
#define MDP_CORE_CLK_RATE	100000000
@@ -110,11 +111,12 @@ struct mdp3_hw_resource {
	int clock_ref_count[MDP3_MAX_CLK];
	unsigned long dma_core_clk_request;
	unsigned long ppp_core_clk_request;
	struct mdss_hw mdp3_hw;
	struct mdss_util_intf *mdss_util;

	char __iomem *mdp_base;
	size_t mdp_reg_size;

	u32 irq;
	struct mdp3_bus_handle_map *bus_handle;

	struct ion_client *ion_client;