static int gsc_src_set_size(struct device *dev, int swap, struct drm_exynos_pos *pos, struct drm_exynos_sz *sz) { struct gsc_context *ctx = get_gsc_context(dev); struct drm_exynos_pos img_pos = *pos; struct gsc_scaler *sc = &ctx->sc; u32 cfg; DRM_DEBUG_KMS("swap[%d]x[%d]y[%d]w[%d]h[%d]\n", swap, pos->x, pos->y, pos->w, pos->h); if (swap) { img_pos.w = pos->h; img_pos.h = pos->w; } /* pixel offset */ cfg = (GSC_SRCIMG_OFFSET_X(img_pos.x) | GSC_SRCIMG_OFFSET_Y(img_pos.y)); gsc_write(cfg, GSC_SRCIMG_OFFSET); /* cropped size */ cfg = (GSC_CROPPED_WIDTH(img_pos.w) | GSC_CROPPED_HEIGHT(img_pos.h)); gsc_write(cfg, GSC_CROPPED_SIZE); DRM_DEBUG_KMS("hsize[%d]vsize[%d]\n", sz->hsize, sz->vsize); /* original size */ cfg = gsc_read(GSC_SRCIMG_SIZE); cfg &= ~(GSC_SRCIMG_HEIGHT_MASK | GSC_SRCIMG_WIDTH_MASK); cfg |= (GSC_SRCIMG_WIDTH(sz->hsize) | GSC_SRCIMG_HEIGHT(sz->vsize)); gsc_write(cfg, GSC_SRCIMG_SIZE); cfg = gsc_read(GSC_IN_CON); cfg &= ~GSC_IN_RGB_TYPE_MASK; DRM_DEBUG_KMS("width[%d]range[%d]\n", pos->w, sc->range); if (pos->w >= GSC_WIDTH_ITU_709) if (sc->range) cfg |= GSC_IN_RGB_HD_WIDE; else cfg |= GSC_IN_RGB_HD_NARROW; else if (sc->range) cfg |= GSC_IN_RGB_SD_WIDE; else cfg |= GSC_IN_RGB_SD_NARROW; gsc_write(cfg, GSC_IN_CON); return 0; }
void gsc_hw_set_in_size(struct gsc_ctx *ctx) { struct gsc_dev *dev = ctx->gsc_dev; struct gsc_frame *frame = &ctx->s_frame; u32 cfg; /* Set input pixel offset */ cfg = GSC_SRCIMG_OFFSET_X(frame->crop.left); cfg |= GSC_SRCIMG_OFFSET_Y(frame->crop.top); writel(cfg, dev->regs + GSC_SRCIMG_OFFSET); /* Set input original size */ cfg = GSC_SRCIMG_WIDTH(frame->f_width); cfg |= GSC_SRCIMG_HEIGHT(frame->f_height); writel(cfg, dev->regs + GSC_SRCIMG_SIZE); /* Set input cropped size */ cfg = GSC_CROPPED_WIDTH(frame->crop.width); cfg |= GSC_CROPPED_HEIGHT(frame->crop.height); writel(cfg, dev->regs + GSC_CROPPED_SIZE); }