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;
}