Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/msm/dpu: support binding to the mdp5 devices

Existing MDP5 devices have slightly different bindings. The main
register region is called `mdp_phys' instead of `mdp'. Also vbif
register regions are a part of the parent, MDSS device. Add support for
handling this binding differences.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
Patchwork: https://patchwork.freedesktop.org/patch/577505/
Link: https://lore.kernel.org/r/20240208-fd-migrate-mdp5-v4-2-945d08ef3fa8@linaro.org

+93 -21
+77 -21
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
··· 1200 1200 return 0; 1201 1201 } 1202 1202 1203 + static int dpu_kms_mmap_mdp5(struct dpu_kms *dpu_kms) 1204 + { 1205 + struct platform_device *pdev = dpu_kms->pdev; 1206 + struct platform_device *mdss_dev; 1207 + int ret; 1208 + 1209 + if (!dev_is_platform(dpu_kms->pdev->dev.parent)) 1210 + return -EINVAL; 1211 + 1212 + mdss_dev = to_platform_device(dpu_kms->pdev->dev.parent); 1213 + 1214 + dpu_kms->mmio = msm_ioremap(pdev, "mdp_phys"); 1215 + if (IS_ERR(dpu_kms->mmio)) { 1216 + ret = PTR_ERR(dpu_kms->mmio); 1217 + DPU_ERROR("mdp register memory map failed: %d\n", ret); 1218 + dpu_kms->mmio = NULL; 1219 + return ret; 1220 + } 1221 + DRM_DEBUG("mapped dpu address space @%pK\n", dpu_kms->mmio); 1222 + 1223 + dpu_kms->vbif[VBIF_RT] = msm_ioremap_mdss(mdss_dev, 1224 + dpu_kms->pdev, 1225 + "vbif_phys"); 1226 + if (IS_ERR(dpu_kms->vbif[VBIF_RT])) { 1227 + ret = PTR_ERR(dpu_kms->vbif[VBIF_RT]); 1228 + DPU_ERROR("vbif register memory map failed: %d\n", ret); 1229 + dpu_kms->vbif[VBIF_RT] = NULL; 1230 + return ret; 1231 + } 1232 + 1233 + dpu_kms->vbif[VBIF_NRT] = msm_ioremap_mdss(mdss_dev, 1234 + dpu_kms->pdev, 1235 + "vbif_nrt_phys"); 1236 + if (IS_ERR(dpu_kms->vbif[VBIF_NRT])) { 1237 + dpu_kms->vbif[VBIF_NRT] = NULL; 1238 + DPU_DEBUG("VBIF NRT is not defined"); 1239 + } 1240 + 1241 + return 0; 1242 + } 1243 + 1244 + static int dpu_kms_mmap_dpu(struct dpu_kms *dpu_kms) 1245 + { 1246 + struct platform_device *pdev = dpu_kms->pdev; 1247 + int ret; 1248 + 1249 + dpu_kms->mmio = msm_ioremap(pdev, "mdp"); 1250 + if (IS_ERR(dpu_kms->mmio)) { 1251 + ret = PTR_ERR(dpu_kms->mmio); 1252 + DPU_ERROR("mdp register memory map failed: %d\n", ret); 1253 + dpu_kms->mmio = NULL; 1254 + return ret; 1255 + } 1256 + DRM_DEBUG("mapped dpu address space @%pK\n", dpu_kms->mmio); 1257 + 1258 + dpu_kms->vbif[VBIF_RT] = msm_ioremap(pdev, "vbif"); 1259 + if (IS_ERR(dpu_kms->vbif[VBIF_RT])) { 1260 + ret = PTR_ERR(dpu_kms->vbif[VBIF_RT]); 1261 + DPU_ERROR("vbif register memory map failed: %d\n", ret); 1262 + dpu_kms->vbif[VBIF_RT] = NULL; 1263 + return ret; 1264 + } 1265 + 1266 + dpu_kms->vbif[VBIF_NRT] = msm_ioremap_quiet(pdev, "vbif_nrt"); 1267 + if (IS_ERR(dpu_kms->vbif[VBIF_NRT])) { 1268 + dpu_kms->vbif[VBIF_NRT] = NULL; 1269 + DPU_DEBUG("VBIF NRT is not defined"); 1270 + } 1271 + 1272 + return 0; 1273 + } 1274 + 1203 1275 static int dpu_dev_probe(struct platform_device *pdev) 1204 1276 { 1205 1277 struct device *dev = &pdev->dev; ··· 1305 1233 1306 1234 dpu_kms->base.irq = irq; 1307 1235 1308 - dpu_kms->mmio = msm_ioremap(pdev, "mdp"); 1309 - if (IS_ERR(dpu_kms->mmio)) { 1310 - ret = PTR_ERR(dpu_kms->mmio); 1311 - DPU_ERROR("mdp register memory map failed: %d\n", ret); 1312 - dpu_kms->mmio = NULL; 1236 + if (of_device_is_compatible(dpu_kms->pdev->dev.of_node, "qcom,mdp5")) 1237 + ret = dpu_kms_mmap_mdp5(dpu_kms); 1238 + else 1239 + ret = dpu_kms_mmap_dpu(dpu_kms); 1240 + if (ret) 1313 1241 return ret; 1314 - } 1315 - DRM_DEBUG("mapped dpu address space @%pK\n", dpu_kms->mmio); 1316 - 1317 - dpu_kms->vbif[VBIF_RT] = msm_ioremap(pdev, "vbif"); 1318 - if (IS_ERR(dpu_kms->vbif[VBIF_RT])) { 1319 - ret = PTR_ERR(dpu_kms->vbif[VBIF_RT]); 1320 - DPU_ERROR("vbif register memory map failed: %d\n", ret); 1321 - dpu_kms->vbif[VBIF_RT] = NULL; 1322 - return ret; 1323 - } 1324 - 1325 - dpu_kms->vbif[VBIF_NRT] = msm_ioremap_quiet(pdev, "vbif_nrt"); 1326 - if (IS_ERR(dpu_kms->vbif[VBIF_NRT])) { 1327 - dpu_kms->vbif[VBIF_NRT] = NULL; 1328 - DPU_DEBUG("VBIF NRT is not defined"); 1329 - } 1330 1242 1331 1243 ret = dpu_kms_parse_data_bus_icc_path(dpu_kms); 1332 1244 if (ret)
+3
drivers/gpu/drm/msm/msm_drv.h
··· 476 476 void __iomem *msm_ioremap_size(struct platform_device *pdev, const char *name, 477 477 phys_addr_t *size); 478 478 void __iomem *msm_ioremap_quiet(struct platform_device *pdev, const char *name); 479 + void __iomem *msm_ioremap_mdss(struct platform_device *mdss_pdev, 480 + struct platform_device *dev, 481 + const char *name); 479 482 480 483 struct icc_path *msm_icc_get(struct device *dev, const char *name); 481 484
+13
drivers/gpu/drm/msm/msm_io_utils.c
··· 50 50 return clk; 51 51 } 52 52 53 + void __iomem *msm_ioremap_mdss(struct platform_device *mdss_pdev, 54 + struct platform_device *pdev, 55 + const char *name) 56 + { 57 + struct resource *res; 58 + 59 + res = platform_get_resource_byname(mdss_pdev, IORESOURCE_MEM, name); 60 + if (!res) 61 + return ERR_PTR(-EINVAL); 62 + 63 + return devm_ioremap_resource(&pdev->dev, res); 64 + } 65 + 53 66 static void __iomem *_msm_ioremap(struct platform_device *pdev, const char *name, 54 67 bool quiet, phys_addr_t *psize) 55 68 {