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); }
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; }