Lines Matching defs:coil
5 * AD5820 DAC driver for camera voice coil focus.
57 static int ad5820_write(struct ad5820_device *coil, u16 data)
59 struct i2c_client *client = v4l2_get_subdevdata(&coil->subdev);
87 static int ad5820_update_hw(struct ad5820_device *coil)
91 status = RAMP_US_TO_CODE(coil->focus_ramp_time);
92 status |= coil->focus_ramp_mode
94 status |= coil->focus_absolute << AD5820_DAC_SHIFT;
96 if (coil->standby)
99 return ad5820_write(coil, status);
105 static int ad5820_power_off(struct ad5820_device *coil, bool standby)
111 * (single power line control for both coil and sensor).
114 coil->standby = true;
115 ret = ad5820_update_hw(coil);
118 gpiod_set_value_cansleep(coil->enable_gpio, 0);
120 ret2 = regulator_disable(coil->vana);
126 static int ad5820_power_on(struct ad5820_device *coil, bool restore)
130 ret = regulator_enable(coil->vana);
134 gpiod_set_value_cansleep(coil->enable_gpio, 1);
138 coil->standby = false;
139 ret = ad5820_update_hw(coil);
146 gpiod_set_value_cansleep(coil->enable_gpio, 0);
147 coil->standby = true;
148 regulator_disable(coil->vana);
158 struct ad5820_device *coil =
163 coil->focus_absolute = ctrl->val;
164 return ad5820_update_hw(coil);
175 static int ad5820_init_controls(struct ad5820_device *coil)
177 v4l2_ctrl_handler_init(&coil->ctrls, 1);
191 v4l2_ctrl_new_std(&coil->ctrls, &ad5820_ctrl_ops,
194 if (coil->ctrls.error)
195 return coil->ctrls.error;
197 coil->focus_absolute = 0;
198 coil->focus_ramp_time = 0;
199 coil->focus_ramp_mode = 0;
201 coil->subdev.ctrl_handler = &coil->ctrls;
211 struct ad5820_device *coil = to_ad5820_device(subdev);
213 return ad5820_init_controls(coil);
219 struct ad5820_device *coil = to_ad5820_device(subdev);
222 mutex_lock(&coil->power_lock);
228 if (coil->power_count == !on) {
229 ret = on ? ad5820_power_on(coil, true) :
230 ad5820_power_off(coil, true);
236 coil->power_count += on ? 1 : -1;
237 WARN_ON(coil->power_count < 0);
240 mutex_unlock(&coil->power_lock);
274 struct ad5820_device *coil = to_ad5820_device(subdev);
276 if (!coil->power_count)
279 return ad5820_power_off(coil, false);
285 struct ad5820_device *coil = to_ad5820_device(subdev);
287 if (!coil->power_count)
290 return ad5820_power_on(coil, true);
295 struct ad5820_device *coil;
298 coil = devm_kzalloc(&client->dev, sizeof(*coil), GFP_KERNEL);
299 if (!coil)
302 coil->vana = devm_regulator_get(&client->dev, "VANA");
303 if (IS_ERR(coil->vana))
304 return dev_err_probe(&client->dev, PTR_ERR(coil->vana),
307 coil->enable_gpio = devm_gpiod_get_optional(&client->dev, "enable",
309 if (IS_ERR(coil->enable_gpio))
310 return dev_err_probe(&client->dev, PTR_ERR(coil->enable_gpio),
313 mutex_init(&coil->power_lock);
315 v4l2_i2c_subdev_init(&coil->subdev, client, &ad5820_ops);
316 coil->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
317 coil->subdev.internal_ops = &ad5820_internal_ops;
318 coil->subdev.entity.function = MEDIA_ENT_F_LENS;
319 strscpy(coil->subdev.name, "ad5820 focus", sizeof(coil->subdev.name));
321 ret = media_entity_pads_init(&coil->subdev.entity, 0, NULL);
325 ret = v4l2_async_register_subdev(&coil->subdev);
332 media_entity_cleanup(&coil->subdev.entity);
334 mutex_destroy(&coil->power_lock);
341 struct ad5820_device *coil = to_ad5820_device(subdev);
343 v4l2_async_unregister_subdev(&coil->subdev);
344 v4l2_ctrl_handler_free(&coil->ctrls);
345 media_entity_cleanup(&coil->subdev.entity);
346 mutex_destroy(&coil->power_lock);