[media] gscpa: Move ctrl_handler to gspca_dev

We intend to eventually port all sub-drivers to the control-framework. At
which point it will make more sense to have the ctrl_handler in gspca_dev
then to have it in the subdrivers. Lets move it there now, to avoid a lot
of work to move it later.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
diff --git a/drivers/media/video/gspca/gspca.h b/drivers/media/video/gspca/gspca.h
index 449ff8e..dd15e07 100644
--- a/drivers/media/video/gspca/gspca.h
+++ b/drivers/media/video/gspca/gspca.h
@@ -174,6 +174,7 @@
 	const struct sd_desc *sd_desc;		/* subdriver description */
 	unsigned ctrl_dis;		/* disabled controls (bit map) */
 	unsigned ctrl_inac;		/* inactive controls (bit map) */
+	struct v4l2_ctrl_handler ctrl_handler;
 
 	/* autogain and exposure or gain control cluster, these are global as
 	   the autogain/exposure functions in autogain_functions.c use them */
diff --git a/drivers/media/video/gspca/mars.c b/drivers/media/video/gspca/mars.c
index 2950347..ec7b21e 100644
--- a/drivers/media/video/gspca/mars.c
+++ b/drivers/media/video/gspca/mars.c
@@ -34,7 +34,6 @@
 struct sd {
 	struct gspca_dev gspca_dev;	/* !! must be the first item */
 
-	struct v4l2_ctrl_handler ctrl_handler;
 	struct v4l2_ctrl *brightness;
 	struct v4l2_ctrl *saturation;
 	struct v4l2_ctrl *sharpness;
@@ -161,8 +160,9 @@
 
 static int mars_s_ctrl(struct v4l2_ctrl *ctrl)
 {
-	struct sd *sd = container_of(ctrl->handler, struct sd, ctrl_handler);
-	struct gspca_dev *gspca_dev = &sd->gspca_dev;
+	struct gspca_dev *gspca_dev =
+		container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
+	struct sd *sd = (struct sd *)gspca_dev;
 
 	gspca_dev->usb_err = 0;
 
@@ -179,20 +179,20 @@
 
 	switch (ctrl->id) {
 	case V4L2_CID_BRIGHTNESS:
-		setbrightness(&sd->gspca_dev, ctrl->val);
+		setbrightness(gspca_dev, ctrl->val);
 		break;
 	case V4L2_CID_SATURATION:
-		setcolors(&sd->gspca_dev, ctrl->val);
+		setcolors(gspca_dev, ctrl->val);
 		break;
 	case V4L2_CID_GAMMA:
-		setgamma(&sd->gspca_dev, ctrl->val);
+		setgamma(gspca_dev, ctrl->val);
 		break;
 	case V4L2_CID_ILLUMINATORS_1:
-		setilluminators(&sd->gspca_dev, sd->illum_top->val,
-						sd->illum_bottom->val);
+		setilluminators(gspca_dev, sd->illum_top->val,
+					   sd->illum_bottom->val);
 		break;
 	case V4L2_CID_SHARPNESS:
-		setsharpness(&sd->gspca_dev, ctrl->val);
+		setsharpness(gspca_dev, ctrl->val);
 		break;
 	case V4L2_CID_JPEG_COMPRESSION_QUALITY:
 		jpeg_set_qual(sd->jpeg_hdr, ctrl->val);
@@ -211,7 +211,7 @@
 static int sd_init_controls(struct gspca_dev *gspca_dev)
 {
 	struct sd *sd = (struct sd *) gspca_dev;
-	struct v4l2_ctrl_handler *hdl = &sd->ctrl_handler;
+	struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
 
 	gspca_dev->vdev.ctrl_handler = hdl;
 	v4l2_ctrl_handler_init(hdl, 7);
diff --git a/drivers/media/video/gspca/sn9c20x.c b/drivers/media/video/gspca/sn9c20x.c
index 1758ed9..ad09820 100644
--- a/drivers/media/video/gspca/sn9c20x.c
+++ b/drivers/media/video/gspca/sn9c20x.c
@@ -70,7 +70,6 @@
 struct sd {
 	struct gspca_dev gspca_dev;
 
-	struct v4l2_ctrl_handler ctrl_handler;
 	struct { /* color control cluster */
 		struct v4l2_ctrl *brightness;
 		struct v4l2_ctrl *contrast;
@@ -1694,8 +1693,9 @@
 
 static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
 {
-	struct sd *sd = container_of(ctrl->handler, struct sd, ctrl_handler);
-	struct gspca_dev *gspca_dev = &sd->gspca_dev;
+	struct gspca_dev *gspca_dev =
+		container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
+	struct sd *sd = (struct sd *)gspca_dev;
 
 	gspca_dev->usb_err = 0;
 
@@ -1705,37 +1705,37 @@
 	switch (ctrl->id) {
 	/* color control cluster */
 	case V4L2_CID_BRIGHTNESS:
-		set_cmatrix(&sd->gspca_dev, sd->brightness->val,
+		set_cmatrix(gspca_dev, sd->brightness->val,
 			sd->contrast->val, sd->saturation->val, sd->hue->val);
 		break;
 	case V4L2_CID_GAMMA:
-		set_gamma(&sd->gspca_dev, ctrl->val);
+		set_gamma(gspca_dev, ctrl->val);
 		break;
 	/* blue/red balance cluster */
 	case V4L2_CID_BLUE_BALANCE:
-		set_redblue(&sd->gspca_dev, sd->blue->val, sd->red->val);
+		set_redblue(gspca_dev, sd->blue->val, sd->red->val);
 		break;
 	/* h/vflip cluster */
 	case V4L2_CID_HFLIP:
-		set_hvflip(&sd->gspca_dev, sd->hflip->val, sd->vflip->val);
+		set_hvflip(gspca_dev, sd->hflip->val, sd->vflip->val);
 		break;
 	/* standalone exposure control */
 	case V4L2_CID_EXPOSURE:
-		set_exposure(&sd->gspca_dev, ctrl->val);
+		set_exposure(gspca_dev, ctrl->val);
 		break;
 	/* standalone gain control */
 	case V4L2_CID_GAIN:
-		set_gain(&sd->gspca_dev, ctrl->val);
+		set_gain(gspca_dev, ctrl->val);
 		break;
 	/* autogain + exposure or gain control cluster */
 	case V4L2_CID_AUTOGAIN:
 		if (sd->sensor == SENSOR_SOI968)
-			set_gain(&sd->gspca_dev, sd->gain->val);
+			set_gain(gspca_dev, sd->gain->val);
 		else
-			set_exposure(&sd->gspca_dev, sd->exposure->val);
+			set_exposure(gspca_dev, sd->exposure->val);
 		break;
 	case V4L2_CID_JPEG_COMPRESSION_QUALITY:
-		set_quality(&sd->gspca_dev, ctrl->val);
+		set_quality(gspca_dev, ctrl->val);
 		break;
 	}
 	return gspca_dev->usb_err;
@@ -1748,7 +1748,7 @@
 static int sd_init_controls(struct gspca_dev *gspca_dev)
 {
 	struct sd *sd = (struct sd *) gspca_dev;
-	struct v4l2_ctrl_handler *hdl = &sd->ctrl_handler;
+	struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
 
 	gspca_dev->vdev.ctrl_handler = hdl;
 	v4l2_ctrl_handler_init(hdl, 13);
diff --git a/drivers/media/video/gspca/stv06xx/stv06xx.c b/drivers/media/video/gspca/stv06xx/stv06xx.c
index cebd615..999ec77 100644
--- a/drivers/media/video/gspca/stv06xx/stv06xx.c
+++ b/drivers/media/video/gspca/stv06xx/stv06xx.c
@@ -268,7 +268,7 @@
 
 	PDEBUG(D_PROBE, "Initializing controls");
 
-	gspca_dev->vdev.ctrl_handler = &sd->ctrl_handler;
+	gspca_dev->vdev.ctrl_handler = &gspca_dev->ctrl_handler;
 	return sd->sensor->init_controls(sd);
 }
 
diff --git a/drivers/media/video/gspca/stv06xx/stv06xx.h b/drivers/media/video/gspca/stv06xx/stv06xx.h
index b7cbc6b..34957a4 100644
--- a/drivers/media/video/gspca/stv06xx/stv06xx.h
+++ b/drivers/media/video/gspca/stv06xx/stv06xx.h
@@ -89,9 +89,6 @@
 	/* A pointer to the currently connected sensor */
 	const struct stv06xx_sensor *sensor;
 
-	/* Control handler */
-	struct v4l2_ctrl_handler ctrl_handler;
-
 	/* Sensor private data */
 	void *sensor_priv;
 
diff --git a/drivers/media/video/gspca/stv06xx/stv06xx_hdcs.c b/drivers/media/video/gspca/stv06xx/stv06xx_hdcs.c
index 74cbd38..06fa54c5e 100644
--- a/drivers/media/video/gspca/stv06xx/stv06xx_hdcs.c
+++ b/drivers/media/video/gspca/stv06xx/stv06xx_hdcs.c
@@ -335,15 +335,16 @@
 
 static int hdcs_s_ctrl(struct v4l2_ctrl *ctrl)
 {
-	struct sd *sd = container_of(ctrl->handler, struct sd, ctrl_handler);
+	struct gspca_dev *gspca_dev =
+		container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
 	int err = -EINVAL;
 
 	switch (ctrl->id) {
 	case V4L2_CID_GAIN:
-		err = hdcs_set_gain(&sd->gspca_dev, ctrl->val);
+		err = hdcs_set_gain(gspca_dev, ctrl->val);
 		break;
 	case V4L2_CID_EXPOSURE:
-		err = hdcs_set_exposure(&sd->gspca_dev, ctrl->val);
+		err = hdcs_set_exposure(gspca_dev, ctrl->val);
 		break;
 	}
 	return err;
@@ -355,7 +356,7 @@
 
 static int hdcs_init_controls(struct sd *sd)
 {
-	struct v4l2_ctrl_handler *hdl = &sd->ctrl_handler;
+	struct v4l2_ctrl_handler *hdl = &sd->gspca_dev.ctrl_handler;
 
 	v4l2_ctrl_handler_init(hdl, 2);
 	v4l2_ctrl_new_std(hdl, &hdcs_ctrl_ops,
diff --git a/drivers/media/video/gspca/stv06xx/stv06xx_pb0100.c b/drivers/media/video/gspca/stv06xx/stv06xx_pb0100.c
index c03b13e..cdfc3d0 100644
--- a/drivers/media/video/gspca/stv06xx/stv06xx_pb0100.c
+++ b/drivers/media/video/gspca/stv06xx/stv06xx_pb0100.c
@@ -87,24 +87,26 @@
 
 static int pb0100_s_ctrl(struct v4l2_ctrl *ctrl)
 {
-	struct sd *sd = container_of(ctrl->handler, struct sd, ctrl_handler);
+	struct gspca_dev *gspca_dev =
+		container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
+	struct sd *sd = (struct sd *)gspca_dev;
 	struct pb0100_ctrls *ctrls = sd->sensor_priv;
 	int err = -EINVAL;
 
 	switch (ctrl->id) {
 	case V4L2_CID_AUTOGAIN:
-		err = pb0100_set_autogain(&sd->gspca_dev, ctrl->val);
+		err = pb0100_set_autogain(gspca_dev, ctrl->val);
 		if (err)
 			break;
 		if (ctrl->val)
 			break;
-		err = pb0100_set_gain(&sd->gspca_dev, ctrls->gain->val);
+		err = pb0100_set_gain(gspca_dev, ctrls->gain->val);
 		if (err)
 			break;
-		err = pb0100_set_exposure(&sd->gspca_dev, ctrls->exposure->val);
+		err = pb0100_set_exposure(gspca_dev, ctrls->exposure->val);
 		break;
 	case V4L2_CTRL_CLASS_USER + 0x1001:
-		err = pb0100_set_autogain_target(&sd->gspca_dev, ctrl->val);
+		err = pb0100_set_autogain_target(gspca_dev, ctrl->val);
 		break;
 	}
 	return err;
@@ -116,7 +118,7 @@
 
 static int pb0100_init_controls(struct sd *sd)
 {
-	struct v4l2_ctrl_handler *hdl = &sd->ctrl_handler;
+	struct v4l2_ctrl_handler *hdl = &sd->gspca_dev.ctrl_handler;
 	struct pb0100_ctrls *ctrls;
 	static const struct v4l2_ctrl_config autogain_target = {
 		.ops = &pb0100_ctrl_ops,
diff --git a/drivers/media/video/gspca/stv06xx/stv06xx_st6422.c b/drivers/media/video/gspca/stv06xx/stv06xx_st6422.c
index bbfe821..8a57990 100644
--- a/drivers/media/video/gspca/stv06xx/stv06xx_st6422.c
+++ b/drivers/media/video/gspca/stv06xx/stv06xx_st6422.c
@@ -67,7 +67,9 @@
 
 static int st6422_s_ctrl(struct v4l2_ctrl *ctrl)
 {
-	struct sd *sd = container_of(ctrl->handler, struct sd, ctrl_handler);
+	struct gspca_dev *gspca_dev =
+		container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
+	struct sd *sd = (struct sd *)gspca_dev;
 	int err = -EINVAL;
 
 	switch (ctrl->id) {
@@ -98,7 +100,7 @@
 
 static int st6422_init_controls(struct sd *sd)
 {
-	struct v4l2_ctrl_handler *hdl = &sd->ctrl_handler;
+	struct v4l2_ctrl_handler *hdl = &sd->gspca_dev.ctrl_handler;
 
 	v4l2_ctrl_handler_init(hdl, 4);
 	v4l2_ctrl_new_std(hdl, &st6422_ctrl_ops,
diff --git a/drivers/media/video/gspca/stv06xx/stv06xx_vv6410.c b/drivers/media/video/gspca/stv06xx/stv06xx_vv6410.c
index 1b7a68a..748e142 100644
--- a/drivers/media/video/gspca/stv06xx/stv06xx_vv6410.c
+++ b/drivers/media/video/gspca/stv06xx/stv06xx_vv6410.c
@@ -46,21 +46,22 @@
 
 static int vv6410_s_ctrl(struct v4l2_ctrl *ctrl)
 {
-	struct sd *sd = container_of(ctrl->handler, struct sd, ctrl_handler);
+	struct gspca_dev *gspca_dev =
+		container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
 	int err = -EINVAL;
 
 	switch (ctrl->id) {
 	case V4L2_CID_HFLIP:
-		err = vv6410_set_hflip(&sd->gspca_dev, ctrl->val);
+		err = vv6410_set_hflip(gspca_dev, ctrl->val);
 		break;
 	case V4L2_CID_VFLIP:
-		err = vv6410_set_vflip(&sd->gspca_dev, ctrl->val);
+		err = vv6410_set_vflip(gspca_dev, ctrl->val);
 		break;
 	case V4L2_CID_GAIN:
-		err = vv6410_set_analog_gain(&sd->gspca_dev, ctrl->val);
+		err = vv6410_set_analog_gain(gspca_dev, ctrl->val);
 		break;
 	case V4L2_CID_EXPOSURE:
-		err = vv6410_set_exposure(&sd->gspca_dev, ctrl->val);
+		err = vv6410_set_exposure(gspca_dev, ctrl->val);
 		break;
 	}
 	return err;
@@ -91,7 +92,7 @@
 
 static int vv6410_init_controls(struct sd *sd)
 {
-	struct v4l2_ctrl_handler *hdl = &sd->ctrl_handler;
+	struct v4l2_ctrl_handler *hdl = &sd->gspca_dev.ctrl_handler;
 
 	v4l2_ctrl_handler_init(hdl, 4);
 	v4l2_ctrl_new_std(hdl, &vv6410_ctrl_ops,
diff --git a/drivers/media/video/gspca/zc3xx.c b/drivers/media/video/gspca/zc3xx.c
index a8839fb..0d504a7 100644
--- a/drivers/media/video/gspca/zc3xx.c
+++ b/drivers/media/video/gspca/zc3xx.c
@@ -39,7 +39,6 @@
 struct sd {
 	struct gspca_dev gspca_dev;	/* !! must be the first item */
 
-	struct v4l2_ctrl_handler ctrl_handler;
 	struct { /* gamma/brightness/contrast control cluster */
 		struct v4l2_ctrl *gamma;
 		struct v4l2_ctrl *brightness;
@@ -6328,8 +6327,9 @@
 
 static int zcxx_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
 {
-	struct sd *sd = container_of(ctrl->handler, struct sd, ctrl_handler);
-	struct gspca_dev *gspca_dev = &sd->gspca_dev;
+	struct gspca_dev *gspca_dev =
+		container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
+	struct sd *sd = (struct sd *)gspca_dev;
 
 	switch (ctrl->id) {
 	case V4L2_CID_AUTOGAIN:
@@ -6343,8 +6343,9 @@
 
 static int zcxx_s_ctrl(struct v4l2_ctrl *ctrl)
 {
-	struct sd *sd = container_of(ctrl->handler, struct sd, ctrl_handler);
-	struct gspca_dev *gspca_dev = &sd->gspca_dev;
+	struct gspca_dev *gspca_dev =
+		container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
+	struct sd *sd = (struct sd *)gspca_dev;
 	int i, qual;
 
 	gspca_dev->usb_err = 0;
@@ -6404,7 +6405,7 @@
 static int sd_init_controls(struct gspca_dev *gspca_dev)
 {
 	struct sd *sd = (struct sd *)gspca_dev;
-	struct v4l2_ctrl_handler *hdl = &sd->ctrl_handler;
+	struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
 	static const u8 gamma[SENSOR_MAX] = {
 		[SENSOR_ADCM2700] =	4,
 		[SENSOR_CS2102] =	4,