Commit 9781f220 authored by Komal Shah's avatar Komal Shah Committed by Tony Lindgren

Move i2c_driver out of ov9640_sensor structure and

add H4 camera sensor powerup/down functions.
Signed-off-by: default avatarKomal Shah <komal_shah802003@yahoo.com>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 93876132
...@@ -7,6 +7,7 @@ objs-yy := camera_core.o ...@@ -7,6 +7,7 @@ objs-yy := camera_core.o
objs-y$(CONFIG_ARCH_OMAP16XX) += omap16xxcam.o objs-y$(CONFIG_ARCH_OMAP16XX) += omap16xxcam.o
objs-y$(CONFIG_MACH_OMAP_H3) += h3_sensor_power.o objs-y$(CONFIG_MACH_OMAP_H3) += h3_sensor_power.o
objs-y$(CONFIG_MACH_OMAP_H4) += h4_sensor_power.o
omapcamera-objs := $(objs-yy) omapcamera-objs := $(objs-yy)
......
/*
* drivers/media/video/omap/h4_sensor_power.c
*
* H4 sensor powerup/down functions.
*
* Author: Andy Lowe (source@mvista.com)
*
* Copyright (C) 2004 MontaVista Software, Inc.
* Copyright (C) 2004 Texas Instruments.
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed "as is" without any warranty of any
* kind, whether express or implied.
*/
#include <linux/module.h>
#include <linux/types.h>
#include <asm/arch/gpioexpander.h>
int h4_sensor_powerup(void);
int h4_sensor_powerdown(void);
int
h4_sensor_powerup(void)
{
unsigned char expa;
int err;
/* read current state of GPIO EXPA outputs */
if ((err = read_gpio_expa(&expa, 0x20))) {
printk(KERN_ERR "Error reading GPIO EXPA\n");
return err;
}
/* Set GPIO EXPA P3 (CAMERA_MODULE_EN) to power-up sensor */
if ((err = write_gpio_expa(expa | 0x08, 0x20))) {
printk(KERN_ERR "Error writing to GPIO EXPA\n");
return err;
}
/* read current state of GPIO EXPA outputs */
if ((err = read_gpio_expa(&expa, 0x22))) {
printk(KERN_ERR "Error reading GPIO EXPA\n");
return err;
}
/* Clear GPIO EXPA P7 (CAM_RST) */
if ((err = write_gpio_expa(expa & ~0x80, 0x22))) {
printk(KERN_ERR "Error writing to GPIO EXPA\n");
return err;
}
return 0;
}
int
h4_sensor_powerdown(void)
{
unsigned char expa;
int err;
/* read current state of GPIO EXPA outputs */
if ((err = read_gpio_expa(&expa, 0x20))) {
printk(KERN_ERR "Error reading GPIO EXPA\n");
return err;
}
/* Clear GPIO EXPA P3 (CAMERA_MODULE_EN) to power-down sensor */
if ((err = write_gpio_expa(expa & ~0x08, 0x20))) {
printk(KERN_ERR "Error writing to GPIO EXPA\n");
return err;
}
return 0;
}
EXPORT_SYMBOL(h4_sensor_powerup);
EXPORT_SYMBOL(h4_sensor_powerdown);
/*
* drivers/media/video/omap/h4sensorpower.h
*
* Copyright (C) 2005 Texas Instruments.
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed "as is" without any warranty of any
* kind, whether express or implied.
*/
#ifndef H4SENSORPOWER_H
#define H4SENSORPOWER_H
int h4_sensor_powerup(void);
int h4_sensor_powerdown(void);
#endif /*H4SENSORPOWER_H*/
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "sensor_if.h" #include "sensor_if.h"
#include "ov9640.h" #include "ov9640.h"
#include "h3sensorpower.h" #include "h3sensorpower.h"
#include "h4sensorpower.h"
#define CAMERA_OV9640 #define CAMERA_OV9640
#ifdef CAMERA_OV9640 #ifdef CAMERA_OV9640
...@@ -31,7 +32,6 @@ ...@@ -31,7 +32,6 @@
struct ov9640_sensor { struct ov9640_sensor {
/* I2C parameters */ /* I2C parameters */
struct i2c_client client; struct i2c_client client;
struct i2c_driver driver;
int ver; /* OV9640 version */ int ver; /* OV9640 version */
}; };
...@@ -680,6 +680,12 @@ ov9640_powerup(void) ...@@ -680,6 +680,12 @@ ov9640_powerup(void)
return err; return err;
} }
if (machine_is_omap_h4()) {
err = h4_sensor_powerup();
if (err)
return err;
}
return 0; return 0;
} }
static int static int
...@@ -696,6 +702,12 @@ ov9640_powerdown(void) ...@@ -696,6 +702,12 @@ ov9640_powerdown(void)
return err; return err;
} }
if (machine_is_omap_h4()) {
err = h4_sensor_powerdown();
if (err)
return err;
}
return 0; return 0;
} }
...@@ -750,6 +762,8 @@ ov9640_detect(struct i2c_client *client) ...@@ -750,6 +762,8 @@ ov9640_detect(struct i2c_client *client)
return ver; return ver;
} }
static struct i2c_driver ov9640sensor_i2c_driver;
/* This function registers an I2C client via i2c_attach_client() for an OV9640 /* This function registers an I2C client via i2c_attach_client() for an OV9640
* sensor device. If 'probe' is non-zero, then the I2C client is only * sensor device. If 'probe' is non-zero, then the I2C client is only
* registered if the device can be detected. If 'probe' is zero, then no * registered if the device can be detected. If 'probe' is zero, then no
...@@ -768,7 +782,7 @@ ov9640_i2c_attach_client(struct i2c_adapter *adap, int addr, int probe) ...@@ -768,7 +782,7 @@ ov9640_i2c_attach_client(struct i2c_adapter *adap, int addr, int probe)
return -EBUSY; /* our client is already attached */ return -EBUSY; /* our client is already attached */
client->addr = addr; client->addr = addr;
client->driver = &sensor->driver; client->driver = &ov9640sensor_i2c_driver;
client->adapter = adap; client->adapter = adap;
err = i2c_attach_client(client); err = i2c_attach_client(client);
...@@ -1081,12 +1095,23 @@ ov9640sensor_cleanup(void *priv) ...@@ -1081,12 +1095,23 @@ ov9640sensor_cleanup(void *priv)
struct ov9640_sensor *sensor = (struct ov9640_sensor *) priv; struct ov9640_sensor *sensor = (struct ov9640_sensor *) priv;
if (sensor) { if (sensor) {
i2c_del_driver(&sensor->driver); i2c_del_driver(&ov9640sensor_i2c_driver);
ov9640_powerdown(); ov9640_powerdown();
} }
return 0; return 0;
} }
static struct i2c_driver ov9640sensor_i2c_driver = {
.driver {
.name = "ov9640",
},
.id = I2C_DRIVERID_MISC, /*FIXME:accroding to i2c-ids.h */
.attach_adapter = ov9640_i2c_probe_adapter,
.detach_client = ov9640_i2c_detach_client,
};
/* Initialize the OV9640 sensor. /* Initialize the OV9640 sensor.
* This routine allocates and initializes the data structure for the sensor, * This routine allocates and initializes the data structure for the sensor,
* powers up the sensor, registers the I2C driver, and sets a default image * powers up the sensor, registers the I2C driver, and sets a default image
...@@ -1099,7 +1124,6 @@ static void * ...@@ -1099,7 +1124,6 @@ static void *
ov9640sensor_init(struct v4l2_pix_format *pix) ov9640sensor_init(struct v4l2_pix_format *pix)
{ {
struct ov9640_sensor *sensor = &ov9640; struct ov9640_sensor *sensor = &ov9640;
struct i2c_driver *driver = &sensor->driver;
int err; int err;
memset(sensor, 0, sizeof(*sensor)); memset(sensor, 0, sizeof(*sensor));
...@@ -1108,12 +1132,7 @@ ov9640sensor_init(struct v4l2_pix_format *pix) ...@@ -1108,12 +1132,7 @@ ov9640sensor_init(struct v4l2_pix_format *pix)
if (ov9640_powerup()) if (ov9640_powerup())
return NULL; return NULL;
strlcpy(driver->driver.name, "OV9640 I2C driver", sizeof(driver->driver.name)); err = i2c_add_driver(&ov9640sensor_i2c_driver);
driver->id = I2C_DRIVERID_MISC;
driver->attach_adapter = ov9640_i2c_probe_adapter;
driver->detach_client = ov9640_i2c_detach_client;
err = i2c_add_driver(driver);
if (err) { if (err) {
printk(KERN_ERR "Failed to register OV9640 I2C client.\n"); printk(KERN_ERR "Failed to register OV9640 I2C client.\n");
return NULL; return NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment