* @exposure: manual exposure control
* @auto_iso: auto/manual ISO sensitivity control
* @iso: manual ISO sensitivity control
- * @autowb: Auto White Balance control
+ * @auto_wb: auto white balance control
* @colorfx: color effect control
* @saturation: saturation control
* @zoom: zoom control
struct v4l2_ctrl *auto_iso;
struct v4l2_ctrl *iso;
};
-
struct v4l2_ctrl *auto_wb;
+
struct v4l2_ctrl *colorfx;
struct v4l2_ctrl *saturation;
struct v4l2_ctrl *zoom;
return ret;
}
-static int m5mols_set_white_balance(struct m5mols_info *info, int awb)
+static int m5mols_set_white_balance(struct m5mols_info *info, int val)
{
- int ret;
+ static const unsigned short wb[][2] = {
+ { V4L2_WHITE_BALANCE_INCANDESCENT, REG_AWB_INCANDESCENT },
+ { V4L2_WHITE_BALANCE_FLUORESCENT, REG_AWB_FLUORESCENT_1 },
+ { V4L2_WHITE_BALANCE_FLUORESCENT_H, REG_AWB_FLUORESCENT_2 },
+ { V4L2_WHITE_BALANCE_HORIZON, REG_AWB_HORIZON },
+ { V4L2_WHITE_BALANCE_DAYLIGHT, REG_AWB_DAYLIGHT },
+ { V4L2_WHITE_BALANCE_FLASH, REG_AWB_LEDLIGHT },
+ { V4L2_WHITE_BALANCE_CLOUDY, REG_AWB_CLOUDY },
+ { V4L2_WHITE_BALANCE_SHADE, REG_AWB_SHADE },
+ { V4L2_WHITE_BALANCE_AUTO, REG_AWB_AUTO },
+ };
+ int i;
+ struct v4l2_subdev *sd = &info->sd;
+ int ret = -EINVAL;
- ret = m5mols_lock_awb(info, !awb);
- if (ret < 0)
- return ret;
+ for (i = 0; i < ARRAY_SIZE(wb); i++) {
+ int awb;
+ if (wb[i][0] != val)
+ continue;
+
+ v4l2_dbg(1, m5mols_debug, sd,
+ "Setting white balance to: %#x\n", wb[i][0]);
- return m5mols_write(&info->sd, AWB_MODE, awb ? REG_AWB_AUTO :
- REG_AWB_PRESET);
+ awb = wb[i][0] == V4L2_WHITE_BALANCE_AUTO;
+ ret = m5mols_write(sd, AWB_MODE, awb ? REG_AWB_AUTO :
+ REG_AWB_PRESET);
+ if (ret < 0)
+ return ret;
+
+ if (!awb)
+ ret = m5mols_write(sd, AWB_MANUAL, wb[i][1]);
+ }
+
+ return ret;
}
static int m5mols_set_saturation(struct m5mols_info *info, int val)
ret = m5mols_set_iso(info, ctrl->val);
break;
- case V4L2_CID_AUTO_WHITE_BALANCE:
+ case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE:
ret = m5mols_set_white_balance(info, ctrl->val);
break;
v4l2_ctrl_handler_init(&info->handle, 6);
- info->auto_wb = v4l2_ctrl_new_std(&info->handle, &m5mols_ctrl_ops,
- V4L2_CID_AUTO_WHITE_BALANCE, 0, 1, 1, 1);
+ info->auto_wb = v4l2_ctrl_new_std_menu(&info->handle,
+ &m5mols_ctrl_ops, V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE,
+ 9, ~0x3fe, V4L2_WHITE_BALANCE_AUTO);
info->auto_exposure = v4l2_ctrl_new_std_menu(&info->handle,
&m5mols_ctrl_ops, V4L2_CID_EXPOSURE_AUTO,