V4L/DVB (12517): mt9t031: improve rectangle placement in invalid S_CROP

1. soc-camera always requests a valid rectangle, when calling .s_fmt(), no need
to check and adjust
2. in .s_crop(), if the rectangle exceeds sensor limits, push it to the
respective border instead of centering
3. take into account left and top borders when checking

Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
diff --git a/drivers/media/video/mt9t031.c b/drivers/media/video/mt9t031.c
index dc3eb65..125973b 100644
--- a/drivers/media/video/mt9t031.c
+++ b/drivers/media/video/mt9t031.c
@@ -240,15 +240,6 @@
 	const u16 hblank = MT9T031_HORIZONTAL_BLANK,
 		vblank = MT9T031_VERTICAL_BLANK;
 
-	/* Make sure we don't exceed sensor limits */
-	if (rect->left + rect->width > icd->rect_max.width)
-		rect->left = (icd->rect_max.width - rect->width) / 2 +
-			icd->rect_max.left;
-
-	if (rect->top + rect->height > icd->rect_max.height)
-		rect->top = (icd->rect_max.height - rect->height) / 2 +
-			icd->rect_max.top;
-
 	width = rect->width * xskip;
 	height = rect->height * yskip;
 	left = rect->left * xskip;
@@ -336,6 +327,15 @@
 	struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
 	struct mt9t031 *mt9t031 = to_mt9t031(client);
 
+	/* Make sure we don't exceed sensor limits */
+	if (rect->left + rect->width > icd->rect_max.left + icd->rect_max.width)
+		rect->left = icd->rect_max.width + icd->rect_max.left -
+			rect->width;
+
+	if (rect->top + rect->height > icd->rect_max.height + icd->rect_max.top)
+		rect->top = icd->rect_max.height + icd->rect_max.top -
+			rect->height;
+
 	/* CROP - no change in scaling, or in limits */
 	return mt9t031_set_params(icd, rect, mt9t031->xskip, mt9t031->yskip);
 }