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