static int rotator_dst_set_size(struct device *dev, int swap, struct drm_exynos_pos *pos, struct drm_exynos_sz *sz) { struct rot_context *rot = dev_get_drvdata(dev); u32 val, fmt, hsize, vsize; /* Get format */ fmt = rotator_reg_get_fmt(rot); if (!rotator_check_reg_fmt(fmt)) { DRM_ERROR("invalid format.\n"); return -EINVAL; } /* Align buffer size */ hsize = sz->hsize; vsize = sz->vsize; rotator_align_size(rot, fmt, &hsize, &vsize); /* Set buffer size configuration */ val = ROT_SET_BUF_SIZE_H(vsize) | ROT_SET_BUF_SIZE_W(hsize); rot_write(val, ROT_DST_BUF_SIZE); /* Set crop image position configuration */ val = ROT_CROP_POS_Y(pos->y) | ROT_CROP_POS_X(pos->x); rot_write(val, ROT_DST_CROP_POS); return 0; }
static void rotator_reg_set_dst_crop_pos(struct rot_context *rot, u32 x, u32 y) { u32 value = ROT_CROP_POS_Y(y) | ROT_CROP_POS_X(x); writel(value, rot->regs + ROT_DST_CROP_POS); }