On Tue, 2021-01-05 at 17:27 +0200, Laurent Pinchart wrote: > The imx_media_video_dev structure stores the active format on the video > node in an instance of v4l2_format. This wastes memory when all we need > is the information contained in the smaller v4l2_pix_format > sub-structure. Replace v4l2_format by v4l2_pix_format to save memory. > > Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> > --- > drivers/staging/media/imx/imx-ic-prpencvf.c | 15 +++++-------- > drivers/staging/media/imx/imx-media-capture.c | 22 +++++++++---------- > drivers/staging/media/imx/imx-media-csi.c | 11 ++++------ > drivers/staging/media/imx/imx-media-vdic.c | 2 +- > drivers/staging/media/imx/imx-media.h | 2 +- > drivers/staging/media/imx/imx7-media-csi.c | 7 +++--- > 6 files changed, 25 insertions(+), 34 deletions(-) > > diff --git a/drivers/staging/media/imx/imx-ic-prpencvf.c b/drivers/staging/media/imx/imx-ic-prpencvf.c > index 47df1a5a1ae8..adb1a09e59d2 100644 > --- a/drivers/staging/media/imx/imx-ic-prpencvf.c > +++ b/drivers/staging/media/imx/imx-ic-prpencvf.c > @@ -204,7 +204,7 @@ static void prp_vb2_buf_done(struct prp_priv *priv, struct ipuv3_channel *ch) > > done = priv->active_vb2_buf[priv->ipu_buf_num]; > if (done) { > - done->vbuf.field = vdev->fmt.fmt.pix.field; > + done->vbuf.field = vdev->fmt.field; > done->vbuf.sequence = priv->frame_sequence; > vb = &done->vbuf.vb2_buf; > vb->timestamp = ktime_get_ns(); > @@ -229,7 +229,7 @@ static void prp_vb2_buf_done(struct prp_priv *priv, struct ipuv3_channel *ch) > ipu_idmac_clear_buffer(ch, priv->ipu_buf_num); > > if (priv->interweave_swap && ch == priv->out_ch) > - phys += vdev->fmt.fmt.pix.bytesperline; > + phys += vdev->fmt.bytesperline; > > ipu_cpmem_set_buffer(ch, priv->ipu_buf_num, phys); > } > @@ -362,7 +362,7 @@ static int prp_setup_channel(struct prp_priv *priv, > ipu_cpmem_zero(channel); > > memset(&image, 0, sizeof(image)); > - image.pix = vdev->fmt.fmt.pix; > + image.pix = vdev->fmt; > image.rect = vdev->compose; > > /* > @@ -457,7 +457,7 @@ static int prp_setup_rotation(struct prp_priv *priv) > int ret; > > infmt = &priv->format_mbus[PRPENCVF_SINK_PAD]; > - outfmt = &vdev->fmt.fmt.pix; > + outfmt = &vdev->fmt; > incc = priv->cc[PRPENCVF_SINK_PAD]; > outcc = vdev->cc; > > @@ -586,7 +586,7 @@ static int prp_setup_norotation(struct prp_priv *priv) > int ret; > > infmt = &priv->format_mbus[PRPENCVF_SINK_PAD]; > - outfmt = &vdev->fmt.fmt.pix; > + outfmt = &vdev->fmt; > incc = priv->cc[PRPENCVF_SINK_PAD]; > outcc = vdev->cc; > > @@ -665,17 +665,14 @@ static int prp_start(struct prp_priv *priv) > { > struct imx_ic_priv *ic_priv = priv->ic_priv; > struct imx_media_video_dev *vdev = priv->vdev; > - struct v4l2_pix_format *outfmt; > int ret; > > ret = prp_get_ipu_resources(priv); > if (ret) > return ret; > > - outfmt = &vdev->fmt.fmt.pix; > - > ret = imx_media_alloc_dma_buf(ic_priv->ipu_dev, &priv->underrun_buf, > - outfmt->sizeimage); > + vdev->fmt.sizeimage); > if (ret) > goto out_put_ipu; > > diff --git a/drivers/staging/media/imx/imx-media-capture.c b/drivers/staging/media/imx/imx-media-capture.c > index 335cb74baa4c..f778d9588eb3 100644 > --- a/drivers/staging/media/imx/imx-media-capture.c > +++ b/drivers/staging/media/imx/imx-media-capture.c > @@ -189,7 +189,7 @@ static int capture_g_fmt_vid_cap(struct file *file, void *fh, > { > struct capture_priv *priv = video_drvdata(file); > > - *f = priv->vdev.fmt; > + f->fmt.pix = priv->vdev.fmt; > > return 0; > } > @@ -294,7 +294,7 @@ static int capture_s_fmt_vid_cap(struct file *file, void *fh, > if (ret) > return ret; > > - priv->vdev.fmt.fmt.pix = f->fmt.pix; > + priv->vdev.fmt = f->fmt.pix; > > return 0; > } > @@ -343,8 +343,8 @@ static int capture_g_selection(struct file *file, void *fh, > */ > s->r.left = 0; > s->r.top = 0; > - s->r.width = priv->vdev.fmt.fmt.pix.width; > - s->r.height = priv->vdev.fmt.fmt.pix.height; > + s->r.width = priv->vdev.fmt.width; > + s->r.height = priv->vdev.fmt.height; > break; > default: > return -EINVAL; > @@ -458,7 +458,7 @@ static int capture_queue_setup(struct vb2_queue *vq, > struct device *alloc_devs[]) > { > struct capture_priv *priv = vb2_get_drv_priv(vq); > - struct v4l2_pix_format *pix = &priv->vdev.fmt.fmt.pix; > + struct v4l2_pix_format *pix = &priv->vdev.fmt; > unsigned int count = *nbuffers; > > if (vq->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) > @@ -497,7 +497,7 @@ static int capture_buf_prepare(struct vb2_buffer *vb) > { > struct vb2_queue *vq = vb->vb2_queue; > struct capture_priv *priv = vb2_get_drv_priv(vq); > - struct v4l2_pix_format *pix = &priv->vdev.fmt.fmt.pix; > + struct v4l2_pix_format *pix = &priv->vdev.fmt; > > if (vb2_plane_size(vb, 0) < pix->sizeimage) { > dev_err(priv->dev, > @@ -544,8 +544,8 @@ static int capture_validate_fmt(struct capture_priv *priv) > if (ret) > return ret; > > - return (priv->vdev.fmt.fmt.pix.width != f.fmt.pix.width || > - priv->vdev.fmt.fmt.pix.height != f.fmt.pix.height || > + return (priv->vdev.fmt.width != f.fmt.pix.width || > + priv->vdev.fmt.height != f.fmt.pix.height || > priv->vdev.cc->cs != cc->cs || > priv->vdev.compose.width != compose.width || > priv->vdev.compose.height != compose.height) ? -EINVAL : 0; > @@ -732,12 +732,10 @@ int imx_media_capture_device_register(struct imx_media_video_dev *vdev) > return ret; > } > > - vdev->fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; > - imx_media_mbus_fmt_to_pix_fmt(&vdev->fmt.fmt.pix, > - &fmt_src.format, NULL); > + imx_media_mbus_fmt_to_pix_fmt(&vdev->fmt, &fmt_src.format, NULL); > vdev->compose.width = fmt_src.format.width; > vdev->compose.height = fmt_src.format.height; > - vdev->cc = imx_media_find_pixel_format(vdev->fmt.fmt.pix.pixelformat, > + vdev->cc = imx_media_find_pixel_format(vdev->fmt.pixelformat, > PIXFMT_SEL_ANY); > > /* Register the video device. */ > diff --git a/drivers/staging/media/imx/imx-media-csi.c b/drivers/staging/media/imx/imx-media-csi.c > index 434866d28bfd..3a1501434288 100644 > --- a/drivers/staging/media/imx/imx-media-csi.c > +++ b/drivers/staging/media/imx/imx-media-csi.c > @@ -267,7 +267,7 @@ static void csi_vb2_buf_done(struct csi_priv *priv) > > done = priv->active_vb2_buf[priv->ipu_buf_num]; > if (done) { > - done->vbuf.field = vdev->fmt.fmt.pix.field; > + done->vbuf.field = vdev->fmt.field; > done->vbuf.sequence = priv->frame_sequence; > vb = &done->vbuf.vb2_buf; > vb->timestamp = ktime_get_ns(); > @@ -292,7 +292,7 @@ static void csi_vb2_buf_done(struct csi_priv *priv) > ipu_idmac_clear_buffer(priv->idmac_ch, priv->ipu_buf_num); > > if (priv->interweave_swap) > - phys += vdev->fmt.fmt.pix.bytesperline; > + phys += vdev->fmt.bytesperline; > > ipu_cpmem_set_buffer(priv->idmac_ch, priv->ipu_buf_num, phys); > } > @@ -422,7 +422,7 @@ static int csi_idmac_setup_channel(struct csi_priv *priv) > ipu_cpmem_zero(priv->idmac_ch); > > memset(&image, 0, sizeof(image)); > - image.pix = vdev->fmt.fmt.pix; > + image.pix = vdev->fmt; > image.rect = vdev->compose; > > csi_idmac_setup_vb2_buf(priv, phys); > @@ -596,7 +596,6 @@ static int csi_idmac_setup(struct csi_priv *priv) > static int csi_idmac_start(struct csi_priv *priv) > { > struct imx_media_video_dev *vdev = priv->vdev; > - struct v4l2_pix_format *outfmt; > int ret; > > ret = csi_idmac_get_ipu_resources(priv); > @@ -605,10 +604,8 @@ static int csi_idmac_start(struct csi_priv *priv) > > ipu_smfc_map_channel(priv->smfc, priv->csi_id, priv->vc_num); > > - outfmt = &vdev->fmt.fmt.pix; > - > ret = imx_media_alloc_dma_buf(priv->dev, &priv->underrun_buf, > - outfmt->sizeimage); > + vdev->fmt.sizeimage); > if (ret) > goto out_put_ipu; > > diff --git a/drivers/staging/media/imx/imx-media-vdic.c b/drivers/staging/media/imx/imx-media-vdic.c > index 395b850736fa..abf290bda98d 100644 > --- a/drivers/staging/media/imx/imx-media-vdic.c > +++ b/drivers/staging/media/imx/imx-media-vdic.c > @@ -246,7 +246,7 @@ static int setup_vdi_channel(struct vdic_priv *priv, > ipu_cpmem_zero(channel); > > memset(&image, 0, sizeof(image)); > - image.pix = vdev->fmt.fmt.pix; > + image.pix = vdev->fmt; > image.rect = vdev->compose; > /* one field to VDIC channels */ > image.pix.height /= 2; > diff --git a/drivers/staging/media/imx/imx-media.h b/drivers/staging/media/imx/imx-media.h > index 1761451d3003..483fda2f13d9 100644 > --- a/drivers/staging/media/imx/imx-media.h > +++ b/drivers/staging/media/imx/imx-media.h > @@ -105,7 +105,7 @@ struct imx_media_video_dev { > struct video_device *vfd; > > /* the user format */ > - struct v4l2_format fmt; > + struct v4l2_pix_format fmt; > /* the compose rectangle */ > struct v4l2_rect compose; > const struct imx_media_pixfmt *cc; > diff --git a/drivers/staging/media/imx/imx7-media-csi.c b/drivers/staging/media/imx/imx7-media-csi.c > index a3f3df901704..98eb41f6496c 100644 > --- a/drivers/staging/media/imx/imx7-media-csi.c > +++ b/drivers/staging/media/imx/imx7-media-csi.c > @@ -585,7 +585,7 @@ static void imx7_csi_vb2_buf_done(struct imx7_csi *csi) > > done = csi->active_vb2_buf[csi->buf_num]; > if (done) { > - done->vbuf.field = vdev->fmt.fmt.pix.field; > + done->vbuf.field = vdev->fmt.field; > done->vbuf.sequence = csi->frame_sequence; > vb = &done->vbuf.vb2_buf; > vb->timestamp = ktime_get_ns(); > @@ -667,11 +667,10 @@ static irqreturn_t imx7_csi_irq_handler(int irq, void *data) > static int imx7_csi_dma_start(struct imx7_csi *csi) > { > struct imx_media_video_dev *vdev = csi->vdev; > - struct v4l2_pix_format *out_pix = &vdev->fmt.fmt.pix; > int ret; > > ret = imx_media_alloc_dma_buf(csi->dev, &csi->underrun_buf, > - out_pix->sizeimage); > + vdev->fmt.sizeimage); > if (ret < 0) { > v4l2_warn(&csi->sd, "consider increasing the CMA area\n"); > return ret; > @@ -716,7 +715,7 @@ static void imx7_csi_dma_stop(struct imx7_csi *csi) > static int imx7_csi_configure(struct imx7_csi *csi) > { > struct imx_media_video_dev *vdev = csi->vdev; > - struct v4l2_pix_format *out_pix = &vdev->fmt.fmt.pix; > + struct v4l2_pix_format *out_pix = &vdev->fmt; > __u32 in_code = csi->format_mbus[IMX7_CSI_PAD_SINK].code; > u32 cr1, cr18; > int width = out_pix->width; Reviewed-by: Philipp Zabel <p.zabel@xxxxxxxxxxxxxx> regards Philipp