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