Lines Matching full:sensor

3  * Driver for the Sony IMX415 CMOS Image Sensor.
668 static int imx415_set_testpattern(struct imx415 *sensor, int val) in imx415_set_testpattern() argument
673 cci_write(sensor->regmap, IMX415_BLKLEVEL, 0x00, &ret); in imx415_set_testpattern()
674 cci_write(sensor->regmap, IMX415_TPG_EN_DUOUT, 0x01, &ret); in imx415_set_testpattern()
675 cci_write(sensor->regmap, IMX415_TPG_PATSEL_DUOUT, in imx415_set_testpattern()
677 cci_write(sensor->regmap, IMX415_TPG_COLORWIDTH, 0x01, &ret); in imx415_set_testpattern()
678 cci_write(sensor->regmap, IMX415_TESTCLKEN_MIPI, 0x20, &ret); in imx415_set_testpattern()
679 cci_write(sensor->regmap, IMX415_DIG_CLP_MODE, 0x00, &ret); in imx415_set_testpattern()
680 cci_write(sensor->regmap, IMX415_WRJ_OPEN, 0x00, &ret); in imx415_set_testpattern()
682 cci_write(sensor->regmap, IMX415_BLKLEVEL, in imx415_set_testpattern()
684 cci_write(sensor->regmap, IMX415_TPG_EN_DUOUT, 0x00, &ret); in imx415_set_testpattern()
685 cci_write(sensor->regmap, IMX415_TESTCLKEN_MIPI, 0x00, &ret); in imx415_set_testpattern()
686 cci_write(sensor->regmap, IMX415_DIG_CLP_MODE, 0x01, &ret); in imx415_set_testpattern()
687 cci_write(sensor->regmap, IMX415_WRJ_OPEN, 0x01, &ret); in imx415_set_testpattern()
694 struct imx415 *sensor = container_of(ctrl->handler, struct imx415, in imx415_s_ctrl() local
703 state = v4l2_subdev_get_locked_active_state(&sensor->subdev); in imx415_s_ctrl()
709 __v4l2_ctrl_modify_range(sensor->exposure, in imx415_s_ctrl()
710 sensor->exposure->minimum, in imx415_s_ctrl()
711 exposure_max, sensor->exposure->step, in imx415_s_ctrl()
712 sensor->exposure->default_value); in imx415_s_ctrl()
715 if (!pm_runtime_get_if_in_use(sensor->dev)) in imx415_s_ctrl()
720 ret = cci_write(sensor->regmap, IMX415_VMAX, in imx415_s_ctrl()
728 ctrl = sensor->exposure; in imx415_s_ctrl()
732 vmax = format->height + sensor->vblank->cur.val; in imx415_s_ctrl()
734 ret = cci_write(sensor->regmap, IMX415_SHR0, in imx415_s_ctrl()
740 ret = cci_write(sensor->regmap, IMX415_GAIN_PCG_0, in imx415_s_ctrl()
746 flip = (sensor->hflip->val << IMX415_HREVERSE_SHIFT) | in imx415_s_ctrl()
747 (sensor->vflip->val << IMX415_VREVERSE_SHIFT); in imx415_s_ctrl()
748 ret = cci_write(sensor->regmap, IMX415_REVERSE, flip, NULL); in imx415_s_ctrl()
752 ret = imx415_set_testpattern(sensor, ctrl->val); in imx415_s_ctrl()
756 ret = cci_write(sensor->regmap, IMX415_HMAX, in imx415_s_ctrl()
767 pm_runtime_put(sensor->dev); in imx415_s_ctrl()
776 static int imx415_ctrls_init(struct imx415 *sensor) in imx415_ctrls_init() argument
780 const struct imx415_mode *cur_mode = &supported_modes[sensor->cur_mode]; in imx415_ctrls_init()
789 ret = v4l2_fwnode_device_parse(sensor->dev, &props); in imx415_ctrls_init()
793 v4l2_ctrl_handler_init(&sensor->ctrls, 10); in imx415_ctrls_init()
800 return dev_err_probe(sensor->dev, -EINVAL, in imx415_ctrls_init()
805 ctrl = v4l2_ctrl_new_int_menu(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
813 sensor->exposure = v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
817 v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
822 hblank_min = (cur_mode->hmax_min[sensor->num_data_lanes == 2 ? 0 : 1] * in imx415_ctrls_init()
826 ctrl = v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
831 sensor->vblank = v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
837 v4l2_ctrl_new_std(&sensor->ctrls, NULL, V4L2_CID_PIXEL_RATE, in imx415_ctrls_init()
838 sensor->pixel_rate, sensor->pixel_rate, 1, in imx415_ctrls_init()
839 sensor->pixel_rate); in imx415_ctrls_init()
841 sensor->hflip = v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
843 sensor->vflip = v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
846 v4l2_ctrl_new_std_menu_items(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
851 v4l2_ctrl_new_fwnode_properties(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
854 if (sensor->ctrls.error) { in imx415_ctrls_init()
855 dev_err_probe(sensor->dev, sensor->ctrls.error, in imx415_ctrls_init()
857 v4l2_ctrl_handler_free(&sensor->ctrls); in imx415_ctrls_init()
858 return sensor->ctrls.error; in imx415_ctrls_init()
860 sensor->subdev.ctrl_handler = &sensor->ctrls; in imx415_ctrls_init()
865 static int imx415_set_mode(struct imx415 *sensor, int mode) in imx415_set_mode() argument
870 dev_err(sensor->dev, "Mode %d not supported\n", mode); in imx415_set_mode()
874 cci_multi_reg_write(sensor->regmap, in imx415_set_mode()
879 cci_multi_reg_write(sensor->regmap, in imx415_set_mode()
880 sensor->clk_params->regs, in imx415_set_mode()
884 ret = cci_write(sensor->regmap, IMX415_LANEMODE, in imx415_set_mode()
885 sensor->num_data_lanes == 2 ? IMX415_LANEMODE_2 : in imx415_set_mode()
892 static int imx415_setup(struct imx415 *sensor, struct v4l2_subdev_state *state) in imx415_setup() argument
896 ret = cci_multi_reg_write(sensor->regmap, in imx415_setup()
903 return imx415_set_mode(sensor, sensor->cur_mode); in imx415_setup()
906 static int imx415_wakeup(struct imx415 *sensor) in imx415_wakeup() argument
910 ret = cci_write(sensor->regmap, IMX415_MODE, in imx415_wakeup()
925 static int imx415_stream_on(struct imx415 *sensor) in imx415_stream_on() argument
929 ret = imx415_wakeup(sensor); in imx415_stream_on()
930 return cci_write(sensor->regmap, IMX415_XMSTA, in imx415_stream_on()
934 static int imx415_stream_off(struct imx415 *sensor) in imx415_stream_off() argument
938 ret = cci_write(sensor->regmap, IMX415_XMSTA, in imx415_stream_off()
940 return cci_write(sensor->regmap, IMX415_MODE, in imx415_stream_off()
946 struct imx415 *sensor = to_imx415(sd); in imx415_s_stream() local
953 ret = imx415_stream_off(sensor); in imx415_s_stream()
955 pm_runtime_mark_last_busy(sensor->dev); in imx415_s_stream()
956 pm_runtime_put_autosuspend(sensor->dev); in imx415_s_stream()
961 ret = pm_runtime_resume_and_get(sensor->dev); in imx415_s_stream()
965 ret = imx415_setup(sensor, state); in imx415_s_stream()
969 ret = __v4l2_ctrl_handler_setup(&sensor->ctrls); in imx415_s_stream()
973 ret = imx415_stream_on(sensor); in imx415_s_stream()
989 pm_runtime_put_sync(sensor->dev); in imx415_s_stream()
1100 static int imx415_subdev_init(struct imx415 *sensor) in imx415_subdev_init() argument
1102 struct i2c_client *client = to_i2c_client(sensor->dev); in imx415_subdev_init()
1105 v4l2_i2c_subdev_init(&sensor->subdev, client, &imx415_subdev_ops); in imx415_subdev_init()
1106 sensor->subdev.internal_ops = &imx415_internal_ops; in imx415_subdev_init()
1108 ret = imx415_ctrls_init(sensor); in imx415_subdev_init()
1112 sensor->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in imx415_subdev_init()
1113 sensor->pad.flags = MEDIA_PAD_FL_SOURCE; in imx415_subdev_init()
1114 sensor->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR; in imx415_subdev_init()
1115 ret = media_entity_pads_init(&sensor->subdev.entity, 1, &sensor->pad); in imx415_subdev_init()
1117 v4l2_ctrl_handler_free(&sensor->ctrls); in imx415_subdev_init()
1121 sensor->subdev.state_lock = sensor->subdev.ctrl_handler->lock; in imx415_subdev_init()
1122 v4l2_subdev_init_finalize(&sensor->subdev); in imx415_subdev_init()
1127 static void imx415_subdev_cleanup(struct imx415 *sensor) in imx415_subdev_cleanup() argument
1129 media_entity_cleanup(&sensor->subdev.entity); in imx415_subdev_cleanup()
1130 v4l2_ctrl_handler_free(&sensor->ctrls); in imx415_subdev_cleanup()
1133 static int imx415_power_on(struct imx415 *sensor) in imx415_power_on() argument
1137 ret = regulator_bulk_enable(ARRAY_SIZE(sensor->supplies), in imx415_power_on()
1138 sensor->supplies); in imx415_power_on()
1142 gpiod_set_value_cansleep(sensor->reset, 0); in imx415_power_on()
1146 ret = clk_prepare_enable(sensor->clk); in imx415_power_on()
1160 gpiod_set_value_cansleep(sensor->reset, 1); in imx415_power_on()
1161 regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies); in imx415_power_on()
1165 static void imx415_power_off(struct imx415 *sensor) in imx415_power_off() argument
1167 clk_disable_unprepare(sensor->clk); in imx415_power_off()
1168 gpiod_set_value_cansleep(sensor->reset, 1); in imx415_power_off()
1169 regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies); in imx415_power_off()
1172 static int imx415_identify_model(struct imx415 *sensor) in imx415_identify_model() argument
1178 * While most registers can be read when the sensor is in standby, this in imx415_identify_model()
1179 * is not the case of the sensor info register :-( in imx415_identify_model()
1181 ret = imx415_wakeup(sensor); in imx415_identify_model()
1183 return dev_err_probe(sensor->dev, ret, in imx415_identify_model()
1184 "failed to get sensor out of standby\n"); in imx415_identify_model()
1186 ret = cci_read(sensor->regmap, IMX415_SENSOR_INFO, &chip_id, NULL); in imx415_identify_model()
1188 dev_err_probe(sensor->dev, ret, in imx415_identify_model()
1189 "failed to read sensor information\n"); in imx415_identify_model()
1197 dev_info(sensor->dev, "Detected IMX415 image sensor\n"); in imx415_identify_model()
1200 ret = dev_err_probe(sensor->dev, -ENODEV, in imx415_identify_model()
1208 cci_write(sensor->regmap, IMX415_MODE, IMX415_MODE_STANDBY, &ret); in imx415_identify_model()
1228 static int imx415_parse_hw_config(struct imx415 *sensor) in imx415_parse_hw_config() argument
1239 for (i = 0; i < ARRAY_SIZE(sensor->supplies); ++i) in imx415_parse_hw_config()
1240 sensor->supplies[i].supply = imx415_supply_names[i]; in imx415_parse_hw_config()
1242 ret = devm_regulator_bulk_get(sensor->dev, ARRAY_SIZE(sensor->supplies), in imx415_parse_hw_config()
1243 sensor->supplies); in imx415_parse_hw_config()
1245 return dev_err_probe(sensor->dev, ret, in imx415_parse_hw_config()
1248 sensor->reset = devm_gpiod_get_optional(sensor->dev, "reset", in imx415_parse_hw_config()
1250 if (IS_ERR(sensor->reset)) in imx415_parse_hw_config()
1251 return dev_err_probe(sensor->dev, PTR_ERR(sensor->reset), in imx415_parse_hw_config()
1254 sensor->clk = devm_clk_get(sensor->dev, "inck"); in imx415_parse_hw_config()
1255 if (IS_ERR(sensor->clk)) in imx415_parse_hw_config()
1256 return dev_err_probe(sensor->dev, PTR_ERR(sensor->clk), in imx415_parse_hw_config()
1259 ep = fwnode_graph_get_next_endpoint(dev_fwnode(sensor->dev), NULL); in imx415_parse_hw_config()
1271 sensor->num_data_lanes = bus_cfg.bus.mipi_csi2.num_data_lanes; in imx415_parse_hw_config()
1274 ret = dev_err_probe(sensor->dev, -EINVAL, in imx415_parse_hw_config()
1281 ret = dev_err_probe(sensor->dev, -EINVAL, in imx415_parse_hw_config()
1287 * Check if there exists a sensor mode defined for current INCK, in imx415_parse_hw_config()
1290 inck = clk_get_rate(sensor->clk); in imx415_parse_hw_config()
1293 dev_dbg(sensor->dev, in imx415_parse_hw_config()
1303 sensor->cur_mode = j; in imx415_parse_hw_config()
1310 ret = dev_err_probe(sensor->dev, -EINVAL, in imx415_parse_hw_config()
1311 "no valid sensor mode defined\n"); in imx415_parse_hw_config()
1318 sensor->pixel_rate = IMX415_PIXEL_RATE_74_25MHZ; in imx415_parse_hw_config()
1322 sensor->pixel_rate = IMX415_PIXEL_RATE_72MHZ; in imx415_parse_hw_config()
1326 lane_rate = supported_modes[sensor->cur_mode].lane_rate; in imx415_parse_hw_config()
1330 sensor->clk_params = &imx415_clk_params[i]; in imx415_parse_hw_config()
1335 ret = dev_err_probe(sensor->dev, -EINVAL, in imx415_parse_hw_config()
1337 sensor->cur_mode); in imx415_parse_hw_config()
1342 dev_dbg(sensor->dev, "clock: %lu Hz, lane_rate: %llu bps, lanes: %d\n", in imx415_parse_hw_config()
1343 inck, lane_rate, sensor->num_data_lanes); in imx415_parse_hw_config()
1353 struct imx415 *sensor; in imx415_probe() local
1356 sensor = devm_kzalloc(&client->dev, sizeof(*sensor), GFP_KERNEL); in imx415_probe()
1357 if (!sensor) in imx415_probe()
1360 sensor->dev = &client->dev; in imx415_probe()
1362 ret = imx415_parse_hw_config(sensor); in imx415_probe()
1366 sensor->regmap = devm_cci_regmap_init_i2c(client, 16); in imx415_probe()
1367 if (IS_ERR(sensor->regmap)) in imx415_probe()
1368 return PTR_ERR(sensor->regmap); in imx415_probe()
1373 * the sensor on manually here, identify it, and fully initialize it. in imx415_probe()
1375 ret = imx415_power_on(sensor); in imx415_probe()
1379 ret = imx415_identify_model(sensor); in imx415_probe()
1383 ret = imx415_subdev_init(sensor); in imx415_probe()
1391 pm_runtime_set_active(sensor->dev); in imx415_probe()
1392 pm_runtime_get_noresume(sensor->dev); in imx415_probe()
1393 pm_runtime_enable(sensor->dev); in imx415_probe()
1395 ret = v4l2_async_register_subdev_sensor(&sensor->subdev); in imx415_probe()
1404 pm_runtime_set_autosuspend_delay(sensor->dev, 1000); in imx415_probe()
1405 pm_runtime_use_autosuspend(sensor->dev); in imx415_probe()
1406 pm_runtime_put_autosuspend(sensor->dev); in imx415_probe()
1411 pm_runtime_disable(sensor->dev); in imx415_probe()
1412 pm_runtime_put_noidle(sensor->dev); in imx415_probe()
1413 imx415_subdev_cleanup(sensor); in imx415_probe()
1415 imx415_power_off(sensor); in imx415_probe()
1422 struct imx415 *sensor = to_imx415(subdev); in imx415_remove() local
1426 imx415_subdev_cleanup(sensor); in imx415_remove()
1432 pm_runtime_disable(sensor->dev); in imx415_remove()
1433 if (!pm_runtime_status_suspended(sensor->dev)) in imx415_remove()
1434 imx415_power_off(sensor); in imx415_remove()
1435 pm_runtime_set_suspended(sensor->dev); in imx415_remove()
1442 struct imx415 *sensor = to_imx415(subdev); in imx415_runtime_resume() local
1444 return imx415_power_on(sensor); in imx415_runtime_resume()
1451 struct imx415 *sensor = to_imx415(subdev); in imx415_runtime_suspend() local
1453 imx415_power_off(sensor); in imx415_runtime_suspend()
1480 MODULE_DESCRIPTION("Sony IMX415 image sensor driver");