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:
parent
75f891685a
commit
cb838c2110
3 changed files with 97 additions and 14 deletions
|
@ -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:
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue