Lines Matching refs:imx214

3  * imx214.c - imx214 sensor driver
55 struct imx214 {
444 static inline struct imx214 *to_imx214(struct v4l2_subdev *sd)
446 return container_of(sd, struct imx214, sd);
453 struct imx214 *imx214 = to_imx214(sd);
456 ret = regulator_bulk_enable(IMX214_NUM_SUPPLIES, imx214->supplies);
458 dev_err(imx214->dev, "failed to enable regulators: %d\n", ret);
464 ret = clk_prepare_enable(imx214->xclk);
466 regulator_bulk_disable(IMX214_NUM_SUPPLIES, imx214->supplies);
467 dev_err(imx214->dev, "clk prepare enable failed\n");
471 gpiod_set_value_cansleep(imx214->enable_gpio, 1);
481 struct imx214 *imx214 = to_imx214(sd);
483 gpiod_set_value_cansleep(imx214->enable_gpio, 0);
485 clk_disable_unprepare(imx214->xclk);
487 regulator_bulk_disable(IMX214_NUM_SUPPLIES, imx214->supplies);
525 struct imx214 *imx214 = container_of(subdev, struct imx214, sd);
527 return regmap_write(imx214->regmap, reg->reg, reg->val);
533 struct imx214 *imx214 = container_of(subdev, struct imx214, sd);
538 ret = regmap_read(imx214->regmap, reg->reg, &aux);
553 __imx214_get_pad_format(struct imx214 *imx214,
562 return &imx214->fmt;
572 struct imx214 *imx214 = to_imx214(sd);
574 mutex_lock(&imx214->mutex);
575 format->format = *__imx214_get_pad_format(imx214, sd_state,
578 mutex_unlock(&imx214->mutex);
584 __imx214_get_pad_crop(struct imx214 *imx214,
592 return &imx214->crop;
602 struct imx214 *imx214 = to_imx214(sd);
607 mutex_lock(&imx214->mutex);
609 __crop = __imx214_get_pad_crop(imx214, sd_state, format->pad,
620 __format = __imx214_get_pad_format(imx214, sd_state, format->pad,
634 mutex_unlock(&imx214->mutex);
643 struct imx214 *imx214 = to_imx214(sd);
647 mutex_lock(&imx214->mutex);
648 sel->r = *__imx214_get_pad_crop(imx214, sd_state, sel->pad,
650 mutex_unlock(&imx214->mutex);
688 struct imx214 *imx214 = container_of(ctrl->handler,
689 struct imx214, ctrls);
697 if (!pm_runtime_get_if_in_use(imx214->dev))
704 ret = regmap_bulk_write(imx214->regmap, IMX214_REG_EXPOSURE, vals, 2);
706 dev_err(imx214->dev, "Error %d\n", ret);
714 pm_runtime_put(imx214->dev);
723 static int imx214_ctrls_init(struct imx214 *imx214)
736 ret = v4l2_fwnode_device_parse(imx214->dev, &props);
740 ctrl_hdlr = &imx214->ctrls;
741 ret = v4l2_ctrl_handler_init(&imx214->ctrls, 6);
745 imx214->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, NULL,
750 imx214->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, NULL,
754 if (imx214->link_freq)
755 imx214->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
767 imx214->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx214_ctrl_ops,
774 imx214->unit_size = v4l2_ctrl_new_std_compound(ctrl_hdlr,
784 dev_err(imx214->dev, "failed to add controls: %d\n", ret);
788 imx214->sd.ctrl_handler = ctrl_hdlr;
794 static int imx214_write_table(struct imx214 *imx214,
814 ret = regmap_bulk_write(imx214->regmap, table->addr, vals, i);
817 dev_err(imx214->dev, "write_table error: %d\n", ret);
827 static int imx214_start_streaming(struct imx214 *imx214)
832 mutex_lock(&imx214->mutex);
833 ret = imx214_write_table(imx214, mode_table_common);
835 dev_err(imx214->dev, "could not sent common table %d\n", ret);
841 imx214->fmt.width, imx214->fmt.height);
842 ret = imx214_write_table(imx214, mode->reg_table);
844 dev_err(imx214->dev, "could not sent mode table %d\n", ret);
847 ret = __v4l2_ctrl_handler_setup(&imx214->ctrls);
849 dev_err(imx214->dev, "could not sync v4l2 controls\n");
852 ret = regmap_write(imx214->regmap, IMX214_REG_MODE_SELECT, IMX214_MODE_STREAMING);
854 dev_err(imx214->dev, "could not sent start table %d\n", ret);
858 mutex_unlock(&imx214->mutex);
862 mutex_unlock(&imx214->mutex);
866 static int imx214_stop_streaming(struct imx214 *imx214)
870 ret = regmap_write(imx214->regmap, IMX214_REG_MODE_SELECT, IMX214_MODE_STANDBY);
872 dev_err(imx214->dev, "could not sent stop table %d\n", ret);
879 struct imx214 *imx214 = to_imx214(subdev);
883 ret = pm_runtime_resume_and_get(imx214->dev);
887 ret = imx214_start_streaming(imx214);
891 ret = imx214_stop_streaming(imx214);
894 pm_runtime_put(imx214->dev);
900 pm_runtime_put(imx214->dev);
974 static int imx214_get_regulators(struct device *dev, struct imx214 *imx214)
979 imx214->supplies[i].supply = imx214_supply_name[i];
982 imx214->supplies);
1026 struct imx214 *imx214;
1033 imx214 = devm_kzalloc(dev, sizeof(*imx214), GFP_KERNEL);
1034 if (!imx214)
1037 imx214->dev = dev;
1039 imx214->xclk = devm_clk_get(dev, NULL);
1040 if (IS_ERR(imx214->xclk)) {
1042 return PTR_ERR(imx214->xclk);
1045 ret = clk_set_rate(imx214->xclk, IMX214_DEFAULT_CLK_FREQ);
1051 ret = imx214_get_regulators(dev, imx214);
1057 imx214->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
1058 if (IS_ERR(imx214->enable_gpio)) {
1060 return PTR_ERR(imx214->enable_gpio);
1063 imx214->regmap = devm_regmap_init_i2c(client, &sensor_regmap_config);
1064 if (IS_ERR(imx214->regmap)) {
1066 return PTR_ERR(imx214->regmap);
1069 v4l2_i2c_subdev_init(&imx214->sd, client, &imx214_subdev_ops);
1070 imx214->sd.internal_ops = &imx214_internal_ops;
1076 imx214_power_on(imx214->dev);
1078 pm_runtime_set_active(imx214->dev);
1079 pm_runtime_enable(imx214->dev);
1080 pm_runtime_idle(imx214->dev);
1082 ret = imx214_ctrls_init(imx214);
1086 mutex_init(&imx214->mutex);
1087 imx214->ctrls.lock = &imx214->mutex;
1089 imx214->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1090 imx214->pad.flags = MEDIA_PAD_FL_SOURCE;
1091 imx214->sd.dev = &client->dev;
1092 imx214->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1094 ret = media_entity_pads_init(&imx214->sd.entity, 1, &imx214->pad);
1100 imx214_entity_init_state(&imx214->sd, NULL);
1102 ret = v4l2_async_register_subdev_sensor(&imx214->sd);
1111 media_entity_cleanup(&imx214->sd.entity);
1113 mutex_destroy(&imx214->mutex);
1114 v4l2_ctrl_handler_free(&imx214->ctrls);
1116 pm_runtime_disable(imx214->dev);
1124 struct imx214 *imx214 = to_imx214(sd);
1126 v4l2_async_unregister_subdev(&imx214->sd);
1127 media_entity_cleanup(&imx214->sd.entity);
1128 v4l2_ctrl_handler_free(&imx214->ctrls);
1133 mutex_destroy(&imx214->mutex);
1137 { .compatible = "sony,imx214" },
1150 .name = "imx214",