Index: m5602-gspca/m5602_s5k83a.c
===================================================================
--- m5602-gspca/m5602_s5k83a.c	(revision 430)
+++ m5602-gspca/m5602_s5k83a.c	(working copy)
@@ -419,3 +419,22 @@
 
 	return (err < 0) ? err : 0; 
 }
+
+int s5k83a_get_rotation(struct gspca_dev *gspca_dev, __s32 *val)
+{
+	/* Get camera rotation on Acer notebooks */
+	struct sd *sd = (struct sd *) gspca_dev;
+	int err = 0;	
+	
+	err = m5602_read_bridge(sd, M5602_XB_GPIO_DAT, (u8 *)val );
+	*val = (*(u8 *)val & 0x40)? 0 : 1;
+	return (err < 0) ? err : 0; 
+}
+
+int s5k83a_set_rotation(struct gspca_dev *gspca_dev, __s32 val)
+{
+	/* this control is read only */
+	PDEBUG(DBG_V4L2_CID, "Get rotation is only for read!");
+	return -EINVAL;
+}
+
Index: m5602-gspca/m5602_s5k83a.h
===================================================================
--- m5602-gspca/m5602_s5k83a.h	(revision 430)
+++ m5602-gspca/m5602_s5k83a.h	(working copy)
@@ -35,6 +35,7 @@
 #define S5K83A_MAXIMUM_GAIN			0x3c
 #define S5K83A_FLIP_MASK			0x10
 
+#define S5K83A_PRIVATE_CID_ROTATION		V4L2_CID_PRIVATE_BASE + 0
 
 /*****************************************************************************/
 
@@ -65,8 +66,9 @@
 int s5k83a_set_vflip(struct gspca_dev *gspca_dev, __s32 val);
 int s5k83a_get_hflip(struct gspca_dev *gspca_dev, __s32 *val);
 int s5k83a_set_hflip(struct gspca_dev *gspca_dev, __s32 val);
+int s5k83a_get_rotation(struct gspca_dev *gspca_dev, __s32 *val);
+int s5k83a_set_rotation(struct gspca_dev *gspca_dev, __s32 val);
 
-
 static struct m5602_sensor s5k83a = {
 	.name = "S5K83A",
 	.probe = s5k83a_probe,
@@ -75,7 +77,7 @@
 	.read_sensor = s5k83a_read_sensor,
 	.write_sensor = s5k83a_write_sensor,
 	.i2c_slave_id = 0x5a,
-	.nctrls = 5,
+	.nctrls = 6,
 	.ctrls = {
 	{
 		{
@@ -88,8 +90,8 @@
 			.default_value = S5K83A_DEFAULT_BRIGHTNESS,
 			.flags = V4L2_CTRL_FLAG_SLIDER
 		},
-			.set = s5k83a_set_brightness,
-			.get = s5k83a_get_brightness
+		.set = s5k83a_set_brightness,
+		.get = s5k83a_get_brightness
 
 	}, {
 		{
@@ -102,8 +104,8 @@
 			.default_value = S5K83A_DEFAULT_WHITENESS,
 			.flags = V4L2_CTRL_FLAG_SLIDER
 		},
-			.set = s5k83a_set_whiteness,
-			.get = s5k83a_get_whiteness,
+		.set = s5k83a_set_whiteness,
+		.get = s5k83a_get_whiteness,
 	}, {
 		{
 			.id = V4L2_CID_GAIN,
@@ -115,8 +117,8 @@
 			.default_value = S5K83A_DEFAULT_GAIN,
 			.flags = V4L2_CTRL_FLAG_SLIDER
 		},
-			.set = s5k83a_set_gain,
-			.get = s5k83a_get_gain
+		.set = s5k83a_set_gain,
+		.get = s5k83a_get_gain
 	}, {
 		{
 			.id         = V4L2_CID_HFLIP,
@@ -127,21 +129,34 @@
 			.step       = 1,
 			.default_value  = 0
 		},
-			.set = s5k83a_set_hflip,
-			.get = s5k83a_get_hflip
+		.set = s5k83a_set_hflip,
+		.get = s5k83a_get_hflip
 	}, {
 		{
-		 .id         = V4L2_CID_VFLIP,
-		.type       = V4L2_CTRL_TYPE_BOOLEAN,
-		.name       = "vertical flip",
-		.minimum    = 0,
-		.maximum    = 1,
-		.step       = 1,
-		.default_value  = 0
+			.id         = V4L2_CID_VFLIP,
+			.type       = V4L2_CTRL_TYPE_BOOLEAN,
+			.name       = "vertical flip",
+			.minimum    = 0,
+			.maximum    = 1,
+			.step       = 1,
+			.default_value  = 0
 		},
 		.set = s5k83a_set_vflip,
 		.get = s5k83a_get_vflip
-		}
+	}, {
+		{
+			.id 		= S5K83A_PRIVATE_CID_ROTATION,
+			.type 		= V4L2_CTRL_TYPE_BOOLEAN,
+			.name 		= "camera rotation",
+			.minimum 	= 0,
+			.maximum 	= 1,
+			.step 		= 1,
+			.default_value 	= 0,
+			.flags = V4L2_CTRL_FLAG_READ_ONLY
+		},
+		.set = s5k83a_set_rotation,
+		.get = s5k83a_get_rotation
+	}
 	},
 	.nmodes = 1,
 	.modes = {
Index: m5602/m5602_s5k83a.c
===================================================================
--- m5602/m5602_s5k83a.c	(revision 430)
+++ m5602/m5602_s5k83a.c	(working copy)
@@ -211,6 +211,12 @@
 		PDEBUG(DBG_V4L2_CID, "Get vflip 0x%x", ctrl->value);
 		break;		
 		
+	case S5K83A_PRIVATE_CID_ROTATION:
+		err = s5k83a_get_rotation(cam, &reg_data);
+		ctrl->value = reg_data;
+		PDEBUG(DBG_V4L2_CID, "Get rotation 0x%x", ctrl->value);
+		break;
+		
 	default:
 		PDEBUG(DBG_V4L2_CID, "Unknown V4L2 CID 0x%x", ctrl->id);
 		err = -EINVAL;
@@ -249,6 +255,11 @@
 		PDEBUG(DBG_V4L2_CID, "Set vflip 0x%x", ctrl->value);
 		break;		
 	
+	case S5K83A_PRIVATE_CID_ROTATION:
+		err = -EINVAL;
+		PDEBUG(DBG_V4L2_CID, "Get rotation is only for read!");
+		break;
+		
 	default:
 		PDEBUG(DBG_V4L2_CID,
 		       "Illegal V4L2 CID %d, value %d", ctrl->id, ctrl->value);
@@ -400,12 +411,12 @@
 		return err;
 	
 	/* set or zero seven bit, six bit is vflip */
-	data[0] = value ? (data[0] & 0x40) | 0x80 | S5K83A_FLIP_MASK: (data[0] & 0x40) | S5K83A_FLIP_MASK;
+	data[0] = (value)? (data[0] & 0x40) | 0x80 | S5K83A_FLIP_MASK: (data[0] & 0x40) | S5K83A_FLIP_MASK;
 	err = s5k83a_write_sensor(cam, S5K83A_FLIP, data, 1);
 	if (err < 0)
 		return err;
 	
-	data[0] = value ? 0x0a : 0x0b;
+	data[0] = (value)? 0x0a : 0x0b;
 	err = s5k83a_write_sensor(cam, S5K83A_HFLIP_TUNE, data, 1);
 	
 	return (err < 0) ? err : 0;	
@@ -421,7 +432,7 @@
 		return err;
 
 	err = s5k83a_read_sensor(cam, S5K83A_FLIP, data, 1);
-	*reg_data = (data[0] | 0x80) ? 1 : 0;
+	*reg_data = (data[0] | 0x80)? 1 : 0;
 	
 	return (err < 0) ? err : 0;	
 }
@@ -440,7 +451,7 @@
 		return err;
 	
 	/* set or zero six bit, seven is hflip */
-	data[0] = value ? (data[0] & 0x80) | 0x40 | S5K83A_FLIP_MASK: (data[0] & 0x80) | S5K83A_FLIP_MASK;
+	data[0] = (value)? (data[0] & 0x80) | 0x40 | S5K83A_FLIP_MASK: (data[0] & 0x80) | S5K83A_FLIP_MASK;
 	err = s5k83a_write_sensor(cam, S5K83A_FLIP, data, 1);
 	if (err < 0)
 		return err;
@@ -461,8 +472,17 @@
 		return err;
 
 	err = s5k83a_read_sensor(cam, S5K83A_FLIP, data, 1);
-	*reg_data = (data[0] | 0x40) ? 1 : 0;
+	*reg_data = (data[0] | 0x40)? 1 : 0;
 	
 	return (err < 0) ? err : 0;	
 }
 
+int s5k83a_get_rotation(struct m5602_camera *cam, u8 *reg_data){
+	/* Get camera rotation on Acer notebooks */
+	int err = 0;	
+	err = m5602_read_bridge(cam, M5602_XB_GPIO_DAT, reg_data);
+	*reg_data = (*reg_data & 0x40)? 0 : 1;
+	return err;
+}
+
+
Index: m5602/m5602_s5k83a.h
===================================================================
--- m5602/m5602_s5k83a.h	(revision 430)
+++ m5602/m5602_s5k83a.h	(working copy)
@@ -22,19 +22,21 @@
 #include "m5602_sensor.h"
 
 #define S5K83A_PAGE_MAP			0xec
-#define S5K83A_FLIP			0x01
+#define S5K83A_FLIP				0x01
 #define S5K83A_HFLIP_TUNE		0x03
 #define S5K83A_VFLIP_TUNE		0x05
-#define S5K83A_GAIN			0x18
+#define S5K83A_GAIN				0x18
 #define S5K83A_WHITENESS		0x0a
 #define S5K83A_BRIGHTNESS 		0x1b
 
 #define S5K83A_DEFAULT_BRIGHTNESS	0x71
 #define S5K83A_DEFAULT_WHITENESS	0x7e
-#define S5K83A_DEFAULT_GAIN		0x00
-#define S5K83A_MAXIMUM_GAIN		0x3c
-#define S5K83A_FLIP_MASK		0x10
+#define S5K83A_DEFAULT_GAIN			0x00
+#define S5K83A_MAXIMUM_GAIN			0x3c
+#define S5K83A_FLIP_MASK			0x10
 
+#define S5K83A_PRIVATE_CID_ROTATION		V4L2_CID_PRIVATE_BASE + 0
+
 /*****************************************************************************/
 
 /* Kernel module parameters */
@@ -67,6 +69,7 @@
 int s5k83a_get_hflip(struct m5602_camera *cam, u8 *reg_data);
 int s5k83a_set_vflip(struct m5602_camera *cam, u8 value);
 int s5k83a_get_vflip(struct m5602_camera *cam, u8 *reg_data);
+int s5k83a_get_rotation(struct m5602_camera *cam, u8 *reg_data);
 
 static struct m5602_sensor s5k83a = {
 	.name = "S5K83A",
@@ -126,6 +129,16 @@
 			.maximum 	= 1,
 			.step 		= 1,
 			.default_value 	= 0
+		},
+		{
+			.id 		= S5K83A_PRIVATE_CID_ROTATION,
+			.type 		= V4L2_CTRL_TYPE_BOOLEAN,
+			.name 		= "camera rotation",
+			.minimum 	= 0,
+			.maximum 	= 1,
+			.step 		= 1,
+			.default_value 	= 0,
+			.flags = V4L2_CTRL_FLAG_READ_ONLY
 		}
 	},
 	.cropcap = {
