#define MT9M001_CHIP_ENABLE            0xF1
 
 static const struct soc_camera_data_format mt9m001_colour_formats[] = {
+       /* Order important: first natively supported,
+        * second supported with a GPIO extender */
        {
-               .name           = "RGB Bayer (sRGB)",
-               .depth          = 16,
+               .name           = "Bayer (sRGB) 10 bit",
+               .depth          = 10,
+               .fourcc         = V4L2_PIX_FMT_SBGGR16,
+               .colorspace     = V4L2_COLORSPACE_SRGB,
+       }, {
+               .name           = "Bayer (sRGB) 8 bit",
+               .depth          = 8,
                .fourcc         = V4L2_PIX_FMT_SBGGR8,
                .colorspace     = V4L2_COLORSPACE_SRGB,
        }
 };
 
 static const struct soc_camera_data_format mt9m001_monochrome_formats[] = {
+       /* Order important - see above */
        {
                .name           = "Monochrome 10 bit",
                .depth          = 10,
        case 0x8421:
                mt9m001->model = V4L2_IDENT_MT9M001C12ST;
                mt9m001_ops.formats = mt9m001_colour_formats;
-               mt9m001_ops.num_formats = ARRAY_SIZE(mt9m001_colour_formats);
+               if (mt9m001->client->dev.platform_data)
+                       mt9m001_ops.num_formats = ARRAY_SIZE(mt9m001_colour_formats);
+               else
+                       mt9m001_ops.num_formats = 1;
                break;
        case 0x8431:
                mt9m001->model = V4L2_IDENT_MT9M001C12STM;
 
 /* Progressive scan, master, defaults */
 #define MT9V022_CHIP_CONTROL_DEFAULT   0x188
 
-static const struct soc_camera_data_format mt9v022_formats[] = {
+static const struct soc_camera_data_format mt9v022_colour_formats[] = {
+       /* Order important: first natively supported,
+        * second supported with a GPIO extender */
        {
-               .name           = "RGB Bayer (sRGB)",
-               .depth          = 8,
-               .fourcc         = V4L2_PIX_FMT_SBGGR8,
-               .colorspace     = V4L2_COLORSPACE_SRGB,
-       }, {
-               .name           = "RGB Bayer (sRGB)",
+               .name           = "Bayer (sRGB) 10 bit",
                .depth          = 10,
                .fourcc         = V4L2_PIX_FMT_SBGGR16,
                .colorspace     = V4L2_COLORSPACE_SRGB,
        }, {
+               .name           = "Bayer (sRGB) 8 bit",
+               .depth          = 8,
+               .fourcc         = V4L2_PIX_FMT_SBGGR8,
+               .colorspace     = V4L2_COLORSPACE_SRGB,
+       }
+};
+
+static const struct soc_camera_data_format mt9v022_monochrome_formats[] = {
+       /* Order important - see above */
+       {
                .name           = "Monochrome 10 bit",
                .depth          = 10,
                .fourcc         = V4L2_PIX_FMT_Y16,
        .stop_capture           = mt9v022_stop_capture,
        .set_capture_format     = mt9v022_set_capture_format,
        .try_fmt_cap            = mt9v022_try_fmt_cap,
-       .formats                = mt9v022_formats,
-       .num_formats            = ARRAY_SIZE(mt9v022_formats),
+       .formats                = NULL, /* Filled in later depending on the */
+       .num_formats            = 0,    /* sensor type and data widths */
        .get_datawidth          = mt9v022_get_datawidth,
        .controls               = mt9v022_controls,
        .num_controls           = ARRAY_SIZE(mt9v022_controls),
                            !strcmp("color", sensor_type))) {
                ret = reg_write(icd, MT9V022_PIXEL_OPERATION_MODE, 4 | 0x11);
                mt9v022->model = V4L2_IDENT_MT9V022IX7ATC;
+               mt9v022_ops.formats = mt9v022_colour_formats;
+               if (mt9v022->client->dev.platform_data)
+                       mt9v022_ops.num_formats = ARRAY_SIZE(mt9v022_colour_formats);
+               else
+                       mt9v022_ops.num_formats = 1;
        } else {
                ret = reg_write(icd, MT9V022_PIXEL_OPERATION_MODE, 0x11);
                mt9v022->model = V4L2_IDENT_MT9V022IX7ATM;
+               mt9v022_ops.formats = mt9v022_monochrome_formats;
+               if (mt9v022->client->dev.platform_data)
+                       mt9v022_ops.num_formats = ARRAY_SIZE(mt9v022_monochrome_formats);
+               else
+                       mt9v022_ops.num_formats = 1;
        }
 
        if (ret >= 0)