@@ -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+
57205767static 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