Lines Matching refs:dw9719

55 static int dw9719_detect(struct dw9719_device *dw9719)  in dw9719_detect()  argument
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()
72 static int dw9719_power_down(struct dw9719_device *dw9719) in dw9719_power_down() argument
74 return regulator_disable(dw9719->regulator); in dw9719_power_down()
77 static int dw9719_power_up(struct dw9719_device *dw9719) in dw9719_power_up() argument
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()
97 dw9719_power_down(dw9719); in dw9719_power_up()
102 static int dw9719_t_focus_abs(struct dw9719_device *dw9719, s32 value) in dw9719_t_focus_abs() argument
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() local
115 if (!pm_runtime_get_if_in_use(dw9719->dev)) in dw9719_set_ctrl()
120 ret = dw9719_t_focus_abs(dw9719, ctrl->val); in dw9719_set_ctrl()
126 pm_runtime_put(dw9719->dev); in dw9719_set_ctrl()
138 struct dw9719_device *dw9719 = to_dw9719_device(sd); in dw9719_suspend() local
142 for (val = dw9719->ctrls.focus->val; val >= 0; in dw9719_suspend()
144 ret = dw9719_t_focus_abs(dw9719, val); in dw9719_suspend()
151 return dw9719_power_down(dw9719); in dw9719_suspend()
157 struct dw9719_device *dw9719 = to_dw9719_device(sd); in dw9719_resume() local
158 int current_focus = dw9719->ctrls.focus->val; in dw9719_resume()
162 ret = dw9719_power_up(dw9719); in dw9719_resume()
168 ret = dw9719_t_focus_abs(dw9719, val); in dw9719_resume()
178 dw9719_power_down(dw9719); in dw9719_resume()
199 static int dw9719_init_controls(struct dw9719_device *dw9719) in dw9719_init_controls() argument
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()
228 struct dw9719_device *dw9719; in dw9719_probe() local
231 dw9719 = devm_kzalloc(&client->dev, sizeof(*dw9719), GFP_KERNEL); in dw9719_probe()
232 if (!dw9719) 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()
245 &dw9719->sac_mode); 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()
260 ret = dw9719_init_controls(dw9719); 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()
277 ret = dw9719_power_up(dw9719); in dw9719_probe()
281 ret = dw9719_detect(dw9719); in dw9719_probe()
289 ret = v4l2_async_register_subdev(&dw9719->sd); in dw9719_probe()
303 dw9719_power_down(dw9719); in dw9719_probe()
305 media_entity_cleanup(&dw9719->sd.entity); in dw9719_probe()
307 v4l2_ctrl_handler_free(&dw9719->ctrls.handler); in dw9719_probe()
315 struct dw9719_device *dw9719 = in dw9719_remove() local
319 v4l2_ctrl_handler_free(&dw9719->ctrls.handler); in dw9719_remove()
320 media_entity_cleanup(&dw9719->sd.entity); in dw9719_remove()
324 dw9719_power_down(dw9719); in dw9719_remove()