diff --git a/drivers/media/platform/bcm2835/bcm2835-unicam.c b/drivers/media/platform/bcm2835/bcm2835-unicam.c index 7dc96c3e8e832591daacb5de1e90acbc1a258526..98ae97c367ea6d7c11d759b1d70b3a46584c4e0c 100644 --- a/drivers/media/platform/bcm2835/bcm2835-unicam.c +++ b/drivers/media/platform/bcm2835/bcm2835-unicam.c @@ -980,8 +980,23 @@ static int unicam_g_fmt_vid_cap(struct file *file, void *priv, if (!fmt) return -EINVAL; - node->fmt = fmt; - node->v_fmt.fmt.pix.pixelformat = fmt->fourcc; + if (node->fmt != fmt) { + /* + * The sensor format has changed so the pixelformat needs to + * be updated. Try and retain the packed/unpacked choice if + * at all possible. + */ + if (node->fmt->repacked_fourcc == + node->v_fmt.fmt.pix.pixelformat) + /* Using the repacked format */ + node->v_fmt.fmt.pix.pixelformat = fmt->repacked_fourcc; + else + /* Using the native format */ + node->v_fmt.fmt.pix.pixelformat = fmt->fourcc; + + node->fmt = fmt; + } + *f = node->v_fmt; return 0;