• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Frame buffer driver for ADV7393/2 video encoder
3  *
4  * Copyright 2006-2009 Analog Devices Inc.
5  * Licensed under the GPL-2 or late.
6  */
7 
8 #ifndef __BFIN_ADV7393FB_H__
9 #define __BFIN_ADV7393FB_H__
10 
11 #define BFIN_LCD_NBR_PALETTE_ENTRIES	256
12 
13 #ifdef CONFIG_NTSC
14 # define VMODE 0
15 #endif
16 #ifdef CONFIG_PAL
17 # define VMODE 1
18 #endif
19 #ifdef CONFIG_NTSC_640x480
20 # define VMODE 2
21 #endif
22 #ifdef CONFIG_PAL_640x480
23 # define VMODE 3
24 #endif
25 #ifdef CONFIG_NTSC_YCBCR
26 # define VMODE 4
27 #endif
28 #ifdef CONFIG_PAL_YCBCR
29 # define VMODE 5
30 #endif
31 
32 #ifndef VMODE
33 # define VMODE 1
34 #endif
35 
36 #ifdef CONFIG_ADV7393_2XMEM
37 # define VMEM 2
38 #else
39 # define VMEM 1
40 #endif
41 
42 #if defined(CONFIG_BF537) || defined(CONFIG_BF536) || defined(CONFIG_BF534)
43 # define DMA_CFG_VAL	0x7935	/* Set Sync Bit */
44 # define VB_DUMMY_MEMORY_SOURCE	L1_DATA_B_START
45 #else
46 # define DMA_CFG_VAL	0x7915
47 # define VB_DUMMY_MEMORY_SOURCE	BOOT_ROM_START
48 #endif
49 
50 enum {
51 	DESTRUCT,
52 	BUILD,
53 };
54 
55 enum {
56 	POWER_ON,
57 	POWER_DOWN,
58 	BLANK_ON,
59 	BLANK_OFF,
60 };
61 
62 #define DRIVER_NAME "bfin-adv7393"
63 
64 struct adv7393fb_modes {
65 	const s8 name[25];	/* Full name */
66 	u16 xres;		/* Active Horizonzal Pixels  */
67 	u16 yres;		/* Active Vertical Pixels  */
68 	u16 bpp;
69 	u16 vmode;
70 	u16 a_lines;		/* Active Lines per Field */
71 	u16 vb1_lines;		/* Vertical Blanking Field 1 Lines */
72 	u16 vb2_lines;		/* Vertical Blanking Field 2 Lines */
73 	u16 tot_lines;		/* Total Lines per Frame */
74 	u16 boeft_blank;	/* Before Odd/Even Field Transition No. of Blank Pixels */
75 	u16 aoeft_blank;	/* After Odd/Even Field Transition No. of Blank Pixels */
76 	const s8 *adv7393_i2c_initd;
77 	u16 adv7393_i2c_initd_len;
78 };
79 
80 static const u8 init_NTSC_TESTPATTERN[] = {
81 	0x00, 0x1E,	/* Power up all DACs and PLL */
82 	0x01, 0x00,	/* SD-Only Mode */
83 	0x80, 0x10,	/* SSAF Luma Filter Enabled, NTSC Mode */
84 	0x82, 0xCB,	/* Step control on, pixel data valid, pedestal on, PrPb SSAF on, CVBS/YC output */
85 	0x84, 0x40,	/* SD Color Bar Test Pattern Enabled, DAC 2 = Luma, DAC 3 = Chroma */
86 };
87 
88 static const u8 init_NTSC[] = {
89 	0x00, 0x1E,	/* Power up all DACs and PLL */
90 	0xC3, 0x26,	/* Program RGB->YCrCb Color Space conversion matrix */
91 	0xC5, 0x12,	/* Program RGB->YCrCb Color Space conversion matrix */
92 	0xC2, 0x4A,	/* Program RGB->YCrCb Color Space conversion matrix */
93 	0xC6, 0x5E,	/* Program RGB->YCrCb Color Space conversion matrix */
94 	0xBD, 0x19,	/* Program RGB->YCrCb Color Space conversion matrix */
95 	0xBF, 0x42,	/* Program RGB->YCrCb Color Space conversion matrix */
96 	0x8C, 0x1F,	/* NTSC Subcarrier Frequency */
97 	0x8D, 0x7C,	/* NTSC Subcarrier Frequency */
98 	0x8E, 0xF0,	/* NTSC Subcarrier Frequency */
99 	0x8F, 0x21,	/* NTSC Subcarrier Frequency */
100 	0x01, 0x00,	/* SD-Only Mode */
101 	0x80, 0x30,	/* SSAF Luma Filter Enabled, NTSC Mode */
102 	0x82, 0x8B,	/* Step control on, pixel data invalid, pedestal on, PrPb SSAF on, CVBS/YC output */
103 	0x87, 0x80,	/* SD Color Bar Test Pattern Enabled, DAC 2 = Luma, DAC 3 = Chroma */
104 	0x86, 0x82,
105 	0x8B, 0x11,
106 	0x88, 0x20,
107 	0x8A, 0x0d,
108 };
109 
110 static const u8 init_PAL[] = {
111 	0x00, 0x1E,	/* Power up all DACs and PLL */
112 	0xC3, 0x26,	/* Program RGB->YCrCb Color Space conversion matrix */
113 	0xC5, 0x12,	/* Program RGB->YCrCb Color Space conversion matrix */
114 	0xC2, 0x4A,	/* Program RGB->YCrCb Color Space conversion matrix */
115 	0xC6, 0x5E,	/* Program RGB->YCrCb Color Space conversion matrix */
116 	0xBD, 0x19,	/* Program RGB->YCrCb Color Space conversion matrix */
117 	0xBF, 0x42,	/* Program RGB->YCrCb Color Space conversion matrix */
118 	0x8C, 0xCB,	/* PAL Subcarrier Frequency */
119 	0x8D, 0x8A,	/* PAL Subcarrier Frequency */
120 	0x8E, 0x09,	/* PAL Subcarrier Frequency */
121 	0x8F, 0x2A,	/* PAL Subcarrier Frequency */
122 	0x01, 0x00,	/* SD-Only Mode */
123 	0x80, 0x11,	/* SSAF Luma Filter Enabled, PAL Mode */
124 	0x82, 0x8B,	/* Step control on, pixel data invalid, pedestal on, PrPb SSAF on, CVBS/YC output */
125 	0x87, 0x80,	/* SD Color Bar Test Pattern Enabled, DAC 2 = Luma, DAC 3 = Chroma */
126 	0x86, 0x82,
127 	0x8B, 0x11,
128 	0x88, 0x20,
129 	0x8A, 0x0d,
130 };
131 
132 static const u8 init_NTSC_YCbCr[] = {
133 	0x00, 0x1E,	/* Power up all DACs and PLL */
134 	0x8C, 0x1F,	/* NTSC Subcarrier Frequency */
135 	0x8D, 0x7C,	/* NTSC Subcarrier Frequency */
136 	0x8E, 0xF0,	/* NTSC Subcarrier Frequency */
137 	0x8F, 0x21,	/* NTSC Subcarrier Frequency */
138 	0x01, 0x00,	/* SD-Only Mode */
139 	0x80, 0x30,	/* SSAF Luma Filter Enabled, NTSC Mode */
140 	0x82, 0x8B,	/* Step control on, pixel data invalid, pedestal on, PrPb SSAF on, CVBS/YC output */
141 	0x87, 0x00,	/* DAC 2 = Luma, DAC 3 = Chroma */
142 	0x86, 0x82,
143 	0x8B, 0x11,
144 	0x88, 0x08,
145 	0x8A, 0x0d,
146 };
147 
148 static const u8 init_PAL_YCbCr[] = {
149 	0x00, 0x1E,	/* Power up all DACs and PLL */
150 	0x8C, 0xCB,	/* PAL Subcarrier Frequency */
151 	0x8D, 0x8A,	/* PAL Subcarrier Frequency */
152 	0x8E, 0x09,	/* PAL Subcarrier Frequency */
153 	0x8F, 0x2A,	/* PAL Subcarrier Frequency */
154 	0x01, 0x00,	/* SD-Only Mode */
155 	0x80, 0x11,	/* SSAF Luma Filter Enabled, PAL Mode */
156 	0x82, 0x8B,	/* Step control on, pixel data invalid, pedestal on, PrPb SSAF on, CVBS/YC output */
157 	0x87, 0x00,	/* DAC 2 = Luma, DAC 3 = Chroma */
158 	0x86, 0x82,
159 	0x8B, 0x11,
160 	0x88, 0x08,
161 	0x8A, 0x0d,
162 };
163 
164 static struct adv7393fb_modes known_modes[] = {
165 	/* NTSC 720x480 CRT */
166 	{
167 		.name = "NTSC 720x480",
168 		.xres = 720,
169 		.yres = 480,
170 		.bpp = 16,
171 		.vmode = FB_VMODE_INTERLACED,
172 		.a_lines = 240,
173 		.vb1_lines = 22,
174 		.vb2_lines = 23,
175 		.tot_lines = 525,
176 		.boeft_blank = 16,
177 		.aoeft_blank = 122,
178 		.adv7393_i2c_initd = init_NTSC,
179 		.adv7393_i2c_initd_len = sizeof(init_NTSC)
180 	},
181 	/* PAL 720x480 CRT */
182 	{
183 		.name = "PAL 720x576",
184 		.xres = 720,
185 		.yres = 576,
186 		.bpp = 16,
187 		.vmode = FB_VMODE_INTERLACED,
188 		.a_lines = 288,
189 		.vb1_lines = 24,
190 		.vb2_lines = 25,
191 		.tot_lines = 625,
192 		.boeft_blank = 12,
193 		.aoeft_blank = 132,
194 		.adv7393_i2c_initd = init_PAL,
195 		.adv7393_i2c_initd_len = sizeof(init_PAL)
196 	},
197 	/* NTSC 640x480 CRT Experimental */
198 	{
199 		.name = "NTSC 640x480",
200 		.xres = 640,
201 		.yres = 480,
202 		.bpp = 16,
203 		.vmode = FB_VMODE_INTERLACED,
204 		.a_lines = 240,
205 		.vb1_lines = 22,
206 		.vb2_lines = 23,
207 		.tot_lines = 525,
208 		.boeft_blank = 16 + 40,
209 		.aoeft_blank = 122 + 40,
210 		.adv7393_i2c_initd = init_NTSC,
211 		.adv7393_i2c_initd_len = sizeof(init_NTSC)
212 	},
213 	/* PAL 640x480 CRT Experimental */
214 	{
215 		.name = "PAL 640x480",
216 		.xres = 640,
217 		.yres = 480,
218 		.bpp = 16,
219 		.vmode = FB_VMODE_INTERLACED,
220 		.a_lines = 288 - 20,
221 		.vb1_lines = 24 + 20,
222 		.vb2_lines = 25 + 20,
223 		.tot_lines = 625,
224 		.boeft_blank = 12 + 40,
225 		.aoeft_blank = 132 + 40,
226 		.adv7393_i2c_initd = init_PAL,
227 		.adv7393_i2c_initd_len = sizeof(init_PAL)
228 	},
229 	/* NTSC 720x480 YCbCR */
230 	{
231 		.name = "NTSC 720x480 YCbCR",
232 		.xres = 720,
233 		.yres = 480,
234 		.bpp = 16,
235 		.vmode = FB_VMODE_INTERLACED,
236 		.a_lines = 240,
237 		.vb1_lines = 22,
238 		.vb2_lines = 23,
239 		.tot_lines = 525,
240 		.boeft_blank = 16,
241 		.aoeft_blank = 122,
242 		.adv7393_i2c_initd = init_NTSC_YCbCr,
243 		.adv7393_i2c_initd_len = sizeof(init_NTSC_YCbCr)
244 	},
245 	/* PAL 720x480 CRT */
246 	{
247 		.name = "PAL 720x576 YCbCR",
248 		.xres = 720,
249 		.yres = 576,
250 		.bpp = 16,
251 		.vmode = FB_VMODE_INTERLACED,
252 		.a_lines = 288,
253 		.vb1_lines = 24,
254 		.vb2_lines = 25,
255 		.tot_lines = 625,
256 		.boeft_blank = 12,
257 		.aoeft_blank = 132,
258 		.adv7393_i2c_initd = init_PAL_YCbCr,
259 		.adv7393_i2c_initd_len = sizeof(init_PAL_YCbCr)
260 	}
261 };
262 
263 struct adv7393fb_regs {
264 
265 };
266 
267 struct adv7393fb_device {
268 	struct fb_info info;	/* FB driver info record */
269 
270 	struct i2c_client *client;
271 
272 	struct dmasg *descriptor_list_head;
273 	struct dmasg *vb1;
274 	struct dmasg *av1;
275 	struct dmasg *vb2;
276 	struct dmasg *av2;
277 
278 	dma_addr_t dma_handle;
279 
280 	struct fb_info bfin_adv7393_fb;
281 
282 	struct adv7393fb_modes *modes;
283 
284 	struct adv7393fb_regs *regs;	/* Registers memory map */
285 	size_t regs_len;
286 	size_t fb_len;
287 	size_t line_len;
288 	u16 open;
289 	u16 *fb_mem;		/* RGB Buffer */
290 
291 };
292 
293 #define to_adv7393fb_device(_info) \
294 	  (_info ? container_of(_info, struct adv7393fb_device, info) : NULL);
295 
296 static int bfin_adv7393_fb_open(struct fb_info *info, int user);
297 static int bfin_adv7393_fb_release(struct fb_info *info, int user);
298 static int bfin_adv7393_fb_check_var(struct fb_var_screeninfo *var,
299 				     struct fb_info *info);
300 
301 static int bfin_adv7393_fb_pan_display(struct fb_var_screeninfo *var,
302 				       struct fb_info *info);
303 
304 static int bfin_adv7393_fb_blank(int blank, struct fb_info *info);
305 
306 static void bfin_config_ppi(struct adv7393fb_device *fbdev);
307 static int bfin_config_dma(struct adv7393fb_device *fbdev);
308 static void bfin_disable_dma(void);
309 static void bfin_enable_ppi(void);
310 static void bfin_disable_ppi(void);
311 
312 static inline int adv7393_write(struct i2c_client *client, u8 reg, u8 value);
313 static inline int adv7393_read(struct i2c_client *client, u8 reg);
314 static int adv7393_write_block(struct i2c_client *client, const u8 *data,
315 			       unsigned int len);
316 
317 int bfin_adv7393_fb_cursor(struct fb_info *info, struct fb_cursor *cursor);
318 static int bfin_adv7393_fb_setcolreg(u_int, u_int, u_int, u_int,
319 				     u_int, struct fb_info *info);
320 
321 #endif
322