Lines Matching full:sensor
3 * Driver for the Sony IMX415 CMOS Image Sensor.
463 static int imx415_read(struct imx415 *sensor, u32 addr) in imx415_read() argument
468 ret = regmap_raw_read(sensor->regmap, addr & IMX415_REG_ADDR_MASK, data, in imx415_read()
476 static int imx415_write(struct imx415 *sensor, u32 addr, u32 value) in imx415_write() argument
481 ret = regmap_raw_write(sensor->regmap, addr & IMX415_REG_ADDR_MASK, in imx415_write()
484 dev_err_ratelimited(sensor->dev, in imx415_write()
492 static int imx415_set_testpattern(struct imx415 *sensor, int val) in imx415_set_testpattern() argument
497 ret = imx415_write(sensor, IMX415_BLKLEVEL, 0x00); in imx415_set_testpattern()
500 ret = imx415_write(sensor, IMX415_TPG_EN_DUOUT, 0x01); in imx415_set_testpattern()
503 ret = imx415_write(sensor, IMX415_TPG_PATSEL_DUOUT, val - 1); in imx415_set_testpattern()
506 ret = imx415_write(sensor, IMX415_TPG_COLORWIDTH, 0x01); in imx415_set_testpattern()
509 ret = imx415_write(sensor, IMX415_TESTCLKEN_MIPI, 0x20); in imx415_set_testpattern()
512 ret = imx415_write(sensor, IMX415_DIG_CLP_MODE, 0x00); in imx415_set_testpattern()
515 ret = imx415_write(sensor, IMX415_WRJ_OPEN, 0x00); in imx415_set_testpattern()
517 ret = imx415_write(sensor, IMX415_BLKLEVEL, in imx415_set_testpattern()
521 ret = imx415_write(sensor, IMX415_TPG_EN_DUOUT, 0x00); in imx415_set_testpattern()
524 ret = imx415_write(sensor, IMX415_TESTCLKEN_MIPI, 0x00); in imx415_set_testpattern()
527 ret = imx415_write(sensor, IMX415_DIG_CLP_MODE, 0x01); in imx415_set_testpattern()
530 ret = imx415_write(sensor, IMX415_WRJ_OPEN, 0x01); in imx415_set_testpattern()
537 struct imx415 *sensor = container_of(ctrl->handler, struct imx415, in imx415_s_ctrl() local
545 if (!pm_runtime_get_if_in_use(sensor->dev)) in imx415_s_ctrl()
548 state = v4l2_subdev_get_locked_active_state(&sensor->subdev); in imx415_s_ctrl()
554 vmax = format->height + sensor->vblank->cur.val; in imx415_s_ctrl()
556 ret = imx415_write(sensor, IMX415_SHR0, vmax - ctrl->val); in imx415_s_ctrl()
561 ret = imx415_write(sensor, IMX415_GAIN_PCG_0, ctrl->val); in imx415_s_ctrl()
566 flip = (sensor->hflip->val << IMX415_HREVERSE_SHIFT) | in imx415_s_ctrl()
567 (sensor->vflip->val << IMX415_VREVERSE_SHIFT); in imx415_s_ctrl()
568 ret = imx415_write(sensor, IMX415_REVERSE, flip); in imx415_s_ctrl()
572 ret = imx415_set_testpattern(sensor, ctrl->val); in imx415_s_ctrl()
580 pm_runtime_put(sensor->dev); in imx415_s_ctrl()
589 static int imx415_ctrls_init(struct imx415 *sensor) in imx415_ctrls_init() argument
593 u64 pixel_rate = supported_modes[sensor->cur_mode].pixel_rate; in imx415_ctrls_init()
594 u64 lane_rate = supported_modes[sensor->cur_mode].lane_rate; in imx415_ctrls_init()
601 ret = v4l2_fwnode_device_parse(sensor->dev, &props); in imx415_ctrls_init()
605 v4l2_ctrl_handler_init(&sensor->ctrls, 10); in imx415_ctrls_init()
612 return dev_err_probe(sensor->dev, -EINVAL, in imx415_ctrls_init()
617 ctrl = v4l2_ctrl_new_int_menu(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
625 v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, V4L2_CID_EXPOSURE, in imx415_ctrls_init()
628 v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
633 hblank = supported_modes[sensor->cur_mode].hmax_pix - in imx415_ctrls_init()
635 ctrl = v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
640 sensor->vblank = v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
645 if (sensor->vblank) in imx415_ctrls_init()
646 sensor->vblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx415_ctrls_init()
653 v4l2_ctrl_new_std(&sensor->ctrls, NULL, V4L2_CID_PIXEL_RATE, pixel_rate, in imx415_ctrls_init()
656 sensor->hflip = v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
658 sensor->vflip = v4l2_ctrl_new_std(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
661 v4l2_ctrl_new_std_menu_items(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
666 v4l2_ctrl_new_fwnode_properties(&sensor->ctrls, &imx415_ctrl_ops, in imx415_ctrls_init()
669 if (sensor->ctrls.error) { in imx415_ctrls_init()
670 dev_err_probe(sensor->dev, sensor->ctrls.error, in imx415_ctrls_init()
672 v4l2_ctrl_handler_free(&sensor->ctrls); in imx415_ctrls_init()
673 return sensor->ctrls.error; in imx415_ctrls_init()
675 sensor->subdev.ctrl_handler = &sensor->ctrls; in imx415_ctrls_init()
680 static int imx415_set_mode(struct imx415 *sensor, int mode) in imx415_set_mode() argument
687 dev_err(sensor->dev, "Mode %d not supported\n", mode); in imx415_set_mode()
693 ret = imx415_write(sensor, reg->address, reg->val); in imx415_set_mode()
699 reg = &sensor->clk_params->regs[i]; in imx415_set_mode()
700 ret = imx415_write(sensor, reg->address, reg->val); in imx415_set_mode()
708 static int imx415_setup(struct imx415 *sensor, struct v4l2_subdev_state *state) in imx415_setup() argument
714 ret = imx415_write(sensor, imx415_init_table[i].address, in imx415_setup()
720 return imx415_set_mode(sensor, sensor->cur_mode); in imx415_setup()
723 static int imx415_wakeup(struct imx415 *sensor) in imx415_wakeup() argument
727 ret = imx415_write(sensor, IMX415_MODE, IMX415_MODE_OPERATING); in imx415_wakeup()
741 static int imx415_stream_on(struct imx415 *sensor) in imx415_stream_on() argument
745 ret = imx415_wakeup(sensor); in imx415_stream_on()
749 return imx415_write(sensor, IMX415_XMSTA, IMX415_XMSTA_START); in imx415_stream_on()
752 static int imx415_stream_off(struct imx415 *sensor) in imx415_stream_off() argument
756 ret = imx415_write(sensor, IMX415_XMSTA, IMX415_XMSTA_STOP); in imx415_stream_off()
760 return imx415_write(sensor, IMX415_MODE, IMX415_MODE_STANDBY); in imx415_stream_off()
765 struct imx415 *sensor = to_imx415(sd); in imx415_s_stream() local
772 ret = imx415_stream_off(sensor); in imx415_s_stream()
774 pm_runtime_mark_last_busy(sensor->dev); in imx415_s_stream()
775 pm_runtime_put_autosuspend(sensor->dev); in imx415_s_stream()
780 ret = pm_runtime_resume_and_get(sensor->dev); in imx415_s_stream()
784 ret = imx415_setup(sensor, state); in imx415_s_stream()
788 ret = __v4l2_ctrl_handler_setup(&sensor->ctrls); in imx415_s_stream()
792 ret = imx415_stream_on(sensor); in imx415_s_stream()
808 pm_runtime_put_sync(sensor->dev); in imx415_s_stream()
919 static int imx415_subdev_init(struct imx415 *sensor) in imx415_subdev_init() argument
921 struct i2c_client *client = to_i2c_client(sensor->dev); in imx415_subdev_init()
924 v4l2_i2c_subdev_init(&sensor->subdev, client, &imx415_subdev_ops); in imx415_subdev_init()
925 sensor->subdev.internal_ops = &imx415_internal_ops; in imx415_subdev_init()
927 ret = imx415_ctrls_init(sensor); in imx415_subdev_init()
931 sensor->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | in imx415_subdev_init()
933 sensor->pad.flags = MEDIA_PAD_FL_SOURCE; in imx415_subdev_init()
934 sensor->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR; in imx415_subdev_init()
935 ret = media_entity_pads_init(&sensor->subdev.entity, 1, &sensor->pad); in imx415_subdev_init()
937 v4l2_ctrl_handler_free(&sensor->ctrls); in imx415_subdev_init()
941 sensor->subdev.state_lock = sensor->subdev.ctrl_handler->lock; in imx415_subdev_init()
942 v4l2_subdev_init_finalize(&sensor->subdev); in imx415_subdev_init()
947 static void imx415_subdev_cleanup(struct imx415 *sensor) in imx415_subdev_cleanup() argument
949 media_entity_cleanup(&sensor->subdev.entity); in imx415_subdev_cleanup()
950 v4l2_ctrl_handler_free(&sensor->ctrls); in imx415_subdev_cleanup()
953 static int imx415_power_on(struct imx415 *sensor) in imx415_power_on() argument
957 ret = regulator_bulk_enable(ARRAY_SIZE(sensor->supplies), in imx415_power_on()
958 sensor->supplies); in imx415_power_on()
962 gpiod_set_value_cansleep(sensor->reset, 0); in imx415_power_on()
966 ret = clk_prepare_enable(sensor->clk); in imx415_power_on()
980 gpiod_set_value_cansleep(sensor->reset, 1); in imx415_power_on()
981 regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies); in imx415_power_on()
985 static void imx415_power_off(struct imx415 *sensor) in imx415_power_off() argument
987 clk_disable_unprepare(sensor->clk); in imx415_power_off()
988 gpiod_set_value_cansleep(sensor->reset, 1); in imx415_power_off()
989 regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies); in imx415_power_off()
992 static int imx415_identify_model(struct imx415 *sensor) in imx415_identify_model() argument
997 * While most registers can be read when the sensor is in standby, this in imx415_identify_model()
998 * is not the case of the sensor info register :-( in imx415_identify_model()
1000 ret = imx415_wakeup(sensor); in imx415_identify_model()
1002 return dev_err_probe(sensor->dev, ret, in imx415_identify_model()
1003 "failed to get sensor out of standby\n"); in imx415_identify_model()
1005 ret = imx415_read(sensor, IMX415_SENSOR_INFO); in imx415_identify_model()
1007 dev_err_probe(sensor->dev, ret, in imx415_identify_model()
1008 "failed to read sensor information\n"); in imx415_identify_model()
1016 dev_info(sensor->dev, "Detected IMX415 image sensor\n"); in imx415_identify_model()
1019 ret = dev_err_probe(sensor->dev, -ENODEV, in imx415_identify_model()
1027 imx415_write(sensor, IMX415_MODE, IMX415_MODE_STANDBY); in imx415_identify_model()
1047 static int imx415_parse_hw_config(struct imx415 *sensor) in imx415_parse_hw_config() argument
1058 for (i = 0; i < ARRAY_SIZE(sensor->supplies); ++i) in imx415_parse_hw_config()
1059 sensor->supplies[i].supply = imx415_supply_names[i]; in imx415_parse_hw_config()
1061 ret = devm_regulator_bulk_get(sensor->dev, ARRAY_SIZE(sensor->supplies), in imx415_parse_hw_config()
1062 sensor->supplies); in imx415_parse_hw_config()
1064 return dev_err_probe(sensor->dev, ret, in imx415_parse_hw_config()
1067 sensor->reset = devm_gpiod_get_optional(sensor->dev, "reset", in imx415_parse_hw_config()
1069 if (IS_ERR(sensor->reset)) in imx415_parse_hw_config()
1070 return dev_err_probe(sensor->dev, PTR_ERR(sensor->reset), in imx415_parse_hw_config()
1073 sensor->clk = devm_clk_get(sensor->dev, "inck"); in imx415_parse_hw_config()
1074 if (IS_ERR(sensor->clk)) in imx415_parse_hw_config()
1075 return dev_err_probe(sensor->dev, PTR_ERR(sensor->clk), in imx415_parse_hw_config()
1078 ep = fwnode_graph_get_next_endpoint(dev_fwnode(sensor->dev), NULL); in imx415_parse_hw_config()
1090 sensor->num_data_lanes = bus_cfg.bus.mipi_csi2.num_data_lanes; in imx415_parse_hw_config()
1093 ret = dev_err_probe(sensor->dev, -EINVAL, in imx415_parse_hw_config()
1100 ret = dev_err_probe(sensor->dev, -EINVAL, in imx415_parse_hw_config()
1106 * Check if there exists a sensor mode defined for current INCK, in imx415_parse_hw_config()
1109 inck = clk_get_rate(sensor->clk); in imx415_parse_hw_config()
1112 dev_dbg(sensor->dev, in imx415_parse_hw_config()
1119 if (sensor->num_data_lanes != supported_modes[j].lanes) in imx415_parse_hw_config()
1124 sensor->cur_mode = j; in imx415_parse_hw_config()
1131 ret = dev_err_probe(sensor->dev, -EINVAL, in imx415_parse_hw_config()
1132 "no valid sensor mode defined\n"); in imx415_parse_hw_config()
1136 lane_rate = supported_modes[sensor->cur_mode].lane_rate; in imx415_parse_hw_config()
1140 sensor->clk_params = &imx415_clk_params[i]; in imx415_parse_hw_config()
1145 ret = dev_err_probe(sensor->dev, -EINVAL, in imx415_parse_hw_config()
1147 sensor->cur_mode); in imx415_parse_hw_config()
1152 dev_dbg(sensor->dev, "clock: %lu Hz, lane_rate: %llu bps, lanes: %d\n", in imx415_parse_hw_config()
1153 inck, lane_rate, sensor->num_data_lanes); in imx415_parse_hw_config()
1163 struct imx415 *sensor; in imx415_probe() local
1166 sensor = devm_kzalloc(&client->dev, sizeof(*sensor), GFP_KERNEL); in imx415_probe()
1167 if (!sensor) in imx415_probe()
1170 sensor->dev = &client->dev; in imx415_probe()
1172 ret = imx415_parse_hw_config(sensor); in imx415_probe()
1176 sensor->regmap = devm_regmap_init_i2c(client, &imx415_regmap_config); in imx415_probe()
1177 if (IS_ERR(sensor->regmap)) in imx415_probe()
1178 return PTR_ERR(sensor->regmap); in imx415_probe()
1183 * the sensor on manually here, identify it, and fully initialize it. in imx415_probe()
1185 ret = imx415_power_on(sensor); in imx415_probe()
1189 ret = imx415_identify_model(sensor); in imx415_probe()
1193 ret = imx415_subdev_init(sensor); in imx415_probe()
1201 pm_runtime_set_active(sensor->dev); in imx415_probe()
1202 pm_runtime_get_noresume(sensor->dev); in imx415_probe()
1203 pm_runtime_enable(sensor->dev); in imx415_probe()
1205 ret = v4l2_async_register_subdev_sensor(&sensor->subdev); in imx415_probe()
1214 pm_runtime_set_autosuspend_delay(sensor->dev, 1000); in imx415_probe()
1215 pm_runtime_use_autosuspend(sensor->dev); in imx415_probe()
1216 pm_runtime_put_autosuspend(sensor->dev); in imx415_probe()
1221 pm_runtime_disable(sensor->dev); in imx415_probe()
1222 pm_runtime_put_noidle(sensor->dev); in imx415_probe()
1223 imx415_subdev_cleanup(sensor); in imx415_probe()
1225 imx415_power_off(sensor); in imx415_probe()
1232 struct imx415 *sensor = to_imx415(subdev); in imx415_remove() local
1236 imx415_subdev_cleanup(sensor); in imx415_remove()
1242 pm_runtime_disable(sensor->dev); in imx415_remove()
1243 if (!pm_runtime_status_suspended(sensor->dev)) in imx415_remove()
1244 imx415_power_off(sensor); in imx415_remove()
1245 pm_runtime_set_suspended(sensor->dev); in imx415_remove()
1252 struct imx415 *sensor = to_imx415(subdev); in imx415_runtime_resume() local
1254 return imx415_power_on(sensor); in imx415_runtime_resume()
1261 struct imx415 *sensor = to_imx415(subdev); in imx415_runtime_suspend() local
1263 imx415_power_off(sensor); in imx415_runtime_suspend()
1290 MODULE_DESCRIPTION("Sony IMX415 image sensor driver");