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);
275 struct ad5820_device *coil = to_ad5820_device(subdev);
277 if (!coil->power_count)
280 return ad5820_power_off(coil, false);
287 struct ad5820_device *coil = to_ad5820_device(subdev);
289 if (!coil->power_count)
292 return ad5820_power_on(coil, true);
298 struct ad5820_device *coil;
301 coil = devm_kzalloc(&client->dev, sizeof(*coil), GFP_KERNEL);
302 if (!coil)
305 coil->vana = devm_regulator_get(&client->dev, "VANA");
306 if (IS_ERR(coil->vana)) {
307 ret = PTR_ERR(coil->vana);
313 coil->enable_gpio = devm_gpiod_get_optional(&client->dev, "enable",
315 if (IS_ERR(coil->enable_gpio)) {
316 ret = PTR_ERR(coil->enable_gpio);
322 mutex_init(&coil->power_lock);
324 v4l2_i2c_subdev_init(&coil->subdev, client, &ad5820_ops);
325 coil->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
326 coil->subdev.internal_ops = &ad5820_internal_ops;
327 coil->subdev.entity.function = MEDIA_ENT_F_LENS;
328 strscpy(coil->subdev.name, "ad5820 focus", sizeof(coil->subdev.name));
330 ret = media_entity_pads_init(&coil->subdev.entity, 0, NULL);
334 ret = v4l2_async_register_subdev(&coil->subdev);
341 media_entity_cleanup(&coil->subdev.entity);
343 mutex_destroy(&coil->power_lock);
350 struct ad5820_device *coil = to_ad5820_device(subdev);
352 v4l2_async_unregister_subdev(&coil->subdev);
353 v4l2_ctrl_handler_free(&coil->ctrls);
354 media_entity_cleanup(&coil->subdev.entity);
355 mutex_destroy(&coil->power_lock);