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);
+       pr_info("String value is '%s'\n", ctrl1->p_cur.p_char);
        printk(KERN_INFO "Integer value is '%s'\n", ctrl2->cur.val);
        mutex_unlock(&state->ctrl_handler.lock);
 
 
                        break;
 
                freq = mt9v032->pdata->link_freqs[mt9v032->link_freq->val];
-               mt9v032->pixel_rate->val64 = freq;
+               *mt9v032->pixel_rate->p_new.p_s64 = freq;
                mt9v032->sysclk = freq;
                break;
 
 
        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->p_cur.p_s64 = pll->vt_pix_clk_freq_hz;
+       *sensor->pixel_rate_csi->p_cur.p_s64 = pll->pixel_rate_csi;
 
        return 0;
 }
 
        /* V4L2_CID_MPEG_VIDEO_DEC_PTS and V4L2_CID_MPEG_VIDEO_DEC_FRAME
           control cluster */
        case V4L2_CID_MPEG_VIDEO_DEC_PTS:
-               return ivtv_g_pts_frame(itv, &itv->ctrl_pts->val64,
-                                            &itv->ctrl_frame->val64);
+               return ivtv_g_pts_frame(itv, itv->ctrl_pts->p_new.p_s64,
+                                            itv->ctrl_frame->p_new.p_s64);
        }
        return 0;
 }
 
        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->int64->p_cur.p_s64,
                        dev->bitmask->cur.val);
        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->string->p_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],
 
 
                switch (ctrl->id) {
                case V4L2_CID_RDS_TX_PS_NAME:
-                       ret = si4713_set_rds_ps_name(sdev, ctrl->string);
+                       ret = si4713_set_rds_ps_name(sdev, ctrl->p_new.p_char);
                        break;
 
                case V4L2_CID_RDS_TX_RADIO_TEXT:
-                       ret = si4713_set_rds_radio_text(sdev, ctrl->string);
+                       ret = si4713_set_rds_radio_text(sdev, ctrl->p_new.p_char);
                        break;
 
                case V4L2_CID_TUNE_ANTENNA_CAPACITOR:
 
        if (ctrl->is_ptr)
                ev->u.ctrl.value64 = 0;
        else
-               ev->u.ctrl.value64 = ctrl->cur.val64;
+               ev->u.ctrl.value64 = *ctrl->p_cur.p_s64;
        ev->u.ctrl.minimum = ctrl->minimum;
        ev->u.ctrl.maximum = ctrl->maximum;
        if (ctrl->type == V4L2_CTRL_TYPE_MENU
                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_COMPOUND_TYPES)
+       else if (type == V4L2_CTRL_TYPE_INTEGER64 ||
+                type == V4L2_CTRL_TYPE_STRING ||
+                type >= V4L2_CTRL_COMPOUND_TYPES)
                sz_extra += 2 * elem_size;
 
        ctrl = kzalloc(sizeof(*ctrl) + sz_extra, GFP_KERNEL);
                ctrl->qmenu_int = qmenu_int;
        ctrl->priv = priv;
        ctrl->cur.val = ctrl->val = def;
-       data = &ctrl->cur + 1;
+       data = &ctrl[1];
 
-       if (ctrl->is_ptr) {
-               ctrl->p = ctrl->p_new.p = data;
+       if (!ctrl->is_int) {
+               ctrl->p_new.p = data;
                ctrl->p_cur.p = data + elem_size;
        } else {
                ctrl->p_new.p = &ctrl->val;
        ctrl->maximum = max;
        ctrl->step = step;
        ctrl->default_value = def;
-       c.value = ctrl->cur.val;
+       c.value = *ctrl->p_cur.p_s32;
        if (validate_new(ctrl, &c))
                c.value = def;
-       if (c.value != ctrl->cur.val)
+       if (c.value != *ctrl->p_cur.p_s32)
                ret = set_ctrl(NULL, ctrl, &c, V4L2_EVENT_CTRL_CH_RANGE);
        else
                send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_RANGE);
 
                solo_motion_toggle(solo_enc, ctrl->val);
                return 0;
        case V4L2_CID_OSD_TEXT:
-               strcpy(solo_enc->osd_text, ctrl->string);
+               strcpy(solo_enc->osd_text, ctrl->p_new.p_char);
                err = solo_osd_print(solo_enc);
                return err;
        default:
 
        };
        unsigned long flags;
        void *priv;
-       union {
-               s32 val;
-               s64 val64;
-               char *string;
-               void *p;
-       };
-       union {
+       s32 val;
+       struct {
                s32 val;
-               s64 val64;
-               char *string;
-               void *p;
        } cur;
 
        union v4l2_ctrl_ptr p_new;