diff --git a/drivers/media/platform/bcm2835/bcm2835-unicam.c b/drivers/media/platform/bcm2835/bcm2835-unicam.c index 52a534d932bf58a65298b43f12c17f085a311584..b32b2d33a4e2f053e05a8a91486e34406d13dabc 100644 --- a/drivers/media/platform/bcm2835/bcm2835-unicam.c +++ b/drivers/media/platform/bcm2835/bcm2835-unicam.c @@ -974,8 +974,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;