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 17de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#ifndef OMAP3_ISP_CCDC_H 18de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define OMAP3_ISP_CCDC_H 19de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 20de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#include <linux/omap3isp.h> 21de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#include <linux/workqueue.h> 22de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 23de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#include "ispvideo.h" 24de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 25de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartenum ccdc_input_entity { 26de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart CCDC_INPUT_NONE, 27de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart CCDC_INPUT_PARALLEL, 28de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart CCDC_INPUT_CSI2A, 29de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart CCDC_INPUT_CCP2B, 30de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart CCDC_INPUT_CSI2C 31de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart}; 32de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 33de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_OUTPUT_MEMORY (1 << 0) 34de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_OUTPUT_PREVIEW (1 << 1) 35de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_OUTPUT_RESIZER (1 << 2) 36de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 37de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define OMAP3ISP_CCDC_NEVENTS 16 38de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 39c60e153d3407b5a94b72ebfcf274fae98979eed9Laurent Pinchartstruct ispccdc_fpc { 40c60e153d3407b5a94b72ebfcf274fae98979eed9Laurent Pinchart void *addr; 41c60e153d3407b5a94b72ebfcf274fae98979eed9Laurent Pinchart dma_addr_t dma; 42c60e153d3407b5a94b72ebfcf274fae98979eed9Laurent Pinchart unsigned int fpnum; 43c60e153d3407b5a94b72ebfcf274fae98979eed9Laurent Pinchart}; 44c60e153d3407b5a94b72ebfcf274fae98979eed9Laurent Pinchart 45de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartenum ispccdc_lsc_state { 46de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart LSC_STATE_STOPPED = 0, 47de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart LSC_STATE_STOPPING = 1, 48de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart LSC_STATE_RUNNING = 2, 49de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart LSC_STATE_RECONFIG = 3, 50de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart}; 51de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 52de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartstruct ispccdc_lsc_config_req { 53de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct list_head list; 54de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct omap3isp_ccdc_lsc_config config; 55de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart unsigned char enable; 56d33186d0be1823d2ae397d620e623e5592288e18Laurent Pinchart 57d33186d0be1823d2ae397d620e623e5592288e18Laurent Pinchart struct { 58d33186d0be1823d2ae397d620e623e5592288e18Laurent Pinchart void *addr; 59d33186d0be1823d2ae397d620e623e5592288e18Laurent Pinchart dma_addr_t dma; 60d33186d0be1823d2ae397d620e623e5592288e18Laurent Pinchart struct sg_table sgt; 61d33186d0be1823d2ae397d620e623e5592288e18Laurent Pinchart } table; 62de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart}; 63de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 64de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart/* 65de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * ispccdc_lsc - CCDC LSC parameters 66de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart */ 67de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartstruct ispccdc_lsc { 68de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart enum ispccdc_lsc_state state; 69de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct work_struct table_work; 70de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 71de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart /* LSC queue of configurations */ 72de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart spinlock_t req_lock; 73de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct ispccdc_lsc_config_req *request; /* requested configuration */ 74de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct ispccdc_lsc_config_req *active; /* active configuration */ 75de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct list_head free_queue; /* configurations for freeing */ 76de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart}; 77de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 78de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_STOP_NOT_REQUESTED 0x00 79de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_STOP_REQUEST 0x01 80de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_STOP_EXECUTED (0x02 | CCDC_STOP_REQUEST) 81de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_STOP_CCDC_FINISHED 0x04 82de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_STOP_LSC_FINISHED 0x08 83de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_STOP_FINISHED \ 84de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart (CCDC_STOP_EXECUTED | CCDC_STOP_CCDC_FINISHED | CCDC_STOP_LSC_FINISHED) 85de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 86de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_EVENT_VD1 0x10 87de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_EVENT_VD0 0x20 88de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_EVENT_LSC_DONE 0x40 89de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 90de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart/* Sink and source CCDC pads */ 91de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_PAD_SINK 0 92de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_PAD_SOURCE_OF 1 93de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_PAD_SOURCE_VP 2 94de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_PADS_NUM 3 95de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 9693d7badf1b929120cbc886f3dfec3ca55549d086Laurent Pinchart#define CCDC_FIELD_TOP 1 9793d7badf1b929120cbc886f3dfec3ca55549d086Laurent Pinchart#define CCDC_FIELD_BOTTOM 2 9893d7badf1b929120cbc886f3dfec3ca55549d086Laurent Pinchart#define CCDC_FIELD_BOTH 3 9993d7badf1b929120cbc886f3dfec3ca55549d086Laurent Pinchart 100de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart/* 101de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * struct isp_ccdc_device - Structure for the CCDC module to store its own 102de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * information 103de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @subdev: V4L2 subdevice 104de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @pads: Sink and source media entity pads 105de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @formats: Active video formats 106a64909b806b156fd4579c948bbbdb15095f55058Laurent Pinchart * @crop: Active crop rectangle on the OF source pad 107de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @input: Active input 108de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @output: Active outputs 109de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @video_out: Output video node 110de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @alaw: A-law compression enabled (1) or disabled (0) 111de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @lpf: Low pass filter enabled (1) or disabled (0) 112de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @obclamp: Optical-black clamp enabled (1) or disabled (0) 113de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @fpc_en: Faulty pixels correction enabled (1) or disabled (0) 114de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @blcomp: Black level compensation configuration 115de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @clamp: Optical-black or digital clamp configuration 116de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @fpc: Faulty pixels correction configuration 117de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @lsc: Lens shading compensation configuration 118de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @update: Bitmask of controls to update during the next interrupt 119de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @shadow_update: Controls update in progress by userspace 1209de7af4d5bbff7998c09e854b2999359ac1b2721Laurent Pinchart * @bt656: Whether the input interface uses BT.656 synchronization 12193d7badf1b929120cbc886f3dfec3ca55549d086Laurent Pinchart * @fields: The fields (CCDC_FIELD_*) stored in the current buffer 12225985edcedea6396277003854657b5f3cb31a628Lucas De Marchi * @underrun: A buffer underrun occurred and a new buffer has been queued 123de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @state: Streaming state 124de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @lock: Serializes shadow_update with interrupt handler 125de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @wait: Wait queue used to stop the module 126de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @stopping: Stopping state 1270b3fcd5727e835c60de46d33b2f5f5803c4a5de7Laurent Pinchart * @running: Is the CCDC hardware running 128de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @ioctl_lock: Serializes ioctl calls and LSC requests freeing 129de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart */ 130de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartstruct isp_ccdc_device { 131de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct v4l2_subdev subdev; 132de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct media_pad pads[CCDC_PADS_NUM]; 133de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct v4l2_mbus_framefmt formats[CCDC_PADS_NUM]; 134a64909b806b156fd4579c948bbbdb15095f55058Laurent Pinchart struct v4l2_rect crop; 135de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 136de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart enum ccdc_input_entity input; 137de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart unsigned int output; 138de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct isp_video video_out; 139de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 140de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart unsigned int alaw:1, 141de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart lpf:1, 142de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart obclamp:1, 143de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart fpc_en:1; 144de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct omap3isp_ccdc_blcomp blcomp; 145de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct omap3isp_ccdc_bclamp clamp; 146c60e153d3407b5a94b72ebfcf274fae98979eed9Laurent Pinchart struct ispccdc_fpc fpc; 147de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct ispccdc_lsc lsc; 148de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart unsigned int update; 149de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart unsigned int shadow_update; 150de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 1519de7af4d5bbff7998c09e854b2999359ac1b2721Laurent Pinchart bool bt656; 15293d7badf1b929120cbc886f3dfec3ca55549d086Laurent Pinchart unsigned int fields; 15393d7badf1b929120cbc886f3dfec3ca55549d086Laurent 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; 1590b3fcd5727e835c60de46d33b2f5f5803c4a5de7Laurent Pinchart bool running; 160de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct mutex ioctl_lock; 161de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart}; 162de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 163de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartstruct isp_device; 164de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 165de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartint omap3isp_ccdc_init(struct isp_device *isp); 166de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartvoid omap3isp_ccdc_cleanup(struct isp_device *isp); 167de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartint omap3isp_ccdc_register_entities(struct isp_ccdc_device *ccdc, 168de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart struct v4l2_device *vdev); 169de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartvoid omap3isp_ccdc_unregister_entities(struct isp_ccdc_device *ccdc); 170de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 171de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartint omap3isp_ccdc_busy(struct isp_ccdc_device *isp_ccdc); 172de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartint omap3isp_ccdc_isr(struct isp_ccdc_device *isp_ccdc, u32 events); 173de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartvoid omap3isp_ccdc_restore_context(struct isp_device *isp); 174de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartvoid omap3isp_ccdc_max_rate(struct isp_ccdc_device *ccdc, 175de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart unsigned int *max_rate); 176de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart 177de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#endif /* OMAP3_ISP_CCDC_H */ 178