ispccdc.h revision c60e153d3407b5a94b72ebfcf274fae98979eed9
1de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart/* 2de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * ispccdc.h 3de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * 4de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * TI OMAP3 ISP - CCDC module 5de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * 6de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * Copyright (C) 2009-2010 Nokia Corporation 7de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * Copyright (C) 2009 Texas Instruments, Inc. 8de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * 9de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com> 10de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * Sakari Ailus <sakari.ailus@iki.fi> 11de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * 12de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * This program is free software; you can redistribute it and/or modify 13de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * it under the terms of the GNU General Public License version 2 as 14de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * published by the Free Software Foundation. 15de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * 16de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * This program is distributed in the hope that it will be useful, but 17de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * WITHOUT ANY WARRANTY; without even the implied warranty of 18de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 19de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * General Public License for more details. 20de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * 21de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * You should have received a copy of the GNU General Public License 22de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * along with this program; if not, write to the Free Software 23de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 24de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * 02110-1301 USA 25de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart */ 26de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 27de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#ifndef OMAP3_ISP_CCDC_H 28de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define OMAP3_ISP_CCDC_H 29de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 30de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#include <linux/omap3isp.h> 31de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#include <linux/workqueue.h> 32de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 33de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#include "ispvideo.h" 34de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 35de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartenum ccdc_input_entity { 36de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart CCDC_INPUT_NONE, 37de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart CCDC_INPUT_PARALLEL, 38de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart CCDC_INPUT_CSI2A, 39de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart CCDC_INPUT_CCP2B, 40de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart CCDC_INPUT_CSI2C 41de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart}; 42de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 43de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_OUTPUT_MEMORY (1 << 0) 44de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_OUTPUT_PREVIEW (1 << 1) 45de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_OUTPUT_RESIZER (1 << 2) 46de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 47de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define OMAP3ISP_CCDC_NEVENTS 16 48de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 49c60e153d3407b5a94b72ebfcf274fae98979eed9Laurent Pinchartstruct ispccdc_fpc { 50c60e153d3407b5a94b72ebfcf274fae98979eed9Laurent Pinchart void *addr; 51c60e153d3407b5a94b72ebfcf274fae98979eed9Laurent Pinchart dma_addr_t dma; 52c60e153d3407b5a94b72ebfcf274fae98979eed9Laurent Pinchart unsigned int fpnum; 53c60e153d3407b5a94b72ebfcf274fae98979eed9Laurent Pinchart}; 54c60e153d3407b5a94b72ebfcf274fae98979eed9Laurent Pinchart 55de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartenum ispccdc_lsc_state { 56de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart LSC_STATE_STOPPED = 0, 57de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart LSC_STATE_STOPPING = 1, 58de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart LSC_STATE_RUNNING = 2, 59de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart LSC_STATE_RECONFIG = 3, 60de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart}; 61de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 62de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartstruct ispccdc_lsc_config_req { 63de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct list_head list; 64de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct omap3isp_ccdc_lsc_config config; 65de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart unsigned char enable; 66d33186d0be1823d2ae397d620e623e5592288e18Laurent Pinchart 67d33186d0be1823d2ae397d620e623e5592288e18Laurent Pinchart struct { 68d33186d0be1823d2ae397d620e623e5592288e18Laurent Pinchart void *addr; 69d33186d0be1823d2ae397d620e623e5592288e18Laurent Pinchart dma_addr_t dma; 70d33186d0be1823d2ae397d620e623e5592288e18Laurent Pinchart struct sg_table sgt; 71d33186d0be1823d2ae397d620e623e5592288e18Laurent Pinchart } table; 72de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart}; 73de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 74de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart/* 75de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * ispccdc_lsc - CCDC LSC parameters 76de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart */ 77de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartstruct ispccdc_lsc { 78de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart enum ispccdc_lsc_state state; 79de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct work_struct table_work; 80de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 81de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart /* LSC queue of configurations */ 82de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart spinlock_t req_lock; 83de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct ispccdc_lsc_config_req *request; /* requested configuration */ 84de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct ispccdc_lsc_config_req *active; /* active configuration */ 85de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct list_head free_queue; /* configurations for freeing */ 86de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart}; 87de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 88de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_STOP_NOT_REQUESTED 0x00 89de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_STOP_REQUEST 0x01 90de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_STOP_EXECUTED (0x02 | CCDC_STOP_REQUEST) 91de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_STOP_CCDC_FINISHED 0x04 92de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_STOP_LSC_FINISHED 0x08 93de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_STOP_FINISHED \ 94de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart (CCDC_STOP_EXECUTED | CCDC_STOP_CCDC_FINISHED | CCDC_STOP_LSC_FINISHED) 95de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 96de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_EVENT_VD1 0x10 97de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_EVENT_VD0 0x20 98de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_EVENT_LSC_DONE 0x40 99de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 100de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart/* Sink and source CCDC pads */ 101de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_PAD_SINK 0 102de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_PAD_SOURCE_OF 1 103de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_PAD_SOURCE_VP 2 104de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_PADS_NUM 3 105de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 106de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart/* 107de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * struct isp_ccdc_device - Structure for the CCDC module to store its own 108de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * information 109de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @subdev: V4L2 subdevice 110de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @pads: Sink and source media entity pads 111de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @formats: Active video formats 112a64909b806b156fd4579c948bbbdb15095f55058Laurent Pinchart * @crop: Active crop rectangle on the OF source pad 113de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @input: Active input 114de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @output: Active outputs 115de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @video_out: Output video node 116de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @alaw: A-law compression enabled (1) or disabled (0) 117de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @lpf: Low pass filter enabled (1) or disabled (0) 118de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @obclamp: Optical-black clamp enabled (1) or disabled (0) 119de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @fpc_en: Faulty pixels correction enabled (1) or disabled (0) 120de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @blcomp: Black level compensation configuration 121de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @clamp: Optical-black or digital clamp configuration 122de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @fpc: Faulty pixels correction configuration 123de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @lsc: Lens shading compensation configuration 124de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @update: Bitmask of controls to update during the next interrupt 125de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @shadow_update: Controls update in progress by userspace 12625985edcedea6396277003854657b5f3cb31a628Lucas De Marchi * @underrun: A buffer underrun occurred and a new buffer has been queued 127de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @state: Streaming state 128de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @lock: Serializes shadow_update with interrupt handler 129de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @wait: Wait queue used to stop the module 130de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @stopping: Stopping state 131de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @ioctl_lock: Serializes ioctl calls and LSC requests freeing 132de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart */ 133de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartstruct isp_ccdc_device { 134de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct v4l2_subdev subdev; 135de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct media_pad pads[CCDC_PADS_NUM]; 136de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct v4l2_mbus_framefmt formats[CCDC_PADS_NUM]; 137a64909b806b156fd4579c948bbbdb15095f55058Laurent Pinchart struct v4l2_rect crop; 138de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 139de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart enum ccdc_input_entity input; 140de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart unsigned int output; 141de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct isp_video video_out; 142de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 143de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart unsigned int alaw:1, 144de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart lpf:1, 145de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart obclamp:1, 146de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart fpc_en:1; 147de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct omap3isp_ccdc_blcomp blcomp; 148de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct omap3isp_ccdc_bclamp clamp; 149c60e153d3407b5a94b72ebfcf274fae98979eed9Laurent Pinchart struct ispccdc_fpc fpc; 150de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct ispccdc_lsc lsc; 151de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart unsigned int update; 152de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart unsigned int shadow_update; 153de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 154de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart unsigned int underrun:1; 155de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart enum isp_pipeline_stream_state state; 156de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart spinlock_t lock; 157de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart wait_queue_head_t wait; 158de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart unsigned int stopping; 159de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct mutex ioctl_lock; 160de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart}; 161de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 162de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartstruct isp_device; 163de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 164de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartint omap3isp_ccdc_init(struct isp_device *isp); 165de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartvoid omap3isp_ccdc_cleanup(struct isp_device *isp); 166de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartint omap3isp_ccdc_register_entities(struct isp_ccdc_device *ccdc, 167de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct v4l2_device *vdev); 168de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartvoid omap3isp_ccdc_unregister_entities(struct isp_ccdc_device *ccdc); 169de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 170de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartint omap3isp_ccdc_busy(struct isp_ccdc_device *isp_ccdc); 171de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartint omap3isp_ccdc_isr(struct isp_ccdc_device *isp_ccdc, u32 events); 172de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartvoid omap3isp_ccdc_restore_context(struct isp_device *isp); 173de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartvoid omap3isp_ccdc_max_rate(struct isp_ccdc_device *ccdc, 174de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart unsigned int *max_rate); 175de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 176de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#endif /* OMAP3_ISP_CCDC_H */ 177