Loading drivers/video/msm/mdss/mdss.h +13 −4 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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; Loading Loading @@ -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 */ drivers/video/msm/mdss/mdss_debug.h +9 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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 */ drivers/video/msm/mdss/mdss_mdp.c +28 −41 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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; Loading @@ -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++; Loading Loading @@ -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; Loading Loading @@ -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; } Loading drivers/video/msm/mdss/mdss_mdp_ctl.c +7 −6 Original line number Diff line number Diff line Loading @@ -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]; } } Loading Loading @@ -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; } Loading drivers/video/msm/mdss/mdss_mdp_intf_video.c +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
drivers/video/msm/mdss/mdss.h +13 −4 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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; Loading Loading @@ -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 */
drivers/video/msm/mdss/mdss_debug.h +9 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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 */
drivers/video/msm/mdss/mdss_mdp.c +28 −41 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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; Loading @@ -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++; Loading Loading @@ -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; Loading Loading @@ -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; } Loading
drivers/video/msm/mdss/mdss_mdp_ctl.c +7 −6 Original line number Diff line number Diff line Loading @@ -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]; } } Loading Loading @@ -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; } Loading
drivers/video/msm/mdss/mdss_mdp_intf_video.c +1 −1 Original line number Diff line number Diff line Loading @@ -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