Ejemplo n.º 1
0
void sc_hwset_dst_addr(struct sc_dev *sc, struct sc_addr *addr)
{
	writel(addr->y, sc->regs + SCALER_DST_Y_BASE);
	writel(addr->cb, sc->regs + SCALER_DST_CB_BASE);
	if (!sc_ver_is_5a(sc))
		writel(addr->cr, sc->regs + SCALER_DST_CR_BASE);
}
Ejemplo n.º 2
0
void sc_hwset_int_en(struct sc_dev *sc, u32 enable)
{
	unsigned long cfg = readl(sc->regs + SCALER_INT_EN);
	int val;

	val = sc_ver_is_5a(sc) ? \
	      SCALER_INT_EN_FRAME_END : SCALER_INT_EN_ALL;

	if (enable)
		cfg |= val;
	else
		cfg &= ~val;

	writel(cfg, sc->regs + SCALER_INT_EN);
}
int sc_hwset_dst_image_format(struct sc_dev *sc, u32 pixelformat)
{
	unsigned long cfg = readl(sc->regs + SCALER_DST_CFG);
	bool is_rgb = false;

	cfg &= ~SCALER_CFG_FMT_MASK;

	switch (pixelformat) {
	case V4L2_PIX_FMT_RGB565:
		cfg |= SCALER_CFG_FMT_RGB565;
		is_rgb = true;
		break;
	case V4L2_PIX_FMT_RGB555X:
		cfg |= SCALER_CFG_FMT_ARGB1555;
		is_rgb = true;
		break;
	case V4L2_PIX_FMT_RGB444:
		cfg |= SCALER_CFG_FMT_ARGB4444;
		is_rgb = true;
		break;
	case V4L2_PIX_FMT_RGB32:
		cfg |= SCALER_CFG_FMT_ARGB8888;
		cfg |= SCALER_CFG_BYTE_SWAP;
		is_rgb = true;
		break;
	case V4L2_PIX_FMT_BGR32:
		cfg |= SCALER_CFG_FMT_ARGB8888;
		is_rgb = true;
		break;
	case V4L2_PIX_FMT_YUYV:
		cfg |= SCALER_CFG_FMT_YUYV;
		break;
	case V4L2_PIX_FMT_UYVY:
		cfg |= SCALER_CFG_FMT_UYVY;
		break;
	case V4L2_PIX_FMT_YVYU:
		cfg |= SCALER_CFG_FMT_YVYU;
		break;
	case V4L2_PIX_FMT_NV12:
		cfg |= SCALER_CFG_FMT_YCBCR420_2P;
		break;
	case V4L2_PIX_FMT_NV21:
		if (sc_ver_is_5a(sc)) {
			cfg |= SCALER_CFG_FMT_YCBCR420_2P;
			cfg |= SCALER_CFG_HWORD_SWAP;
		} else {
			cfg |= SCALER_CFG_FMT_YCRCB420_2P;
		}
		break;
	case V4L2_PIX_FMT_NV12M:
		cfg |= SCALER_CFG_FMT_YCBCR420_2P;
		break;
	case V4L2_PIX_FMT_NV21M:
		if (sc_ver_is_5a(sc)) {
			cfg |= SCALER_CFG_FMT_YCBCR420_2P;
			cfg |= SCALER_CFG_HWORD_SWAP;
		} else {
			cfg |= SCALER_CFG_FMT_YCRCB420_2P;
		}
		break;
	case V4L2_PIX_FMT_NV16:
		cfg |= SCALER_CFG_FMT_YCBCR422_2P;
		break;
	case V4L2_PIX_FMT_NV61:
		if (sc_ver_is_5a(sc)) {
			cfg |= SCALER_CFG_FMT_YCBCR422_2P;
			cfg |= SCALER_CFG_HWORD_SWAP;
		} else {
			cfg |= SCALER_CFG_FMT_YCRCB422_2P;
		}
		break;
	case V4L2_PIX_FMT_NV24:
		cfg |= SCALER_CFG_FMT_YCBCR444_2P;
		break;
	case V4L2_PIX_FMT_NV42:
		if (sc_ver_is_5a(sc)) {
			cfg |= SCALER_CFG_FMT_YCBCR444_2P;
			cfg |= SCALER_CFG_HWORD_SWAP;
		} else {
			cfg |= SCALER_CFG_FMT_YCRCB444_2P;
		}
		break;
	case V4L2_PIX_FMT_YUV420:
	case V4L2_PIX_FMT_YUV420M:
	case V4L2_PIX_FMT_YVU420:
	case V4L2_PIX_FMT_YVU420M:
		cfg |= SCALER_CFG_FMT_YCBCR420_3P;
		break;
	default:
		dev_err(sc->dev, "invalid pixelformat type\n");
		return -EINVAL;
	}
	writel(cfg, sc->regs + SCALER_DST_CFG);

	/*
	 * When output format is RGB,
	 * CSC_Y_OFFSET_DST_EN should be 0
	 * to avoid color distortion
	 */
	if (is_rgb) {
		cfg = readl(sc->regs + SCALER_CFG);
		cfg &= ~SCALER_CFG_CSC_Y_OFFSET_DST;
		writel(cfg, sc->regs + SCALER_CFG);
	}

	return 0;
}
int sc_hwset_src_image_format(struct sc_dev *sc, u32 pixelformat)
{
	unsigned long cfg = readl(sc->regs + SCALER_SRC_CFG);

	cfg &= ~SCALER_CFG_FMT_MASK;

	switch (pixelformat) {
	case V4L2_PIX_FMT_RGB565:
		cfg |= SCALER_CFG_FMT_RGB565;
		break;
	case V4L2_PIX_FMT_RGB555X:
		cfg |= SCALER_CFG_FMT_ARGB1555;
		break;
	case V4L2_PIX_FMT_RGB444:
		cfg |= SCALER_CFG_FMT_ARGB4444;
		break;
	case V4L2_PIX_FMT_RGB32:
		cfg |= SCALER_CFG_FMT_ARGB8888;
		cfg |= SCALER_CFG_BYTE_SWAP;
		break;
	case V4L2_PIX_FMT_BGR32:
		cfg |= SCALER_CFG_FMT_ARGB8888;
		break;
	case V4L2_PIX_FMT_YUYV:
		cfg |= SCALER_CFG_FMT_YUYV;
		break;
	case V4L2_PIX_FMT_UYVY:
		cfg |= SCALER_CFG_FMT_UYVY;
		break;
	case V4L2_PIX_FMT_YVYU:
		cfg |= SCALER_CFG_FMT_YVYU;
		break;
	case V4L2_PIX_FMT_NV12:
	case V4L2_PIX_FMT_NV12M:
		cfg |= SCALER_CFG_FMT_YCBCR420_2P;
		break;
	case V4L2_PIX_FMT_NV12MT_16X16:
		cfg |= SCALER_CFG_TILE_EN;
		cfg |= SCALER_CFG_FMT_YCBCR420_2P;
		break;
	case V4L2_PIX_FMT_NV21:
	case V4L2_PIX_FMT_NV21M:
		if (sc_ver_is_5a(sc)) {
			cfg |= SCALER_CFG_FMT_YCBCR420_2P;
			cfg |= SCALER_CFG_HWORD_SWAP;
		} else {
			cfg |= SCALER_CFG_FMT_YCRCB420_2P;
		}
		break;
	case V4L2_PIX_FMT_NV16:
		cfg |= SCALER_CFG_FMT_YCBCR422_2P;
		break;
	case V4L2_PIX_FMT_NV61:
		if (sc_ver_is_5a(sc)) {
			cfg |= SCALER_CFG_FMT_YCBCR422_2P;
			cfg |= SCALER_CFG_HWORD_SWAP;
		} else {
			cfg |= SCALER_CFG_FMT_YCRCB422_2P;
		}
		break;
	case V4L2_PIX_FMT_NV24:
		cfg |= SCALER_CFG_FMT_YCBCR444_2P;
		break;
	case V4L2_PIX_FMT_NV42:
		if (sc_ver_is_5a(sc)) {
			cfg |= SCALER_CFG_FMT_YCBCR444_2P;
			cfg |= SCALER_CFG_HWORD_SWAP;
		} else {
			cfg |= SCALER_CFG_FMT_YCRCB444_2P;
		}
		break;
	case V4L2_PIX_FMT_YUV420:
	case V4L2_PIX_FMT_YUV420M:
	case V4L2_PIX_FMT_YVU420:
	case V4L2_PIX_FMT_YVU420M:
		cfg |= SCALER_CFG_FMT_YCBCR420_3P;
		break;
	/* TODO: add L8A8 and L8 source format */
	default:
		dev_err(sc->dev, "invalid pixelformat type\n");
		return -EINVAL;
	}
	writel(cfg, sc->regs + SCALER_SRC_CFG);
	return 0;
}