26
26
#define IMX415_PIXEL_ARRAY_WIDTH 3864
27
27
#define IMX415_PIXEL_ARRAY_HEIGHT 2192
28
28
#define IMX415_PIXEL_ARRAY_VBLANK 58
29
+ #define IMX415_EXPOSURE_OFFSET 8
29
30
30
31
#define IMX415_NUM_CLK_PARAM_REGS 11
31
32
51
52
#define IMX415_OUTSEL CCI_REG8(0x30c0)
52
53
#define IMX415_DRV CCI_REG8(0x30c1)
53
54
#define IMX415_VMAX CCI_REG24_LE(0x3024)
55
+ #define IMX415_VMAX_MAX 0xfffff
54
56
#define IMX415_HMAX CCI_REG16_LE(0x3028)
55
57
#define IMX415_SHR0 CCI_REG24_LE(0x3050)
56
58
#define IMX415_GAIN_PCG_0 CCI_REG16_LE(0x3090)
@@ -447,7 +449,6 @@ static const struct imx415_clk_params imx415_clk_params[] = {
447
449
448
450
/* all-pixel 2-lane 720 Mbps 15.74 Hz mode */
449
451
static const struct cci_reg_sequence imx415_mode_2_720 [] = {
450
- { IMX415_VMAX , 0x08CA },
451
452
{ IMX415_HMAX , 0x07F0 },
452
453
{ IMX415_LANEMODE , IMX415_LANEMODE_2 },
453
454
{ IMX415_TCLKPOST , 0x006F },
@@ -463,7 +464,6 @@ static const struct cci_reg_sequence imx415_mode_2_720[] = {
463
464
464
465
/* all-pixel 2-lane 1440 Mbps 30.01 Hz mode */
465
466
static const struct cci_reg_sequence imx415_mode_2_1440 [] = {
466
- { IMX415_VMAX , 0x08CA },
467
467
{ IMX415_HMAX , 0x042A },
468
468
{ IMX415_LANEMODE , IMX415_LANEMODE_2 },
469
469
{ IMX415_TCLKPOST , 0x009F },
@@ -479,7 +479,6 @@ static const struct cci_reg_sequence imx415_mode_2_1440[] = {
479
479
480
480
/* all-pixel 4-lane 891 Mbps 30 Hz mode */
481
481
static const struct cci_reg_sequence imx415_mode_4_891 [] = {
482
- { IMX415_VMAX , 0x08CA },
483
482
{ IMX415_HMAX , 0x044C },
484
483
{ IMX415_LANEMODE , IMX415_LANEMODE_4 },
485
484
{ IMX415_TCLKPOST , 0x007F },
@@ -600,6 +599,7 @@ struct imx415 {
600
599
struct v4l2_ctrl * vblank ;
601
600
struct v4l2_ctrl * hflip ;
602
601
struct v4l2_ctrl * vflip ;
602
+ struct v4l2_ctrl * exposure ;
603
603
604
604
unsigned int cur_mode ;
605
605
unsigned int num_data_lanes ;
@@ -730,17 +730,37 @@ static int imx415_s_ctrl(struct v4l2_ctrl *ctrl)
730
730
ctrls );
731
731
const struct v4l2_mbus_framefmt * format ;
732
732
struct v4l2_subdev_state * state ;
733
+ u32 exposure_max ;
733
734
unsigned int vmax ;
734
735
unsigned int flip ;
735
736
int ret ;
736
737
737
- if (!pm_runtime_get_if_in_use (sensor -> dev ))
738
- return 0 ;
739
-
740
738
state = v4l2_subdev_get_locked_active_state (& sensor -> subdev );
741
739
format = v4l2_subdev_state_get_format (state , 0 );
742
740
741
+ if (ctrl -> id == V4L2_CID_VBLANK ) {
742
+ exposure_max = format -> height + ctrl -> val -
743
+ IMX415_EXPOSURE_OFFSET ;
744
+ __v4l2_ctrl_modify_range (sensor -> exposure ,
745
+ sensor -> exposure -> minimum ,
746
+ exposure_max , sensor -> exposure -> step ,
747
+ sensor -> exposure -> default_value );
748
+ }
749
+
750
+ if (!pm_runtime_get_if_in_use (sensor -> dev ))
751
+ return 0 ;
752
+
743
753
switch (ctrl -> id ) {
754
+ case V4L2_CID_VBLANK :
755
+ ret = cci_write (sensor -> regmap , IMX415_VMAX ,
756
+ format -> height + ctrl -> val , NULL );
757
+ if (ret )
758
+ return ret ;
759
+ /*
760
+ * Deliberately fall through as exposure is set based on VMAX
761
+ * which has just changed.
762
+ */
763
+ fallthrough ;
744
764
case V4L2_CID_EXPOSURE :
745
765
/* clamp the exposure value to VMAX. */
746
766
vmax = format -> height + sensor -> vblank -> cur .val ;
@@ -787,7 +807,8 @@ static int imx415_ctrls_init(struct imx415 *sensor)
787
807
u64 pixel_rate = supported_modes [sensor -> cur_mode ].pixel_rate ;
788
808
u64 lane_rate = supported_modes [sensor -> cur_mode ].lane_rate ;
789
809
u32 exposure_max = IMX415_PIXEL_ARRAY_HEIGHT +
790
- IMX415_PIXEL_ARRAY_VBLANK - 8 ;
810
+ IMX415_PIXEL_ARRAY_VBLANK -
811
+ IMX415_EXPOSURE_OFFSET ;
791
812
u32 hblank ;
792
813
unsigned int i ;
793
814
int ret ;
@@ -816,8 +837,9 @@ static int imx415_ctrls_init(struct imx415 *sensor)
816
837
if (ctrl )
817
838
ctrl -> flags |= V4L2_CTRL_FLAG_READ_ONLY ;
818
839
819
- v4l2_ctrl_new_std (& sensor -> ctrls , & imx415_ctrl_ops , V4L2_CID_EXPOSURE ,
820
- 4 , exposure_max , 1 , exposure_max );
840
+ sensor -> exposure = v4l2_ctrl_new_std (& sensor -> ctrls , & imx415_ctrl_ops ,
841
+ V4L2_CID_EXPOSURE , 4 ,
842
+ exposure_max , 1 , exposure_max );
821
843
822
844
v4l2_ctrl_new_std (& sensor -> ctrls , & imx415_ctrl_ops ,
823
845
V4L2_CID_ANALOGUE_GAIN , IMX415_AGAIN_MIN ,
@@ -834,16 +856,9 @@ static int imx415_ctrls_init(struct imx415 *sensor)
834
856
sensor -> vblank = v4l2_ctrl_new_std (& sensor -> ctrls , & imx415_ctrl_ops ,
835
857
V4L2_CID_VBLANK ,
836
858
IMX415_PIXEL_ARRAY_VBLANK ,
837
- IMX415_PIXEL_ARRAY_VBLANK , 1 ,
838
- IMX415_PIXEL_ARRAY_VBLANK );
839
- if (sensor -> vblank )
840
- sensor -> vblank -> flags |= V4L2_CTRL_FLAG_READ_ONLY ;
859
+ IMX415_VMAX_MAX - IMX415_PIXEL_ARRAY_HEIGHT ,
860
+ 1 , IMX415_PIXEL_ARRAY_VBLANK );
841
861
842
- /*
843
- * The pixel rate used here is a virtual value and can be used for
844
- * calculating the frame rate together with hblank. It may not
845
- * necessarily be the physically correct pixel clock.
846
- */
847
862
v4l2_ctrl_new_std (& sensor -> ctrls , NULL , V4L2_CID_PIXEL_RATE , pixel_rate ,
848
863
pixel_rate , 1 , pixel_rate );
849
864
0 commit comments