add H4 camera sensor powerup/down functions.
Signed-off-by: Komal Shah <komal_shah802003@yahoo.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
objs-y$(CONFIG_ARCH_OMAP16XX) += omap16xxcam.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)
--- /dev/null
+/*
+ * 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);
--- /dev/null
+/*
+ * 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*/
#include "sensor_if.h"
#include "ov9640.h"
#include "h3sensorpower.h"
+#include "h4sensorpower.h"
#define CAMERA_OV9640
#ifdef CAMERA_OV9640
struct ov9640_sensor {
/* I2C parameters */
struct i2c_client client;
- struct i2c_driver driver;
int ver; /* OV9640 version */
};
return err;
}
+ if (machine_is_omap_h4()) {
+ err = h4_sensor_powerup();
+ if (err)
+ return err;
+ }
+
return 0;
}
static int
return err;
}
+ if (machine_is_omap_h4()) {
+ err = h4_sensor_powerdown();
+ if (err)
+ return err;
+ }
+
return 0;
}
return ver;
}
+static struct i2c_driver ov9640sensor_i2c_driver;
+
/* 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
* registered if the device can be detected. If 'probe' is zero, then no
return -EBUSY; /* our client is already attached */
client->addr = addr;
- client->driver = &sensor->driver;
+ client->driver = &ov9640sensor_i2c_driver;
client->adapter = adap;
err = i2c_attach_client(client);
struct ov9640_sensor *sensor = (struct ov9640_sensor *) priv;
if (sensor) {
- i2c_del_driver(&sensor->driver);
+ i2c_del_driver(&ov9640sensor_i2c_driver);
ov9640_powerdown();
}
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.
* This routine allocates and initializes the data structure for the sensor,
* powers up the sensor, registers the I2C driver, and sets a default image
ov9640sensor_init(struct v4l2_pix_format *pix)
{
struct ov9640_sensor *sensor = &ov9640;
- struct i2c_driver *driver = &sensor->driver;
int err;
memset(sensor, 0, sizeof(*sensor));
if (ov9640_powerup())
return NULL;
- strlcpy(driver->driver.name, "OV9640 I2C driver", sizeof(driver->driver.name));
- driver->id = I2C_DRIVERID_MISC;
- driver->attach_adapter = ov9640_i2c_probe_adapter;
- driver->detach_client = ov9640_i2c_detach_client;
-
- err = i2c_add_driver(driver);
+ err = i2c_add_driver(&ov9640sensor_i2c_driver);
if (err) {
printk(KERN_ERR "Failed to register OV9640 I2C client.\n");
return NULL;