• Home
  • Raw
  • Download

Lines Matching full:sensor

161 static int ar0521_code_to_bpp(struct ar0521_dev *sensor)  in ar0521_code_to_bpp()  argument
163 switch (sensor->fmt.code) { in ar0521_code_to_bpp()
172 static int ar0521_write_regs(struct ar0521_dev *sensor, const __be16 *data, in ar0521_write_regs() argument
175 struct i2c_client *client = sensor->i2c_client; in ar0521_write_regs()
187 v4l2_err(&sensor->sd, "%s: I2C write error\n", __func__); in ar0521_write_regs()
194 static int ar0521_write_reg(struct ar0521_dev *sensor, u16 reg, u16 val) in ar0521_write_reg() argument
198 return ar0521_write_regs(sensor, buf, 2); in ar0521_write_reg()
201 static int ar0521_set_geometry(struct ar0521_dev *sensor) in ar0521_set_geometry() argument
204 u16 x = clamp((AR0521_WIDTH_MAX - sensor->fmt.width) / 2, in ar0521_set_geometry()
206 u16 y = clamp(((AR0521_HEIGHT_MAX - sensor->fmt.height) / 2) & ~1, in ar0521_set_geometry()
212 be(sensor->fmt.height + sensor->ctrls.vblank->val), in ar0521_set_geometry()
213 be(sensor->fmt.width + sensor->ctrls.hblank->val), in ar0521_set_geometry()
216 be(x + sensor->fmt.width - 1), in ar0521_set_geometry()
217 be(y + sensor->fmt.height - 1), in ar0521_set_geometry()
218 be(sensor->fmt.width), in ar0521_set_geometry()
219 be(sensor->fmt.height) in ar0521_set_geometry()
222 return ar0521_write_regs(sensor, regs, ARRAY_SIZE(regs)); in ar0521_set_geometry()
225 static int ar0521_set_gains(struct ar0521_dev *sensor) in ar0521_set_gains() argument
227 int green = sensor->ctrls.gain->val; in ar0521_set_gains()
228 int red = max(green + sensor->ctrls.red_balance->val, 0); in ar0521_set_gains()
229 int blue = max(green + sensor->ctrls.blue_balance->val, 0); in ar0521_set_gains()
243 return ar0521_write_regs(sensor, regs, ARRAY_SIZE(regs)); in ar0521_set_gains()
246 static u32 calc_pll(struct ar0521_dev *sensor, u32 freq, u16 *pre_ptr, u16 *mult_ptr) in calc_pll() argument
254 sensor->extclk_freq); in calc_pll()
260 if (sensor->extclk_freq * (u64)new_mult < AR0521_PLL_MIN * in calc_pll()
263 if (sensor->extclk_freq * (u64)new_mult > AR0521_PLL_MAX * in calc_pll()
266 new_pll = div64_round_up(sensor->extclk_freq * (u64)new_mult, in calc_pll()
275 pll = div64_round(sensor->extclk_freq * (u64)mult, pre); in calc_pll()
281 static void ar0521_calc_pll(struct ar0521_dev *sensor) in ar0521_calc_pll() argument
334 pixel_clock = AR0521_PIXEL_CLOCK_RATE * 2 / sensor->lane_count; in ar0521_calc_pll()
335 bpp = ar0521_code_to_bpp(sensor); in ar0521_calc_pll()
336 sensor->pll.vt_pix = bpp / 2; in ar0521_calc_pll()
337 vco = pixel_clock * sensor->pll.vt_pix; in ar0521_calc_pll()
339 calc_pll(sensor, vco, &pre, &mult); in ar0521_calc_pll()
341 sensor->pll.pre = sensor->pll.pre2 = pre; in ar0521_calc_pll()
342 sensor->pll.mult = sensor->pll.mult2 = mult; in ar0521_calc_pll()
345 static int ar0521_pll_config(struct ar0521_dev *sensor) in ar0521_pll_config() argument
349 /* 0x300 */ be(sensor->pll.vt_pix), /* vt_pix_clk_div = bpp / 2 */ in ar0521_pll_config()
351 /* 0x304 */ be((sensor->pll.pre2 << 8) | sensor->pll.pre), in ar0521_pll_config()
352 /* 0x306 */ be((sensor->pll.mult2 << 8) | sensor->pll.mult), in ar0521_pll_config()
353 /* 0x308 */ be(sensor->pll.vt_pix * 2), /* op_pix_clk_div = 2 * vt_pix_clk_div */ in ar0521_pll_config()
357 ar0521_calc_pll(sensor); in ar0521_pll_config()
358 return ar0521_write_regs(sensor, pll_regs, ARRAY_SIZE(pll_regs)); in ar0521_pll_config()
361 static int ar0521_set_stream(struct ar0521_dev *sensor, bool on) in ar0521_set_stream() argument
366 ret = pm_runtime_resume_and_get(&sensor->i2c_client->dev); in ar0521_set_stream()
371 ret = ar0521_write_reg(sensor, AR0521_REG_RESET, in ar0521_set_stream()
376 ret = ar0521_set_geometry(sensor); in ar0521_set_stream()
380 ret = ar0521_pll_config(sensor); in ar0521_set_stream()
384 ret = __v4l2_ctrl_handler_setup(&sensor->ctrls.handler); in ar0521_set_stream()
389 ret = ar0521_write_reg(sensor, AR0521_REG_HISPI_CONTROL_STATUS, in ar0521_set_stream()
395 ret = ar0521_write_reg(sensor, AR0521_REG_RESET, in ar0521_set_stream()
404 pm_runtime_put(&sensor->i2c_client->dev); in ar0521_set_stream()
409 * Reset gain, the sensor may produce all white pixels without in ar0521_set_stream()
412 ret = ar0521_write_reg(sensor, AR0521_REG_GLOBAL_GAIN, 0x2000); in ar0521_set_stream()
417 ret = ar0521_write_reg(sensor, AR0521_REG_RESET, in ar0521_set_stream()
422 pm_runtime_put(&sensor->i2c_client->dev); in ar0521_set_stream()
445 struct ar0521_dev *sensor = to_ar0521_dev(sd); in ar0521_get_fmt() local
448 mutex_lock(&sensor->lock); in ar0521_get_fmt()
451 fmt = v4l2_subdev_get_try_format(&sensor->sd, sd_state, 0 in ar0521_get_fmt()
454 fmt = &sensor->fmt; in ar0521_get_fmt()
458 mutex_unlock(&sensor->lock); in ar0521_get_fmt()
466 struct ar0521_dev *sensor = to_ar0521_dev(sd); in ar0521_set_fmt() local
472 mutex_lock(&sensor->lock); in ar0521_set_fmt()
480 mutex_unlock(&sensor->lock); in ar0521_set_fmt()
485 sensor->fmt = format->format; in ar0521_set_fmt()
486 ar0521_calc_pll(sensor); in ar0521_set_fmt()
492 max_hblank = AR0521_TOTAL_WIDTH_MAX - sensor->fmt.width; in ar0521_set_fmt()
493 ret = __v4l2_ctrl_modify_range(sensor->ctrls.hblank, in ar0521_set_fmt()
494 sensor->ctrls.hblank->minimum, in ar0521_set_fmt()
495 max_hblank, sensor->ctrls.hblank->step, in ar0521_set_fmt()
496 sensor->ctrls.hblank->minimum); in ar0521_set_fmt()
500 ret = __v4l2_ctrl_s_ctrl(sensor->ctrls.hblank, in ar0521_set_fmt()
501 sensor->ctrls.hblank->minimum); in ar0521_set_fmt()
505 max_vblank = AR0521_TOTAL_HEIGHT_MAX - sensor->fmt.height; in ar0521_set_fmt()
506 ret = __v4l2_ctrl_modify_range(sensor->ctrls.vblank, in ar0521_set_fmt()
507 sensor->ctrls.vblank->minimum, in ar0521_set_fmt()
508 max_vblank, sensor->ctrls.vblank->step, in ar0521_set_fmt()
509 sensor->ctrls.vblank->minimum); in ar0521_set_fmt()
513 ret = __v4l2_ctrl_s_ctrl(sensor->ctrls.vblank, in ar0521_set_fmt()
514 sensor->ctrls.vblank->minimum); in ar0521_set_fmt()
518 exposure_max = sensor->fmt.height + AR0521_HEIGHT_BLANKING_MIN - 4; in ar0521_set_fmt()
519 ret = __v4l2_ctrl_modify_range(sensor->ctrls.exposure, in ar0521_set_fmt()
520 sensor->ctrls.exposure->minimum, in ar0521_set_fmt()
522 sensor->ctrls.exposure->step, in ar0521_set_fmt()
523 sensor->ctrls.exposure->default_value); in ar0521_set_fmt()
525 mutex_unlock(&sensor->lock); in ar0521_set_fmt()
533 struct ar0521_dev *sensor = to_ar0521_dev(sd); in ar0521_s_ctrl() local
541 exp_max = sensor->fmt.height + ctrl->val - 4; in ar0521_s_ctrl()
542 __v4l2_ctrl_modify_range(sensor->ctrls.exposure, in ar0521_s_ctrl()
543 sensor->ctrls.exposure->minimum, in ar0521_s_ctrl()
544 exp_max, sensor->ctrls.exposure->step, in ar0521_s_ctrl()
545 sensor->ctrls.exposure->default_value); in ar0521_s_ctrl()
549 /* access the sensor only if it's powered up */ in ar0521_s_ctrl()
550 if (!pm_runtime_get_if_in_use(&sensor->i2c_client->dev)) in ar0521_s_ctrl()
556 ret = ar0521_set_geometry(sensor); in ar0521_s_ctrl()
559 ret = ar0521_write_reg(sensor, AR0521_REG_ANA_GAIN_CODE_GLOBAL, in ar0521_s_ctrl()
565 ret = ar0521_set_gains(sensor); in ar0521_s_ctrl()
568 ret = ar0521_write_reg(sensor, in ar0521_s_ctrl()
573 ret = ar0521_write_reg(sensor, AR0521_REG_TEST_PATTERN_MODE, in ar0521_s_ctrl()
577 dev_err(&sensor->i2c_client->dev, in ar0521_s_ctrl()
583 pm_runtime_put(&sensor->i2c_client->dev); in ar0521_s_ctrl()
598 static int ar0521_init_controls(struct ar0521_dev *sensor) in ar0521_init_controls() argument
601 struct ar0521_ctrls *ctrls = &sensor->ctrls; in ar0521_init_controls()
610 hdl->lock = &sensor->lock; in ar0521_init_controls()
666 sensor->sd.ctrl_handler = hdl; in ar0521_init_controls()
844 struct ar0521_dev *sensor = to_ar0521_dev(sd); in ar0521_power_off() local
847 clk_disable_unprepare(sensor->extclk); in ar0521_power_off()
849 if (sensor->reset_gpio) in ar0521_power_off()
850 gpiod_set_value(sensor->reset_gpio, 1); /* assert RESET signal */ in ar0521_power_off()
853 if (sensor->supplies[i]) in ar0521_power_off()
854 regulator_disable(sensor->supplies[i]); in ar0521_power_off()
862 struct ar0521_dev *sensor = to_ar0521_dev(sd); in ar0521_power_on() local
867 if (sensor->supplies[cnt]) { in ar0521_power_on()
868 ret = regulator_enable(sensor->supplies[cnt]); in ar0521_power_on()
875 ret = clk_prepare_enable(sensor->extclk); in ar0521_power_on()
877 v4l2_err(&sensor->sd, "error enabling sensor clock\n"); in ar0521_power_on()
882 if (sensor->reset_gpio) in ar0521_power_on()
884 gpiod_set_value(sensor->reset_gpio, 0); in ar0521_power_on()
888 ret = ar0521_write_regs(sensor, initial_regs[cnt].data, in ar0521_power_on()
894 ret = ar0521_write_reg(sensor, AR0521_REG_SERIAL_FORMAT, in ar0521_power_on()
896 sensor->lane_count); in ar0521_power_on()
901 ret = ar0521_write_reg(sensor, AR0521_REG_HISPI_TEST_MODE, in ar0521_power_on()
902 ((0x40 << sensor->lane_count) - 0x40) | in ar0521_power_on()
907 ret = ar0521_write_reg(sensor, AR0521_REG_ROW_SPEED, 0x110 | in ar0521_power_on()
908 4 / sensor->lane_count); in ar0521_power_on()
922 struct ar0521_dev *sensor = to_ar0521_dev(sd); in ar0521_enum_mbus_code() local
927 code->code = sensor->fmt.code; in ar0521_enum_mbus_code()
951 struct ar0521_dev *sensor = to_ar0521_dev(sd); in ar0521_pre_streamon() local
957 ret = pm_runtime_resume_and_get(&sensor->i2c_client->dev); in ar0521_pre_streamon()
962 ret = ar0521_write_reg(sensor, AR0521_REG_HISPI_CONTROL_STATUS, in ar0521_pre_streamon()
968 ret = ar0521_write_reg(sensor, AR0521_REG_RESET, in ar0521_pre_streamon()
976 pm_runtime_put(&sensor->i2c_client->dev); in ar0521_pre_streamon()
982 struct ar0521_dev *sensor = to_ar0521_dev(sd); in ar0521_post_streamoff() local
984 pm_runtime_put(&sensor->i2c_client->dev); in ar0521_post_streamoff()
990 struct ar0521_dev *sensor = to_ar0521_dev(sd); in ar0521_s_stream() local
993 mutex_lock(&sensor->lock); in ar0521_s_stream()
995 ret = ar0521_set_stream(sensor, enable); in ar0521_s_stream()
997 sensor->streaming = enable; in ar0521_s_stream()
999 mutex_unlock(&sensor->lock); in ar0521_s_stream()
1029 struct ar0521_dev *sensor = to_ar0521_dev(sd); in ar0521_suspend() local
1031 if (sensor->streaming) in ar0521_suspend()
1032 ar0521_set_stream(sensor, 0); in ar0521_suspend()
1040 struct ar0521_dev *sensor = to_ar0521_dev(sd); in ar0521_resume() local
1042 if (sensor->streaming) in ar0521_resume()
1043 return ar0521_set_stream(sensor, 1); in ar0521_resume()
1055 struct ar0521_dev *sensor; in ar0521_probe() local
1059 sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL); in ar0521_probe()
1060 if (!sensor) in ar0521_probe()
1063 sensor->i2c_client = client; in ar0521_probe()
1064 sensor->fmt.width = AR0521_WIDTH_MAX; in ar0521_probe()
1065 sensor->fmt.height = AR0521_HEIGHT_MAX; in ar0521_probe()
1086 sensor->lane_count = ep.bus.mipi_csi2.num_data_lanes; in ar0521_probe()
1087 switch (sensor->lane_count) { in ar0521_probe()
1098 sensor->extclk = devm_clk_get(dev, "extclk"); in ar0521_probe()
1099 if (IS_ERR(sensor->extclk)) { in ar0521_probe()
1101 return PTR_ERR(sensor->extclk); in ar0521_probe()
1104 sensor->extclk_freq = clk_get_rate(sensor->extclk); in ar0521_probe()
1106 if (sensor->extclk_freq < AR0521_EXTCLK_MIN || in ar0521_probe()
1107 sensor->extclk_freq > AR0521_EXTCLK_MAX) { in ar0521_probe()
1109 sensor->extclk_freq); in ar0521_probe()
1114 sensor->reset_gpio = devm_gpiod_get_optional(dev, "reset", in ar0521_probe()
1117 v4l2_i2c_subdev_init(&sensor->sd, client, &ar0521_subdev_ops); in ar0521_probe()
1119 sensor->sd.flags = V4L2_SUBDEV_FL_HAS_DEVNODE; in ar0521_probe()
1120 sensor->pad.flags = MEDIA_PAD_FL_SOURCE; in ar0521_probe()
1121 sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in ar0521_probe()
1122 ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad); in ar0521_probe()
1135 sensor->supplies[cnt] = supply; in ar0521_probe()
1138 mutex_init(&sensor->lock); in ar0521_probe()
1140 ret = ar0521_init_controls(sensor); in ar0521_probe()
1144 ar0521_adj_fmt(&sensor->fmt); in ar0521_probe()
1146 ret = v4l2_async_register_subdev(&sensor->sd); in ar0521_probe()
1160 v4l2_async_unregister_subdev(&sensor->sd); in ar0521_probe()
1161 media_entity_cleanup(&sensor->sd.entity); in ar0521_probe()
1163 v4l2_ctrl_handler_free(&sensor->ctrls.handler); in ar0521_probe()
1165 media_entity_cleanup(&sensor->sd.entity); in ar0521_probe()
1166 mutex_destroy(&sensor->lock); in ar0521_probe()
1173 struct ar0521_dev *sensor = to_ar0521_dev(sd); in ar0521_remove() local
1175 v4l2_async_unregister_subdev(&sensor->sd); in ar0521_remove()
1176 media_entity_cleanup(&sensor->sd.entity); in ar0521_remove()
1177 v4l2_ctrl_handler_free(&sensor->ctrls.handler); in ar0521_remove()
1182 mutex_destroy(&sensor->lock); in ar0521_remove()