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