Merge tag 'imx-drm-next-2016-11-10' of git://git.pengutronix.de/git/pza/linux into drm-next
imx-drm plane update cleanup, YUV formats - request modeset if plane offsets changed, only the plane base address can be changed without disabling the plane IDMAC channel. - cleanup of plane atomic_update - remove unused ipu_cpmem_set_yuv_planar function - support YUV 4:4:4, 4:2:2, NV12 and NV16 plane formats - not only mask interrupts during irq init, also clear them - remove a legacy check from imx-ldb - add support to set the CSI downsizing bits - silence an obnoxious warning during modeset * tag 'imx-drm-next-2016-11-10' of git://git.pengutronix.de/git/pza/linux: gpu: ipu-di: silence videomode logspam gpu: ipu-v3: add ipu_csi_set_downsize drm/imx: imx-ldb: remove unnecessary double disable check gpu: ipu-v3: initially clear all interrupts drm/imx: ipuv3-plane: add support for YUV 4:2:2 and 4:4:4, NV12, and NV16 formats gpu: ipu-v3: add YUV 4:4:4 support gpu: ipu-cpmem: remove unused ipu_cpmem_set_yuv_planar function drm/imx: ipuv3-plane: let drm_plane_state_to_ubo/vbo handle chroma subsampling other than 4:2:0 drm/imx: ipuv3-plane: merge ipu_plane_atomic_set_base into atomic_update drm/imx: ipuv3-plane: request modeset if plane offsets changed
This commit is contained in:
@@ -88,6 +88,8 @@ enum ipu_color_space ipu_drm_fourcc_to_colorspace(u32 drm_fourcc)
|
||||
case DRM_FORMAT_YVU420:
|
||||
case DRM_FORMAT_YUV422:
|
||||
case DRM_FORMAT_YVU422:
|
||||
case DRM_FORMAT_YUV444:
|
||||
case DRM_FORMAT_YVU444:
|
||||
case DRM_FORMAT_NV12:
|
||||
case DRM_FORMAT_NV21:
|
||||
case DRM_FORMAT_NV16:
|
||||
@@ -1284,8 +1286,11 @@ static int ipu_irq_init(struct ipu_soc *ipu)
|
||||
return ret;
|
||||
}
|
||||
|
||||
for (i = 0; i < IPU_NUM_IRQS; i += 32)
|
||||
/* Mask and clear all interrupts */
|
||||
for (i = 0; i < IPU_NUM_IRQS; i += 32) {
|
||||
ipu_cm_write(ipu, 0, IPU_INT_CTRL(i / 32));
|
||||
ipu_cm_write(ipu, ~unused[i / 32], IPU_INT_STAT(i / 32));
|
||||
}
|
||||
|
||||
for (i = 0; i < IPU_NUM_IRQS; i += 32) {
|
||||
gc = irq_get_domain_generic_chip(ipu->domain, i);
|
||||
|
@@ -417,42 +417,6 @@ void ipu_cpmem_set_yuv_planar_full(struct ipuv3_channel *ch,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ipu_cpmem_set_yuv_planar_full);
|
||||
|
||||
void ipu_cpmem_set_yuv_planar(struct ipuv3_channel *ch,
|
||||
u32 pixel_format, int stride, int height)
|
||||
{
|
||||
int fourcc, u_offset, v_offset;
|
||||
int uv_stride = 0;
|
||||
|
||||
fourcc = v4l2_pix_fmt_to_drm_fourcc(pixel_format);
|
||||
switch (fourcc) {
|
||||
case DRM_FORMAT_YUV420:
|
||||
uv_stride = stride / 2;
|
||||
u_offset = stride * height;
|
||||
v_offset = u_offset + (uv_stride * height / 2);
|
||||
break;
|
||||
case DRM_FORMAT_YVU420:
|
||||
uv_stride = stride / 2;
|
||||
v_offset = stride * height;
|
||||
u_offset = v_offset + (uv_stride * height / 2);
|
||||
break;
|
||||
case DRM_FORMAT_YUV422:
|
||||
uv_stride = stride / 2;
|
||||
u_offset = stride * height;
|
||||
v_offset = u_offset + (uv_stride * height);
|
||||
break;
|
||||
case DRM_FORMAT_NV12:
|
||||
case DRM_FORMAT_NV16:
|
||||
uv_stride = stride;
|
||||
u_offset = stride * height;
|
||||
v_offset = 0;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
ipu_cpmem_set_yuv_planar_full(ch, uv_stride, u_offset, v_offset);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ipu_cpmem_set_yuv_planar);
|
||||
|
||||
static const struct ipu_rgb def_xrgb_32 = {
|
||||
.red = { .offset = 16, .length = 8, },
|
||||
.green = { .offset = 8, .length = 8, },
|
||||
@@ -590,6 +554,13 @@ int ipu_cpmem_set_fmt(struct ipuv3_channel *ch, u32 drm_fourcc)
|
||||
/* burst size */
|
||||
ipu_ch_param_write_field(ch, IPU_FIELD_NPB, 31);
|
||||
break;
|
||||
case DRM_FORMAT_YUV444:
|
||||
case DRM_FORMAT_YVU444:
|
||||
/* pix format */
|
||||
ipu_ch_param_write_field(ch, IPU_FIELD_PFS, 0);
|
||||
/* burst size */
|
||||
ipu_ch_param_write_field(ch, IPU_FIELD_NPB, 31);
|
||||
break;
|
||||
case DRM_FORMAT_NV12:
|
||||
/* pix format */
|
||||
ipu_ch_param_write_field(ch, IPU_FIELD_PFS, 4);
|
||||
|
@@ -529,6 +529,22 @@ void ipu_csi_set_window(struct ipu_csi *csi, struct v4l2_rect *w)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ipu_csi_set_window);
|
||||
|
||||
void ipu_csi_set_downsize(struct ipu_csi *csi, bool horiz, bool vert)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 reg;
|
||||
|
||||
spin_lock_irqsave(&csi->lock, flags);
|
||||
|
||||
reg = ipu_csi_read(csi, CSI_OUT_FRM_CTRL);
|
||||
reg &= ~(CSI_HORI_DOWNSIZE_EN | CSI_VERT_DOWNSIZE_EN);
|
||||
reg |= (horiz ? CSI_HORI_DOWNSIZE_EN : 0) |
|
||||
(vert ? CSI_VERT_DOWNSIZE_EN : 0);
|
||||
ipu_csi_write(csi, reg, CSI_OUT_FRM_CTRL);
|
||||
|
||||
spin_unlock_irqrestore(&csi->lock, flags);
|
||||
}
|
||||
|
||||
void ipu_csi_set_test_generator(struct ipu_csi *csi, bool active,
|
||||
u32 r_value, u32 g_value, u32 b_value,
|
||||
u32 pix_clk)
|
||||
|
@@ -535,7 +535,7 @@ int ipu_di_adjust_videomode(struct ipu_di *di, struct videomode *mode)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dev_warn(di->ipu->dev, "videomode adapted for IPU restrictions\n");
|
||||
dev_dbg(di->ipu->dev, "videomode adapted for IPU restrictions\n");
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ipu_di_adjust_videomode);
|
||||
|
Reference in New Issue
Block a user