Lines Matching +full:lens +full:- +full:focus
1 // SPDX-License-Identifier: GPL-2.0
7 * latte-l-oss/drivers/external_drivers/camera/drivers/media/i2c/micam/dw9761.c
17 #include <media/v4l2-cci.h>
18 #include <media/v4l2-common.h>
19 #include <media/v4l2-ctrls.h>
20 #include <media/v4l2-subdev.h>
72 struct v4l2_ctrl *focus;
78 return regulator_disable(dw9719->regulator);
86 ret = regulator_enable(dw9719->regulator);
91 cci_write(dw9719->regmap, DW9719_CONTROL, DW9719_SHUTDOWN, &ret);
93 cci_write(dw9719->regmap, DW9719_CONTROL, DW9719_STANDBY, &ret);
98 ret = cci_read(dw9719->regmap, DW9719_INFO, &val, NULL);
104 dw9719->model = DW9719;
105 dw9719->mode_low_bits = 0x00;
106 dw9719->sac_mode = DW9719_DEFAULT_SAC;
107 dw9719->vcm_freq = DW9719_DEFAULT_VCM_FREQ;
110 dw9719->model = DW9761;
111 dw9719->mode_low_bits = 0x01;
112 dw9719->sac_mode = DW9761_DEFAULT_SAC;
113 dw9719->vcm_freq = DW9761_DEFAULT_VCM_FREQ;
116 dev_err(dw9719->dev,
118 return -ENXIO;
122 device_property_read_u32(dw9719->dev, "dongwoon,sac-mode",
123 &dw9719->sac_mode);
126 device_property_read_u32(dw9719->dev, "dongwoon,vcm-freq",
127 &dw9719->vcm_freq);
130 cci_write(dw9719->regmap, DW9719_CONTROL, DW9719_ENABLE_RINGING, &ret);
131 cci_write(dw9719->regmap, DW9719_MODE, dw9719->mode_low_bits |
132 (dw9719->sac_mode << DW9719_MODE_SAC_SHIFT), &ret);
133 cci_write(dw9719->regmap, DW9719_VCM_FREQ, dw9719->vcm_freq, &ret);
135 if (dw9719->model == DW9761)
136 cci_write(dw9719->regmap, DW9761_VCM_PRELOAD,
147 return cci_write(dw9719->regmap, DW9719_VCM_CURRENT, value, NULL);
152 struct dw9719_device *dw9719 = container_of(ctrl->handler,
158 if (!pm_runtime_get_if_in_use(dw9719->dev))
161 switch (ctrl->id) {
163 ret = dw9719_t_focus_abs(dw9719, ctrl->val);
166 ret = -EINVAL;
169 pm_runtime_put(dw9719->dev);
185 for (val = dw9719->ctrls.focus->val; val >= 0;
186 val -= DW9719_CTRL_STEPS) {
201 int current_focus = dw9719->ctrls.focus->val;
227 return pm_runtime_resume_and_get(sd->dev);
232 pm_runtime_put(sd->dev);
247 v4l2_ctrl_handler_init(&dw9719->ctrls.handler, 1);
249 dw9719->ctrls.focus = v4l2_ctrl_new_std(&dw9719->ctrls.handler, ops,
253 if (dw9719->ctrls.handler.error) {
254 dev_err(dw9719->dev, "Error initialising v4l2 ctrls\n");
255 ret = dw9719->ctrls.handler.error;
259 dw9719->sd.ctrl_handler = &dw9719->ctrls.handler;
263 v4l2_ctrl_handler_free(&dw9719->ctrls.handler);
274 dw9719 = devm_kzalloc(&client->dev, sizeof(*dw9719), GFP_KERNEL);
276 return -ENOMEM;
278 dw9719->regmap = devm_cci_regmap_init_i2c(client, 8);
279 if (IS_ERR(dw9719->regmap))
280 return PTR_ERR(dw9719->regmap);
282 dw9719->dev = &client->dev;
284 dw9719->regulator = devm_regulator_get(&client->dev, "vdd");
285 if (IS_ERR(dw9719->regulator))
286 return dev_err_probe(&client->dev, PTR_ERR(dw9719->regulator),
289 v4l2_i2c_subdev_init(&dw9719->sd, client, &dw9719_ops);
290 dw9719->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
291 dw9719->sd.internal_ops = &dw9719_internal_ops;
297 ret = media_entity_pads_init(&dw9719->sd.entity, 0, NULL);
301 dw9719->sd.entity.function = MEDIA_ENT_F_LENS;
306 * runtime pm is disabled this will leave the chip on, so that the lens
314 pm_runtime_set_active(&client->dev);
315 pm_runtime_get_noresume(&client->dev);
316 pm_runtime_enable(&client->dev);
318 ret = v4l2_async_register_subdev(&dw9719->sd);
322 pm_runtime_set_autosuspend_delay(&client->dev, 1000);
323 pm_runtime_use_autosuspend(&client->dev);
324 pm_runtime_put_autosuspend(&client->dev);
329 pm_runtime_disable(&client->dev);
330 pm_runtime_put_noidle(&client->dev);
333 media_entity_cleanup(&dw9719->sd.entity);
335 v4l2_ctrl_handler_free(&dw9719->ctrls.handler);
347 v4l2_ctrl_handler_free(&dw9719->ctrls.handler);
348 media_entity_cleanup(&dw9719->sd.entity);
350 pm_runtime_disable(&client->dev);
351 if (!pm_runtime_status_suspended(&client->dev))
353 pm_runtime_set_suspended(&client->dev);