* [RFC][PATCH 0/6] OMAP1: CAMERA: Converts omap1 camera to use v4l2-int-device api
@ 2007-10-09 12:52 Eduardo Valentin
2007-10-09 12:52 ` [PATCH 1/6] OMAP1: CAMERA: Changed omap16xxcam.c to the coding style standard Eduardo Valentin
2007-10-22 6:31 ` [RFC][PATCH 0/6] OMAP1: CAMERA: Converts omap1 camera to use v4l2-int-device api Trilok Soni
0 siblings, 2 replies; 13+ messages in thread
From: Eduardo Valentin @ 2007-10-09 12:52 UTC (permalink / raw)
To: linux-omap-mailing-list
Hi all,
This patch set converts omap1 camera to use v4l2-int-device api. It was
tested on H3 with ov9640 sensor, so board-h3.c was modified to add ov9640
specific initializations. The gpio-expander code was modified also to use
the i2c adapter id configured with i2c board specific info. Currently, it is
working only with read method. To work with MMAP, camera_core.c needs more
re-work.
Here is the overall diffstat:
b/arch/arm/mach-omap1/board-h3.c | 141 +++++++++
b/drivers/i2c/chips/gpio_expander_omap.c | 5
b/drivers/media/video/omap/Kconfig | 6
b/drivers/media/video/omap/Makefile | 4
b/drivers/media/video/omap/camera_core.c | 394 ++++++++++++++++++---------
b/drivers/media/video/omap/camera_core.h | 27 -
b/drivers/media/video/omap/omap16xxcam.c | 442 +++++++++++++++----------------
drivers/media/video/omap/camera_core.c | 404 +++++++++++++---------------
8 files changed, 827 insertions(+), 596 deletions(-)
BR,
Eduardo Valentin
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/6] OMAP1: CAMERA: Changed omap16xxcam.c to the coding style standard
2007-10-09 12:52 [RFC][PATCH 0/6] OMAP1: CAMERA: Converts omap1 camera to use v4l2-int-device api Eduardo Valentin
@ 2007-10-09 12:52 ` Eduardo Valentin
2007-10-09 12:52 ` [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board Eduardo Valentin
2007-10-22 6:31 ` [RFC][PATCH 0/6] OMAP1: CAMERA: Converts omap1 camera to use v4l2-int-device api Trilok Soni
1 sibling, 1 reply; 13+ messages in thread
From: Eduardo Valentin @ 2007-10-09 12:52 UTC (permalink / raw)
To: linux-omap-mailing-list; +Cc: Eduardo Valentin
From: Eduardo Valentin <eduardo.valentin@indt.org.br>
- Executed Lindent on omap16xxcam.c
- Removed extra blank spaces
- Lines with more than 80 columns were broken
- Added KERN_* flags on printk calls
Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
---
drivers/media/video/omap/omap16xxcam.c | 441 ++++++++++++++++----------------
1 files changed, 215 insertions(+), 226 deletions(-)
diff --git a/drivers/media/video/omap/omap16xxcam.c b/drivers/media/video/omap/omap16xxcam.c
index 34cf1a6..82c006b 100644
--- a/drivers/media/video/omap/omap16xxcam.c
+++ b/drivers/media/video/omap/omap16xxcam.c
@@ -1,23 +1,23 @@
/*
* drivers/media/video/omap/omap16xxcam.c
*
- * Copyright (C) 2004 Texas Instruments, Inc.
- *
+ * Copyright (C) 2004 Texas Instruments, Inc.
+ *
* Video-for-Linux (Version 2) camera capture driver for
* the OMAP H2 and H3 camera controller.
*
- * leverage some code from CEE distribution
+ * leverage some code from CEE distribution
* Copyright (C) 2003-2004 MontaVista Software, Inc.
- *
- * This package is free software; you can redistribute it and/or modify
+ *
+ * This package is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * published by the Free Software Foundation.
+ *
+ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
-
+
#include <linux/vmalloc.h>
#include <linux/slab.h>
#include <linux/proc_fs.h>
@@ -38,7 +38,6 @@
#include "omap16xxcam.h"
#include "camera_hw_if.h"
#include "camera_core.h"
-
#define CONF_CAMERAIF_RESET_R 5
#define EN_PER 0
@@ -49,13 +48,13 @@
#define NUM_CAMDMA_CHANNELS 2
typedef struct {
- unsigned int ctrlclock; /* 00 */
- unsigned int it_status; /* 04 */
- unsigned int mode; /* 08 */
- unsigned int status; /* 0C */
- unsigned int camdata; /* 10 */
- unsigned int gpio; /* 14 */
- unsigned int peak_counter; /* 18 */
+ unsigned int ctrlclock; /* 00 */
+ unsigned int it_status; /* 04 */
+ unsigned int mode; /* 08 */
+ unsigned int status; /* 0C */
+ unsigned int camdata; /* 10 */
+ unsigned int gpio; /* 14 */
+ unsigned int peak_counter; /* 18 */
} camera_regs_t;
struct camdma_state {
@@ -68,12 +67,12 @@ struct omap16xxcam {
camera_regs_t *camera_regs;
unsigned long iobase_phys;
- /* frequncy (in Hz) of camera interface functional clock (ocp_clk) */
+ /* Frequency (in Hz) of camera interface functional clock (ocp_clk) */
unsigned long ocp_clk;
struct clk *func_clk;
- /* dma related stuff */
+ /* DMA related stuff */
spinlock_t dma_lock;
int free_dmach;
int next_dmach;
@@ -86,22 +85,21 @@ struct omap16xxcam {
int new;
};
static struct omap16xxcam hardware_data;
-
+
static int omap16xxcam_set_xclk(int, void *);
static void omap16xx_cam_dma_link_callback(int, unsigned short, void *);
/* Clears the camera data FIFO by setting RAZ_FIFO bit in MODE configuration
- register. */
-static void
-omap16xx_cam_clear_fifo(struct omap16xxcam *data)
+ * register.
+ */
+static void omap16xx_cam_clear_fifo(struct omap16xxcam *data)
{
data->camera_regs->mode |= RAZ_FIFO;
udelay(10);
data->camera_regs->mode &= ~RAZ_FIFO;
}
-
-static void
-omap16xx_cam_reset(struct omap16xxcam *data, int yes)
+
+static void omap16xx_cam_reset(struct omap16xxcam *data, int yes)
{
if (machine_is_omap_h3())
data->camera_regs->gpio = yes ? 0 : 1;
@@ -109,93 +107,96 @@ omap16xx_cam_reset(struct omap16xxcam *data, int yes)
data->camera_regs->gpio = yes ? 1 : 0;
}
-static void
-omap16xx_cam_init(void)
+static void omap16xx_cam_init(void)
{
/*
* FIXME - Use mux API's instead of directly writing in to MUX registers
*/
- omap_writel(omap_readl(FUNC_MUX_CTRL_4) & ~(0x1ff << 21), FUNC_MUX_CTRL_4);
+ omap_writel(omap_readl(FUNC_MUX_CTRL_4) & ~(0x1ff << 21),
+ FUNC_MUX_CTRL_4);
omap_writel(0, FUNC_MUX_CTRL_5);
- omap_writel(omap_readl(PULL_DWN_CTRL_0) & ~(0x1FFF << 17), PULL_DWN_CTRL_0);
+ omap_writel(omap_readl(PULL_DWN_CTRL_0) & ~(0x1FFF << 17),
+ PULL_DWN_CTRL_0);
omap_writel(omap_readl(PU_PD_SEL_0) & ~(0x1FFF << 17), PU_PD_SEL_0);
omap_writel(0xeaef, COMP_MODE_CTRL_0);
- omap_writel(omap_readl(OMAP1610_RESET_CONTROL) & ~(1 << CONF_CAMERAIF_RESET_R),
- OMAP1610_RESET_CONTROL);
- omap_writel(omap_readl(OMAP1610_RESET_CONTROL) | (1 << CONF_CAMERAIF_RESET_R),
- OMAP1610_RESET_CONTROL);
-
+ omap_writel(omap_readl(OMAP1610_RESET_CONTROL) &
+ ~(1 << CONF_CAMERAIF_RESET_R), OMAP1610_RESET_CONTROL);
+ omap_writel(omap_readl(OMAP1610_RESET_CONTROL) |
+ (1 << CONF_CAMERAIF_RESET_R), OMAP1610_RESET_CONTROL);
+
/* Enable peripheral reset */
omap_writew(omap_readw(ARM_RSTCT2) | (1 << EN_PER), ARM_RSTCT2);
- /* enable peripheral clock */
+ /* Enable peripheral clock */
clk_enable(hardware_data.func_clk);
}
-static void
-omap16xx_cam_waitfor_syncedge(struct omap16xxcam *data, u32 edge_mask)
+static void omap16xx_cam_waitfor_syncedge(struct omap16xxcam *data,
+ u32 edge_mask)
{
- data->camera_regs->mode = (FIFO_TRIGGER_LVL << THRESHOLD_BIT) | edge_mask;
+ data->camera_regs->mode =
+ (FIFO_TRIGGER_LVL << THRESHOLD_BIT) | edge_mask;
do {
interruptible_sleep_on(&data->vsync_wait);
} while (signal_pending(current));
}
-static void
-omap16xx_cam_configure_dma(struct omap16xxcam *data)
+static void omap16xx_cam_configure_dma(struct omap16xxcam *data)
{
data->camera_regs->mode = (FIFO_TRIGGER_LVL << THRESHOLD_BIT)
- | EN_DMA | EN_FIFO_FULL;
- data->camera_regs->ctrlclock |= LCLK_EN;
+ | EN_DMA | EN_FIFO_FULL;
+ data->camera_regs->ctrlclock |= LCLK_EN;
}
-/* acquire h/w resources DMA */
-static int
-omap16xx_cam_link_open(struct omap16xxcam *data)
+/* Acquire h/w resources DMA */
+static int omap16xx_cam_link_open(struct omap16xxcam *data)
{
int ret;
- /* Acquire first dma channel */
- if ((ret = omap_request_dma(OMAP_DMA_CAMERA_IF_RX,
- "camera dma 1", omap16xx_cam_dma_link_callback,
- (void *)data, &data->dma_channel_number1))) {
- return ret;
+ /* Acquire first DMA channel */
+ ret = omap_request_dma(OMAP_DMA_CAMERA_IF_RX,
+ "camera dma 1",
+ omap16xx_cam_dma_link_callback,
+ (void *)data, &data->dma_channel_number1);
+ if (ret)
+ return ret;
+
+ /* Acquire second DMA channel */
+ ret = omap_request_dma(OMAP_DMA_CAMERA_IF_RX,
+ "camera dma 2",
+ omap16xx_cam_dma_link_callback,
+ (void *)data, &data->dma_channel_number2);
+ if (ret) {
+ printk(KERN_ERR "No DMA available for camera\n");
+ return ret;
}
- /* Acquire second dma channel */
- if ((ret = omap_request_dma(OMAP_DMA_CAMERA_IF_RX,
- "camera dma 2", omap16xx_cam_dma_link_callback,
- (void *)data, &data->dma_channel_number2))) {
- printk ("No DMA available for camera\n");
- return ret;
- }
- data->next_dmach = data->dma_channel_number1;
+ data->next_dmach = data->dma_channel_number1;
OMAP_DMA_CLNK_CTRL_REG(data->dma_channel_number1) =
- data->dma_channel_number2;
+ data->dma_channel_number2;
OMAP_DMA_CLNK_CTRL_REG(data->dma_channel_number2) =
- data->dma_channel_number1;
+ data->dma_channel_number1;
return 0;
}
-/* free h/w resources, stop i/f */
-static int
-omap16xx_cam_link_close(struct omap16xxcam *data)
+/* Free h/w resources, stop i/f */
+static int omap16xx_cam_link_close(struct omap16xxcam *data)
{
- /* free dma channels */
+ /* Free DMA channels */
omap_stop_dma(data->dma_channel_number1);
omap_stop_dma(data->dma_channel_number2);
- omap_free_dma (data->dma_channel_number1);
- omap_free_dma (data->dma_channel_number2);
+ omap_free_dma(data->dma_channel_number1);
+ omap_free_dma(data->dma_channel_number2);
return 0;
}
-/* dma callback routine. */
-static void
-omap16xx_cam_dma_link_callback(int lch, unsigned short ch_status, void *data)
+/* DMA callback routine. */
+static void omap16xx_cam_dma_link_callback(int lch, unsigned short ch_status,
+ void *data)
{
int count;
void *arg1, *arg2;
@@ -204,52 +205,51 @@ omap16xx_cam_dma_link_callback(int lch, unsigned short ch_status, void *data)
dma_callback_t callback;
spin_lock(&cam->dma_lock);
- if (cam->free_dmach == 2)
- {
- printk("callback all CHANNELS WERE IDLE \n");
+ if (cam->free_dmach == 2) {
+ printk(KERN_ERR "callback all CHANNELS WERE IDLE \n");
spin_unlock(&cam->dma_lock);
return;
}
if (cam->free_dmach == 0) {
lch = cam->next_dmach;
} else {
- lch = cam->next_dmach == cam->dma_channel_number1 ?
- cam->dma_channel_number2 : cam->dma_channel_number1;
+ lch = cam->next_dmach == cam->dma_channel_number1 ?
+ cam->dma_channel_number2 : cam->dma_channel_number1;
}
- while (cam->free_dmach < 2)
- {
+ while (cam->free_dmach < 2) {
if (OMAP_DMA_CCR_REG(lch) & (1 << 7))
- break;
+ break;
count = (lch == cam->dma_channel_number2) ? 1 : 0;
callback = cam->camdma[count].callback;
- arg1 = cam->camdma[count].arg1;
+ arg1 = cam->camdma[count].arg1;
arg2 = cam->camdma[count].arg2;
cam->free_dmach++;
- spin_unlock(&cam->dma_lock);
- callback(arg1, arg2);
+ spin_unlock(&cam->dma_lock);
+ callback(arg1, arg2);
spin_lock(&cam->dma_lock);
- lch = (lch == cam->dma_channel_number2) ? cam->dma_channel_number1 :
- cam->dma_channel_number2;
+ lch =
+ (lch ==
+ cam->dma_channel_number2) ? cam->
+ dma_channel_number1 : cam->dma_channel_number2;
}
spin_unlock(&cam->dma_lock);
-
+
}
-static irqreturn_t
-omap16xx_cam_isr(int irq, void *client_data)
+static irqreturn_t omap16xx_cam_isr(int irq, void *client_data)
{
struct omap16xxcam *data = (struct omap16xxcam *)client_data;
unsigned int itstat = data->camera_regs->it_status;
/* VSYNC UP interrupt, start filling FIFO and enabling DMA */
- if (itstat & V_UP) {
+ if (itstat & V_UP) {
data->camera_regs->mode &= ~EN_V_UP;
- omap16xx_cam_clear_fifo(data);
+ omap16xx_cam_clear_fifo(data);
omap16xx_cam_configure_dma(data);
omap_start_dma(data->next_dmach);
wake_up_interruptible(&data->vsync_wait);
@@ -261,29 +261,29 @@ omap16xx_cam_isr(int irq, void *client_data)
}
if (itstat & H_UP)
- printk("H_UP\n");
-
+ printk(KERN_INFO "H_UP\n");
+
if (itstat & H_DOWN)
- printk("H_DOWN\n");
-
+ printk(KERN_INFO "H_DOWN\n");
+
if (itstat & FIFO_FULL) {
- omap16xx_cam_clear_fifo(data);
- printk("FIFO_FULL\n");
+ omap16xx_cam_clear_fifo(data);
+ printk(KERN_INFO "FIFO_FULL\n");
}
-
+
if (itstat & DATA_XFER)
- printk("DATA_TRANS\n");
-
+ printk(KERN_INFO "DATA_TRANS\n");
+
return IRQ_HANDLED;
}
-
-/* ------------- below are interface functions ----------------- */
-/* ------------- these functions are named omap16xxcam_<name> -- */
-static int
-omap16xxcam_init_dma(void *priv)
+
+/* ------------- Below are interface functions -----------------
+ * ------------- These functions are named omap16xxcam_<name> --
+ */
+static int omap16xxcam_init_dma(void *priv)
{
int ch;
- struct omap16xxcam *data = (struct omap16xxcam *) priv;
+ struct omap16xxcam *data = (struct omap16xxcam *)priv;
data->free_dmach = 2;
for (ch = 0; ch < 2; ++ch) {
@@ -295,12 +295,12 @@ omap16xxcam_init_dma(void *priv)
return 0;
}
-/* start the dma of chains */
-static int
-omap16xxcam_start_dma(struct sgdma_state *sgdma,
- dma_callback_t callback, void *arg1, void *arg2, void *priv)
+/* Start the DMA of chains */
+static int omap16xxcam_start_dma(struct sgdma_state *sgdma,
+ dma_callback_t callback, void *arg1,
+ void *arg2, void *priv)
{
- struct omap16xxcam *data = (struct omap16xxcam *) priv;
+ struct omap16xxcam *data = (struct omap16xxcam *)priv;
struct scatterlist *sglist;
unsigned long irqflags;
int dmach;
@@ -313,37 +313,37 @@ omap16xxcam_start_dma(struct sgdma_state *sgdma,
if (!data->free_dmach) {
spin_unlock_irqrestore(&data->dma_lock, irqflags);
return -EBUSY;
- }
+ }
dmach = data->next_dmach;
- count = (dmach == data->dma_channel_number2) ? 1:0;
+ count = (dmach == data->dma_channel_number2) ? 1 : 0;
data->camdma[count].callback = callback;
data->camdma[count].arg1 = arg1;
data->camdma[count].arg2 = arg2;
if (cpu_is_omap1710())
omap_set_dma_src_params(dmach, OMAP_DMA_PORT_OCP_T1,
- OMAP_DMA_AMODE_CONSTANT, CAM_CAMDATA_REG,
- 0, 0);
+ OMAP_DMA_AMODE_CONSTANT,
+ CAM_CAMDATA_REG, 0, 0);
else
omap_set_dma_src_params(dmach, OMAP_DMA_PORT_TIPB,
- OMAP_DMA_AMODE_CONSTANT, CAM_CAMDATA_REG,
- 0, 0);
+ OMAP_DMA_AMODE_CONSTANT,
+ CAM_CAMDATA_REG, 0, 0);
omap_set_dma_dest_params(dmach, OMAP_DMA_PORT_EMIFF,
- OMAP_DMA_AMODE_POST_INC, sg_dma_address(sglist),
- 0, 0);
+ OMAP_DMA_AMODE_POST_INC,
+ sg_dma_address(sglist), 0, 0);
omap_set_dma_transfer_params(dmach, OMAP_DMA_DATA_TYPE_S32,
- FIFO_TRIGGER_LVL,
- sg_dma_len(sglist)/(4 * FIFO_TRIGGER_LVL),
- OMAP_DMA_SYNC_FRAME,
- 0, 0);
+ FIFO_TRIGGER_LVL,
+ sg_dma_len(sglist) / (4 *
+ FIFO_TRIGGER_LVL),
+ OMAP_DMA_SYNC_FRAME, 0, 0);
+
+ OMAP_DMA_CLNK_CTRL_REG(dmach) &= ~(1 << 15);
- OMAP_DMA_CLNK_CTRL_REG(dmach) &= ~( 1<< 15);
+ prev_dmach = (dmach == data->dma_channel_number2) ?
+ data->dma_channel_number1 : data->dma_channel_number2;
- prev_dmach = (dmach == data->dma_channel_number2) ?
- data->dma_channel_number1 : data->dma_channel_number2;
-
if (data->new) {
data->new = 0;
omap16xx_cam_waitfor_syncedge(data, EN_V_UP);
@@ -351,20 +351,20 @@ omap16xxcam_start_dma(struct sgdma_state *sgdma,
if (OMAP_DMA_CCR_REG(prev_dmach) & (1 << 7))
OMAP_DMA_CLNK_CTRL_REG(prev_dmach) |= (1 << 15);
else {
- /* no transfer is in progress */
- omap_start_dma(dmach);
- }
+ /* No transfer is in progress */
+ omap_start_dma(dmach);
+ }
}
-
- data->next_dmach = prev_dmach;
+
+ data->next_dmach = prev_dmach;
data->free_dmach--;
spin_unlock_irqrestore(&data->dma_lock, irqflags);
return 0;
}
-int static
-omap16xxcam_finish_dma(void *priv)
+
+int static omap16xxcam_finish_dma(void *priv)
{
- struct omap16xxcam *data = (struct omap16xxcam *) priv;
+ struct omap16xxcam *data = (struct omap16xxcam *)priv;
while (data->free_dmach < 2)
mdelay(1);
@@ -372,112 +372,107 @@ omap16xxcam_finish_dma(void *priv)
return 0;
}
-
-/* Enables the camera. Takes camera out of reset. Enables the clocks. */
-static int
-omap16xxcam_enable(void *priv)
+/* Enables the camera. Takes camera out of reset. Enables the clocks. */
+static int omap16xxcam_enable(void *priv)
{
- struct omap16xxcam *data = (struct omap16xxcam *) priv;
+ struct omap16xxcam *data = (struct omap16xxcam *)priv;
omap16xx_cam_reset(data, 1);
-
- /* give clock to camera_module */
+
+ /* Give clock to camera_module */
data->camera_regs->mode = (FIFO_TRIGGER_LVL << THRESHOLD_BIT);
data->camera_regs->ctrlclock = MCLK_EN | CAMEXCLK_EN;
omap16xx_cam_clear_fifo(data);
- /* wait for camera to settle down */
+ /* Wait for camera to settle down */
mdelay(5);
return 0;
}
-
+
/* Disables all the camera clocks. Put the camera interface in reset. */
-static int
-omap16xxcam_disable(void *priv)
-{
- struct omap16xxcam *data = (struct omap16xxcam *) priv;
+static int omap16xxcam_disable(void *priv)
+{
+ struct omap16xxcam *data = (struct omap16xxcam *)priv;
omap16xx_cam_clear_fifo(data);
- data->camera_regs->ctrlclock = 0x00000000;
+ data->camera_regs->ctrlclock = 0x00000000;
data->camera_regs->mode = 0x00000000;
-
+
omap16xx_cam_reset(data, 0);
return 0;
}
/* Abort the data transfer */
-static int
-omap16xxcam_abort(void *priv)
+static int omap16xxcam_abort(void *priv)
{
return omap16xxcam_disable(priv);
}
-static int
-omap16xxcam_set_xclk(int xclk, void *priv)
-{
- struct omap16xxcam *data = (struct omap16xxcam *) priv;
- int xclk_val;
+static int omap16xxcam_set_xclk(int xclk, void *priv)
+{
+ struct omap16xxcam *data = (struct omap16xxcam *)priv;
+ int xclk_val;
int divisor = 1;
- divisor = data->ocp_clk/xclk;
- if ( divisor * xclk < data->ocp_clk)
- ++divisor;
+ divisor = data->ocp_clk / xclk;
+ if (divisor * xclk < data->ocp_clk)
+ ++divisor;
switch (divisor) {
- case 1:
- case 2:
- xclk_val = FOSCMOD_TC2_CK2;
- break;
- case 3:
- xclk_val = FOSCMOD_TC2_CK3;
- break;
- case 4:
- case 5:
- case 6:
- case 7:
- xclk_val = FOSCMOD_TC2_CK4;
- break;
- case 8:
- case 9:
- xclk_val = FOSCMOD_TC2_CK8;
- break;
- case 10:
- case 11:
- xclk_val = FOSCMOD_TC2_CK10;
- break;
- case 12:
- case 13:
- case 14:
- case 15:
- xclk_val = FOSCMOD_TC2_CK12;
- break;
- case 16:
- xclk_val = FOSCMOD_TC2_CK16;
- break;
- default:
- xclk_val = FOSCMOD_TC2_CK16;
+ case 1:
+ case 2:
+ xclk_val = FOSCMOD_TC2_CK2;
+ break;
+ case 3:
+ xclk_val = FOSCMOD_TC2_CK3;
+ break;
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ xclk_val = FOSCMOD_TC2_CK4;
+ break;
+ case 8:
+ case 9:
+ xclk_val = FOSCMOD_TC2_CK8;
+ break;
+ case 10:
+ case 11:
+ xclk_val = FOSCMOD_TC2_CK10;
+ break;
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ xclk_val = FOSCMOD_TC2_CK12;
+ break;
+ case 16:
+ xclk_val = FOSCMOD_TC2_CK16;
+ break;
+ default:
+ xclk_val = FOSCMOD_TC2_CK16;
}
-
- /* follow the protocol to change the XCLK clock */
+
+ /* Follow the protocol to change the XCLK clock */
data->camera_regs->ctrlclock &= ~CAMEXCLK_EN;
data->camera_regs->ctrlclock |= xclk_val;
data->camera_regs->ctrlclock |= CAMEXCLK_EN;
- return (data->ocp_clk/divisor);
+ return (data->ocp_clk / divisor);
}
-static int
-omap16xxcam_open(void *priv)
+static int omap16xxcam_open(void *priv)
{
- struct omap16xxcam *data = (struct omap16xxcam *) priv;
+ struct omap16xxcam *data = (struct omap16xxcam *)priv;
int ret;
- if ((ret = request_irq(INT_CAMERA, omap16xx_cam_isr, IRQF_DISABLED,
- "camera", data))) {
- printk("FAILED to aquire irq\n");
+ ret = request_irq(INT_CAMERA, omap16xx_cam_isr, IRQF_DISABLED,
+ "camera", data);
+ if (ret) {
+ printk(KERN_ERR "FAILED to acquire IRQ\n");
return ret;
}
@@ -488,22 +483,20 @@ omap16xxcam_open(void *priv)
return omap16xx_cam_link_open(data);
}
-static int
-omap16xxcam_close(void *priv)
+static int omap16xxcam_close(void *priv)
{
- struct omap16xxcam *data = (struct omap16xxcam *) priv;
+ struct omap16xxcam *data = (struct omap16xxcam *)priv;
omap16xxcam_disable(priv);
-
+
free_irq(INT_CAMERA, data);
-
+
return omap16xx_cam_link_close(data);
}
-static int
-omap16xxcam_cleanup(void *priv)
+static int omap16xxcam_cleanup(void *priv)
{
- struct omap16xxcam *data = (struct omap16xxcam *) priv;
+ struct omap16xxcam *data = (struct omap16xxcam *)priv;
if (!data->camera_regs)
return -EINVAL;
@@ -511,7 +504,7 @@ omap16xxcam_cleanup(void *priv)
omap16xxcam_disable(data);
if (cpu_is_omap1710())
iounmap((void *)data->camera_regs);
- data->camera_regs= NULL;
+ data->camera_regs = NULL;
if (data->iobase_phys) {
release_mem_region(data->iobase_phys, CAMERA_IOSIZE);
@@ -527,9 +520,8 @@ omap16xxcam_cleanup(void *priv)
return 0;
}
-/* Initialise the OMAP camera interface */
-static void *
-omap16xxcam_init(void)
+/* Initialize the OMAP camera interface */
+static void *omap16xxcam_init(void)
{
unsigned long cam_iobase;
@@ -540,36 +532,34 @@ omap16xxcam_init(void)
}
if (cpu_is_omap1710()) {
- cam_iobase = (unsigned long) ioremap (CAMERA_BASE,
- CAMERA_IOSIZE);
+ cam_iobase = (unsigned long)ioremap(CAMERA_BASE, CAMERA_IOSIZE);
if (!cam_iobase) {
- printk("CANNOT MAP CAMERA REGISTER\n");
+ printk(KERN_ERR "CANNOT MAP CAMERA REGISTER\n");
return NULL;
}
- }
- else
+ } else
cam_iobase = io_p2v(CAMERA_BASE);
/* Set the base address of the camera registers */
- hardware_data.camera_regs = (camera_regs_t *)cam_iobase;
- hardware_data.iobase_phys = (unsigned long) CAMERA_BASE;
+ hardware_data.camera_regs = (camera_regs_t *) cam_iobase;
+ hardware_data.iobase_phys = (unsigned long)CAMERA_BASE;
- /* get the input clock value to camera interface and store it */
+ /* Get the input clock value to camera interface and store it */
if (cpu_is_omap1710())
hardware_data.func_clk = clk_get(0, "tc2_ck");
else
hardware_data.func_clk = clk_get(0, "armper_ck");
hardware_data.ocp_clk = clk_get_rate(hardware_data.func_clk);
- /* Init the camera IF */
+ /* Initialize the camera IF */
omap16xx_cam_init();
- /* enable it. This is needed for sensor detection */
- omap16xxcam_enable((void*)&hardware_data);
- /* Init dma data */
+ /* Enable it. This is needed for sensor detection */
+ omap16xxcam_enable((void *)&hardware_data);
+ /* Initialize DMA data */
spin_lock_init(&hardware_data.dma_lock);
init_waitqueue_head(&hardware_data.vsync_wait);
- return (void*)&hardware_data;
+ return (void *)&hardware_data;
}
struct camera_hardware camera_hardware_if = {
@@ -587,4 +577,3 @@ struct camera_hardware camera_hardware_if = {
.start_dma = omap16xxcam_start_dma,
.finish_dma = omap16xxcam_finish_dma,
};
-
--
1.5.3.4.206.g58ba4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board.
2007-10-09 12:52 ` [PATCH 1/6] OMAP1: CAMERA: Changed omap16xxcam.c to the coding style standard Eduardo Valentin
@ 2007-10-09 12:52 ` Eduardo Valentin
2007-10-09 12:52 ` [PATCH 3/6] OMAP: Update gpio expander code to the corret i2c adapter id Eduardo Valentin
` (2 more replies)
0 siblings, 3 replies; 13+ messages in thread
From: Eduardo Valentin @ 2007-10-09 12:52 UTC (permalink / raw)
To: linux-omap-mailing-list; +Cc: Eduardo Valentin
From: Eduardo Valentin <eduardo.valentin@indt.org.br>
This code is based on board-h4.c and drivers/media/video/omap/h3_sensor_power.c codes.
Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
---
arch/arm/mach-omap1/board-h3.c | 140 ++++++++++++++++++++++++++++++++++++++++
1 files changed, 140 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c
index df77cf5..8ecc5f2 100644
--- a/arch/arm/mach-omap1/board-h3.c
+++ b/arch/arm/mach-omap1/board-h3.c
@@ -26,6 +26,7 @@
#include <linux/mtd/partitions.h>
#include <linux/input.h>
#include <linux/clk.h>
+#include <linux/i2c.h>
#include <linux/spi/spi.h>
#include <linux/spi/tsc2101.h>
@@ -37,6 +38,8 @@
#include <asm/mach/flash.h>
#include <asm/mach/map.h>
+#include <media/v4l2-int-device.h>
+
#include <asm/arch/gpio.h>
#include <asm/arch/gpioexpander.h>
#include <asm/arch/irqs.h>
@@ -50,6 +53,8 @@
#include <asm/arch/mcbsp.h>
#include <asm/arch/omap-alsa.h>
+#include <../drivers/media/video/ov9640.h>
+
extern int omap_gpio_init(void);
static int h3_keymap[] = {
@@ -547,6 +552,138 @@ static int nand_dev_ready(struct nand_platform_data *data)
return omap_get_gpio_datain(H3_NAND_RB_GPIO_PIN);
}
+/*
+ * Common OV9640 register initialization for all image sizes, pixel formats,
+ * and frame rates
+ */
+const static struct ov9640_reg ov9640_common[] = {
+
+ { 0x12, 0x80 }, { 0x11, 0x80 }, { 0x13, 0x88 }, /* COM7, CLKRC, COM8 */
+ { 0x01, 0x58 }, { 0x02, 0x24 }, { 0x04, 0x00 }, /* BLUE, RED, COM1 */
+ { 0x0E, 0x81 }, { 0x0F, 0x4F }, { 0x14, 0xcA }, /* COM5, COM6, COM9 */
+ { 0x16, 0x02 }, { 0x1B, 0x01 }, { 0x24, 0x70 }, /* ?, PSHFT, AEW */
+ { 0x25, 0x68 }, { 0x26, 0xD3 }, { 0x27, 0x90 }, /* AEB, VPT, BBIAS */
+ { 0x2A, 0x00 }, { 0x2B, 0x00 }, { 0x32, 0x24 }, /* EXHCH, EXHCL, HREF */
+ { 0x33, 0x02 }, { 0x37, 0x02 }, { 0x38, 0x13 }, /* CHLF, ADC, ACOM */
+ { 0x39, 0xF0 }, { 0x3A, 0x00 }, { 0x3B, 0x01 }, /* OFON, TSLB, COM11 */
+ { 0x3D, 0x90 }, { 0x3E, 0x02 }, { 0x3F, 0xF2 }, /* COM13, COM14, EDGE */
+ { 0x41, 0x02 }, { 0x42, 0xC8 }, /* COM16, COM17 */
+ { 0x43, 0xF0 }, { 0x44, 0x10 }, { 0x45, 0x6C }, /* ?, ?, ? */
+ { 0x46, 0x6C }, { 0x47, 0x44 }, { 0x48, 0x44 }, /* ?, ?, ? */
+ { 0x49, 0x03 }, { 0x59, 0x49 }, { 0x5A, 0x94 }, /* ?, ?, ? */
+ { 0x5B, 0x46 }, { 0x5C, 0x84 }, { 0x5D, 0x5C }, /* ?, ?, ? */
+ { 0x5E, 0x08 }, { 0x5F, 0x00 }, { 0x60, 0x14 }, /* ?, ?, ? */
+ { 0x61, 0xCE }, /* ? */
+ { 0x62, 0x70 }, { 0x63, 0x00 }, { 0x64, 0x04 }, /* LCC1, LCC2, LCC3 */
+ { 0x65, 0x00 }, { 0x66, 0x00 }, /* LCC4, LCC5 */
+ { 0x69, 0x00 }, { 0x6A, 0x3E }, { 0x6B, 0x3F }, /* HV, MBD, DBLV */
+ { 0x6C, 0x40 }, { 0x6D, 0x30 }, { 0x6E, 0x4B }, /* GSP1, GSP2, GSP3 */
+ { 0x6F, 0x60 }, { 0x70, 0x70 }, { 0x71, 0x70 }, /* GSP4, GSP5, GSP6 */
+ { 0x72, 0x70 }, { 0x73, 0x70 }, { 0x74, 0x60 }, /* GSP7, GSP8, GSP9 */
+ { 0x75, 0x60 }, { 0x76, 0x50 }, { 0x77, 0x48 }, /* GSP10,GSP11,GSP12 */
+ { 0x78, 0x3A }, { 0x79, 0x2E }, { 0x7A, 0x28 }, /* GSP13,GSP14,GSP15 */
+ { 0x7B, 0x22 }, { 0x7C, 0x04 }, { 0x7D, 0x07 }, /* GSP16,GST1, GST2 */
+ { 0x7E, 0x10 }, { 0x7F, 0x28 }, { 0x80, 0x36 }, /* GST3, GST4, GST5 */
+ { 0x81, 0x44 }, { 0x82, 0x52 }, { 0x83, 0x60 }, /* GST6, GST7, GST8 */
+ { 0x84, 0x6C }, { 0x85, 0x78 }, { 0x86, 0x8C }, /* GST9, GST10,GST11 */
+ { 0x87, 0x9E }, { 0x88, 0xBB }, { 0x89, 0xD2 }, /* GST12,GST13,GST14 */
+ { 0x8A, 0xE6 }, { 0x13, 0xaF }, { 0x15, 0x02 }, /* GST15, COM8 */
+ { 0x22, 0x8a }, /* GROS */
+ { OV9640_REG_TERM, OV9640_VAL_TERM }
+};
+
+#if defined(CONFIG_VIDEO_OV9640) || defined(CONFIG_VIDEO_OV9640_MODULE)
+static int ov9640_sensor_powerup(void)
+{
+ unsigned char expa;
+ int err;
+
+ /* read current state of GPIO EXPA outputs */
+ err = read_gpio_expa(&expa, 0x27);
+ if (err) {
+ printk(KERN_ERR "Error reading GPIO EXPA\n");
+ return err;
+ }
+ /* Set GPIO EXPA P3 (CAMERA_MODULE_EN) to power-up sensor */
+ err = write_gpio_expa(expa | 0x08, 0x27);
+ if (err) {
+ printk(KERN_ERR "Error writing to GPIO EXPA\n");
+ return err;
+ }
+
+ return 0;
+}
+static int ov9640_sensor_powerdown(void)
+{
+ unsigned char expa;
+ int err;
+
+ /* read current state of GPIO EXPA outputs */
+ err = read_gpio_expa(&expa, 0x27);
+ if (err) {
+ printk(KERN_ERR "Error reading GPIO EXPA\n");
+ return err;
+ }
+ /* Clear GPIO EXPA P3 (CAMERA_MODULE_EN) to power-down sensor */
+ err = write_gpio_expa(expa & ~0x08, 0x27);
+ if (err) {
+ printk(KERN_ERR "Error writing to GPIO EXPA\n");
+ return err;
+ }
+
+ return 0;
+}
+
+static int ov9640_sensor_power_set(int power)
+{
+ int err = 0;
+
+ if (power)
+ err = ov9640_sensor_powerup();
+ else
+ err = ov9640_sensor_powerdown();
+
+ return err;
+}
+
+static struct v4l2_ifparm ifparm = {
+ .if_type = V4L2_IF_TYPE_BT656,
+ .u = {
+ .bt656 = {
+ .frame_start_on_rising_vs = 1,
+ .nobt_vs_inv = 1,
+ .mode = V4L2_IF_TYPE_BT656_MODE_NOBT_8BIT,
+ .clock_min = OV9640_XCLK_MIN,
+ .clock_max = OV9640_XCLK_MAX,
+ },
+ },
+};
+
+static int ov9640_ifparm(struct v4l2_ifparm *p)
+{
+ *p = ifparm;
+
+ return 0;
+}
+#else
+static int ov9640_sensor_power_set(int power) { return 0; }
+static int ov9640_ifparm(struct v4l2_ifparm *p) { return 0; }
+#endif
+
+static struct ov9640_platform_data h3_ov9640_platform_data = {
+ .power_set = ov9640_sensor_power_set,
+ .default_regs = ov9640_common,
+ .ifparm = ov9640_ifparm,
+};
+
+static struct i2c_board_info __initdata h3_i2c_board_info[] = {
+ {
+ I2C_BOARD_INFO("ov9640", 0x30),
+ .platform_data = &h3_ov9640_platform_data,
+ },
+};
+
+
static void __init h3_init(void)
{
/* Here we assume the NOR boot config: NOR on CS3 (possibly swapped
@@ -569,6 +706,9 @@ static void __init h3_init(void)
/* GPIO10 pullup/down register, Enable pullup on GPIO10 */
omap_cfg_reg(V2_1710_GPIO10);
+ i2c_register_board_info(1, h3_i2c_board_info,
+ ARRAY_SIZE(h3_i2c_board_info));
+
platform_add_devices(devices, ARRAY_SIZE(devices));
spi_register_board_info(h3_spi_board_info,
ARRAY_SIZE(h3_spi_board_info));
--
1.5.3.4.206.g58ba4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 3/6] OMAP: Update gpio expander code to the corret i2c adapter id
2007-10-09 12:52 ` [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board Eduardo Valentin
@ 2007-10-09 12:52 ` Eduardo Valentin
2007-10-09 12:52 ` [PATCH 4/6] OMAP1: CAMERA: Convert camera_core.c to use v4l2-int-device API Eduardo Valentin
2007-10-10 14:06 ` [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board Eduardo Valentin
2007-10-31 10:41 ` Tony Lindgren
2 siblings, 1 reply; 13+ messages in thread
From: Eduardo Valentin @ 2007-10-09 12:52 UTC (permalink / raw)
To: linux-omap-mailing-list; +Cc: Eduardo Valentin
From: Eduardo Valentin <eduardo.valentin@indt.org.br>
- Update gpio expander code to the corret i2c adapter id
- Due to changes on i2c binding style, the i2c adapter is 1
and not 0. (as configured on i2c_register_board_info)
Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
---
drivers/i2c/chips/gpio_expander_omap.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/i2c/chips/gpio_expander_omap.c b/drivers/i2c/chips/gpio_expander_omap.c
index 92e96ba..dfe7f04 100644
--- a/drivers/i2c/chips/gpio_expander_omap.c
+++ b/drivers/i2c/chips/gpio_expander_omap.c
@@ -26,7 +26,7 @@ int write_gpio_expa(u8 val, int addr)
struct i2c_msg msg[1];
unsigned char data[1];
- adap = i2c_get_adapter(0);
+ adap = i2c_get_adapter(1);
if (!adap)
return -ENODEV;
msg->addr = addr; /* I2C address of GPIO EXPA */
@@ -51,7 +51,7 @@ int read_gpio_expa(u8 * val, int addr)
struct i2c_msg msg[1];
unsigned char data[1];
- adap = i2c_get_adapter(0);
+ adap = i2c_get_adapter(1);
if (!adap)
return -ENODEV;
msg->addr = addr; /* I2C address of GPIO EXPA */
--
1.5.3.4.206.g58ba4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 4/6] OMAP1: CAMERA: Convert camera_core.c to use v4l2-int-device API
2007-10-09 12:52 ` [PATCH 3/6] OMAP: Update gpio expander code to the corret i2c adapter id Eduardo Valentin
@ 2007-10-09 12:52 ` Eduardo Valentin
2007-10-09 12:52 ` [PATCH 5/6] OMAP1: CAMERA: Changed camera_core.c to the coding style standard Eduardo Valentin
0 siblings, 1 reply; 13+ messages in thread
From: Eduardo Valentin @ 2007-10-09 12:52 UTC (permalink / raw)
To: linux-omap-mailing-list; +Cc: Eduardo Valentin
From: Eduardo Valentin <eduardo.valentin@indt.org.br>
This patch converts camera_core.c to use v4l2-int-device API.
Only read method was tested with success. MMAP method still needs
re-work and tests.
Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
---
drivers/media/video/omap/camera_core.c | 394 +++++++++++++++++++++-----------
drivers/media/video/omap/camera_core.h | 26 +-
2 files changed, 279 insertions(+), 141 deletions(-)
diff --git a/drivers/media/video/omap/camera_core.c b/drivers/media/video/omap/camera_core.c
index bbd51d1..217a79f 100644
--- a/drivers/media/video/omap/camera_core.c
+++ b/drivers/media/video/omap/camera_core.c
@@ -54,6 +54,101 @@ static int capture_mem = 1280*960*2*2;
static int overlay_mem = 640*480*2;
+/*
+ * Enable the external sensor interface. Try to negotiate interface
+ * parameters with the sensor and start using the new ones. The calls
+ * to sensor_if_enable and sensor_if_disable need not to be balanced.
+ */
+static int camera_sensor_if_enable(struct camera_device *cam)
+{
+ int rval;
+ struct v4l2_ifparm p;
+
+ rval = vidioc_int_g_ifparm(cam->sdev, &p);
+ if (rval) {
+ dev_err(cam->dev, "vidioc_int_g_ifparm failed with %d\n", rval);
+ return rval;
+ }
+
+ cam->if_type = p.if_type;
+
+ switch (p.if_type) {
+ case V4L2_IF_TYPE_BT656:
+ cam->if_u.bt656.xclk =
+ cam->cam_hardware->set_xclk(cam->if_u.bt656.xclk,
+ cam->hardware_data);
+ break;
+ default:
+ /* FIXME: how about other interfaces? */
+ dev_err(cam->dev, "interface type %d not supported\n",
+ p.if_type);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static void camera_sensor_if_disable(const struct camera_device *cam)
+{
+ switch (cam->if_type) {
+ case V4L2_IF_TYPE_BT656:
+ break;
+ }
+}
+
+/*
+ * Initialise the sensor hardware.
+ */
+static int camera_sensor_init(struct camera_device *cam)
+{
+ int err = 0;
+ struct v4l2_int_device *sdev = cam->sdev;
+
+ /* Enable the xclk output. The sensor may (and does, in the case of
+ * the OV9640) require an xclk input in order for its initialization
+ * routine to work.
+ */
+
+ cam->if_u.bt656.xclk = 21000000;/* choose an arbitrary xclk frequency */
+
+ cam->if_u.bt656.xclk = cam->cam_hardware->set_xclk(cam->if_u.bt656.xclk,
+ cam->hardware_data);
+
+ err = camera_sensor_if_enable(cam);
+ if (err) {
+ dev_err(cam->dev, "sensor interface could not be enabled at "
+ "initialisation, %d\n", err);
+ cam->sdev = NULL;
+ goto out;
+ }
+
+ /* power up sensor during sensor initialization */
+ vidioc_int_s_power(sdev, 1);
+
+ err = vidioc_int_dev_init(sdev);
+ if (err) {
+ dev_err(cam->dev, "cannot initialize sensor, error %d\n", err);
+ /* Sensor init failed --- it's nonexistent to us! */
+ cam->sdev = NULL;
+ goto out;
+ }
+
+ dev_info(cam->dev, "sensor is %s\n", sdev->name);
+
+out:
+ camera_sensor_if_disable(cam);
+
+ vidioc_int_s_power(sdev, 0);
+
+ return err;
+}
+
+static void camera_sensor_exit(struct camera_device *cam)
+{
+ if (cam->sdev)
+ vidioc_int_dev_exit(cam->sdev);
+}
+
/* DMA completion routine for the scatter-gather DMA fragments. */
/* This function is called when a scatter DMA fragment is completed */
static void
@@ -68,7 +163,7 @@ camera_core_callback_sgdma(void *arg1, void *arg2)
sgdma = cam->sgdma + sgslot;
if (!sgdma->queued_sglist) {
spin_unlock(&cam->sg_lock);
- dev_err(&cam->dev, "SGDMA completed when none queued\n");
+ dev_err(cam->dev, "SGDMA completed when none queued\n");
return;
}
if (!--sgdma->queued_sglist) {
@@ -318,7 +413,8 @@ camera_core_vbq_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
static int
camera_core_vbq_setup(struct videobuf_queue *q, unsigned int *cnt, unsigned int *size)
{
- struct camera_device *cam = q->priv_data;
+ struct camera_fh *fh = q->priv_data;
+ struct camera_device *cam = fh->cam;
if (*cnt <= 0)
*cnt = VIDEO_MAX_FRAME; /* supply a default number of buffers */
@@ -340,7 +436,8 @@ static int
camera_core_vbq_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
enum v4l2_field field)
{
- struct camera_device *cam = q->priv_data;
+ struct camera_fh *fh = q->priv_data;
+ struct camera_device *cam = fh->cam;
int err = 0;
spin_lock(&cam->img_lock);
@@ -368,7 +465,8 @@ camera_core_vbq_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
static void
camera_core_vbq_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
{
- struct camera_device *cam = q->priv_data;
+ struct camera_fh *fh = q->priv_data;
+ struct camera_device *cam = fh->cam;
enum videobuf_state state = vb->state;
int err;
@@ -382,7 +480,7 @@ camera_core_vbq_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
* scatter-gather DMA slots as video buffers so that can't
* happen.
*/
- dev_dbg(&cam->dev, "Failed to queue a video buffer for SGDMA\n");
+ dev_dbg(cam->dev, "Failed to queue a video buffer for SGDMA\n");
vb->state = state;
}
}
@@ -417,7 +515,7 @@ static int vidioc_enum_fmt_cap(struct file *file, void *fh,
struct camera_fh *ofh = fh;
struct camera_device *cam = ofh->cam;
- return cam->cam_sensor->enum_pixformat(f, cam->sensor_data);
+ return vidioc_int_enum_fmt_cap(cam->sdev, f);
}
static int vidioc_g_fmt_cap(struct file *file, void *fh,
@@ -438,18 +536,16 @@ static int vidioc_s_fmt_cap(struct file *file, void *fh,
{
struct camera_fh *ofh = fh;
struct camera_device *cam = ofh->cam;
- unsigned int temp_sizeimage = 0;
+ int rval = 0;
+
+ vidioc_int_try_fmt_cap(cam->sdev, f);
- temp_sizeimage = cam->pix.sizeimage;
- cam->cam_sensor->try_format(&f->fmt.pix, cam->sensor_data);
cam->pix = f->fmt.pix;
- cam->xclk = cam->cam_sensor->calc_xclk(&cam->pix,
- &cam->nominal_timeperframe, cam->sensor_data);
- cam->cparm.timeperframe = cam->nominal_timeperframe;
- cam->xclk = cam->cam_hardware->set_xclk(cam->xclk, cam->hardware_data);
- return cam->cam_sensor->configure(&cam->pix, cam->xclk,
- &cam->cparm.timeperframe, cam->sensor_data);
+ rval = vidioc_int_s_fmt_cap(cam->sdev, f);
+ camera_sensor_if_enable(cam);
+
+ return rval;
}
static int vidioc_try_fmt_cap(struct file *file, void *fh,
@@ -458,7 +554,7 @@ static int vidioc_try_fmt_cap(struct file *file, void *fh,
struct camera_fh *ofh = fh;
struct camera_device *cam = ofh->cam;
- return cam->cam_sensor->try_format(&f->fmt.pix, cam->sensor_data);
+ return vidioc_int_try_fmt_cap(cam->sdev, f);
}
static int vidioc_reqbufs(struct file *file, void *fh,
@@ -563,7 +659,7 @@ static int vidioc_queryctrl(struct file *file, void *fh,
struct camera_fh *ofh = fh;
struct camera_device *cam = ofh->cam;
- return cam->cam_sensor->query_control(a, cam->sensor_data);
+ return vidioc_int_queryctrl(cam->sdev, a);
}
static int vidioc_g_ctrl(struct file *file, void *fh,
@@ -572,7 +668,7 @@ static int vidioc_g_ctrl(struct file *file, void *fh,
struct camera_fh *ofh = fh;
struct camera_device *cam = ofh->cam;
- return cam->cam_sensor->get_control(a, cam->sensor_data);
+ return vidioc_int_g_ctrl(cam->sdev, a);
}
static int vidioc_s_ctrl(struct file *file, void *fh,
@@ -581,7 +677,7 @@ static int vidioc_s_ctrl(struct file *file, void *fh,
struct camera_fh *ofh = fh;
struct camera_device *cam = ofh->cam;
- return cam->cam_sensor->set_control(a, cam->sensor_data);
+ return vidioc_int_s_ctrl(cam->sdev, a);
}
static int vidioc_g_fbuf(struct file *file, void *fh,
@@ -723,7 +819,7 @@ camera_core_read(struct file *file, char *data, size_t count, loff_t *ppos)
GFP_KERNEL | GFP_DMA);
}
if (!cam->capture_base) {
- dev_err(&cam->dev, "cannot allocate capture buffer\n");
+ dev_err(cam->dev, "cannot allocate capture buffer\n");
return 0;
}
@@ -744,7 +840,7 @@ camera_core_read(struct file *file, char *data, size_t count, loff_t *ppos)
timeout = interruptible_sleep_on_timeout
(&cam->new_video_frame, timeout);
if (timeout == 0) {
- dev_err(&cam->dev, "timeout waiting video frame\n");
+ dev_err(cam->dev, "timeout waiting video frame\n");
return -EIO; /* time out */
}
}
@@ -796,6 +892,8 @@ camera_core_release(struct inode *inode, struct file *file)
kfree(fh->vbq.read_buf);
}
+ module_put(cam->sdev->module);
+
cam->cam_hardware->close(cam->hardware_data);
cam->active = 0;
return 0;
@@ -807,6 +905,8 @@ camera_core_open(struct inode *inode, struct file *file)
int minor = iminor(inode);
struct camera_device *cam = camera_dev;
struct camera_fh *fh;
+ struct v4l2_format format;
+ int rval;
if (!cam || !cam->vfd || (cam->vfd->minor != minor))
return -ENODEV;
@@ -821,11 +921,20 @@ camera_core_open(struct inode *inode, struct file *file)
spin_lock(&cam->img_lock);
if (cam->active == 1) {
- dev_err(&cam->dev, "Camera device Active\n");
+ dev_err(cam->dev, "Camera device Active\n");
spin_unlock(&cam->img_lock);
- return -EPERM;
+ rval = -EPERM;
+ goto err;
}
cam->active = 1;
+
+ if (cam->sdev == NULL || !try_module_get(cam->sdev->module)) {
+ spin_unlock(&cam->img_lock);
+ rval = -ENODEV;
+ goto err;
+ }
+
+ vidioc_int_g_fmt_cap(cam->sdev, &format);
spin_unlock(&cam->img_lock);
videobuf_queue_init(&fh->vbq, &cam->vbq_ops, NULL, &cam->vbq_lock,
@@ -835,60 +944,64 @@ camera_core_open(struct inode *inode, struct file *file)
cam->capture_started = 0;
if (cam->cam_hardware->open(cam->hardware_data)) {
- dev_err(&cam->dev, "Camera IF configuration failed\n");
+ dev_err(cam->dev, "Camera IF configuration failed\n");
cam->active = 0;
- return -ENODEV;
+ rval = -ENODEV;
+ goto err;
}
-
- cam->xclk = cam->cam_hardware->set_xclk(cam->xclk, cam->hardware_data);
- /* program the sensor for the capture format and rate */
- if (cam->cam_sensor->configure(&cam->pix, cam->xclk,
- &cam->cparm.timeperframe, cam->sensor_data)) {
- dev_err(&cam->dev, "Camera sensor configuration failed\n");
+ rval = vidioc_s_fmt_cap(file, fh, &format);
+ if (rval) {
+ dev_err(cam->dev, "Camera sensor configuration failed (%d)\n", rval);
cam->cam_hardware->close(cam->hardware_data);
cam->active = 0;
- return -ENODEV;
+ rval = -ENODEV;
+ goto err;
}
return 0;
+
+err:
+ module_put(cam->sdev->module);
+ kfree(fh);
+ return rval;
}
#ifdef CONFIG_PM
static int camera_core_suspend(struct platform_device *pdev, pm_message_t state)
{
struct camera_device *cam = platform_get_drvdata(pdev);
- int ret = 0;
spin_lock(&cam->img_lock);
if (cam->active)
cam->cam_hardware->close(cam->hardware_data);
- cam->cam_sensor->power_off(cam->sensor_data);
+ vidioc_int_s_power(cam->sdev, 0);
spin_unlock(&cam->img_lock);
- return ret;
+ return 0;
}
static int camera_core_resume(struct platform_device *pdev)
{
struct camera_device *cam = platform_get_drvdata(pdev);
- int ret = 0;
spin_lock(&cam->img_lock);
- cam->cam_sensor->power_on(cam->sensor_data);
+ vidioc_int_s_power(cam->sdev, 1);
if (cam->active) {
+ struct v4l2_format format;
+
cam->capture_completed = 1;
cam->cam_hardware->open(cam->hardware_data);
- cam->cam_hardware->set_xclk(cam->xclk, cam->hardware_data);
- cam->cam_sensor->configure(&cam->pix, cam->xclk,
- &cam->cparm.timeperframe,
- cam->sensor_data);
+ vidioc_int_g_fmt_cap(cam->sdev, &format);
+ vidioc_int_s_fmt_cap(cam->sdev, &format);
+ camera_sensor_if_enable(cam);
+
camera_core_sgdma_process(cam);
}
spin_unlock(&cam->img_lock);
- return ret;
+ return 0;
}
#endif /* CONFIG_PM */
@@ -902,29 +1015,50 @@ static struct file_operations camera_core_fops = {
.open = camera_core_open,
.release = camera_core_release,
};
+static ssize_t
+camera_streaming_show(struct device *dev, struct device_attribute *attr,
+ char *buf)
+{
+ struct camera_device *cam = dev_get_drvdata(dev);
-static int __init camera_core_probe(struct platform_device *pdev)
+ return sprintf(buf, "%s\n", cam->streaming ? "active" : "inactive");
+}
+
+static DEVICE_ATTR(streaming, S_IRUGO, camera_streaming_show, NULL);
+
+static void camera_device_unregister(struct v4l2_int_device *ctl)
{
- struct camera_device *cam;
+ struct camera_device *cam = ctl->priv;
+
+ camera_sensor_exit(cam);
+}
+
+static int camera_device_register(struct v4l2_int_device *ctl,
+ struct v4l2_int_device *s)
+{
+ struct camera_device *cam = ctl->priv;
struct video_device *vfd;
- int status;
+ int rval;
+ /*Initialise the pointer to the sensor interface and camera interface */
- cam = kzalloc(sizeof(struct camera_device), GFP_KERNEL);
- if (!cam) {
- dev_err(&cam->dev, "could not allocate memory\n");
- status = -ENOMEM;
- goto err0;
- }
+ /* We already have a slave. */
+ if (cam->sdev)
+ return -EBUSY;
- /* Save the pointer to camera device in a global variable */
- camera_dev = cam;
+ cam->sdev = s;
+
+ if (device_create_file(cam->dev, &dev_attr_streaming) != 0) {
+ dev_err(cam->dev, "could not register sysfs entry\n");
+ rval = -EBUSY;
+ goto err;
+ }
/* initialize the video_device struct */
vfd = cam->vfd = video_device_alloc();
if (!vfd) {
- dev_err(&cam->dev, " could not allocate video device struct\n");
- status = -ENOMEM;
- goto err1;
+ dev_err(cam->dev, " could not allocate video device struct\n");
+ rval = -ENOMEM;
+ goto err;
}
vfd->release = video_device_release;
@@ -959,6 +1093,74 @@ static int __init camera_core_probe(struct platform_device *pdev)
vfd->vidioc_s_fbuf = vidioc_s_fbuf;
vfd->vidioc_overlay = vidioc_overlay;
+
+ dev_info(cam->dev, "%s interface with %s sensor\n",
+ cam->cam_hardware->name, cam->sdev->name);
+
+ if (video_register_device(vfd, VFL_TYPE_GRABBER, video_nr) < 0) {
+ dev_err(cam->dev, "could not register Video for Linux device\n");
+ rval = -ENODEV;
+ goto err;
+ }
+
+
+ rval = camera_sensor_init(cam);
+ if (rval)
+ goto err;
+
+ /* Disable the Camera after detection */
+ cam->cam_hardware->disable(cam->hardware_data);
+
+ return 0;
+
+err:
+ camera_device_unregister(ctl);
+
+ return rval;
+}
+
+static struct v4l2_int_master camera_master = {
+ .attach = camera_device_register,
+ .detach = camera_device_unregister,
+};
+
+static struct v4l2_int_device camera = {
+ .module = THIS_MODULE,
+ .name = CAM_NAME,
+ .type = v4l2_int_type_master,
+ .u = {
+ .master = &camera_master
+ },
+};
+
+static int __init camera_core_probe(struct platform_device *pdev)
+{
+ struct camera_device *cam;
+ int status = 0;
+
+ cam = kzalloc(sizeof(struct camera_device), GFP_KERNEL);
+ if (!cam) {
+ dev_err(&pdev->dev, "could not allocate memory\n");
+ status = -ENOMEM;
+ goto err;
+ }
+
+ platform_set_drvdata(pdev, cam);
+
+ cam->dev = &pdev->dev;
+
+ /* initialize the camera interface */
+ cam->cam_hardware = &camera_hardware_if;
+ cam->hardware_data = cam->cam_hardware->init();
+ if (!cam->hardware_data) {
+ dev_err(cam->dev, "cannot initialize interface hardware\n");
+ status = -ENODEV;
+ goto err;
+ }
+
+ /* Save the pointer to camera device in a global variable */
+ camera_dev = cam;
+
/* initialize the videobuf queue ops */
cam->vbq_ops.buf_setup = camera_core_vbq_setup;
cam->vbq_ops.buf_prepare = camera_core_vbq_prepare;
@@ -973,102 +1175,38 @@ static int __init camera_core_probe(struct platform_device *pdev)
(dma_addr_t *) &cam->overlay_base_phys,
GFP_KERNEL | GFP_DMA);
if (!cam->overlay_base) {
- dev_err(&cam->dev, "cannot allocate overlay framebuffer\n");
+ dev_err(cam->dev, "cannot allocate overlay framebuffer\n");
status = -ENOMEM;
- goto err2;
+ goto err;
}
}
memset((void*)cam->overlay_base, 0, cam->overlay_size);
spin_lock_init(&cam->overlay_lock);
spin_lock_init(&cam->capture_lock);
- /*Initialise the pointer to the sensor interface and camera interface */
- cam->cam_sensor = &camera_sensor_if;
- cam->cam_hardware = &camera_hardware_if;
-
- /* initialize the camera interface */
- cam->hardware_data = cam->cam_hardware->init();
- if (!cam->hardware_data) {
- dev_err(&cam->dev, "cannot initialize interface hardware\n");
- status = -ENODEV;
- goto err3;
- }
-
/* initialize the spinlock used to serialize access to the image
* parameters
*/
spin_lock_init(&cam->img_lock);
- /* initialize the streaming capture parameters */
- cam->cparm.capability = V4L2_CAP_TIMEPERFRAME;
- cam->cparm.readbuffers = 1;
-
- /* Enable the xclk output. The sensor may (and does, in the case of
- * the OV9640) require an xclk input in order for its initialization
- * routine to work.
- */
- cam->xclk = 21000000; /* choose an arbitrary xclk frequency */
- cam->xclk = cam->cam_hardware->set_xclk(cam->xclk, cam->hardware_data);
-
- /* initialize the sensor and define a default capture format cam->pix */
- cam->sensor_data = cam->cam_sensor->init(&cam->pix);
- if (!cam->sensor_data) {
- cam->cam_hardware->disable(cam->hardware_data);
- dev_err(&cam->dev, "cannot initialize sensor\n");
- status = -ENODEV;
- goto err4;
- }
-
- dev_info(&cam->dev, "%s interface with %s sensor\n",
- cam->cam_hardware->name, cam->cam_sensor->name);
-
- /* select an arbitrary default capture frame rate of 15fps */
- cam->nominal_timeperframe.numerator = 1;
- cam->nominal_timeperframe.denominator = 15;
-
- /* calculate xclk based on the default capture format and default
- * frame rate
- */
- cam->xclk = cam->cam_sensor->calc_xclk(&cam->pix,
- &cam->nominal_timeperframe, cam->sensor_data);
- cam->cparm.timeperframe = cam->nominal_timeperframe;
-
/* initialise the wait queue */
init_waitqueue_head(&cam->new_video_frame);
/* Initialise the DMA structures */
camera_core_sgdma_init(cam);
- /* Disable the Camera after detection */
- cam->cam_hardware->disable(cam->hardware_data);
-
platform_set_drvdata(pdev, cam);
- if (video_register_device(vfd, VFL_TYPE_GRABBER, video_nr) < 0) {
- dev_err(&cam->dev, "could not register Video for Linux device\n");
- status = -ENODEV;
- goto err5;
- }
+ camera.priv = cam;
- dev_info(&cam->dev, "registered device video%d [v4l2]\n", vfd->minor);
+ if (v4l2_int_device_register(&camera))
+ goto err;
return 0;
- err5:
- cam->cam_sensor->cleanup(cam->sensor_data);
- err4:
- cam->cam_hardware->cleanup(cam->hardware_data);
- err3:
- dma_free_coherent(NULL, cam->overlay_size,
- (void *)cam->overlay_base,
- cam->overlay_base_phys);
+ err:
+ vidioc_int_dev_exit(cam->sdev);
cam->overlay_base = 0;
- err2:
- video_device_release(vfd);
- err1:
- kfree(cam);
- camera_dev = NULL;
- err0:
return status;
}
@@ -1100,7 +1238,7 @@ static int camera_core_remove(struct platform_device *pdev)
}
cam->overlay_base_phys = 0;
- cam->cam_sensor->cleanup(cam->sensor_data);
+ vidioc_int_dev_exit(cam->sdev);
cam->cam_hardware->cleanup(cam->hardware_data);
kfree(cam);
camera_dev = NULL;
diff --git a/drivers/media/video/omap/camera_core.h b/drivers/media/video/omap/camera_core.h
index a300d67..e156cc3 100644
--- a/drivers/media/video/omap/camera_core.h
+++ b/drivers/media/video/omap/camera_core.h
@@ -19,6 +19,7 @@ struct camera_fh;
#include <media/video-buf.h>
#include <asm/scatterlist.h>
+#include <media/v4l2-int-device.h>
struct camera_device;
typedef void (*dma_callback_t)(void *arg1, void *arg2);
@@ -39,7 +40,7 @@ struct sgdma_state {
/* per-device data structure */
struct camera_device {
- struct device dev;
+ struct device *dev;
struct video_device *vfd;
spinlock_t overlay_lock; /* spinlock for overlay DMA counter */
@@ -80,18 +81,18 @@ struct camera_device {
*/
struct camera_fh *previewing;
- /* capture parameters (frame rate, number of buffers) */
- struct v4l2_captureparm cparm;
-
- /* This is the frame period actually requested by the user. */
- struct v4l2_fract nominal_timeperframe;
-
- /* frequency (in Hz) of camera interface xclk output */
- unsigned long xclk;
-
+ /*
+ * Sensor interface parameters: interface type, CC_CTRL
+ * register value and interface specific data.
+ */
+ int if_type;
+ union {
+ struct parallel {
+ u32 xclk;
+ } bt656;
+ } if_u;
/* Pointer to the sensor interface ops */
- struct omap_camera_sensor *cam_sensor;
- void *sensor_data;
+ struct v4l2_int_device *sdev;
/* Pointer to the camera interface hardware ops */
struct camera_hardware *cam_hardware;
@@ -104,7 +105,6 @@ struct camera_device {
* VIDIOC_S_FMT/VIDIOC_G_FMT ioctls with a CAPTURE buffer type.
*/
struct v4l2_pix_format pix;
- struct v4l2_pix_format pix2;
/* crop defines the size and offset of the video overlay source window
* within the framebuffer. These parameters are set/queried by the
--
1.5.3.4.206.g58ba4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 5/6] OMAP1: CAMERA: Changed camera_core.c to the coding style standard
2007-10-09 12:52 ` [PATCH 4/6] OMAP1: CAMERA: Convert camera_core.c to use v4l2-int-device API Eduardo Valentin
@ 2007-10-09 12:52 ` Eduardo Valentin
2007-10-09 12:52 ` [PATCH 6/6] OMAP1: CAMERA: Remove unecessary files from Makefile and Kconfig Eduardo Valentin
0 siblings, 1 reply; 13+ messages in thread
From: Eduardo Valentin @ 2007-10-09 12:52 UTC (permalink / raw)
To: linux-omap-mailing-list; +Cc: Eduardo Valentin
From: Eduardo Valentin <eduardo.valentin@indt.org.br>
- Executed Lindent on camera_core.c
- Removed extra blank spaces
- Lines with more than 80 columns were broken
Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
---
drivers/media/video/omap/camera_core.c | 403 +++++++++++++++-----------------
1 files changed, 191 insertions(+), 212 deletions(-)
diff --git a/drivers/media/video/omap/camera_core.c b/drivers/media/video/omap/camera_core.c
index 217a79f..1d47212 100644
--- a/drivers/media/video/omap/camera_core.c
+++ b/drivers/media/video/omap/camera_core.c
@@ -40,24 +40,22 @@
static struct camera_device *camera_dev;
static void camera_core_sgdma_process(struct camera_device *cam);
-/* module parameters */
-static int video_nr = -1; /* video device minor (-1 ==> auto assign) */
+/* Module parameters */
+static int video_nr = -1; /* Video device minor (-1 ==> auto assign) */
/* Maximum amount of memory to use for capture buffers.
* Default is 4800KB, enough to double-buffer SXGA.
*/
-static int capture_mem = 1280*960*2*2;
+static int capture_mem = 1280 * 960 * 2 * 2;
-/*Size of video overlay framebuffer. This determines the maximum image size
- *that can be previewed. Default is 600KB, enough for sxga.
+/* Size of video overlay framebuffer. This determines the maximum image size
+ * that can be previewed. Default is 600KB, enough for sxga.
*/
-static int overlay_mem = 640*480*2;
+static int overlay_mem = 640 * 480 * 2;
-
-/*
- * Enable the external sensor interface. Try to negotiate interface
+/* Enable the external sensor interface. Try to negotiate interface
* parameters with the sensor and start using the new ones. The calls
- * to sensor_if_enable and sensor_if_disable need not to be balanced.
+ * to sensor_if_enable and sensor_if_disable do not need to be balanced.
*/
static int camera_sensor_if_enable(struct camera_device *cam)
{
@@ -75,8 +73,8 @@ static int camera_sensor_if_enable(struct camera_device *cam)
switch (p.if_type) {
case V4L2_IF_TYPE_BT656:
cam->if_u.bt656.xclk =
- cam->cam_hardware->set_xclk(cam->if_u.bt656.xclk,
- cam->hardware_data);
+ cam->cam_hardware->set_xclk(cam->if_u.bt656.xclk,
+ cam->hardware_data);
break;
default:
/* FIXME: how about other interfaces? */
@@ -96,9 +94,7 @@ static void camera_sensor_if_disable(const struct camera_device *cam)
}
}
-/*
- * Initialise the sensor hardware.
- */
+/* Initialize the sensor hardware. */
static int camera_sensor_init(struct camera_device *cam)
{
int err = 0;
@@ -109,7 +105,8 @@ static int camera_sensor_init(struct camera_device *cam)
* routine to work.
*/
- cam->if_u.bt656.xclk = 21000000;/* choose an arbitrary xclk frequency */
+ /* Choose an arbitrary xclk frequency */
+ cam->if_u.bt656.xclk = 21000000;
cam->if_u.bt656.xclk = cam->cam_hardware->set_xclk(cam->if_u.bt656.xclk,
cam->hardware_data);
@@ -117,18 +114,18 @@ static int camera_sensor_init(struct camera_device *cam)
err = camera_sensor_if_enable(cam);
if (err) {
dev_err(cam->dev, "sensor interface could not be enabled at "
- "initialisation, %d\n", err);
+ "initialization, %d\n", err);
cam->sdev = NULL;
goto out;
}
- /* power up sensor during sensor initialization */
+ /* Power up sensor during sensor initialization */
vidioc_int_s_power(sdev, 1);
err = vidioc_int_dev_init(sdev);
if (err) {
dev_err(cam->dev, "cannot initialize sensor, error %d\n", err);
- /* Sensor init failed --- it's nonexistent to us! */
+ /* Sensor initialization failed --- it's nonexistent to us! */
cam->sdev = NULL;
goto out;
}
@@ -149,10 +146,10 @@ static void camera_sensor_exit(struct camera_device *cam)
vidioc_int_dev_exit(cam->sdev);
}
-/* DMA completion routine for the scatter-gather DMA fragments. */
-/* This function is called when a scatter DMA fragment is completed */
-static void
-camera_core_callback_sgdma(void *arg1, void *arg2)
+/* DMA completion routine for the scatter-gather DMA fragments.
+ * This function is called when a scatter DMA fragment is completed
+ */
+static void camera_core_callback_sgdma(void *arg1, void *arg2)
{
struct camera_device *cam = (struct camera_device *)arg1;
int sgslot = (int)arg2;
@@ -167,16 +164,17 @@ camera_core_callback_sgdma(void *arg1, void *arg2)
return;
}
if (!--sgdma->queued_sglist) {
- /* queue for this sglist is empty so check whether transfer
- ** of the frame has been completed */
+ /* Queue for this sglist is empty so check whether transfer
+ * of the frame has been completed
+ */
if (sgdma->next_sglist == sgdma->sglen) {
dma_callback_t callback = sgdma->callback;
void *arg = sgdma->arg;
- /* all done with this sglist */
+ /* All done with this sglist */
cam->free_sgdma++;
if (callback) {
spin_unlock(&cam->sg_lock);
- (*callback)(cam, arg);
+ (*callback) (cam, arg);
camera_core_sgdma_process(cam);
return;
}
@@ -188,8 +186,7 @@ camera_core_callback_sgdma(void *arg1, void *arg2)
return;
}
-static void
-camera_core_sgdma_init(struct camera_device *cam)
+static void camera_core_sgdma_init(struct camera_device *cam)
{
int sg;
@@ -209,12 +206,10 @@ camera_core_sgdma_init(struct camera_device *cam)
}
}
-/*
- * Process the scatter-gather DMA queue by starting queued transfers
- * This function is called to program the dma to start the transfer of an image.
+/* Process the scatter-gather DMA queue by starting queued transfers
+ * This function is called to program the DMA to start the transfer of an image.
*/
-static void
-camera_core_sgdma_process(struct camera_device *cam)
+static void camera_core_sgdma_process(struct camera_device *cam)
{
unsigned long irqflags;
int queued_sgdma, sgslot;
@@ -235,18 +230,20 @@ camera_core_sgdma_process(struct camera_device *cam)
sgdma = cam->sgdma + sgslot;
while (sgdma->next_sglist < sgdma->sglen) {
sglist = sgdma->sglist + sgdma->next_sglist;
- if (cam->cam_hardware->start_dma(sgdma, camera_core_callback_sgdma,
- (void *)cam, (void *)sgslot, cam->hardware_data)) {
- /* dma start failed */
- cam->in_use = 0;
- return;
+ if (cam->cam_hardware->
+ start_dma(sgdma, camera_core_callback_sgdma,
+ (void *)cam, (void *)sgslot,
+ cam->hardware_data)) {
+ /* DMA start failed */
+ cam->in_use = 0;
+ return;
} else {
- /* dma start successful */
- sgdma->next_sglist ++;
- sgdma->queued_sglist ++;
+ /* DMA start successful */
+ sgdma->next_sglist++;
+ sgdma->queued_sglist++;
}
}
- queued_sgdma-- ;
+ queued_sgdma--;
sgslot = (sgslot + 1) % (NUM_SG_DMA);
}
@@ -257,10 +254,10 @@ camera_core_sgdma_process(struct camera_device *cam)
* Returns zero if the transfer was successfully queued, or
* non-zero if all of the scatter-gather slots are already in use.
*/
-static int
-camera_core_sgdma_queue(struct camera_device *cam,
- const struct scatterlist *sglist, int sglen, dma_callback_t callback,
- void *arg)
+static int camera_core_sgdma_queue(struct camera_device *cam,
+ const struct scatterlist *sglist,
+ int sglen, dma_callback_t callback,
+ void *arg)
{
unsigned long irqflags;
struct sgdma_state *sgdma;
@@ -295,21 +292,19 @@ camera_core_sgdma_queue(struct camera_device *cam,
return 0;
}
-
-/* -------------------overlay routines ------------------------------*/
-/* callback routine for overlay DMA completion. We just start another DMA
+/* -------------------overlay routines ------------------------------
+ * Callback routine for overlay DMA completion. We just start another DMA
* transfer unless overlay has been turned off
*/
-
-static void
-camera_core_overlay_callback(void *arg1, void *arg)
+static void camera_core_overlay_callback(void *arg1, void *arg)
{
struct camera_device *cam = (struct camera_device *)arg1;
int err;
unsigned long irqflags;
int i, j;
int count, index;
- unsigned char *fb_buf = phys_to_virt((unsigned long)camera_dev->fbuf.base);
+ unsigned char *fb_buf =
+ phys_to_virt((unsigned long)camera_dev->fbuf.base);
spin_lock_irqsave(&cam->overlay_lock, irqflags);
@@ -324,12 +319,13 @@ camera_core_overlay_callback(void *arg1, void *arg)
count = 0;
j = ((cam->pix.width - 1) * cam->fbuf.fmt.bytesperline);
- for (i = 0 ; i < cam->pix.sizeimage; i += cam->pix.bytesperline) {
+ for (i = 0; i < cam->pix.sizeimage; i += cam->pix.bytesperline) {
for (index = 0; index < cam->pix.bytesperline; index++) {
- fb_buf[j] = *(((unsigned char *) cam->overlay_base) +
- i + index);
+ fb_buf[j] = *(((unsigned char *)cam->overlay_base) +
+ i + index);
index++;
- fb_buf[j + 1] = *(((unsigned char *) cam->overlay_base) + i + index);
+ fb_buf[j + 1] =
+ *(((unsigned char *)cam->overlay_base) + i + index);
j = j - cam->fbuf.fmt.bytesperline;
}
count += 2;
@@ -338,7 +334,8 @@ camera_core_overlay_callback(void *arg1, void *arg)
while (cam->overlay_cnt < 2) {
err = camera_core_sgdma_queue(cam, &cam->overlay_sglist, 1,
- camera_core_overlay_callback, NULL);
+ camera_core_overlay_callback,
+ NULL);
if (err)
break;
++cam->overlay_cnt;
@@ -348,9 +345,7 @@ camera_core_overlay_callback(void *arg1, void *arg)
}
-
-static void
-camera_core_start_overlay(struct camera_device *cam)
+static void camera_core_start_overlay(struct camera_device *cam)
{
int err;
unsigned long irqflags;
@@ -361,10 +356,11 @@ camera_core_start_overlay(struct camera_device *cam)
spin_lock_irqsave(&cam->overlay_lock, irqflags);
sg_dma_address(&cam->overlay_sglist) = cam->overlay_base_phys;
- sg_dma_len(&cam->overlay_sglist)= cam->pix.sizeimage;
+ sg_dma_len(&cam->overlay_sglist) = cam->pix.sizeimage;
while (cam->overlay_cnt < 2) {
err = camera_core_sgdma_queue(cam, &cam->overlay_sglist, 1,
- camera_core_overlay_callback, NULL);
+ camera_core_overlay_callback,
+ NULL);
if (err)
break;
++cam->overlay_cnt;
@@ -373,13 +369,11 @@ camera_core_start_overlay(struct camera_device *cam)
spin_unlock_irqrestore(&cam->overlay_lock, irqflags);
}
-/* ------------------ videobuf_queue_ops --------------------------------*/
-
-/* This routine is called from interrupt context when a scatter-gather DMA
+/* ------------------ videobuf_queue_ops --------------------------------
+ * This routine is called from interrupt context when a scatter-gather DMA
* transfer of a videobuf_buffer completes.
*/
-static void
-camera_core_vbq_complete(void *arg1, void *arg)
+static void camera_core_vbq_complete(void *arg1, void *arg)
{
struct camera_device *cam = (struct camera_device *)arg1;
struct videobuf_buffer *vb = (struct videobuf_buffer *)arg;
@@ -396,8 +390,8 @@ camera_core_vbq_complete(void *arg1, void *arg)
spin_unlock(&cam->vbq_lock);
}
-static void
-camera_core_vbq_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
+static void camera_core_vbq_release(struct videobuf_queue *q,
+ struct videobuf_buffer *vb)
{
videobuf_waiton(vb, 0, 0);
videobuf_dma_unmap(q, &vb->dma);
@@ -410,14 +404,14 @@ camera_core_vbq_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
* number requested, the currently selected image size, and the maximum
* amount of memory permitted for kernel capture buffers.
*/
-static int
-camera_core_vbq_setup(struct videobuf_queue *q, unsigned int *cnt, unsigned int *size)
+static int camera_core_vbq_setup(struct videobuf_queue *q, unsigned int *cnt,
+ unsigned int *size)
{
struct camera_fh *fh = q->priv_data;
struct camera_device *cam = fh->cam;
if (*cnt <= 0)
- *cnt = VIDEO_MAX_FRAME; /* supply a default number of buffers */
+ *cnt = VIDEO_MAX_FRAME; /* Supply a default number of buffers */
if (*cnt > VIDEO_MAX_FRAME)
*cnt = VIDEO_MAX_FRAME;
@@ -432,9 +426,9 @@ camera_core_vbq_setup(struct videobuf_queue *q, unsigned int *cnt, unsigned int
return 0;
}
-static int
-camera_core_vbq_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
- enum v4l2_field field)
+static int camera_core_vbq_prepare(struct videobuf_queue *q,
+ struct videobuf_buffer *vb,
+ enum v4l2_field field)
{
struct camera_fh *fh = q->priv_data;
struct camera_device *cam = fh->cam;
@@ -457,13 +451,13 @@ camera_core_vbq_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
if (!err)
vb->state = STATE_PREPARED;
else
- camera_core_vbq_release (q, vb);
+ camera_core_vbq_release(q, vb);
return err;
}
-static void
-camera_core_vbq_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
+static void camera_core_vbq_queue(struct videobuf_queue *q,
+ struct videobuf_buffer *vb)
{
struct camera_fh *fh = q->priv_data;
struct camera_device *cam = fh->cam;
@@ -472,25 +466,20 @@ camera_core_vbq_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
vb->state = STATE_QUEUED;
err = camera_core_sgdma_queue(cam, vb->dma.sglist, vb->dma.sglen,
- camera_core_vbq_complete, vb);
+ camera_core_vbq_complete, vb);
if (err) {
/* Oops. We're not supposed to get any errors here. The only
- * way we could get an error is if we ran out of scatter-gather
- * DMA slots, but we are supposed to have at least as many
- * scatter-gather DMA slots as video buffers so that can't
- * happen.
- */
+ * way we could get an error is if we ran out of scatter-gather
+ * DMA slots, but we are supposed to have at least as many
+ * scatter-gather DMA slots as video buffers so that can't
+ * happen.
+ */
dev_dbg(cam->dev, "Failed to queue a video buffer for SGDMA\n");
vb->state = state;
}
}
-
-/*
- *
- * IOCTL interface.
- *
- */
+/* IOCTL interface. */
static int vidioc_querycap(struct file *file, void *fh,
struct v4l2_capability *cap)
{
@@ -501,10 +490,8 @@ static int vidioc_querycap(struct file *file, void *fh,
strlcpy(cap->card, cam->vfd->name, sizeof(cap->card));
cap->version = OMAP1CAM_VERSION;
cap->capabilities =
- V4L2_CAP_VIDEO_CAPTURE |
- V4L2_CAP_VIDEO_OVERLAY |
- V4L2_CAP_READWRITE |
- V4L2_CAP_STREAMING;
+ V4L2_CAP_VIDEO_CAPTURE |
+ V4L2_CAP_VIDEO_OVERLAY | V4L2_CAP_READWRITE | V4L2_CAP_STREAMING;
return 0;
}
@@ -512,27 +499,25 @@ static int vidioc_querycap(struct file *file, void *fh,
static int vidioc_enum_fmt_cap(struct file *file, void *fh,
struct v4l2_fmtdesc *f)
{
- struct camera_fh *ofh = fh;
+ struct camera_fh *ofh = fh;
struct camera_device *cam = ofh->cam;
return vidioc_int_enum_fmt_cap(cam->sdev, f);
}
-static int vidioc_g_fmt_cap(struct file *file, void *fh,
- struct v4l2_format *f)
+static int vidioc_g_fmt_cap(struct file *file, void *fh, struct v4l2_format *f)
{
- struct camera_fh *ofh = fh;
+ struct camera_fh *ofh = fh;
struct camera_device *cam = ofh->cam;
- /* get the current format */
+ /* Get the current format */
memset(&f->fmt.pix, 0, sizeof(f->fmt.pix));
f->fmt.pix = cam->pix;
return 0;
}
-static int vidioc_s_fmt_cap(struct file *file, void *fh,
- struct v4l2_format *f)
+static int vidioc_s_fmt_cap(struct file *file, void *fh, struct v4l2_format *f)
{
struct camera_fh *ofh = fh;
struct camera_device *cam = ofh->cam;
@@ -565,8 +550,7 @@ static int vidioc_reqbufs(struct file *file, void *fh,
return videobuf_reqbufs(&ofh->vbq, b);
}
-static int vidioc_querybuf(struct file *file, void *fh,
- struct v4l2_buffer *b)
+static int vidioc_querybuf(struct file *file, void *fh, struct v4l2_buffer *b)
{
struct camera_fh *ofh = fh;
@@ -599,8 +583,7 @@ static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i)
return -EBUSY;
} else
cam->streaming = ofh;
- /* FIXME: start camera interface */
-
+ /* FIXME: start camera interface */
spin_unlock(&cam->img_lock);
@@ -620,7 +603,7 @@ static int vidioc_streamoff(struct file *file, void *fh, enum v4l2_buf_type i)
spin_lock(&cam->img_lock);
if (cam->streaming == ofh)
cam->streaming = NULL;
- /* FIXME: stop camera interface */
+ /* FIXME: stop camera interface */
spin_unlock(&cam->img_lock);
return 0;
@@ -662,8 +645,7 @@ static int vidioc_queryctrl(struct file *file, void *fh,
return vidioc_int_queryctrl(cam->sdev, a);
}
-static int vidioc_g_ctrl(struct file *file, void *fh,
- struct v4l2_control *a)
+static int vidioc_g_ctrl(struct file *file, void *fh, struct v4l2_control *a)
{
struct camera_fh *ofh = fh;
struct camera_device *cam = ofh->cam;
@@ -671,8 +653,7 @@ static int vidioc_g_ctrl(struct file *file, void *fh,
return vidioc_int_g_ctrl(cam->sdev, a);
}
-static int vidioc_s_ctrl(struct file *file, void *fh,
- struct v4l2_control *a)
+static int vidioc_s_ctrl(struct file *file, void *fh, struct v4l2_control *a)
{
struct camera_fh *ofh = fh;
struct camera_device *cam = ofh->cam;
@@ -711,15 +692,13 @@ static int vidioc_s_fbuf(struct file *file, void *fh,
return 0;
}
-static int vidioc_overlay(struct file *file, void *fh,
- unsigned int i)
+static int vidioc_overlay(struct file *file, void *fh, unsigned int i)
{
struct camera_fh *ofh = fh;
struct camera_device *cam = ofh->cam;
int enable = i;
- /*
- * check whether the capture format and
+ /* Check whether the capture format and
* the display format matches
* return failure if they are different
*/
@@ -733,7 +712,7 @@ static int vidioc_overlay(struct file *file, void *fh,
(cam->pix.height > cam->fbuf.fmt.width))
return -EINVAL;
- if (!cam->previewing && enable) {
+ if (!cam->previewing && enable) {
cam->previewing = fh;
cam->overlay_cnt = 0;
camera_core_start_overlay(cam);
@@ -743,22 +722,17 @@ static int vidioc_overlay(struct file *file, void *fh,
return 0;
}
-/*
- * file operations
- */
-
-static unsigned
-int camera_core_poll(struct file *file, struct poll_table_struct *wait)
+/* File operations */
+static unsigned int camera_core_poll(struct file *file,
+ struct poll_table_struct *wait)
{
return -EINVAL;
}
-/* ------------------------------------------------------------ */
-/* callback routine for read DMA completion. We just start another DMA
+/* Callback routine for read DMA completion. We just start another DMA
* transfer unless overlay has been turned off
*/
-static void
-camera_core_capture_callback(void *arg1, void *arg)
+static void camera_core_capture_callback(void *arg1, void *arg)
{
struct camera_device *cam = (struct camera_device *)arg1;
int err;
@@ -778,33 +752,38 @@ camera_core_capture_callback(void *arg1, void *arg)
sg_dma_address(&cam->capture_sglist) = cam->capture_base_phys;
sg_dma_len(&cam->capture_sglist) = cam->pix.sizeimage;
err = camera_core_sgdma_queue(cam, &cam->capture_sglist, 1,
- camera_core_capture_callback, NULL);
+ camera_core_capture_callback,
+ NULL);
} else {
cam->capture_completed = 1;
if (cam->reading) {
/* Wake up any process which are waiting for the
- ** DMA to complete */
+ * DMA to complete
+ */
wake_up_interruptible(&camera_dev->new_video_frame);
- sg_dma_address(&cam->capture_sglist) = cam->capture_base_phys;
+ sg_dma_address(&cam->capture_sglist) =
+ cam->capture_base_phys;
sg_dma_len(&cam->capture_sglist) = cam->pix.sizeimage;
- err = camera_core_sgdma_queue(cam, &cam->capture_sglist, 1,
- camera_core_capture_callback, NULL);
+ err =
+ camera_core_sgdma_queue(cam, &cam->capture_sglist,
+ 1,
+ camera_core_capture_callback,
+ NULL);
}
}
spin_unlock_irqrestore(&cam->capture_lock, irqflags);
}
-
-static ssize_t
-camera_core_read(struct file *file, char *data, size_t count, loff_t *ppos)
+static ssize_t camera_core_read(struct file *file, char *data, size_t count,
+ loff_t *ppos)
{
struct camera_fh *fh = file->private_data;
struct camera_device *cam = fh->cam;
int err;
unsigned long irqflags;
long timeout;
-#if 0 /* use video_buf to do capture */
+#if 0 /* Use video_buf to do capture */
int i;
for (i = 0; i < 14; i++)
videobuf_read_one(file, &fh->vbq, data, count, ppos);
@@ -813,10 +792,12 @@ camera_core_read(struct file *file, char *data, size_t count, loff_t *ppos)
#endif
if (!cam->capture_base) {
- cam->capture_base = (unsigned long)dma_alloc_coherent(NULL,
- cam->pix.sizeimage,
- (dma_addr_t *) &cam->capture_base_phys,
- GFP_KERNEL | GFP_DMA);
+ cam->capture_base = (unsigned long)
+ dma_alloc_coherent(NULL,
+ cam->pix.sizeimage,
+ (dma_addr_t *) &
+ cam->capture_base_phys,
+ GFP_KERNEL | GFP_DMA);
}
if (!cam->capture_base) {
dev_err(cam->dev, "cannot allocate capture buffer\n");
@@ -827,39 +808,37 @@ camera_core_read(struct file *file, char *data, size_t count, loff_t *ppos)
cam->reading = fh;
cam->capture_started = 1;
sg_dma_address(&cam->capture_sglist) = cam->capture_base_phys;
- sg_dma_len(&cam->capture_sglist)= cam->pix.sizeimage;
+ sg_dma_len(&cam->capture_sglist) = cam->pix.sizeimage;
spin_unlock_irqrestore(&cam->capture_lock, irqflags);
err = camera_core_sgdma_queue(cam, &cam->capture_sglist, 1,
- camera_core_capture_callback, NULL);
+ camera_core_capture_callback, NULL);
/* Wait till DMA is completed */
timeout = HZ * 10;
cam->capture_completed = 0;
while (cam->capture_completed == 0) {
timeout = interruptible_sleep_on_timeout
- (&cam->new_video_frame, timeout);
+ (&cam->new_video_frame, timeout);
if (timeout == 0) {
dev_err(cam->dev, "timeout waiting video frame\n");
- return -EIO; /* time out */
+ return -EIO; /* Time out */
}
}
- /* copy the data to the user buffer */
+ /* Copy the data to the user buffer */
err = copy_to_user(data, (void *)cam->capture_base, cam->pix.sizeimage);
return (cam->pix.sizeimage - err);
}
-static int
-camera_core_mmap(struct file *file, struct vm_area_struct *vma)
+static int camera_core_mmap(struct file *file, struct vm_area_struct *vma)
{
struct camera_fh *fh = file->private_data;
return videobuf_mmap_mapper(&fh->vbq, vma);
}
-static int
-camera_core_release(struct inode *inode, struct file *file)
+static int camera_core_release(struct inode *inode, struct file *file)
{
struct camera_fh *fh = file->private_data;
struct camera_device *cam = fh->cam;
@@ -882,8 +861,8 @@ camera_core_release(struct inode *inode, struct file *file)
if (cam->capture_base) {
dma_free_coherent(NULL, cam->pix.sizeimage,
- (void *)cam->capture_base,
- cam->capture_base_phys);
+ (void *)cam->capture_base,
+ cam->capture_base_phys);
cam->capture_base = 0;
cam->capture_base_phys = 0;
}
@@ -899,8 +878,7 @@ camera_core_release(struct inode *inode, struct file *file)
return 0;
}
-static int
-camera_core_open(struct inode *inode, struct file *file)
+static int camera_core_open(struct inode *inode, struct file *file)
{
int minor = iminor(inode);
struct camera_device *cam = camera_dev;
@@ -911,7 +889,7 @@ camera_core_open(struct inode *inode, struct file *file)
if (!cam || !cam->vfd || (cam->vfd->minor != minor))
return -ENODEV;
- /* allocate per-filehandle data */
+ /* Allocate per-filehandle data */
fh = kmalloc(sizeof(*fh), GFP_KERNEL);
if (NULL == fh)
return -ENOMEM;
@@ -938,7 +916,8 @@ camera_core_open(struct inode *inode, struct file *file)
spin_unlock(&cam->img_lock);
videobuf_queue_init(&fh->vbq, &cam->vbq_ops, NULL, &cam->vbq_lock,
- fh->type, V4L2_FIELD_NONE, sizeof(struct videobuf_buffer), fh);
+ fh->type, V4L2_FIELD_NONE,
+ sizeof(struct videobuf_buffer), fh);
cam->capture_completed = 0;
cam->capture_started = 0;
@@ -951,7 +930,8 @@ camera_core_open(struct inode *inode, struct file *file)
}
rval = vidioc_s_fmt_cap(file, fh, &format);
if (rval) {
- dev_err(cam->dev, "Camera sensor configuration failed (%d)\n", rval);
+ dev_err(cam->dev, "Camera sensor configuration failed (%d)\n",
+ rval);
cam->cam_hardware->close(cam->hardware_data);
cam->active = 0;
rval = -ENODEV;
@@ -1003,25 +983,24 @@ static int camera_core_resume(struct platform_device *pdev)
return 0;
}
-#endif /* CONFIG_PM */
+#endif /* CONFIG_PM */
static struct file_operations camera_core_fops = {
- .owner = THIS_MODULE,
- .llseek = no_llseek,
- .read = camera_core_read,
- .poll = camera_core_poll,
- .ioctl = video_ioctl2,
- .mmap = camera_core_mmap,
- .open = camera_core_open,
- .release = camera_core_release,
+ .owner = THIS_MODULE,
+ .llseek = no_llseek,
+ .read = camera_core_read,
+ .poll = camera_core_poll,
+ .ioctl = video_ioctl2,
+ .mmap = camera_core_mmap,
+ .open = camera_core_open,
+ .release = camera_core_release,
};
-static ssize_t
-camera_streaming_show(struct device *dev, struct device_attribute *attr,
- char *buf)
+static ssize_t camera_streaming_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
struct camera_device *cam = dev_get_drvdata(dev);
- return sprintf(buf, "%s\n", cam->streaming ? "active" : "inactive");
+ return sprintf(buf, "%s\n", cam->streaming ? "active" : "inactive");
}
static DEVICE_ATTR(streaming, S_IRUGO, camera_streaming_show, NULL);
@@ -1034,12 +1013,11 @@ static void camera_device_unregister(struct v4l2_int_device *ctl)
}
static int camera_device_register(struct v4l2_int_device *ctl,
- struct v4l2_int_device *s)
+ struct v4l2_int_device *s)
{
struct camera_device *cam = ctl->priv;
struct video_device *vfd;
int rval;
- /*Initialise the pointer to the sensor interface and camera interface */
/* We already have a slave. */
if (cam->sdev)
@@ -1053,7 +1031,7 @@ static int camera_device_register(struct v4l2_int_device *ctl,
goto err;
}
- /* initialize the video_device struct */
+ /* Initialize the video_device struct */
vfd = cam->vfd = video_device_alloc();
if (!vfd) {
dev_err(cam->dev, " could not allocate video device struct\n");
@@ -1066,7 +1044,7 @@ static int camera_device_register(struct v4l2_int_device *ctl,
strlcpy(vfd->name, CAM_NAME, sizeof(vfd->name));
vfd->type = VID_TYPE_CAPTURE | VID_TYPE_OVERLAY | VID_TYPE_CHROMAKEY;
- /* need to register for a VID_HARDWARE_* ID in videodev.h */
+ /* Need to register for a VID_HARDWARE_* ID in videodev.h */
vfd->hardware = 0;
vfd->fops = &camera_core_fops;
video_set_drvdata(vfd, cam);
@@ -1093,17 +1071,16 @@ static int camera_device_register(struct v4l2_int_device *ctl,
vfd->vidioc_s_fbuf = vidioc_s_fbuf;
vfd->vidioc_overlay = vidioc_overlay;
-
dev_info(cam->dev, "%s interface with %s sensor\n",
- cam->cam_hardware->name, cam->sdev->name);
+ cam->cam_hardware->name, cam->sdev->name);
if (video_register_device(vfd, VFL_TYPE_GRABBER, video_nr) < 0) {
- dev_err(cam->dev, "could not register Video for Linux device\n");
+ dev_err(cam->dev,
+ "could not register Video for Linux device\n");
rval = -ENODEV;
goto err;
}
-
rval = camera_sensor_init(cam);
if (rval)
goto err;
@@ -1136,7 +1113,7 @@ static struct v4l2_int_device camera = {
static int __init camera_core_probe(struct platform_device *pdev)
{
struct camera_device *cam;
- int status = 0;
+ int status = 0;
cam = kzalloc(sizeof(struct camera_device), GFP_KERNEL);
if (!cam) {
@@ -1149,7 +1126,7 @@ static int __init camera_core_probe(struct platform_device *pdev)
cam->dev = &pdev->dev;
- /* initialize the camera interface */
+ /* Initialize the camera interface */
cam->cam_hardware = &camera_hardware_if;
cam->hardware_data = cam->cam_hardware->init();
if (!cam->hardware_data) {
@@ -1161,38 +1138,41 @@ static int __init camera_core_probe(struct platform_device *pdev)
/* Save the pointer to camera device in a global variable */
camera_dev = cam;
- /* initialize the videobuf queue ops */
+ /* Initialize the videobuf queue ops */
cam->vbq_ops.buf_setup = camera_core_vbq_setup;
cam->vbq_ops.buf_prepare = camera_core_vbq_prepare;
cam->vbq_ops.buf_queue = camera_core_vbq_queue;
cam->vbq_ops.buf_release = camera_core_vbq_release;
- /* initilize the overlay interface */
+ /* Initialize the overlay interface */
cam->overlay_size = overlay_mem;
if (cam->overlay_size > 0) {
- cam->overlay_base = (unsigned long) dma_alloc_coherent(NULL,
- cam->overlay_size,
- (dma_addr_t *) &cam->overlay_base_phys,
- GFP_KERNEL | GFP_DMA);
+ cam->overlay_base = (unsigned long)
+ dma_alloc_coherent(NULL,
+ cam->overlay_size,
+ (dma_addr_t *) &
+ cam->overlay_base_phys,
+ GFP_KERNEL | GFP_DMA);
if (!cam->overlay_base) {
- dev_err(cam->dev, "cannot allocate overlay framebuffer\n");
+ dev_err(cam->dev,
+ "cannot allocate overlay framebuffer\n");
status = -ENOMEM;
goto err;
}
}
- memset((void*)cam->overlay_base, 0, cam->overlay_size);
+ memset((void *)cam->overlay_base, 0, cam->overlay_size);
spin_lock_init(&cam->overlay_lock);
spin_lock_init(&cam->capture_lock);
- /* initialize the spinlock used to serialize access to the image
+ /* Initialize the spinlock used to serialize access to the image
* parameters
*/
spin_lock_init(&cam->img_lock);
- /* initialise the wait queue */
+ /* Initialize the wait queue */
init_waitqueue_head(&cam->new_video_frame);
- /* Initialise the DMA structures */
+ /* Initialize the DMA structures */
camera_core_sgdma_init(cam);
platform_set_drvdata(pdev, cam);
@@ -1204,7 +1184,7 @@ static int __init camera_core_probe(struct platform_device *pdev)
return 0;
- err:
+err:
vidioc_int_dev_exit(cam->sdev);
cam->overlay_base = 0;
return status;
@@ -1219,21 +1199,21 @@ static int camera_core_remove(struct platform_device *pdev)
if (vfd) {
if (vfd->minor == -1) {
/* The device never got registered, so release the
- ** video_device struct directly
- */
+ * video_device struct directly
+ */
video_device_release(vfd);
} else {
- /* The unregister function will release the video_device
- ** struct as well as unregistering it.
- */
+ /* The unregister function will release the
+ * video_device struct as well as unregistering it.
+ */
video_unregister_device(vfd);
}
cam->vfd = NULL;
}
if (cam->overlay_base) {
dma_free_coherent(NULL, cam->overlay_size,
- (void *)cam->overlay_base,
- cam->overlay_base_phys);
+ (void *)cam->overlay_base,
+ cam->overlay_base_phys);
cam->overlay_base = 0;
}
cam->overlay_base_phys = 0;
@@ -1247,27 +1227,26 @@ static int camera_core_remove(struct platform_device *pdev)
}
static struct platform_driver camera_core_driver = {
- .driver = {
- .name = CAM_NAME,
- .owner = THIS_MODULE,
+ .driver = {
+ .name = CAM_NAME,
+ .owner = THIS_MODULE,
},
- .probe = camera_core_probe,
- .remove = camera_core_remove,
+ .probe = camera_core_probe,
+ .remove = camera_core_remove,
#ifdef CONFIG_PM
- .suspend = camera_core_suspend,
- .resume = camera_core_resume,
+ .suspend = camera_core_suspend,
+ .resume = camera_core_resume,
#endif
};
/* FIXME register omap16xx or omap24xx camera device in arch/arm/...
- * system init code, with its resources and mux setup, NOT here.
+ * system initialization code, with its resources and mux setup, NOT here.
* Then MODULE_ALIAS(CAM_NAME) so it hotplugs and coldplugs; this
* "legacy" driver style is trouble.
*/
static struct platform_device *cam;
-static void __exit
-camera_core_cleanup(void)
+static void __exit camera_core_cleanup(void)
{
platform_driver_unregister(&camera_core_driver);
platform_device_unregister(cam);
@@ -1275,8 +1254,7 @@ camera_core_cleanup(void)
static char banner[] __initdata = KERN_INFO "OMAP Camera driver initializing\n";
-static int __init
-camera_core_init(void)
+static int __init camera_core_init(void)
{
printk(banner);
@@ -1293,10 +1271,11 @@ MODULE_LICENSE("GPL");
module_param(video_nr, int, 0);
MODULE_PARM_DESC(video_nr,
- "Minor number for video device (-1 ==> auto assign)");
+ "Minor number for video device (-1 ==> auto assign)");
module_param(capture_mem, int, 0);
MODULE_PARM_DESC(capture_mem,
- "Maximum amount of memory for capture buffers (default 4800KB)");
+ "Maximum amount of memory for capture buffers "
+ "(default 4800KB)");
module_init(camera_core_init);
module_exit(camera_core_cleanup);
--
1.5.3.4.206.g58ba4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 6/6] OMAP1: CAMERA: Remove unecessary files from Makefile and Kconfig.
2007-10-09 12:52 ` [PATCH 5/6] OMAP1: CAMERA: Changed camera_core.c to the coding style standard Eduardo Valentin
@ 2007-10-09 12:52 ` Eduardo Valentin
0 siblings, 0 replies; 13+ messages in thread
From: Eduardo Valentin @ 2007-10-09 12:52 UTC (permalink / raw)
To: linux-omap-mailing-list; +Cc: Eduardo Valentin
From: Eduardo Valentin <eduardo.valentin@indt.org.br>
- Once ov9640 is implemented using v4l2-int-device API,
this patch removes unecessary files from Makefile and Kconfig.
Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
---
drivers/media/video/omap/Kconfig | 6 ------
drivers/media/video/omap/Makefile | 3 ---
2 files changed, 0 insertions(+), 9 deletions(-)
diff --git a/drivers/media/video/omap/Kconfig b/drivers/media/video/omap/Kconfig
index 809193b..0fb0686 100644
--- a/drivers/media/video/omap/Kconfig
+++ b/drivers/media/video/omap/Kconfig
@@ -4,9 +4,3 @@ config VIDEO_OMAP_CAMERA
depends on VIDEO_DEV && (ARCH_OMAP16XX || ARCH_OMAP24XX)
help
V4L2 camera driver support for OMAP1/2 based boards.
-
-config VIDEO_CAMERA_SENSOR_OV9640
- tristate "OV9640 sensor support"
- depends on VIDEO_OMAP_CAMERA
- help
- OmniVision 9640 camera sensor support
diff --git a/drivers/media/video/omap/Makefile b/drivers/media/video/omap/Makefile
index 36ae615..9b4a998 100644
--- a/drivers/media/video/omap/Makefile
+++ b/drivers/media/video/omap/Makefile
@@ -1,11 +1,8 @@
# Makefile for OMAP1/2 camera driver
obj-$(CONFIG_VIDEO_OMAP_CAMERA) += omapcamera.o
-obj-$(CONFIG_VIDEO_CAMERA_SENSOR_OV9640) += sensor_ov9640.o
objs-y$(CONFIG_ARCH_OMAP16XX) += omap16xxcam.o camera_core.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)
--
1.5.3.4.206.g58ba4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board.
2007-10-09 12:52 ` [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board Eduardo Valentin
2007-10-09 12:52 ` [PATCH 3/6] OMAP: Update gpio expander code to the corret i2c adapter id Eduardo Valentin
@ 2007-10-10 14:06 ` Eduardo Valentin
2007-10-10 14:06 ` Eduardo Valentin
2007-10-31 10:41 ` Tony Lindgren
2 siblings, 1 reply; 13+ messages in thread
From: Eduardo Valentin @ 2007-10-10 14:06 UTC (permalink / raw)
To: linux-omap-mailing-list
Hi all,
This is an update for the last patch 02/06. Thanks to the comments from David Brownell, I've optimized a small piece of code in this patch.
Thanks,
Eduardo Valentin
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board.
2007-10-10 14:06 ` [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board Eduardo Valentin
@ 2007-10-10 14:06 ` Eduardo Valentin
0 siblings, 0 replies; 13+ messages in thread
From: Eduardo Valentin @ 2007-10-10 14:06 UTC (permalink / raw)
To: linux-omap-mailing-list; +Cc: Eduardo Valentin
From: Eduardo Valentin <eduardo.valentin@indt.org.br>
This code is based on board-h4.c and drivers/media/video/omap/h3_sensor_power.c codes.
Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
---
arch/arm/mach-omap1/board-h3.c | 113 ++++++++++++++++++++++++++++++++++++++++
1 files changed, 113 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c
index df77cf5..f69802e 100644
--- a/arch/arm/mach-omap1/board-h3.c
+++ b/arch/arm/mach-omap1/board-h3.c
@@ -26,6 +26,7 @@
#include <linux/mtd/partitions.h>
#include <linux/input.h>
#include <linux/clk.h>
+#include <linux/i2c.h>
#include <linux/spi/spi.h>
#include <linux/spi/tsc2101.h>
@@ -37,6 +38,8 @@
#include <asm/mach/flash.h>
#include <asm/mach/map.h>
+#include <media/v4l2-int-device.h>
+
#include <asm/arch/gpio.h>
#include <asm/arch/gpioexpander.h>
#include <asm/arch/irqs.h>
@@ -50,6 +53,8 @@
#include <asm/arch/mcbsp.h>
#include <asm/arch/omap-alsa.h>
+#include <../drivers/media/video/ov9640.h>
+
extern int omap_gpio_init(void);
static int h3_keymap[] = {
@@ -547,6 +552,111 @@ static int nand_dev_ready(struct nand_platform_data *data)
return omap_get_gpio_datain(H3_NAND_RB_GPIO_PIN);
}
+/*
+ * Common OV9640 register initialization for all image sizes, pixel formats,
+ * and frame rates
+ */
+const static struct ov9640_reg ov9640_common[] = {
+
+ { 0x12, 0x80 }, { 0x11, 0x80 }, { 0x13, 0x88 }, /* COM7, CLKRC, COM8 */
+ { 0x01, 0x58 }, { 0x02, 0x24 }, { 0x04, 0x00 }, /* BLUE, RED, COM1 */
+ { 0x0E, 0x81 }, { 0x0F, 0x4F }, { 0x14, 0xcA }, /* COM5, COM6, COM9 */
+ { 0x16, 0x02 }, { 0x1B, 0x01 }, { 0x24, 0x70 }, /* ?, PSHFT, AEW */
+ { 0x25, 0x68 }, { 0x26, 0xD3 }, { 0x27, 0x90 }, /* AEB, VPT, BBIAS */
+ { 0x2A, 0x00 }, { 0x2B, 0x00 }, { 0x32, 0x24 }, /* EXHCH, EXHCL, HREF */
+ { 0x33, 0x02 }, { 0x37, 0x02 }, { 0x38, 0x13 }, /* CHLF, ADC, ACOM */
+ { 0x39, 0xF0 }, { 0x3A, 0x00 }, { 0x3B, 0x01 }, /* OFON, TSLB, COM11 */
+ { 0x3D, 0x90 }, { 0x3E, 0x02 }, { 0x3F, 0xF2 }, /* COM13, COM14, EDGE */
+ { 0x41, 0x02 }, { 0x42, 0xC8 }, /* COM16, COM17 */
+ { 0x43, 0xF0 }, { 0x44, 0x10 }, { 0x45, 0x6C }, /* ?, ?, ? */
+ { 0x46, 0x6C }, { 0x47, 0x44 }, { 0x48, 0x44 }, /* ?, ?, ? */
+ { 0x49, 0x03 }, { 0x59, 0x49 }, { 0x5A, 0x94 }, /* ?, ?, ? */
+ { 0x5B, 0x46 }, { 0x5C, 0x84 }, { 0x5D, 0x5C }, /* ?, ?, ? */
+ { 0x5E, 0x08 }, { 0x5F, 0x00 }, { 0x60, 0x14 }, /* ?, ?, ? */
+ { 0x61, 0xCE }, /* ? */
+ { 0x62, 0x70 }, { 0x63, 0x00 }, { 0x64, 0x04 }, /* LCC1, LCC2, LCC3 */
+ { 0x65, 0x00 }, { 0x66, 0x00 }, /* LCC4, LCC5 */
+ { 0x69, 0x00 }, { 0x6A, 0x3E }, { 0x6B, 0x3F }, /* HV, MBD, DBLV */
+ { 0x6C, 0x40 }, { 0x6D, 0x30 }, { 0x6E, 0x4B }, /* GSP1, GSP2, GSP3 */
+ { 0x6F, 0x60 }, { 0x70, 0x70 }, { 0x71, 0x70 }, /* GSP4, GSP5, GSP6 */
+ { 0x72, 0x70 }, { 0x73, 0x70 }, { 0x74, 0x60 }, /* GSP7, GSP8, GSP9 */
+ { 0x75, 0x60 }, { 0x76, 0x50 }, { 0x77, 0x48 }, /* GSP10,GSP11,GSP12 */
+ { 0x78, 0x3A }, { 0x79, 0x2E }, { 0x7A, 0x28 }, /* GSP13,GSP14,GSP15 */
+ { 0x7B, 0x22 }, { 0x7C, 0x04 }, { 0x7D, 0x07 }, /* GSP16,GST1, GST2 */
+ { 0x7E, 0x10 }, { 0x7F, 0x28 }, { 0x80, 0x36 }, /* GST3, GST4, GST5 */
+ { 0x81, 0x44 }, { 0x82, 0x52 }, { 0x83, 0x60 }, /* GST6, GST7, GST8 */
+ { 0x84, 0x6C }, { 0x85, 0x78 }, { 0x86, 0x8C }, /* GST9, GST10,GST11 */
+ { 0x87, 0x9E }, { 0x88, 0xBB }, { 0x89, 0xD2 }, /* GST12,GST13,GST14 */
+ { 0x8A, 0xE6 }, { 0x13, 0xaF }, { 0x15, 0x02 }, /* GST15, COM8 */
+ { 0x22, 0x8a }, /* GROS */
+ { OV9640_REG_TERM, OV9640_VAL_TERM }
+};
+
+#if defined(CONFIG_VIDEO_OV9640) || defined(CONFIG_VIDEO_OV9640_MODULE)
+static int ov9640_sensor_power_set(int power)
+{
+ unsigned char expa;
+ int err;
+
+ /* read current state of GPIO EXPA outputs */
+ err = read_gpio_expa(&expa, 0x27);
+ if (err) {
+ printk(KERN_ERR "Error reading GPIO EXPA\n");
+ return err;
+ }
+ /* Clear GPIO EXPA P3 (CAMERA_MODULE_EN) to power-up/down sensor */
+ if (power)
+ expa |= 0x08;
+ else
+ expa &= ~0x08;
+
+ err = write_gpio_expa(expa, 0x27);
+ if (err) {
+ printk(KERN_ERR "Error writing to GPIO EXPA\n");
+ return err;
+ }
+
+ return err;
+}
+
+static struct v4l2_ifparm ifparm = {
+ .if_type = V4L2_IF_TYPE_BT656,
+ .u = {
+ .bt656 = {
+ .frame_start_on_rising_vs = 1,
+ .nobt_vs_inv = 1,
+ .mode = V4L2_IF_TYPE_BT656_MODE_NOBT_8BIT,
+ .clock_min = OV9640_XCLK_MIN,
+ .clock_max = OV9640_XCLK_MAX,
+ },
+ },
+};
+
+static int ov9640_ifparm(struct v4l2_ifparm *p)
+{
+ *p = ifparm;
+
+ return 0;
+}
+#else
+static int ov9640_sensor_power_set(int power) { return 0; }
+static int ov9640_ifparm(struct v4l2_ifparm *p) { return 0; }
+#endif
+
+static struct ov9640_platform_data h3_ov9640_platform_data = {
+ .power_set = ov9640_sensor_power_set,
+ .default_regs = ov9640_common,
+ .ifparm = ov9640_ifparm,
+};
+
+static struct i2c_board_info __initdata h3_i2c_board_info[] = {
+ {
+ I2C_BOARD_INFO("ov9640", 0x30),
+ .platform_data = &h3_ov9640_platform_data,
+ },
+};
+
+
static void __init h3_init(void)
{
/* Here we assume the NOR boot config: NOR on CS3 (possibly swapped
@@ -569,6 +679,9 @@ static void __init h3_init(void)
/* GPIO10 pullup/down register, Enable pullup on GPIO10 */
omap_cfg_reg(V2_1710_GPIO10);
+ i2c_register_board_info(1, h3_i2c_board_info,
+ ARRAY_SIZE(h3_i2c_board_info));
+
platform_add_devices(devices, ARRAY_SIZE(devices));
spi_register_board_info(h3_spi_board_info,
ARRAY_SIZE(h3_spi_board_info));
--
1.5.3.4.206.g58ba4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [RFC][PATCH 0/6] OMAP1: CAMERA: Converts omap1 camera to use v4l2-int-device api
2007-10-09 12:52 [RFC][PATCH 0/6] OMAP1: CAMERA: Converts omap1 camera to use v4l2-int-device api Eduardo Valentin
2007-10-09 12:52 ` [PATCH 1/6] OMAP1: CAMERA: Changed omap16xxcam.c to the coding style standard Eduardo Valentin
@ 2007-10-22 6:31 ` Trilok Soni
1 sibling, 0 replies; 13+ messages in thread
From: Trilok Soni @ 2007-10-22 6:31 UTC (permalink / raw)
To: Eduardo Valentin; +Cc: linux-omap-mailing-list
Hi Eduardo,
On 10/9/07, Eduardo Valentin <edubezval@gmail.com> wrote:
> Hi all,
>
> This patch set converts omap1 camera to use v4l2-int-device api. It was
> tested on H3 with ov9640 sensor, so board-h3.c was modified to add ov9640
> specific initializations. The gpio-expander code was modified also to use
> the i2c adapter id configured with i2c board specific info. Currently, it is
> working only with read method. To work with MMAP, camera_core.c needs more
> re-work.
>
> Here is the overall diffstat:
> b/arch/arm/mach-omap1/board-h3.c | 141 +++++++++
> b/drivers/i2c/chips/gpio_expander_omap.c | 5
> b/drivers/media/video/omap/Kconfig | 6
> b/drivers/media/video/omap/Makefile | 4
> b/drivers/media/video/omap/camera_core.c | 394 ++++++++++++++++++---------
> b/drivers/media/video/omap/camera_core.h | 27 -
> b/drivers/media/video/omap/omap16xxcam.c | 442 +++++++++++++++----------------
> drivers/media/video/omap/camera_core.c | 404 +++++++++++++---------------
> 8 files changed, 827 insertions(+), 596 deletions(-)
>
Thanx for sending OMAP1 changes to fit with new framework. So, it
looks like that new ov9640.c is ready for upstream.
--
--Trilok Soni
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board.
2007-10-09 12:52 ` [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board Eduardo Valentin
2007-10-09 12:52 ` [PATCH 3/6] OMAP: Update gpio expander code to the corret i2c adapter id Eduardo Valentin
2007-10-10 14:06 ` [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board Eduardo Valentin
@ 2007-10-31 10:41 ` Tony Lindgren
2007-11-01 15:32 ` Eduardo Valentin
2 siblings, 1 reply; 13+ messages in thread
From: Tony Lindgren @ 2007-10-31 10:41 UTC (permalink / raw)
To: Eduardo Valentin; +Cc: Eduardo Valentin, linux-omap-mailing-list
Hi,
* Eduardo Valentin <edubezval@gmail.com> [071009 05:53]:
> From: Eduardo Valentin <eduardo.valentin@indt.org.br>
>
> This code is based on board-h4.c and drivers/media/video/omap/h3_sensor_power.c codes.
>
> Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
> ---
> arch/arm/mach-omap1/board-h3.c | 140 ++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 140 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c
> index df77cf5..8ecc5f2 100644
> --- a/arch/arm/mach-omap1/board-h3.c
> +++ b/arch/arm/mach-omap1/board-h3.c
<snip>
> @@ -547,6 +552,138 @@ static int nand_dev_ready(struct nand_platform_data *data)
> return omap_get_gpio_datain(H3_NAND_RB_GPIO_PIN);
> }
>
> +/*
> + * Common OV9640 register initialization for all image sizes, pixel formats,
> + * and frame rates
> + */
> +const static struct ov9640_reg ov9640_common[] = {
> +
> + { 0x12, 0x80 }, { 0x11, 0x80 }, { 0x13, 0x88 }, /* COM7, CLKRC, COM8 */
> + { 0x01, 0x58 }, { 0x02, 0x24 }, { 0x04, 0x00 }, /* BLUE, RED, COM1 */
> + { 0x0E, 0x81 }, { 0x0F, 0x4F }, { 0x14, 0xcA }, /* COM5, COM6, COM9 */
> + { 0x16, 0x02 }, { 0x1B, 0x01 }, { 0x24, 0x70 }, /* ?, PSHFT, AEW */
> + { 0x25, 0x68 }, { 0x26, 0xD3 }, { 0x27, 0x90 }, /* AEB, VPT, BBIAS */
> + { 0x2A, 0x00 }, { 0x2B, 0x00 }, { 0x32, 0x24 }, /* EXHCH, EXHCL, HREF */
> + { 0x33, 0x02 }, { 0x37, 0x02 }, { 0x38, 0x13 }, /* CHLF, ADC, ACOM */
> + { 0x39, 0xF0 }, { 0x3A, 0x00 }, { 0x3B, 0x01 }, /* OFON, TSLB, COM11 */
> + { 0x3D, 0x90 }, { 0x3E, 0x02 }, { 0x3F, 0xF2 }, /* COM13, COM14, EDGE */
> + { 0x41, 0x02 }, { 0x42, 0xC8 }, /* COM16, COM17 */
> + { 0x43, 0xF0 }, { 0x44, 0x10 }, { 0x45, 0x6C }, /* ?, ?, ? */
> + { 0x46, 0x6C }, { 0x47, 0x44 }, { 0x48, 0x44 }, /* ?, ?, ? */
> + { 0x49, 0x03 }, { 0x59, 0x49 }, { 0x5A, 0x94 }, /* ?, ?, ? */
> + { 0x5B, 0x46 }, { 0x5C, 0x84 }, { 0x5D, 0x5C }, /* ?, ?, ? */
> + { 0x5E, 0x08 }, { 0x5F, 0x00 }, { 0x60, 0x14 }, /* ?, ?, ? */
> + { 0x61, 0xCE }, /* ? */
> + { 0x62, 0x70 }, { 0x63, 0x00 }, { 0x64, 0x04 }, /* LCC1, LCC2, LCC3 */
> + { 0x65, 0x00 }, { 0x66, 0x00 }, /* LCC4, LCC5 */
> + { 0x69, 0x00 }, { 0x6A, 0x3E }, { 0x6B, 0x3F }, /* HV, MBD, DBLV */
> + { 0x6C, 0x40 }, { 0x6D, 0x30 }, { 0x6E, 0x4B }, /* GSP1, GSP2, GSP3 */
> + { 0x6F, 0x60 }, { 0x70, 0x70 }, { 0x71, 0x70 }, /* GSP4, GSP5, GSP6 */
> + { 0x72, 0x70 }, { 0x73, 0x70 }, { 0x74, 0x60 }, /* GSP7, GSP8, GSP9 */
> + { 0x75, 0x60 }, { 0x76, 0x50 }, { 0x77, 0x48 }, /* GSP10,GSP11,GSP12 */
> + { 0x78, 0x3A }, { 0x79, 0x2E }, { 0x7A, 0x28 }, /* GSP13,GSP14,GSP15 */
> + { 0x7B, 0x22 }, { 0x7C, 0x04 }, { 0x7D, 0x07 }, /* GSP16,GST1, GST2 */
> + { 0x7E, 0x10 }, { 0x7F, 0x28 }, { 0x80, 0x36 }, /* GST3, GST4, GST5 */
> + { 0x81, 0x44 }, { 0x82, 0x52 }, { 0x83, 0x60 }, /* GST6, GST7, GST8 */
> + { 0x84, 0x6C }, { 0x85, 0x78 }, { 0x86, 0x8C }, /* GST9, GST10,GST11 */
> + { 0x87, 0x9E }, { 0x88, 0xBB }, { 0x89, 0xD2 }, /* GST12,GST13,GST14 */
> + { 0x8A, 0xE6 }, { 0x13, 0xaF }, { 0x15, 0x02 }, /* GST15, COM8 */
> + { 0x22, 0x8a }, /* GROS */
> + { OV9640_REG_TERM, OV9640_VAL_TERM }
> +};
> +
> +#if defined(CONFIG_VIDEO_OV9640) || defined(CONFIG_VIDEO_OV9640_MODULE)
<snip>
How about moving the struct ov9640_reg to be within CONFIG_VIDEO_OV9640?
Regards,
Tony
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board.
2007-10-31 10:41 ` Tony Lindgren
@ 2007-11-01 15:32 ` Eduardo Valentin
2007-11-15 1:46 ` Tony Lindgren
0 siblings, 1 reply; 13+ messages in thread
From: Eduardo Valentin @ 2007-11-01 15:32 UTC (permalink / raw)
To: Tony Lindgren; +Cc: Eduardo Valentin, linux-omap-mailing-list
[-- Attachment #1: Type: text/plain, Size: 4010 bytes --]
Hi Tony,
I'm re-sending the patch. As I said, it was based on board-h4.c. But I
totally agree with you. I believe this new one is a better way to
implement it. Unnecessary structures and functions are not created if
the OV9640 is not selected. I've just compiled tested this new patch.
Cheers,
On 10/31/07, Tony Lindgren <tony@atomide.com> wrote:
> Hi,
>
> * Eduardo Valentin <edubezval@gmail.com> [071009 05:53]:
> > From: Eduardo Valentin <eduardo.valentin@indt.org.br>
> >
> > This code is based on board-h4.c and drivers/media/video/omap/h3_sensor_power.c codes.
> >
> > Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
> > ---
> > arch/arm/mach-omap1/board-h3.c | 140 ++++++++++++++++++++++++++++++++++++++++
> > 1 files changed, 140 insertions(+), 0 deletions(-)
> >
> > diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c
> > index df77cf5..8ecc5f2 100644
> > --- a/arch/arm/mach-omap1/board-h3.c
> > +++ b/arch/arm/mach-omap1/board-h3.c
>
> <snip>
>
> > @@ -547,6 +552,138 @@ static int nand_dev_ready(struct nand_platform_data *data)
> > return omap_get_gpio_datain(H3_NAND_RB_GPIO_PIN);
> > }
> >
> > +/*
> > + * Common OV9640 register initialization for all image sizes, pixel formats,
> > + * and frame rates
> > + */
> > +const static struct ov9640_reg ov9640_common[] = {
> > +
> > + { 0x12, 0x80 }, { 0x11, 0x80 }, { 0x13, 0x88 }, /* COM7, CLKRC, COM8 */
> > + { 0x01, 0x58 }, { 0x02, 0x24 }, { 0x04, 0x00 }, /* BLUE, RED, COM1 */
> > + { 0x0E, 0x81 }, { 0x0F, 0x4F }, { 0x14, 0xcA }, /* COM5, COM6, COM9 */
> > + { 0x16, 0x02 }, { 0x1B, 0x01 }, { 0x24, 0x70 }, /* ?, PSHFT, AEW */
> > + { 0x25, 0x68 }, { 0x26, 0xD3 }, { 0x27, 0x90 }, /* AEB, VPT, BBIAS */
> > + { 0x2A, 0x00 }, { 0x2B, 0x00 }, { 0x32, 0x24 }, /* EXHCH, EXHCL, HREF */
> > + { 0x33, 0x02 }, { 0x37, 0x02 }, { 0x38, 0x13 }, /* CHLF, ADC, ACOM */
> > + { 0x39, 0xF0 }, { 0x3A, 0x00 }, { 0x3B, 0x01 }, /* OFON, TSLB, COM11 */
> > + { 0x3D, 0x90 }, { 0x3E, 0x02 }, { 0x3F, 0xF2 }, /* COM13, COM14, EDGE */
> > + { 0x41, 0x02 }, { 0x42, 0xC8 }, /* COM16, COM17 */
> > + { 0x43, 0xF0 }, { 0x44, 0x10 }, { 0x45, 0x6C }, /* ?, ?, ? */
> > + { 0x46, 0x6C }, { 0x47, 0x44 }, { 0x48, 0x44 }, /* ?, ?, ? */
> > + { 0x49, 0x03 }, { 0x59, 0x49 }, { 0x5A, 0x94 }, /* ?, ?, ? */
> > + { 0x5B, 0x46 }, { 0x5C, 0x84 }, { 0x5D, 0x5C }, /* ?, ?, ? */
> > + { 0x5E, 0x08 }, { 0x5F, 0x00 }, { 0x60, 0x14 }, /* ?, ?, ? */
> > + { 0x61, 0xCE }, /* ? */
> > + { 0x62, 0x70 }, { 0x63, 0x00 }, { 0x64, 0x04 }, /* LCC1, LCC2, LCC3 */
> > + { 0x65, 0x00 }, { 0x66, 0x00 }, /* LCC4, LCC5 */
> > + { 0x69, 0x00 }, { 0x6A, 0x3E }, { 0x6B, 0x3F }, /* HV, MBD, DBLV */
> > + { 0x6C, 0x40 }, { 0x6D, 0x30 }, { 0x6E, 0x4B }, /* GSP1, GSP2, GSP3 */
> > + { 0x6F, 0x60 }, { 0x70, 0x70 }, { 0x71, 0x70 }, /* GSP4, GSP5, GSP6 */
> > + { 0x72, 0x70 }, { 0x73, 0x70 }, { 0x74, 0x60 }, /* GSP7, GSP8, GSP9 */
> > + { 0x75, 0x60 }, { 0x76, 0x50 }, { 0x77, 0x48 }, /* GSP10,GSP11,GSP12 */
> > + { 0x78, 0x3A }, { 0x79, 0x2E }, { 0x7A, 0x28 }, /* GSP13,GSP14,GSP15 */
> > + { 0x7B, 0x22 }, { 0x7C, 0x04 }, { 0x7D, 0x07 }, /* GSP16,GST1, GST2 */
> > + { 0x7E, 0x10 }, { 0x7F, 0x28 }, { 0x80, 0x36 }, /* GST3, GST4, GST5 */
> > + { 0x81, 0x44 }, { 0x82, 0x52 }, { 0x83, 0x60 }, /* GST6, GST7, GST8 */
> > + { 0x84, 0x6C }, { 0x85, 0x78 }, { 0x86, 0x8C }, /* GST9, GST10,GST11 */
> > + { 0x87, 0x9E }, { 0x88, 0xBB }, { 0x89, 0xD2 }, /* GST12,GST13,GST14 */
> > + { 0x8A, 0xE6 }, { 0x13, 0xaF }, { 0x15, 0x02 }, /* GST15, COM8 */
> > + { 0x22, 0x8a }, /* GROS */
> > + { OV9640_REG_TERM, OV9640_VAL_TERM }
> > +};
> > +
> > +#if defined(CONFIG_VIDEO_OV9640) || defined(CONFIG_VIDEO_OV9640_MODULE)
>
> <snip>
>
> How about moving the struct ov9640_reg to be within CONFIG_VIDEO_OV9640?
>
> Regards,
>
> Tony
>
--
Eduardo Bezerra Valentin
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-OMAP-Update-ov9640-ifparm-for-H3-board.patch --]
[-- Type: text/x-diff; name=0001-OMAP-Update-ov9640-ifparm-for-H3-board.patch, Size: 5604 bytes --]
From b6030eac258261550b946ab211124ced3536285e Mon Sep 17 00:00:00 2001
From: Eduardo Valentin <eduardo.valentin@indt.org.br>
Date: Wed, 10 Oct 2007 10:06:18 -0400
Subject: [PATCH] OMAP: Update ov9640 ifparm for H3 board.
This code is based on board-h4.c and drivers/media/video/omap/h3_sensor_power.c codes.
Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
---
arch/arm/mach-omap1/board-h3.c | 112 ++++++++++++++++++++++++++++++++++++++++
1 files changed, 112 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c
index df77cf5..f6095f0 100644
--- a/arch/arm/mach-omap1/board-h3.c
+++ b/arch/arm/mach-omap1/board-h3.c
@@ -26,6 +26,7 @@
#include <linux/mtd/partitions.h>
#include <linux/input.h>
#include <linux/clk.h>
+#include <linux/i2c.h>
#include <linux/spi/spi.h>
#include <linux/spi/tsc2101.h>
@@ -37,6 +38,8 @@
#include <asm/mach/flash.h>
#include <asm/mach/map.h>
+#include <media/v4l2-int-device.h>
+
#include <asm/arch/gpio.h>
#include <asm/arch/gpioexpander.h>
#include <asm/arch/irqs.h>
@@ -50,6 +53,8 @@
#include <asm/arch/mcbsp.h>
#include <asm/arch/omap-alsa.h>
+#include <../drivers/media/video/ov9640.h>
+
extern int omap_gpio_init(void);
static int h3_keymap[] = {
@@ -547,6 +552,110 @@ static int nand_dev_ready(struct nand_platform_data *data)
return omap_get_gpio_datain(H3_NAND_RB_GPIO_PIN);
}
+#if defined(CONFIG_VIDEO_OV9640) || defined(CONFIG_VIDEO_OV9640_MODULE)
+/*
+ * Common OV9640 register initialization for all image sizes, pixel formats,
+ * and frame rates
+ */
+const static struct ov9640_reg ov9640_common[] = {
+
+ { 0x12, 0x80 }, { 0x11, 0x80 }, { 0x13, 0x88 }, /* COM7, CLKRC, COM8 */
+ { 0x01, 0x58 }, { 0x02, 0x24 }, { 0x04, 0x00 }, /* BLUE, RED, COM1 */
+ { 0x0E, 0x81 }, { 0x0F, 0x4F }, { 0x14, 0xcA }, /* COM5, COM6, COM9 */
+ { 0x16, 0x02 }, { 0x1B, 0x01 }, { 0x24, 0x70 }, /* ?, PSHFT, AEW */
+ { 0x25, 0x68 }, { 0x26, 0xD3 }, { 0x27, 0x90 }, /* AEB, VPT, BBIAS */
+ { 0x2A, 0x00 }, { 0x2B, 0x00 }, { 0x32, 0x24 }, /* EXHCH, EXHCL, HREF */
+ { 0x33, 0x02 }, { 0x37, 0x02 }, { 0x38, 0x13 }, /* CHLF, ADC, ACOM */
+ { 0x39, 0xF0 }, { 0x3A, 0x00 }, { 0x3B, 0x01 }, /* OFON, TSLB, COM11 */
+ { 0x3D, 0x90 }, { 0x3E, 0x02 }, { 0x3F, 0xF2 }, /* COM13, COM14, EDGE */
+ { 0x41, 0x02 }, { 0x42, 0xC8 }, /* COM16, COM17 */
+ { 0x43, 0xF0 }, { 0x44, 0x10 }, { 0x45, 0x6C }, /* ?, ?, ? */
+ { 0x46, 0x6C }, { 0x47, 0x44 }, { 0x48, 0x44 }, /* ?, ?, ? */
+ { 0x49, 0x03 }, { 0x59, 0x49 }, { 0x5A, 0x94 }, /* ?, ?, ? */
+ { 0x5B, 0x46 }, { 0x5C, 0x84 }, { 0x5D, 0x5C }, /* ?, ?, ? */
+ { 0x5E, 0x08 }, { 0x5F, 0x00 }, { 0x60, 0x14 }, /* ?, ?, ? */
+ { 0x61, 0xCE }, /* ? */
+ { 0x62, 0x70 }, { 0x63, 0x00 }, { 0x64, 0x04 }, /* LCC1, LCC2, LCC3 */
+ { 0x65, 0x00 }, { 0x66, 0x00 }, /* LCC4, LCC5 */
+ { 0x69, 0x00 }, { 0x6A, 0x3E }, { 0x6B, 0x3F }, /* HV, MBD, DBLV */
+ { 0x6C, 0x40 }, { 0x6D, 0x30 }, { 0x6E, 0x4B }, /* GSP1, GSP2, GSP3 */
+ { 0x6F, 0x60 }, { 0x70, 0x70 }, { 0x71, 0x70 }, /* GSP4, GSP5, GSP6 */
+ { 0x72, 0x70 }, { 0x73, 0x70 }, { 0x74, 0x60 }, /* GSP7, GSP8, GSP9 */
+ { 0x75, 0x60 }, { 0x76, 0x50 }, { 0x77, 0x48 }, /* GSP10,GSP11,GSP12 */
+ { 0x78, 0x3A }, { 0x79, 0x2E }, { 0x7A, 0x28 }, /* GSP13,GSP14,GSP15 */
+ { 0x7B, 0x22 }, { 0x7C, 0x04 }, { 0x7D, 0x07 }, /* GSP16,GST1, GST2 */
+ { 0x7E, 0x10 }, { 0x7F, 0x28 }, { 0x80, 0x36 }, /* GST3, GST4, GST5 */
+ { 0x81, 0x44 }, { 0x82, 0x52 }, { 0x83, 0x60 }, /* GST6, GST7, GST8 */
+ { 0x84, 0x6C }, { 0x85, 0x78 }, { 0x86, 0x8C }, /* GST9, GST10,GST11 */
+ { 0x87, 0x9E }, { 0x88, 0xBB }, { 0x89, 0xD2 }, /* GST12,GST13,GST14 */
+ { 0x8A, 0xE6 }, { 0x13, 0xaF }, { 0x15, 0x02 }, /* GST15, COM8 */
+ { 0x22, 0x8a }, /* GROS */
+ { OV9640_REG_TERM, OV9640_VAL_TERM }
+};
+
+static int ov9640_sensor_power_set(int power)
+{
+ unsigned char expa;
+ int err;
+
+ /* read current state of GPIO EXPA outputs */
+ err = read_gpio_expa(&expa, 0x27);
+ if (err) {
+ printk(KERN_ERR "Error reading GPIO EXPA\n");
+ return err;
+ }
+ /* Clear GPIO EXPA P3 (CAMERA_MODULE_EN) to power-up/down sensor */
+ if (power)
+ expa |= 0x08;
+ else
+ expa &= ~0x08;
+
+ err = write_gpio_expa(expa, 0x27);
+ if (err) {
+ printk(KERN_ERR "Error writing to GPIO EXPA\n");
+ return err;
+ }
+
+ return err;
+}
+
+static struct v4l2_ifparm ifparm = {
+ .if_type = V4L2_IF_TYPE_BT656,
+ .u = {
+ .bt656 = {
+ .frame_start_on_rising_vs = 1,
+ .nobt_vs_inv = 1,
+ .mode = V4L2_IF_TYPE_BT656_MODE_NOBT_8BIT,
+ .clock_min = OV9640_XCLK_MIN,
+ .clock_max = OV9640_XCLK_MAX,
+ },
+ },
+};
+
+static int ov9640_ifparm(struct v4l2_ifparm *p)
+{
+ *p = ifparm;
+
+ return 0;
+}
+
+static struct ov9640_platform_data h3_ov9640_platform_data = {
+ .power_set = ov9640_sensor_power_set,
+ .default_regs = ov9640_common,
+ .ifparm = ov9640_ifparm,
+};
+#endif
+
+static struct i2c_board_info __initdata h3_i2c_board_info[] = {
+#if defined(CONFIG_VIDEO_OV9640) || defined(CONFIG_VIDEO_OV9640_MODULE)
+ {
+ I2C_BOARD_INFO("ov9640", 0x30),
+ .platform_data = &h3_ov9640_platform_data,
+ },
+#endif
+};
+
+
static void __init h3_init(void)
{
/* Here we assume the NOR boot config: NOR on CS3 (possibly swapped
@@ -569,6 +678,9 @@ static void __init h3_init(void)
/* GPIO10 pullup/down register, Enable pullup on GPIO10 */
omap_cfg_reg(V2_1710_GPIO10);
+ i2c_register_board_info(1, h3_i2c_board_info,
+ ARRAY_SIZE(h3_i2c_board_info));
+
platform_add_devices(devices, ARRAY_SIZE(devices));
spi_register_board_info(h3_spi_board_info,
ARRAY_SIZE(h3_spi_board_info));
--
1.5.3.4.206.g58ba4
[-- Attachment #3: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board.
2007-11-01 15:32 ` Eduardo Valentin
@ 2007-11-15 1:46 ` Tony Lindgren
0 siblings, 0 replies; 13+ messages in thread
From: Tony Lindgren @ 2007-11-15 1:46 UTC (permalink / raw)
To: Eduardo Valentin; +Cc: Eduardo Valentin, linux-omap-mailing-list
* Eduardo Valentin <edubezval@gmail.com> [071101 08:32]:
> Hi Tony,
>
> I'm re-sending the patch. As I said, it was based on board-h4.c. But I
> totally agree with you. I believe this new one is a better way to
> implement it. Unnecessary structures and functions are not created if
> the OV9640 is not selected. I've just compiled tested this new patch.
Thanks for updating it. I'll push the whole series today.
Tony
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2007-11-15 1:46 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-09 12:52 [RFC][PATCH 0/6] OMAP1: CAMERA: Converts omap1 camera to use v4l2-int-device api Eduardo Valentin
2007-10-09 12:52 ` [PATCH 1/6] OMAP1: CAMERA: Changed omap16xxcam.c to the coding style standard Eduardo Valentin
2007-10-09 12:52 ` [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board Eduardo Valentin
2007-10-09 12:52 ` [PATCH 3/6] OMAP: Update gpio expander code to the corret i2c adapter id Eduardo Valentin
2007-10-09 12:52 ` [PATCH 4/6] OMAP1: CAMERA: Convert camera_core.c to use v4l2-int-device API Eduardo Valentin
2007-10-09 12:52 ` [PATCH 5/6] OMAP1: CAMERA: Changed camera_core.c to the coding style standard Eduardo Valentin
2007-10-09 12:52 ` [PATCH 6/6] OMAP1: CAMERA: Remove unecessary files from Makefile and Kconfig Eduardo Valentin
2007-10-10 14:06 ` [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board Eduardo Valentin
2007-10-10 14:06 ` Eduardo Valentin
2007-10-31 10:41 ` Tony Lindgren
2007-11-01 15:32 ` Eduardo Valentin
2007-11-15 1:46 ` Tony Lindgren
2007-10-22 6:31 ` [RFC][PATCH 0/6] OMAP1: CAMERA: Converts omap1 camera to use v4l2-int-device api Trilok Soni
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox