og0ve1b
static int og0ve1b_enable_test_pattern(struct og0ve1b *og0ve1b, u32 pattern)
u64 val = og0ve1b->pre_isp;
return cci_write(og0ve1b->regmap, OG0VE1B_REG_PRE_ISP, val, NULL);
struct og0ve1b *og0ve1b = container_of(ctrl->handler, struct og0ve1b,
ret = __v4l2_ctrl_modify_range(og0ve1b->exposure,
og0ve1b->exposure->minimum,
og0ve1b->exposure->step,
og0ve1b->exposure->default_value);
if (!pm_runtime_get_if_active(og0ve1b->dev))
ret = cci_write(og0ve1b->regmap, OG0VE1B_REG_ANALOGUE_GAIN,
ret = cci_write(og0ve1b->regmap, OG0VE1B_REG_EXPOSURE,
ret = cci_write(og0ve1b->regmap, OG0VE1B_REG_VTS,
ret = og0ve1b_enable_test_pattern(og0ve1b, ctrl->val);
pm_runtime_put(og0ve1b->dev);
static int og0ve1b_init_controls(struct og0ve1b *og0ve1b)
struct v4l2_ctrl_handler *ctrl_hdlr = &og0ve1b->ctrl_handler;
og0ve1b->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &og0ve1b_ctrl_ops,
og0ve1b->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &og0ve1b_ctrl_ops,
ret = v4l2_fwnode_device_parse(og0ve1b->dev, &props);
og0ve1b->sd.ctrl_handler = ctrl_hdlr;
struct og0ve1b *og0ve1b = to_og0ve1b(sd);
ret = pm_runtime_resume_and_get(og0ve1b->dev);
ret = cci_write(og0ve1b->regmap, OG0VE1B_REG_SOFTWARE_RST,
dev_err(og0ve1b->dev, "failed to software reset: %d\n", ret);
ret = cci_multi_reg_write(og0ve1b->regmap, reg_list->regs,
dev_err(og0ve1b->dev, "failed to set mode: %d\n", ret);
ret = __v4l2_ctrl_handler_setup(og0ve1b->sd.ctrl_handler);
ret = cci_write(og0ve1b->regmap, OG0VE1B_REG_MODE_SELECT,
dev_err(og0ve1b->dev, "failed to start streaming: %d\n", ret);
pm_runtime_put_autosuspend(og0ve1b->dev);
struct og0ve1b *og0ve1b = to_og0ve1b(sd);
ret = cci_write(og0ve1b->regmap, OG0VE1B_REG_MODE_SELECT,
dev_err(og0ve1b->dev, "failed to stop streaming: %d\n", ret);
pm_runtime_put_autosuspend(og0ve1b->dev);
#define to_og0ve1b(_sd) container_of(_sd, struct og0ve1b, sd)
static int og0ve1b_identify_sensor(struct og0ve1b *og0ve1b)
ret = cci_read(og0ve1b->regmap, OG0VE1B_REG_CHIP_ID, &val, NULL);
dev_err(og0ve1b->dev, "failed to read chip id: %d\n", ret);
dev_err(og0ve1b->dev, "chip id mismatch: %x!=%llx\n",
ret = cci_read(og0ve1b->regmap, OG0VE1B_REG_PRE_ISP,
&og0ve1b->pre_isp, NULL);
dev_err(og0ve1b->dev, "failed to read pre_isp: %d\n", ret);
static int og0ve1b_check_hwcfg(struct og0ve1b *og0ve1b)
struct fwnode_handle *fwnode = dev_fwnode(og0ve1b->dev), *ep;
ret = v4l2_link_freq_to_bitmap(og0ve1b->dev,
struct og0ve1b *og0ve1b = to_og0ve1b(sd);
ret = regulator_bulk_enable(OG0VE1B_NUM_SUPPLIES, og0ve1b->supplies);
gpiod_set_value_cansleep(og0ve1b->reset_gpio, 0);
ret = clk_prepare_enable(og0ve1b->xvclk);
gpiod_set_value_cansleep(og0ve1b->reset_gpio, 1);
regulator_bulk_disable(OG0VE1B_NUM_SUPPLIES, og0ve1b->supplies);
struct og0ve1b *og0ve1b = to_og0ve1b(sd);
clk_disable_unprepare(og0ve1b->xvclk);
gpiod_set_value_cansleep(og0ve1b->reset_gpio, 1);
regulator_bulk_disable(OG0VE1B_NUM_SUPPLIES, og0ve1b->supplies);
struct og0ve1b *og0ve1b;
og0ve1b = devm_kzalloc(&client->dev, sizeof(*og0ve1b), GFP_KERNEL);
if (!og0ve1b)
og0ve1b->dev = &client->dev;
v4l2_i2c_subdev_init(&og0ve1b->sd, client, &og0ve1b_subdev_ops);
og0ve1b->regmap = devm_cci_regmap_init_i2c(client, 16);
if (IS_ERR(og0ve1b->regmap))
return dev_err_probe(og0ve1b->dev, PTR_ERR(og0ve1b->regmap),
og0ve1b->xvclk = devm_v4l2_sensor_clk_get(og0ve1b->dev, NULL);
if (IS_ERR(og0ve1b->xvclk))
return dev_err_probe(og0ve1b->dev, PTR_ERR(og0ve1b->xvclk),
freq = clk_get_rate(og0ve1b->xvclk);
return dev_err_probe(og0ve1b->dev, -EINVAL,
ret = og0ve1b_check_hwcfg(og0ve1b);
return dev_err_probe(og0ve1b->dev, ret,
og0ve1b->reset_gpio = devm_gpiod_get_optional(og0ve1b->dev, "reset",
if (IS_ERR(og0ve1b->reset_gpio))
return dev_err_probe(og0ve1b->dev, PTR_ERR(og0ve1b->reset_gpio),
og0ve1b->supplies[i].supply = og0ve1b_supply_names[i];
ret = devm_regulator_bulk_get(og0ve1b->dev, OG0VE1B_NUM_SUPPLIES,
og0ve1b->supplies);
return dev_err_probe(og0ve1b->dev, ret,
ret = og0ve1b_power_on(og0ve1b->dev);
ret = og0ve1b_identify_sensor(og0ve1b);
dev_err_probe(og0ve1b->dev, ret, "failed to find sensor\n");
ret = og0ve1b_init_controls(og0ve1b);
dev_err_probe(og0ve1b->dev, ret, "failed to init controls\n");
og0ve1b->sd.state_lock = og0ve1b->ctrl_handler.lock;
og0ve1b->sd.internal_ops = &og0ve1b_internal_ops;
og0ve1b->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
og0ve1b->sd.entity.ops = &og0ve1b_subdev_entity_ops;
og0ve1b->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
og0ve1b->pad.flags = MEDIA_PAD_FL_SOURCE;
ret = media_entity_pads_init(&og0ve1b->sd.entity, 1, &og0ve1b->pad);
dev_err_probe(og0ve1b->dev, ret,
ret = v4l2_subdev_init_finalize(&og0ve1b->sd);
dev_err_probe(og0ve1b->dev, ret,
pm_runtime_set_active(og0ve1b->dev);
pm_runtime_enable(og0ve1b->dev);
ret = v4l2_async_register_subdev_sensor(&og0ve1b->sd);
dev_err_probe(og0ve1b->dev, ret,
pm_runtime_idle(og0ve1b->dev);
pm_runtime_set_autosuspend_delay(og0ve1b->dev, 1000);
pm_runtime_use_autosuspend(og0ve1b->dev);
v4l2_subdev_cleanup(&og0ve1b->sd);
pm_runtime_disable(og0ve1b->dev);
pm_runtime_set_suspended(og0ve1b->dev);
media_entity_cleanup(&og0ve1b->sd.entity);
v4l2_ctrl_handler_free(og0ve1b->sd.ctrl_handler);
og0ve1b_power_off(og0ve1b->dev);
struct og0ve1b *og0ve1b = to_og0ve1b(sd);
pm_runtime_disable(og0ve1b->dev);
if (!pm_runtime_status_suspended(og0ve1b->dev)) {
og0ve1b_power_off(og0ve1b->dev);
pm_runtime_set_suspended(og0ve1b->dev);