Commit c5a16093 authored by Eduardo Valentin's avatar Eduardo Valentin Committed by Tony Lindgren

OMAP1: CAMERA: Changed omap16xxcam.c to the coding style standard

- 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: default avatarEduardo Valentin <eduardo.valentin@indt.org.br>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 9b5fa5d5
/* /*
* drivers/media/video/omap/omap16xxcam.c * 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 * Video-for-Linux (Version 2) camera capture driver for
* the OMAP H2 and H3 camera controller. * 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. * 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 * it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. * published by the Free Software Foundation.
* *
* THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/ */
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
...@@ -38,7 +38,6 @@ ...@@ -38,7 +38,6 @@
#include "omap16xxcam.h" #include "omap16xxcam.h"
#include "camera_hw_if.h" #include "camera_hw_if.h"
#include "camera_core.h" #include "camera_core.h"
#define CONF_CAMERAIF_RESET_R 5 #define CONF_CAMERAIF_RESET_R 5
#define EN_PER 0 #define EN_PER 0
...@@ -49,13 +48,13 @@ ...@@ -49,13 +48,13 @@
#define NUM_CAMDMA_CHANNELS 2 #define NUM_CAMDMA_CHANNELS 2
typedef struct { typedef struct {
unsigned int ctrlclock; /* 00 */ unsigned int ctrlclock; /* 00 */
unsigned int it_status; /* 04 */ unsigned int it_status; /* 04 */
unsigned int mode; /* 08 */ unsigned int mode; /* 08 */
unsigned int status; /* 0C */ unsigned int status; /* 0C */
unsigned int camdata; /* 10 */ unsigned int camdata; /* 10 */
unsigned int gpio; /* 14 */ unsigned int gpio; /* 14 */
unsigned int peak_counter; /* 18 */ unsigned int peak_counter; /* 18 */
} camera_regs_t; } camera_regs_t;
struct camdma_state { struct camdma_state {
...@@ -68,12 +67,12 @@ struct omap16xxcam { ...@@ -68,12 +67,12 @@ struct omap16xxcam {
camera_regs_t *camera_regs; camera_regs_t *camera_regs;
unsigned long iobase_phys; 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; unsigned long ocp_clk;
struct clk *func_clk; struct clk *func_clk;
/* dma related stuff */ /* DMA related stuff */
spinlock_t dma_lock; spinlock_t dma_lock;
int free_dmach; int free_dmach;
int next_dmach; int next_dmach;
...@@ -86,22 +85,21 @@ struct omap16xxcam { ...@@ -86,22 +85,21 @@ struct omap16xxcam {
int new; int new;
}; };
static struct omap16xxcam hardware_data; static struct omap16xxcam hardware_data;
static int omap16xxcam_set_xclk(int, void *); static int omap16xxcam_set_xclk(int, void *);
static void omap16xx_cam_dma_link_callback(int, unsigned short, 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 /* Clears the camera data FIFO by setting RAZ_FIFO bit in MODE configuration
register. */ * register.
static void */
omap16xx_cam_clear_fifo(struct omap16xxcam *data) static void omap16xx_cam_clear_fifo(struct omap16xxcam *data)
{ {
data->camera_regs->mode |= RAZ_FIFO; data->camera_regs->mode |= RAZ_FIFO;
udelay(10); udelay(10);
data->camera_regs->mode &= ~RAZ_FIFO; data->camera_regs->mode &= ~RAZ_FIFO;
} }
static void static void omap16xx_cam_reset(struct omap16xxcam *data, int yes)
omap16xx_cam_reset(struct omap16xxcam *data, int yes)
{ {
if (machine_is_omap_h3()) if (machine_is_omap_h3())
data->camera_regs->gpio = yes ? 0 : 1; data->camera_regs->gpio = yes ? 0 : 1;
...@@ -109,93 +107,96 @@ omap16xx_cam_reset(struct omap16xxcam *data, int yes) ...@@ -109,93 +107,96 @@ omap16xx_cam_reset(struct omap16xxcam *data, int yes)
data->camera_regs->gpio = yes ? 1 : 0; data->camera_regs->gpio = yes ? 1 : 0;
} }
static void static void omap16xx_cam_init(void)
omap16xx_cam_init(void)
{ {
/* /*
* FIXME - Use mux API's instead of directly writing in to MUX registers * 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(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(omap_readl(PU_PD_SEL_0) & ~(0x1FFF << 17), PU_PD_SEL_0);
omap_writel(0xeaef, COMP_MODE_CTRL_0); omap_writel(0xeaef, COMP_MODE_CTRL_0);
omap_writel(omap_readl(OMAP1610_RESET_CONTROL) & ~(1 << CONF_CAMERAIF_RESET_R), omap_writel(omap_readl(OMAP1610_RESET_CONTROL) &
OMAP1610_RESET_CONTROL); ~(1 << CONF_CAMERAIF_RESET_R), OMAP1610_RESET_CONTROL);
omap_writel(omap_readl(OMAP1610_RESET_CONTROL) | (1 << CONF_CAMERAIF_RESET_R), omap_writel(omap_readl(OMAP1610_RESET_CONTROL) |
OMAP1610_RESET_CONTROL); (1 << CONF_CAMERAIF_RESET_R), OMAP1610_RESET_CONTROL);
/* Enable peripheral reset */ /* Enable peripheral reset */
omap_writew(omap_readw(ARM_RSTCT2) | (1 << EN_PER), ARM_RSTCT2); omap_writew(omap_readw(ARM_RSTCT2) | (1 << EN_PER), ARM_RSTCT2);
/* enable peripheral clock */ /* Enable peripheral clock */
clk_enable(hardware_data.func_clk); clk_enable(hardware_data.func_clk);
} }
static void static void omap16xx_cam_waitfor_syncedge(struct omap16xxcam *data,
omap16xx_cam_waitfor_syncedge(struct omap16xxcam *data, u32 edge_mask) 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 { do {
interruptible_sleep_on(&data->vsync_wait); interruptible_sleep_on(&data->vsync_wait);
} while (signal_pending(current)); } while (signal_pending(current));
} }
static void static void omap16xx_cam_configure_dma(struct omap16xxcam *data)
omap16xx_cam_configure_dma(struct omap16xxcam *data)
{ {
data->camera_regs->mode = (FIFO_TRIGGER_LVL << THRESHOLD_BIT) data->camera_regs->mode = (FIFO_TRIGGER_LVL << THRESHOLD_BIT)
| EN_DMA | EN_FIFO_FULL; | EN_DMA | EN_FIFO_FULL;
data->camera_regs->ctrlclock |= LCLK_EN; data->camera_regs->ctrlclock |= LCLK_EN;
} }
/* acquire h/w resources DMA */ /* Acquire h/w resources DMA */
static int static int omap16xx_cam_link_open(struct omap16xxcam *data)
omap16xx_cam_link_open(struct omap16xxcam *data)
{ {
int ret; int ret;
/* Acquire first dma channel */ /* Acquire first DMA channel */
if ((ret = omap_request_dma(OMAP_DMA_CAMERA_IF_RX, ret = omap_request_dma(OMAP_DMA_CAMERA_IF_RX,
"camera dma 1", omap16xx_cam_dma_link_callback, "camera dma 1",
(void *)data, &data->dma_channel_number1))) { omap16xx_cam_dma_link_callback,
return ret; (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 */ data->next_dmach = data->dma_channel_number1;
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;
OMAP_DMA_CLNK_CTRL_REG(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) = OMAP_DMA_CLNK_CTRL_REG(data->dma_channel_number2) =
data->dma_channel_number1; data->dma_channel_number1;
return 0; return 0;
} }
/* free h/w resources, stop i/f */ /* Free h/w resources, stop i/f */
static int static int omap16xx_cam_link_close(struct omap16xxcam *data)
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_number1);
omap_stop_dma(data->dma_channel_number2); omap_stop_dma(data->dma_channel_number2);
omap_free_dma (data->dma_channel_number1); omap_free_dma(data->dma_channel_number1);
omap_free_dma (data->dma_channel_number2); omap_free_dma(data->dma_channel_number2);
return 0; return 0;
} }
/* dma callback routine. */ /* DMA callback routine. */
static void static void omap16xx_cam_dma_link_callback(int lch, unsigned short ch_status,
omap16xx_cam_dma_link_callback(int lch, unsigned short ch_status, void *data) void *data)
{ {
int count; int count;
void *arg1, *arg2; void *arg1, *arg2;
...@@ -204,52 +205,51 @@ omap16xx_cam_dma_link_callback(int lch, unsigned short ch_status, void *data) ...@@ -204,52 +205,51 @@ omap16xx_cam_dma_link_callback(int lch, unsigned short ch_status, void *data)
dma_callback_t callback; dma_callback_t callback;
spin_lock(&cam->dma_lock); spin_lock(&cam->dma_lock);
if (cam->free_dmach == 2) if (cam->free_dmach == 2) {
{ printk(KERN_ERR "callback all CHANNELS WERE IDLE \n");
printk("callback all CHANNELS WERE IDLE \n");
spin_unlock(&cam->dma_lock); spin_unlock(&cam->dma_lock);
return; return;
} }
if (cam->free_dmach == 0) { if (cam->free_dmach == 0) {
lch = cam->next_dmach; lch = cam->next_dmach;
} else { } else {
lch = cam->next_dmach == cam->dma_channel_number1 ? lch = cam->next_dmach == cam->dma_channel_number1 ?
cam->dma_channel_number2 : 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)) if (OMAP_DMA_CCR_REG(lch) & (1 << 7))
break; break;
count = (lch == cam->dma_channel_number2) ? 1 : 0; count = (lch == cam->dma_channel_number2) ? 1 : 0;
callback = cam->camdma[count].callback; callback = cam->camdma[count].callback;
arg1 = cam->camdma[count].arg1; arg1 = cam->camdma[count].arg1;
arg2 = cam->camdma[count].arg2; arg2 = cam->camdma[count].arg2;
cam->free_dmach++; cam->free_dmach++;
spin_unlock(&cam->dma_lock); spin_unlock(&cam->dma_lock);
callback(arg1, arg2); callback(arg1, arg2);
spin_lock(&cam->dma_lock); spin_lock(&cam->dma_lock);
lch = (lch == cam->dma_channel_number2) ? cam->dma_channel_number1 : lch =
cam->dma_channel_number2; (lch ==
cam->dma_channel_number2) ? cam->
dma_channel_number1 : cam->dma_channel_number2;
} }
spin_unlock(&cam->dma_lock); spin_unlock(&cam->dma_lock);
} }
static irqreturn_t static irqreturn_t omap16xx_cam_isr(int irq, void *client_data)
omap16xx_cam_isr(int irq, void *client_data)
{ {
struct omap16xxcam *data = (struct omap16xxcam *)client_data; struct omap16xxcam *data = (struct omap16xxcam *)client_data;
unsigned int itstat = data->camera_regs->it_status; unsigned int itstat = data->camera_regs->it_status;
/* VSYNC UP interrupt, start filling FIFO and enabling DMA */ /* VSYNC UP interrupt, start filling FIFO and enabling DMA */
if (itstat & V_UP) { if (itstat & V_UP) {
data->camera_regs->mode &= ~EN_V_UP; data->camera_regs->mode &= ~EN_V_UP;
omap16xx_cam_clear_fifo(data); omap16xx_cam_clear_fifo(data);
omap16xx_cam_configure_dma(data); omap16xx_cam_configure_dma(data);
omap_start_dma(data->next_dmach); omap_start_dma(data->next_dmach);
wake_up_interruptible(&data->vsync_wait); wake_up_interruptible(&data->vsync_wait);
...@@ -261,29 +261,29 @@ omap16xx_cam_isr(int irq, void *client_data) ...@@ -261,29 +261,29 @@ omap16xx_cam_isr(int irq, void *client_data)
} }
if (itstat & H_UP) if (itstat & H_UP)
printk("H_UP\n"); printk(KERN_INFO "H_UP\n");
if (itstat & H_DOWN) if (itstat & H_DOWN)
printk("H_DOWN\n"); printk(KERN_INFO "H_DOWN\n");
if (itstat & FIFO_FULL) { if (itstat & FIFO_FULL) {
omap16xx_cam_clear_fifo(data); omap16xx_cam_clear_fifo(data);
printk("FIFO_FULL\n"); printk(KERN_INFO "FIFO_FULL\n");
} }
if (itstat & DATA_XFER) if (itstat & DATA_XFER)
printk("DATA_TRANS\n"); printk(KERN_INFO "DATA_TRANS\n");
return IRQ_HANDLED; return IRQ_HANDLED;
} }
/* ------------- below are interface functions ----------------- */ /* ------------- Below are interface functions -----------------
/* ------------- these functions are named omap16xxcam_<name> -- */ * ------------- These functions are named omap16xxcam_<name> --
static int */
omap16xxcam_init_dma(void *priv) static int omap16xxcam_init_dma(void *priv)
{ {
int ch; int ch;
struct omap16xxcam *data = (struct omap16xxcam *) priv; struct omap16xxcam *data = (struct omap16xxcam *)priv;
data->free_dmach = 2; data->free_dmach = 2;
for (ch = 0; ch < 2; ++ch) { for (ch = 0; ch < 2; ++ch) {
...@@ -295,12 +295,12 @@ omap16xxcam_init_dma(void *priv) ...@@ -295,12 +295,12 @@ omap16xxcam_init_dma(void *priv)
return 0; return 0;
} }
/* start the dma of chains */ /* Start the DMA of chains */
static int static int omap16xxcam_start_dma(struct sgdma_state *sgdma,
omap16xxcam_start_dma(struct sgdma_state *sgdma, dma_callback_t callback, void *arg1,
dma_callback_t callback, void *arg1, void *arg2, void *priv) void *arg2, void *priv)
{ {
struct omap16xxcam *data = (struct omap16xxcam *) priv; struct omap16xxcam *data = (struct omap16xxcam *)priv;
struct scatterlist *sglist; struct scatterlist *sglist;
unsigned long irqflags; unsigned long irqflags;
int dmach; int dmach;
...@@ -313,37 +313,37 @@ omap16xxcam_start_dma(struct sgdma_state *sgdma, ...@@ -313,37 +313,37 @@ omap16xxcam_start_dma(struct sgdma_state *sgdma,
if (!data->free_dmach) { if (!data->free_dmach) {
spin_unlock_irqrestore(&data->dma_lock, irqflags); spin_unlock_irqrestore(&data->dma_lock, irqflags);
return -EBUSY; return -EBUSY;
} }
dmach = data->next_dmach; 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].callback = callback;
data->camdma[count].arg1 = arg1; data->camdma[count].arg1 = arg1;
data->camdma[count].arg2 = arg2; data->camdma[count].arg2 = arg2;
if (cpu_is_omap1710()) if (cpu_is_omap1710())
omap_set_dma_src_params(dmach, OMAP_DMA_PORT_OCP_T1, omap_set_dma_src_params(dmach, OMAP_DMA_PORT_OCP_T1,
OMAP_DMA_AMODE_CONSTANT, CAM_CAMDATA_REG, OMAP_DMA_AMODE_CONSTANT,
0, 0); CAM_CAMDATA_REG, 0, 0);
else else
omap_set_dma_src_params(dmach, OMAP_DMA_PORT_TIPB, omap_set_dma_src_params(dmach, OMAP_DMA_PORT_TIPB,
OMAP_DMA_AMODE_CONSTANT, CAM_CAMDATA_REG, OMAP_DMA_AMODE_CONSTANT,
0, 0); CAM_CAMDATA_REG, 0, 0);
omap_set_dma_dest_params(dmach, OMAP_DMA_PORT_EMIFF, omap_set_dma_dest_params(dmach, OMAP_DMA_PORT_EMIFF,
OMAP_DMA_AMODE_POST_INC, sg_dma_address(sglist), OMAP_DMA_AMODE_POST_INC,
0, 0); sg_dma_address(sglist), 0, 0);
omap_set_dma_transfer_params(dmach, OMAP_DMA_DATA_TYPE_S32, omap_set_dma_transfer_params(dmach, OMAP_DMA_DATA_TYPE_S32,
FIFO_TRIGGER_LVL, FIFO_TRIGGER_LVL,
sg_dma_len(sglist)/(4 * FIFO_TRIGGER_LVL), sg_dma_len(sglist) / (4 *
OMAP_DMA_SYNC_FRAME, FIFO_TRIGGER_LVL),
0, 0); 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) { if (data->new) {
data->new = 0; data->new = 0;
omap16xx_cam_waitfor_syncedge(data, EN_V_UP); omap16xx_cam_waitfor_syncedge(data, EN_V_UP);
...@@ -351,20 +351,20 @@ omap16xxcam_start_dma(struct sgdma_state *sgdma, ...@@ -351,20 +351,20 @@ omap16xxcam_start_dma(struct sgdma_state *sgdma,
if (OMAP_DMA_CCR_REG(prev_dmach) & (1 << 7)) if (OMAP_DMA_CCR_REG(prev_dmach) & (1 << 7))
OMAP_DMA_CLNK_CTRL_REG(prev_dmach) |= (1 << 15); OMAP_DMA_CLNK_CTRL_REG(prev_dmach) |= (1 << 15);
else { else {
/* no transfer is in progress */ /* No transfer is in progress */
omap_start_dma(dmach); omap_start_dma(dmach);
} }
} }
data->next_dmach = prev_dmach; data->next_dmach = prev_dmach;
data->free_dmach--; data->free_dmach--;
spin_unlock_irqrestore(&data->dma_lock, irqflags); spin_unlock_irqrestore(&data->dma_lock, irqflags);
return 0; 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) while (data->free_dmach < 2)
mdelay(1); mdelay(1);
...@@ -372,112 +372,107 @@ omap16xxcam_finish_dma(void *priv) ...@@ -372,112 +372,107 @@ omap16xxcam_finish_dma(void *priv)
return 0; return 0;
} }
/* Enables the camera. Takes camera out of reset. Enables the clocks. */
/* Enables the camera. Takes camera out of reset. Enables the clocks. */ static int omap16xxcam_enable(void *priv)
static int
omap16xxcam_enable(void *priv)
{ {
struct omap16xxcam *data = (struct omap16xxcam *) priv; struct omap16xxcam *data = (struct omap16xxcam *)priv;
omap16xx_cam_reset(data, 1); 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->mode = (FIFO_TRIGGER_LVL << THRESHOLD_BIT);
data->camera_regs->ctrlclock = MCLK_EN | CAMEXCLK_EN; data->camera_regs->ctrlclock = MCLK_EN | CAMEXCLK_EN;
omap16xx_cam_clear_fifo(data); omap16xx_cam_clear_fifo(data);
/* wait for camera to settle down */ /* Wait for camera to settle down */
mdelay(5); mdelay(5);
return 0; return 0;
} }
/* Disables all the camera clocks. Put the camera interface in reset. */ /* Disables all the camera clocks. Put the camera interface in reset. */
static int static int omap16xxcam_disable(void *priv)
omap16xxcam_disable(void *priv) {
{ struct omap16xxcam *data = (struct omap16xxcam *)priv;
struct omap16xxcam *data = (struct omap16xxcam *) priv;
omap16xx_cam_clear_fifo(data); omap16xx_cam_clear_fifo(data);
data->camera_regs->ctrlclock = 0x00000000; data->camera_regs->ctrlclock = 0x00000000;
data->camera_regs->mode = 0x00000000; data->camera_regs->mode = 0x00000000;
omap16xx_cam_reset(data, 0); omap16xx_cam_reset(data, 0);
return 0; return 0;
} }
/* Abort the data transfer */ /* Abort the data transfer */
static int static int omap16xxcam_abort(void *priv)
omap16xxcam_abort(void *priv)
{ {
return omap16xxcam_disable(priv); return omap16xxcam_disable(priv);
} }
static int static int omap16xxcam_set_xclk(int xclk, void *priv)
omap16xxcam_set_xclk(int xclk, void *priv) {
{ struct omap16xxcam *data = (struct omap16xxcam *)priv;
struct omap16xxcam *data = (struct omap16xxcam *) priv; int xclk_val;
int xclk_val;
int divisor = 1; int divisor = 1;
divisor = data->ocp_clk/xclk; divisor = data->ocp_clk / xclk;
if ( divisor * xclk < data->ocp_clk) if (divisor * xclk < data->ocp_clk)
++divisor; ++divisor;
switch (divisor) { switch (divisor) {
case 1: case 1:
case 2: case 2:
xclk_val = FOSCMOD_TC2_CK2; xclk_val = FOSCMOD_TC2_CK2;
break; break;
case 3: case 3:
xclk_val = FOSCMOD_TC2_CK3; xclk_val = FOSCMOD_TC2_CK3;
break; break;
case 4: case 4:
case 5: case 5:
case 6: case 6:
case 7: case 7:
xclk_val = FOSCMOD_TC2_CK4; xclk_val = FOSCMOD_TC2_CK4;
break; break;
case 8: case 8:
case 9: case 9:
xclk_val = FOSCMOD_TC2_CK8; xclk_val = FOSCMOD_TC2_CK8;
break; break;
case 10: case 10:
case 11: case 11:
xclk_val = FOSCMOD_TC2_CK10; xclk_val = FOSCMOD_TC2_CK10;
break; break;
case 12: case 12:
case 13: case 13:
case 14: case 14:
case 15: case 15:
xclk_val = FOSCMOD_TC2_CK12; xclk_val = FOSCMOD_TC2_CK12;
break; break;
case 16: case 16:
xclk_val = FOSCMOD_TC2_CK16; xclk_val = FOSCMOD_TC2_CK16;
break; break;
default: default:
xclk_val = FOSCMOD_TC2_CK16; 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 &= ~CAMEXCLK_EN;
data->camera_regs->ctrlclock |= xclk_val; data->camera_regs->ctrlclock |= xclk_val;
data->camera_regs->ctrlclock |= CAMEXCLK_EN; data->camera_regs->ctrlclock |= CAMEXCLK_EN;
return (data->ocp_clk/divisor); return (data->ocp_clk / divisor);
} }
static int static int omap16xxcam_open(void *priv)
omap16xxcam_open(void *priv)
{ {
struct omap16xxcam *data = (struct omap16xxcam *) priv; struct omap16xxcam *data = (struct omap16xxcam *)priv;
int ret; int ret;
if ((ret = request_irq(INT_CAMERA, omap16xx_cam_isr, IRQF_DISABLED, ret = request_irq(INT_CAMERA, omap16xx_cam_isr, IRQF_DISABLED,
"camera", data))) { "camera", data);
printk("FAILED to aquire irq\n"); if (ret) {
printk(KERN_ERR "FAILED to acquire IRQ\n");
return ret; return ret;
} }
...@@ -488,22 +483,20 @@ omap16xxcam_open(void *priv) ...@@ -488,22 +483,20 @@ omap16xxcam_open(void *priv)
return omap16xx_cam_link_open(data); return omap16xx_cam_link_open(data);
} }
static int static int omap16xxcam_close(void *priv)
omap16xxcam_close(void *priv)
{ {
struct omap16xxcam *data = (struct omap16xxcam *) priv; struct omap16xxcam *data = (struct omap16xxcam *)priv;
omap16xxcam_disable(priv); omap16xxcam_disable(priv);
free_irq(INT_CAMERA, data); free_irq(INT_CAMERA, data);
return omap16xx_cam_link_close(data); return omap16xx_cam_link_close(data);
} }
static int static int omap16xxcam_cleanup(void *priv)
omap16xxcam_cleanup(void *priv)
{ {
struct omap16xxcam *data = (struct omap16xxcam *) priv; struct omap16xxcam *data = (struct omap16xxcam *)priv;
if (!data->camera_regs) if (!data->camera_regs)
return -EINVAL; return -EINVAL;
...@@ -511,7 +504,7 @@ omap16xxcam_cleanup(void *priv) ...@@ -511,7 +504,7 @@ omap16xxcam_cleanup(void *priv)
omap16xxcam_disable(data); omap16xxcam_disable(data);
if (cpu_is_omap1710()) if (cpu_is_omap1710())
iounmap((void *)data->camera_regs); iounmap((void *)data->camera_regs);
data->camera_regs= NULL; data->camera_regs = NULL;
if (data->iobase_phys) { if (data->iobase_phys) {
release_mem_region(data->iobase_phys, CAMERA_IOSIZE); release_mem_region(data->iobase_phys, CAMERA_IOSIZE);
...@@ -527,9 +520,8 @@ omap16xxcam_cleanup(void *priv) ...@@ -527,9 +520,8 @@ omap16xxcam_cleanup(void *priv)
return 0; return 0;
} }
/* Initialise the OMAP camera interface */ /* Initialize the OMAP camera interface */
static void * static void *omap16xxcam_init(void)
omap16xxcam_init(void)
{ {
unsigned long cam_iobase; unsigned long cam_iobase;
...@@ -540,36 +532,34 @@ omap16xxcam_init(void) ...@@ -540,36 +532,34 @@ omap16xxcam_init(void)
} }
if (cpu_is_omap1710()) { if (cpu_is_omap1710()) {
cam_iobase = (unsigned long) ioremap (CAMERA_BASE, cam_iobase = (unsigned long)ioremap(CAMERA_BASE, CAMERA_IOSIZE);
CAMERA_IOSIZE);
if (!cam_iobase) { if (!cam_iobase) {
printk("CANNOT MAP CAMERA REGISTER\n"); printk(KERN_ERR "CANNOT MAP CAMERA REGISTER\n");
return NULL; return NULL;
} }
} } else
else
cam_iobase = io_p2v(CAMERA_BASE); cam_iobase = io_p2v(CAMERA_BASE);
/* Set the base address of the camera registers */ /* Set the base address of the camera registers */
hardware_data.camera_regs = (camera_regs_t *)cam_iobase; hardware_data.camera_regs = (camera_regs_t *) cam_iobase;
hardware_data.iobase_phys = (unsigned long) CAMERA_BASE; 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()) if (cpu_is_omap1710())
hardware_data.func_clk = clk_get(0, "tc2_ck"); hardware_data.func_clk = clk_get(0, "tc2_ck");
else else
hardware_data.func_clk = clk_get(0, "armper_ck"); hardware_data.func_clk = clk_get(0, "armper_ck");
hardware_data.ocp_clk = clk_get_rate(hardware_data.func_clk); hardware_data.ocp_clk = clk_get_rate(hardware_data.func_clk);
/* Init the camera IF */ /* Initialize the camera IF */
omap16xx_cam_init(); omap16xx_cam_init();
/* enable it. This is needed for sensor detection */ /* Enable it. This is needed for sensor detection */
omap16xxcam_enable((void*)&hardware_data); omap16xxcam_enable((void *)&hardware_data);
/* Init dma data */ /* Initialize DMA data */
spin_lock_init(&hardware_data.dma_lock); spin_lock_init(&hardware_data.dma_lock);
init_waitqueue_head(&hardware_data.vsync_wait); init_waitqueue_head(&hardware_data.vsync_wait);
return (void*)&hardware_data; return (void *)&hardware_data;
} }
struct camera_hardware camera_hardware_if = { struct camera_hardware camera_hardware_if = {
...@@ -587,4 +577,3 @@ struct camera_hardware camera_hardware_if = { ...@@ -587,4 +577,3 @@ struct camera_hardware camera_hardware_if = {
.start_dma = omap16xxcam_start_dma, .start_dma = omap16xxcam_start_dma,
.finish_dma = omap16xxcam_finish_dma, .finish_dma = omap16xxcam_finish_dma,
}; };
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment