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

mdss provides a common interface for handling the interrupts.
Use this interface for mdp3 and dsi v2.

Change-Id: If9ca804359210211e037311a5de89666653d0a9a
Signed-off-by: Shivaraj Shetty <shivaraj@codeaurora.org>
This commit is contained in:
Shivaraj Shetty 2014-09-11 14:32:09 +05:30 committed by David Keitel
parent 75f891685a
commit cb838c2110
3 changed files with 97 additions and 14 deletions

View file

@ -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:

View file

@ -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,
0x0, "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;
}
@ -1891,6 +1931,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;
@ -1927,6 +1974,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();

View file

@ -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;