Mediatek DRM Fixes for Linux 5.9

1. Fix scrolling of panel
 2. Remove duplicated include
 3. Use CPU when fail to get cmdq event
 4. Add missing put_device() call
 -----BEGIN PGP SIGNATURE-----
 
 iQJMBAABCgA2FiEEACwLKSDmq+9RDv5P4cpzo8lZTiQFAl9imVIYHGNodW5rdWFu
 Zy5odUBrZXJuZWwub3JnAAoJEOHKc6PJWU4klqMP/0/UfeYXFMPd6tPkRyCIv+wg
 FHVflGm+GjSU69vA33vjRxiSAM4rA6gbd2iyefumKcWYlix2u1AWddk8o4ctC3/r
 ZnNejvI+OWhVgPkR+83tstbBmAZFFMB1eWhtgOfW9/sG0DnDWcazzTlpDgwZVT+B
 CIOvT9WXc+uNaHEF+IzWaLv8/NKy7R4qE0JDkf/8KnILCC5YoMaMWF6U/ZDcpiNA
 MCKi8taq4IBsvoOYZ+JXDawUGVXzolmy/vNAAcH3odahUtYqMdzrffebJVgF+sfq
 MxjyM+e35xY+4dQ/i5KHtYe0H7lapsJgATyvjOdDjoYZ99iDHdd8kn+ISujFwRwK
 P3QM/tGX3bVyvGLar5WmAEfRWEJmk0A4Ss2S4ui6o++A96bKAfY9eW7NioBulxUm
 B8w7JA6Td0g2EdZrZUVLkeM7TdZ4w7Yhd9A5DgAOOToF2EcS8qE3PaASZvg3nBRL
 aXrZIOyETf4BZ1ctXHg0WH55AWGIFYsvQunMNiEOPIPRZI5BeYY7ZlBvLGgvCAP2
 wQlOXsQ5v1Rs1CLyVsU1rc+CHneyYbbU2VxRsfHALOw9W7Pc1J5aSJpyM03ADZmf
 ovBp0MwsXSza/dF0j4107ZG60yOOABI9VXo/plTHflqBQ4CPq201URx3IZbff4y3
 tW/X/Ugh+VpDKyzA6cTB
 =dNjI
 -----END PGP SIGNATURE-----

Merge tag 'mediatek-drm-fixes-5.9' of https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux into drm-fixes

Mediatek DRM Fixes for Linux 5.9

1. Fix scrolling of panel
2. Remove duplicated include
3. Use CPU when fail to get cmdq event
4. Add missing put_device() call

Signed-off-by: Dave Airlie <airlied@redhat.com>

From: Chun-Kuang Hu <chunkuang.hu@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20200916231724.30571-1-chunkuang.hu@kernel.org
This commit is contained in:
Dave Airlie 2020-09-18 08:51:58 +10:00
commit 1f08fde700
5 changed files with 49 additions and 26 deletions

View File

@ -831,13 +831,19 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
drm_crtc_index(&mtk_crtc->base)); drm_crtc_index(&mtk_crtc->base));
mtk_crtc->cmdq_client = NULL; mtk_crtc->cmdq_client = NULL;
} }
ret = of_property_read_u32_index(priv->mutex_node,
"mediatek,gce-events", if (mtk_crtc->cmdq_client) {
drm_crtc_index(&mtk_crtc->base), ret = of_property_read_u32_index(priv->mutex_node,
&mtk_crtc->cmdq_event); "mediatek,gce-events",
if (ret) drm_crtc_index(&mtk_crtc->base),
dev_dbg(dev, "mtk_crtc %d failed to get mediatek,gce-events property\n", &mtk_crtc->cmdq_event);
drm_crtc_index(&mtk_crtc->base)); if (ret) {
dev_dbg(dev, "mtk_crtc %d failed to get mediatek,gce-events property\n",
drm_crtc_index(&mtk_crtc->base));
cmdq_mbox_destroy(mtk_crtc->cmdq_client);
mtk_crtc->cmdq_client = NULL;
}
}
#endif #endif
return 0; return 0;
} }

View File

@ -496,6 +496,7 @@ int mtk_ddp_comp_init(struct device *dev, struct device_node *node,
#if IS_REACHABLE(CONFIG_MTK_CMDQ) #if IS_REACHABLE(CONFIG_MTK_CMDQ)
if (of_address_to_resource(node, 0, &res) != 0) { if (of_address_to_resource(node, 0, &res) != 0) {
dev_err(dev, "Missing reg in %s node\n", node->full_name); dev_err(dev, "Missing reg in %s node\n", node->full_name);
put_device(&larb_pdev->dev);
return -EINVAL; return -EINVAL;
} }
comp->regs_pa = res.start; comp->regs_pa = res.start;

View File

@ -27,7 +27,6 @@
#include "mtk_drm_crtc.h" #include "mtk_drm_crtc.h"
#include "mtk_drm_ddp.h" #include "mtk_drm_ddp.h"
#include "mtk_drm_ddp.h"
#include "mtk_drm_ddp_comp.h" #include "mtk_drm_ddp_comp.h"
#include "mtk_drm_drv.h" #include "mtk_drm_drv.h"
#include "mtk_drm_gem.h" #include "mtk_drm_gem.h"
@ -165,7 +164,7 @@ static int mtk_drm_kms_init(struct drm_device *drm)
ret = drmm_mode_config_init(drm); ret = drmm_mode_config_init(drm);
if (ret) if (ret)
return ret; goto put_mutex_dev;
drm->mode_config.min_width = 64; drm->mode_config.min_width = 64;
drm->mode_config.min_height = 64; drm->mode_config.min_height = 64;
@ -182,7 +181,7 @@ static int mtk_drm_kms_init(struct drm_device *drm)
ret = component_bind_all(drm->dev, drm); ret = component_bind_all(drm->dev, drm);
if (ret) if (ret)
return ret; goto put_mutex_dev;
/* /*
* We currently support two fixed data streams, each optional, * We currently support two fixed data streams, each optional,
@ -229,7 +228,7 @@ static int mtk_drm_kms_init(struct drm_device *drm)
} }
if (!dma_dev->dma_parms) { if (!dma_dev->dma_parms) {
ret = -ENOMEM; ret = -ENOMEM;
goto err_component_unbind; goto put_dma_dev;
} }
ret = dma_set_max_seg_size(dma_dev, (unsigned int)DMA_BIT_MASK(32)); ret = dma_set_max_seg_size(dma_dev, (unsigned int)DMA_BIT_MASK(32));
@ -256,9 +255,12 @@ static int mtk_drm_kms_init(struct drm_device *drm)
err_unset_dma_parms: err_unset_dma_parms:
if (private->dma_parms_allocated) if (private->dma_parms_allocated)
dma_dev->dma_parms = NULL; dma_dev->dma_parms = NULL;
put_dma_dev:
put_device(private->dma_dev);
err_component_unbind: err_component_unbind:
component_unbind_all(drm->dev, drm); component_unbind_all(drm->dev, drm);
put_mutex_dev:
put_device(private->mutex_dev);
return ret; return ret;
} }
@ -544,8 +546,13 @@ static int mtk_drm_probe(struct platform_device *pdev)
pm_runtime_disable(dev); pm_runtime_disable(dev);
err_node: err_node:
of_node_put(private->mutex_node); of_node_put(private->mutex_node);
for (i = 0; i < DDP_COMPONENT_ID_MAX; i++) for (i = 0; i < DDP_COMPONENT_ID_MAX; i++) {
of_node_put(private->comp_node[i]); of_node_put(private->comp_node[i]);
if (private->ddp_comp[i]) {
put_device(private->ddp_comp[i]->larb_dev);
private->ddp_comp[i] = NULL;
}
}
return ret; return ret;
} }

View File

@ -466,14 +466,13 @@ static void mtk_dsi_config_vdo_timing(struct mtk_dsi *dsi)
horizontal_sync_active_byte = (vm->hsync_len * dsi_tmp_buf_bpp - 10); horizontal_sync_active_byte = (vm->hsync_len * dsi_tmp_buf_bpp - 10);
if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE)
horizontal_backporch_byte = horizontal_backporch_byte = vm->hback_porch * dsi_tmp_buf_bpp;
(vm->hback_porch * dsi_tmp_buf_bpp - 10);
else else
horizontal_backporch_byte = ((vm->hback_porch + vm->hsync_len) * horizontal_backporch_byte = (vm->hback_porch + vm->hsync_len) *
dsi_tmp_buf_bpp - 10); dsi_tmp_buf_bpp;
data_phy_cycles = timing->lpx + timing->da_hs_prepare + data_phy_cycles = timing->lpx + timing->da_hs_prepare +
timing->da_hs_zero + timing->da_hs_exit + 3; timing->da_hs_zero + timing->da_hs_exit;
if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) { if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) {
if ((vm->hfront_porch + vm->hback_porch) * dsi_tmp_buf_bpp > if ((vm->hfront_porch + vm->hback_porch) * dsi_tmp_buf_bpp >

View File

@ -1507,25 +1507,30 @@ static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi *hdmi,
dev_err(dev, dev_err(dev,
"Failed to get system configuration registers: %d\n", "Failed to get system configuration registers: %d\n",
ret); ret);
return ret; goto put_device;
} }
hdmi->sys_regmap = regmap; hdmi->sys_regmap = regmap;
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
hdmi->regs = devm_ioremap_resource(dev, mem); hdmi->regs = devm_ioremap_resource(dev, mem);
if (IS_ERR(hdmi->regs)) if (IS_ERR(hdmi->regs)) {
return PTR_ERR(hdmi->regs); ret = PTR_ERR(hdmi->regs);
goto put_device;
}
remote = of_graph_get_remote_node(np, 1, 0); remote = of_graph_get_remote_node(np, 1, 0);
if (!remote) if (!remote) {
return -EINVAL; ret = -EINVAL;
goto put_device;
}
if (!of_device_is_compatible(remote, "hdmi-connector")) { if (!of_device_is_compatible(remote, "hdmi-connector")) {
hdmi->next_bridge = of_drm_find_bridge(remote); hdmi->next_bridge = of_drm_find_bridge(remote);
if (!hdmi->next_bridge) { if (!hdmi->next_bridge) {
dev_err(dev, "Waiting for external bridge\n"); dev_err(dev, "Waiting for external bridge\n");
of_node_put(remote); of_node_put(remote);
return -EPROBE_DEFER; ret = -EPROBE_DEFER;
goto put_device;
} }
} }
@ -1534,7 +1539,8 @@ static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi *hdmi,
dev_err(dev, "Failed to find ddc-i2c-bus node in %pOF\n", dev_err(dev, "Failed to find ddc-i2c-bus node in %pOF\n",
remote); remote);
of_node_put(remote); of_node_put(remote);
return -EINVAL; ret = -EINVAL;
goto put_device;
} }
of_node_put(remote); of_node_put(remote);
@ -1542,10 +1548,14 @@ static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi *hdmi,
of_node_put(i2c_np); of_node_put(i2c_np);
if (!hdmi->ddc_adpt) { if (!hdmi->ddc_adpt) {
dev_err(dev, "Failed to get ddc i2c adapter by node\n"); dev_err(dev, "Failed to get ddc i2c adapter by node\n");
return -EINVAL; ret = -EINVAL;
goto put_device;
} }
return 0; return 0;
put_device:
put_device(hdmi->cec_dev);
return ret;
} }
/* /*