*/
 
 #include <linux/init.h>
+#include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/i2c.h>
 #include <linux/slab.h>
 #define MAX_WIDTH   VGA_WIDTH
 #define MAX_HEIGHT  VGA_HEIGHT
 
-static const struct ov772x_win_size ov772x_win_vga = {
-       .name     = "VGA",
-       .width    = VGA_WIDTH,
-       .height   = VGA_HEIGHT,
-       .com7_bit = SLCT_VGA,
-       .regs     = ov772x_vga_regs,
-};
-
-static const struct ov772x_win_size ov772x_win_qvga = {
-       .name     = "QVGA",
-       .width    = QVGA_WIDTH,
-       .height   = QVGA_HEIGHT,
-       .com7_bit = SLCT_QVGA,
-       .regs     = ov772x_qvga_regs,
+static const struct ov772x_win_size ov772x_win_sizes[] = {
+       {
+               .name     = "VGA",
+               .width    = VGA_WIDTH,
+               .height   = VGA_HEIGHT,
+               .com7_bit = SLCT_VGA,
+               .regs     = ov772x_vga_regs,
+       }, {
+               .name     = "QVGA",
+               .width    = QVGA_WIDTH,
+               .height   = QVGA_HEIGHT,
+               .com7_bit = SLCT_QVGA,
+               .regs     = ov772x_qvga_regs,
+       },
 };
 
 /*
 
 static const struct ov772x_win_size *ov772x_select_win(u32 width, u32 height)
 {
-       __u32 diff;
-       const struct ov772x_win_size *win;
-
-       /* default is QVGA */
-       diff = abs(width - ov772x_win_qvga.width) +
-               abs(height - ov772x_win_qvga.height);
-       win = &ov772x_win_qvga;
-
-       /* VGA */
-       if (diff >
-           abs(width  - ov772x_win_vga.width) +
-           abs(height - ov772x_win_vga.height))
-               win = &ov772x_win_vga;
+       const struct ov772x_win_size *win = &ov772x_win_sizes[0];
+       u32 best_diff = UINT_MAX;
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(ov772x_win_sizes); ++i) {
+               u32 diff = abs(width - ov772x_win_sizes[i].width)
+                        + abs(height - ov772x_win_sizes[i].height);
+               if (diff < best_diff) {
+                       best_diff = diff;
+                       win = &ov772x_win_sizes[i];
+               }
+       }
 
        return win;
 }
 {
        struct ov772x_priv *priv = container_of(sd, struct ov772x_priv, subdev);
 
-       if (!priv->win || !priv->cfmt) {
-               priv->cfmt = &ov772x_cfmts[0];
-               priv->win = ov772x_select_win(VGA_WIDTH, VGA_HEIGHT);
-       }
-
        mf->width       = priv->win->width;
        mf->height      = priv->win->height;
        mf->code        = priv->cfmt->code;
        }
 
        ret = ov772x_video_probe(client);
+       if (ret < 0)
+               goto done;
+
+       priv->cfmt = &ov772x_cfmts[0];
+       priv->win = &ov772x_win_sizes[0];
 
 done:
        if (ret) {