dev_err(&info->i2c_client->dev, "%s %s ERR: %d\n",
__func__, vreg_name, (int)reg);
err = PTR_ERR(reg);
- reg = NULL;
} else {
dev_dbg(&info->i2c_client->dev, "%s: %s\n",
__func__, vreg_name);
ov5693_gpio_init(info);
- ov5693_regulator_get(info, &pw->dvdd, "dvdd");
+ ov5693_regulator_get(info, &pw->avdd, info->pdata->regulators.avdd);
- ov5693_regulator_get(info, &pw->avdd, "avdd_ov5693");
+ ov5693_regulator_get(info, &pw->dvdd, info->pdata->regulators.dvdd);
+
+ ov5693_regulator_get(info, &pw->dovdd, info->pdata->regulators.dovdd);
- ov5693_regulator_get(info, &pw->dovdd, "dovdd");
info->power_on = false;
}
int err;
switch (_IOC_NR(cmd)) {
+ case _IOC_NR(OV5693_IOCTL_SET_POWER):
+ {
+ u32 powerlevel = (u32) arg;
+
+ if (!info->pdata)
+ break;
+ if (powerlevel > NVC_PWR_ON) {
+ dev_err(&info->i2c_client->dev,
+ "%s:Invalid power level.\n",
+ __func__);
+ return -EFAULT;
+ }
+
+ err = ov5693_pm_wr(info, powerlevel);
+ return err;
+ }
+ case _IOC_NR(OV5693_IOCTL_GET_CAPS):
+ if (copy_to_user((void __user *)arg,
+ info->pdata->cap,
+ sizeof(struct nvc_imager_cap))) {
+ dev_err(&info->i2c_client->dev,
+ "%s copy_to_user err line %d\n",
+ __func__, __LINE__);
+ return -EFAULT;
+ }
+ return 0;
case _IOC_NR(OV5693_IOCTL_SET_MODE):
{
struct ov5693_mode mode;
case _IOC_NR(OV5693_IOCTL_GET_EEPROM_DATA):
{
+ if (!info->pdata->has_eeprom)
+ return -EFAULT;
+
ov5693_read_eeprom(info,
0,
OV5693_EEPROM_SIZE,
case _IOC_NR(OV5693_IOCTL_SET_EEPROM_DATA):
{
int i;
+
+ if (!info->pdata->has_eeprom)
+ return -EFAULT;
+
if (copy_from_user(info->eeprom_buf,
(const void __user *)arg, OV5693_EEPROM_SIZE)) {
dev_err(&info->i2c_client->dev,
return err;
}
-int ov5693_release(struct inode *inode, struct file *file)
+static int ov5693_release(struct inode *inode, struct file *file)
{
struct ov5693_info *info = file->private_data;
dev_dbg(&info->i2c_client->dev, "%s\n", __func__);
misc_deregister(&info->miscdev);
sysedp_free_consumer(info->sysedpc);
- ov5693_eeprom_device_release(info);
+ if (info->pdata->has_eeprom)
+ ov5693_eeprom_device_release(info);
ov5693_del(info);
return 0;
}
return err;
}
- err = ov5693_eeprom_device_init(info);
- if (err) {
- dev_err(&client->dev,
+ if (info->pdata->has_eeprom) {
+ err = ov5693_eeprom_device_init(info);
+ if (err) {
+ dev_err(&client->dev,
"Failed to allocate eeprom register map: %d\n", err);
- return err;
+ return err;
+ }
}
mclk_name = info->pdata->mclk_name ?
i2c_set_clientdata(client, info);
ov5693_pm_init(info);
- if (!info->regulators.avdd || !info->regulators.dovdd)
- return -EFAULT;
+ if (IS_ERR(info->regulators.avdd) || IS_ERR(info->regulators.dovdd))
+ return -EFAULT;
info->sysedpc = sysedp_create_consumer("ov5693", "ov5693");
static const struct i2c_device_id ov5693_id[] = {
{ "ov5693", 0 },
+ { "ov5693.1", 0 },
{ },
};
/*
- * Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved.
+ * Copyright (c) 2013-2014, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
struct ov5693_cal_data)
#define OV5693_IOCTL_GET_EEPROM_DATA _IOR('o', 20, __u8 *)
#define OV5693_IOCTL_SET_EEPROM_DATA _IOW('o', 21, __u8 *)
+#define OV5693_IOCTL_GET_CAPS _IOR('o', 22, struct nvc_imager_cap)
+#define OV5693_IOCTL_SET_POWER _IOW('o', 23, __u32)
#define OV5693_INVALID_COARSE_TIME -1
struct regulator *dovdd;
};
+struct ov5693_regulators {
+ char *avdd;
+ char *dvdd;
+ char *dovdd;
+};
+
struct ov5693_platform_data {
unsigned cfg;
unsigned num;
int (*power_on)(struct ov5693_power_rail *);
int (*power_off)(struct ov5693_power_rail *);
const char *mclk_name;
+ struct nvc_imager_cap *cap;
+ struct ov5693_regulators regulators;
+ bool has_eeprom;
};
#endif /* __OV5693_H__ */