Lines Matching defs:sensor
219 static int imx296_read(struct imx296 *sensor, u32 addr)
224 ret = regmap_raw_read(sensor->regmap, addr & IMX296_REG_ADDR_MASK, data,
232 static int imx296_write(struct imx296 *sensor, u32 addr, u32 value, int *err)
240 ret = regmap_raw_write(sensor->regmap, addr & IMX296_REG_ADDR_MASK,
243 dev_err(sensor->dev, "%u-bit write to 0x%04x failed: %d\n",
253 static int imx296_power_on(struct imx296 *sensor)
257 ret = regulator_bulk_enable(ARRAY_SIZE(sensor->supplies),
258 sensor->supplies);
264 ret = gpiod_direction_output(sensor->reset, 0);
270 ret = clk_prepare_enable(sensor->clk);
286 gpiod_direction_output(sensor->reset, 1);
288 regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies);
292 static void imx296_power_off(struct imx296 *sensor)
294 clk_disable_unprepare(sensor->clk);
295 gpiod_direction_output(sensor->reset, 1);
296 regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies);
318 struct imx296 *sensor = container_of(ctrl->handler, struct imx296, ctrls);
324 if (!sensor->streaming)
327 state = v4l2_subdev_get_locked_active_state(&sensor->subdev);
328 format = v4l2_subdev_get_pad_format(&sensor->subdev, state, 0);
333 vmax = format->height + sensor->vblank->cur.val;
335 imx296_write(sensor, IMX296_SHS1, vmax - ctrl->val, &ret);
339 imx296_write(sensor, IMX296_GAIN, ctrl->val, &ret);
343 imx296_write(sensor, IMX296_VMAX, format->height + ctrl->val,
349 imx296_write(sensor, IMX296_PGHPOS, 8, &ret);
350 imx296_write(sensor, IMX296_PGVPOS, 8, &ret);
351 imx296_write(sensor, IMX296_PGHPSTEP, 8, &ret);
352 imx296_write(sensor, IMX296_PGVPSTEP, 8, &ret);
353 imx296_write(sensor, IMX296_PGHPNUM, 100, &ret);
354 imx296_write(sensor, IMX296_PGVPNUM, 100, &ret);
355 imx296_write(sensor, IMX296_PGDATA1, 0x300, &ret);
356 imx296_write(sensor, IMX296_PGDATA2, 0x100, &ret);
357 imx296_write(sensor, IMX296_PGHGSTEP, 0, &ret);
358 imx296_write(sensor, IMX296_BLKLEVEL, 0, &ret);
359 imx296_write(sensor, IMX296_BLKLEVELAUTO,
361 imx296_write(sensor, IMX296_PGCTRL,
366 imx296_write(sensor, IMX296_PGCTRL,
368 imx296_write(sensor, IMX296_BLKLEVEL, 0x3c, &ret);
369 imx296_write(sensor, IMX296_BLKLEVELAUTO,
386 static int imx296_ctrls_init(struct imx296 *sensor)
392 ret = v4l2_fwnode_device_parse(sensor->dev, &props);
396 v4l2_ctrl_handler_init(&sensor->ctrls, 9);
398 v4l2_ctrl_new_std(&sensor->ctrls, &imx296_ctrl_ops,
400 v4l2_ctrl_new_std(&sensor->ctrls, &imx296_ctrl_ops,
412 sensor->hblank = v4l2_ctrl_new_std(&sensor->ctrls, &imx296_ctrl_ops,
415 if (sensor->hblank)
416 sensor->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
418 sensor->vblank = v4l2_ctrl_new_std(&sensor->ctrls, &imx296_ctrl_ops,
423 * The sensor calculates the MIPI timings internally to achieve a bit
429 v4l2_ctrl_new_std(&sensor->ctrls, NULL, V4L2_CID_PIXEL_RATE,
431 v4l2_ctrl_new_std_menu_items(&sensor->ctrls, &imx296_ctrl_ops,
436 v4l2_ctrl_new_fwnode_properties(&sensor->ctrls, &imx296_ctrl_ops,
439 if (sensor->ctrls.error) {
440 dev_err(sensor->dev, "failed to add controls (%d)\n",
441 sensor->ctrls.error);
442 v4l2_ctrl_handler_free(&sensor->ctrls);
443 return sensor->ctrls.error;
446 sensor->subdev.ctrl_handler = &sensor->ctrls;
507 static int imx296_setup(struct imx296 *sensor, struct v4l2_subdev_state *state)
514 format = v4l2_subdev_get_pad_format(&sensor->subdev, state, 0);
515 crop = v4l2_subdev_get_pad_crop(&sensor->subdev, state, 0);
518 imx296_write(sensor, imx296_init_table[i].reg,
523 imx296_write(sensor, IMX296_FID0_ROI,
525 imx296_write(sensor, IMX296_FID0_ROIPH1, crop->left, &ret);
526 imx296_write(sensor, IMX296_FID0_ROIPV1, crop->top, &ret);
527 imx296_write(sensor, IMX296_FID0_ROIWH1, crop->width, &ret);
528 imx296_write(sensor, IMX296_FID0_ROIWV1, crop->height, &ret);
530 imx296_write(sensor, IMX296_FID0_ROI, 0, &ret);
533 imx296_write(sensor, IMX296_CTRL0D,
548 * In the vertical direction the sensor outputs the following:
558 imx296_write(sensor, IMX296_HMAX, 1100, &ret);
559 imx296_write(sensor, IMX296_VMAX,
560 format->height + sensor->vblank->cur.val, &ret);
562 for (i = 0; i < ARRAY_SIZE(sensor->clk_params->incksel); ++i)
563 imx296_write(sensor, IMX296_INCKSEL(i),
564 sensor->clk_params->incksel[i], &ret);
565 imx296_write(sensor, IMX296_GTTABLENUM, 0xc5, &ret);
566 imx296_write(sensor, IMX296_CTRL418C, sensor->clk_params->ctrl418c,
569 imx296_write(sensor, IMX296_GAINDLY, IMX296_GAINDLY_NONE, &ret);
570 imx296_write(sensor, IMX296_BLKLEVEL, 0x03c, &ret);
575 static int imx296_stream_on(struct imx296 *sensor)
579 imx296_write(sensor, IMX296_CTRL00, 0, &ret);
581 imx296_write(sensor, IMX296_CTRL0A, 0, &ret);
586 static int imx296_stream_off(struct imx296 *sensor)
590 imx296_write(sensor, IMX296_CTRL0A, IMX296_CTRL0A_XMSTA, &ret);
591 imx296_write(sensor, IMX296_CTRL00, IMX296_CTRL00_STANDBY, &ret);
598 struct imx296 *sensor = to_imx296(sd);
605 ret = imx296_stream_off(sensor);
607 pm_runtime_mark_last_busy(sensor->dev);
608 pm_runtime_put_autosuspend(sensor->dev);
610 sensor->streaming = false;
615 ret = pm_runtime_resume_and_get(sensor->dev);
619 ret = imx296_setup(sensor, state);
628 sensor->streaming = true;
630 ret = __v4l2_ctrl_handler_setup(&sensor->ctrls);
634 ret = imx296_stream_on(sensor);
648 pm_runtime_put_sync(sensor->dev);
649 sensor->streaming = false;
658 struct imx296 *sensor = to_imx296(sd);
663 code->code = sensor->mono ? MEDIA_BUS_FMT_Y10_1X10
692 struct imx296 *sensor = to_imx296(sd);
726 format->code = sensor->mono ? MEDIA_BUS_FMT_Y10_1X10
851 static int imx296_subdev_init(struct imx296 *sensor)
853 struct i2c_client *client = to_i2c_client(sensor->dev);
856 v4l2_i2c_subdev_init(&sensor->subdev, client, &imx296_subdev_ops);
858 ret = imx296_ctrls_init(sensor);
862 sensor->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
863 sensor->pad.flags = MEDIA_PAD_FL_SOURCE;
864 sensor->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR;
865 ret = media_entity_pads_init(&sensor->subdev.entity, 1, &sensor->pad);
867 v4l2_ctrl_handler_free(&sensor->ctrls);
871 sensor->subdev.state_lock = sensor->subdev.ctrl_handler->lock;
873 v4l2_subdev_init_finalize(&sensor->subdev);
878 static void imx296_subdev_cleanup(struct imx296 *sensor)
880 media_entity_cleanup(&sensor->subdev.entity);
881 v4l2_ctrl_handler_free(&sensor->ctrls);
892 struct imx296 *sensor = to_imx296(subdev);
894 return imx296_power_on(sensor);
901 struct imx296 *sensor = to_imx296(subdev);
903 imx296_power_off(sensor);
916 static int imx296_read_temperature(struct imx296 *sensor, int *temp)
921 ret = imx296_write(sensor, IMX296_TMDCTRL, IMX296_TMDCTRL_LATCH, NULL);
925 tmdout = imx296_read(sensor, IMX296_TMDOUT);
934 return imx296_write(sensor, IMX296_TMDCTRL, 0, NULL);
937 static int imx296_identify_model(struct imx296 *sensor)
943 model = (uintptr_t)of_device_get_match_data(sensor->dev);
945 dev_dbg(sensor->dev,
946 "sensor model auto-detection disabled, forcing 0x%04x\n",
948 sensor->mono = model & IMX296_SENSOR_INFO_MONO;
953 * While most registers can be read when the sensor is in standby, this
954 * is not the case of the sensor info register :-(
956 ret = imx296_write(sensor, IMX296_CTRL00, 0, NULL);
958 dev_err(sensor->dev,
959 "failed to get sensor out of standby (%d)\n", ret);
963 ret = imx296_read(sensor, IMX296_SENSOR_INFO);
965 dev_err(sensor->dev, "failed to read sensor information (%d)\n",
974 sensor->mono = ret & IMX296_SENSOR_INFO_MONO;
982 dev_err(sensor->dev, "invalid device model 0x%04x\n", ret);
987 ret = imx296_read_temperature(sensor, &temp);
991 dev_info(sensor->dev, "found IMX%u%s (%u.%uC)\n", model,
992 sensor->mono ? "LL" : "LQ", temp / 1000, (temp / 100) % 10);
995 imx296_write(sensor, IMX296_CTRL00, IMX296_CTRL00_STANDBY, NULL);
1018 struct imx296 *sensor;
1028 sensor = devm_kzalloc(&client->dev, sizeof(*sensor), GFP_KERNEL);
1029 if (!sensor)
1032 sensor->dev = &client->dev;
1035 for (i = 0; i < ARRAY_SIZE(sensor->supplies); ++i)
1036 sensor->supplies[i].supply = imx296_supply_names[i];
1038 ret = devm_regulator_bulk_get(sensor->dev, ARRAY_SIZE(sensor->supplies),
1039 sensor->supplies);
1041 dev_err_probe(sensor->dev, ret, "failed to get supplies\n");
1045 sensor->reset = devm_gpiod_get_optional(sensor->dev, "reset",
1047 if (IS_ERR(sensor->reset))
1048 return dev_err_probe(sensor->dev, PTR_ERR(sensor->reset),
1051 sensor->clk = devm_clk_get(sensor->dev, "inck");
1052 if (IS_ERR(sensor->clk))
1053 return dev_err_probe(sensor->dev, PTR_ERR(sensor->clk),
1056 clk_rate = clk_get_rate(sensor->clk);
1059 sensor->clk_params = &imx296_clk_params[i];
1064 if (!sensor->clk_params) {
1065 dev_err(sensor->dev, "unsupported clock rate %lu\n", clk_rate);
1069 sensor->regmap = devm_regmap_init_i2c(client, &imx296_regmap_config);
1070 if (IS_ERR(sensor->regmap))
1071 return PTR_ERR(sensor->regmap);
1076 * the sensor on manually here, identify it, and fully initialize it.
1078 ret = imx296_power_on(sensor);
1082 ret = imx296_identify_model(sensor);
1087 ret = imx296_subdev_init(sensor);
1095 pm_runtime_set_active(sensor->dev);
1096 pm_runtime_get_noresume(sensor->dev);
1097 pm_runtime_enable(sensor->dev);
1100 ret = v4l2_async_register_subdev(&sensor->subdev);
1109 pm_runtime_set_autosuspend_delay(sensor->dev, 1000);
1110 pm_runtime_use_autosuspend(sensor->dev);
1111 pm_runtime_put_autosuspend(sensor->dev);
1116 pm_runtime_disable(sensor->dev);
1117 pm_runtime_put_noidle(sensor->dev);
1118 imx296_subdev_cleanup(sensor);
1120 imx296_power_off(sensor);
1127 struct imx296 *sensor = to_imx296(subdev);
1131 imx296_subdev_cleanup(sensor);
1137 pm_runtime_disable(sensor->dev);
1138 if (!pm_runtime_status_suspended(sensor->dev))
1139 imx296_power_off(sensor);
1140 pm_runtime_set_suspended(sensor->dev);