Lines Matching +full:lens +full:- +full:focus
1 // SPDX-License-Identifier: GPL-2.0
15 #include <media/v4l2-cci.h>
16 #include <media/v4l2-common.h>
17 #include <media/v4l2-ctrls.h>
18 #include <media/v4l2-subdev.h>
51 struct v4l2_ctrl *focus; member
60 ret = cci_read(dw9719->regmap, DW9719_INFO, &val, NULL); in dw9719_detect()
65 dev_err(dw9719->dev, "Failed to detect correct id\n"); in dw9719_detect()
66 return -ENXIO; in dw9719_detect()
74 return regulator_disable(dw9719->regulator); in dw9719_power_down()
81 ret = regulator_enable(dw9719->regulator); in dw9719_power_up()
86 cci_write(dw9719->regmap, DW9719_CONTROL, 1, &ret); in dw9719_power_up()
91 cci_write(dw9719->regmap, DW9719_CONTROL, DW9719_ENABLE_RINGING, &ret); in dw9719_power_up()
92 cci_write(dw9719->regmap, DW9719_MODE, in dw9719_power_up()
93 dw9719->sac_mode << DW9719_MODE_SAC_SHIFT, &ret); in dw9719_power_up()
94 cci_write(dw9719->regmap, DW9719_VCM_FREQ, dw9719->vcm_freq, &ret); in dw9719_power_up()
104 return cci_write(dw9719->regmap, DW9719_VCM_CURRENT, value, NULL); in dw9719_t_focus_abs()
109 struct dw9719_device *dw9719 = container_of(ctrl->handler, in dw9719_set_ctrl()
115 if (!pm_runtime_get_if_in_use(dw9719->dev)) in dw9719_set_ctrl()
118 switch (ctrl->id) { in dw9719_set_ctrl()
120 ret = dw9719_t_focus_abs(dw9719, ctrl->val); in dw9719_set_ctrl()
123 ret = -EINVAL; in dw9719_set_ctrl()
126 pm_runtime_put(dw9719->dev); in dw9719_set_ctrl()
142 for (val = dw9719->ctrls.focus->val; val >= 0; in dw9719_suspend()
143 val -= DW9719_CTRL_STEPS) { in dw9719_suspend()
158 int current_focus = dw9719->ctrls.focus->val; in dw9719_resume()
184 return pm_runtime_resume_and_get(sd->dev); in dw9719_open()
189 pm_runtime_put(sd->dev); in dw9719_close()
204 v4l2_ctrl_handler_init(&dw9719->ctrls.handler, 1); in dw9719_init_controls()
206 dw9719->ctrls.focus = v4l2_ctrl_new_std(&dw9719->ctrls.handler, ops, in dw9719_init_controls()
210 if (dw9719->ctrls.handler.error) { in dw9719_init_controls()
211 dev_err(dw9719->dev, "Error initialising v4l2 ctrls\n"); in dw9719_init_controls()
212 ret = dw9719->ctrls.handler.error; in dw9719_init_controls()
216 dw9719->sd.ctrl_handler = &dw9719->ctrls.handler; in dw9719_init_controls()
220 v4l2_ctrl_handler_free(&dw9719->ctrls.handler); in dw9719_init_controls()
231 dw9719 = devm_kzalloc(&client->dev, sizeof(*dw9719), GFP_KERNEL); in dw9719_probe()
233 return -ENOMEM; in dw9719_probe()
235 dw9719->regmap = devm_cci_regmap_init_i2c(client, 8); in dw9719_probe()
236 if (IS_ERR(dw9719->regmap)) in dw9719_probe()
237 return PTR_ERR(dw9719->regmap); in dw9719_probe()
239 dw9719->dev = &client->dev; in dw9719_probe()
240 dw9719->sac_mode = DW9719_MODE_SAC3; in dw9719_probe()
241 dw9719->vcm_freq = DW9719_DEFAULT_VCM_FREQ; in dw9719_probe()
244 device_property_read_u32(&client->dev, "dongwoon,sac-mode", in dw9719_probe()
245 &dw9719->sac_mode); in dw9719_probe()
248 device_property_read_u32(&client->dev, "dongwoon,vcm-freq", in dw9719_probe()
249 &dw9719->vcm_freq); in dw9719_probe()
251 dw9719->regulator = devm_regulator_get(&client->dev, "vdd"); in dw9719_probe()
252 if (IS_ERR(dw9719->regulator)) in dw9719_probe()
253 return dev_err_probe(&client->dev, PTR_ERR(dw9719->regulator), in dw9719_probe()
256 v4l2_i2c_subdev_init(&dw9719->sd, client, &dw9719_ops); in dw9719_probe()
257 dw9719->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in dw9719_probe()
258 dw9719->sd.internal_ops = &dw9719_internal_ops; in dw9719_probe()
264 ret = media_entity_pads_init(&dw9719->sd.entity, 0, NULL); in dw9719_probe()
268 dw9719->sd.entity.function = MEDIA_ENT_F_LENS; in dw9719_probe()
273 * runtime pm is disabled this will leave the chip on, so that the lens in dw9719_probe()
285 pm_runtime_set_active(&client->dev); in dw9719_probe()
286 pm_runtime_get_noresume(&client->dev); in dw9719_probe()
287 pm_runtime_enable(&client->dev); in dw9719_probe()
289 ret = v4l2_async_register_subdev(&dw9719->sd); in dw9719_probe()
293 pm_runtime_set_autosuspend_delay(&client->dev, 1000); in dw9719_probe()
294 pm_runtime_use_autosuspend(&client->dev); in dw9719_probe()
295 pm_runtime_put_autosuspend(&client->dev); in dw9719_probe()
300 pm_runtime_disable(&client->dev); in dw9719_probe()
301 pm_runtime_put_noidle(&client->dev); in dw9719_probe()
305 media_entity_cleanup(&dw9719->sd.entity); in dw9719_probe()
307 v4l2_ctrl_handler_free(&dw9719->ctrls.handler); in dw9719_probe()
319 v4l2_ctrl_handler_free(&dw9719->ctrls.handler); in dw9719_remove()
320 media_entity_cleanup(&dw9719->sd.entity); in dw9719_remove()
322 pm_runtime_disable(&client->dev); in dw9719_remove()
323 if (!pm_runtime_status_suspended(&client->dev)) in dw9719_remove()
325 pm_runtime_set_suspended(&client->dev); in dw9719_remove()