Loading drivers/video/msm/mdss/dsi_host_v2.c +37 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading @@ -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); } Loading Loading @@ -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); Loading @@ -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; } Loading Loading @@ -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", Loading Loading @@ -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); Loading @@ -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: Loading drivers/video/msm/mdss/mdp3.c +57 −7 Original line number Diff line number Diff line Loading @@ -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); } Loading @@ -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; Loading @@ -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); } Loading @@ -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) { Loading @@ -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); } Loading Loading @@ -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; } Loading Loading @@ -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(); Loading @@ -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) Loading Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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; Loading Loading @@ -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(); Loading drivers/video/msm/mdss/mdp3.h +3 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading
drivers/video/msm/mdss/dsi_host_v2.c +37 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading @@ -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); } Loading Loading @@ -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); Loading @@ -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; } Loading Loading @@ -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", Loading Loading @@ -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); Loading @@ -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: Loading
drivers/video/msm/mdss/mdp3.c +57 −7 Original line number Diff line number Diff line Loading @@ -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); } Loading @@ -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; Loading @@ -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); } Loading @@ -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) { Loading @@ -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); } Loading Loading @@ -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; } Loading Loading @@ -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(); Loading @@ -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) Loading Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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; Loading Loading @@ -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(); Loading
drivers/video/msm/mdss/mdp3.h +3 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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