summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Lilliebjerg <elilliebjerg@nvidia.com>2011-04-19 06:02:08 -0700
committerVarun Colbert <vcolbert@nvidia.com>2011-04-20 22:24:49 -0700
commit90651aad036485974b99101df66a50e57c19e732 (patch)
tree2e000c1084547d76ec6064ab9474f5fe7b28aad7
parent75d25d6e65d7ffb5c238c69d5c81ea6a8f8e61b2 (diff)
media: video: tegra: SSL3250A torch driver
Fix SSL3250A camera flash I2C errors. Bug 778859 Change-Id: Ifaf800405bcfc080a66c500cb74fe87ca3074be9 Reviewed-on: http://git-master/r/28205 Reviewed-by: Varun Colbert <vcolbert@nvidia.com> Tested-by: Varun Colbert <vcolbert@nvidia.com>
-rw-r--r--drivers/media/video/tegra/ssl3250a.c45
1 files changed, 35 insertions, 10 deletions
diff --git a/drivers/media/video/tegra/ssl3250a.c b/drivers/media/video/tegra/ssl3250a.c
index f2082a5c193c..f832ffee713c 100644
--- a/drivers/media/video/tegra/ssl3250a.c
+++ b/drivers/media/video/tegra/ssl3250a.c
@@ -13,6 +13,7 @@
#include <linux/i2c.h>
#include <linux/miscdevice.h>
#include <linux/slab.h>
+#include <linux/delay.h>
#include <media/ssl3250a.h>
#define SSL3250A_I2C_REG_AMP 0x00
@@ -37,25 +38,37 @@ static struct ssl3250a_info *info;
static int ssl3250a_gpio(u8 gpio, u8 val)
{
+ int prev_val;
+
switch (gpio) {
case SSL3250A_GPIO_ACT:
- if (info->pdata && info->pdata->gpio_act)
- return info->pdata->gpio_act(val);
+ if (info->pdata && info->pdata->gpio_act) {
+ prev_val = info->pdata->gpio_act(val);
+ if (val && (prev_val ^ val))
+ mdelay(1); /*delay for device ready*/
+ return 0;
+ }
return -1;
case SSL3250A_GPIO_EN1:
- if (info->pdata && info->pdata->gpio_en1)
- return info->pdata->gpio_en1(val);
+ if (info->pdata && info->pdata->gpio_en1) {
+ info->pdata->gpio_en1(val);
+ return 0;
+ }
return -1;
case SSL3250A_GPIO_EN2:
- if (info->pdata && info->pdata->gpio_en2)
- return info->pdata->gpio_en2(val);
+ if (info->pdata && info->pdata->gpio_en2) {
+ info->pdata->gpio_en2(val);
+ return 0;
+ }
return -1;
case SSL3250A_GPIO_STRB:
- if (info->pdata && info->pdata->gpio_strb)
- return info->pdata->gpio_strb(val);
+ if (info->pdata && info->pdata->gpio_strb) {
+ info->pdata->gpio_strb(val);
+ return 0;
+ }
default:
return -1;
@@ -218,9 +231,21 @@ static long ssl3250a_ioctl(
static int ssl3250a_open(struct inode *inode, struct file *file)
{
+ int err;
+ u8 reg;
file->private_data = info;
- if (info->pdata && info->pdata->init)
- info->pdata->init();
+
+ pr_info("%s\n", __func__);
+ if (info->pdata && info->pdata->init) {
+ err = info->pdata->init();
+ if (err)
+ pr_err("ssl3250a_open: Board init failed\n");
+ }
+ ssl3250a_gpio(SSL3250A_GPIO_ACT, 1);
+ err = ssl3250a_get_reg(SSL3250A_I2C_REG_STS, &reg);
+ ssl3250a_gpio(SSL3250A_GPIO_ACT, 0);
+ if (err)
+ pr_err("ssl3250a_open: Device init failed\n");
return 0;
}