Em Mon, 17 Feb 2014 10:57:27 +0100 Hans Verkuil <hverkuil@xxxxxxxxx> escreveu: > From: Hans Verkuil <hans.verkuil@xxxxxxxxx> > > Instead of having to maintain the 'cur' union this patch replaces it by > a v4l2_ctrl_ptr union to be consistent with the future configuration stores, > which also use that union. The number of drivers that use 'cur' is fairly small, > so it is easy enough to convert them all. > > Unfortunately, the union for the new value cannot be dropped as easily > since it is used pretty much everywhere. > > As a consequence of these changes the v4l2_ctrl struct changes as well. > > It was this: > > union { }; // anonymous union for the 'new' value > union { } cur; // union for the 'cur' value > union v4l2_ctrl_ptr new; // v4l2_ctrl_ptr to the new value (anonymous union) > union v4l2_ctrl_ptr stores[]; // v4l2_ctrl_ptr to the cur union > > where the stores array contains just one v4l2_ctrl_ptr union when it is > allocated. > > It changes to this: > > union { }; // anonymous union for the 'new' value > union v4l2_ctrl_ptr *stores; // set to &cur > union v4l2_ctrl_ptr new; // v4l2_ctrl_ptr to the new value (anonymous union) > union v4l2_ctrl_ptr cur; // v4l2_ctrl_ptr for the cur value > > The end result is the same: stores[0] is a pointer to the current value, > stores[-1] is a pointer to the new value, and the 'cur' field is still > there as well, except that the cur field is now a pointer union to the > actual value, so cur.val is now *cur.p_s32. Huh??? Do you want to use a negative value for the array index??? That sounds crazy. Also, I'm pretty sure that all static analyzers will complain about that. > > Signed-off-by: Hans Verkuil <hans.verkuil@xxxxxxxxx> > --- > Documentation/video4linux/v4l2-controls.txt | 4 ++-- > drivers/media/common/cx2341x.c | 4 ++-- > drivers/media/i2c/adp1653.c | 10 +++++----- > drivers/media/i2c/as3645a.c | 22 ++++++++++----------- > drivers/media/i2c/lm3560.c | 2 +- > drivers/media/i2c/m5mols/m5mols_controls.c | 6 +++--- > drivers/media/i2c/msp3400-driver.c | 4 ++-- > drivers/media/i2c/mt9p031.c | 4 ++-- > drivers/media/i2c/mt9t001.c | 4 ++-- > drivers/media/i2c/s5c73m3/s5c73m3-ctrls.c | 6 +++--- > drivers/media/i2c/smiapp/smiapp-core.c | 12 ++++++------ > drivers/media/pci/cx18/cx18-av-core.c | 2 +- > drivers/media/pci/cx18/cx18-driver.c | 10 +++++----- > drivers/media/platform/exynos4-is/fimc-core.c | 6 +++--- > drivers/media/platform/vivi.c | 28 +++++++++++++-------------- > drivers/media/radio/radio-isa.c | 2 +- > drivers/media/radio/radio-sf16fmr2.c | 4 ++-- > drivers/media/usb/gspca/conex.c | 8 ++++---- > drivers/media/usb/gspca/sn9c20x.c | 4 ++-- > drivers/media/usb/gspca/topro.c | 4 ++-- > drivers/media/v4l2-core/v4l2-ctrls.c | 16 +++++++-------- > include/media/v4l2-ctrls.h | 9 ++------- > 22 files changed, 83 insertions(+), 88 deletions(-) > > diff --git a/Documentation/video4linux/v4l2-controls.txt b/Documentation/video4linux/v4l2-controls.txt > index 06cf3ac..1c353c2 100644 > --- a/Documentation/video4linux/v4l2-controls.txt > +++ b/Documentation/video4linux/v4l2-controls.txt > @@ -362,8 +362,8 @@ will result in a deadlock since these helpers lock the handler as well. > You can also take the handler lock yourself: > > mutex_lock(&state->ctrl_handler.lock); > - printk(KERN_INFO "String value is '%s'\n", ctrl1->cur.string); > - printk(KERN_INFO "Integer value is '%s'\n", ctrl2->cur.val); > + pr_info("String value is '%s'\n", ctrl1->cur.p_char); > + pr_info("Integer value is '%d'\n", *ctrl2->cur.p_s32); > mutex_unlock(&state->ctrl_handler.lock); > > > diff --git a/drivers/media/common/cx2341x.c b/drivers/media/common/cx2341x.c > index 103ef6b..909d334 100644 > --- a/drivers/media/common/cx2341x.c > +++ b/drivers/media/common/cx2341x.c > @@ -1261,10 +1261,10 @@ static int cx2341x_hdl_api(struct cx2341x_handler *hdl, > return hdl->func(hdl->priv, cmd, args, 0, data); > } > > -/* ctrl->handler->lock is held, so it is safe to access cur.val */ > +/* ctrl->handler->lock is held, so it is safe to access *cur.p_s32 */ > static inline int cx2341x_neq(struct v4l2_ctrl *ctrl) > { > - return ctrl && ctrl->val != ctrl->cur.val; > + return ctrl && ctrl->val != *ctrl->cur.p_s32; > } > > static int cx2341x_try_ctrl(struct v4l2_ctrl *ctrl) > diff --git a/drivers/media/i2c/adp1653.c b/drivers/media/i2c/adp1653.c > index 873fe19..7d478dc 100644 > --- a/drivers/media/i2c/adp1653.c > +++ b/drivers/media/i2c/adp1653.c > @@ -158,16 +158,16 @@ static int adp1653_get_ctrl(struct v4l2_ctrl *ctrl) > if (IS_ERR_VALUE(rval)) > return rval; > > - ctrl->cur.val = 0; > + *ctrl->cur.p_s32 = 0; > > if (flash->fault & ADP1653_REG_FAULT_FLT_SCP) > - ctrl->cur.val |= V4L2_FLASH_FAULT_SHORT_CIRCUIT; > + *ctrl->cur.p_s32 |= V4L2_FLASH_FAULT_SHORT_CIRCUIT; > if (flash->fault & ADP1653_REG_FAULT_FLT_OT) > - ctrl->cur.val |= V4L2_FLASH_FAULT_OVER_TEMPERATURE; > + *ctrl->cur.p_s32 |= V4L2_FLASH_FAULT_OVER_TEMPERATURE; > if (flash->fault & ADP1653_REG_FAULT_FLT_TMR) > - ctrl->cur.val |= V4L2_FLASH_FAULT_TIMEOUT; > + *ctrl->cur.p_s32 |= V4L2_FLASH_FAULT_TIMEOUT; > if (flash->fault & ADP1653_REG_FAULT_FLT_OV) > - ctrl->cur.val |= V4L2_FLASH_FAULT_OVER_VOLTAGE; > + *ctrl->cur.p_s32 |= V4L2_FLASH_FAULT_OVER_VOLTAGE; > > flash->fault = 0; > > diff --git a/drivers/media/i2c/as3645a.c b/drivers/media/i2c/as3645a.c > index 301084b..4c6041c 100644 > --- a/drivers/media/i2c/as3645a.c > +++ b/drivers/media/i2c/as3645a.c > @@ -334,24 +334,24 @@ static int as3645a_get_ctrl(struct v4l2_ctrl *ctrl) > if (value < 0) > return value; > > - ctrl->cur.val = 0; > + *ctrl->cur.p_s32 = 0; > if (value & AS_FAULT_INFO_SHORT_CIRCUIT) > - ctrl->cur.val |= V4L2_FLASH_FAULT_SHORT_CIRCUIT; > + *ctrl->cur.p_s32 |= V4L2_FLASH_FAULT_SHORT_CIRCUIT; > if (value & AS_FAULT_INFO_OVER_TEMPERATURE) > - ctrl->cur.val |= V4L2_FLASH_FAULT_OVER_TEMPERATURE; > + *ctrl->cur.p_s32 |= V4L2_FLASH_FAULT_OVER_TEMPERATURE; > if (value & AS_FAULT_INFO_TIMEOUT) > - ctrl->cur.val |= V4L2_FLASH_FAULT_TIMEOUT; > + *ctrl->cur.p_s32 |= V4L2_FLASH_FAULT_TIMEOUT; > if (value & AS_FAULT_INFO_OVER_VOLTAGE) > - ctrl->cur.val |= V4L2_FLASH_FAULT_OVER_VOLTAGE; > + *ctrl->cur.p_s32 |= V4L2_FLASH_FAULT_OVER_VOLTAGE; > if (value & AS_FAULT_INFO_INDUCTOR_PEAK_LIMIT) > - ctrl->cur.val |= V4L2_FLASH_FAULT_OVER_CURRENT; > + *ctrl->cur.p_s32 |= V4L2_FLASH_FAULT_OVER_CURRENT; > if (value & AS_FAULT_INFO_INDICATOR_LED) > - ctrl->cur.val |= V4L2_FLASH_FAULT_INDICATOR; > + *ctrl->cur.p_s32 |= V4L2_FLASH_FAULT_INDICATOR; > break; > > case V4L2_CID_FLASH_STROBE_STATUS: > if (flash->led_mode != V4L2_FLASH_LED_MODE_FLASH) { > - ctrl->cur.val = 0; > + *ctrl->cur.p_s32 = 0; > break; > } > > @@ -359,11 +359,11 @@ static int as3645a_get_ctrl(struct v4l2_ctrl *ctrl) > if (value < 0) > return value; > > - ctrl->cur.val = value; > + *ctrl->cur.p_s32 = value; > break; > } > > - dev_dbg(&client->dev, "G_CTRL %08x:%d\n", ctrl->id, ctrl->cur.val); > + dev_dbg(&client->dev, "G_CTRL %08x:%d\n", ctrl->id, *ctrl->cur.p_s32); > > return 0; > } > @@ -458,7 +458,7 @@ static int as3645a_set_ctrl(struct v4l2_ctrl *ctrl) > if (ret < 0) > return ret; > > - if ((ctrl->val == 0) == (ctrl->cur.val == 0)) > + if ((ctrl->val == 0) == (*ctrl->cur.p_s32 == 0)) > break; > > return as3645a_set_output(flash, false); > diff --git a/drivers/media/i2c/lm3560.c b/drivers/media/i2c/lm3560.c > index d98ca3a..edfe746 100644 > --- a/drivers/media/i2c/lm3560.c > +++ b/drivers/media/i2c/lm3560.c > @@ -188,7 +188,7 @@ static int lm3560_get_ctrl(struct v4l2_ctrl *ctrl, enum lm3560_led_id led_no) > fault |= V4L2_FLASH_FAULT_OVER_TEMPERATURE; > if (reg_val & FAULT_TIMEOUT) > fault |= V4L2_FLASH_FAULT_TIMEOUT; > - ctrl->cur.val = fault; > + *ctrl->cur.p_s32 = fault; > } > > out: > diff --git a/drivers/media/i2c/m5mols/m5mols_controls.c b/drivers/media/i2c/m5mols/m5mols_controls.c > index a60931e..7851d1f 100644 > --- a/drivers/media/i2c/m5mols/m5mols_controls.c > +++ b/drivers/media/i2c/m5mols/m5mols_controls.c > @@ -191,7 +191,7 @@ static int m5mols_3a_lock(struct m5mols_info *info, struct v4l2_ctrl *ctrl) > bool af_lock = ctrl->val & V4L2_LOCK_FOCUS; > int ret = 0; > > - if ((ctrl->val ^ ctrl->cur.val) & V4L2_LOCK_EXPOSURE) { > + if ((ctrl->val ^ *ctrl->cur.p_s32) & V4L2_LOCK_EXPOSURE) { > bool ae_lock = ctrl->val & V4L2_LOCK_EXPOSURE; > > ret = m5mols_write(&info->sd, AE_LOCK, ae_lock ? > @@ -200,7 +200,7 @@ static int m5mols_3a_lock(struct m5mols_info *info, struct v4l2_ctrl *ctrl) > return ret; > } > > - if (((ctrl->val ^ ctrl->cur.val) & V4L2_LOCK_WHITE_BALANCE) > + if (((ctrl->val ^ *ctrl->cur.p_s32) & V4L2_LOCK_WHITE_BALANCE) > && info->auto_wb->val) { > bool awb_lock = ctrl->val & V4L2_LOCK_WHITE_BALANCE; > > @@ -213,7 +213,7 @@ static int m5mols_3a_lock(struct m5mols_info *info, struct v4l2_ctrl *ctrl) > if (!info->ver.af || !af_lock) > return ret; > > - if ((ctrl->val ^ ctrl->cur.val) & V4L2_LOCK_FOCUS) > + if ((ctrl->val ^ *ctrl->cur.p_s32) & V4L2_LOCK_FOCUS) > ret = m5mols_write(&info->sd, AF_EXECUTE, REG_AF_STOP); > > return ret; > diff --git a/drivers/media/i2c/msp3400-driver.c b/drivers/media/i2c/msp3400-driver.c > index 8190fec..151016d 100644 > --- a/drivers/media/i2c/msp3400-driver.c > +++ b/drivers/media/i2c/msp3400-driver.c > @@ -411,8 +411,8 @@ void msp_update_volume(struct msp_state *state) > { > /* Force an update of the volume/mute cluster */ > v4l2_ctrl_lock(state->volume); > - state->volume->val = state->volume->cur.val; > - state->muted->val = state->muted->cur.val; > + state->volume->val = *state->volume->cur.p_s32; > + state->muted->val = *state->muted->cur.p_s32; > msp_s_ctrl(state->volume); > v4l2_ctrl_unlock(state->volume); > } > diff --git a/drivers/media/i2c/mt9p031.c b/drivers/media/i2c/mt9p031.c > index e5ddf47..28c17e0 100644 > --- a/drivers/media/i2c/mt9p031.c > +++ b/drivers/media/i2c/mt9p031.c > @@ -670,12 +670,12 @@ static int mt9p031_s_ctrl(struct v4l2_ctrl *ctrl) > case V4L2_CID_TEST_PATTERN: > if (!ctrl->val) { > /* Restore the black level compensation settings. */ > - if (mt9p031->blc_auto->cur.val != 0) { > + if (*mt9p031->blc_auto->cur.p_s32 != 0) { > ret = mt9p031_s_ctrl(mt9p031->blc_auto); > if (ret < 0) > return ret; > } > - if (mt9p031->blc_offset->cur.val != 0) { > + if (*mt9p031->blc_offset->cur.p_s32 != 0) { > ret = mt9p031_s_ctrl(mt9p031->blc_offset); > if (ret < 0) > return ret; > diff --git a/drivers/media/i2c/mt9t001.c b/drivers/media/i2c/mt9t001.c > index d41c70e..6aca05b 100644 > --- a/drivers/media/i2c/mt9t001.c > +++ b/drivers/media/i2c/mt9t001.c > @@ -447,7 +447,7 @@ static int mt9t001_s_ctrl(struct v4l2_ctrl *ctrl) > for (i = 0, count = 0; i < 4; ++i) { > struct v4l2_ctrl *gain = mt9t001->gains[i]; > > - if (gain->val != gain->cur.val) > + if (gain->val != *gain->cur.p_s32) > count++; > } > > @@ -461,7 +461,7 @@ static int mt9t001_s_ctrl(struct v4l2_ctrl *ctrl) > for (i = 0; i < 4; ++i) { > struct v4l2_ctrl *gain = mt9t001->gains[i]; > > - if (gain->val == gain->cur.val) > + if (gain->val == *gain->cur.p_s32) > continue; > > value = mt9t001_gain_value(&gain->val); > diff --git a/drivers/media/i2c/s5c73m3/s5c73m3-ctrls.c b/drivers/media/i2c/s5c73m3/s5c73m3-ctrls.c > index 8001cde..cb6da84 100644 > --- a/drivers/media/i2c/s5c73m3/s5c73m3-ctrls.c > +++ b/drivers/media/i2c/s5c73m3/s5c73m3-ctrls.c > @@ -195,14 +195,14 @@ static int s5c73m3_3a_lock(struct s5c73m3 *state, struct v4l2_ctrl *ctrl) > bool af_lock = ctrl->val & V4L2_LOCK_FOCUS; > int ret = 0; > > - if ((ctrl->val ^ ctrl->cur.val) & V4L2_LOCK_EXPOSURE) { > + if ((ctrl->val ^ *ctrl->cur.p_s32) & V4L2_LOCK_EXPOSURE) { > ret = s5c73m3_isp_command(state, COMM_AE_CON, > ae_lock ? COMM_AE_STOP : COMM_AE_START); > if (ret) > return ret; > } > > - if (((ctrl->val ^ ctrl->cur.val) & V4L2_LOCK_WHITE_BALANCE) > + if (((ctrl->val ^ *ctrl->cur.p_s32) & V4L2_LOCK_WHITE_BALANCE) > && state->ctrls.auto_wb->val) { > ret = s5c73m3_isp_command(state, COMM_AWB_CON, > awb_lock ? COMM_AWB_STOP : COMM_AWB_START); > @@ -210,7 +210,7 @@ static int s5c73m3_3a_lock(struct s5c73m3 *state, struct v4l2_ctrl *ctrl) > return ret; > } > > - if ((ctrl->val ^ ctrl->cur.val) & V4L2_LOCK_FOCUS) > + if ((ctrl->val ^ *ctrl->cur.p_s32) & V4L2_LOCK_FOCUS) > ret = s5c73m3_af_run(state, ~af_lock); > > return ret; > diff --git a/drivers/media/i2c/smiapp/smiapp-core.c b/drivers/media/i2c/smiapp/smiapp-core.c > index 8741cae..d87c5e8 100644 > --- a/drivers/media/i2c/smiapp/smiapp-core.c > +++ b/drivers/media/i2c/smiapp/smiapp-core.c > @@ -297,8 +297,8 @@ static int smiapp_pll_update(struct smiapp_sensor *sensor) > if (rval < 0) > return rval; > > - sensor->pixel_rate_parray->cur.val64 = pll->vt_pix_clk_freq_hz; > - sensor->pixel_rate_csi->cur.val64 = pll->pixel_rate_csi; > + *sensor->pixel_rate_parray->cur.p_s64 = pll->vt_pix_clk_freq_hz; > + *sensor->pixel_rate_csi->cur.p_s64 = pll->pixel_rate_csi; > > return 0; > } > @@ -324,8 +324,8 @@ static void __smiapp_update_exposure_limits(struct smiapp_sensor *sensor) > ctrl->default_value = max; > if (ctrl->val > max) > ctrl->val = max; > - if (ctrl->cur.val > max) > - ctrl->cur.val = max; > + if (*ctrl->cur.p_s32 > max) > + *ctrl->cur.p_s32 = max; > } > > /* > @@ -796,7 +796,7 @@ static void smiapp_update_blanking(struct smiapp_sensor *sensor) > vblank->minimum, vblank->maximum); > vblank->default_value = vblank->minimum; > vblank->val = vblank->val; > - vblank->cur.val = vblank->val; > + *vblank->cur.p_s32 = vblank->val; > > hblank->minimum = > max_t(int, > @@ -811,7 +811,7 @@ static void smiapp_update_blanking(struct smiapp_sensor *sensor) > hblank->minimum, hblank->maximum); > hblank->default_value = hblank->minimum; > hblank->val = hblank->val; > - hblank->cur.val = hblank->val; > + *hblank->cur.p_s32 = hblank->val; > > __smiapp_update_exposure_limits(sensor); > } > diff --git a/drivers/media/pci/cx18/cx18-av-core.c b/drivers/media/pci/cx18/cx18-av-core.c > index c4890a4..d230a9b 100644 > --- a/drivers/media/pci/cx18/cx18-av-core.c > +++ b/drivers/media/pci/cx18/cx18-av-core.c > @@ -262,7 +262,7 @@ static void cx18_av_initialize(struct v4l2_subdev *sd) > cx18_av_write(cx, 0x8d4, 20); > } > default_volume = (((228 - default_volume) >> 1) + 23) << 9; > - state->volume->cur.val = state->volume->default_value = default_volume; > + *state->volume->cur.p_s32 = state->volume->default_value = default_volume; > v4l2_ctrl_handler_setup(&state->hdl); > } > > diff --git a/drivers/media/pci/cx18/cx18-driver.c b/drivers/media/pci/cx18/cx18-driver.c > index 716bdc5..e4d0740 100644 > --- a/drivers/media/pci/cx18/cx18-driver.c > +++ b/drivers/media/pci/cx18/cx18-driver.c > @@ -756,11 +756,11 @@ static int cx18_init_struct1(struct cx18 *cx) > return ret; > cx->v4l2_dev.ctrl_handler = &cx->cxhdl.hdl; > > - cx->temporal_strength = cx->cxhdl.video_temporal_filter->cur.val; > - cx->spatial_strength = cx->cxhdl.video_spatial_filter->cur.val; > - cx->filter_mode = cx->cxhdl.video_spatial_filter_mode->cur.val | > - (cx->cxhdl.video_temporal_filter_mode->cur.val << 1) | > - (cx->cxhdl.video_median_filter_type->cur.val << 2); > + cx->temporal_strength = *cx->cxhdl.video_temporal_filter->cur.p_s32; > + cx->spatial_strength = *cx->cxhdl.video_spatial_filter->cur.p_s32; > + cx->filter_mode = *cx->cxhdl.video_spatial_filter_mode->cur.p_s32 | > + (*cx->cxhdl.video_temporal_filter_mode->cur.p_s32 << 1) | > + (*cx->cxhdl.video_median_filter_type->cur.p_s32 << 2); > > init_waitqueue_head(&cx->cap_w); > init_waitqueue_head(&cx->mb_apu_waitq); > diff --git a/drivers/media/platform/exynos4-is/fimc-core.c b/drivers/media/platform/exynos4-is/fimc-core.c > index a7dfd07..d399699 100644 > --- a/drivers/media/platform/exynos4-is/fimc-core.c > +++ b/drivers/media/platform/exynos4-is/fimc-core.c > @@ -664,7 +664,7 @@ void fimc_ctrls_activate(struct fimc_ctx *ctx, bool active) > v4l2_ctrl_activate(ctrls->alpha, active && has_alpha); > > if (active) { > - fimc_set_color_effect(ctx, ctrls->colorfx->cur.val); > + fimc_set_color_effect(ctx, *ctrls->colorfx->cur.p_s32); > ctx->rotation = ctrls->rotate->val; > ctx->hflip = ctrls->hflip->val; > ctx->vflip = ctrls->vflip->val; > @@ -689,8 +689,8 @@ void fimc_alpha_ctrl_update(struct fimc_ctx *ctx) > v4l2_ctrl_lock(ctrl); > ctrl->maximum = fimc_get_alpha_mask(ctx->d_frame.fmt); > > - if (ctrl->cur.val > ctrl->maximum) > - ctrl->cur.val = ctrl->maximum; > + if (*ctrl->cur.p_s32 > ctrl->maximum) > + *ctrl->cur.p_s32 = ctrl->maximum; > > v4l2_ctrl_unlock(ctrl); > } > diff --git a/drivers/media/platform/vivi.c b/drivers/media/platform/vivi.c > index 3c92ce3..7b9e887 100644 > --- a/drivers/media/platform/vivi.c > +++ b/drivers/media/platform/vivi.c > @@ -642,28 +642,28 @@ static void vivi_fillbuff(struct vivi_dev *dev, struct vivi_buffer *buf) > gain = v4l2_ctrl_g_ctrl(dev->gain); > mutex_lock(dev->ctrl_handler.lock); > snprintf(str, sizeof(str), " brightness %3d, contrast %3d, saturation %3d, hue %d ", > - dev->brightness->cur.val, > - dev->contrast->cur.val, > - dev->saturation->cur.val, > - dev->hue->cur.val); > + *dev->brightness->cur.p_s32, > + *dev->contrast->cur.p_s32, > + *dev->saturation->cur.p_s32, > + *dev->hue->cur.p_s32); > gen_text(dev, vbuf, line++ * 16, 16, str); > snprintf(str, sizeof(str), " autogain %d, gain %3d, volume %3d, alpha 0x%02x ", > - dev->autogain->cur.val, gain, dev->volume->cur.val, > - dev->alpha->cur.val); > + *dev->autogain->cur.p_s32, gain, *dev->volume->cur.p_s32, > + *dev->alpha->cur.p_s32); > gen_text(dev, vbuf, line++ * 16, 16, str); > snprintf(str, sizeof(str), " int32 %d, int64 %lld, bitmask %08x ", > - dev->int32->cur.val, > - dev->int64->cur.val64, > - dev->bitmask->cur.val); > + *dev->int32->cur.p_s32, > + *dev->int64->cur.p_s64, > + *dev->bitmask->cur.p_s32); > gen_text(dev, vbuf, line++ * 16, 16, str); > snprintf(str, sizeof(str), " boolean %d, menu %s, string \"%s\" ", > - dev->boolean->cur.val, > - dev->menu->qmenu[dev->menu->cur.val], > - dev->string->cur.string); > + *dev->boolean->cur.p_s32, > + dev->menu->qmenu[*dev->menu->cur.p_s32], > + dev->string->cur.p_char); > gen_text(dev, vbuf, line++ * 16, 16, str); > snprintf(str, sizeof(str), " integer_menu %lld, value %d ", > - dev->int_menu->qmenu_int[dev->int_menu->cur.val], > - dev->int_menu->cur.val); > + dev->int_menu->qmenu_int[*dev->int_menu->cur.p_s32], > + *dev->int_menu->cur.p_s32); > gen_text(dev, vbuf, line++ * 16, 16, str); > mutex_unlock(dev->ctrl_handler.lock); > if (dev->button_pressed) { > diff --git a/drivers/media/radio/radio-isa.c b/drivers/media/radio/radio-isa.c > index 6ff3508..46d188d 100644 > --- a/drivers/media/radio/radio-isa.c > +++ b/drivers/media/radio/radio-isa.c > @@ -294,7 +294,7 @@ static int radio_isa_common_remove(struct radio_isa_card *isa, > { > const struct radio_isa_ops *ops = isa->drv->ops; > > - ops->s_mute_volume(isa, true, isa->volume ? isa->volume->cur.val : 0); > + ops->s_mute_volume(isa, true, isa->volume ? *isa->volume->cur.p_s32 : 0); > video_unregister_device(&isa->vdev); > v4l2_ctrl_handler_free(&isa->hdl); > v4l2_device_unregister(&isa->v4l2_dev); > diff --git a/drivers/media/radio/radio-sf16fmr2.c b/drivers/media/radio/radio-sf16fmr2.c > index 93d864e..e393130 100644 > --- a/drivers/media/radio/radio-sf16fmr2.c > +++ b/drivers/media/radio/radio-sf16fmr2.c > @@ -154,11 +154,11 @@ static int fmr2_s_ctrl(struct v4l2_ctrl *ctrl) > switch (ctrl->id) { > case V4L2_CID_AUDIO_VOLUME: > volume = ctrl->val; > - balance = fmr2->balance->cur.val; > + balance = *fmr2->balance->cur.p_s32; > break; > case V4L2_CID_AUDIO_BALANCE: > balance = ctrl->val; > - volume = fmr2->volume->cur.val; > + volume = *fmr2->volume->cur.p_s32; > break; > default: > return -EINVAL; > diff --git a/drivers/media/usb/gspca/conex.c b/drivers/media/usb/gspca/conex.c > index 2e15c80..e8cfaf3 100644 > --- a/drivers/media/usb/gspca/conex.c > +++ b/drivers/media/usb/gspca/conex.c > @@ -887,14 +887,14 @@ static int sd_s_ctrl(struct v4l2_ctrl *ctrl) > > switch (ctrl->id) { > case V4L2_CID_BRIGHTNESS: > - setbrightness(gspca_dev, ctrl->val, sd->sat->cur.val); > + setbrightness(gspca_dev, ctrl->val, *sd->sat->cur.p_s32); > break; > case V4L2_CID_CONTRAST: > - setcontrast(gspca_dev, ctrl->val, sd->sat->cur.val); > + setcontrast(gspca_dev, ctrl->val, *sd->sat->cur.p_s32); > break; > case V4L2_CID_SATURATION: > - setbrightness(gspca_dev, sd->brightness->cur.val, ctrl->val); > - setcontrast(gspca_dev, sd->contrast->cur.val, ctrl->val); > + setbrightness(gspca_dev, *sd->brightness->cur.p_s32, ctrl->val); > + setcontrast(gspca_dev, *sd->contrast->cur.p_s32, ctrl->val); > break; > } > return gspca_dev->usb_err; > diff --git a/drivers/media/usb/gspca/sn9c20x.c b/drivers/media/usb/gspca/sn9c20x.c > index 2a38621..22d93c3 100644 > --- a/drivers/media/usb/gspca/sn9c20x.c > +++ b/drivers/media/usb/gspca/sn9c20x.c > @@ -2218,7 +2218,7 @@ static void transfer_check(struct gspca_dev *gspca_dev, > /* Note: we are in interrupt context, so we can't > use v4l2_ctrl_g/s_ctrl here. Access the value > directly instead. */ > - s32 curqual = sd->jpegqual->cur.val; > + s32 curqual = *sd->jpegqual->cur.p_s32; > sd->nchg = 0; > new_qual += curqual; > if (new_qual < sd->jpegqual->minimum) > @@ -2226,7 +2226,7 @@ static void transfer_check(struct gspca_dev *gspca_dev, > else if (new_qual > sd->jpegqual->maximum) > new_qual = sd->jpegqual->maximum; > if (new_qual != curqual) { > - sd->jpegqual->cur.val = new_qual; > + *sd->jpegqual->cur.p_s32 = new_qual; > queue_work(sd->work_thread, &sd->work); > } > } > diff --git a/drivers/media/usb/gspca/topro.c b/drivers/media/usb/gspca/topro.c > index 640c2fe..4abe03b 100644 > --- a/drivers/media/usb/gspca/topro.c > +++ b/drivers/media/usb/gspca/topro.c > @@ -3976,8 +3976,8 @@ static int sd_setgain(struct gspca_dev *gspca_dev) > s32 val = gspca_dev->gain->val; > > if (sd->sensor == SENSOR_CX0342) { > - s32 old = gspca_dev->gain->cur.val ? > - gspca_dev->gain->cur.val : 1; > + s32 old = *gspca_dev->gain->cur.p_s32 ? > + *gspca_dev->gain->cur.p_s32 : 1; > > sd->blue->val = sd->blue->val * val / old; > if (sd->blue->val > 4095) > diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c > index a136cdc..084335a 100644 > --- a/drivers/media/v4l2-core/v4l2-ctrls.c > +++ b/drivers/media/v4l2-core/v4l2-ctrls.c > @@ -47,7 +47,7 @@ struct v4l2_ctrl_helper { > mode. */ > static bool is_cur_manual(const struct v4l2_ctrl *master) > { > - return master->is_auto && master->cur.val == master->manual_mode_value; > + return master->is_auto && *master->cur.p_s32 == master->manual_mode_value; > } > > /* Same as above, but this checks the against the new value instead of the > @@ -1106,7 +1106,7 @@ static void fill_event(struct v4l2_event *ev, struct v4l2_ctrl *ctrl, u32 change > if (ctrl->is_ptr) > ev->u.ctrl.value64 = 0; > else > - ev->u.ctrl.value64 = ctrl->cur.val64; > + ev->u.ctrl.value64 = *ctrl->cur.p_s64; > ev->u.ctrl.minimum = ctrl->minimum; > ev->u.ctrl.maximum = ctrl->maximum; > if (ctrl->type == V4L2_CTRL_TYPE_MENU > @@ -1777,13 +1777,13 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl, > return NULL; > } > > - sz_extra = sizeof(union v4l2_ctrl_ptr); > + sz_extra = elem_size; > if (type == V4L2_CTRL_TYPE_BUTTON) > flags |= V4L2_CTRL_FLAG_WRITE_ONLY; > else if (type == V4L2_CTRL_TYPE_CTRL_CLASS) > flags |= V4L2_CTRL_FLAG_READ_ONLY; > else if (type == V4L2_CTRL_TYPE_STRING || type >= V4L2_CTRL_COMPLEX_TYPES) > - sz_extra += 2 * elem_size; > + sz_extra += elem_size; > > ctrl = kzalloc(sizeof(*ctrl) + sz_extra, GFP_KERNEL); > if (ctrl == NULL) { > @@ -1816,7 +1816,7 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl, > else if (type == V4L2_CTRL_TYPE_INTEGER_MENU) > ctrl->qmenu_int = qmenu_int; > ctrl->priv = priv; > - ctrl->cur.val = ctrl->val = def; > + ctrl->stores = &ctrl->cur; > data = &ctrl->stores[1]; > > if (ctrl->is_ptr) { > @@ -1824,7 +1824,7 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl, > ctrl->stores[0].p = data + elem_size; > } else { > ctrl->new.p = &ctrl->val; > - ctrl->stores[0].p = &ctrl->cur.val; > + ctrl->stores[0].p = data; > } > for (s = -1; s <= 0; s++) > ctrl->type_ops->init(ctrl, ctrl->stores[s]); > @@ -3090,10 +3090,10 @@ int v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl, > ctrl->maximum = max; > ctrl->step = step; > ctrl->default_value = def; > - c.value = ctrl->cur.val; > + c.value = *ctrl->cur.p_s32; > if (validate_new(ctrl, &c)) > c.value = def; > - if (c.value != ctrl->cur.val) > + if (c.value != *ctrl->cur.p_s32) > ret = set_ctrl(NULL, ctrl, &c, V4L2_EVENT_CTRL_CH_RANGE); > else > send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_RANGE); > diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h > index 9eeb9d9..4f66393 100644 > --- a/include/media/v4l2-ctrls.h > +++ b/include/media/v4l2-ctrls.h > @@ -198,14 +198,9 @@ struct v4l2_ctrl { > char *string; > void *p; > }; > - union { > - s32 val; > - s64 val64; > - char *string; > - void *p; > - } cur; > + union v4l2_ctrl_ptr *stores; > union v4l2_ctrl_ptr new; > - union v4l2_ctrl_ptr stores[]; > + union v4l2_ctrl_ptr cur; > }; > > /** struct v4l2_ctrl_ref - The control reference. -- Regards, Mauro -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html