ispccdc.h revision d33186d0be1823d2ae397d620e623e5592288e18
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
49de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartenum ispccdc_lsc_state {
50de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	LSC_STATE_STOPPED = 0,
51de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	LSC_STATE_STOPPING = 1,
52de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	LSC_STATE_RUNNING = 2,
53de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	LSC_STATE_RECONFIG = 3,
54de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart};
55de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart
56de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartstruct ispccdc_lsc_config_req {
57de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	struct list_head list;
58de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	struct omap3isp_ccdc_lsc_config config;
59de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	unsigned char enable;
60d33186d0be1823d2ae397d620e623e5592288e18Laurent Pinchart
61d33186d0be1823d2ae397d620e623e5592288e18Laurent Pinchart	struct {
62d33186d0be1823d2ae397d620e623e5592288e18Laurent Pinchart		void *addr;
63d33186d0be1823d2ae397d620e623e5592288e18Laurent Pinchart		dma_addr_t dma;
64d33186d0be1823d2ae397d620e623e5592288e18Laurent Pinchart		struct sg_table sgt;
65d33186d0be1823d2ae397d620e623e5592288e18Laurent Pinchart	} table;
66de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart};
67de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart
68de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart/*
69de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * ispccdc_lsc - CCDC LSC parameters
70de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart */
71de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartstruct ispccdc_lsc {
72de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	enum ispccdc_lsc_state state;
73de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	struct work_struct table_work;
74de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart
75de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	/* LSC queue of configurations */
76de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	spinlock_t req_lock;
77de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	struct ispccdc_lsc_config_req *request;	/* requested configuration */
78de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	struct ispccdc_lsc_config_req *active;	/* active configuration */
79de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	struct list_head free_queue;	/* configurations for freeing */
80de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart};
81de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart
82de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_STOP_NOT_REQUESTED		0x00
83de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_STOP_REQUEST		0x01
84de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_STOP_EXECUTED		(0x02 | CCDC_STOP_REQUEST)
85de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_STOP_CCDC_FINISHED		0x04
86de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_STOP_LSC_FINISHED		0x08
87de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_STOP_FINISHED		\
88de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	(CCDC_STOP_EXECUTED | CCDC_STOP_CCDC_FINISHED | CCDC_STOP_LSC_FINISHED)
89de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart
90de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_EVENT_VD1			0x10
91de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_EVENT_VD0			0x20
92de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_EVENT_LSC_DONE		0x40
93de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart
94de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart/* Sink and source CCDC pads */
95de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_PAD_SINK			0
96de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_PAD_SOURCE_OF		1
97de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_PAD_SOURCE_VP		2
98de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#define CCDC_PADS_NUM			3
99de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent 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
12025985edcedea6396277003854657b5f3cb31a628Lucas De Marchi * @underrun: A buffer underrun occurred and a new buffer has been queued
121de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @state: Streaming state
122de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @lock: Serializes shadow_update with interrupt handler
123de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @wait: Wait queue used to stop the module
124de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @stopping: Stopping state
125de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart * @ioctl_lock: Serializes ioctl calls and LSC requests freeing
126de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart */
127de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartstruct isp_ccdc_device {
128de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	struct v4l2_subdev subdev;
129de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	struct media_pad pads[CCDC_PADS_NUM];
130de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	struct v4l2_mbus_framefmt formats[CCDC_PADS_NUM];
131a64909b806b156fd4579c948bbbdb15095f55058Laurent Pinchart	struct v4l2_rect crop;
132de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart
133de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	enum ccdc_input_entity input;
134de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	unsigned int output;
135de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	struct isp_video video_out;
136de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart
137de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	unsigned int alaw:1,
138de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart		     lpf:1,
139de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart		     obclamp:1,
140de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart		     fpc_en:1;
141de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	struct omap3isp_ccdc_blcomp blcomp;
142de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	struct omap3isp_ccdc_bclamp clamp;
143de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	struct omap3isp_ccdc_fpc fpc;
144de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	struct ispccdc_lsc lsc;
145de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	unsigned int update;
146de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	unsigned int shadow_update;
147de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart
148de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	unsigned int underrun:1;
149de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	enum isp_pipeline_stream_state state;
150de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	spinlock_t lock;
151de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	wait_queue_head_t wait;
152de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	unsigned int stopping;
153de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	struct mutex ioctl_lock;
154de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart};
155de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart
156de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartstruct isp_device;
157de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart
158de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartint omap3isp_ccdc_init(struct isp_device *isp);
159de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartvoid omap3isp_ccdc_cleanup(struct isp_device *isp);
160de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartint omap3isp_ccdc_register_entities(struct isp_ccdc_device *ccdc,
161de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	struct v4l2_device *vdev);
162de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartvoid omap3isp_ccdc_unregister_entities(struct isp_ccdc_device *ccdc);
163de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart
164de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartint omap3isp_ccdc_busy(struct isp_ccdc_device *isp_ccdc);
165de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartint omap3isp_ccdc_isr(struct isp_ccdc_device *isp_ccdc, u32 events);
166de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartvoid omap3isp_ccdc_restore_context(struct isp_device *isp);
167de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchartvoid omap3isp_ccdc_max_rate(struct isp_ccdc_device *ccdc,
168de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart	unsigned int *max_rate);
169de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart
170de1135d44f4f25bee5a22d92e7cf2de64ded0dcaLaurent Pinchart#endif	/* OMAP3_ISP_CCDC_H */
171