Skip to content

Commit d2b4477

Browse files
author
Zefa Chen
committed
media: i2c: ox03c10 support set cmps mode
Change-Id: Ic8833240c4ec25d6e8483c2421e6b3a99dbcac9b Signed-off-by: Zefa Chen <[email protected]>
1 parent 1f80fbf commit d2b4477

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed

drivers/media/i2c/ox03c10.c

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5717,6 +5717,53 @@ static int ox03c10_select_exp_mode(struct ox03c10 *ox03c10, u32 exp_mode)
57175717
return ret;
57185718
}
57195719

5720+
static int ox03c10_select_cmps_mode(struct ox03c10 *ox03c10, u32 cmps_mode)
5721+
{
5722+
int ret = -EINVAL;
5723+
u32 i, h, w, hdr_mode, exp_mode;
5724+
int best_fit = -1;
5725+
int bit_width = 0;
5726+
5727+
w = ox03c10->cur_mode->width;
5728+
h = ox03c10->cur_mode->height;
5729+
hdr_mode = ox03c10->cur_mode->hdr_mode;
5730+
exp_mode = ox03c10->cur_mode->exp_mode;
5731+
for (i = 0; i < ARRAY_SIZE(supported_modes); i++) {
5732+
if (w == supported_modes[i].width &&
5733+
h == supported_modes[i].height &&
5734+
supported_modes[i].hdr_mode == hdr_mode &&
5735+
supported_modes[i].exp_mode == exp_mode) {
5736+
if (cmps_mode == CMPS_LOW_BIT_WIDTH_MODE) {
5737+
if (bit_width == 0) {
5738+
bit_width = supported_modes[i].bpp;
5739+
best_fit = i;
5740+
} else if (supported_modes[i].bpp < bit_width) {
5741+
bit_width = supported_modes[i].bpp;
5742+
best_fit = i;
5743+
}
5744+
} else {
5745+
if (bit_width == 0) {
5746+
bit_width = supported_modes[i].bpp;
5747+
best_fit = i;
5748+
} else if (supported_modes[i].bpp > bit_width) {
5749+
bit_width = supported_modes[i].bpp;
5750+
best_fit = i;
5751+
}
5752+
}
5753+
}
5754+
}
5755+
if (best_fit >= 0) {
5756+
ox03c10->cur_mode = &supported_modes[i];
5757+
w = ox03c10->cur_mode->hts_def - ox03c10->cur_mode->width;
5758+
h = ox03c10->cur_mode->vts_def - ox03c10->cur_mode->height;
5759+
__v4l2_ctrl_modify_range(ox03c10->hblank, w, w, 1, w);
5760+
__v4l2_ctrl_modify_range(ox03c10->vblank, h,
5761+
OX03C10_VTS_MAX - ox03c10->cur_mode->height, 1, h);
5762+
ret = 0;
5763+
}
5764+
return ret;
5765+
}
5766+
57205767
static long ox03c10_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
57215768
{
57225769
struct ox03c10 *ox03c10 = to_ox03c10(sd);
@@ -5820,6 +5867,9 @@ static long ox03c10_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
58205867
blc_info = (struct rkmodule_blc_info *)arg;
58215868
blc_info->bit_width = 10;
58225869
break;
5870+
case RKMODULE_SET_CMPS_MODE:
5871+
ret = ox03c10_select_cmps_mode(ox03c10, *(u32 *)arg);
5872+
break;
58235873
default:
58245874
ret = -ENOIOCTLCMD;
58255875
break;
@@ -5846,6 +5896,7 @@ static long ox03c10_compat_ioctl32(struct v4l2_subdev *sd,
58465896
u32 exp_mode;
58475897
struct rkmodule_wb_gain_info *wb_gain_info;
58485898
struct rkmodule_blc_info *blc_info;
5899+
u32 cmps_mode;
58495900

58505901
switch (cmd) {
58515902
case RKMODULE_GET_MODULE_INFO:
@@ -6047,6 +6098,11 @@ static long ox03c10_compat_ioctl32(struct v4l2_subdev *sd,
60476098
}
60486099
kfree(blc_info);
60496100
break;
6101+
case RKMODULE_SET_CMPS_MODE:
6102+
if (copy_from_user(&cmps_mode, up, sizeof(u32)))
6103+
return -EFAULT;
6104+
ret = ox03c10_ioctl(sd, cmd, &cmps_mode);
6105+
break;
60506106
default:
60516107
ret = -ENOIOCTLCMD;
60526108
break;

0 commit comments

Comments
 (0)