linux/drivers/media/video/omap3isp/ispccdc.h
<<
>>
Prefs
   1/*
   2 * ispccdc.h
   3 *
   4 * TI OMAP3 ISP - CCDC module
   5 *
   6 * Copyright (C) 2009-2010 Nokia Corporation
   7 * Copyright (C) 2009 Texas Instruments, Inc.
   8 *
   9 * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  10 *           Sakari Ailus <sakari.ailus@iki.fi>
  11 *
  12 * This program is free software; you can redistribute it and/or modify
  13 * it under the terms of the GNU General Public License version 2 as
  14 * published by the Free Software Foundation.
  15 *
  16 * This program is distributed in the hope that it will be useful, but
  17 * WITHOUT ANY WARRANTY; without even the implied warranty of
  18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  19 * General Public License for more details.
  20 *
  21 * You should have received a copy of the GNU General Public License
  22 * along with this program; if not, write to the Free Software
  23 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  24 * 02110-1301 USA
  25 */
  26
  27#ifndef OMAP3_ISP_CCDC_H
  28#define OMAP3_ISP_CCDC_H
  29
  30#include <linux/omap3isp.h>
  31#include <linux/workqueue.h>
  32
  33#include "ispvideo.h"
  34
  35enum ccdc_input_entity {
  36        CCDC_INPUT_NONE,
  37        CCDC_INPUT_PARALLEL,
  38        CCDC_INPUT_CSI2A,
  39        CCDC_INPUT_CCP2B,
  40        CCDC_INPUT_CSI2C
  41};
  42
  43#define CCDC_OUTPUT_MEMORY      (1 << 0)
  44#define CCDC_OUTPUT_PREVIEW     (1 << 1)
  45#define CCDC_OUTPUT_RESIZER     (1 << 2)
  46
  47#define OMAP3ISP_CCDC_NEVENTS   16
  48
  49/*
  50 * struct ispccdc_syncif - Structure for Sync Interface between sensor and CCDC
  51 * @ccdc_mastermode: Master mode. 1 - Master, 0 - Slave.
  52 * @fldstat: Field state. 0 - Odd Field, 1 - Even Field.
  53 * @datsz: Data size.
  54 * @fldmode: 0 - Progressive, 1 - Interlaced.
  55 * @datapol: 0 - Positive, 1 - Negative.
  56 * @fldpol: 0 - Positive, 1 - Negative.
  57 * @hdpol: 0 - Positive, 1 - Negative.
  58 * @vdpol: 0 - Positive, 1 - Negative.
  59 * @fldout: 0 - Input, 1 - Output.
  60 * @hs_width: Width of the Horizontal Sync pulse, used for HS/VS Output.
  61 * @vs_width: Width of the Vertical Sync pulse, used for HS/VS Output.
  62 * @ppln: Number of pixels per line, used for HS/VS Output.
  63 * @hlprf: Number of half lines per frame, used for HS/VS Output.
  64 * @bt_r656_en: 1 - Enable ITU-R BT656 mode, 0 - Sync mode.
  65 */
  66struct ispccdc_syncif {
  67        u8 ccdc_mastermode;
  68        u8 fldstat;
  69        u8 datsz;
  70        u8 fldmode;
  71        u8 datapol;
  72        u8 fldpol;
  73        u8 hdpol;
  74        u8 vdpol;
  75        u8 fldout;
  76        u8 hs_width;
  77        u8 vs_width;
  78        u8 ppln;
  79        u8 hlprf;
  80        u8 bt_r656_en;
  81};
  82
  83/*
  84 * struct ispccdc_vp - Structure for Video Port parameters
  85 * @pixelclk: Input pixel clock in Hz
  86 */
  87struct ispccdc_vp {
  88        unsigned int pixelclk;
  89};
  90
  91enum ispccdc_lsc_state {
  92        LSC_STATE_STOPPED = 0,
  93        LSC_STATE_STOPPING = 1,
  94        LSC_STATE_RUNNING = 2,
  95        LSC_STATE_RECONFIG = 3,
  96};
  97
  98struct ispccdc_lsc_config_req {
  99        struct list_head list;
 100        struct omap3isp_ccdc_lsc_config config;
 101        unsigned char enable;
 102        u32 table;
 103        struct iovm_struct *iovm;
 104};
 105
 106/*
 107 * ispccdc_lsc - CCDC LSC parameters
 108 * @update_config: Set when user changes config
 109 * @request_enable: Whether LSC is requested to be enabled
 110 * @config: LSC config set by user
 111 * @update_table: Set when user provides a new LSC table to table_new
 112 * @table_new: LSC table set by user, ISP address
 113 * @table_inuse: LSC table currently in use, ISP address
 114 */
 115struct ispccdc_lsc {
 116        enum ispccdc_lsc_state state;
 117        struct work_struct table_work;
 118
 119        /* LSC queue of configurations */
 120        spinlock_t req_lock;
 121        struct ispccdc_lsc_config_req *request; /* requested configuration */
 122        struct ispccdc_lsc_config_req *active;  /* active configuration */
 123        struct list_head free_queue;    /* configurations for freeing */
 124};
 125
 126#define CCDC_STOP_NOT_REQUESTED         0x00
 127#define CCDC_STOP_REQUEST               0x01
 128#define CCDC_STOP_EXECUTED              (0x02 | CCDC_STOP_REQUEST)
 129#define CCDC_STOP_CCDC_FINISHED         0x04
 130#define CCDC_STOP_LSC_FINISHED          0x08
 131#define CCDC_STOP_FINISHED              \
 132        (CCDC_STOP_EXECUTED | CCDC_STOP_CCDC_FINISHED | CCDC_STOP_LSC_FINISHED)
 133
 134#define CCDC_EVENT_VD1                  0x10
 135#define CCDC_EVENT_VD0                  0x20
 136#define CCDC_EVENT_LSC_DONE             0x40
 137
 138/* Sink and source CCDC pads */
 139#define CCDC_PAD_SINK                   0
 140#define CCDC_PAD_SOURCE_OF              1
 141#define CCDC_PAD_SOURCE_VP              2
 142#define CCDC_PADS_NUM                   3
 143
 144/*
 145 * struct isp_ccdc_device - Structure for the CCDC module to store its own
 146 *                          information
 147 * @subdev: V4L2 subdevice
 148 * @pads: Sink and source media entity pads
 149 * @formats: Active video formats
 150 * @input: Active input
 151 * @output: Active outputs
 152 * @video_out: Output video node
 153 * @error: A hardware error occurred during capture
 154 * @alaw: A-law compression enabled (1) or disabled (0)
 155 * @lpf: Low pass filter enabled (1) or disabled (0)
 156 * @obclamp: Optical-black clamp enabled (1) or disabled (0)
 157 * @fpc_en: Faulty pixels correction enabled (1) or disabled (0)
 158 * @blcomp: Black level compensation configuration
 159 * @clamp: Optical-black or digital clamp configuration
 160 * @fpc: Faulty pixels correction configuration
 161 * @lsc: Lens shading compensation configuration
 162 * @update: Bitmask of controls to update during the next interrupt
 163 * @shadow_update: Controls update in progress by userspace
 164 * @syncif: Interface synchronization configuration
 165 * @vpcfg: Video port configuration
 166 * @underrun: A buffer underrun occurred and a new buffer has been queued
 167 * @state: Streaming state
 168 * @lock: Serializes shadow_update with interrupt handler
 169 * @wait: Wait queue used to stop the module
 170 * @stopping: Stopping state
 171 * @ioctl_lock: Serializes ioctl calls and LSC requests freeing
 172 */
 173struct isp_ccdc_device {
 174        struct v4l2_subdev subdev;
 175        struct media_pad pads[CCDC_PADS_NUM];
 176        struct v4l2_mbus_framefmt formats[CCDC_PADS_NUM];
 177
 178        enum ccdc_input_entity input;
 179        unsigned int output;
 180        struct isp_video video_out;
 181        unsigned int error;
 182
 183        unsigned int alaw:1,
 184                     lpf:1,
 185                     obclamp:1,
 186                     fpc_en:1;
 187        struct omap3isp_ccdc_blcomp blcomp;
 188        struct omap3isp_ccdc_bclamp clamp;
 189        struct omap3isp_ccdc_fpc fpc;
 190        struct ispccdc_lsc lsc;
 191        unsigned int update;
 192        unsigned int shadow_update;
 193
 194        struct ispccdc_syncif syncif;
 195        struct ispccdc_vp vpcfg;
 196
 197        unsigned int underrun:1;
 198        enum isp_pipeline_stream_state state;
 199        spinlock_t lock;
 200        wait_queue_head_t wait;
 201        unsigned int stopping;
 202        struct mutex ioctl_lock;
 203};
 204
 205struct isp_device;
 206
 207int omap3isp_ccdc_init(struct isp_device *isp);
 208void omap3isp_ccdc_cleanup(struct isp_device *isp);
 209int omap3isp_ccdc_register_entities(struct isp_ccdc_device *ccdc,
 210        struct v4l2_device *vdev);
 211void omap3isp_ccdc_unregister_entities(struct isp_ccdc_device *ccdc);
 212
 213int omap3isp_ccdc_busy(struct isp_ccdc_device *isp_ccdc);
 214int omap3isp_ccdc_isr(struct isp_ccdc_device *isp_ccdc, u32 events);
 215void omap3isp_ccdc_restore_context(struct isp_device *isp);
 216void omap3isp_ccdc_max_rate(struct isp_ccdc_device *ccdc,
 217        unsigned int *max_rate);
 218
 219#endif  /* OMAP3_ISP_CCDC_H */
 220