From 9781f2202cc01130421b5db3c417fe5bee4774f2 Mon Sep 17 00:00:00 2001 From: Komal Shah Date: Tue, 28 Mar 2006 06:12:35 -0800 Subject: [PATCH] Move i2c_driver out of ov9640_sensor structure and add H4 camera sensor powerup/down functions. Signed-off-by: Komal Shah Signed-off-by: Tony Lindgren --- drivers/media/video/omap/Makefile | 1 + drivers/media/video/omap/h4_sensor_power.c | 76 ++++++++++++++++++++++ drivers/media/video/omap/h4sensorpower.h | 17 +++++ drivers/media/video/omap/sensor_ov9640.c | 39 ++++++++--- 4 files changed, 123 insertions(+), 10 deletions(-) create mode 100644 drivers/media/video/omap/h4_sensor_power.c create mode 100644 drivers/media/video/omap/h4sensorpower.h diff --git a/drivers/media/video/omap/Makefile b/drivers/media/video/omap/Makefile index c4c5a81b0d4..10987bedf3c 100644 --- a/drivers/media/video/omap/Makefile +++ b/drivers/media/video/omap/Makefile @@ -7,6 +7,7 @@ objs-yy := camera_core.o 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) diff --git a/drivers/media/video/omap/h4_sensor_power.c b/drivers/media/video/omap/h4_sensor_power.c new file mode 100644 index 00000000000..f8db956be2b --- /dev/null +++ b/drivers/media/video/omap/h4_sensor_power.c @@ -0,0 +1,76 @@ +/* + * 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 +#include + +#include + +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); diff --git a/drivers/media/video/omap/h4sensorpower.h b/drivers/media/video/omap/h4sensorpower.h new file mode 100644 index 00000000000..4eeae113285 --- /dev/null +++ b/drivers/media/video/omap/h4sensorpower.h @@ -0,0 +1,17 @@ +/* + * 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*/ diff --git a/drivers/media/video/omap/sensor_ov9640.c b/drivers/media/video/omap/sensor_ov9640.c index 788f41d008a..fe071e28472 100644 --- a/drivers/media/video/omap/sensor_ov9640.c +++ b/drivers/media/video/omap/sensor_ov9640.c @@ -24,6 +24,7 @@ #include "sensor_if.h" #include "ov9640.h" #include "h3sensorpower.h" +#include "h4sensorpower.h" #define CAMERA_OV9640 #ifdef CAMERA_OV9640 @@ -31,7 +32,6 @@ struct ov9640_sensor { /* I2C parameters */ struct i2c_client client; - struct i2c_driver driver; int ver; /* OV9640 version */ }; @@ -680,6 +680,12 @@ ov9640_powerup(void) return err; } + if (machine_is_omap_h4()) { + err = h4_sensor_powerup(); + if (err) + return err; + } + return 0; } static int @@ -696,6 +702,12 @@ ov9640_powerdown(void) return err; } + if (machine_is_omap_h4()) { + err = h4_sensor_powerdown(); + if (err) + return err; + } + return 0; } @@ -750,6 +762,8 @@ ov9640_detect(struct i2c_client *client) 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 @@ -768,7 +782,7 @@ ov9640_i2c_attach_client(struct i2c_adapter *adap, int addr, int probe) 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); @@ -1081,12 +1095,23 @@ ov9640sensor_cleanup(void *priv) 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 @@ -1099,7 +1124,6 @@ static void * 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)); @@ -1108,12 +1132,7 @@ ov9640sensor_init(struct v4l2_pix_format *pix) 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; -- 2.41.1