int fsl_dcu_drm_crtc_create(struct fsl_dcu_drm_device *fsl_dev) { struct drm_plane *primary; struct drm_crtc *crtc = &fsl_dev->crtc; unsigned int i, j, reg_num; int ret; primary = fsl_dcu_drm_primary_create_plane(fsl_dev->drm); ret = drm_crtc_init_with_planes(fsl_dev->drm, crtc, primary, NULL, &fsl_dcu_drm_crtc_funcs, NULL); if (ret < 0) return ret; drm_crtc_helper_add(crtc, &fsl_dcu_drm_crtc_helper_funcs); if (!strcmp(fsl_dev->soc->name, "ls1021a")) reg_num = LS1021A_LAYER_REG_NUM; else reg_num = VF610_LAYER_REG_NUM; for (i = 0; i <= fsl_dev->soc->total_layer; i++) { for (j = 0; j < reg_num; j++) { ret = regmap_write(fsl_dev->regmap, DCU_CTRLDESCLN(i, j), 0); if (ret) goto init_failed; } } ret = regmap_update_bits(fsl_dev->regmap, DCU_DCU_MODE, DCU_MODE_DCU_MODE_MASK, DCU_MODE_DCU_MODE(DCU_MODE_OFF)); if (ret) goto init_failed; ret = regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE, DCU_UPDATE_MODE_READREG); if (ret) goto init_failed; return 0; init_failed: dev_err(fsl_dev->dev, "init DCU register failed\n"); return ret; }
int fsl_dcu_drm_crtc_create(struct fsl_dcu_drm_device *fsl_dev) { struct drm_plane *primary; struct drm_crtc *crtc = &fsl_dev->crtc; int ret; fsl_dcu_drm_init_planes(fsl_dev->drm); primary = fsl_dcu_drm_primary_create_plane(fsl_dev->drm); if (!primary) return -ENOMEM; ret = drm_crtc_init_with_planes(fsl_dev->drm, crtc, primary, NULL, &fsl_dcu_drm_crtc_funcs, NULL); if (ret) { primary->funcs->destroy(primary); return ret; } drm_crtc_helper_add(crtc, &fsl_dcu_drm_crtc_helper_funcs); return 0; }