static int ad5823_subdev_close(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) { struct ad5823 *core = to_ad5823(sd); vcm_power(core, 0); core->openflag = 0; return 0; }
static int ad5823_subdev_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) { struct ad5823 *core = to_ad5823(sd); if (core->openflag == 1) return -EBUSY; core->openflag = 1; vcm_power(core, 1); usleep_range(12000, 12000); v4l2_ctrl_handler_setup(&core->ctrls); return 0; }
static int ak7343_subdev_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) { struct ak7343 *core = to_ak7343(sd); struct i2c_client *client = v4l2_get_subdevdata(&core->subdev); unsigned long mfp_pin[2]; unsigned long i2c0_mfps[] = { GPIO053_GPIO_53, GPIO054_GPIO_54, }; unsigned long scl, sda; if (core->openflag == 1) return -EBUSY; core->openflag = 1; scl = MFP_PIN_GPIO53; sda = MFP_PIN_GPIO54; i2c_lock_adapter(client->adapter); if (gpio_request(scl, "SCL")) pr_err("Failed to request GPIO for SCL pin!\n"); if (gpio_request(sda, "SDA")) pr_err("Failed to request GPIO for SDA pin!\n"); mfp_pin[0] = mfp_read(MFP_PIN_GPIO53); mfp_pin[1] = mfp_read(MFP_PIN_GPIO54); mfp_config(i2c0_mfps, ARRAY_SIZE(i2c0_mfps)); gpio_direction_output(sda, 0); gpio_direction_output(scl, 0); mdelay(100); vcm_power(core, 1); mdelay(10); gpio_direction_output(sda, 1); gpio_direction_output(scl, 1); mfp_write(MFP_PIN_GPIO53, mfp_pin[0]); mfp_write(MFP_PIN_GPIO54, mfp_pin[1]); gpio_free(sda); gpio_free(scl); i2c_unlock_adapter(client->adapter); mdelay(120); ak7343_write(client, 0x05, 0x7a); ak7343_write(client, 0x01, 0x01); mdelay(200); ak7343_write(client, 0x02, 0x01); mdelay(120); ak7343_write(client, 0x01, 0x00); return 0; }
static int __devinit ad5823_probe(struct i2c_client *client, const struct i2c_device_id *id) { int ret = -1; u8 vcmid; int pwdn = 0; struct ad5823 *vcm; struct vcm_platform_data *pdata = client->dev.platform_data; vcm = kzalloc(sizeof(struct ad5823), GFP_KERNEL); if (!vcm) { dev_err(&client->dev, "ad5823: failed to allocate ad5823 struct\n"); return -ENOMEM; } if (!pdata) return -EIO; if (pdata->power_domain) { vcm->af_vcc = regulator_get(&client->dev, pdata->power_domain); if (IS_ERR(vcm->af_vcc)) goto out_af_vcc; vcm_power(vcm, 1); } if (pdata->pwdn_gpio) { vcm->pwdn_gpio = pdata->pwdn_gpio; if (gpio_request(vcm->pwdn_gpio, "VCM_ENABLE_LOW")) { printk(KERN_ERR "VCM:can't get the gpio resource!\n"); ret = -EIO; goto out_gpio; } pwdn = gpio_get_value(vcm->pwdn_gpio); gpio_direction_output(vcm->pwdn_gpio, pdata->pwdn_en); } usleep_range(12000, 12000); if (ad5823_read(client, 0x01, &vcmid)) { printk(KERN_ERR "VCM: ad5823 vcm detect failure!\n"); goto out_pwdn; } if (vcm->pwdn_gpio) { gpio_direction_output(vcm->pwdn_gpio, pwdn); gpio_free(vcm->pwdn_gpio); } if (vcm->af_vcc) vcm_power(vcm, 0); v4l2_i2c_subdev_init(&vcm->subdev, client, &ad5823_ops); vcm->subdev.internal_ops = &ad5823_v4l2_internal_ops; vcm->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; ret = ad5823_init_controls(vcm); if (ret < 0) goto out; ret = media_entity_init(&vcm->subdev.entity, 0, NULL, 0); if (ret < 0) goto out; printk(KERN_INFO "ad5823 detected!\n"); return 0; out: v4l2_ctrl_handler_free(&vcm->ctrls); out_pwdn: if (vcm->pwdn_gpio) { gpio_direction_output(vcm->pwdn_gpio, pwdn); gpio_free(vcm->pwdn_gpio); } out_gpio: if (vcm->af_vcc) vcm_power(vcm, 0); out_af_vcc: regulator_put(vcm->af_vcc); vcm->af_vcc = NULL; kfree(vcm); return ret; }