msm_mdss
struct msm_mdss;
struct msm_mdss *msm_mdss = irq_data_get_irq_chip_data(irqd);
clear_bit(irqd->hwirq, &msm_mdss->irq_controller.enabled_mask);
struct msm_mdss *msm_mdss = irq_data_get_irq_chip_data(irqd);
set_bit(irqd->hwirq, &msm_mdss->irq_controller.enabled_mask);
struct msm_mdss *msm_mdss = domain->host_data;
return irq_set_chip_data(irq, msm_mdss);
static int _msm_mdss_irq_domain_add(struct msm_mdss *msm_mdss)
dev = msm_mdss->dev;
domain = irq_domain_create_linear(dev_fwnode(dev), 32, &msm_mdss_irqdomain_ops, msm_mdss);
msm_mdss->irq_controller.enabled_mask = 0;
msm_mdss->irq_controller.domain = domain;
static void msm_mdss_setup_ubwc_dec_20(struct msm_mdss *msm_mdss)
const struct qcom_ubwc_cfg_data *data = msm_mdss->mdss_data;
writel_relaxed(value, msm_mdss->mmio + REG_MDSS_UBWC_STATIC);
static void msm_mdss_setup_ubwc_dec_30(struct msm_mdss *msm_mdss)
const struct qcom_ubwc_cfg_data *data = msm_mdss->mdss_data;
writel_relaxed(value, msm_mdss->mmio + REG_MDSS_UBWC_STATIC);
static void msm_mdss_setup_ubwc_dec_40(struct msm_mdss *msm_mdss)
const struct qcom_ubwc_cfg_data *data = msm_mdss->mdss_data;
writel_relaxed(value, msm_mdss->mmio + REG_MDSS_UBWC_STATIC);
writel_relaxed(1, msm_mdss->mmio + REG_MDSS_UBWC_CTRL_2);
writel_relaxed(0, msm_mdss->mmio + REG_MDSS_UBWC_PREDICTION_MODE);
writel_relaxed(3, msm_mdss->mmio + REG_MDSS_UBWC_CTRL_2);
writel_relaxed(2, msm_mdss->mmio + REG_MDSS_UBWC_CTRL_2);
writel_relaxed(1, msm_mdss->mmio + REG_MDSS_UBWC_PREDICTION_MODE);
static void msm_mdss_setup_ubwc_dec_50(struct msm_mdss *msm_mdss)
const struct qcom_ubwc_cfg_data *data = msm_mdss->mdss_data;
writel_relaxed(value, msm_mdss->mmio + REG_MDSS_UBWC_STATIC);
writel_relaxed(5, msm_mdss->mmio + REG_MDSS_UBWC_CTRL_2);
writel_relaxed(4, msm_mdss->mmio + REG_MDSS_UBWC_CTRL_2);
writel_relaxed(1, msm_mdss->mmio + REG_MDSS_UBWC_PREDICTION_MODE);
static int msm_mdss_enable(struct msm_mdss *msm_mdss)
for (i = 0; i < msm_mdss->num_mdp_paths; i++)
icc_set_bw(msm_mdss->mdp_path[i], 0, Bps_to_icc(MIN_IB_BW));
icc_set_bw(msm_mdss->reg_bus_path, 0,
msm_mdss->reg_bus_bw);
ret = clk_bulk_prepare_enable(msm_mdss->num_clocks, msm_mdss->clocks);
dev_err(msm_mdss->dev, "clock enable failed, ret:%d\n", ret);
if (msm_mdss->is_mdp5 || !msm_mdss->mdss_data)
switch (msm_mdss->mdss_data->ubwc_dec_version) {
msm_mdss_setup_ubwc_dec_20(msm_mdss);
msm_mdss_setup_ubwc_dec_30(msm_mdss);
msm_mdss_setup_ubwc_dec_40(msm_mdss);
msm_mdss_setup_ubwc_dec_50(msm_mdss);
msm_mdss_setup_ubwc_dec_50(msm_mdss);
dev_err(msm_mdss->dev, "Unsupported UBWC decoder version %x\n",
msm_mdss->mdss_data->ubwc_dec_version);
dev_err(msm_mdss->dev, "HW_REV: 0x%x\n",
readl_relaxed(msm_mdss->mmio + REG_MDSS_HW_VERSION));
dev_err(msm_mdss->dev, "UBWC_DEC_HW_VERSION: 0x%x\n",
readl_relaxed(msm_mdss->mmio + REG_MDSS_UBWC_DEC_HW_VERSION));
static int msm_mdss_disable(struct msm_mdss *msm_mdss)
clk_bulk_disable_unprepare(msm_mdss->num_clocks, msm_mdss->clocks);
for (i = 0; i < msm_mdss->num_mdp_paths; i++)
icc_set_bw(msm_mdss->mdp_path[i], 0, 0);
if (msm_mdss->reg_bus_path)
icc_set_bw(msm_mdss->reg_bus_path, 0, 0);
static void msm_mdss_destroy(struct msm_mdss *msm_mdss)
struct platform_device *pdev = to_platform_device(msm_mdss->dev);
pm_runtime_suspend(msm_mdss->dev);
pm_runtime_disable(msm_mdss->dev);
irq_domain_remove(msm_mdss->irq_controller.domain);
msm_mdss->irq_controller.domain = NULL;
static struct msm_mdss *msm_mdss_init(struct platform_device *pdev, bool is_mdp5)
struct msm_mdss *msm_mdss;
msm_mdss = devm_kzalloc(&pdev->dev, sizeof(*msm_mdss), GFP_KERNEL);
if (!msm_mdss)
msm_mdss->mdss_data = qcom_ubwc_config_get_data();
if (IS_ERR(msm_mdss->mdss_data))
return ERR_CAST(msm_mdss->mdss_data);
msm_mdss->reg_bus_bw = mdss_data->reg_bus_bw;
msm_mdss->mmio = devm_platform_ioremap_resource_byname(pdev, is_mdp5 ? "mdss_phys" : "mdss");
if (IS_ERR(msm_mdss->mmio))
return ERR_CAST(msm_mdss->mmio);
dev_dbg(&pdev->dev, "mapped mdss address space @%p\n", msm_mdss->mmio);
ret = msm_mdss_parse_data_bus_icc_path(&pdev->dev, msm_mdss);
ret = mdp5_mdss_parse_clock(pdev, &msm_mdss->clocks);
ret = devm_clk_bulk_get_all(&pdev->dev, &msm_mdss->clocks);
msm_mdss->num_clocks = ret;
msm_mdss->is_mdp5 = is_mdp5;
msm_mdss->dev = &pdev->dev;
ret = _msm_mdss_irq_domain_add(msm_mdss);
msm_mdss);
return msm_mdss;
struct msm_mdss *mdss = dev_get_drvdata(dev);
struct msm_mdss *mdss = dev_get_drvdata(dev);
struct msm_mdss *msm_mdss)
struct msm_mdss *mdss;
struct msm_mdss *mdss = platform_get_drvdata(pdev);
msm_mdss->mdp_path[0] = path0;
msm_mdss->num_mdp_paths = 1;
msm_mdss->mdp_path[1] = path1;
msm_mdss->num_mdp_paths++;
msm_mdss->reg_bus_path = reg_bus_path;
struct msm_mdss *msm_mdss = irq_desc_get_handler_data(desc);
interrupts = readl_relaxed(msm_mdss->mmio + REG_MDSS_HW_INTR_STATUS);
rc = generic_handle_domain_irq(msm_mdss->irq_controller.domain,
dev_err(msm_mdss->dev, "handle irq fail: irq=%lu rc=%d\n",