dw9768
static inline struct dw9768 *sd_to_dw9768(struct v4l2_subdev *subdev)
return container_of(subdev, struct dw9768, sd);
static int dw9768_mod_reg(struct dw9768 *dw9768, u8 reg, u8 mask, u8 val)
struct i2c_client *client = v4l2_get_subdevdata(&dw9768->sd);
static int dw9768_set_dac(struct dw9768 *dw9768, u16 val)
struct i2c_client *client = v4l2_get_subdevdata(&dw9768->sd);
static int dw9768_init(struct dw9768 *dw9768)
struct i2c_client *client = v4l2_get_subdevdata(&dw9768->sd);
ret = dw9768_mod_reg(dw9768, DW9768_AAC_PRESC_REG,
dw9768->aac_mode << 5);
if (dw9768->clock_presc != DW9768_CLOCK_PRE_SCALE_DEFAULT) {
ret = dw9768_mod_reg(dw9768, DW9768_AAC_PRESC_REG,
dw9768->clock_presc);
if (dw9768->aac_timing != DW9768_AAC_TIME_DEFAULT) {
dw9768->aac_timing);
for (val = dw9768->focus->val % DW9768_MOVE_STEPS;
val <= dw9768->focus->val;
ret = dw9768_set_dac(dw9768, val);
usleep_range(dw9768->move_delay_us,
dw9768->move_delay_us + 1000);
static int dw9768_release(struct dw9768 *dw9768)
struct i2c_client *client = v4l2_get_subdevdata(&dw9768->sd);
val = round_down(dw9768->focus->val, DW9768_MOVE_STEPS);
ret = dw9768_set_dac(dw9768, val);
usleep_range(dw9768->move_delay_us,
dw9768->move_delay_us + 1000);
struct dw9768 *dw9768 = sd_to_dw9768(sd);
dw9768_release(dw9768);
dw9768->supplies);
struct dw9768 *dw9768 = sd_to_dw9768(sd);
dw9768->supplies);
ret = dw9768_init(dw9768);
dw9768->supplies);
struct dw9768 *dw9768 = container_of(ctrl->handler,
struct dw9768, ctrls);
return dw9768_set_dac(dw9768, ctrl->val);
static int dw9768_init_controls(struct dw9768 *dw9768)
struct v4l2_ctrl_handler *hdl = &dw9768->ctrls;
dw9768->focus = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_FOCUS_ABSOLUTE, 0,
dw9768->sd.ctrl_handler = hdl;
struct dw9768 *dw9768;
dw9768 = devm_kzalloc(dev, sizeof(*dw9768), GFP_KERNEL);
if (!dw9768)
v4l2_i2c_subdev_init(&dw9768->sd, client, &dw9768_ops);
dw9768->aac_mode = DW9768_AAC_MODE_DEFAULT;
dw9768->aac_timing = DW9768_AAC_TIME_DEFAULT;
dw9768->clock_presc = DW9768_CLOCK_PRE_SCALE_DEFAULT;
&dw9768->aac_mode);
&dw9768->clock_presc);
&dw9768->aac_timing);
dw9768->move_delay_us = dw9768_cal_move_delay(dw9768->aac_mode,
dw9768->clock_presc,
dw9768->aac_timing);
dw9768->supplies[i].supply = dw9768_supply_names[i];
dw9768->supplies);
ret = dw9768_init_controls(dw9768);
dw9768->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
dw9768->sd.internal_ops = &dw9768_int_ops;
ret = media_entity_pads_init(&dw9768->sd.entity, 0, NULL);
dw9768->sd.entity.function = MEDIA_ENT_F_LENS;
ret = v4l2_async_register_subdev(&dw9768->sd);
media_entity_cleanup(&dw9768->sd.entity);
v4l2_ctrl_handler_free(&dw9768->ctrls);
struct dw9768 *dw9768 = sd_to_dw9768(sd);
v4l2_async_unregister_subdev(&dw9768->sd);
v4l2_ctrl_handler_free(&dw9768->ctrls);
media_entity_cleanup(&dw9768->sd.entity);